pyscreeps-arena 0.5.8.5__tar.gz → 0.5.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/PKG-INFO +1 -1
  2. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/compiler.py +110 -17
  3. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/const.py +1 -1
  4. pyscreeps_arena-0.5.9.0/pyscreeps_arena/project.7z +0 -0
  5. pyscreeps_arena-0.5.9.0/pyscreeps_arena/ui/project_ui.py +948 -0
  6. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena.egg-info/PKG-INFO +1 -1
  7. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/setup.py +1 -1
  8. pyscreeps_arena-0.5.8.5/pyscreeps_arena/project.7z +0 -0
  9. pyscreeps_arena-0.5.8.5/pyscreeps_arena/ui/project_ui.py +0 -328
  10. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/__init__.py +0 -0
  11. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/afters/__init__.py +0 -0
  12. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/afters/after_config.py +0 -0
  13. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/afters/after_custom.py +0 -0
  14. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/afters/after_empty.py +0 -0
  15. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/afters/after_prefab.py +0 -0
  16. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/build.py +0 -0
  17. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/__init__.py +0 -0
  18. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/basic.py +0 -0
  19. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/config.py +0 -0
  20. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/core.py +0 -0
  21. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/main.py +0 -0
  22. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/core/utils.py +0 -0
  23. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/localization.py +0 -0
  24. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/P2PY.py +0 -0
  25. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/__init__.py +0 -0
  26. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/creeplogic_edit.py +0 -0
  27. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/map_render.py +0 -0
  28. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/mapviewer.py +0 -0
  29. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qcreeplogic/__init__.py +0 -0
  30. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qcreeplogic/model.py +0 -0
  31. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qcreeplogic/qcreeplogic.py +0 -0
  32. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/__init__.py +0 -0
  33. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/qmapmarker.py +0 -0
  34. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/qvariable.py +0 -0
  35. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/test_compact_variable.py +0 -0
  36. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/test_qmapmarker.py +0 -0
  37. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/test_qvariable.py +0 -0
  38. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapker/to_code.py +0 -0
  39. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/__init__.py +0 -0
  40. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/qcinfo.py +0 -0
  41. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/qco.py +0 -0
  42. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/qmapv.py +0 -0
  43. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/test_array_drag.py +0 -0
  44. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/test_drag.py +0 -0
  45. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/test_qcinfo.py +0 -0
  46. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/test_qco_drag.py +0 -0
  47. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/test_qmapv.py +0 -0
  48. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qmapv/test_simple_array.py +0 -0
  49. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qrecipe/__init__.py +0 -0
  50. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qrecipe/model.py +0 -0
  51. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/qrecipe/qrecipe.py +0 -0
  52. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena/ui/rs_icon.py +0 -0
  53. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena.egg-info/SOURCES.txt +0 -0
  54. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena.egg-info/dependency_links.txt +0 -0
  55. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena.egg-info/entry_points.txt +0 -0
  56. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena.egg-info/requires.txt +0 -0
  57. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/pyscreeps_arena.egg-info/top_level.txt +0 -0
  58. {pyscreeps_arena-0.5.8.5 → pyscreeps_arena-0.5.9.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscreeps-arena
3
- Version: 0.5.8.5
3
+ Version: 0.5.9.0
4
4
  Summary: Python api|interface to play game: Screeps: Arena.
5
5
  Author-email: 2229066748@qq.com
6
6
  Maintainer: Eagle'sBaby
@@ -8,6 +8,7 @@ import shutil
8
8
  import chardet
9
9
  import subprocess
10
10
  import pyperclip
11
+ import datetime
11
12
  from colorama import Fore
12
13
  from typing import List, Optional, Tuple, Union
13
14
 
@@ -52,6 +53,7 @@ def replace_src_prefix(file_list):
52
53
  # """
53
54
  # return PYFILE_PRAGMA_INSERTS + "\n" + content
54
55
  class Compiler_Const:
56
+ CALLED_FUNCTIONS = ['behavior', 'sequence', 'selector', 'parallel', 'listen']
55
57
  PROTO_DEFINES_DIRS = ["builtin", "library"]
56
58
  FILE_STRONG_REPLACE = {
57
59
  "std": {
@@ -108,14 +110,14 @@ export var loop = function () {
108
110
  if (know.now === 1) {
109
111
  std.show_welcome();
110
112
  init (know);
111
-
113
+
112
114
  }
113
115
  step (know);
114
116
  timeLine = get.cpu_us();
115
117
  if (get._SCH_FLAG) sch.handle();
116
118
  stepCost = get.cpu_us() - timeLine;
117
119
  std.show_usage ();
118
- print("knowCost:", knowCost, "monitorCost:", monitorCost, "stepCost:", stepCost);
120
+ print("knowCost:", knowCost, "monitorCost:", monitorCost, "stepCost:", stepCost);
119
121
  if (know.draw) know.draw();
120
122
  };
121
123
  """
@@ -648,6 +650,82 @@ class Compiler_Utils(Compiler_Const):
648
650
 
649
651
  return result
650
652
 
653
+ @staticmethod
654
+ def stage_called_replace(caller_name: str, content: str) -> str:
655
+ """
656
+ 移除 '@<caller_name>(...)' 装饰器行,并在文末添加对应的 _<caller_name>Login 调用。
657
+
658
+ 对于类方法: _<caller_name>Login("ClassName", "method_name", a, b, ...)
659
+ 对于普通函数: _<caller_name>Login("", "function_name", a, b, ...)
660
+ """
661
+ calls_to_add = []
662
+ deletions = []
663
+
664
+ # 1. 收集所有类定义的位置和缩进
665
+ class_pattern = re.compile(r'^(\s*)class\s+(\w+)', re.MULTILINE)
666
+ classes = [(m.start(), len(m.group(1)), m.group(2))
667
+ for m in class_pattern.finditer(content)]
668
+
669
+ # 2. 查找所有 @<caller_name>(...) 装饰器(支持多行参数)
670
+ decorator_pattern = re.compile(
671
+ r'^\s*@\s*' + re.escape(caller_name) + r'\s*\((.*?)\)\s*$\n?',
672
+ re.MULTILINE | re.DOTALL
673
+ )
674
+
675
+ for dec_match in decorator_pattern.finditer(content):
676
+ dec_start = dec_match.start()
677
+ dec_end = dec_match.end()
678
+ # 提取装饰器的参数
679
+ params_str = dec_match.group(1).strip()
680
+
681
+ # 查找接下来的函数定义(跳过可能的空行)
682
+ after_decorator = content[dec_end:]
683
+ func_match = re.search(r'^(\s*)def\s+([^\s\(]+)', after_decorator, re.MULTILINE)
684
+
685
+ if not func_match:
686
+ continue
687
+
688
+ func_indent_len = len(func_match.group(1))
689
+ func_name = func_match.group(2)
690
+
691
+ # 3. 确定类名:查找装饰器前最近的、缩进小于函数缩进的类
692
+ class_name = ""
693
+ for cls_pos, cls_indent_len, cls_name in reversed(classes):
694
+ if cls_pos < dec_match.start() and func_indent_len > cls_indent_len:
695
+ class_name = cls_name
696
+ break
697
+
698
+ # 4. 处理参数,保持参数的格式
699
+ # 移除参数中的换行和多余空格,保持参数列表的格式
700
+ params = []
701
+ if params_str:
702
+ # 简单处理参数,保持引号内的内容不变
703
+ # 这里可以根据需要进行更复杂的参数解析
704
+ params = [p.strip() for p in params_str.split(',') if p.strip()]
705
+
706
+ # 构建参数部分的字符串
707
+ params_part = ""
708
+ if params:
709
+ params_part = ", " + ", ".join(params)
710
+
711
+ # 5. 记录删除位置和调用信息
712
+ deletions.append((dec_start, dec_end))
713
+ calls_to_add.append(f'_{caller_name}Login("{class_name}", "{func_name}"{params_part})')
714
+
715
+ # 6. 应用删除(倒序避免位置偏移)
716
+ if not deletions:
717
+ return content
718
+
719
+ result = content
720
+ for start, end in sorted(deletions, key=lambda x: x[0], reverse=True):
721
+ result = result[:start] + result[end:]
722
+
723
+ # 7. 在文末添加调用
724
+ if calls_to_add:
725
+ result = '\n'.join(calls_to_add) + '\n' + result
726
+
727
+ return result
728
+
651
729
  @staticmethod
652
730
  def process_mate_code(code):
653
731
  # 用于存储匹配到的信息
@@ -921,6 +999,8 @@ class Compiler(CompilerBase):
921
999
 
922
1000
  # 将PYFILE_PRAGMA_INSERTS.replace("\t", "").replace(" ", "")插入到文件开头
923
1001
  content = self.auto_read(fpath)
1002
+ # 移除"""$..."""代码块
1003
+ content = re.sub(r'"""\$[\s\S]*?"""', '', content)
924
1004
  content = self.PYFILE_PRAGMA_INSERTS.replace("\t", "").replace(" ", "") + content
925
1005
  # content = self.remove_long_docstring(content) # 移除长注释 | remove long docstring
926
1006
 
@@ -1077,10 +1157,13 @@ class Compiler(CompilerBase):
1077
1157
  with open(fpath, 'w', encoding='utf-8') as f:
1078
1158
  f.write(new_content)
1079
1159
 
1080
- # ------------------------------------ 自定义:调用stage_recursive_replace ------------------------------------ #
1160
+ # ------------------------------------ 自定义:调用stage_recursive_replace和stage_called_replace ------------------------------------ #
1081
1161
  for fpath in py_fpath:
1082
1162
  content = self.auto_read(fpath)
1083
1163
  content = self.stage_recursive_replace(content) # 调用stage_recursive_replace
1164
+ # 调用stage_called_replace处理四个装饰器
1165
+ for caller in self.CALLED_FUNCTIONS:
1166
+ content = self.stage_called_replace(caller, content)
1084
1167
  with open(fpath, 'w', encoding='utf-8') as f:
1085
1168
  f.write(content)
1086
1169
 
@@ -1217,12 +1300,22 @@ class Compiler(CompilerBase):
1217
1300
  :param min_js_files: list[str] # .min.js文件路径列表
1218
1301
  :return: str
1219
1302
  """
1220
- arena_name = const.ARENA_NAMES.get(config.arena, const.ARENA_NAMES['green']) # like green -> spawn_and_swamp
1303
+ arena_name = const.ARENA_NAMES.get(config.arena, const.ARENA_NAMES["green"]) # like green -> spawn_and_swamp
1221
1304
  self.TOTAL_INSERT_AT_HEAD += self.ARENA_IMPORTS_GETTER[arena_name]() # add arena imports
1222
- total_js = f"const __VERSION__ = '{const.VERSION}';\nconst __PYTHON_VERSION__ = '{python_version_info}';" + self.TOTAL_INSERT_AT_HEAD + f"\nexport var LANGUAGE = '{config.language}';\n"
1223
- total_js += f"const __AUTHOR__ = '{const.AUTHOR}';\nconst __AUTHOR_CN__ = '{const.BILIBILI_NAME}';"
1305
+ current_time = datetime.datetime.now()
1306
+ timestamp_ms = int(current_time.timestamp() * 1000)
1307
+ timestring = current_time.strftime("%Y-%m-%d %H:%M")
1308
+
1309
+ total_js = f"""const __VERSION__ = '{const.VERSION}';
1310
+ const __PYTHON_VERSION__ = '{python_version_info}';""" + self.TOTAL_INSERT_AT_HEAD + f"""
1311
+ export var LANGUAGE = '{config.language}';
1312
+ """
1313
+
1314
+ total_js += f"export var TIMESTAMP = {timestamp_ms};\n"
1315
+ total_js += f"export var TIMESTRING = '{timestring}';\n"
1316
+ total_js += f"""const __AUTHOR__ = '{const.AUTHOR}';
1317
+ const __AUTHOR_CN__ = '{const.BILIBILI_NAME}';"""
1224
1318
 
1225
- # 添加.min.js文件的import语句
1226
1319
  if min_js_files:
1227
1320
  for min_js_path in min_js_files:
1228
1321
  min_js_filename = os.path.basename(min_js_path)
@@ -1342,14 +1435,6 @@ class Compiler(CompilerBase):
1342
1435
  dir_path = os.path.dirname(mjs_path)
1343
1436
  build_dir_path = os.path.dirname(build_main_mjs)
1344
1437
 
1345
- # 复制.min.js文件到目标目录
1346
- for min_js_path in min_js_files:
1347
- min_js_filename = os.path.basename(min_js_path)
1348
- # 复制到build目录
1349
- shutil.copy(min_js_path, os.path.join(build_dir_path, min_js_filename))
1350
- # 复制到最终导出目录
1351
- shutil.copy(min_js_path, os.path.join(dir_path, min_js_filename))
1352
-
1353
1438
  # 生成total_js,传入.min.js文件列表
1354
1439
  total_js = imports + "\n" + self.generate_total_js(
1355
1440
  replace_src_prefix(modules), imps, sorts, self.FILE_STRONG_REPLACE, reps, min_js_files
@@ -1365,6 +1450,14 @@ class Compiler(CompilerBase):
1365
1450
  with open(mjs_path, 'w', encoding='utf-8') as f:
1366
1451
  f.write(total_js)
1367
1452
 
1453
+ # 复制.min.js文件到目标目录
1454
+ for min_js_path in min_js_files:
1455
+ min_js_filename = os.path.basename(min_js_path)
1456
+ # 复制到build目录
1457
+ shutil.copy(min_js_path, os.path.join(build_dir_path, min_js_filename))
1458
+ # 复制到最终导出目录
1459
+ shutil.copy(min_js_path, os.path.join(dir_path, min_js_filename))
1460
+
1368
1461
  core.lprint(GREEN.format('[6/6]'), LOC_DONE, " ", LOC_EXPORTING_TOTAL_MAIN_JS_FINISH, sep="", head="\r", ln=config.language)
1369
1462
 
1370
1463
  if mjs_path != build_main_mjs:
@@ -1422,7 +1515,7 @@ if __name__ == '__main__':
1422
1515
  # compiler.compile()
1423
1516
  # compiler.clean()
1424
1517
  test = """
1425
-
1518
+
1426
1519
  def patrolling(self, c: Creep):
1427
1520
  e = self.center.nearest(k.civilian.enemies, 5)
1428
1521
  if e:
@@ -1432,6 +1525,6 @@ def patrolling(self, c: Creep):
1432
1525
  ):
1433
1526
  case True: c.move(e, SWAMP_MOTION)
1434
1527
  case False: c.move(self.bpos, SWAMP_MOTION)
1435
-
1528
+
1436
1529
  """
1437
1530
  print(f"res=\n{Compiler.convert_match_to_if(test)}")
@@ -9,7 +9,7 @@
9
9
  #
10
10
  import re
11
11
 
12
- VERSION = "0.5.8.5"
12
+ VERSION = "0.5.9.0"
13
13
  AUTHOR = "●ω<🤍♪"
14
14
  STEAM_ID = "1029562896"
15
15
  GITHUB_NAME = "EagleBaby"