|
|
|
|
|
|
|
|
|
import pygame
|
|
|
|
|
import validators
|
|
|
|
|
import commands
|
|
|
|
|
from UI.constants import Width,Height,ICON_TYPES,RUNSYS
|
|
|
|
|
from UI.simple_name_space import SimpleNamespace
|
|
|
|
|
from UI.page import Page
|
|
|
|
|
from UI.label import Label
|
|
|
|
|
from UI.icon_item import IconItem
|
|
|
|
|
from UI.keys_def import CurKeys, IsKeyMenuOrB, IsKeyStartOrA
|
|
|
|
|
from UI.skin_manager import MySkinManager
|
|
|
|
|
from UI.lang_manager import MyLangManager
|
|
|
|
|
|
|
|
|
|
from libs.DBUS import is_wifi_connected_now,get_wifi_ip
|
|
|
|
|
from collections import deque
|
|
|
|
|
from enum import Enum
|
|
|
|
|
import os
|
|
|
|
|
import subprocess
|
|
|
|
|
import pipes
|
|
|
|
|
|
|
|
|
|
class DevilutionPage(Page):
|
|
|
|
|
_FootMsg = ["Nav","Check","Upgrade","Back","Play"]
|
|
|
|
|
|
|
|
|
|
_GameName = "devilutionX"
|
|
|
|
|
_GamePath = "/home/cpi/games/devilutionX"
|
|
|
|
|
_GameExecutable = _GamePath + "/build/devilutionx"
|
|
|
|
|
_GameExecutableRevision = _GameExecutable + ".rev"
|
|
|
|
|
_GameBuildScript = _GamePath + "/Packaging/cpi-gamesh/build.sh -t " + pipes.quote(os.path.dirname(os.path.abspath( __file__ )))
|
|
|
|
|
_GamePNG = _GamePath + "/Packaging/cpi-gamesh/Devilution.png"
|
|
|
|
|
_DevilutionDiabdatmpq = "/home/cpi/.local/share/diasurgical/devilution/diabdat.mpq"
|
|
|
|
|
_DevilutionDiabdatmpqPresent = False
|
|
|
|
|
_GameInstalled = False
|
|
|
|
|
|
|
|
|
|
_CiteNewUpdate = "Ahh... fresh meat!"
|
|
|
|
|
_CiteCheckUpdate = "Lets search the books..."
|
|
|
|
|
_CiteWelcome = "Well, what can I do for ya?"
|
|
|
|
|
_CiteCompiling = "Stay awhile and listen."
|
|
|
|
|
_CiteDone = "You must venture through the portal..."
|
|
|
|
|
_CiteFailed = "Game Over. Better luck next time!"
|
|
|
|
|
|
|
|
|
|
_GitURL = "https://github.com/diasurgical/devilutionX.git"
|
|
|
|
|
_GitBranch = "master"
|
|
|
|
|
_GitRevision = ""
|
|
|
|
|
|
|
|
|
|
_GameIcon = None
|
|
|
|
|
|
|
|
|
|
_Process = None
|
|
|
|
|
_Labels = {}
|
|
|
|
|
_Coords = {}
|
|
|
|
|
|
|
|
|
|
_ListFontObj = MyLangManager.TrFont("varela13")
|
|
|
|
|
_URLColor = MySkinManager.GiveColor('URL')
|
|
|
|
|
_TextColor = MySkinManager.GiveColor('Text')
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
Page.__init__(self)
|
|
|
|
|
|
|
|
|
|
def InitLabels(self):
|
|
|
|
|
|
|
|
|
|
y = 15
|
|
|
|
|
x = 11
|
|
|
|
|
yInc = 19
|
|
|
|
|
xGitRefLabelWidth = 48
|
|
|
|
|
|
|
|
|
|
labels = \
|
|
|
|
|
[["greeting",self._CiteWelcome, self._TextColor, x, y],
|
|
|
|
|
["status", "", self._URLColor, x, y + 72-yInc],
|
|
|
|
|
["comment", "", self._TextColor, x, y + 72],
|
|
|
|
|
["console_out","",self._URLColor, x, y + 72 + yInc],
|
|
|
|
|
["label_rev","GIT Revisions: ", self._TextColor, x, 132],
|
|
|
|
|
["label_git_rev","Source: ", self._TextColor, x, 151],
|
|
|
|
|
["content_git_rev","", self._URLColor, x + xGitRefLabelWidth, 151],
|
|
|
|
|
["label_bin_rev","Bin: ", self._TextColor, x, 170],
|
|
|
|
|
["content_bin_rev","", self._URLColor, x + xGitRefLabelWidth, 170]
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
for i in labels:
|
|
|
|
|
l = Label()
|
|
|
|
|
l.SetCanvasHWND(self._CanvasHWND)
|
|
|
|
|
l.Init(i[1],self._ListFontObj)
|
|
|
|
|
l.SetColor(i[2])
|
|
|
|
|
self._Labels[ i[0] ] = l
|
|
|
|
|
|
|
|
|
|
c = SimpleNamespace()
|
|
|
|
|
c.x = i[3]
|
|
|
|
|
c.y = i[4]
|
|
|
|
|
self._Coords[ i[0] ] = c
|
|
|
|
|
|
|
|
|
|
def GitGetRevision(self):
|
|
|
|
|
if not os.path.exists(self._GamePath):
|
|
|
|
|
return "game not installed"
|
|
|
|
|
process = subprocess.Popen("cd " + pipes.quote(self._GamePath) + "; git rev-parse HEAD",stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=True)
|
|
|
|
|
self._GitRevision = process.communicate()[0].strip()
|
|
|
|
|
process.wait()
|
|
|
|
|
return self._GitRevision
|
|
|
|
|
|
|
|
|
|
def ExectuableGetRevision(self):
|
|
|
|
|
try:
|
|
|
|
|
with open(self._GameExecutableRevision, 'r') as file:
|
|
|
|
|
executableRevsion = file.read().replace('\n', '')
|
|
|
|
|
return executableRevsion
|
|
|
|
|
except:
|
|
|
|
|
return "unknown"
|
|
|
|
|
|
|
|
|
|
def InitGameDirectory(self):
|
|
|
|
|
try:
|
|
|
|
|
os.makedirs(self._GamePath)
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
self.StartShellProcess("cd " + pipes.quote(self._GamePath) + "; git clone --single-branch --branch " + pipes.quote(self._GitBranch) + " " + pipes.quote(self._GitURL) + " .")
|
|
|
|
|
|
|
|
|
|
def CheckDevilutionMPQ(self):
|
|
|
|
|
self._DevilutionDiabdatmpqPresent = os.path.isfile(self._DevilutionDiabdatmpq)
|
|
|
|
|
|
|
|
|
|
def CheckGameInstalled(self):
|
|
|
|
|
self._GameInstalled = os.path.isfile(self._GameExecutable)
|
|
|
|
|
|
|
|
|
|
def UpdateFootMsg(self):
|
|
|
|
|
if not self._GameInstalled:
|
|
|
|
|
self._FootMsg = ["Nav","","Install","Back",""]
|
|
|
|
|
self.UpdateLabel("status", "GIT Upgrade")
|
|
|
|
|
self.UpdateLabel("comment", "Press X to install")
|
|
|
|
|
elif not self._DevilutionDiabdatmpqPresent:
|
|
|
|
|
self._FootMsg = ["Nav","","Upgrade","Back","Re-check"]
|
|
|
|
|
self.UpdateLabel("status", "Gamefile diabdat.mpq missing")
|
|
|
|
|
self.UpdateLabel("comment", "see readme")
|
|
|
|
|
else:
|
|
|
|
|
self._FootMsg = ["Nav","","Upgrade","Back","Play"]
|
|
|
|
|
self.UpdateLabel("status", "Ready")
|
|
|
|
|
self.UpdateLabel("comment", self._CiteDone)
|
|
|
|
|
|
|
|
|
|
def Init(self):
|
|
|
|
|
Page.Init(self)
|
|
|
|
|
|
|
|
|
|
if self._Screen != None:
|
|
|
|
|
if self._Screen._CanvasHWND != None and self._CanvasHWND == None:
|
|
|
|
|
self._HWND = self._Screen._CanvasHWND
|
|
|
|
|
self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._Screen._Height) )
|
|
|
|
|
|
|
|
|
|
if os.path.isfile(self._GamePNG):
|
|
|
|
|
self._GameIcon = IconItem()
|
|
|
|
|
self._GameIcon._ImageName = self._GamePNG
|
|
|
|
|
self._GameIcon._MyType = ICON_TYPES["STAT"]
|
|
|
|
|
self._GameIcon._Parent = self
|
|
|
|
|
self._GameIcon.Adjust(290,70,128,128,0)
|
|
|
|
|
|
|
|
|
|
self.InitLabels()
|
|
|
|
|
self.CheckDevilutionMPQ()
|
|
|
|
|
self.CheckGameInstalled()
|
|
|
|
|
self.UpdateFootMsg()
|
|
|
|
|
|
|
|
|
|
self.UpdateLabel("content_git_rev", self.GitGetRevision(), 24)
|
|
|
|
|
self.UpdateLabel("content_bin_rev", self.ExectuableGetRevision(), 24)
|
|
|
|
|
|
|
|
|
|
def UpdateLabel(self, label, msg, maxLen=38):
|
|
|
|
|
print(label + ": " + msg)
|
|
|
|
|
if len(msg) > maxLen:
|
|
|
|
|
m = msg[:maxLen] + "..."
|
|
|
|
|
else:
|
|
|
|
|
m = msg
|
|
|
|
|
self._Labels[label].SetText(m)
|
|
|
|
|
|
|
|
|
|
def StartShellProcess(self, cmd):
|
|
|
|
|
print("StartShellProcess " + cmd)
|
|
|
|
|
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=True)
|
|
|
|
|
while(True):
|
|
|
|
|
line = proc.stdout.readline()
|
|
|
|
|
if line:
|
|
|
|
|
self.UpdateLabel("console_out", line.strip(), 48)
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
if line == '' and proc.poll() is not None:
|
|
|
|
|
break
|
|
|
|
|
self.UpdateLabel("console_out", "")
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
|
|
|
|
|
def GitUpgrade(self):
|
|
|
|
|
self.UpdateLabel("status", "GIT Upgrade")
|
|
|
|
|
self.UpdateLabel("comment", self._CiteCheckUpdate)
|
|
|
|
|
|
|
|
|
|
curRev = "unset"
|
|
|
|
|
if not os.path.exists(self._GamePath):
|
|
|
|
|
self.InitGameDirectory()
|
|
|
|
|
else:
|
|
|
|
|
curRev = self.GitGetRevision()
|
|
|
|
|
self.StartShellProcess("cd " + pipes.quote(self._GamePath) + "; git pull")
|
|
|
|
|
|
|
|
|
|
self._GitRevision = self.GitGetRevision()
|
|
|
|
|
self.UpdateLabel("content_git_rev", self._GitRevision, 24)
|
|
|
|
|
|
|
|
|
|
if curRev != self._GitRevision:
|
|
|
|
|
self.UpdateLabel("comment", self._CiteNewUpdate)
|
|
|
|
|
else:
|
|
|
|
|
self.UpdateLabel("comment", self._CiteDone)
|
|
|
|
|
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
|
|
|
|
|
def GitExectuableIsGitRevision(self):
|
|
|
|
|
return self.GitGetRevision() == self.ExectuableGetRevision()
|
|
|
|
|
|
|
|
|
|
def Build(self):
|
|
|
|
|
self.UpdateLabel("status", "Building")
|
|
|
|
|
self.StartShellProcess(self._GameBuildScript)
|
|
|
|
|
|
|
|
|
|
def UpgradeAndBuild(self):
|
|
|
|
|
self.GitUpgrade()
|
|
|
|
|
self.UpdateLabel("comment", self._CiteCompiling)
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
if not self.GitExectuableIsGitRevision():
|
|
|
|
|
self.Build()
|
|
|
|
|
|
|
|
|
|
self.UpdateLabel("content_git_rev", self.GitGetRevision(), 24)
|
|
|
|
|
self.UpdateLabel("content_bin_rev", self.ExectuableGetRevision(), 24)
|
|
|
|
|
|
|
|
|
|
self.UpdateLabel("status", "Done")
|
|
|
|
|
if self.GitExectuableIsGitRevision():
|
|
|
|
|
self.UpdateLabel("comment", self._CiteDone)
|
|
|
|
|
else:
|
|
|
|
|
self.UpdateLabel("comment", self._CiteFailed)
|
|
|
|
|
|
|
|
|
|
self.CheckDevilutionMPQ()
|
|
|
|
|
self.CheckGameInstalled()
|
|
|
|
|
self.UpdateFootMsg()
|
|
|
|
|
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
|
|
|
|
|
def KeyDown(self,event):
|
|
|
|
|
|
|
|
|
|
if IsKeyMenuOrB(event.key):
|
|
|
|
|
self.ReturnToUpLevelPage()
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
|
|
|
|
|
if self._DevilutionDiabdatmpqPresent and self._GameInstalled:
|
|
|
|
|
if IsKeyStartOrA(event.key):
|
|
|
|
|
pygame.event.post( pygame.event.Event(RUNSYS, message=self._GameExecutable))
|
|
|
|
|
if event.key == CurKeys["X"]:
|
|
|
|
|
self.UpgradeAndBuild()
|
|
|
|
|
elif not self._GameInstalled:
|
|
|
|
|
if event.key == CurKeys["X"]:
|
|
|
|
|
self.UpgradeAndBuild()
|
|
|
|
|
elif not self._DevilutionDiabdatmpqPresent:
|
|
|
|
|
if IsKeyStartOrA(event.key):
|
|
|
|
|
self.CheckDevilutionMPQ()
|
|
|
|
|
self.CheckGameInstalled()
|
|
|
|
|
self.UpdateFootMsg()
|
|
|
|
|
self._Screen.Draw()
|
|
|
|
|
self._Screen.SwapAndShow()
|
|
|
|
|
|
|
|
|
|
def Draw(self):
|
|
|
|
|
self.ClearCanvas()
|
|
|
|
|
|
|
|
|
|
if self._GameIcon != None:
|
|
|
|
|
self._GameIcon.Draw()
|
|
|
|
|
|
|
|
|
|
for i in self._Labels:
|
|
|
|
|
if i in self._Coords:
|
|
|
|
|
self._Labels[i].NewCoord( self._Coords[i].x, self._Coords[i].y)
|
|
|
|
|
self._Labels[i].Draw()
|
|
|
|
|
|
|
|
|
|
if self._HWND != None:
|
|
|
|
|
self._HWND.fill(MySkinManager.GiveColor('White'))
|
|
|
|
|
self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class APIOBJ(object):
|
|
|
|
|
|
|
|
|
|
_Page = None
|
|
|
|
|
def __init__(self):
|
|
|
|
|
pass
|
|
|
|
|
def Init(self,main_screen):
|
|
|
|
|
self._Page = DevilutionPage()
|
|
|
|
|
self._Page._Screen = main_screen
|
|
|
|
|
self._Page._Name ="devilutionX"
|
|
|
|
|
self._Page.Init()
|
|
|
|
|
|
|
|
|
|
def API(self,main_screen):
|
|
|
|
|
if main_screen !=None:
|
|
|
|
|
main_screen.PushPage(self._Page)
|
|
|
|
|
main_screen.Draw()
|
|
|
|
|
main_screen.SwapAndShow()
|
|
|
|
|
|
|
|
|
|
OBJ = APIOBJ()
|
|
|
|
|
def Init(main_screen):
|
|
|
|
|
OBJ.Init(main_screen)
|
|
|
|
|
def API(main_screen):
|
|
|
|
|
OBJ.API(main_screen)
|