From 9adcf8a3f6af0b11e10c169f583d91e2d700f624 Mon Sep 17 00:00:00 2001 From: Krzysztof Furtak Date: Sun, 14 Aug 2022 12:44:32 +0200 Subject: [PATCH] Preparation for v1.1.0 release; Migrate to Pyxel 1.7.2; Update dependencies; Fix new pylint warnings (#8) --- LICENSE | 2 +- Pipfile.lock | 441 ++++++++++++------------ bansoko/__init__.py | 2 +- bansoko/__main__.py | 4 +- bansoko/game/bundle.py | 23 +- bansoko/game/level_template.py | 2 +- bansoko/game/profile.py | 2 +- bansoko/game/screens/choose_level.py | 6 +- bansoko/game/screens/level_completed.py | 12 +- bansoko/game/screens/main_menu.py | 6 +- bansoko/game/screens/playfield.py | 6 +- bansoko/gamedata/main.pyxres | Bin 49384 -> 55161 bytes bansoko/graphics/__init__.py | 2 +- bansoko/graphics/sprite.py | 2 +- bansoko/graphics/tilemap.py | 11 +- bansoko/gui/input.py | 20 +- resbuilder/__main__.py | 4 +- resbuilder/resources/backgrounds.py | 38 +- resbuilder/resources/gui_consts.py | 4 +- resbuilder/resources/level_themes.py | 10 +- resbuilder/resources/levels.py | 7 +- resbuilder/resources/tiles.py | 13 +- 22 files changed, 302 insertions(+), 315 deletions(-) diff --git a/LICENSE b/LICENSE index b5fc800..318412e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 Krzysztof Furtak +Copyright (c) 2020-2022 Krzysztof Furtak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pipfile.lock b/Pipfile.lock index fbb211f..54f40db 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -31,13 +31,21 @@ "index": "pypi", "version": "==0.6.2" }, + "importlib-resources": { + "hashes": [ + "sha256:5481e97fb45af8dcf2f798952625591c58fe599d0735d86b10f54de086a61681", + "sha256:f78a8df21a79bcc30cfd400bdc38f314333de7c0fb619763f6b9dabab8268bb7" + ], + "markers": "python_version < '3.9'", + "version": "==5.9.0" + }, "jsonschema": { "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" + "sha256:73764f461d61eb97a057c929368610a134d1d1fffd858acfe88864ee94f1f1d3", + "sha256:c7448a421b25e424fccfceea86b4e3a8672b4436e1988ccbde92c80828d4f085" ], "index": "pypi", - "version": "==3.2.0" + "version": "==4.7.2" }, "pyrsistent": { "hashes": [ @@ -68,27 +76,18 @@ }, "pyxel": { "hashes": [ - "sha256:7fc2a5d01b6e9ac44f5adc1cbd61e02a7a59aa53fd1cb8c241fa9d21eb53bbbf", - "sha256:bf534b91f91d16d249a6ea8bddedbf7122639f94bac6f0282d639807bb72e1dc" + "sha256:c92f348e2301eacf884ccc594b7b5b08d591b0385232150e5b57d79f9ccc0922" ], "index": "pypi", - "version": "==1.4.3" + "version": "==1.7.2" }, - "setuptools": { - "hashes": [ - "sha256:16923d366ced322712c71ccb97164d07472abeecd13f3a6c283f6d5d26722793", - "sha256:db3b8e2f922b2a910a29804776c643ea609badb6a32c4bcc226fd4fd902cce65" - ], - "markers": "python_version >= '3.7'", - "version": "==63.1.0" - }, - "six": { + "zipp": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2", + "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" + "markers": "python_version < '3.10'", + "version": "==3.8.1" } }, "develop": { @@ -101,11 +100,11 @@ }, "astroid": { "hashes": [ - "sha256:87ae7f2398b8a0ae5638ddecf9987f081b756e0e9fc071aeebdca525671fc4dc", - "sha256:b31c92f545517dcc452f284bc9c044050862fbe6d93d2b3de4a215a6b384bf0d" + "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b", + "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946" ], - "markers": "python_version >= '3.6'", - "version": "==2.5" + "markers": "python_full_version >= '3.6.2'", + "version": "==2.11.7" }, "bleach": { "hashes": [ @@ -123,75 +122,6 @@ "markers": "python_version >= '3.6'", "version": "==2022.6.15" }, - "cffi": { - "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" - ], - "version": "==1.15.1" - }, "charset-normalizer": { "hashes": [ "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5", @@ -205,36 +135,23 @@ "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da", "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "markers": "sys_platform == 'win32'", "version": "==0.4.5" }, - "cryptography": { - "hashes": [ - "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59", - "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596", - "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3", - "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5", - "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab", - "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884", - "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82", - "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b", - "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441", - "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa", - "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d", - "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b", - "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a", - "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6", - "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157", - "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280", - "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282", - "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67", - "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8", - "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046", - "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327", - "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9" + "commonmark": { + "hashes": [ + "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", + "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9" + ], + "version": "==0.9.1" + }, + "dill": { + "hashes": [ + "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302", + "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86" ], - "markers": "python_version >= '3.6'", - "version": "==37.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==0.3.5.1" }, "docutils": { "hashes": [ @@ -244,6 +161,13 @@ "markers": "python_version >= '3.7'", "version": "==0.19" }, + "future": { + "hashes": [ + "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.18.2" + }, "idna": { "hashes": [ "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", @@ -257,7 +181,7 @@ "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670", "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23" ], - "markers": "python_version < '3.10'", + "markers": "python_version >= '3.7'", "version": "==4.12.0" }, "isort": { @@ -265,24 +189,16 @@ "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7", "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951" ], - "markers": "python_version < '4' and python_full_version >= '3.6.1'", + "markers": "python_version < '4.0' and python_full_version >= '3.6.1'", "version": "==5.10.1" }, - "jeepney": { - "hashes": [ - "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", - "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" - ], - "markers": "sys_platform == 'linux'", - "version": "==0.8.0" - }, "keyring": { "hashes": [ - "sha256:372ff2fc43ab779e3f87911c26e6c7acc8bb440cbd82683e383ca37594cb0617", - "sha256:3ac00c26e4c93739e19103091a9986a9f79665a78cf15a4df1dba7ea9ac8da2f" + "sha256:782e1cd1132e91bf459fcd243bcf25b326015c1ac0b198e4408f91fa6791062b", + "sha256:e67fc91a7955785fd2efcbccdd72d7dacf136dbc381d27de305b2b660b3de886" ], "markers": "python_version >= '3.7'", - "version": "==23.6.0" + "version": "==23.7.0" }, "lazy-object-proxy": { "hashes": [ @@ -329,30 +245,40 @@ }, "mccabe": { "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" ], - "version": "==0.6.1" + "markers": "python_version >= '3.6'", + "version": "==0.7.0" }, "mypy": { "hashes": [ - "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324", - "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc", - "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802", - "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122", - "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975", - "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7", - "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666", - "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669", - "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178", - "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01", - "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea", - "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de", - "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1", - "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c" + "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655", + "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9", + "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3", + "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6", + "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0", + "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58", + "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103", + "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09", + "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417", + "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56", + "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2", + "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856", + "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0", + "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8", + "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27", + "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5", + "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71", + "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27", + "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe", + "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca", + "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf", + "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9", + "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c" ], "index": "pypi", - "version": "==0.790" + "version": "==0.971" }, "mypy-extensions": { "hashes": [ @@ -363,10 +289,17 @@ }, "nuitka": { "hashes": [ - "sha256:085285ebcd8866ec3a462d3bd604b54cf394fea095fc1fff7d23950c1359db0a" + "sha256:293f1909c611da53a3f0f9a17c129c4fa06b4b893dfbe7bf57b986214ef02e21" ], "index": "pypi", - "version": "==0.9" + "version": "==0.9.6" + }, + "pefile": { + "hashes": [ + "sha256:a5488a3dd1fd021ce33f969780b88fe0f7eebb76eb20996d7318f307612a045b" + ], + "markers": "sys_platform == 'win32'", + "version": "==2022.5.30" }, "pkginfo": { "hashes": [ @@ -376,12 +309,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.8.3" }, - "pycparser": { + "platformdirs": { "hashes": [ - "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788", + "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19" ], - "version": "==2.21" + "markers": "python_version >= '3.7'", + "version": "==2.5.2" }, "pygments": { "hashes": [ @@ -393,10 +327,20 @@ }, "pyinstaller": { "hashes": [ - "sha256:954ae81de9a4bc096ff02433b3e245b9272fe53f27cac319e71fe7540952bd3d" + "sha256:03984eed0baa252ea9854eb0785a1c40ac033c5c28d3abdae7d820da734aed5a", + "sha256:1061f7a6de055007949ec9ad1c6a080b93e102b2a288c8ff88f65e5d7716d4aa", + "sha256:4def5b6433b4233b2b53ef92ac351788edb11e4d1e08123b9c90e21a7b310a41", + "sha256:5d170f7c4c402c820b4c5cf7fde61dd9741bf0456342b19b207e29041d75aa30", + "sha256:5efc1b3ffb13fe50a51305fe57fb9e6e7bce00d009c16dd3cb76ea4d702a04ab", + "sha256:60c53ba54651f22f75dce2bcf49f0a1bcd03c729ced15f2efabad28e0ea0c938", + "sha256:6ecce857491bc4f477fcbde1b430d63b957d99bc511fa7e79136c07f831fc505", + "sha256:9d44f331f96fa0ef556cf5304f8b906ca20f55503ddd7aa2a914e87bc58e2cc9", + "sha256:a21c07dd026bc127684e7a451320bf59cac2c85bea4cb412f7193876ad741d58", + "sha256:dda3a4787fa4498bb9e688f81bed918f061bd583c8ff0e47881a5422a4b2093b", + "sha256:f10b19ad4f66ccad16574ff1979cc15e1ea010f8577292500125dd45abcd8303" ], "index": "pypi", - "version": "==4.1" + "version": "==5.2" }, "pyinstaller-hooks-contrib": { "hashes": [ @@ -408,11 +352,19 @@ }, "pylint": { "hashes": [ - "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210", - "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f" + "sha256:487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e", + "sha256:fabe30000de7d07636d2e82c9a518ad5ad7908590fe135ace169b44839c15f90" ], "index": "pypi", - "version": "==2.6.0" + "version": "==2.14.5" + }, + "pywin32-ctypes": { + "hashes": [ + "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942", + "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.2.0" }, "readme-renderer": { "hashes": [ @@ -427,7 +379,7 @@ "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==2.28.1" }, "requests-toolbelt": { @@ -445,21 +397,21 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, - "secretstorage": { + "rich": { "hashes": [ - "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f", - "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319" + "sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb", + "sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca" ], - "markers": "sys_platform == 'linux'", - "version": "==3.3.2" + "markers": "python_version < '4.0' and python_full_version >= '3.6.3'", + "version": "==12.5.1" }, "setuptools": { "hashes": [ - "sha256:16923d366ced322712c71ccb97164d07472abeecd13f3a6c283f6d5d26722793", - "sha256:db3b8e2f922b2a910a29804776c643ea609badb6a32c4bcc226fd4fd902cce65" + "sha256:0d33c374d41c7863419fc8f6c10bfe25b7b498aa34164d135c622e52580c6b16", + "sha256:c04b44a57a6265fe34a4a444e965884716d34bae963119a76353434d6f18e450" ], - "markers": "python_version >= '3.7'", - "version": "==63.1.0" + "index": "pypi", + "version": "==63.2.0" }, "six": { "hashes": [ @@ -469,71 +421,36 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "toml": { + "tomli": { "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" + "markers": "python_version < '3.11'", + "version": "==2.0.1" }, - "tqdm": { + "tomlkit": { "hashes": [ - "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d", - "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6" + "sha256:1c5bebdf19d5051e2e1de6cf70adfc5948d47221f097fcff7a3ffc91e953eaf5", + "sha256:61901f81ff4017951119cd0d1ed9b7af31c821d6845c8c477587bbdcd5e5854e" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.64.0" + "markers": "python_version >= '3.6' and python_version < '4.0'", + "version": "==0.11.1" }, "twine": { "hashes": [ - "sha256:34352fd52ec3b9d29837e6072d5a2a7c6fe4290e97bba46bb8d478b5c598f7ab", - "sha256:ba9ff477b8d6de0c89dd450e70b2185da190514e91c42cc62f96850025c10472" + "sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e", + "sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0" ], "index": "pypi", - "version": "==3.2.0" - }, - "typed-ast": { - "hashes": [ - "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace", - "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff", - "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266", - "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528", - "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6", - "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808", - "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4", - "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363", - "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341", - "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04", - "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41", - "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e", - "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3", - "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899", - "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805", - "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c", - "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c", - "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39", - "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a", - "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3", - "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7", - "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f", - "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075", - "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0", - "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40", - "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428", - "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927", - "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3", - "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f", - "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65" - ], - "version": "==1.4.3" + "version": "==4.0.1" }, "typing-extensions": { "hashes": [ "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02", "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6" ], - "markers": "python_version >= '3.7'", + "markers": "python_version < '3.10'", "version": "==4.3.0" }, "urllib3": { @@ -541,7 +458,7 @@ "sha256:8298d6d56d39be0e3bc13c1c97d133f9b45d797169a0e11cdd0e0489d786f7ec", "sha256:879ba4d1e89654d9769ce13121e0f94310ea32e8d2f8cf587b77c08bbcdb30d6" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4.0'", "version": "==1.26.10" }, "webencodings": { @@ -553,25 +470,89 @@ }, "wheel": { "hashes": [ - "sha256:78b5b185f0e5763c26ca1e324373aadd49182ca90e825f7853f4b2509215dc0e", - "sha256:e11eefd162658ea59a60a0f6c7d493a7190ea4b9a85e335b33489d9f17e0245e" + "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a", + "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4" ], "index": "pypi", - "version": "==0.36.2" + "version": "==0.37.1" }, "wrapt": { "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" + "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3", + "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b", + "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4", + "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2", + "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656", + "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3", + "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff", + "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310", + "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a", + "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57", + "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069", + "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", + "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe", + "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87", + "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", + "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b", + "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907", + "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f", + "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0", + "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28", + "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1", + "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853", + "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc", + "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3", + "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3", + "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164", + "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1", + "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c", + "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1", + "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7", + "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1", + "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320", + "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed", + "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1", + "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248", + "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c", + "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456", + "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77", + "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef", + "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1", + "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7", + "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", + "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4", + "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d", + "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d", + "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8", + "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5", + "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471", + "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00", + "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68", + "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3", + "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d", + "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735", + "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d", + "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569", + "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7", + "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59", + "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5", + "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", + "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b", + "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f", + "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462", + "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015", + "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af" ], - "version": "==1.12.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.14.1" }, "zipp": { "hashes": [ - "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad", - "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099" + "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2", + "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009" ], - "markers": "python_version >= '3.7'", - "version": "==3.8.0" + "markers": "python_version < '3.10'", + "version": "==3.8.1" } } } diff --git a/bansoko/__init__.py b/bansoko/__init__.py index ac93d47..61d07a5 100755 --- a/bansoko/__init__.py +++ b/bansoko/__init__.py @@ -7,7 +7,7 @@ Main Bansoko module exposing game globals. """ -__version__ = "1.0.0" +__version__ = "1.1.0" GAME_FRAME_RATE = 30 GAME_FRAME_TIME_IN_MS = 1_000 / GAME_FRAME_RATE diff --git a/bansoko/__main__.py b/bansoko/__main__.py index 3d2f81d..2458fd2 100755 --- a/bansoko/__main__.py +++ b/bansoko/__main__.py @@ -90,8 +90,8 @@ def main() -> None: filenames = generate_filenames(bundle_name) configure_logger(filenames.log_file) logging.info("Initializing Pyxel window") - pyxel.init(width=SCREEN_WIDTH, height=SCREEN_HEIGHT, caption=GAME_TITLE, fps=GAME_FRAME_RATE, - quit_key=pyxel.KEY_F12) + pyxel.init(width=SCREEN_WIDTH, height=SCREEN_HEIGHT, title=GAME_TITLE, fps=GAME_FRAME_RATE, + quit_key=pyxel.KEY_F12, capture_sec=0) try: bundle = load_game_resources(filenames) logging.info("Bundle name: %s", bundle_name) diff --git a/bansoko/game/bundle.py b/bansoko/game/bundle.py index 891077b..29f15ef 100755 --- a/bansoko/game/bundle.py +++ b/bansoko/game/bundle.py @@ -89,7 +89,7 @@ def load_bundle(metadata_filename: str) -> Bundle: :return: bundle with game resources """ try: - with open(metadata_filename) as metadata_file: + with open(metadata_filename, encoding="utf-8") as metadata_file: metadata = load(metadata_file) validate(metadata, METADATA_JSON_SCHEMA) sprites = create_sprites(metadata["sprites"]) @@ -118,7 +118,8 @@ def create_sprites(json_data: Any) -> Dict[str, Sprite]: image_bank=data["image_bank"], uv_rect=Rect.from_list(data["uv_rect"]), directional=data["directional"], - transparency_color=data["transparency_color"], + transparency_color=data["transparency_color"] if data["transparency_color"] >= 0 + else None, num_layers=data["num_layers"], num_frames=data["num_frames"]) for name, data in json_data.items() @@ -134,7 +135,7 @@ def create_sprite_packs(json_data: Any, sprites: Dict[str, Sprite]) -> Dict[str, """ return { name: SpritePack( - sprites=tuple([sprites[sprite_name] for sprite_name in data])) + sprites=tuple(sprites[sprite_name] for sprite_name in data)) for (name, data) in json_data.items() } @@ -147,15 +148,15 @@ def create_gui_consts(json_data: Any, sprites: Dict[str, Sprite]) -> GuiConsts: :return: Gui constants """ return GuiConsts( - gui_positions=tuple([ + gui_positions=tuple( Point.from_list(json_data["positions"][pos.resource_name]) for pos in list(GuiPosition) - ]), - gui_colors=tuple([ + ), + gui_colors=tuple( int(json_data["colors"][color.resource_name]) for color in list(GuiColor) - ]), - gui_sprites=tuple([ + ), + gui_sprites=tuple( sprites[json_data["sprites"][sprite.resource_name]] for sprite in list(GuiSprite) - ])) + )) def create_screens(json_data: Any, sprites: Dict[str, Sprite]) -> Dict[str, Screen]: @@ -216,7 +217,7 @@ def create_level_templates(json_data: Any, sprite_packs: Dict[str, SpritePack]) :param sprite_packs: collection of available sprite packs :return: collection of level templates """ - return tuple([ + return tuple( LevelTemplate.from_level_num( level_num=level_num, tileset_index=data["tileset"], @@ -224,4 +225,4 @@ def create_level_templates(json_data: Any, sprite_packs: Dict[str, SpritePack]) sprite_packs=LevelSpritePacks( robot_sprite_pack=sprite_packs[data["robot_sprite_pack_ref"]], crate_sprite_pack=sprite_packs[data["crate_sprite_pack_ref"]])) - for level_num, data in enumerate(json_data)]) + for level_num, data in enumerate(json_data)) diff --git a/bansoko/game/level_template.py b/bansoko/game/level_template.py index 58bfbf5..6444625 100755 --- a/bansoko/game/level_template.py +++ b/bansoko/game/level_template.py @@ -85,7 +85,7 @@ def from_level_num(cls, level_num: int, tileset_index: int, draw_offset: Point, tilemap = Tilemap(LEVEL_BASE_TILEMAP, tilemap_uv_rect, LEVEL_NUM_LAYERS) tileset = Tileset(tileset_index) layers = tuple( - [Layer(i, opaque=(i == 0), global_offset=draw_offset) for i in range(LEVEL_NUM_LAYERS)]) + Layer(i, opaque=(i == 0), global_offset=draw_offset) for i in range(LEVEL_NUM_LAYERS)) return cls(level_num=level_num, tilemap=tilemap, tileset=tileset, layers=layers, sprite_packs=sprite_packs) diff --git a/bansoko/game/profile.py b/bansoko/game/profile.py index b47e27e..7811414 100755 --- a/bansoko/game/profile.py +++ b/bansoko/game/profile.py @@ -52,7 +52,7 @@ def time(self) -> str: seconds = 59 minutes = 59 - return "{:d}:{:02d}:{:02d}".format(hours, minutes, seconds) + return f"{hours}:{minutes:02d}:{seconds:02d}" def merge_with(self, level_score: "LevelScore") -> "LevelScore": """Merge this level score with given score. diff --git a/bansoko/game/screens/choose_level.py b/bansoko/game/screens/choose_level.py index 9c971a2..8133419 100755 --- a/bansoko/game/screens/choose_level.py +++ b/bansoko/game/screens/choose_level.py @@ -117,9 +117,9 @@ def __init__(self, screen_factory: ScreenFactory): bundle = screen_factory.get_bundle() screen = bundle.get_screen("choose_level") item_space = bundle.get_gui_consts().get_position(GuiPosition.LEVEL_ITEM_SPACE) - menu = Menu.with_defaults(tuple([ - LevelMenuItem(level_num, screen_factory) for level_num in range(bundle.num_levels) - ]), MenuLayout(columns=5, rows=4, position=screen.menu_position, + menu = Menu.with_defaults(tuple( + LevelMenuItem(level_num, screen_factory) for level_num in range(bundle.num_levels)), + MenuLayout(columns=5, rows=4, position=screen.menu_position, item_space=Size(item_space.x, item_space.y))) super().__init__(menu=menu, allow_going_back=True, screen=screen) self.select_and_scroll_to_item(screen_factory.get_player_profile().last_played_level) diff --git a/bansoko/game/screens/level_completed.py b/bansoko/game/screens/level_completed.py index 76a61c6..3114faa 100755 --- a/bansoko/game/screens/level_completed.py +++ b/bansoko/game/screens/level_completed.py @@ -56,10 +56,10 @@ def _draw_level_statistics(self) -> None: pushes_beaten = self.level_score.pushes < self.prev_level_score.pushes steps_beaten = self.level_score.steps < self.prev_level_score.steps first_completion = not self.prev_level_score.completed + time_record = new_record if time_beaten or first_completion else "" + pushes_record = new_record if pushes_beaten or first_completion else "" + steps_record = new_record if steps_beaten or first_completion else "" - draw_text(LEVEL_TIME_POS, "#0{:>7s} #8{:s}".format( - self.level_score.time, new_record if time_beaten or first_completion else "")) - draw_text(LEVEL_PUSHES_POS, "#0{:>7d} #8{:s}".format( - self.level_score.pushes, new_record if pushes_beaten or first_completion else "")) - draw_text(LEVEL_STEPS_POS, "#0{:>7d} #8{:s}".format( - self.level_score.steps, new_record if steps_beaten or first_completion else "")) + draw_text(LEVEL_TIME_POS, f"#0{self.level_score.time:>7s} #8{time_record}") + draw_text(LEVEL_PUSHES_POS, f"#0{self.level_score.pushes:>7d} #8{pushes_record}") + draw_text(LEVEL_STEPS_POS, f"#0{self.level_score.steps:>7d} #8{steps_record}") diff --git a/bansoko/game/screens/main_menu.py b/bansoko/game/screens/main_menu.py index c9b90c1..56637f2 100755 --- a/bansoko/game/screens/main_menu.py +++ b/bansoko/game/screens/main_menu.py @@ -35,8 +35,10 @@ def activate(self) -> None: def draw(self, draw_as_secondary: bool = False) -> None: super().draw(draw_as_secondary) - draw_text(Point(79, 240), "(c) 2020 KRZYSZTOF FURTAK", TextStyle(color=7, shadow_color=1)) - draw_text(Point(11, 240), f"v{__version__}", TextStyle(color=1)) + draw_text( + Point(79, 240), "(c) 2020-2022 KRZYSZTOF FURTAK", TextStyle(color=7, shadow_color=1)) + draw_text( + Point(11, 240), f"v{__version__}", TextStyle(color=1)) def update(self, dt_in_ms: float) -> Optional[ScreenController]: if self.exiting: diff --git a/bansoko/game/screens/playfield.py b/bansoko/game/screens/playfield.py index 7b3728a..df4e661 100755 --- a/bansoko/game/screens/playfield.py +++ b/bansoko/game/screens/playfield.py @@ -103,13 +103,13 @@ def _draw_dynamic_cockpit(self) -> None: def _draw_level_statistics(self) -> None: score = self.level.level_score - self._draw_digits(GuiPosition.COCKPIT_LEVEL_NUM_POS, "{:>3d}".format(score.level_num), + self._draw_digits(GuiPosition.COCKPIT_LEVEL_NUM_POS, f"{score.level_num:>3d}", GuiSprite.LEVEL_DIGITS) self._draw_digits(GuiPosition.COCKPIT_LEVEL_TIME_POS, score.time, GuiSprite.TIME_DIGITS, colon_size=4) - self._draw_digits(GuiPosition.COCKPIT_LEVEL_STEPS_POS, "{:>4d}".format(score.steps), + self._draw_digits(GuiPosition.COCKPIT_LEVEL_STEPS_POS, f"{score.steps:>4d}", GuiSprite.STEPS_DIGITS) - self._draw_digits(GuiPosition.COCKPIT_LEVEL_PUSHES_POS, "{:>4d}".format(score.pushes), + self._draw_digits(GuiPosition.COCKPIT_LEVEL_PUSHES_POS, f"{score.pushes:>4d}", GuiSprite.PUSHES_DIGITS) def _get_input_action(self) -> Optional[InputAction]: diff --git a/bansoko/gamedata/main.pyxres b/bansoko/gamedata/main.pyxres index 74425ad95cfde476e5c29dcebd3e82a7280e2b88..c75c4a048315ed7acf7d7c48aed7109e685908d6 100755 GIT binary patch literal 55161 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
wm2ofxpMXT{U2g|4C?$35XA$4%zC#PFG8@ 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

*wd}Qu6;jHFd1_UX)5MEyder7 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 diff --git a/bansoko/graphics/__init__.py b/bansoko/graphics/__init__.py index 65b2754..756ae4a 100755 --- a/bansoko/graphics/__init__.py +++ b/bansoko/graphics/__init__.py @@ -255,4 +255,4 @@ def offset(self) -> Point: @property def transparency_color(self) -> int: """Transparency color for the layer.""" - return -1 if self.opaque else 0 + return None if self.opaque else 0 diff --git a/bansoko/graphics/sprite.py b/bansoko/graphics/sprite.py index 3e9bbb7..bdedd59 100755 --- a/bansoko/graphics/sprite.py +++ b/bansoko/graphics/sprite.py @@ -25,7 +25,7 @@ class Sprite: image_bank: int uv_rect: Rect directional: bool = False - transparency_color: int = -1 + transparency_color: int = None num_layers: int = 1 num_frames: int = 1 diff --git a/bansoko/graphics/tilemap.py b/bansoko/graphics/tilemap.py index af4107a..23fac0b 100755 --- a/bansoko/graphics/tilemap.py +++ b/bansoko/graphics/tilemap.py @@ -4,7 +4,7 @@ import pyxel -from bansoko.graphics import Rect, Direction, Point, Layer, TILE_SIZE +from bansoko.graphics import Rect, Direction, Point, Layer, TILE_SIZE, TILEMAP_WIDTH @dataclass(frozen=True) @@ -62,9 +62,11 @@ def tile_index_at(self, position: TilePosition) -> int: :param position: tile position to retrieve tile index at :return: index of tile at given position """ - tile_index: int = pyxel.tilemap(self.tilemap_id).get( + + tile_x, tile_y = pyxel.tilemap(self.tilemap_id).pget( self.rect_uv.x + position.tile_x, self.rect_uv.y + position.tile_y) - return tile_index + + return tile_x + tile_y * TILEMAP_WIDTH // TILE_SIZE def tiles_positions(self) -> Generator[TilePosition, None, None]: """Generator for iterating over all valid tile positions for this tilemap.""" @@ -80,5 +82,6 @@ def draw(self, layer: Layer) -> None: return pyxel.bltm(layer.offset.x, layer.offset.y, self.tilemap_id + layer.layer_index, - self.rect_uv.x, self.rect_uv.y, self.rect_uv.w, self.rect_uv.h, + self.rect_uv.x * TILE_SIZE, self.rect_uv.y * TILE_SIZE, + self.rect_uv.w * TILE_SIZE, self.rect_uv.h * TILE_SIZE, colkey=layer.transparency_color) diff --git a/bansoko/gui/input.py b/bansoko/gui/input.py index 72740c7..30b8ac3 100755 --- a/bansoko/gui/input.py +++ b/bansoko/gui/input.py @@ -33,18 +33,18 @@ class InputSystem: KEY_HOLD_TIME: int = 10 KEY_PERIOD_TIME: int = 2 BUTTONS_MAP: Dict[VirtualButton, List[int]] = { - VirtualButton.UP: [pyxel.KEY_UP, pyxel.KEY_KP_8, pyxel.GAMEPAD_1_UP], - VirtualButton.DOWN: [pyxel.KEY_DOWN, pyxel.KEY_KP_2, pyxel.GAMEPAD_1_DOWN], - VirtualButton.LEFT: [pyxel.KEY_LEFT, pyxel.KEY_KP_4, pyxel.GAMEPAD_1_LEFT], - VirtualButton.RIGHT: [pyxel.KEY_RIGHT, pyxel.KEY_KP_6, pyxel.GAMEPAD_1_RIGHT], - VirtualButton.SELECT: [pyxel.KEY_ENTER, pyxel.KEY_KP_ENTER, pyxel.GAMEPAD_1_A], - VirtualButton.BACK: [pyxel.KEY_ESCAPE, pyxel.GAMEPAD_1_B], - VirtualButton.START: [pyxel.KEY_ESCAPE, pyxel.GAMEPAD_1_START], - VirtualButton.ACTION: [pyxel.KEY_Z, pyxel.KEY_BACKSPACE, pyxel.GAMEPAD_1_B], + VirtualButton.UP: [pyxel.KEY_UP, pyxel.KEY_KP_8, pyxel.GAMEPAD1_BUTTON_DPAD_UP], + VirtualButton.DOWN: [pyxel.KEY_DOWN, pyxel.KEY_KP_2, pyxel.GAMEPAD1_BUTTON_DPAD_DOWN], + VirtualButton.LEFT: [pyxel.KEY_LEFT, pyxel.KEY_KP_4, pyxel.GAMEPAD1_BUTTON_DPAD_LEFT], + VirtualButton.RIGHT: [pyxel.KEY_RIGHT, pyxel.KEY_KP_6, pyxel.GAMEPAD1_BUTTON_DPAD_RIGHT], + VirtualButton.SELECT: [pyxel.KEY_RETURN, pyxel.KEY_KP_ENTER, pyxel.GAMEPAD1_BUTTON_A], + VirtualButton.BACK: [pyxel.KEY_ESCAPE, pyxel.GAMEPAD1_BUTTON_B], + VirtualButton.START: [pyxel.KEY_ESCAPE, pyxel.GAMEPAD1_BUTTON_START], + VirtualButton.ACTION: [pyxel.KEY_Z, pyxel.KEY_BACKSPACE, pyxel.GAMEPAD1_BUTTON_B], VirtualButton.HOME: [pyxel.KEY_HOME], VirtualButton.END: [pyxel.KEY_END], - VirtualButton.PAGE_UP: [pyxel.KEY_PAGE_UP], - VirtualButton.PAGE_DOWN: [pyxel.KEY_PAGE_DOWN] + VirtualButton.PAGE_UP: [pyxel.KEY_PAGEUP], + VirtualButton.PAGE_DOWN: [pyxel.KEY_PAGEDOWN] } WATCHED_KEYS: Set[int] = set(sum(BUTTONS_MAP.values(), [])) diff --git a/resbuilder/__main__.py b/resbuilder/__main__.py index 123b079..2e407ed 100755 --- a/resbuilder/__main__.py +++ b/resbuilder/__main__.py @@ -139,8 +139,8 @@ def main() -> None: logging.info("Processing file '%s'...", files.input_filename) try: - with open(files.input_filename) as input_file, \ - open(files.metadata_filename, "w") as metadata_file: + with open(files.input_filename, encoding="utf-8") as input_file, \ + open(files.metadata_filename, "w", encoding="utf-8") as metadata_file: pyxel.init(width=SCREEN_WIDTH, height=SCREEN_HEIGHT) input_data = json.load(input_file) validate(input_data, RESOURCES_JSON_SCHEMA) diff --git a/resbuilder/resources/backgrounds.py b/resbuilder/resources/backgrounds.py index c07b0af..5073d6a 100755 --- a/resbuilder/resources/backgrounds.py +++ b/resbuilder/resources/backgrounds.py @@ -3,7 +3,7 @@ import random from dataclasses import dataclass from enum import Enum, unique -from typing import Dict, Any +from typing import Dict, Any, Tuple import pyxel @@ -17,7 +17,7 @@ class TilemapGenerator: Every tile has relative weight used during randomization. """ - tiles_weights: Dict[int, int] + tiles_weights: Dict[Tuple[int, int], int] def generate_tilemap(self, tilemap_id: int, tilemap_rect: Rect, seed: int) -> None: """Generate a tilemap using random tiles at given position in Pyxel's mega-tilemap. @@ -32,12 +32,12 @@ def generate_tilemap(self, tilemap_id: int, tilemap_rect: Rect, seed: int) -> No random.seed(seed) tilemap_points = tilemap_rect.inside_points() for point in tilemap_points: - pyxel.tilemap(tilemap_id).set(point.x, point.y, self._next_tile()) + pyxel.tilemap(tilemap_id).pset(point.x, point.y, self._next_tile()) random.setstate(state) - def _next_tile(self) -> int: + def _next_tile(self) -> Tuple[int, int]: if not self.tiles_weights: - return 0 + return 0, 0 return random.choices(list(self.tiles_weights.keys()), list(self.tiles_weights.values())).pop() @@ -84,7 +84,7 @@ class FrameSlice(Enum): class NineSlicingFrame: """NineSlicingFrame is a frame that can be drawn on a tilemap using collection of 9 slicing tiles.""" - slice_tiles: Dict[FrameSlice, int] + slice_tiles: Dict[FrameSlice, Tuple[int, int]] def draw_frame(self, tilemap_id: int, rect: Rect) -> None: """Draw a frame with nine slicing technique using slice tiles. @@ -94,25 +94,25 @@ def draw_frame(self, tilemap_id: int, rect: Rect) -> None: :param rect: rectangle describing drawn frame """ tilemap = pyxel.tilemap(tilemap_id) - tilemap.set(rect.left, rect.top, self._get_tile(FrameSlice.TOP_LEFT_TILE)) - tilemap.set(rect.right, rect.top, self._get_tile(FrameSlice.TOP_RIGHT_TILE)) + tilemap.pset(rect.left, rect.top, self._get_tile(FrameSlice.TOP_LEFT_TILE)) + tilemap.pset(rect.right, rect.top, self._get_tile(FrameSlice.TOP_RIGHT_TILE)) if rect.bottom > rect.top: - tilemap.set(rect.left, rect.bottom, self._get_tile(FrameSlice.BOTTOM_LEFT_TILE)) - tilemap.set(rect.right, rect.bottom, self._get_tile(FrameSlice.BOTTOM_RIGHT_TILE)) + tilemap.pset(rect.left, rect.bottom, self._get_tile(FrameSlice.BOTTOM_LEFT_TILE)) + tilemap.pset(rect.right, rect.bottom, self._get_tile(FrameSlice.BOTTOM_RIGHT_TILE)) for x in range(rect.left + 1, rect.right): - tilemap.set(x, rect.top, self._get_tile(FrameSlice.TOP_TILE)) + tilemap.pset(x, rect.top, self._get_tile(FrameSlice.TOP_TILE)) for y in range(rect.top + 1, rect.bottom): - tilemap.set(x, y, self._get_tile(FrameSlice.CENTER_TILE)) + tilemap.pset(x, y, self._get_tile(FrameSlice.CENTER_TILE)) if rect.bottom > rect.top: - tilemap.set(x, rect.bottom, self._get_tile(FrameSlice.BOTTOM_TILE)) + tilemap.pset(x, rect.bottom, self._get_tile(FrameSlice.BOTTOM_TILE)) for y in range(rect.top + 1, rect.bottom): - tilemap.set(rect.left, y, self._get_tile(FrameSlice.LEFT_TILE)) - tilemap.set(rect.right, y, self._get_tile(FrameSlice.RIGHT_TILE)) + tilemap.pset(rect.left, y, self._get_tile(FrameSlice.LEFT_TILE)) + tilemap.pset(rect.right, y, self._get_tile(FrameSlice.RIGHT_TILE)) - def _get_tile(self, frame_slice: FrameSlice) -> int: - return self.slice_tiles.get(frame_slice, 0) + def _get_tile(self, frame_slice: FrameSlice) -> Tuple[int, int]: + return self.slice_tiles.get(frame_slice, (0, 0)) def generate_frame_tilesets(input_data: Any, tile_packer: TilePacker) -> Dict[ @@ -137,5 +137,5 @@ def generate_frame_tilesets(input_data: Any, tile_packer: TilePacker) -> Dict[ return tilesets -def _pack_tile(tile_filename: str, tile_packer: TilePacker) -> int: - return tile_packer.pack_tile(tile_filename) if tile_filename else 0 +def _pack_tile(tile_filename: str, tile_packer: TilePacker) -> Tuple[int, int]: + return tile_packer.pack_tile(tile_filename) if tile_filename else (0, 0) diff --git a/resbuilder/resources/gui_consts.py b/resbuilder/resources/gui_consts.py index ec8aa7f..f677f0a 100755 --- a/resbuilder/resources/gui_consts.py +++ b/resbuilder/resources/gui_consts.py @@ -29,10 +29,10 @@ def process_gui_consts(input_data: Any, sprites: Dict[str, Any]) -> Dict[str, An sprite_name = sprites_data[gui_sprite.resource_name] if sprites.get(sprite_name) is None: raise ResourceError( - f"Gui constants refer to unknown sprite '{sprite_name}'") + f"GUI constants refer to unknown sprite '{sprite_name}'") gui_sprites[gui_sprite.resource_name] = sprite_name - logging.info("Gui constants processed") + logging.info("GUI constants processed") return { "positions": gui_positions, "colors": gui_colors, diff --git a/resbuilder/resources/level_themes.py b/resbuilder/resources/level_themes.py index db9043b..c4bd28c 100755 --- a/resbuilder/resources/level_themes.py +++ b/resbuilder/resources/level_themes.py @@ -1,6 +1,6 @@ """Module exposing level theme generator.""" from dataclasses import dataclass -from typing import Dict, List, Any +from typing import Dict, List, Any, Tuple from bansoko import LEVEL_NUM_LAYERS from bansoko.graphics import Point @@ -22,7 +22,7 @@ class LevelTheme: robot_sprite_pack - sprite pack containing all robot related sprites crate_sprite_pack - sprite pack containing all crate related sprites """ - tiles_ids: List[Dict[Tile, int]] + tiles_ids: List[Dict[Tile, Tuple[int, int]]] tilemap_offset: Point background_generator: str thumbnail_colors: Dict[Tile, int] @@ -34,7 +34,7 @@ def num_layers(self) -> int: """Number of layers this level theme contains.""" return len(self.tiles_ids) - def tile_id(self, layer: int, tile: Tile) -> int: + def tile_id(self, layer: int, tile: Tile) -> Tuple[int, int]: """Pyxel's mega-tilemap id for given tile type. :param layer: layer to determine tileset to get tile id from @@ -63,7 +63,7 @@ def generate_level_themes(input_data: Any, tilemap_generators: Any, tile_packer: :return: collection of generated level themes """ themes: List[LevelTheme] = [] - main_layers: List[Dict[Tile, int]] = [] + main_layers: List[Dict[Tile, Tuple[int, int]]] = [] for level_theme_data in input_data: main_layers.append(tile_packer.pack_tileset(level_theme_data["tiles"]["layers"][0])) @@ -106,6 +106,6 @@ def _extract_thumbnail_colors(data: Any) -> Dict[Tile, int]: thumbnail_colors: Dict[Tile, int] = {} for tile in list(Tile): - thumbnail_colors[tile] = data[tile.tile_name] + thumbnail_colors[tile] = int(data[tile.tile_name], 16) return thumbnail_colors diff --git a/resbuilder/resources/levels.py b/resbuilder/resources/levels.py index 4ee7d7b..1eaa654 100755 --- a/resbuilder/resources/levels.py +++ b/resbuilder/resources/levels.py @@ -77,8 +77,7 @@ def flood_fill(self, start: Point, fill_tile: Tile, impassable_tile: Tile = Tile :param fillable_tile: tile that can be replaced during filling """ visited_map = [False] * (LEVEL_WIDTH * LEVEL_HEIGHT) - stack = list() - stack.append(start) + stack = [start] while len(stack) > 0: pos = stack.pop() @@ -164,12 +163,12 @@ def _generate_tilemap_and_thumbnail(preprocessed_level: _PreprocessedLevel, tile_positions = preprocessed_level.tile_positions() for level_pos, tilemap_pos in tile_positions: tile = preprocessed_level.get_tile_at(level_pos) - thumbnails_image.set(tilemap_pos.x, tilemap_pos.y, level_theme.thumbnail_color(tile)) + thumbnails_image.pset(tilemap_pos.x, tilemap_pos.y, level_theme.thumbnail_color(tile)) if tile is not Tile.VOID: for layer in range(level_theme.num_layers): tile_id = level_theme.tile_id(layer, tile) - pyxel.tilemap(layer).set(tilemap_pos.x, tilemap_pos.y, tile_id) + pyxel.tilemap(layer).pset(tilemap_pos.x, tilemap_pos.y, tile_id) def _update_sha1(level_data: Any, sha1: Any) -> None: diff --git a/resbuilder/resources/tiles.py b/resbuilder/resources/tiles.py index aa797e4..06a568c 100755 --- a/resbuilder/resources/tiles.py +++ b/resbuilder/resources/tiles.py @@ -1,7 +1,7 @@ """Module exposing tiles related utilities (like Tile and TilePacker)""" from enum import unique, Enum from pathlib import Path -from typing import Dict +from typing import Dict, Tuple import pyxel @@ -42,19 +42,19 @@ def __init__(self, image_bank: int, base_dir: Path) -> None: self.base_dir = base_dir self.next_free_tile = 0 - def pack_tileset(self, theme_data: Dict[str, str]) -> Dict[Tile, int]: + def pack_tileset(self, theme_data: Dict[str, str]) -> Dict[Tile, Tuple[int, int]]: """Pack a whole tileset into Pyxel's image bank this TilePacker controls. :param theme_data: data from JSON file describing tileset :return: packed tileset """ - level_theme: Dict[Tile, int] = {} + level_theme: Dict[Tile, Tuple[int, int]] = {} for tile in list(Tile): if theme_data.get(tile.tile_name): level_theme[tile] = self.pack_tile(theme_data[tile.tile_name]) return level_theme - def pack_tile(self, filename: str) -> int: + def pack_tile(self, filename: str) -> Tuple[int, int]: """Pack a single tile into Pyxel's image bank this TilePacker controls. :param filename: filename of tile image @@ -63,9 +63,10 @@ def pack_tile(self, filename: str) -> int: tiles_in_row = IMAGE_BANK_WIDTH // TILE_SIZE x = (self.next_free_tile % tiles_in_row) * TILE_SIZE y = (self.next_free_tile // tiles_in_row) * TILE_SIZE - pyxel.image(self.image_bank).load(x, y, Path(self.base_dir).joinpath(filename)) + pyxel.image(self.image_bank).load(x, y, str(Path(self.base_dir).joinpath(filename))) self.next_free_tile = self.next_free_tile + 1 - return self.next_free_tile - 1 + next_tile_index = self.next_free_tile - 1 + return next_tile_index % tiles_in_row, next_tile_index // tiles_in_row def tilemap_rect_nth(index: int) -> Rect: