@@ -39,11 +39,16 @@ def __init__(self, process):
39
39
self .matshow = False
40
40
41
41
self .items : ItemData = process .renderer .tiles
42
- p = json .load (open (path + "patterns.json" , "r" ))
42
+ self .codes = {}
43
+ p : dict = jsonc .load (open (path + "patterns.json" , "r" ))
43
44
if "special" not in self .items .categories :
44
45
self .items .append ({"name" : "special" , "color" : black , "items" : p ["patterns" ]})
45
46
for indx , pattern in enumerate (p ["patterns" ]):
46
47
self .items [- 1 ]["items" ][indx ]["cat" ] = [len (self .items ), indx + 1 ]
48
+
49
+ # loading code presets
50
+ for pat in pattern .get ("codenames" , []):
51
+ self .codes [pat ] = open (path2patterns + pat , "r" ).read ()
47
52
self .blocks = p ["blocks" ]
48
53
self .brushmode = False
49
54
self .squarebrush = False
@@ -58,7 +63,7 @@ def __init__(self, process):
58
63
59
64
super ().__init__ (process , "TE" , False )
60
65
self .drawtiles = True
61
- self .set ("materials 0" , "Standard" )
66
+ self .set ("materials 0" , "Standard" , usefavs = True )
62
67
self .labels [2 ].set_text ("Default material: " + self .data ["TE" ]["defaultMaterial" ])
63
68
64
69
self .selector = widgets .Selector (self , self .items , "s1" , "tiles.txt" )
@@ -147,9 +152,16 @@ def blit(self):
147
152
pg .draw .rect (self .surface , canplace if self .tool == 0 else cannotplace , [[cposx - 2 , cposy - 2 ],
148
153
[self .tileimage ["size" ] * self .size + 4 ,
149
154
self .tileimage ["size" ] * self .size + 4 ]], 2 )
155
+ elif self .tileimage ["ptype" ] == "codepat" :
156
+ cposxo = int (posoffset .x )
157
+ cposyo = int (posoffset .y )
158
+ cposx = (cposxo + self .xoffset ) * self .size + self .field .rect .x
159
+ cposy = (cposyo + self .yoffset ) * self .size + self .field .rect .y
160
+ pg .draw .rect (self .surface , canplace if self .tool == 0 else cannotplace ,
161
+ [[cposx - 2 , cposy - 2 ], [self .size + 4 , self .size + 4 ]], 2 )
150
162
else :
151
- cposxo = int (posoffset .x ) - 2
152
- cposyo = int (posoffset .y ) - 2
163
+ cposxo = int (posoffset .x )
164
+ cposyo = int (posoffset .y )
153
165
bp = self .getmouse
154
166
if self .brushmode :
155
167
if self .squarebrush :
@@ -217,7 +229,7 @@ def blit(self):
217
229
if block ["tp" ] == "material" or block ["tp" ] == "tileHead" :
218
230
history .append ([x , y , block ])
219
231
pyperclip .copy (str (history ))
220
- elif self .tool == 0 and self . tileimage ["tp" ] == "pattern" :
232
+ elif self .tileimage ["tp" ] == "pattern" :
221
233
self .insertpattern_rect (rect )
222
234
self .detecthistory (["TE" , "tlMatrix" ])
223
235
if fg :
@@ -255,11 +267,13 @@ def insertpattern_rect(self, rect):
255
267
case "placer4" :
256
268
for y in range (int (rect .h )):
257
269
for x in range (int (rect .w )):
258
- self .pattern_placer4 (x + rect .x , y + rect .y )
270
+ self .pattern_placer4 (x + rect .x , y + rect .y , render = False )
271
+ case "codepat" :
272
+ self .pattern_codepat (rect , True , self .tool == 1 )
259
273
case _:
260
274
return
261
275
self .selector .currentcategory , self .selector .currentitem , self .selector .show = savedata
262
- self .set (savedcat , savedtool )
276
+ self .set (savedcat , savedtool , usefavs = True )
263
277
self .selector .recreate ()
264
278
265
279
def insertpattern_pen (self , xpos , ypos ):
@@ -271,15 +285,35 @@ def insertpattern_pen(self, xpos, ypos):
271
285
match self .tileimage ["ptype" ]:
272
286
case "placer4" :
273
287
self .pattern_placer4 (xpos , ypos )
288
+ case "codepat" :
289
+ self .pattern_codepat (pg .Rect (xpos , ypos , 1 , 1 ), False , self .tool == 1 )
274
290
case _:
275
291
return
276
292
self .selector .currentcategory , self .selector .currentitem , self .selector .show = savedata
277
- self .set (savedcat , savedtool )
293
+ self .set (savedcat , savedtool , usefavs = True )
278
294
self .tool = stool
279
295
self .selector .recreate ()
280
296
297
+ def pattern_codepat (self , rect , userect , destroy ):
298
+ def normaldestroy (dodestroy ):
299
+ if dodestroy and userect :
300
+ for x in range (int (rect .w )):
301
+ for y in range (int (rect .h )):
302
+ self .destroy (x + rect .x , y + rect .y )
303
+ elif dodestroy and not userect :
304
+ self .destroy (rect .x , rect .y )
305
+ for codename in self .tileimage ["codenames" ]:
306
+ if self .codes .get (codename ) is None :
307
+ log_to_load_log (f"Couldn't load script with name { codename } " , error = True )
308
+ return
309
+ try :
310
+ savedtile = self .tileimage
311
+ exec (self .codes [codename ])
312
+ except Exception as e :
313
+ traceback .print_exc ()
314
+ print (f"script { codename } failed with error { str (e )} " )
281
315
282
- def pattern_placer4 (self , xpos , ypos , init = True ):
316
+ def pattern_placer4 (self , xpos , ypos , init = True , render = True ):
283
317
if xpos < 0 or xpos > self .levelwidth or ypos < 0 or ypos > self .levelheight :
284
318
return
285
319
size = self .tileimage ["size" ]
@@ -296,16 +330,6 @@ def pattern_placer4(self, xpos, ypos, init=True):
296
330
savedata = [self .selector .currentcategory , self .selector .currentitem , self .selector .show ]
297
331
stool = self .tool
298
332
299
- def gettile (xp , yp ):
300
- if xp < 0 or xp > self .levelwidth or yp < 0 or yp > self .levelheight :
301
- return None
302
- if self .data .TE_data (xp , yp , self .layer )["tp" ] == "tileBody" :
303
- a = toarr (self .data .TE_data (xp , yp , self .layer )["data" ][0 ], "point" )
304
- return gettile (a [0 ] - 1 , a [1 ] - 1 )
305
- elif self .data .TE_data (xp , yp , self .layer )["tp" ] == "tileHead" :
306
- return self .items [self .data .TE_data (xp , yp , self .layer )["data" ][1 ]]
307
- return None
308
-
309
333
def isplaceretile (xp , yp ) -> bool :
310
334
if xp < 0 or xp > self .levelwidth or yp < 0 or yp > self .levelheight :
311
335
return False
@@ -314,13 +338,13 @@ def isplaceretile(xp, yp) -> bool:
314
338
return True
315
339
elif geotile in geonotcount :
316
340
return False
317
- tile = gettile (xp , yp )
341
+ tile = self . gettile (xp , yp )
318
342
if tile is None :
319
343
return False
320
344
return tile ["nm" ] in conf .values () or tile ["nm" ] in add
321
345
322
346
if self .tool == 0 or not init :
323
- self .set (tile ["category" ], tile ["nm" ], False , False )
347
+ self .set (tile ["category" ], tile ["nm" ], False )
324
348
if not self .test_cols (xpos , ypos ):
325
349
return
326
350
@@ -330,7 +354,7 @@ def isplaceretile(xp, yp) -> bool:
330
354
connectioncode += "W" if isplaceretile (xpos - size , ypos ) else ""
331
355
332
356
tile = self .items [conf [connectioncode ]]
333
- self .set (tile ["category" ], tile ["nm" ], False , False )
357
+ self .set (tile ["category" ], tile ["nm" ], render )
334
358
self .tileimage ["image" ] = pg .transform .scale (self .tileimage ["image" ],
335
359
[self .tileimage ["image" ].get_width () / spritesize * self .size ,
336
360
self .tileimage ["image" ].get_height () / spritesize * self .size ])
@@ -339,30 +363,28 @@ def isplaceretile(xp, yp) -> bool:
339
363
for yp in range (size // tile ["size" ][1 ]):
340
364
self .place (xpos + xp , ypos + yp , True )
341
365
else :
342
- self .place (xpos , ypos , True )
366
+ self .place (xpos , ypos , render )
343
367
elif self .tool == 1 :
344
- self .destroy (xpos , ypos , destroycolor = gray )
368
+ self .destroy (xpos , ypos , render , destroycolor = gray )
345
369
if init :
346
370
for i in col4 :
347
371
if isplaceretile (xpos + i [0 ] * size , ypos + i [1 ] * size ):
348
372
if not allequal :
349
373
for xp in range (size ):
350
374
for yp in range (size ):
351
- self .destroy (xpos + i [0 ] * size + xp , ypos + i [1 ] * size + yp , destroycolor = darkgray )
375
+ self .destroy (xpos + i [0 ] * size + xp , ypos + i [1 ] * size + yp , render , destroycolor = darkgray )
352
376
else :
353
- self .destroy (xpos + i [0 ] * size , ypos + i [1 ] * size , destroycolor = darkgray )
377
+ self .destroy (xpos + i [0 ] * size , ypos + i [1 ] * size , render , destroycolor = darkgray )
354
378
self .selector .currentcategory , self .selector .currentitem , self .selector .show = savedata
355
- self .set (savedcat , savedtool , False )
379
+ self .set (savedcat , savedtool , False , usefavs = True )
356
380
self .tool = stool
357
381
self .selector .recreate ()
358
382
self .pattern_placer4 (xpos + i [0 ] * size , ypos + i [1 ] * size , False )
359
383
self .selector .currentcategory , self .selector .currentitem , self .selector .show = savedata
360
- self .set (savedcat , savedtool , False )
384
+ self .set (savedcat , savedtool , False , usefavs = True )
361
385
self .tool = stool
362
386
self .selector .recreate ()
363
387
364
-
365
-
366
388
def pattern_randchance (self , rect ):
367
389
existingblocks = []
368
390
for k , v in self .tileimage ["randconf" ].items ():
@@ -373,30 +395,30 @@ def pattern_randchance(self, rect):
373
395
for y in range (int (rect .h )):
374
396
for x in range (int (rect .w )):
375
397
selecteditem = existingblocks [random .choices ([i for i in range (len (existingblocks ))], [i [2 ] for i in existingblocks ])[0 ]][0 ]
376
- self .set (selecteditem ["category" ], selecteditem ["nm" ], False , False )
398
+ self .set (selecteditem ["category" ], selecteditem ["nm" ], False )
377
399
self .place (x + rect .x , y + rect .y )
378
400
379
401
def pattern_patternbox (self , rect ):
380
402
saved = self .tileimage
381
403
for y in range (int (rect .h )):
382
404
for x in range (int (rect .w )):
383
405
if x == 0 and y == 0 :
384
- self .set (self .blocks ["cat" ], self .blocks ["NW" ], False , False )
406
+ self .set (self .blocks ["cat" ], self .blocks ["NW" ], False )
385
407
elif x == rect .w - 1 and y == 0 :
386
- self .set (self .blocks ["cat" ], self .blocks ["NE" ], False , False )
408
+ self .set (self .blocks ["cat" ], self .blocks ["NE" ], False )
387
409
elif x == 0 and y == rect .h - 1 :
388
- self .set (self .blocks ["cat" ], self .blocks ["SW" ], False , False )
410
+ self .set (self .blocks ["cat" ], self .blocks ["SW" ], False )
389
411
elif x == rect .w - 1 and y == rect .h - 1 :
390
- self .set (self .blocks ["cat" ], self .blocks ["SE" ], False , False )
412
+ self .set (self .blocks ["cat" ], self .blocks ["SE" ], False )
391
413
392
414
elif x == 0 :
393
- self .set (self .blocks ["cat" ], self .blocks ["W" ], False , False )
415
+ self .set (self .blocks ["cat" ], self .blocks ["W" ], False )
394
416
elif y == 0 :
395
- self .set (self .blocks ["cat" ], self .blocks ["N" ], False , False )
417
+ self .set (self .blocks ["cat" ], self .blocks ["N" ], False )
396
418
elif x == rect .w - 1 :
397
- self .set (self .blocks ["cat" ], self .blocks ["E" ], False , False )
419
+ self .set (self .blocks ["cat" ], self .blocks ["E" ], False )
398
420
elif y == rect .h - 1 :
399
- self .set (self .blocks ["cat" ], self .blocks ["S" ], False , False )
421
+ self .set (self .blocks ["cat" ], self .blocks ["S" ], False )
400
422
else :
401
423
continue
402
424
self .place (x + rect .x , y + rect .y )
@@ -419,9 +441,19 @@ def pattern_patternbox(self, rect):
419
441
n = 0
420
442
if len (ch ["tiles" ]) > 1 :
421
443
n = x % len (ch ["tiles" ]) - 1
422
- self .set (saved ["patcat" ], saved ["prefix" ] + ch ["tiles" ][n ], render = False )
444
+ self .set (saved ["patcat" ], saved ["prefix" ] + ch ["tiles" ][n ], render = False , usefavs = True )
423
445
self .place (x + rect .x , y + rect .y )
424
446
447
+ def gettile (self , xp , yp ):
448
+ if xp < 0 or xp > self .levelwidth or yp < 0 or yp > self .levelheight :
449
+ return None
450
+ if self .data .TE_data (xp , yp , self .layer )["tp" ] == "tileBody" :
451
+ a = toarr (self .data .TE_data (xp , yp , self .layer )["data" ][0 ], "point" )
452
+ return self .gettile (a [0 ] - 1 , a [1 ] - 1 )
453
+ elif self .data .TE_data (xp , yp , self .layer )["tp" ] == "tileHead" :
454
+ return self .items [self .data .TE_data (xp , yp , self .layer )["data" ][1 ]]
455
+ return None
456
+
425
457
def togglebrush (self ):
426
458
self .squarebrush = not self .squarebrush
427
459
@@ -478,7 +510,7 @@ def pastedata(self):
478
510
else :
479
511
name = data ["data" ][1 ]
480
512
cat = self .items [name ]["category" ]
481
- self .set (cat , name , False )
513
+ self .set (cat , name , False , usefavs = True )
482
514
# w, h = self.tileimage["size"]
483
515
# px = blockx - int((w * .5) + .5) - 1
484
516
# py = blocky - int((h * .5) + .5) - 1
@@ -548,12 +580,12 @@ def showfavs(self):
548
580
self .selector .favourites ()
549
581
550
582
def selectorset (self , buttondata ):
551
- self .set (buttondata ["category" ], buttondata ["nm" ])
583
+ self .set (buttondata ["category" ], buttondata ["nm" ], usefavs = True )
552
584
553
585
def addtofavs (self ):
554
586
self .selector .addtofavs ()
555
587
556
- def set (self , cat , name , render = True , usefavs = True ):
588
+ def set (self , cat , name , render = True , usefavs = False , dorecaption = True ):
557
589
self .tool = 0
558
590
if usefavs and hasattr (self , "selector" ) and self .selector .show == "favs" :
559
591
i = self .selector ._favourites [cat , name ]
@@ -573,7 +605,7 @@ def set(self, cat, name, render=True, usefavs=True):
573
605
self .tileimage ["image" ].set_colorkey (white )
574
606
else :
575
607
self .tileimage = self .tileimage2 .copy ()
576
- if render :
608
+ if render and dorecaption :
577
609
self .recaption ()
578
610
return
579
611
@@ -765,7 +797,7 @@ def findtile(self):
765
797
return
766
798
item = self .items [name ]
767
799
self .selector .setbyname (name )
768
- self .set (item ["category" ], name )
800
+ self .set (item ["category" ], name , usefavs = True )
769
801
770
802
def copytile (self ):
771
803
posoffset = self .posoffset
@@ -780,7 +812,7 @@ def copytile(self):
780
812
name = tile ["data" ]
781
813
tile = self .items [name ]
782
814
if tile is not None :
783
- self .set (tile ["category" ], tile ["nm" ])
815
+ self .set (tile ["category" ], tile ["nm" ], usefavs = True )
784
816
return
785
817
case "tileBody" :
786
818
pos = toarr (tile ["data" ][0 ], "point" )
@@ -791,7 +823,7 @@ def copytile(self):
791
823
if tile ["tp" ] == "tileHead" :
792
824
tile = self .items [tile ["data" ][1 ]]
793
825
if tile is not None :
794
- self .set (tile ["category" ], tile ["nm" ])
826
+ self .set (tile ["category" ], tile ["nm" ], usefavs = True )
795
827
return
796
828
print ("couldn't find tile" )
797
829
0 commit comments