You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

291 lines
8.5 KiB

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)