From c7a6429b6b78c0ddca0d108ed91e023735c89dc4 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Thu, 30 Jul 2026 10:06:51 -0400 Subject: [PATCH 01/10] Rename "Dusty" to "Desert Sand" And add sand icon --- Icons/Terrain/Dust.png | Bin 0 -> 1327 bytes puzzle.py | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 Icons/Terrain/Dust.png diff --git a/Icons/Terrain/Dust.png b/Icons/Terrain/Dust.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a6f51045717ac0e5ee1c0ddef7525082f7bbc5 GIT binary patch literal 1327 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv=}#LT=BJwMkF1yemk zJwqd5M)wk+q8+Ibo@t(*S_~XO4l9EcBP#<%6~#`c?~X{MT8L;nKlj+bt`R^BXA`ts&bkgif}#)WzB!@j@k z`fnP1_iOR%ImPv>xPSMX?Wx>TS6}fXqwM49s^72H{yw@_z54OB{M+_|J_p?A+pk+) zl$RPAb=!4!*~?$|-mYDnUa#~^xsmz!VfXoc_Um4++N5=biGN@DhlkCfOaD%NF`b1$ zp6kbpA1SgeOa=43W_$1K^zeTloAcG@+P1YvMc#gDo!?ofFvIEN%iEnI>?>Wr9&(C} z^op4BkB{-k68ZJ#g5GSscXIZzSngrKdYC;ay#3Uxs+Wd(&!-A(jw)eef3+muYca=_ zNoi-*Zf0#2YJ75nWwYPpO;Ist9d#Eus&sUZQOqpPDXv-Soh;6FRPFDG9JTzjN-MqMZ zQRfcM;th-JE9@e&mPVq?;*0he3$m*jcGjGF{pi8VyN%tKvKvo*a4wOYm~m`P z=`7)Ufji9ar_U|ue<1N#a9g0<*&PCT8cd%I8ZWCA_}{rvvulFLp8+v-` z!F_@auUyqC7vH$Q*Z7CWS?A_S6C3s@v`2TB`+U_cF%t3XRdnLy4xRSAGS}=@g+#_w zmBP%BWB<<1+~+;He8rPyE{{oG_kufizWn2%F5yz>_9?(`(wx{XN#_vfBax*B3Z?wE zE7FxTCPd8*{lc&(;APWVnT*1amswjpwr)7|cFsGt`CRwD993G8z3${o$*)uM^j@@x zFY0ek5@(' '
  • Carpet:
    ' 'Will muffle footstep noises.
  • ' - '
  • Dusty:
    ' - 'Will emit puffs of dust.
  • ' + '
  • Desert Sand:
    ' + "Will create dusty sand tufts around Mario's feet.
  • " '
  • Muffled:
    ' 'Mostly muffles footstep noises.
  • ' '
  • Grass:
    ' From 802d8ea04b19ddcb3babd3cadec39879abf9d0b1 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Thu, 30 Jul 2026 10:24:33 -0400 Subject: [PATCH 02/10] Set some defaults when opening Puzzle Its always confused me that they weren't toggled by default, and if anything it made me assume that toggling those would result in different collision data being set Oh also it removes the ambiguity from the pass-down tooltip, it works just fine --- puzzle.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/puzzle.py b/puzzle.py index 6b32936..3a75633 100644 --- a/puzzle.py +++ b/puzzle.py @@ -292,9 +292,12 @@ def __init__(self, window): self.PassNone.setIconSize(QtCore.QSize(24, 24)) self.PassThrough.setToolTip('Allows Mario to jump through the bottom\nof the tile and land on the top.') - self.PassDown.setToolTip("Allows Mario to fall through the tile but\nbe able to jump up through it. Doesn't seem to actually do anything, though?") + self.PassDown.setToolTip("Allows Mario to fall through the tile but\nbe able to jump up through it.") self.PassNone.setToolTip('Default setting') + # Select default pass behavior + self.PassNone.setChecked(True) + propertyLayout.addWidget(self.PassNone) propertyLayout.addWidget(self.PassThrough) propertyLayout.addWidget(self.PassDown) @@ -580,6 +583,9 @@ def __init__(self, window): layout.addWidget(self.parameters, 1, 1) self.setLayout(layout) + # Select default core type + self.coreWidgets[0].setChecked(True) + self.swapParams() def swapParams(self): for item in range(12): From f6134ce0fd9bed4cec445f1fad871ad455b7b60d Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Thu, 30 Jul 2026 10:36:46 -0400 Subject: [PATCH 03/10] Enable/disable object buttons if objects exist This fixes some crashes related to a nonexistent object being messed with (interacting with tile context menu items, or the repeat type) I mainly opted for this because it should be indicated that an object needs to be created before it can be edited --- puzzle.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/puzzle.py b/puzzle.py index 3a75633..37cd898 100644 --- a/puzzle.py +++ b/puzzle.py @@ -1271,6 +1271,7 @@ def __init__(self): self.tilingMethod.activated.connect(self.setTiling) + self.enableButtons(False) # Layout layout = QtWidgets.QGridLayout() @@ -1298,6 +1299,17 @@ def __init__(self): + def enableButtons(self, enabled): + self.tiles.setVisible(enabled) + self.tilingMethod.setEnabled(enabled) + + self.addRow.setEnabled(enabled) + self.removeRow.setEnabled(enabled) + + self.addColumn.setEnabled(enabled) + self.removeColumn.setEnabled(enabled) + + def addObj(self): global Tileset @@ -1314,6 +1326,7 @@ def addObj(self): index = window.objectList.currentIndex() window.objectList.setCurrentIndex(index) self.setObject(index) + self.enableButtons(True) window.objectList.update() self.update() @@ -1340,6 +1353,7 @@ def removeObj(self): window.objectList.setCurrentIndex(index) self.setObject(index) + self.enableButtons(len(Tileset.objects) != 0) window.objectList.update() self.update() From 8e1f3bf084aacfe5e5f0a5d7bc1878b58b7d0e08 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Thu, 30 Jul 2026 23:35:41 -0400 Subject: [PATCH 04/10] Show labels for param/terrain type dropdowns --- puzzle.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/puzzle.py b/puzzle.py index 37cd898..459fd90 100644 --- a/puzzle.py +++ b/puzzle.py @@ -371,7 +371,7 @@ def __init__(self, window): # Parameters ComboBox self.parameters = QtWidgets.QComboBox() - self.parameterLabel = QtWidgets.QLabel('Parameters') + self.parameterLabel = QtWidgets.QLabel('Parameters:') self.parameters.addItem('None') @@ -577,10 +577,12 @@ def __init__(self, window): layout = QtWidgets.QGridLayout() - layout.addWidget(self.coreType, 0, 1) + layout.addWidget(self.coreType, 0, 1, 1, 2) layout.addWidget(self.propertyGroup, 0, 0, 3, 1) - layout.addWidget(self.terrainType, 2, 1) - layout.addWidget(self.parameters, 1, 1) + layout.addWidget(self.terrainLabel, 2, 1) + layout.addWidget(self.terrainType, 2, 2) + layout.addWidget(self.parameterLabel, 1, 1) + layout.addWidget(self.parameters, 1, 2) self.setLayout(layout) # Select default core type From 5c26478c43a085ef7a3f353fddc5b74ebfd0a1f0 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Fri, 31 Jul 2026 04:53:00 -0400 Subject: [PATCH 05/10] Fix artifacts in Ice Flower image --- Icons/QBlock/IceF.png | Bin 1350 -> 2169 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Icons/QBlock/IceF.png b/Icons/QBlock/IceF.png index 8bd6596de1a7a267786eed30730f46ebab86667e..ab3f258bdfe2d3fb962e9224a152084aeea80a4e 100644 GIT binary patch literal 2169 zcmZ8ic{mj67arO7?1stMQkO16jGbsO$Tp2FWX4!SLu1R^Ss~tp7Wjae&2uRo~^YRFP8)t007`MhrLO^seo=HBM!iU1Bq!U~XJVg)cUlm!El z|LNoJoMmGEQ$NAbs!S&U0t~*wfL{{JpLzg89|wwo;M)<4@B)e zgo*I4@9_*P;a{&@hCYrH45t%+IuY7h4E5iXDg<(TJ6%?gGt|KC4gj#9HisD@;g&J> zoB_fsz!==uwvV&^i~cbSDE2rR8IZm0DY)NSe6!V4b@@OM@>#gOWR3+9VV5lhm$_DK zOg2W6Md1mBPzw>}L_rQmA#321imL6G{U4{J!hFKLS5`aN-Zqo={lYYK4`RMkj&6Ow z1x`2;0-JJeU%a{OKUFs&R9Dijr{HI5&+c}OaKpd>?2d7$41A>o#+Fy#*FU>wOt-mv zIl6c`=)s3sT-8Qa?*L`66g`j3d^L!n|qEF}Nj_CPw zcO-Vp*H9&t)i(Y6{zekbeQ{IKq{HuligP&d4?~XT<i8Ye`OHwOyaLH2 zYLukSj4KTRyiodrrMVIVm79N0=cy!XYdOA17+n~kZk(&+%jYDJZ&54s4x@2>O|r^v zbP1c!U$Kcz%y@;j4o^$&-A)=8h`4J6^1TUi_eu5rJGi91UYIx5&|zkMb;5bQD$r=C zS3HXx|6HUrqTclGh!d$T{1ZDiq5D-5O9M+izZdn5=$P+SXTD6m%e$=f#wOl$tq-d@ zJ5tUxTh&n2MD_#f_HS_Y%-0@%@Yiq(tkh?f)>mZ9!F+hQG@jH>I+?gG8eJPEqHuUsm<=nZA!e%)F*gSHWQI zkbyrBbCJ56*jUC>y=O29fysp5V=8iIvfIA5;dSz#Xtk7MV&di~V!;m!m%>|A3|d+a zHW#P8lq{$;w&8`u>>&c|47SR%3XlMQTEdgF3ks6qIA6LGUX;z+Xbei~EdAurm zJb6F+;1xC!gTqV<`nVZG3R?S0F67_1d&#|Bd-7vw==!9c(Up8JtttZ5!AjGX;2Ts( z)=7m+0HMzA4$wvn=J3hXRPYM$%9v~J4N^DI=~~!$zJcVZYm~mVdz5O`kJqKq#nSyW z88bSmp`q%)?iah*^~S{I%60n6U`=?ID$wO!TXPF;F>TK9-Tdg0TnJIlt9j${J<%)p z*J{vaj}jQx06__e>F8?EF?F*9f58Js4;^|h$yrKvs${%|oQcz8Up832CM64KKULhD6fEup_!hJGhP(Vb%oM6-yIkC0P{_)WqS!m1UQz z@f!MSuAc5BQH%#Zz>R+|bTVa0+6OoRMM`@dt1)~g#tFYYIeX-$qQZhKdCdek<(qGri z(D|r)I;48-P3Mxd0B6EjtsrtT0u8Co<2B1jGp~+Z>V&QLHy09#dxhlF^$YgGkIGXh z*=ShmsQdMc7%%Pj-nyBLO#+GUzO?uyEmYS=8QP?|mH%sZcl zSMsT)XC!^B{o(a^>-F5}i1OE?we1K=r(9OBrN?U4g^J`vg!DkyAZoM0Z9_+Y@Y!Zw z(Iphxfhw&t0A&dSMbs}(_mulj35Rc`uz%g5m96h~f6%eBe(4)oX*KvPkZoAeDxEV& z^Wwl0=2C=>dd#nY%jG!vqI-`huIARlrJ4J+FAsTowy|!TluueWPj+?ya&6B8o1h%g P$IH{)#2Qv|7RSB9 delta 1342 zcmV-E1;P6H5XK6S8Gi!+007si&B_1(00d`2O+f$vv5yPX8| z$z_P!K&R_(imP;Szc-P$#bTAMQI06J=ZT&7PF0LDZ=bV7f1pEunhairVv(asoyI$f zu2PpHNTSPnmu4nmh97*X7<8bb-ExueI0sI5J+J3&oUvTC;bxPM8KC7Zr{xf0hj5!w z9iQcLgOO{HP=9K9d5hdcKW>R;$Mac&JwlbdGEZb$qaz_!a#(UqnA~JPWhINWY*lbY zI$b0qsqj&6LTacud8Siqsx^JhH$quwV4E+4%19$gUwObln!A60%rhEDT|2t^i`7Y6 z#r8n0;U~8KDz^QY|5bUF>Fa1{zjYpL;_TNnD;|+#w~!?HXozanEpIGw4_G!=n0tRNcHYa{`pGq z?nwXr4yyc>`aO^IH-gzVWVR+!r533FOBS2qOzq~A^F9}%gTw&v`2&+ z44&&EqRSnn-z>V^C9l&)`SLd2&qL+q|M~hgx5h)?;7z%#J@o5mVO_MTqf`IE?jg z&Nsx^_Uh_R+Ra5nK$wez)WN}Rxhy&3)4Qgofq#87w$i81%z%1zYP72gpz%}k<}9YZ z!hg=p^zZLoucRHF(3aZKIr{X8>fj}+&pN@(?eOq4?BO+6UqAo=0ryEnK~yNuV_<*+ zXVS7hDb_Nu{D3=~7Hf4&KyNeJXvbbDMNBR0yGiRRLG_S*p^81=|)ZFYDSd zy-FXd;am5voqzW1DJWR0w}*5Oc7x_|Lw zPxqzyCyt$3vAX^0l`}^S!IpChR+YYavUKy*Lx+z~U3~NMta2l6h(EYp%S+F0zp?P* z!nUKQXV0o>(1Q8ggQ>czbi?{(%VxJsuc~e^K!lZ708>Nt%9@&$)hF#Njp4#NHY{P{ z@kwd2vP?lfPLeDv9AIG%HQoBwX@7A%45A5Zc^R0!Z3~N3m6(AN%6)}JGa6fqS=m!- zSsA5T>x(8#*ry1TQ0cF)C@wB4OqR^3O$j+aqq(wZf1v`%D2@KQX_d9j%`%BEWTYyJ zE9xfqP2>St!YXi}u(6`4DOMmby0Wrya^1m6To6~O>zPd~uB^SVWXamOg*Sywf!dyM z2aAfkN%#dv+=}9gk?^!&LrEv>>}=to{OoW+0D&RLtYhG=(*OVf07*qoM6N<$f_>l1 AYybcN From 1b68da93ed47b4b90f83a078e9272622494a4474 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Fri, 31 Jul 2026 05:30:24 -0400 Subject: [PATCH 06/10] A bunch of tiny improvements - Improved formatting of Hex Data field - Hex Data now uses 0x00 for all numbers (they are bytes, not nybbles) - Implemented some pipe icons - Renamed unknowns to now use their index value - Fixed "Pow Block Coin" name - Applied minimum width to "Set Tile" dialog dropdown (fixes text cutoff) - Removed param/terrain type labels since they cause more cut-off issues --- Icons/Coin/{POW.png => BlueCoin.png} | Bin Icons/Pipes/BlockCorner.png | Bin 0 -> 1273 bytes Icons/Pipes/Horiz. On Top Mini-Junction.png | Bin 1026 -> 0 bytes ...d bottom no).png => HorizCenterBottom.png} | Bin ... and bottom no).png => HorizCenterTop.png} | Bin ...anceBottom ALT.png => HorizLeftBottom.png} | Bin ...ftEntranceTop ALT.png => HorizLeftTop.png} | Bin ...iPipeCenterALT.png => HorizMiniCenter.png} | Bin Icons/Pipes/HorizMiniJunction.png | Bin 0 -> 532 bytes ...MiniPipeLeft ALT.png => HorizMiniLeft.png} | Bin ...niPipeRight ALT.png => HorizMiniRight.png} | Bin Icons/Pipes/HorizOnTopJunctionBottom.png | Bin 893 -> 0 bytes Icons/Pipes/HorizOnTopJunctionTop.png | Bin 889 -> 0 bytes ...ntranceBottom.png => HorizRightBottom.png} | Bin ...RightEntranceTop.png => HorizRightTop.png} | Bin Icons/Pipes/PipeVerticalcenter.png | Bin 146 -> 0 bytes ...ntranceLeft ALT.png => VertBottomLeft.png} | Bin ...ranceRight ALT.png => VertBottomRight.png} | Bin ...tCenterLeft ALT.png => VertCenterLeft.png} | Bin ...enterRight ALT.png => VertCenterRight.png} | Bin ...niPipeBottomALT.png => VertMiniBottom.png} | Bin ...niPipeCenterALT.png => VertMiniCenter.png} | Bin Icons/Pipes/VertMiniJunction.png | Bin 0 -> 542 bytes ...ertMiniPipeTop ALT.png => VertMiniTop.png} | Bin ...opEntranceLeft ALT.png => VertTopLeft.png} | Bin ...EntranceRight ALT.png => VertTopRight.png} | Bin puzzle.py | 109 +++++++++--------- 27 files changed, 55 insertions(+), 54 deletions(-) rename Icons/Coin/{POW.png => BlueCoin.png} (100%) create mode 100644 Icons/Pipes/BlockCorner.png delete mode 100644 Icons/Pipes/Horiz. On Top Mini-Junction.png rename Icons/Pipes/{Horiz. Center Right(shouldnt be top and bottom no).png => HorizCenterBottom.png} (100%) rename Icons/Pipes/{Horiz. Center Left(shouldnt be top and bottom no).png => HorizCenterTop.png} (100%) rename Icons/Pipes/{HorizLeftEntranceBottom ALT.png => HorizLeftBottom.png} (100%) rename Icons/Pipes/{HorizLeftEntranceTop ALT.png => HorizLeftTop.png} (100%) rename Icons/Pipes/{HorizMiniPipeCenterALT.png => HorizMiniCenter.png} (100%) create mode 100644 Icons/Pipes/HorizMiniJunction.png rename Icons/Pipes/{HorizMiniPipeLeft ALT.png => HorizMiniLeft.png} (100%) rename Icons/Pipes/{HorizMiniPipeRight ALT.png => HorizMiniRight.png} (100%) delete mode 100644 Icons/Pipes/HorizOnTopJunctionBottom.png delete mode 100644 Icons/Pipes/HorizOnTopJunctionTop.png rename Icons/Pipes/{HorizRightEntranceBottom.png => HorizRightBottom.png} (100%) rename Icons/Pipes/{HorizRightEntranceTop.png => HorizRightTop.png} (100%) delete mode 100644 Icons/Pipes/PipeVerticalcenter.png rename Icons/Pipes/{VertBottomEntranceLeft ALT.png => VertBottomLeft.png} (100%) rename Icons/Pipes/{VertBottomEntranceRight ALT.png => VertBottomRight.png} (100%) rename Icons/Pipes/{VertCenterLeft ALT.png => VertCenterLeft.png} (100%) rename Icons/Pipes/{VertCenterRight ALT.png => VertCenterRight.png} (100%) rename Icons/Pipes/{VertMiniPipeBottomALT.png => VertMiniBottom.png} (100%) rename Icons/Pipes/{VertMiniPipeCenterALT.png => VertMiniCenter.png} (100%) create mode 100644 Icons/Pipes/VertMiniJunction.png rename Icons/Pipes/{VertMiniPipeTop ALT.png => VertMiniTop.png} (100%) rename Icons/Pipes/{VertTopEntranceLeft ALT.png => VertTopLeft.png} (100%) rename Icons/Pipes/{VertTopEntranceRight ALT.png => VertTopRight.png} (100%) diff --git a/Icons/Coin/POW.png b/Icons/Coin/BlueCoin.png similarity index 100% rename from Icons/Coin/POW.png rename to Icons/Coin/BlueCoin.png diff --git a/Icons/Pipes/BlockCorner.png b/Icons/Pipes/BlockCorner.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc2c1dbd4735cba7432d1c73442ba418ebe1c83 GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv=}#LT=BJwMkF1yemk zJwqd5M)wk+q8+Ibo@t(*S_~XO4l9EcBP#(I&#qa2fBmk|a*=uIbRzFp5qxiwC0*i&tzba`@~-+ zpI`lazP${a78}4^Fv~X4S*RrhRb^g%%R41> zP!pLl^!M!IX*4s|jyK9bsw7$=Rb=sO~#z%hp zWu3UVfv11r?LEr3WLTaYo~ZMzc;@{W@3INGp+Oxzhn+1tSdP74w?388Inr(mdx_WE zvk5g{QuV!-_D8r^|Grf3zO=gN%g5#=KOGj`?QLYJk^J;RuJpeAm!}Ut1U&k?Z;vcb z$hNwQ3HBP7+wb##I1tS(ALOtk^~e6AugTq4S9#fcrIsfKD!4q;6TY*~>y}xD!dunF z^P<%+{AKU%In}p!4)eMSeUEDquWfnR<@D-m8E4n9#(g~y|46_kT69k~|DEbMJ&C!0 zm}Os@oy-+wJ=eD_-N1QX-_y#vifzwsTz%TaIF-TX<5q*5yT$u+Q>5LR8IR4ly-k0W zhILYOO=UsHr=0jNI@t+wge7@^q z#EjaCveqi}$aUW5`1I(i#4h)HYQj}r>$)yXimx}mu!*@!{rU4>lV?7!{2gRBvD3Sj z+n|49*cYAKx4ajd922X~w^-nEuj^{iZA+e-rbdxNol68b6kqtPKNMln?qzZ#f78}{ zQvvsoo|LAOT1UOExp2xy%UPLSd}gDq7b>Bn$a}*)RC({|)2DBKpKtGf)%VZO@8w&W r!=B6DoooC|kCELr>DP~cf8W}3+1*bP0l+XkKt>*jX literal 0 HcmV?d00001 diff --git a/Icons/Pipes/Horiz. On Top Mini-Junction.png b/Icons/Pipes/Horiz. On Top Mini-Junction.png deleted file mode 100644 index 212c7d52fa0d12daaa669a509d68861fd183bca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1026 zcmV+d1pWJoP)s#2%^J|!lUrKKcRmhqJxU)Fo=p0 zJ2EsX(}O4~lU&oy?QwJRxVg-Ka9r|~fMATF zU9=!HY^*m}XGsBX4DBKT$@oj~Y?LLlJARov_2wJ9xyKOM-I*A7txPLz2!K)oqChk% zh14qqP@)N<(IR*Or2wzdS~D>-I!?q8xqGM5TX#>ecXE<;o{=UgI?;#$TR8$AOTarJ z)d>QqOyPaW`by38G^>diB280~1<&Y?aW?g9Hp-ebPbmNec)$WRkOOxu*s7*o z46xP?%uHP-gh0#?QA**Br*mzZAD0$MjH0`+h}Ic-J4YFC0#pH8_NZLL$o3sn%^CwE zBe>e45Mqj$3m_@w$|^Uer^&LM)ovF{K&J@`Lzbiz0|TfuW$jj%q%Y;h)vIjWS|-#r zCMaTxNFV@#td-MhwfXwgrzmCEIyOq*&}NF^&9wSAkrV~R<`G2T{3jn0tdJBftak(& zVupybp3pc{o-?t3lKw5j^o?vmtl*sE51xj)wkR*`I`}Yyqob%K1!Zu~(lnl!A`+~n zEK91gM_JV%3KJB6vp6p(FZ?MORFdI?N25@ZV7((|hPJjD8Rj=g5 zXHW9^m+vA1FFbi7oId-WAn^PXCpi7pJM?-zo;&&qpPhS~JIl-LRFi>-5E(miEIf4h z5c>~3N|F~Wb{5#ObsN@NjDgUAQvuUX$&{rkH8(r63=R%6JUqlt7cTI_H|OYFJTKg% z_y>ni0+3{j+pMjuPz(%`_vJKHKu%2YFCvz;)kWr~E^+*spJn~d3RnkJ#0(LU6lFYOa+a5uIP>ubSX=SZ$(I@5 zvxm$;t`n4jnfW>1di@ON7C%BfsJ;78q5)4#5%IxM-whOLn|%ik;;d)?Bac%9Q}Z)S z-(2Fi`2~KSnq|Ynkz-Gj8N-3c4l^`3h;9{tAtpq|jvNgmJ9n||f$g-iezHOng28!k z-lCKS5yU!LX-d}L!h6_Q?@>23ow<2BSAL~)@vLx wHIxAoKnqz&QAGlc5X4c|;FSlgVM%xNb!1@J z*w6hZkrl|d5AX?b4O$wMyfwM_Tye|2;;rA;E`7gr@Ati1-*26AuP6IhcGS|SpeaF4 zJx)$7PEOTMmc^Ea*@lKuhMGZ|ie8F9Ggb>1^#Li-k|4j}|5yNn_RZQ?Kn0uy9+AZi z419+{nDKc2iWH!rWQl7;NpOBzNqJ&XDnmeGW?qS&pKFMMsh**pp^-47dkIj{j?@Ux zG*3@01`Z&Hl|hP;m4Ok+@&aOMC>!K;4Mt|LI1`X<$jHPX2&AKcIJ2DvES>{ogFpfh zgY?5_bXyr1fWbF`oq+|Y#=ywffN=rDT#z2t1rW2Q0ofqH1T={WtTM>b0?2~uGBhv% z$=+N(YwF4E-0?tWh^LEVh(>VfrPG293JgasG<5x7ba}BqOxoc6tjp(gCJRh2^{%!% zRC#ylw&nYieL@6W4k|^k&Q{xKsaK!0|kl-0qU!?I#fQ2Nr(pE9gdhf`JCd9&@>2NLjZ)sa&BT z)#G6BV@e~&cy>bucWkWep(@1J#37gdAhwo=^SDYaw=-R0?2WaOOn7H65@3TH^~K@p(`vwz0w7L14yAJrxw}e`o%0D*VfDfe^%20zTiwVck1q~4Bfx|i0Z{7T1)5Y*@Krw-?A<%V9%Ua z+@8&A7KhB)iVL)~z{yg9zXc}=fvWpK?@hD-|4%aISO>*e2b{c+*gHvd1hVA;m*PtfCv|W%Emr-R-@zE zH~RGcr{GHu_(fkCh|f_3=b&Sd?{Gm21*8N0a?r*0YK=-Odu+{+j^AE!h2QCv1e;5Bf#hqa1@T%$h!KPaIBN7;gQ ztAN`R(SM;1$dHr!J8Tz5ZzyrV{W+_Fe1^5$r3TlC1EfS<`NhPECUjmWg!_@kO_ipV3Cmob{3Xp0v<*P z%OHY!5Jdvr}D&B6vPquDHTZIC8Ed{Xz=M0kz;BK&S zD)&_ZZ4t;ZM6CPUmwdi0dkAe|pn9;1kYfzo+NK|0E`_+wq*4G2gL6#;mP`jMfY$f{ zNV+^I++o;g8NmG@IF9R$b11!Kyc3P9k&F82vl8Rxa=@y@9lkIIRKwv=$;Ib?*t?FKdya1~2 zu8;B#nwA!rc`#2;9zGY<<+(SsGXGZo#^pI%_8`To;sdJlTA#Ir6sw7!K6**d9>11+ ztl)GP0;KDa2%v5g$%@DDV_u;?C89V{5WP#pJpu^0=5#+ zq!4h8KnWoK6sOllI2aRj!Z6SCqk96r7D%QF+!xF$0xox;&N40F5!@*{h)NykcJCoh zDjk7rx`1y4EULQ@h;sq>iM?+KWlf5`*p%f0ICn|{UfzMNhin8ufaD+)%iybT&XY3I zf{gP3R~LoO;6_D2br8w)ZQrMeyGXCD^4a)tK|F2`@{uc@`+=O{&BPgi2oC@!2)Hws zlCujsy1o;f-2s2-f`K?g5uAgLL2h$F69uFL{pH9v?6_379kwQ>4eyrz@|GA)#8 z;5_7_Ac8kx{vRY|0cDYVIeG?apt1V#wAZi&HVAkRL`T@GSjaWJ@&BNX3Or>C+I4|2 z6w!ad17yh6bDQl#(Ye4P+p%cdq++vo#3pkm$nO5Fo&E@h4y9 zr&A6=$Mh!}X|PrbRTjxwIB~0Jt4V%mJ8z-cKfZEc*3i57*XvQM^nn ulP0kItz6J2b-00%nT;c*j-E9Im7Qmub^-hJ(I^7x5{J6C4!o-q5Cn0V21u6Gj|cdq1r z<&>ut6?4M3brJW@pWTt{MZum=fI`l(Cw!Og<=(mS)+499|6FdNCW_|nCrc;ht(te+ z!@M+N$AsJSPg*_8S#o{ky-idhWj3tBnRe*Ns5&&fw|l=d#Wzp$PyJ CsGLFo literal 0 HcmV?d00001 diff --git a/Icons/Pipes/VertMiniPipeTop ALT.png b/Icons/Pipes/VertMiniTop.png similarity index 100% rename from Icons/Pipes/VertMiniPipeTop ALT.png rename to Icons/Pipes/VertMiniTop.png diff --git a/Icons/Pipes/VertTopEntranceLeft ALT.png b/Icons/Pipes/VertTopLeft.png similarity index 100% rename from Icons/Pipes/VertTopEntranceLeft ALT.png rename to Icons/Pipes/VertTopLeft.png diff --git a/Icons/Pipes/VertTopEntranceRight ALT.png b/Icons/Pipes/VertTopRight.png similarity index 100% rename from Icons/Pipes/VertTopEntranceRight ALT.png rename to Icons/Pipes/VertTopRight.png diff --git a/puzzle.py b/puzzle.py index 459fd90..f6ca0f6 100644 --- a/puzzle.py +++ b/puzzle.py @@ -383,7 +383,7 @@ def __init__(self, window): ['Red Block Outline B', QtGui.QIcon(path + 'Generic/RedBlock.png')], ['Cave Entrance Right', QtGui.QIcon(path + 'Generic/Cave-Right.png')], ['Cave Entrance Left', QtGui.QIcon(path + 'Generic/Cave-Left.png')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 8', QtGui.QIcon(path + 'Unknown.png')], ['Layer 0 Pit', QtGui.QIcon(path + 'Unknown.png')]] RailParams = [['None', QtGui.QIcon(path + 'Core/Default.png')], @@ -393,7 +393,7 @@ def __init__(self, window): ['Rail: 90 degree Corner', QtGui.QIcon(path + '')], ['Rail: Horizontal Rail', QtGui.QIcon(path + '')], ['Rail: Vertical Rail', QtGui.QIcon(path + '')], - ['Rail: Unknown', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 7', QtGui.QIcon(path + 'Unknown.png')], ['Rail: Gentle Upslope 2', QtGui.QIcon(path + '')], ['Rail: Gentle Upslope 1', QtGui.QIcon(path + '')], ['Rail: Gentle Downslope 2', QtGui.QIcon(path + '')], @@ -419,7 +419,7 @@ def __init__(self, window): ['Rail: 4x4 Circle Bottom Left', QtGui.QIcon(path + '')], ['Rail: 4x4 Circle Bottom Right', QtGui.QIcon(path + '')], ['Rail: 4x4 Circle Bottom Right Corner', QtGui.QIcon(path + '')], - ['Rail: Unknown', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 33', QtGui.QIcon(path + 'Unknown.png')], ['Rail: End Stop', QtGui.QIcon(path + '')]] ClimableGridParams = [['None', QtGui.QIcon(path + 'Core/Default.png')], @@ -439,48 +439,48 @@ def __init__(self, window): ['Coin', QtGui.QIcon(path + 'Unknown.png')], ['Nothing', QtGui.QIcon(path + 'Unknown.png')], ['Coin', QtGui.QIcon(path + 'Unknown.png')], - ['Pow Block Coin', QtGui.QIcon(path + 'Coin/POW.png')]] + ['Blue P-Switch Coin', QtGui.QIcon(path + 'Coin/BlueCoin.png')]] ExplodableBlockParams = [['None', QtGui.QIcon(path + 'Core/Default.png')], ['Stone Block', QtGui.QIcon(path + 'Explode/Stone.png')], ['Wooden Block', QtGui.QIcon(path + 'Explode/Wooden.png')], ['Red Block', QtGui.QIcon(path + 'Explode/Red.png')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')]] - - PipeParams = [['Vert. Top Entrance Left', QtGui.QIcon(path + 'Pipes/')], - ['Vert. Top Entrance Right', QtGui.QIcon(path + '')], - ['Vert. Bottom Entrance Left', QtGui.QIcon(path + '')], - ['Vert. Bottom Entrance Right', QtGui.QIcon(path + '')], - ['Vert. Center Left', QtGui.QIcon(path + '')], - ['Vert. Center Right', QtGui.QIcon(path + '')], + ['Unknown 4', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 5', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 6', QtGui.QIcon(path + 'Unknown.png')]] + + PipeParams = [['Vert. Top Entrance Left', QtGui.QIcon(path + 'Pipes/VertTopLeft.png')], + ['Vert. Top Entrance Right', QtGui.QIcon(path + 'Pipes/VertTopRight.png')], + ['Vert. Bottom Entrance Left', QtGui.QIcon(path + 'Pipes/VertBottomLeft.png')], + ['Vert. Bottom Entrance Right', QtGui.QIcon(path + 'Pipes/VertBottomRight.png')], + ['Vert. Center Left', QtGui.QIcon(path + 'Pipes/VertCenterLeft.png')], + ['Vert. Center Right', QtGui.QIcon(path + 'Pipes/VertCenterRight.png')], ['Vert. On Top Junction Left', QtGui.QIcon(path + '')], ['Vert. On Top Junction Right', QtGui.QIcon(path + '')], - ['Horiz. Left Entrance Top', QtGui.QIcon(path + '')], - ['Horiz. Left Entrance Bottom', QtGui.QIcon(path + '')], - ['Horiz. Right Entrance Top', QtGui.QIcon(path + '')], - ['Horiz. Right Entrance Bottom', QtGui.QIcon(path + '')], - ['Horiz. Center Top', QtGui.QIcon(path + '')], - ['Horiz. Center Bottom', QtGui.QIcon(path + '')], + ['Horiz. Left Entrance Top', QtGui.QIcon(path + 'Pipes/HorizLeftTop.png')], + ['Horiz. Left Entrance Bottom', QtGui.QIcon(path + 'Pipes/HorizLeftBottom.png')], + ['Horiz. Right Entrance Top', QtGui.QIcon(path + 'Pipes/HorizRightTop.png')], + ['Horiz. Right Entrance Bottom', QtGui.QIcon(path + 'Pipes/HorizRightBottom.png')], + ['Horiz. Center Top', QtGui.QIcon(path + 'Pipes/HorizCenterTop.png')], + ['Horiz. Center Bottom', QtGui.QIcon(path + 'Pipes/HorizCenterBottom.png')], ['Horiz. On Top Junction Top', QtGui.QIcon(path + '')], ['Horiz. On Top Junction Bottom', QtGui.QIcon(path + '')], - ['Vert. Mini Pipe Top', QtGui.QIcon(path + '')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Vert. Mini Pipe Bottom', QtGui.QIcon(path + '')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Vert. On Top Mini-Junction', QtGui.QIcon(path + '')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Horiz. Mini Pipe Left', QtGui.QIcon(path + '')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Horiz. Mini Pipe Right', QtGui.QIcon(path + '')], - ['Unknown', QtGui.QIcon(path + 'Unknown.png')], - ['Vert. Mini Pipe Center', QtGui.QIcon(path + '')], - ['Horiz. Mini Pipe Center', QtGui.QIcon(path + '')], - ['Horiz. On Top Mini-Junction', QtGui.QIcon(path + '')], - ['Block Covered Corner', QtGui.QIcon(path + '')]] + ['Vert. Mini Pipe Top', QtGui.QIcon(path + 'Pipes/VertMiniTop.png')], + ['Unknown 17', QtGui.QIcon(path + 'Unknown.png')], + ['Vert. Mini Pipe Bottom', QtGui.QIcon(path + 'Pipes/VertMiniBottom.png')], + ['Unknown 19', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 20', QtGui.QIcon(path + 'Unknown.png')], + ['Unknown 21', QtGui.QIcon(path + 'Unknown.png')], + ['Vert. On Top Mini-Junction', QtGui.QIcon(path + 'Pipes/VertMiniJunction.png')], + ['Unknown 23', QtGui.QIcon(path + 'Unknown.png')], + ['Horiz. Mini Pipe Left', QtGui.QIcon(path + 'Pipes/HorizMiniLeft.png')], + ['Unknown 25', QtGui.QIcon(path + 'Unknown.png')], + ['Horiz. Mini Pipe Right', QtGui.QIcon(path + 'Pipes/HorizMiniRight.png')], + ['Unknown 27', QtGui.QIcon(path + 'Unknown.png')], + ['Vert. Mini Pipe Center', QtGui.QIcon(path + 'Pipes/VertMiniCenter.png')], + ['Horiz. Mini Pipe Center', QtGui.QIcon(path + 'Pipes/HorizMiniCenter.png')], + ['Horiz. On Top Mini-Junction', QtGui.QIcon(path + 'Pipes/HorizMiniJunction.png')], + ['Block Covered Corner', QtGui.QIcon(path + 'Pipes/BlockCorner.png')]] PartialBlockParams = [['None', QtGui.QIcon(path + 'Core/Default.png')], ['Upper Left', QtGui.QIcon(path + 'Partial/UpLeft.png')], @@ -551,15 +551,15 @@ def __init__(self, window): ConveyorBeltParams = [['Slow', QtGui.QIcon(path + 'Unknown.png')], ['Fast', QtGui.QIcon(path + 'Unknown.png')]] - QBlockParams = [['Fire Flower', QtGui.QIcon(path + 'Qblock/Fire.png')], - ['Star', QtGui.QIcon(path + 'Qblock/Star.png')], - ['Coin', QtGui.QIcon(path + 'Qblock/Coin.png')], - ['Vine', QtGui.QIcon(path + 'Qblock/Vine.png')], - ['1-Up', QtGui.QIcon(path + 'Qblock/1up.png')], - ['Mini Mushroom', QtGui.QIcon(path + 'Qblock/Mini.png')], - ['Propeller Suit', QtGui.QIcon(path + 'Qblock/Prop.png')], - ['Penguin Suit', QtGui.QIcon(path + 'Qblock/Peng.png')], - ['Ice Flower', QtGui.QIcon(path + 'Qblock/IceF.png')]] + QBlockParams = [['Fire Flower', QtGui.QIcon(path + 'QBlock/Fire.png')], + ['Star', QtGui.QIcon(path + 'QBlock/Star.png')], + ['Coin', QtGui.QIcon(path + 'QBlock/Coin.png')], + ['Vine', QtGui.QIcon(path + 'QBlock/Vine.png')], + ['1-Up', QtGui.QIcon(path + 'QBlock/1up.png')], + ['Mini Mushroom', QtGui.QIcon(path + 'QBlock/Mini.png')], + ['Propeller Suit', QtGui.QIcon(path + 'QBlock/Prop.png')], + ['Penguin Suit', QtGui.QIcon(path + 'QBlock/Peng.png')], + ['Ice Flower', QtGui.QIcon(path + 'QBlock/IceF.png')]] self.ParameterList = [GenericParams, @@ -577,12 +577,10 @@ def __init__(self, window): layout = QtWidgets.QGridLayout() - layout.addWidget(self.coreType, 0, 1, 1, 2) + layout.addWidget(self.coreType, 0, 1) layout.addWidget(self.propertyGroup, 0, 0, 3, 1) - layout.addWidget(self.terrainLabel, 2, 1) - layout.addWidget(self.terrainType, 2, 2) - layout.addWidget(self.parameterLabel, 1, 1) - layout.addWidget(self.parameters, 1, 2) + layout.addWidget(self.terrainType, 2, 1) + layout.addWidget(self.parameters, 1, 1) self.setLayout(layout) # Select default core type @@ -648,7 +646,7 @@ def updateAllTiles(): self.LabelB = QtWidgets.QLabel('Properties:') self.LabelB.setFont(Font) - self.hexdata = QtWidgets.QLabel('Hex Data: 0x00 0x00 0x00 0x00\n 0x00 0x00 0x00 0x00') + self.hexdata = QtWidgets.QLabel('Hex Data:\n0x00 0x00 0x00 0x00\n0x00 0x00 0x00 0x00') self.hexdata.setFont(Font) @@ -1985,6 +1983,7 @@ def __init__(self): self.tileset = QtWidgets.QComboBox() self.tileset.addItems(['Pa0', 'Pa1', 'Pa2', 'Pa3']) + self.tileset.setMinimumWidth(48) self.tile = QtWidgets.QSpinBox() self.tile.setRange(0, 255) @@ -3626,9 +3625,11 @@ def updateInfo(self, x, y): info.terrainInfo.setText(palette.terrainTypes[curTile.byte5][0]) info.paramInfo.setText(parameter[0]) - info.hexdata.setText('Hex Data: {0} {1} {2} {3}\n {4} {5} {6} {7}'.format( - hex(curTile.byte0), hex(curTile.byte1), hex(curTile.byte2), hex(curTile.byte3), - hex(curTile.byte4), hex(curTile.byte5), hex(curTile.byte6), hex(curTile.byte7))) + # info.hexdata.setText('Hex Data:\n{0} {1} {2} {3}\n{4} {5} {6} {7}'.format( + # hex(curTile.byte0).zfill(2), hex(curTile.byte1).zfill(2), hex(curTile.byte2).zfill(2), hex(curTile.byte3).zfill(2), + # hex(curTile.byte4).zfill(2), hex(curTile.byte5).zfill(2), hex(curTile.byte6).zfill(2), hex(curTile.byte7).zfill(2))) + + info.hexdata.setText(f'Hex Data:\n0x{curTile.byte0:02x} 0x{curTile.byte1:02x} 0x{curTile.byte2:02x} 0x{curTile.byte3:02x}\n0x{curTile.byte4:02x} 0x{curTile.byte5:02x} 0x{curTile.byte6:02x} 0x{curTile.byte7:02x}') From 80974e687fe68f712b9111e43ce5cbd0cdfb41f5 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Sun, 2 Aug 2026 16:10:12 -0400 Subject: [PATCH 07/10] More stuff - Added "Invisible" block property - Better documentation for some parameters and such - Removed name for "Meltable" property as it appears to just be incorrect. - Object editor now only accepts Left Click as a valid mouse press - Changed "Ladder" terrain type to "Pole" - Added icon for Layer 0 Pit param - Fixed duplicate Diagonal Downwards partial type (its actually upwards) - Added tooltips for certain parameter lists (only when needed) - Added collision overlay for full Spike Block - Fixed libpng issue with conveyor belt icon - Added/fixed icons for breakable blocks --- Icons/Core/Conveyor.png | Bin 271 -> 564 bytes Icons/Explode/Block.png | Bin 0 -> 1353 bytes Icons/Explode/Brick.png | Bin 0 -> 1751 bytes Icons/Explode/Red.png | Bin 1353 -> 1556 bytes Icons/Explode/{Wooden.png => Wood.png} | Bin Icons/Generic/PitLayer0.png | Bin 0 -> 866 bytes Icons/Prop/Invisible.png | Bin 0 -> 432 bytes Icons/Terrain/ConveyorLeft.png | Bin 0 -> 564 bytes Icons/Terrain/ConveyorRight.png | Bin 0 -> 530 bytes Icons/Terrain/Ladder.png | Bin 1511 -> 0 bytes Icons/Terrain/Pole.png | Bin 0 -> 1288 bytes puzzle.py | 144 ++++++++++++++++++------- 12 files changed, 105 insertions(+), 39 deletions(-) create mode 100644 Icons/Explode/Block.png create mode 100644 Icons/Explode/Brick.png rename Icons/Explode/{Wooden.png => Wood.png} (100%) create mode 100644 Icons/Generic/PitLayer0.png create mode 100644 Icons/Prop/Invisible.png create mode 100644 Icons/Terrain/ConveyorLeft.png create mode 100644 Icons/Terrain/ConveyorRight.png delete mode 100644 Icons/Terrain/Ladder.png create mode 100644 Icons/Terrain/Pole.png diff --git a/Icons/Core/Conveyor.png b/Icons/Core/Conveyor.png index aee0d2ffdb85696ced89eef870e445740040a223..fe774ccf8849f25651da74528a28e2137d9bf515 100644 GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{S5AX?by_PNUf34wOF99dTp!YqRUWP$YmQg(%3`;dR&Sgt{Uu(G4O8}^L z`}eb#fD~^@kYDhBB*0+%La7ZX!CBxDS>jqptK^weVD0CHFvq!?Kl7=bJ=AeM%*L0;2f zWCn{f0ojI(ObmiRItqw0+gZTkIY2fDBmgl;Ka57Vm4N{mJQLU%Sb%B_jEoH!7eLGf z>0w;}F>4x-4FXI+lbFCNgDfq8ET}F+0|Suk&E>PEp4`qI4`fd9ba4#P2%bB^Q|Pb) z56eZbrXT;Sn~x-Idf@!aWL?<9S)N}H^m=eI+28!s%W#09BjdEvUb$(C0yg zSJ*ymI-_FLw?KDM{-QTYWk*000DMK}|sb0I`n?{9y$E001OVOjJcja7>^m z2 zjWj}mLMCo$P|juu2V}KDhw@6GPzTgZun+@+BL(MR0RSmZF2!3~-T?pr002ovPDHLk FV1g<6Si=AS diff --git a/Icons/Explode/Block.png b/Icons/Explode/Block.png new file mode 100644 index 0000000000000000000000000000000000000000..0df7e2f96fe22cf14a3c3a24e8492a7b038e11d3 GIT binary patch literal 1353 zcmV-P1-AN$P)o& zl>muiLJWyfBDp#vvKQ?azTX(<16xoke|=`rS0f9PIp;y8Om(IQYq3|OWqDF2GW#4m zGnLHDOeQn)($rMi*WFT)_@FK>>!T8izY+9}xJnv>M&NkR(C@Z=o^vmN1D#z#urrYq zbhWq~`C^FkO?{ke?4$RGUKXg}>iKE=PT7!x#Pa<)Xg(0+^P!81tACm2o;phxwKkk`B#Q=Psm9GE^r2DjLI?@ z9KZlhO;U7Jloh<{m{19)QV3wdWCGp#?EF=^EjJ$QeCPTNpf(ZKDg#Q^}sTq>amWtQ|*r4-B--u2LgmZNP&>x7#Iq*>2%z4z*z~f<=V0h z1#P@d%d-><2G5IH=^JWhgp`*(oO1hutLQ;obQk-Gcwbb3879T=7>{3#qL zg@v49bihy;fO&aMU*NZo7}E;$3V^2iN;7R~IV0`f*Z>K^b3KeQU_hy{)7?GR$UUC> z=2cZyBa3YN5yCL*8Il@dS(X$h^CP)W^Z9)R*a0*PfL%-DxrK|Xs|R}x76Px}p_RTc z3LR&xftCfi9GofX-j_%7>w(@#U2}lc#oRd&nY3L3gi4$jwm}H+Re;uG;3aLsBZJ|v zh=`Pe>=eyh$DJPS1s^yJd=7jDGyq$H13)*RBtYPqE_cYFT}|i&7i9aw>Ef}C9fe(+ z`<&eueJtn;g91<)8S`Z1_?GCj0_Ok+Ffv*+CwpAo-!tOkd4{Ipp#Qb@(yuMWuo>99 zbI^Nz)rsK;8wZ`%AKRRs4VeAWd>Xyn#Zv>UzO6F#%^TBFVM2ILRThH(P1lzz00000 LNkvXXu0mjfd53~> literal 0 HcmV?d00001 diff --git a/Icons/Explode/Brick.png b/Icons/Explode/Brick.png new file mode 100644 index 0000000000000000000000000000000000000000..f173fd6117dfd8bdbb64b20c6ec5d45471939d79 GIT binary patch literal 1751 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 UhqaUCwm&$OgS&mH?TOfb0ZWXNX#fBK delta 1335 zcmV-71<3l849No&l>muiL=_01BHO7}1V+j3_P#MZ>!BQ#GSxepyEC$k- zo52JEPn-KwmVbC!X@&3j5P~pJ3}9;zp82KZwE!8w`d=k#UNOB@XtUTWc%VTW@B;Xx z*J;}^=p6-O`9u8WMk+6RM8|y%Hl`gI@tZ>&a&;|Gh^7*|zL2xjh6y%2E^yib7!x#Pa<)Xg(0+^P!8 z1tACm2o;phxwKkk`B#Q=Psm9GE^r2DjLI?@9Dl$7PEAsDRFoCG>X-*Y5QY$jW9(80 zQc?(D!DIs6`t1Bwxh*#y?0o0?KR=XZUPCr(8nRgfEC8mAliXAhf1oxI)+z&9LlBH9 zZ~P4cY#=d#U~N@Wik{+*j$Nm(>G`Uoa>^Aklrk7#V16;KPv7rVROZYk(}15TQ7w1m!=2!Hb>8V3WmE33a(&;@i#fZB}p-n7aT#iGJ@ zB5)7fl8bT#wY5-Fjl3t3y8H2TdOa{57?vvhDI6$;g`8n@z)%=~d3jA=;J1$$(+czo zfTsFNGi_-(BkkVU013f!J&ZD7K&i3Q-96UGJ)ZmKRaI3Zi){N5!Z7O@k{V%ImVXo{ z^CP)W^Z9)R*a0*PfL%-DxrK|Xs|R}x76Px}p_RTc3LR&xftCfi9GofX-j_%7>w(@# zU2}lc#oRd&nY3L3gi4$jwm}H+Re;uG;3aLsBZJ|vh=`Pe>=eyh$DJPS1s^yJd=7jD zGyq$H13)*RBtYPqE_cYFT}|i&7k^~?!s+6%jU9zuoBN#I7kw<~3xfhs85#3r=c+{IG^tiG)>_01d8Qei@huYp&Am60stz!mGH{fvO8fJcG)%UPY{!!RxmQ~`Cs t5}*t?8l^jW$$~GBBR z0*{DgPGpG+@8VF>5OMJeSL#q$!F^F*VaH^xlI)MdJ1+7+SY+p5?ikY%)YZ|F#Ok}W z)9j@0yX<#8!n6G^=$-AKd34VIIqK}rZ9I(oztqHqiaqD@PS4-Fa^2o*%)c9V?A~-p zeH}ah^Smi>27zZj_T9I-|1Phe?+f!~zgLUz_U(TlW<2NW{(lX3a^$ql&GOdY+Z`qG z=cf7U)8^b$@18F=ihf(P_nYvR9}hO{d~;UecG05y`zn-lxP1$>$l;)deE%<%< z_}SJ^CO)eI|89`w3}10`Wlo=psv-c~zJzV+ol4Z8?!QR!qZWn?% zoLl?j%l;U69GN+Ja!_{j)?4KlP9Nt!_Sr~4vTtn__x`dPkLk{>Y-)xb!OUtL8!8W3 zxULHB5jSp#WnaeWmM!5|(9-O2R72Fg;L8b#NAuhkUt|uIk2UGJtt88|vn5Vo@#fhJ zZuec_6qc|Kzn*#`jkRdoVwa^KqQm%=Tmre2nx<6WYB6teuH@9HezdoBiNF8)8CUoP zZy(qub|Y%7Xu+Dv6ZL*cYWPiP`?x=)_Uw&sZ_fzaSY9A=qE2UO!`HcQmtGM|72a8S g`{e}1|F#F>?+QQsDBWMW7nDjoUHx3vIVCg!0Q8nQ8UO$Q literal 0 HcmV?d00001 diff --git a/Icons/Prop/Invisible.png b/Icons/Prop/Invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..2d323accd4a67daaf8c7c09c15c3af6d7f4dda1f GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl}24DbnYH83#v@#6=O=d?O;E|6j_3Gxg6|DWOdDPEvj2F?PH$YKTtzQZ8Q zcszea3Q$n8#5JNMI6tkVJh3R1As{g`uSCz!HAKNw&rr|MNSM*R1gL07YJ_K+r>7PJ z2av3CK2NWMU8m(osO1+0FtM&jGSQAOVO$`e8J> ztw5JEFic=)U;(NzFfuk^TmUf_q=$6@#H?vRHV7~QO=1G846?KUvY@&Q4GciCHEalo5uBWmkdShuZzC6zp|Y~D7(*C;>SBfkEX>SPdYK%KJ)9)5m06T$ kkF3ID1H&*!H#asm24NHCO6k0RAkQ#(y85}Sb4q9e0PU?)wg3PC literal 0 HcmV?d00001 diff --git a/Icons/Terrain/ConveyorLeft.png b/Icons/Terrain/ConveyorLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..fe774ccf8849f25651da74528a28e2137d9bf515 GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{S5AX?by_PNUf34wOF99dTp!YqRUWP$YmQg(%3`;dR&Sgt{Uu(G4O8}^L z`}eb#fD~^@kYDhBB*0+%La7ZX!CBxDS>jqptK^weVD0CHFvq!?Kl7=bJ=AeM%*L0;2f zWCn{f0ojI(ObmiRItqw0+gZTkIY2fDBmgl;Ka57Vm4N{mJQLU%Sb%B_jEoH!7eLGf z>0w;}F>4x-4FXI+lbFCNgDfq8ET}F+0|Suk&E>PEp4`qI4`fd9ba4#P2%bB^Q|Pb) z56eZbrXT;Sn~x-Idf@!aWL?<9S)N}H^m=eI+28!s%W#09BjdEvUb$(C0yg zSJ*ymI-_FLw?KDM{-QTYWkVM%xNb!1@J z*w6hZkrl|73-AeXy_PNUf32aDV$fbMfhfzU_dS|khCw|X3`;dRfJ%0)-IoWXxJrWj zg8#z+!=^Jj=YgV}1s;*b3=DjSL74G){)!Z!pk#?_L`iUdT1k0gQ7S_~VrE{6o}X)o zf~lUNo}rO2qk9QZ(T>yz&ooa@Ee4PstPE0&tPG4mmKP99L)jqjXfQH^#hHL?Lq;YB zK_DFk#F_0ZVDTIv8w3)77^ELYqua{B01T1|>pWc?Lo|ZtPPom*V#wjVI?VdtfByV8 ze)`61YHv6weqmA3ocDskYvHlCP*@-N;3gge;o9x0bG$n2kuds!PziK8}o0@!w*on?a$+ z$BKI>p~9@{@1U5NW9-^r*~CrJ&vV4DI*@`Z-sF=1|D>0PDgXPG-pEJT)Ogd*ZsFBo z!^wX3qAjL*3`jC?1AbSB!!Rsa2&mWeT- zltlmko~E5pvbA=QfGOqES(J@R&A2&wZz+U#D4(i=r=(}|;A8IFX1K3resCnAlRl}c zY>Rv-F9;~?1YGl zQ}N<$jEqatyFk^sEY8)7)zo*q+OD|KrSIKefN>)8+fkE;Jk-KSs-#c8&XJ9WKD@0+ zqnJI&$aVkzm;e8(prmEc*O9ogX8-=6$H|GSrC+VxM2z)1Plh#k5M;%4Fx@j?ukG`0t9~(QC7!J-@F=zNjD_$a z)q>N=ZOOS!+}4HZ+<4KpH~#Q_z_3r)(t_*ZhxX}w<=cYa$x6||Sh1o+&c$^6@rm!+ zUHkBL+|qZqt6kmJhw|)|=+aK{;c@ZVPM(M%&a*Q2=4H^pSmf7l`S6X&yj`Q#-i7`La;lR?9wjg88G!|}krzBb&Qb*#y>>%Yb2^WyU4gPQVs z6{+*sFQc&Wo4dQNQ>w%Cv-6vh*4R;>uA7Vb&U3(`r}E$=!*`73YHU|_IYcRE;_0R{|ImTmT8 z1vB{{J`s&jh+zQ&Jw2Aj)`PDDI3N;RpI&yT4DwqC1}of8OvJWhkoW9uWCK@tf@E0>*A(=AC76pYsBR@H4k zvm%iVB*9a#@x!v?@3sIvxaH@!t3Q7K`CAQ=U{p4IyYJ)XJqMrNzO#JQ<)z<$ZTeIS zHcCol`QGv};~*v`CYP*+whoh(7xN$z@oSD$h%tz9tEUrcK$f>Ea{~1^^piyp7Zf!v_EW N002ovPDHLkV1nE4Rt^9F diff --git a/Icons/Terrain/Pole.png b/Icons/Terrain/Pole.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd95a9ccf581388001b30f534d6dd1acd026386 GIT binary patch literal 1288 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3u`~F*C13&(AeP!Bo#s z&(KJi(Y*wyXh&*iasoR83s9|rk+A{e0*JXFJ6RV%%$f#dg8&oI zWG1l6AWI7%3#!Y|zyKuMT(2)vbm8)Spov>NT^vI^yw^^>?JpB5b9}$?=FO)!z0+HB zn(1ikx;0`Mv-DcbKDq_ZTIS2)xJ5CuhyT};&HVpVf4!J(s5UFaS9<WO?i^yW@^Uiz`m1vLjsXNcRKJn5-+|NYOjbMNQee<*P1_SAl^=iO8D*{ju;Uy@B_ zDHH2cJhaL7#ab`-N`Q@BSHoN_7 zLJ=KDSw-4*O*or6Y0rVXN!!d=%(grKV0N99Z_fYKNy zZS`M)f@5J?fj{2eh%lb{m1SXl!Y$sUotLzpTX&yyd6c#D$FCn-SFYYslFAShw2V=| z?o-Xv;ImW0qVf)>ZZkWyy(3VIzi_Iy`15* ze*SL}`x(D$*JX__PXlVUHry+&Ou1}%9jPvxGUU0G;^A0c*j@YlC z@RqUvmKOWoQ!dK|Brn|gv|;0mgqPmZ{_h2^TxYz#;P{Q_f&yw*ttS}d^=#S?nALtr zYM7VED85epqP?2ZRpHEjz87+R3%@Mu_}FTpRh~R!hxG9e(wtAalrH@=Ug3Ctr`{89 z&M)yo6J9=d;1}4^EFlx>^1xN@&A3wh|m zCSzOt;ZHg@|9-=b-!HT-y|n8>_S4A>dV8-1y08gM*GsvW$o^o(uIdTLAGq+$w3{b3 zx6@D2$l(RUktzP)=P#&XUZL|rVy>Wpfu6$kayHWwQyUvkGKi;fR2{ed(ZqV#m&-XdKC52$ z*Q8}WzS59XSGBHL`qwUf(|W^)dz3Y{3O%`{{iUbRL8R^6>8R2$zY+2_tLkD9~?V)%>!Os*k-{ezx~dB@tJS!8U8b{u' '
  • Ledge:
    ' 'Must have ledge property set as well.
  • ' - '
  • Ladder:
    ' - 'Acts as a pole. Mario will face right or left as he climbs.
  • ' + '
  • Pole:
    ' + 'Mario will face right or left as he climbs.
  • ' '
  • Staircase:
    ' 'Does not allow Mario to slide.
  • ' '
  • Carpet:
    ' @@ -384,7 +385,7 @@ def __init__(self, window): ['Cave Entrance Right', QtGui.QIcon(path + 'Generic/Cave-Right.png')], ['Cave Entrance Left', QtGui.QIcon(path + 'Generic/Cave-Left.png')], ['Unknown 8', QtGui.QIcon(path + 'Unknown.png')], - ['Layer 0 Pit', QtGui.QIcon(path + 'Unknown.png')]] + ['Layer 0 Pit', QtGui.QIcon(path + 'Generic/PitLayer0.png')]] RailParams = [['None', QtGui.QIcon(path + 'Core/Default.png')], ['Rail: Upslope', QtGui.QIcon(path + '')], @@ -436,18 +437,18 @@ def __init__(self, window): CoinParams = [['Generic Coin', QtGui.QIcon(path + 'QBlock/Coin.png')], - ['Coin', QtGui.QIcon(path + 'Unknown.png')], + ['Coin (1)', QtGui.QIcon(path + 'Unknown.png')], ['Nothing', QtGui.QIcon(path + 'Unknown.png')], - ['Coin', QtGui.QIcon(path + 'Unknown.png')], - ['Blue P-Switch Coin', QtGui.QIcon(path + 'Coin/BlueCoin.png')]] + ['Coin (3)', QtGui.QIcon(path + 'Unknown.png')], + ['Blue Coin', QtGui.QIcon(path + 'Coin/BlueCoin.png')]] - ExplodableBlockParams = [['None', QtGui.QIcon(path + 'Core/Default.png')], + ExplodableBlockParams = [['Empty Block', QtGui.QIcon(path + 'Explode/Block.png')], ['Stone Block', QtGui.QIcon(path + 'Explode/Stone.png')], - ['Wooden Block', QtGui.QIcon(path + 'Explode/Wooden.png')], + ['Wooden Block', QtGui.QIcon(path + 'Explode/Wood.png')], ['Red Block', QtGui.QIcon(path + 'Explode/Red.png')], - ['Unknown 4', QtGui.QIcon(path + 'Unknown.png')], - ['Unknown 5', QtGui.QIcon(path + 'Unknown.png')], - ['Unknown 6', QtGui.QIcon(path + 'Unknown.png')]] + ['Red Block (2)', QtGui.QIcon(path + 'Explode/Red.png')], + ['Brick Block', QtGui.QIcon(path + 'Explode/Brick.png')], + ['Brick Block (2)', QtGui.QIcon(path + 'Explode/Brick.png')]] PipeParams = [['Vert. Top Entrance Left', QtGui.QIcon(path + 'Pipes/VertTopLeft.png')], ['Vert. Top Entrance Right', QtGui.QIcon(path + 'Pipes/VertTopRight.png')], @@ -488,7 +489,7 @@ def __init__(self, window): ['Top Half', QtGui.QIcon(path + 'Partial/TopHalf.png')], ['Lower Left', QtGui.QIcon(path + 'Partial/LowLeft.png')], ['Left Half', QtGui.QIcon(path + 'Partial/LeftHalf.png')], - ['Diagonal Downwards', QtGui.QIcon(path + 'Partial/DiagDn.png')], + ['Diagonal Upwards', QtGui.QIcon(path + 'Partial/DiagUp.png')], ['Upper Left 3/4', QtGui.QIcon(path + 'Partial/UpLeft3-4.png')], ['Lower Right', QtGui.QIcon(path + 'Partial/LowRight.png')], ['Diagonal Downwards', QtGui.QIcon(path + 'Partial/DiagDn.png')], @@ -548,8 +549,8 @@ def __init__(self, window): ['Single Downwards Spike', QtGui.QIcon(path + 'Spike/SingDown.png')], ['Spike Block', QtGui.QIcon(path + 'Unknown.png')]] - ConveyorBeltParams = [['Slow', QtGui.QIcon(path + 'Unknown.png')], - ['Fast', QtGui.QIcon(path + 'Unknown.png')]] + ConveyorBeltParams = [['Slow', QtGui.QIcon(path + '')], + ['Fast', QtGui.QIcon(path + '')]] QBlockParams = [['Fire Flower', QtGui.QIcon(path + 'QBlock/Fire.png')], ['Star', QtGui.QIcon(path + 'QBlock/Star.png')], @@ -575,6 +576,43 @@ def __init__(self, window): ConveyorBeltParams, QBlockParams] + self.ParameterTips = [ + 'Default Parameters:' + '
      ' + '
    • Default:
      No Parameters.
    • ' + '
    • Beanstalk Stop:
      Stops growing vines that collide with this tile.
    • ' + '
    • Dash Coin:
      Outlines that turn into coins when players touch them.
    • ' + '
    • Battle Coin:
      Similar to Dash Coin, but they only appear in Coin Battle mode.
    • ' + '
    • Red Block Outline A:
      Blocks that become solid when hitting a ! Switch. Does not work with the World 3 switch, and does not visually change into red block tiles.
    • ' + '
    • Red Block Outline B:
      Same as above, unknown if there are any differences.
    • ' + '
    • Cave Entrance Right/Left:
      Defines Layer 0 cave entrances.
    • ' + '
    • Unknown 8:
      Unknown type with unknown behavior.
    • ' + '
    • Layer 0 Pit:
      Defines Layer 0 pits (cave entrances).
    • ' + '
    ', + + None, # Slope + None, # Reverse Slope + None, # Partial Blocks + + 'Coin Parameters:' + '
      ' + '
    • Generic Coin:
      Normal coin that can be collected, turns into ? Blocks if a P-Switch is hit.
    • ' + '
    • Coin (1):
      Acts like a coin, but does not turn into a ? Block when a P-Switch is active.
    • ' + '
    • Unknown:
      Would act like a coin, however the game code skips all coin behavior for this type.
    • ' + '
    • Coin (3):
      Acts the same as Coin (1). Unknown if it behaves any differently.
    • ' + '
    • Blue Coin:
      A blue coin that can be collected, regardless of the P-Switch being activated or not.
    • ' + '
    ', + + None, # Explodable Blocks + None, # Climbable Grids + None, # Spikes + None, # Pipes + None, # Rails + None, # Conveyors + + 'Setting the parameter might not work, so set the item type by right-clicking any objects using this tile!', + ] + layout = QtWidgets.QGridLayout() layout.addWidget(self.coreType, 0, 1) @@ -591,6 +629,7 @@ def swapParams(self): for item in range(12): if self.coreWidgets[item].isChecked(): self.parameters.clear() + self.parameters.setToolTip(self.ParameterTips[item]) for option in self.ParameterList[item]: self.parameters.addItem(option[1], option[0]) @@ -830,7 +869,7 @@ def paint(self, painter, option, index): colour = QtGui.QColor(128,0,255, 120) elif curTile.byte5 == 8: # Ledge colour = QtGui.QColor(128,0,255, 120) - elif curTile.byte5 == 9: # Ladder + elif curTile.byte5 == 9: # Pole colour = QtGui.QColor(128,0,255, 120) elif curTile.byte5 == 10: # Staircase colour = QtGui.QColor(255, 0, 0, 120) @@ -1051,12 +1090,12 @@ def paint(self, painter, option, index): QtCore.QPoint(x + 24, y + 24), QtCore.QPoint(x + 12, y + 24)])) elif curTile.byte7 == 9: - painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x + 24, y), - QtCore.QPoint(x + 24, y + 12), - QtCore.QPoint(x, y + 12), - QtCore.QPoint(x, y + 24), + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), + QtCore.QPoint(x + 12, y), QtCore.QPoint(x + 12, y + 24), - QtCore.QPoint(x + 12, y)])) + QtCore.QPoint(x + 24, y + 24), + QtCore.QPoint(x + 24, y + 12), + QtCore.QPoint(x, y + 12)])) elif curTile.byte7 == 10: painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x + 12, y), QtCore.QPoint(x + 24, y), @@ -1165,19 +1204,42 @@ def paint(self, painter, option, index): QtCore.QPoint(x + 24, y), QtCore.QPoint(x + 12, y + 24)])) + if curTile.byte7 == 7: + painter.drawRect(x + 7, y + 7, 10, 10) + + spikes = [ + [QtCore.QPoint(x, y), QtCore.QPoint(x + 10, y + 6), QtCore.QPoint(x + 6, y + 10)], # Top left + [QtCore.QPoint(x + 24, y), QtCore.QPoint(x + 14, y + 6), QtCore.QPoint(x + 18, y + 10)], # Top right + [QtCore.QPoint(x, y + 24), QtCore.QPoint(x + 10, y + 18), QtCore.QPoint(x + 6, y + 14)], # Bottom left + [QtCore.QPoint(x + 24, y + 24), QtCore.QPoint(x + 14, y + 18), QtCore.QPoint(x + 18, y + 14)], # Bottom right + [QtCore.QPoint(x + 12, y - 1), QtCore.QPoint(x + 8, y + 8), QtCore.QPoint(x + 16, y + 8)], # Top + [QtCore.QPoint(x + 12, y + 25), QtCore.QPoint(x + 8, y + 16), QtCore.QPoint(x + 16, y + 16)], # Bottom + [QtCore.QPoint(x - 1, y + 12), QtCore.QPoint(x + 8, y + 8), QtCore.QPoint(x + 8, y + 16)], # Left + [QtCore.QPoint(x + 25, y + 12), QtCore.QPoint(x + 16, y + 8), QtCore.QPoint(x + 16, y + 16)], # Right + ] + + for spike in spikes: + painter.drawPolygon(QtGui.QPolygon(spike)) + elif curTile.byte3 & 2: # Coin if curTile.byte7 == 0: painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Coin/Coin.png')) if curTile.byte7 == 4: - painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Coin/POW.png')) + painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Coin/BlueCoin.png')) elif curTile.byte3 & 8: # Exploder - if curTile.byte7 == 1: - painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Explode/Stone.png')) - if curTile.byte7 == 2: - painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Explode/Wood.png')) - if curTile.byte7 == 3: - painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Explode/Red.png')) + names = [ + 'Explode/Block.png', + 'Explode/Stone.png', + 'Explode/Wood.png', + 'Explode/Red.png', + 'Explode/Red.png', + 'Explode/Brick.png', + 'Explode/Brick.png' + ] + + if curTile.byte7 <= 6: + painter.drawPixmap(option.rect, QtGui.QPixmap(path + names[curTile.byte7])) elif curTile.byte1 & 2: # Falling painter.drawPixmap(option.rect, QtGui.QPixmap(path + 'Prop/Fall.png')) @@ -1361,6 +1423,7 @@ def removeObj(self): def setObject(self, index): global Tileset object = Tileset.objects[index.row()] + self.enableButtons(True) width = len(object.tiles[0])-1 height = len(object.tiles)-1 @@ -1874,7 +1937,7 @@ def contextMenuEvent(self, event): def mousePressEvent(self, event): global Tileset - if event.button() == 2: + if event.button() != Qt.MouseButton.LeftButton: return if window.tileDisplay.selectedIndexes() == []: @@ -3586,6 +3649,8 @@ def updateInfo(self, x, y): propertyList.append('Pass-Through') if curTile.byte2 & 64: propertyList.append('Pass-Down') + if curTile.byte2 & 32: + propertyList.append('Invisible') if curTile.byte1 & 2: propertyList.append('Falling') if curTile.byte1 & 8: @@ -3656,6 +3721,7 @@ def paintFormat(self, index): curTile.byte2 = ((palette.coreWidgets[6].isChecked() << 2) + (palette.coreWidgets[3].isChecked() << 3) + (palette.coreWidgets[7].isChecked() << 4) + + (palette.propertyWidgets[5].isChecked() << 5) + (palette.PassDown.isChecked() << 6) + (palette.PassThrough.isChecked() << 7)) curTile.byte3 = ((solid) + From 902c5c03b8ec5cc4e8a1160cf09e1882949e102f Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Tue, 4 Aug 2026 02:12:45 -0400 Subject: [PATCH 08/10] A few other fixes - Fix Meltable property name - Tweak mix/max size of the tile viewer - Fixed property info list having a weird default name that expands the window height --- puzzle.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/puzzle.py b/puzzle.py index 74dc404..064959b 100644 --- a/puzzle.py +++ b/puzzle.py @@ -669,7 +669,7 @@ def updateAllTiles(): self.coreInfo = QtWidgets.QLabel() - self.propertyInfo = QtWidgets.QLabel(' \n\n\n\n\n') + self.propertyInfo = QtWidgets.QLabel('None') self.terrainInfo = QtWidgets.QLabel() self.paramInfo = QtWidgets.QLabel() @@ -798,8 +798,8 @@ class displayWidget(QtWidgets.QListView): def __init__(self, parent=None): super().__init__(parent) - self.setMinimumWidth(424) - self.setMaximumWidth(424) + self.setMinimumWidth(405) + self.setMaximumWidth(405) self.setMinimumHeight(404) self.setDragEnabled(True) self.setViewMode(QtWidgets.QListView.ViewMode.IconMode) @@ -3656,7 +3656,7 @@ def updateInfo(self, x, y): if curTile.byte1 & 8: propertyList.append('Ledge') if curTile.byte0 & 2: - propertyList.append('Meltable') + propertyList.append('Unknown') if len(propertyList) == 0: @@ -3690,10 +3690,6 @@ def updateInfo(self, x, y): info.terrainInfo.setText(palette.terrainTypes[curTile.byte5][0]) info.paramInfo.setText(parameter[0]) - # info.hexdata.setText('Hex Data:\n{0} {1} {2} {3}\n{4} {5} {6} {7}'.format( - # hex(curTile.byte0).zfill(2), hex(curTile.byte1).zfill(2), hex(curTile.byte2).zfill(2), hex(curTile.byte3).zfill(2), - # hex(curTile.byte4).zfill(2), hex(curTile.byte5).zfill(2), hex(curTile.byte6).zfill(2), hex(curTile.byte7).zfill(2))) - info.hexdata.setText(f'Hex Data:\n0x{curTile.byte0:02x} 0x{curTile.byte1:02x} 0x{curTile.byte2:02x} 0x{curTile.byte3:02x}\n0x{curTile.byte4:02x} 0x{curTile.byte5:02x} 0x{curTile.byte6:02x} 0x{curTile.byte7:02x}') From bdefdb39a62d1b85aad1e9106ad314b1ee3ad91c Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Tue, 4 Aug 2026 04:16:26 -0400 Subject: [PATCH 09/10] Collision previews for steep (1x2) slopes --- puzzle.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/puzzle.py b/puzzle.py index 064959b..a6abbbd 100644 --- a/puzzle.py +++ b/puzzle.py @@ -929,6 +929,24 @@ def paint(self, painter, option, index): painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y + 12), QtCore.QPoint(x + 24, y + 24), QtCore.QPoint(x, y + 24)])) + elif curTile.byte7 == 6: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y + 24), + QtCore.QPoint(x + 12, y), + QtCore.QPoint(x + 24, y), + QtCore.QPoint(x + 24, y + 24)])) + elif curTile.byte7 == 7: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x + 12, y + 24), + QtCore.QPoint(x + 24, y), + QtCore.QPoint(x + 24, y + 24)])) + elif curTile.byte7 == 8: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), + QtCore.QPoint(x + 12, y), + QtCore.QPoint(x + 24, y + 24), + QtCore.QPoint(x, y + 24)])) + elif curTile.byte7 == 9: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), + QtCore.QPoint(x, y + 24), + QtCore.QPoint(x + 12, y + 24)])) elif curTile.byte7 == 10: painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), QtCore.QPoint(x, y + 24), @@ -1000,6 +1018,24 @@ def paint(self, painter, option, index): painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y + 12), QtCore.QPoint(x, y), QtCore.QPoint(x + 24, y)])) + elif curTile.byte7 == 6: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), + QtCore.QPoint(x + 24, y), + QtCore.QPoint(x + 24, y + 24), + QtCore.QPoint(x + 12, y + 24)])) + elif curTile.byte7 == 7: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x + 12, y), + QtCore.QPoint(x + 24, y), + QtCore.QPoint(x + 24, y + 24)])) + elif curTile.byte7 == 8: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), + QtCore.QPoint(x + 24, y), + QtCore.QPoint(x + 12, y + 24), + QtCore.QPoint(x, y + 24)])) + elif curTile.byte7 == 9: + painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), + QtCore.QPoint(x + 12, y), + QtCore.QPoint(x, y + 24)])) elif curTile.byte7 == 10: painter.drawPolygon(QtGui.QPolygon([QtCore.QPoint(x, y), QtCore.QPoint(x, y + 24), From 0af0320cb413bb338cee2b8f387bccf8f7547488 Mon Sep 17 00:00:00 2001 From: mandy <67531582+MandyIGuess@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:11:14 -0400 Subject: [PATCH 10/10] Add weird flag used by Pa1_obake Its normal from the sides and bottom, but has this weird slope-like collision on the top? super janky --- puzzle.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/puzzle.py b/puzzle.py index a6abbbd..26a11ef 100644 --- a/puzzle.py +++ b/puzzle.py @@ -269,8 +269,9 @@ def __init__(self, window): ['Block', QtGui.QIcon(path + 'Prop/Break.png'), 'This denotes breakable tiles such\nas brick blocks. It is likely that these\nare subject to the same issues as\nexplodable blocks. They emit a coin\nwhen hit.'], ['Falling Block', QtGui.QIcon(path + 'Prop/Fall.png'), 'Sets the block to fall after a set period. The\nblock is sadly replaced with a donut lift model.'], ['Ledge', QtGui.QIcon(path + 'Prop/Ledge.png'), 'A ledge tile with unique properties.\n\nLedges can be shimmied along or\nhung from, but not walked along\nas with normal terrain. Must have the\nledge terrain type set as well.'], - ['Unknown', QtGui.QIcon(path + 'Unknown.png'), 'Formerly known as "Meltable".'], - ['Invisible Block', QtGui.QIcon(path + 'Prop/Invisible.png'), 'This denotes invisible blocks.\n\nIt is only an indicator that the tile may\nnot be valid terrain until hit, and is not\nrequired for invisible blocks to work.']] + ['Unknown (Byte 0 && 0x2)', QtGui.QIcon(path + 'Unknown.png'), 'Formerly known as "Meltable".'], + ['Invisible Block', QtGui.QIcon(path + 'Prop/Invisible.png'), 'This denotes invisible blocks.\n\nIt is only an indicator that the tile may\nnot be valid terrain until hit, and is not\nrequired for invisible blocks to work.'], + ['Unknown (Byte 1 && 0x10)', QtGui.QIcon(path + 'Unknown.png'), 'Used in 07-21 Area 3 Zone 2.\n\nActs normal from sides and below,\nbut has strange slope-like collision\non the top.']] for item in range(len(propertyList)): self.propertyWidgets.append(QtWidgets.QCheckBox(propertyList[item][0])) @@ -3692,7 +3693,9 @@ def updateInfo(self, x, y): if curTile.byte1 & 8: propertyList.append('Ledge') if curTile.byte0 & 2: - propertyList.append('Unknown') + propertyList.append('Unknown (Byte 0 & 0x2)') + if curTile.byte1 & 16: + propertyList.append('Unknown (Byte 1 & 0x10)') if len(propertyList) == 0: @@ -3749,7 +3752,8 @@ def paintFormat(self, index): curTile.byte0 = ((palette.propertyWidgets[4].isChecked() << 1)) curTile.byte1 = ((palette.coreWidgets[8].isChecked()) + (palette.propertyWidgets[2].isChecked() << 1) + - (palette.propertyWidgets[3].isChecked() << 3)) + (palette.propertyWidgets[3].isChecked() << 3) + + (palette.propertyWidgets[6].isChecked() << 4)) curTile.byte2 = ((palette.coreWidgets[6].isChecked() << 2) + (palette.coreWidgets[3].isChecked() << 3) + (palette.coreWidgets[7].isChecked() << 4) +