hashhub/main.py

1038 lines
32 KiB
Python
Raw Normal View History

import sys
2024-05-24 01:08:32 +02:00
# Justus Jan Nico Wolff last updated on 24.05.2024 at 1AM bruh
sys.dont_write_bytecode = True
2024-05-03 14:15:42 +02:00
import mtTkinter as tk
2024-05-10 21:18:14 +02:00
from tkinter import ttk as tkk
2024-05-11 23:20:47 +02:00
from tkinter import messagebox
2024-05-12 17:44:34 +02:00
from tkinter import filedialog
2024-05-13 15:00:36 +02:00
import copy
import hashengine
2024-05-21 20:24:46 +02:00
def norms():
global LH
import PCPL
import langsys
PCPL.interpreter.ENG = hashengine
LH = langsys.langhandler()
lang = open("clang", 'r')
lang = lang.read()
LH.setlang(lang)
# LH.string("")
2024-05-21 20:24:46 +02:00
def replacelh():
global LH
class rLH:
def __init__(self):
pass
def string(self, target):
return target
2024-05-21 20:24:46 +02:00
def getlangs(self):
return ()
LH = rLH()
2024-05-21 20:24:46 +02:00
if __name__ == "__main__":
norms()
else:
replacelh()
if len(sys.argv) == 2:
if sys.argv[1] == "NOLANG":
replacelh()
2024-05-12 17:44:34 +02:00
import ast
2024-05-03 14:15:42 +02:00
import subprocess
2024-05-12 17:44:34 +02:00
import time
2024-05-13 19:57:26 +02:00
import shutil
import os
import random
import string
import easygui
import base64
import simpleaudio as sa
import multiprocessing
2024-05-03 14:15:42 +02:00
global gamedata
2024-05-12 17:44:34 +02:00
global cooldown
2024-05-17 13:28:28 +02:00
global version
version = "HE2.2-Hashengine V2.2"
2024-05-12 17:44:34 +02:00
cooldown = False
gamedata = {}
2024-05-12 17:44:34 +02:00
def prepgamedata():
out = []
2024-05-13 19:57:26 +02:00
tempwin = tk.Tk()
bar = tkk.Progressbar(tempwin)
bar.place(width=200)
ptext = tk.Label(tempwin, text="NONE")
ptext.place()
count = 1
2024-05-24 11:25:10 +02:00
modellist = {}
2024-05-12 17:44:34 +02:00
for i in gamedata:
2024-05-24 11:25:10 +02:00
id = i
2024-05-12 17:44:34 +02:00
i = gamedata[i]
2024-05-13 19:57:26 +02:00
ptext.config(text=i["name"])
bar.step(count/len(gamedata))
count += 1
tempwin.update()
2024-05-12 17:44:34 +02:00
temp = {"id": i["id"], "name": i["name"]}
tempargs = {}
tosearch = {}
for arg in i["args"]:
if not arg in extypes and not arg in ignoreat and arg != "sdata":
2024-05-12 17:44:34 +02:00
tosearch[arg] = i["args"][arg]
continue
if arg in ignoreat and arg != "sdata": continue
if arg != "sdata":
tempargs[arg] = i["args"][arg]
else:
tempargs[arg] = str(base64.b64encode(i["args"][arg]), "ascii", "ignore")
2024-05-12 17:44:34 +02:00
for argname in tosearch:
arg = tosearch[argname]
temp2 = getattributes(arg)
temp2.update({"ARGID": arg._type})
tempargs[argname] = temp2
2024-05-24 11:25:10 +02:00
if objtree.parent(id) != "":
modelname = objtree.item(objtree.parent(id), "text")
if not modelname in list(modellist.keys()):
modellist[modelname] = []
modellist[modelname].append(count-2)
2024-05-12 17:44:34 +02:00
temp["args"] = tempargs
out.append(temp)
2024-05-13 19:57:26 +02:00
tempwin.destroy()
2024-05-24 11:25:10 +02:00
return [out, modellist]
2024-05-12 17:44:34 +02:00
def prepspecified(target):
out = []
tempwin = tk.Tk()
bar = tkk.Progressbar(tempwin)
bar.place(width=200)
ptext = tk.Label(tempwin, text="NONE")
ptext.place()
count = 1
2024-05-24 11:25:10 +02:00
modellist = {}
for i in target:
2024-05-24 11:25:10 +02:00
id = i
i = gamedata[i]
ptext.config(text=i["name"])
bar.step(count/len(gamedata))
count += 1
tempwin.update()
temp = {"id": i["id"], "name": i["name"]}
tempargs = {}
tosearch = {}
for arg in i["args"]:
if not arg in extypes and not arg in ignoreat and arg != "sdata":
tosearch[arg] = i["args"][arg]
continue
if arg in ignoreat and arg != "sdata": continue
if arg != "sdata":
tempargs[arg] = i["args"][arg]
else:
tempargs[arg] = str(base64.b64encode(i["args"][arg]), "ascii", "ignore")
for argname in tosearch:
arg = tosearch[argname]
temp2 = getattributes(arg)
temp2.update({"ARGID": arg._type})
tempargs[argname] = temp2
2024-05-24 11:25:10 +02:00
if objtree.parent(id) != "":
modelname = objtree.item(objtree.parent(id), "text")
if not modelname in list(modellist.keys()):
modellist[modelname] = []
modellist[modelname].append(count-2)
temp["args"] = tempargs
out.append(temp)
tempwin.destroy()
2024-05-24 11:25:10 +02:00
return [out, modellist]
class script:
def __init__(self):
self.code = ""
2024-05-17 13:28:28 +02:00
def execute(self, API, log):
2024-05-12 17:44:34 +02:00
#old code for PCPL code execution, replaced with python code execution
"""
PCPL.resetvar()
PCPL.LIS("HASHBASE")
2024-05-12 17:44:34 +02:00
PCPL.run(self.code)"""
2024-05-17 13:28:28 +02:00
try:
exec(self.code, API)
except Exception as e:
log(f"[GAME] Exception occured in script: {e}")
2024-05-11 23:20:47 +02:00
class previewrend:
2024-05-12 17:44:34 +02:00
def __init__(self, size, cam, container, offset):
2024-05-10 22:09:59 +02:00
self._size = size
self._grid = {}
self._win = container
2024-05-12 17:44:34 +02:00
self._frame = tk.Frame(container)
self._posframe = tk.Frame(self._frame)
self._cam = cam
self._xcam = tk.Label(self._posframe, text="-")
self._ycam = tk.Label(self._posframe, text="-")
self._xcam.grid(row=size[1], column=0)
self._ycam.grid(row=size[1]+1, column=0)
tkeys = list(string.ascii_letters)
self._keys = {}
for i in tkeys:
self._keys[i] = False
2024-05-21 20:24:46 +02:00
self._win.bind("<KeyPress>", self.keypupd, add="+")
self._win.bind("<KeyRelease>", self.keydupd, add="+")
2024-05-10 22:09:59 +02:00
for y in range(size[1]):
for x in range(size[0]):
2024-05-12 17:44:34 +02:00
temp = tk.Label(self._frame, text=" ", borderwidth=1, relief=tk.GROOVE, width=3)
temp.grid(row=y+offset[1], column=x+offset[0]+1)
2024-05-10 22:09:59 +02:00
self._win.update()
self._grid[f"{x}:{y}"] = temp
2024-05-12 17:44:34 +02:00
self._posframe.grid()
self._frame.grid()
2024-05-10 22:09:59 +02:00
def keypupd(self, event):
event = event.char
if event in self._keys:
self._keys[event] = True
def keydupd(self, event):
event = event.char
if event in self._keys:
self._keys[event] = False
def getkeys(self):
return self._keys
def coltohex(self, target):
colors = []
target = [target.r, target.g, target.b]
for i in target:
colors.append(("0"*(2-len(hex(int(i))[2:])))+hex(i)[2:])
out = ""
for i in colors:
out = out + i
return "#"+out
def update(self):
self._win.update()
def pix(self, x, y, text, bcolor, fcolor):
self._xcam.config(text=LH.string("xcam")+str(self._cam.position.x))
self._ycam.config(text=LH.string("ycam")+str(self._cam.position.y))
if f"{x}:{y}" in self._grid:
self._grid[f"{x}:{y}"].config(text=text, bg=self.coltohex(bcolor), fg=self.coltohex(fcolor))
class render:
def __init__(self, size, cam, container, offset):
self._size = size
self._grid = {}
self._win = container
self._frame = tk.Frame(container)
self._posframe = tk.Frame(self._frame)
self._cam = cam
self._xcam = tk.Label(self._posframe, text="-")
self._ycam = tk.Label(self._posframe, text="-")
#self._xcam.grid(row=size[1], column=0)
#self._ycam.grid(row=size[1]+1, column=0)
tkeys = list(string.ascii_letters)
self._keys = {}
for i in tkeys:
self._keys[i] = False
self._win.bind("<KeyPress>", self.keypupd)
self._win.bind("<KeyRelease>", self.keydupd)
for y in range(size[1]):
for x in range(size[0]):
temp = tk.Label(self._frame, text=" ", width=3)
temp.grid(row=y+offset[1], column=x+offset[0]+1)
self._win.update()
self._grid[f"{x}:{y}"] = temp
self._posframe.grid()
self._frame.grid()
def keypupd(self, event):
event = event.char
if event in self._keys:
self._keys[event] = True
def keydupd(self, event):
event = event.char
if event in self._keys:
self._keys[event] = False
def getkeys(self):
return self._keys
2024-05-10 22:09:59 +02:00
def coltohex(self, target):
colors = []
target = [target.r, target.g, target.b]
for i in target:
2024-05-13 19:57:26 +02:00
colors.append(("0"*(2-len(hex(int(i))[2:])))+hex(i)[2:])
2024-05-10 22:09:59 +02:00
out = ""
for i in colors:
out = out + i
return "#"+out
2024-05-13 15:00:36 +02:00
def update(self):
self._win.update()
2024-05-10 22:09:59 +02:00
def pix(self, x, y, text, bcolor, fcolor):
2024-05-12 17:44:34 +02:00
self._xcam.config(text=LH.string("xcam")+str(self._cam.position.x))
self._ycam.config(text=LH.string("ycam")+str(self._cam.position.y))
2024-05-10 22:09:59 +02:00
if f"{x}:{y}" in self._grid:
self._grid[f"{x}:{y}"].config(text=text, bg=self.coltohex(bcolor), fg=self.coltohex(fcolor))
class nullrend:
def __init__(self, size, cam):
pass
def getkeys(self):
pass
def update(self):
pass
def pix(self, x, y, text, bcolor, fcolor):
pass
2024-05-03 14:15:42 +02:00
def selectlang(new):
lang = open("clang", 'w')
lang.write(new)
lang.close()
container.quit()
subprocess.Popen([sys.executable, __file__])
def add(objtype, parent="", render=True):
global objtree
obj = getattr(types, objtype)()
2024-05-11 23:20:47 +02:00
args = {}
for i in dir(obj):
if i.startswith("_"): continue
args[i] = getattr(obj, i)
temp = {"id": objtype, "args": args, "name": LH.string(objtype)}
2024-05-21 20:24:46 +02:00
id = genid()
if GUIe == True: objtree.insert(parent, tk.END, text=LH.string(objtype), image=icons[objtype], iid=id, tags=("objsel"))
gamedata[id] = temp
2024-05-11 23:20:47 +02:00
if objtype in crucial:
preview.addobj(obj)
gamedata[id]["args"]["ID"] = obj.ID
if GUIe == True and render == True: preview.render()
2024-05-12 17:44:34 +02:00
return id
def renameobj():
2024-05-21 20:24:46 +02:00
target = objtree.focus()
if target == "": return
new = easygui.enterbox(LH.string("NN"), LH.string("rename"))
if new:
objtree.item(target, text=new)
if not "HASHMODEL" in objtree.item(target, "tags"):
gamedata[target]["name"] = new
2024-05-21 20:24:46 +02:00
def delobjg(target):
objtree.delete(target)
2024-05-12 17:44:34 +02:00
temp = gamedata.pop(target)
if temp["id"] in crucial:
preview.removeobjbyid(temp["args"]["ID"])
#preview.render()
2024-05-21 20:24:46 +02:00
def delobj():
target = objtree.selection()
if target == (): return
atritree.delete(*atritree.get_children())
for i in target:
if "HASHMODEL" in objtree.item(i, "tags"):
tempwin = tk.Tk()
stat = tk.Label(tempwin, text="NONE")
stat.grid()
speed = tk.Label(tempwin, text="NONE")
speed.grid()
tempwin.update()
count = 0
length = len(objtree.get_children(i))
fpscount = 0
timestamp = time.time()
fps = 0
2024-05-21 20:24:46 +02:00
for f in objtree.get_children(i):
delobjg(f)
stat.config(text=f"{count}/{length}")
speed.config(text=f"{fps}/s")
tempwin.update()
count += 1
fpscount += 1
if time.time()-timestamp > 0.1:
fps = fpscount*10
fpscount = 0
timestamp = time.time()
2024-05-21 20:24:46 +02:00
objtree.delete(i)
tempwin.destroy()
2024-05-21 20:24:46 +02:00
else:
delobjg(i)
preview.render()
def HMPC(event):
currentat = objtree.focus()
target = atritree.focus()
name = atritree.item(target, "text")
back = 0
if name == "x":
back = aposx(0)
elif name == "y":
back = aposy(0)
for i in objtree.get_children(currentat):
if not "ID" in gamedata[i]["args"]: continue
setattr(gamedata[i]["args"]["position"], name, getattr(gamedata[i]["args"]["position"], name)+back)
setattr(preview.getobjbyid(gamedata[i]["args"]["ID"]).position, name, getattr(preview.getobjbyid(gamedata[i]["args"]["ID"]).position, name)+back)
preview.render()
def changemodelpos(event):
atritree.delete(*atritree.get_children())
atritree.insert("", index=tk.END, text="x", tags=("OA",))
atritree.insert("", index=tk.END, text="y", tags=("OA",))
2024-05-21 20:24:46 +02:00
def rpopup(event):
try:
rmenu.tk_popup(event.x_root, event.y_root)
finally:
rmenu.grab_release()
2024-05-11 23:20:47 +02:00
def getattributes(target):
out = {}
for i in dir(target):
if i.startswith("_"): continue
out[i] = getattr(target, i)
return out
def updatribute(event):
global currentat
target = objtree.focus()
currentat = target
atritree.delete(*atritree.get_children())
for i in gamedata[target]["args"]:
if i in ignoreat: continue
2024-05-17 13:28:28 +02:00
if i in valtypes and not i in DCTE:
2024-05-11 23:20:47 +02:00
val = gamedata[target]["args"][i]
atritree.insert("", tk.END, text=i, values=(val), tags=("FA", ))
2024-05-17 13:28:28 +02:00
elif i in valtypes and i in DCTE:
atritree.insert("", tk.END, text=i, values=("<DCTE>"), tags=("FA", ))
2024-05-11 23:20:47 +02:00
else:
root = atritree.insert("", tk.END, text=i, tags=("FA", ))
2024-05-11 23:20:47 +02:00
temp = getattributes(gamedata[target]["args"][i])
for f in temp:
atritree.insert(root, tk.END, text=f, values=(temp[f]), tags=("FA", ))
2024-05-11 23:20:47 +02:00
def halatribute(event):
target = atritree.focus()
name = atritree.item(target, "text")
parent = atritree.parent(target)
if name in valtypes:
if parent == "":
new = valtypes[name](gamedata[currentat]["args"][name])
gamedata[currentat]["args"][name] = new
if "ID" in gamedata[currentat]["args"]:
temp = preview.getobjbyid(gamedata[currentat]["args"]["ID"])
setattr(temp, name, new)
2024-05-17 13:28:28 +02:00
if not name in DCTE: atritree.item(target, values=(new))
if name in DCTE: atritree.item(target, values=("<DCTE>"))
2024-05-11 23:20:47 +02:00
else:
parent = atritree.item(parent, "text")
new = valtypes[name](getattr(gamedata[currentat]["args"][parent], name))
setattr(gamedata[currentat]["args"][parent], name, new)
if "ID" in gamedata[currentat]["args"]:
temp = preview.getobjbyid(gamedata[currentat]["args"]["ID"])
setattr(temp, name, new)
2024-05-17 13:28:28 +02:00
if not name in DCTE: atritree.item(target, values=(new))
if name in DCTE: atritree.item(target, values=("<DCTE>"))
2024-05-11 23:20:47 +02:00
preview.render()
2024-05-12 17:44:34 +02:00
def updatepreviewcam(char):
global cooldown
if cooldown == True: return
cooldown = True
char = char.char
if char == "w": preview.camera.position += hashengine.vector2(y=1)
if char == "a": preview.camera.position += hashengine.vector2(x=1)
if char == "s": preview.camera.position -= hashengine.vector2(y=1)
if char == "d": preview.camera.position -= hashengine.vector2(x=1)
preview.render()
2024-05-17 13:28:28 +02:00
time.sleep(.0)
2024-05-12 17:44:34 +02:00
cooldown = False
def save():
target = filedialog.asksaveasfile()
target.write(str(prepgamedata()))
target.close()
messagebox.showinfo(LH.string("suc"), LH.string("save-suc"))
def clear():
global gamedata
objtree.delete(*objtree.get_children())
atritree.delete(*atritree.get_children())
gamedata = {}
preview._objects = {}
preview.camera.position = hashengine.vector2()
preview.render()
def importsound(target):
oid = add("rawsound")
gamedata[oid]["name"] = target["name"]
gamedata[oid]["args"]["sdata"] = base64.b64decode(target["args"]["sdata"])
gamedata[oid]["args"]["spath"] = target["args"]["spath"]
if GUIe == True: objtree.item(oid, text=target["name"])
2024-05-12 17:44:34 +02:00
def importobj(target):
if target["id"] == "sound" or target["id"] == "rawsound":
importsound(target)
return
2024-05-12 17:44:34 +02:00
oid = add(target["id"])
id = gamedata[oid]
id["name"] = target["name"]
if GUIe == True: objtree.item(oid, text=target["name"])
2024-05-12 17:44:34 +02:00
#create arguments
outargs = {}
for argname in target["args"]:
arg = target["args"][argname]
if isinstance(arg, dict):
ID = arg.pop("ARGID")
obj = attypes[ID]()
for i in arg:
setattr(obj, i, arg[i])
arg = obj
outargs[argname] = arg
#apply arguments to obj
if target["id"] in crucial:
for i in outargs:
setattr(preview.getobjbyid(gamedata[oid]["args"]["ID"]), i, outargs[i])
id["args"].update(outargs)
2024-05-24 11:25:10 +02:00
return oid
2024-05-12 17:44:34 +02:00
2024-05-24 11:25:10 +02:00
def load(cleargame=True, GUI=True, path=""):
if GUI == True:
file = filedialog.askopenfile()
else:
file = open(path, 'r')
2024-05-13 19:57:26 +02:00
tempwin = tk.Tk()
ptext = tk.Label(tempwin, text="NONE")
ptext.place(y=30)
stat = tk.Label(tempwin, text="NONE")
stat.place(y=50)
2024-05-12 17:44:34 +02:00
target = file.read()
file.close()
target = ast.literal_eval(target)
if cleargame:
clear()
2024-05-24 11:25:10 +02:00
if len(target) == 0: return
if not isinstance(target[0], list):
#old save file
count = 1
bar = tkk.Progressbar(tempwin, maximum=len(target))
bar.place(width=200)
for i in target:
ptext.config(text="Current: "+i["name"])
bar.step()
stat.config(text=f"Object {count}/{len(target)}")
tempwin.update()
importobj(i)
count += 1
tempwin.destroy()
preview.render()
else:
#new save file
count = 1
bar = tkk.Progressbar(tempwin, maximum=len(target))
bar.place(width=200)
ids = {}
for i in target[0]:
ptext.config(text="Current: "+i["name"])
bar.step()
stat.config(text=f"Object {count}/{len(target)}")
tempwin.update()
id = importobj(i)
if id:
ids[count-1] = id
count += 1
if GUIe == True:
for i in target[1]:
tempid = genid()
objtree.insert("", tk.END, text=i, image=icons["model"], iid=tempid, tags=("HASHMODEL",))
for f in target[1][i]:
objtree.detach(ids[f])
objtree.move(ids[f], tempid, "end")
tempwin.destroy()
preview.render()
2024-05-12 17:44:34 +02:00
def export():
temp = objtree.selection()
if temp == (): return
target = []
for i in temp:
if "HASHMODEL" in objtree.item(i, "tags"):
target.extend(objtree.get_children(i))
else: target.append(i)
back = prepspecified(target)
targetpath = filedialog.asksaveasfile()
if not targetpath: return
targetpath.write(str(back))
targetpath.close()
messagebox.showinfo(LH.string("suc"), LH.string("save-suc"))
2024-05-13 15:00:36 +02:00
def log(text, end="\n", flush=False):
global logfile
2024-05-24 11:25:10 +02:00
global clog
if clog:
if not os.path.exists("logs"):
os.mkdir("logs")
file = open("logs/"+logfile+".txt", 'a')
file.write(str(text)+end)
file.close()
2024-05-13 15:00:36 +02:00
2024-05-13 19:57:26 +02:00
def NULL():
pass
class gsound:
def __init__(self, data, game):
self._playing = False
self._data = data
game.currentsounds.append(self)
def play(self):
if self._playing == True: return
self._sound = sa.play_buffer(self._data, 2, 2, 44100)
self._playing = True
def stop(self):
if self._playing == False: return
self._sound.stop()
self._playing = False
def wait(self):
if self._playing == False: return
self._sound.wait_done()
2024-05-13 15:00:36 +02:00
def testing():
global testproc
2024-05-21 20:24:46 +02:00
global running
2024-05-24 11:25:10 +02:00
global clog
2024-05-21 20:24:46 +02:00
try:
if running == True: return
except:
pass
running = True
2024-05-24 11:25:10 +02:00
testproc = multiprocessing.Process(target=execgame, args=(prepgamedata(), clog.get()))
testproc.start()
def run():
2024-05-13 15:00:36 +02:00
print("preparing log file...")
global logfile
global maingame
2024-05-13 19:57:26 +02:00
global window
2024-05-13 15:00:36 +02:00
temp = time.gmtime(time.time())
logfile = ""
for i in temp:
logfile = logfile + "S" + str(i)
print("done")
log("Log file start!")
2024-05-17 13:28:28 +02:00
log(f"date: year: {temp[0]} month: {temp[1]} day: {temp[2]} hour: {temp[3]} min.: {temp[4]}, sec.: {temp[5]}")
log(f"Version: {version}")
2024-05-13 15:00:36 +02:00
log("Preparing API...")
API = {"print": log, "HASHBASE": hashengine}
log("Done!")
window = tk.Tk()
2024-05-13 19:57:26 +02:00
window.protocol("WM_DELETE_WINDOW", NULL)
maingame = hashengine.game(renderer=lambda size, cam: render(size, cam, window, [0, 0]), sounddir="/")
2024-05-13 15:00:36 +02:00
API["HASHGAME"] = maingame
API["SOUND"] = lambda data: gsound(data, maingame)
2024-05-13 15:00:36 +02:00
log("main game initalised!")
log("copying sounds...")
for i in gamedata:
i = gamedata[i]
if i["id"] != "sound" and i["id"] != "rawsound": continue
maingame.sounds[i["args"]["spath"]] = i["args"]["sdata"]
print(i["args"]["spath"])
2024-05-13 15:00:36 +02:00
objects = copy.deepcopy(preview._objects)
maingame._objects = objects
scripts = []
for i in gamedata:
i = gamedata[i]
if i["id"] != "script": continue
i = i["args"]["code"]
obj = script()
obj.code = i
scripts.append(obj)
log("objects transferred!")
gamescript = """
global HASHGAME
import time
while True:
for i in HASHGAME._objects:
i = HASHGAME._objects[i]
HASHGAME.calcphysobj(i)
HASHGAME.render()
"""
gameloopsc = script()
gameloopsc.code = gamescript
2024-05-17 13:28:28 +02:00
maingame.startscript(lambda: gameloopsc.execute(API, log))
2024-05-13 15:00:36 +02:00
log("game test started!!!")
log("---------------------")
for i in scripts:
2024-05-17 13:28:28 +02:00
maingame.startscript(lambda: i.execute(API, log))
window.mainloop()
2024-05-13 15:00:36 +02:00
2024-05-13 19:57:26 +02:00
def muladd(target):
for i in range(10):
add(target)
def stoptest():
global testproc
2024-05-21 20:24:46 +02:00
global running
try:
if running == False: return
except:
return
testproc.terminate()
2024-05-21 20:24:46 +02:00
running = False
2024-05-13 19:57:26 +02:00
def build():
print("asking user for output directory...")
target = filedialog.askdirectory()
os.mkdir(target+"/out")
target = target+"/out"
2024-05-13 19:57:26 +02:00
print("building started")
print("generating HEGF file...")
hegf = str(prepgamedata())
file = open(target+"/game.HEGF", 'w')
file.write(hegf)
file.close()
print("done.")
print("copying files...")
tocopy = ["mtTkinter.py", "hashengine.py"]
2024-05-13 19:57:26 +02:00
for i in tocopy:
print(f"copying {i}...")
shutil.copyfile(i, target+"/"+i)
shutil.copyfile(__file__, target+"/"+"player.py")
file = open(target+"/main.py", 'w')
file.write("""
import player
import ast
file = open("game.HEGF", 'r')
file = file.read()
file = ast.literal_eval(file)
player.execgame(file)
""")
2024-05-13 19:57:26 +02:00
print("done.")
print("building finished!")
2024-05-17 13:28:28 +02:00
def importPS():
target = filedialog.askopenfile()
if target:
temp = add("script")
gamedata[temp]["args"]["code"] = str(target.read())
target.close()
2024-05-21 20:24:46 +02:00
def genid():
id = ""
chars = list(string.ascii_letters)
for i in range(255):
id = id + random.choice(chars)
return id
2024-05-17 13:28:28 +02:00
def COBS(target: str, offset=hashengine.vector2(), ignore=[" ",]):
origin = target
2024-05-17 13:28:28 +02:00
target = target.split("\n")
2024-05-21 20:24:46 +02:00
tempid = genid()
tempwin = tk.Tk()
stat = tk.Label(tempwin, text="NONE")
stat.grid()
speed = tk.Label(tempwin, text="NONE")
speed.grid()
tempwin.update()
if GUIe == True: objtree.insert("", tk.END, text=LH.string("IOM"), image=icons["model"], iid=tempid, tags=("HASHMODEL",))
count = 1
fpscount = 0
timestamp = time.time()
fps = 0
2024-05-17 13:28:28 +02:00
for i in range(len(target)):
y = i
i = target[i]
for f in range(len(i)):
x = f
f = i[x]
stat.config(text=f"{count}/{len(origin)}")
speed.config(text=f"{fps}/s")
tempwin.update()
count += 1
fpscount += 1
if time.time()-timestamp > 0.1:
fps = fpscount*10
fpscount = 0
timestamp = time.time()
2024-05-17 13:28:28 +02:00
if f in ignore:
continue
temp = add("obj", tempid, False)
2024-05-17 13:28:28 +02:00
#gamedata[temp]["args"]["ID"]
gamedata[temp]["args"]["char"] = f
setattr(preview.getobjbyid(gamedata[temp]["args"]["ID"]), "char", f)
gamedata[temp]["args"]["position"] = hashengine.vector2(x, y)+offset
setattr(preview.getobjbyid(gamedata[temp]["args"]["ID"]), "position", hashengine.vector2(x, y)+offset)
gamedata[temp]["args"]["anchored"] = True
setattr(preview.getobjbyid(gamedata[temp]["args"]["ID"]), "anchored", True)
gamedata[temp]["args"]["collide"] = True
setattr(preview.getobjbyid(gamedata[temp]["args"]["ID"]), "collide", True)
#preview.render()
preview.render()
tempwin.destroy()
2024-05-17 13:28:28 +02:00
2024-05-03 14:15:42 +02:00
def GUIinit():
global container
global objtree
global rmenu
2024-05-11 23:20:47 +02:00
global atritree
global currentat
global preview
global GUIe
2024-05-24 11:25:10 +02:00
global clog
GUIe = True
2024-05-03 14:15:42 +02:00
container = tk.Tk()
2024-05-21 20:24:46 +02:00
container.bind("<KeyPress>", updatepreviewcam, add="+")
2024-05-10 21:18:14 +02:00
global icons
icons = {}
for i in os.listdir("icons"):
icons[i.split(".")[0]] = tk.PhotoImage(file=f"icons/{i}")
2024-05-11 23:20:47 +02:00
#preview init
preview = hashengine.game(renderer=lambda size, cam: previewrend(size, cam, container=container, offset=[0, 0]), sounddir="/")
2024-05-11 23:20:47 +02:00
2024-05-10 21:18:14 +02:00
#tree init
2024-05-21 20:24:46 +02:00
objtree = tkk.Treeview(container, columns=("-"))
2024-05-11 23:20:47 +02:00
objtree.heading("#0", text=LH.string("objs"))
objtree.tag_bind("objsel", "<<TreeviewSelect>>", updatribute)
objtree.tag_bind("HASHMODEL", "<<TreeviewSelect>>", changemodelpos)
2024-05-12 17:44:34 +02:00
objtree.grid(row=1, column=0)
2024-05-11 23:20:47 +02:00
#attribute tree init
currentat = "temp"
atritree = tkk.Treeview(container, columns=("#1"), selectmode="browse")
atritree.heading("#0", text=LH.string("attribute"))
atritree.heading("#1", text=LH.string("attribute-val"))
atritree.tag_bind("FA", "<Double-1>", halatribute)
atritree.tag_bind("OA", "<Double-1>", HMPC)
2024-05-12 17:44:34 +02:00
atritree.grid(row=2, column=0)
2024-05-10 21:18:14 +02:00
#right click menu
rmenu = tk.Menu(container, tearoff=0)
rmenu.add_command(label=LH.string("rename"), command=renameobj)
rmenu.add_command(label=LH.string("delete"), command=delobj)
objtree.bind("<Button-3>", rpopup)
2024-05-10 21:18:14 +02:00
#menu init
2024-05-03 14:15:42 +02:00
menu = tk.Menu(container)
container.config(menu=menu)
filemenu = tk.Menu(menu)
menu.add_cascade(label=LH.string("file"), menu=filemenu)
2024-05-12 17:44:34 +02:00
filemenu.add_command(label=LH.string("new"), command=clear)
filemenu.add_command(label=LH.string("open"), command=load)
filemenu.add_command(label=LH.string("save"), command=save)
2024-05-03 14:15:42 +02:00
filemenu.add_separator()
2024-05-24 11:25:10 +02:00
#create logs var
clog = tk.BooleanVar()
filemenu.add_checkbutton(label=LH.string("clog"), onvalue=1, offvalue=0, variable=clog)
filemenu.add_separator()
filemenu.add_command(label=LH.string("export"), command=export)
filemenu.add_command(label=LH.string("import"), command=lambda: load(False))
filemenu.add_separator()
2024-05-03 14:15:42 +02:00
filemenu.add_command(label=LH.string("exit"), command=container.quit)
addmenu = tk.Menu(menu)
menu.add_cascade(label=LH.string("add"), menu=addmenu)
addmenu.add_command(label=LH.string("obj"), command=lambda: add("obj"))
addmenu.add_command(label=LH.string("script"), command=lambda: add("script"))
addmenu.add_command(label=LH.string("sound"), command=lambda: add("sound"))
2024-05-17 13:28:28 +02:00
addmenu.add_separator()
addmenu.add_command(label=LH.string("IPS"), command=importPS)
addmenu.add_command(label=LH.string("COBS"), command=lambda: COBS(acode(" ")))
2024-05-13 19:57:26 +02:00
#addmenu.add_command(label=LH.string("obj"), command=lambda: muladd("obj"))
2024-05-13 15:00:36 +02:00
testmenu = tk.Menu(menu)
menu.add_cascade(label=LH.string("testing"), menu=testmenu)
2024-05-13 19:57:26 +02:00
testmenu.add_command(label=LH.string("test"), command=testing, image=icons["test"], compound="left")
testmenu.add_command(label=LH.string("stest"), command=stoptest, image=icons["stop-test"], compound="left")
buildmenu = tk.Menu(menu)
menu.add_cascade(label=LH.string("building"), menu=buildmenu)
buildmenu.add_command(label=LH.string("build"), command=build, image=icons["build"], compound="left")
2024-05-13 15:00:36 +02:00
2024-05-03 14:15:42 +02:00
langmenu = tk.Menu(menu)
menu.add_cascade(label=LH.string("langs"), menu=langmenu)
for i in LH.getlangs():
langmenu.add_command(label=i, command=lambda i=i: selectlang(i))
container.mainloop()
2024-05-13 15:00:36 +02:00
# attribute changers
2024-05-11 23:20:47 +02:00
def ats(mode, old):
#mode 0 = string
#mode 1 = single character
out = easygui.enterbox(LH.string("newval"), LH.string("newval"))
if out:
if mode == 1 and len(out) != 1:
messagebox.showerror(LH.string("error"), LH.string("SCE"))
return "N"
return out
else:
2024-05-13 19:57:26 +02:00
return old
2024-05-11 23:20:47 +02:00
def anum(old):
2024-05-13 19:57:26 +02:00
out = easygui.enterbox(LH.string("newval"), LH.string("newval"))
2024-05-11 23:20:47 +02:00
if out:
2024-05-13 19:57:26 +02:00
if "." in out:
try:
out = float(out)
return out
except ValueError:
return old
else:
return int(out)
2024-05-11 23:20:47 +02:00
else:
2024-05-13 19:57:26 +02:00
return old
2024-05-11 23:20:47 +02:00
def abool(old):
out = easygui.boolbox(LH.string("newval"), LH.string("newval"), (LH.string("true"), LH.string("false")))
2024-05-17 13:28:28 +02:00
return out
2024-05-11 23:20:47 +02:00
def acode(old):
out = easygui.textbox(LH.string("newval"), LH.string("newval"), old)
if out:
return out
else:
2024-05-13 19:57:26 +02:00
return old
2024-05-11 23:20:47 +02:00
def apath(old, ext):
new = filedialog.askopenfilename(defaultextension=ext, filetypes=(ext))
if new:
return new
else:
return old
def aNULL(old):
return old
2024-05-21 23:40:04 +02:00
def aposdone():
global wait
wait = False
def aposx(old):
global wait
wait = True
temp = tk.Toplevel()
butframe = tk.Frame(temp)
currentvar = tk.IntVar(temp, value=old)
current = tk.Entry(temp, textvariable=currentvar)
current.grid(row=0)
b1 = tk.Button(butframe, image=icons["ar-left"], command=lambda: currentvar.set(currentvar.get()-1))
b2 = tk.Button(butframe, image=icons["ar-right"], command=lambda: currentvar.set(currentvar.get()+1))
b1.grid(row=0, column=0)
b2.grid(row=0, column=1)
butframe.grid(row=1)
b3 = tk.Button(temp, text=LH.string("done"), command=aposdone)
b3.grid(row=3)
while wait == True:
temp.update()
tempvar = currentvar.get()
temp.destroy()
numbers = list(string.digits)
numbers.append("-")
for i in str(tempvar):
if not i in numbers:
return old
return tempvar
def aposy(old):
global wait
wait = True
temp = tk.Toplevel()
butframe = tk.Frame(temp)
currentvar = tk.IntVar(temp, value=old)
current = tk.Entry(temp, textvariable=currentvar)
current.grid(row=0)
b1 = tk.Button(butframe, image=icons["ar-up"], command=lambda: currentvar.set(currentvar.get()-1))
b2 = tk.Button(butframe, image=icons["ar-down"], command=lambda: currentvar.set(currentvar.get()+1))
b1.grid(row=0, column=0)
b2.grid(row=1, column=0)
butframe.grid(row=1)
b3 = tk.Button(temp, text=LH.string("done"), command=aposdone)
b3.grid(row=3)
while wait == True:
temp.update()
tempvar = currentvar.get()
temp.destroy()
numbers = list(string.digits)
numbers.append("-")
for i in str(tempvar):
if not i in numbers:
return old
return tempvar
2024-05-24 11:25:10 +02:00
def execgame(gametree, shouldlog=True):
global GUIe
global preview
2024-05-24 11:25:10 +02:00
global clog
preview = hashengine.game(renderer=nullrend, sounddir="/")
GUIe = False
2024-05-24 11:25:10 +02:00
for i in gametree[0]:
importobj(i)
2024-05-24 11:25:10 +02:00
clog = shouldlog
run()
class rsound:
def __init__(self):
self.spath = ""
self.sdata = b""
class sound():
def __init__(self, new):
self.spath = os.path.basename(new).split(".")[0]
self.sdata = hashengine.loadsound(new)
global types
2024-05-11 23:20:47 +02:00
global ignoreat
global valtypes
2024-05-12 17:44:34 +02:00
global extypes
global attypes
global crucial
2024-05-17 13:28:28 +02:00
global DCTE
2024-05-12 17:44:34 +02:00
crucial = ["obj"]
types = hashengine.enum({"obj": hashengine.obj, "script": script, "rawsound": rsound, "sound": lambda: sound(apath("", [("Wave files", ".wave .wav")]))})
ignoreat = ["ID", "execute", "sdata"]
2024-05-17 13:28:28 +02:00
DCTE = ["code"]
2024-05-11 23:20:47 +02:00
"""self.position = vector2()
self.char = " "
self.ID = 0
self.gravity = 0
self.acceleration = vector2()
self.velocity = vector2()
self.friction = 0
self.collide = True
self.touch = True
self.anchored = False
self.bcolor = color3(255, 255, 255)
self.fcolor = color3()"""
valtypes = {
"char": lambda old: ats(1, old),
"gravity": anum,
2024-05-21 23:40:04 +02:00
"x": aposx, #anum
"y": aposy, #anum
2024-05-11 23:20:47 +02:00
"z": anum,
"r": anum,
"g": anum,
"b": anum,
"friction": anum,
"collide": abool,
"touch": abool,
"anchored": abool,
"code": acode,
"spath": aNULL,
2024-05-11 23:20:47 +02:00
}
#lambda old: apath(old, [("Wave files", ".wave .wav")])
2024-05-12 17:44:34 +02:00
extypes = list(valtypes.keys())
attypes = {
"vector2": hashengine.vector2,
"color3": hashengine.color3,
}
if __name__ == "__main__":
GUIinit()