dashcode 1.2.5__tar.gz → 1.2.7__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dashcode
3
- Version: 1.2.5
3
+ Version: 1.2.7
4
4
  Summary: A library for Geometry Dash level generation using .gmd files
5
5
  Author: IWiterI
6
6
  Project-URL: Homepage, https://github.com/ISviterI/dashcode
@@ -0,0 +1,206 @@
1
+ import base64
2
+ import gzip
3
+ from operator import index
4
+
5
+ obj_string = ""
6
+ lvlname = ""
7
+
8
+ print("Dashcode loaded! Have fun and also join our discord server please: https://discord.gg/MXv3KTFmPE")
9
+
10
+ class Dashcode:
11
+ def __init__(self):
12
+ self.objects = []
13
+ self.params = {
14
+ "NoTouch": 13,
15
+ "Hide": 12,
16
+ "Group": 57,
17
+ "TGroup": 51,
18
+ "MoveX":28,
19
+ "MoveY":29,
20
+ "LockToPX":34,
21
+ "LockToPY": 35,
22
+ "UseTarget":36,
23
+ "TMoveGroup":39,
24
+ "Duration": 10,
25
+ "Alpha": 11,
26
+ "TouchTrigger": 11,
27
+ "ActivateGroup": 56,
28
+ "ScaleX": 128,
29
+ "ScaleY": 129,
30
+ "Zoom": 107,
31
+ "RotateDegrees": 68,
32
+ "Times360": 69,
33
+ "LockRot": 70,
34
+ "Red":7,
35
+ "Green":8,
36
+ "Blue":9,
37
+ "Fade":10,
38
+ "TargetColor":23,
39
+ "Delay": 63,
40
+ "SpawnTrigger":62,
41
+ "MultiTrigger":87,
42
+ "X":2,
43
+ "Y":3,
44
+ }
45
+ self.objectids = {
46
+ "block": 1, "spike": 8, "yorb": 36, "coin": 1329,
47
+ "monster": 918, "bush": 128, "cloud": 129,
48
+ "alpha": 1007, "toggle": 1049, "rotate": 1346,
49
+ "zoom": 1913, "reverse": 1912, "move":901,
50
+ "checkpoint": 2063,
51
+ "spawn":1268,
52
+ "end": 3600,
53
+ "p_blue": 10, "p_yellow": 11, "p_green": 2926,
54
+ "p_cube": 12, "p_ship": 13, "p_ball": 47, "p_ufo": 111,
55
+ "p_wave": 660, "p_robot": 745, "p_spider": 1331, "p_swing": 1933
56
+ }
57
+ self.prefabs = {
58
+ "wall": {"Y":0},
59
+ "platform": {"X":0},
60
+ "square": {"SQ":0},
61
+ "corridor": {"X":1},
62
+ }
63
+ self.timeline = {}
64
+ def setobjects(self, objs:dict):
65
+ self.objectids = objs
66
+ def export_gmd(self, filedata, filename:str="Level"):
67
+ with open(f"{filename}.gmd", "w", encoding="utf-8") as f:
68
+ f.write(filedata)
69
+ def setparams(self, params:dict):
70
+ self.params = params
71
+
72
+ def format_groups(self, group_list):
73
+ if not group_list:
74
+ return ""
75
+ return ".".join(map(str, group_list))
76
+ def get_free_group(self):
77
+ used_groups = set()
78
+ for obj in self.objects:
79
+ if "57" in obj:
80
+ parsed = Dashcode().parse_object_string(obj)
81
+ for i2,v2 in parsed.items():
82
+ #print(i,v,type(i))
83
+ if i2 == "57":
84
+ for v in v2.split("."):
85
+ used_groups.add(int(v))
86
+ current_id = 1
87
+ while current_id in used_groups:
88
+ current_id += 1
89
+ return str(current_id)
90
+
91
+ def addobject(self, obj, params: dict):
92
+ if len(self.objects) <= 0:
93
+ self.objects.append(f"1,1,2,{-10 * 30},3,{-10 * 30},12,1,13,1")
94
+ extraparams = ""
95
+ for param, value in params.items():
96
+ if param in ["X", "Y", "EX", "EY"]:
97
+ continue
98
+ target_id = None
99
+ for i, v in self.params.items():
100
+ if str(param).startswith(str(i)):
101
+ target_id = v
102
+ break
103
+ if target_id is not None:
104
+ if target_id == 57 and isinstance(value, list):
105
+ extraparams += f",57,{self.format_groups(value)}"
106
+ else:
107
+ extraparams += f",{target_id},{value}"
108
+ else:
109
+ extraparams += f",{param},{value}"
110
+ oid = self.objectids.get(obj, obj)
111
+ pos_x = params.get('X', 0) * 30 + 15
112
+ pos_y = params.get('Y', 0) * 30 + 15
113
+ full_obj_string = f"1,{oid},2,{pos_x},3,{pos_y}{extraparams}"
114
+ self.objects.append(full_obj_string)
115
+ return full_obj_string
116
+ def parse_object_string(self,objstr):
117
+ data = objstr.split(',')
118
+ obj_dict = {}
119
+ for i in range(0, len(data) - 1, 2):
120
+ key = data[i]
121
+ value = data[i + 1]
122
+ obj_dict[key] = value
123
+ return obj_dict
124
+ def editobject(self, obj:str, params:dict):
125
+ parsed = self.parse_object_string(obj)
126
+ #print(parsed)
127
+ newparams = {}
128
+ for i,v in parsed.items():
129
+ if not newparams.get(i):
130
+ newparams[i] = v
131
+ for i,v in params.items():
132
+ #print(i,v)
133
+ if self.params.get(i) and not i in ["X","Y"]:
134
+ if not parsed.get(self.params.get(i)) and self.params.get(i):
135
+ newparams[str(self.params.get(i))] = str(v)
136
+ elif i in ["X","Y"]:
137
+ print(i,v)
138
+ newparams[str(self.params.get(i))] = str(v*30)
139
+ else:
140
+ newparams[str(i)] = str(v)
141
+ new_obj = ""
142
+ for i,v in newparams.items():
143
+ new_obj += f"{i},{v},"
144
+ print(newparams)
145
+ print(new_obj)
146
+ def addprefab(self, obj: str, params: dict, prefab: str):
147
+ fab = self.prefabs.get(prefab)
148
+ if not fab:
149
+ return
150
+ ex = params.get('EX', 0)
151
+ ey = params.get('EY', 0)
152
+ base_x = params.get('X', 0)
153
+ base_y = params.get('Y', 0)
154
+ placed = []
155
+ def place(x_val, y_val):
156
+ current_params = dict(params)
157
+ current_params["X"] = x_val
158
+ current_params["Y"] = y_val
159
+ preobj_str = self.addobject(obj, current_params)
160
+ placed.append(preobj_str)
161
+ if fab.get("X") == 0:
162
+ for i in range(ex):
163
+ place(base_x + i, base_y)
164
+ elif fab.get("Y") == 0:
165
+ for i in range(ey):
166
+ place(base_x, base_y + i)
167
+ elif fab.get("SQ") == 0:
168
+ for i in range(ex):
169
+ for v in range(ey):
170
+ place(base_x + i, base_y + v)
171
+ elif fab.get("X") == 1:
172
+ for i in range(ex):
173
+ place(base_x + i, base_y)
174
+ place(base_x + i, base_y + ey)
175
+ elif fab.get("Y") == 1:
176
+ for i in range(ey):
177
+ place(base_x, base_y + i)
178
+ place(base_x + ex, base_y + i)
179
+ return placed
180
+ def build_timeline(self, timeline:list):
181
+ cdelay = 0
182
+ for tlobj in timeline:
183
+ i = tlobj.get("Index")
184
+ v = tlobj.get("Value")
185
+ if i == "wait":
186
+ cdelay += v
187
+ elif i == "spawn":
188
+ self.addobject("spawn", {"X":-1, "Y":6, "Delay":str(cdelay),"TGroup":str(v)})
189
+ else:
190
+ params = {"X":-1,"Y":5}
191
+ for i2,v2 in v.items():
192
+ params[i2] = v2
193
+ self.addobject(i,params)
194
+ def create_gmd_file(self, level_name, objects_string):
195
+ global lvlname
196
+ lvlname = level_name
197
+ final_string_to_pack = objects_string
198
+ gzipped = gzip.compress(final_string_to_pack.encode('utf-8'))
199
+ b64_objects = base64.b64encode(gzipped).decode('utf-8').replace('/', '_').replace('+', '-')
200
+ return f'''<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>kCEK</k><i>4</i><k>k2</k><s>{level_name}</s><k>k4</k><s>{b64_objects}</s><k>k5</k><s>Doesn't matter</s><k>k11</k><i>1091</i><k>k16</k><i>1</i><k>k80</k><i>56</i></dict></plist>'''
201
+
202
+ def decode_objects(self):
203
+ objects = self.objects
204
+ global obj_string
205
+ obj_string = ";".join(objects) + ";"
206
+ return obj_string
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dashcode
3
- Version: 1.2.5
3
+ Version: 1.2.7
4
4
  Summary: A library for Geometry Dash level generation using .gmd files
5
5
  Author: IWiterI
6
6
  Project-URL: Homepage, https://github.com/ISviterI/dashcode
@@ -8,7 +8,7 @@ if os.path.exists("README.md"):
8
8
 
9
9
  setup(
10
10
  name="dashcode",
11
- version="1.2.5",
11
+ version="1.2.7",
12
12
  packages=find_packages(),
13
13
  author="IWiterI",
14
14
  description="A library for Geometry Dash level generation using .gmd files",
@@ -1,182 +0,0 @@
1
- import base64
2
- import gzip
3
- obj_string = ""
4
- lvlname = ""
5
-
6
- print("Dashcode loaded! Have fun and also join our discord server please: https://discord.gg/MXv3KTFmPE")
7
-
8
- class Dashcode:
9
- def __init__(self):
10
- self.objects = []
11
- self.params = {
12
- "NoTouch": 13,
13
- "Hide": 12,
14
- "Group": 57,
15
- "TGroup": 51,
16
- "Duration": 10,
17
- "Alpha": 11,
18
- "TouchTrigger": 11,
19
- "ActivateGroup": 56,
20
- "ScaleX": 128,
21
- "ScaleY": 129,
22
- "Zoom": 107,
23
- "RotateDegrees": 68,
24
- "Times360": 69,
25
- "LockRot": 70,
26
- "Red":7,
27
- "Green":8,
28
- "Blue":9,
29
- "Fade":10,
30
- "TargetColor":23,
31
- "Delay": 63,
32
- "SpawnTrigger":62,
33
- "MultiTrigger":87
34
- }
35
- self.objectids = {
36
- "block": 1, "spike": 8, "yorb": 36, "coin": 1329,
37
- "monster": 918, "bush": 128, "cloud": 129,
38
- "alpha": 1007, "toggle": 1049, "rotate": 1346,
39
- "zoom": 1913, "reverse": 1912,
40
- "checkpoint": 2063,
41
- "spawn":1268,
42
- "end": 3600,
43
- "p_blue": 10, "p_yellow": 11, "p_green": 2926,
44
- "p_cube": 12, "p_ship": 13, "p_ball": 47, "p_ufo": 111,
45
- "p_wave": 660, "p_robot": 745, "p_spider": 1331, "p_swing": 1933
46
- }
47
- self.prefabs = {
48
- "wall": {"Y":0},
49
- "platform": {"X":0},
50
- "square": {"SQ":0},
51
- "corridor": {"X":1},
52
- }
53
- self.timeline = {}
54
- def setobjects(self, objs:dict):
55
- self.objectids = objs
56
- def export_gmd(self, filedata, filename:str="Level"):
57
- with open(f"{filename}.gmd", "w", encoding="utf-8") as f:
58
- f.write(filedata)
59
- def setparams(self, params:dict):
60
- self.params = params
61
-
62
- def get_free_group(self):
63
- used_groups = set()
64
- for obj in self.objects:
65
- if "57" in obj:
66
- parsed = Dashcode().parse_object_string(obj)
67
- for i,v in parsed.items():
68
- #print(i,v,type(i))
69
- if i == "57":
70
- used_groups.add(int(v))
71
- current_id = 1
72
- while current_id in used_groups:
73
- current_id += 1
74
- return str(current_id)
75
- def addobject(self, obj: str, params: dict):
76
- objects = self.objects
77
- if len(objects) <= 0:
78
- objects.append(
79
- f"1,1,2,{str(-10 * 30)},3,{str(-10 * 30)},12,1,13,1")
80
- extraparams = ""
81
- for param, value in params.items():
82
- for i in self.params:
83
- if param.startswith(i):
84
- pid = self.params[param]
85
- extraparams += f",{str(pid)},{value}"
86
- else:
87
- extraparams += f",{str(param)},{value}"
88
-
89
- oid = self.objectids.get(obj, 1)
90
- if oid:
91
- objects.append(
92
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15)},3,{str(params.get('Y') * 30 + 15)}{extraparams}")
93
- else:
94
- objects.append(
95
- f"1,{str(obj)},2,{str(params.get('X') * 30 + 15)},3,{str(params.get('Y') * 30 + 15)}{extraparams}")
96
- def parse_object_string(self,objstr):
97
- data = objstr.split(',')
98
-
99
- obj_dict = {}
100
- for i in range(0, len(data) - 1, 2):
101
- key = data[i]
102
- value = data[i + 1]
103
- obj_dict[key] = value
104
-
105
- return obj_dict
106
- def addprefab(self, obj:str, params:dict, prefab:str):
107
- objects = self.objects
108
- extraparams = ""
109
- for param, value in params.items():
110
- if self.params.get(param) is not None:
111
- pid = self.params[param]
112
- extraparams += f",{str(pid)},{value}"
113
- else:
114
- extraparams += f",{str(param)},{value}"
115
-
116
- oid = self.objectids.get(obj, 1)
117
- if prefab:
118
- #print("1")
119
- fab = self.prefabs.get(prefab)
120
- if fab:
121
- #print(fab)
122
- #print("2")
123
- newobjs = []
124
- if fab.get("X") == 0:
125
- #print("3")
126
- for i in range(params.get('EX')):
127
- newobjs.append(
128
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15 + (i * 30))},3,{str(params.get('Y') * 30 + 15)}{extraparams}")
129
- if fab.get("Y") == 0:
130
- #print("3")
131
- for i in range(params.get('EY')):
132
- newobjs.append(
133
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15)},3,{str(params.get('Y') * 30 + 15 + (i * 30))}{extraparams}")
134
- if fab.get("SQ") == 0:
135
- for i in range(params.get('EX')):
136
- newobjs.append(
137
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15 + (i * 30))},3,{str(params.get('Y') * 30 + 15)}{extraparams}")
138
- for v in range(params.get('EY') - 1):
139
- newobjs.append(
140
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15 + (i * 30))},3,{str(params.get('Y') * 30 + 15 + (v * 30) + 30)}{extraparams}")
141
- if fab.get("X") == 1:
142
- for i in range(params.get('EX')):
143
- newobjs.append(
144
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15 + (i * 30))},3,{str(params.get('Y') * 30 + 15)}{extraparams}")
145
- for i in range(params.get('EX')):
146
- newobjs.append(
147
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15 + (i * 30))},3,{str(params.get('Y') * 30 + 15 + params.get("EY") * 30)}{extraparams}")
148
- if fab.get("Y") == 1:
149
- for i in range(params.get('EY')):
150
- newobjs.append(
151
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15)},3,{str(params.get('Y') * 30 + 15 + (i * 30))}{extraparams}")
152
- for i in range(params.get('EY')):
153
- newobjs.append(
154
- f"1,{str(oid)},2,{str(params.get('X') * 30 + 15 + params.get("EX") * 30)},3,{str(params.get('Y') * 30 + 15 + (i * 30))}{extraparams}")
155
- objects += newobjs
156
- def build_timeline(self, timeline:list):
157
- cdelay = 0
158
- for tlobj in timeline:
159
- i = tlobj.get("Index")
160
- v = tlobj.get("Value")
161
- if i == "wait":
162
- cdelay += v
163
- elif i == "spawn":
164
- self.addobject("spawn", {"X":-1, "Y":6, "Delay":str(cdelay),"TGroup":str(v)})
165
- else:
166
- params = {"X":-1,"Y":5}
167
- for i2,v2 in v.items():
168
- params[i2] = v2
169
- self.addobject(i,params)
170
- def create_gmd_file(self, level_name, objects_string):
171
- global lvlname
172
- lvlname = level_name
173
- final_string_to_pack = objects_string
174
- gzipped = gzip.compress(final_string_to_pack.encode('utf-8'))
175
- b64_objects = base64.b64encode(gzipped).decode('utf-8').replace('/', '_').replace('+', '-')
176
- return f'''<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>kCEK</k><i>4</i><k>k2</k><s>{level_name}</s><k>k4</k><s>{b64_objects}</s><k>k5</k><s>Doesn't matter</s><k>k11</k><i>1091</i><k>k16</k><i>1</i><k>k80</k><i>56</i></dict></plist>'''
177
-
178
- def decode_objects(self):
179
- objects = self.objects
180
- global obj_string
181
- obj_string = ";".join(objects) + ";"
182
- return obj_string
File without changes
File without changes
File without changes