Jump to content

billyc999

Platinum Member
  • Posts

    422
  • Joined

  • Last visited

Posts posted by billyc999

  1. yea i think when i parsed the original xmls it had manufacturer and this became publisher in the ods files, i did find quite a few of these to be wrong compared to moby/gamefaqs. i gotta admit when i was making them i was basically just zoned like a robot, i knew where the info was on screen and without looking id be copy & pasting, hence how i got so much done

    @dark yea that would be great , i tried figuring which parts of the textures make the real aeon nox theme but, damn thats a nightmare as im sure they are made up of several parts overlayed

    hopefully soon i can start back on adding info to zx spectrum,c64,cpc and atari st although these wont be full sets as i narrowed mine down on these platforms

    this is what your theme looks like upto now in LB

    **edit** ESRB ratings arent changed yet so no icon shows up

    Untitled.jpg

  2. @dark13 yea any psds would be great, ive been working on a few views 1 based on one of you psd files but if you have any more styles of aeon nox or anyother style it would be great to use them ... mentioned your name in the guidance thread and will credit you in the theme thread when i have everything ready.

     

    regarding the osd files, im not sure whats upto date as i havent worked on them for a while due to me converting all the data for LB

    as for using them to convert i can send you one of the small xml files for you to look at but i dont think they are of any use for aeon nox theme in Hyperspin due to dates, also the ratings will be slightly different LB uses the Style E- Everyone, T - Teen, ect to show the ratings graphics, the actual data thats shown onscreen is just taken from the osd files ie developer, rating, year, genre, info, and players

  3. @Orphen92, i have'nt started the theme yet, im just looking into how xaml works

    @Trnzaddict, the way i did it was add games to launchbox then close it. copy the xml to your desktop

    then copy and paste the text in xml to csv convertor online, you then can save it as txt and rename the extension to csv

    from there i use a macro to add the missing columns and then sort the order by application path and as long as you have the same games as the ods/csv files i cretaed you can just copy and paste the columns into the newely created csv to fill it out. at this point you should have 26 columns in the csv in column (M) you need to select it the got to find & replace regex FIND .* REPLACE &-01-01T08:00:00+01:00 <needed for LB time structure, also do a find and replace for & to &amp;

    in column 27 row 1

    i use the formula

    =CONCATENATE("<Game> <ApplicationPath>";A1;"</ApplicationPath> <Completed>";B1;"</Completed> <DateAdded>";C1;"</DateAdded> <DateModified>";D1;"</DateModified> <Developer>";E1;"</Developer> <Emulator>";F1;"</Emulator> <Favorite>";G1;"</Favorite> <ID>";H1;"</ID> <Notes>";I1;"</Notes> <Platform>";J1;"</Platform> <Publisher>";K1;"</Publisher> <Rating>";L1;"</Rating> <ReleaseDate>";M1;"</ReleaseDate> <ScummVMAspectCorrection>";N1;"</ScummVMAspectCorrection> <ScummVMFullscreen>";O1;"</ScummVMFullscreen> <StarRating>";P1;"</StarRating> <Status>";Q1;"</Status> <Title>";R1;"</Title> <UseDosBox>";S1;"</UseDosBox> <UseScummVM>";T1;"</UseScummVM> <PlayMode>";U1;"</PlayMode> <PlayCount>";V1;"</PlayCount> <Portable>";W1;"</Portable> <Hide>";X1;"</Hide> <Broken>";Y1;"</Broken> <Genre>";Z1;"</Genre> </Game>")

    any questions if you get stuck, hit me up at launchbox forums

    @zorg2000k yea love what jasons doing with LB , i still want to have Hs installed but will come back to it when its updated

  4. Hey how's everyone doing, been reading the last couple of pages of the thread, seems there's been some changes.

    i've been working on fixing up my systems in Launchbox, which i've swapped to now. just installing visual studio in the hope i can replicate the aeon nox main menu theme, eventually when HS gets updated id like to add it back so i can have both FE's on my system.

    i also converted all my csv files into launchbox xml files so i have the data sorted for most part

  5. the only thing that is needed at the moment is all HS databases converted to csv , I think Teedub is going to do them as I think he as a method to batch them.

    here's the code if you want to try it out you will need to run it from within a folder and download the csv files from git and place in a folder called CSVFILES then run the ahk and press F5 (wait a little until the upper right listview populates) this downloads all the scraper information from mobygames.

    by default all checkboxes are ticked (this prevents the moby scraper adding the information to the edit fields) just untick any field you want to scrape

    #NoEnv
    SetBatchLines, -1
    OnExit("KillIE")
     
    ; Dialog Box
    Gui, Dialog:New, -SysMenu +AlwaysOnTop, Wrong Link
    Gui, Dialog:Add, Combobox, vGameLink
    Gui, Dialog:Add, Button, Default gDialogProceed, Continue
     
    ; Predefined values ----------------------------------------------------------------------------------------------------------------
    GuiTitle := "Game Info Editor"         ; main Gui title
    FileDir := A_ScriptDir . "\CSVFILES"   ; path of the folder containing the files
    ;FileDir := "C:\Users\"A_UserName "\Google Drive\Csv Files"   ; path of the folder containing the files for google drive
    DataDir := ".\Data"
    FileEncoding, UTF-8
    Separator := ">"                       ; field separator
    NumOfFields := 10                      ; number of fields in the game records
    FieldNames  := ["Rom Name"             ; array of field names for the game record, adjust them to your needs
                  , "Game Name"
                  , "Year"
                  , "Rating"
                  , "Publisher"
                  , "Developer"
                  , "Genre"
                  , "Score"
                  , "Number Of Players"
                  , "Description"]
    FieldOptions := ["Disabled"            ; special Gui options for the edit fields, adjust them to your needs
                   , ""
                   , ""
                   , ""
                   , ""
                   , ""
                   , ""
                   , ""
                   , ""
                   , "r10"
                   , ""
                   , ""]
     
    LVW := 300                       ; width of the ListView controls
    EDW := 500                       ; width of the Edit controls
     
    CurrentFields := [], GameArray := {}
     
    ; Get the height of a single-line edit control -------------------------------------------------------------------------------------
    Gui, New
    Gui, Add, Edit, vDummy, Dummy
    GuiControlGet, Dummy, Pos
    EDH := DummyH
    Gui, Destroy
     
    ; GUI ------------------------------------------------------------------------------------------------------------------------------
    Gui, 1:New, , %GuiTitle%
    Gui, font, s13, Arial
    Gui, Margin, 20, 10
     
    ; Create and populate the FileLV
    Gui, Add, ListView, w%LVW% r10 Sort -Multi vFileLV gSubFileLV, File Name
    Loop, Files, %FileDir%\*.csv
    	LV_Add("", A_LoopFileName)
     
    ; Create the GameLV
    Gui, Add, ListView, w%LVW% h300 r10 Sort -Multi vGameLV gSubGameLV AltSubmit, % FieldNames[1]
     
    ; Add the text and edit fields for the game records
    TXY := "ym"
    Loop, %NumOfFields% {
    	Gui, Add, Checkbox, Checked Section %TXY% vCH%A_Index% h%EDH%, % FieldNames[A_Index]
    	;Gui, Add, Text, xp+15 h%EDH% +0x200, % FieldNames[A_Index]
    	Options := FieldOptions[A_Index] ; special field options
    	Gui, Add, Edit, y+2 w%EDW% %Options% vED%A_Index% gSubEditChanged +ReadOnly
    	TXY := "y+2"
    }
     
    ; Create and populate the MobySysLV
    Gui, Add, ListView, ym w%LVW% r10 Sort -Multi vMobySysLV gSubMobySysLV, System Name
    Loop, Files, %DataDir%\*.xml
    	LV_Add("", A_LoopFileName)
     
    ; Create the MobyGameLV
    Gui, Add, ListView, w%LVW% r10 Sort -Multi vMobyGameLV gSubMobyGameLV AltSubmit, % FieldNames[1]
     
    ; Add the action buttons
    BC := 4 ; button count
    BW := 100 ; button width
    DX := (EDW - (BW * BC)) // (BC - 1) ; space between butons
    Gui, Add, Button, xs w%BW% vEditBtn gSubEditBtn, Edit
    Gui, Add, Button, x+%DX% yp wp Disabled vSaveBtn gSubSaveBtn, Save
    Gui, Add, Button, x+%DX% yp wp Disabled vCancelBtn gSubCancelBtn, Cancel
    Gui, Add, Button, x+%DX% yp wp gSubSearch , Google
     
     
    ;------add background image here---------------------------------------------------------
    ; Adjust the height of GameLV
    GuiControlGet, L, Pos, MobyGameLV
    GuiControlGet, L, Pos, GameLV
    GuiControlGet, B, Pos, CancelBtn
    LVH := BH + BY - LY
    GuiControl, Move, GameLV, h%LVH%
    GuiControl, Move, MobyGameLV, h%LVH%
    ; Show the GUI
    Gui, Show
    Editing := False
     
    Gui, Dialog:+Owner
     
    Return
     
    F5::Goto, SubScrapeBtn
     
    GuiClose:
    	ExitApp
     
     
    ; File LV label --------------------------------------------------------------------------------------------------------------------
    SubFileLV:
    	Gui, ListView, FileLV ; set the default ListView
    	if(A_GuiEvent = "DoubleClick") && (A_EventInfo) && (LV_GetNext() = A_EventInfo)  { ; double-click on an item
    		LV_GetText(CurrentFile, A_EventInfo)
     
    		PopulateGameLV(CurrentFile)
     
    		GuiControl, Focus, GameLV
    		;LV_Modify(1, "Select")
    	}
    Return
     
    PopulateFileLV(){
    	Global
    	Gui, ListView, FileLV
    	LV_Delete()
    	GuiControl, -ReDraw, FileLV ; stop redrawing
     
    	Loop, Files, %FileDir%\*.csv
    		LV_Add("", A_LoopFileName)
     
    	Loop, 2 { ; adjust the column width
    		LV_ModifyCol(A_Index, "AutoHdr")
    	}
    	GuiControl, +Redraw, FileLV ; redraw the ListView
    }
     
    PopulateGameLV(FileName){
    	Global
    	Gui, ListView, GameLV ; change the default ListView
    	LV_Delete()
    	GuiControl, -ReDraw, GameLV ; stop redrawing
    	FileRead, CurrentContent, %FileDir%\%FileName%
    	GameArray := []
    	Loop, Parse, CurrentContent, `n, `r
    	{
    		If (A_LoopField) {
    			Fields := StrSplit(A_LoopField, Separator)   ; creates a real array of fields (AHK arrays start with index 1)
    			GameID := Fields[2]                          ; use the first field as the unique ID for the game
    			LV_Add("", GameID)                           ; add GameID
    			GameArray[GameID] := Fields                  ; use GameID as key for GameArray
    		}
    	}
    	Loop, 2 { ; adjust the column width
    		LV_ModifyCol(A_Index, "AutoHdr")
    	}
    	GuiControl, +Redraw, GameLV ; redraw the ListView
    }
     
     
    ; Game LV label --------------------------------------------------------------------------------------------------------------------
    SubGameLV:
    	Gui, ListView, GameLV ; set the default ListView
    	if(A_GuiEvent == "I")&& Instr(ErrorLevel, "S", 1) { ; a new item has been selected
    		LV_GetText(CurrentGame, A_EventInfo)
    		CurrentFields := GameArray[CurrentGame].Clone() ; retrieve the fields of the selected game from GameArray
    		Loop, %NumOfFields% { ; update the edit fields
    			GuiControl, , ED%A_Index%, % RegExReplace(CurrentFields[A_Index], "¤", "`n")
    		}
    	}
    Return
     
     
    SubMobySysLV:
    	Gui, ListView, MobySysLV ; set the default ListView
    	if(A_GuiEvent = "DoubleClick") && (A_EventInfo) { ; double-click on an item
    		LV_GetText(MobyFileName, A_EventInfo)
     
    		;SplitPath, MobyFileName, , , , FileName
     
    		;PopulateGameLV(MobyFileName ".csv")
     
    		Gui, ListView, MobyGameLV ; change the default ListView
    		LV_Delete()
    		GuiControl, -ReDraw, MobyGameLV ; stop redrawing
    		FileRead, CurrentContent, %DataDir%\%MobyFileName%
    		MobyArray := [] ; initialize a real array to hold the lines
     
    		Loop, Parse, CurrentContent, `n, `r
    		{
    			RegExMatch(A_LoopField, "(?<=<loc>).*?(?=</loc>)", URL)
    			if(URL) {
    				SplitPath, URL, GameID
    				GameID := Format("{:T}", RegExReplace(GameID, "(_|-)+", " "))
    				LV_Add("", GameID)                          ; add GameID
    				MobyArray[GameID] := URL                  	; use GameID as key for MobyArray
    			}
    	   }
    	   Loop, 2 ; adjust the column width
    			LV_ModifyCol(A_Index, "AutoHdr")
    	   GuiControl, +Redraw, MobyGameLV ; redraw the ListView
    	   GuiControl, Focus, MobyGameLV
    	   ;LV_Modify(1, "Select")
    	}
    Return
     
    PopulateMobySysLV(){
    	Global
    	Gui, ListView, MobySysLV
    	LV_Delete()
    	GuiControl, -ReDraw, MobySysLV ; stop redrawing
     
    	Loop, Files, %DataDir%\*.xml
    	{
    		LV_Add("", A_LoopFileName)
    	}
    	Loop, 2 { ; adjust the column width
    		LV_ModifyCol(A_Index, "AutoHdr")
    	}
    	GuiControl, +Redraw, MobySysLV ; redraw the ListView
    }
     
    ; Game LV label --------------------------------------------------------------------------------------------------------------------
    SubMobyGameLV:
    	Gui, ListView, MobyGameLV ; set the default ListView
    	If (A_GuiEvent == "I") && Instr(ErrorLevel, "S", 1) { ; a new item has been selected
    		LV_GetText(CurrentMobyGame, A_EventInfo)
     
    		Navigate(MobyArray[CurrentMobyGame])
     
    		Title := WB.document.getElementsByClassName("niceHeaderTitle")[0].getElementsByTagName("a")[0].innerText
     
    		coreGameRelease := RegExReplace(WB.document.getElementById("coreGameRelease").innerText, "(`n|`r)+", "`n")
    		coreGameGenre := RegExReplace(WB.document.getElementById("coreGameGenre").innerText, "(`n|`r)+", "`n")
    		coreGameRank := RegExReplace(WB.document.getElementById("coreGameRank").innerText, "(`n|`r)+", "`n")
     
    		RegExMatch(coreGameRelease, "(?<=Published by`n)[^`n]*", Publisher)
    		RegExMatch(coreGameRelease, "(?<=Developed by`n)[^`n]*", Developer)
    		RegExMatch(coreGameRelease, "(?<=Released`n)[^`n]*", Released)
     
    		RegExMatch(coreGameGenre, "(?<=ESRB Rating`n)[^`n]*", Rating)
    		RegExMatch(coreGameGenre, "(?<=Genre`n)[^`n]*", Genre)
     
    		RegExMatch(coreGameRank, "\d*(?=`nCritic Score)", Critic)
    		RegExMatch(coreGameRank, "(\d|\.)*(?=`nUser Score)", User)
     
    		RegExMatch(WB.document.getElementsByClassName("col-md-8 col-lg-8")[0].innerText, "s)(?<=Description`r`n).*?(?=\s+\[edit description)", Description)
     
    		Navigate(MobyArray[CurrentMobyGame] "/techinfo")
     
    		techInfo := RegExReplace(WB.document.getElementsByClassName("techInfo")[0].innerText, "(`n|`r)+", "`n")
     
    		RegExMatch(techInfo, "(?<=Number of Players Supported)[^`n`r]*", Players)
     
    		Gui, Submit, NoHide
     
    		UpdateField(2, Title)
    		UpdateField(3, Released)
    		UpdateField(4, Rating)
    		UpdateField(5, Publisher)
    		UpdateField(6, Developer)
    		UpdateField(7, Genre)
    		UpdateField(8, User)
    		UpdateField(9, Players)
    		UpdateField(10, Description)
     
    		if(Title){
    			;PopulateGameLV(MobyFileName ".csv")
    			;CurrentFile := MobyFileName
    			Goto, SubEditBtn
    			Goto, SubEditChanged
    		}
    	}
    Return
     
    UpdateField(index, text){
    	GuiControlGet, bool, , CH%index%
    	if(!bool) {
    		GuiControl, , ED%index%, % text ? text : "..."
    	}
    }
     
     
    Navigate(url){
    	Global WB
    	if(!WB){
    		WB := ComObjCreate("InternetExplorer.Application")
    		;WB.Visible := True
    		;Sleep, 100
    		WB.Visible := False
    	}
    	WB.Navigate(url)
    	While, WB.ReadyState != 4 ;Wait for page to load
    		continue
    	if(WB.document.Title = "{gameTitle} for {gamePlatform} ({gameYear}) - MobyGames"){
    		ComboDialog(url)
    	}
    }
     
    ComboDialog(url){
    	Global
    	links := WB.document.getElementById("main").getElementsByTagName("a")
    	list := ""
     
    	loop, % links.length
    	{
    		RegExMatch(links[A_Index - 1].getAttribute("href"), "[^/]*$", game)
    		list .= (A_Index = 2 ? "||" : "|") game
    	}
     
    	Gui, +Disabled
     
    	GuiControl, Dialog:, GameLink, %list%
    	Gui, Dialog:Show, AutoSize
     
    	loop {
    		GuiControlGet, Visible, Dialog:Visible, GameLink
    		if(!Visible){
    			Break
    		}
    		Sleep, 50
    	}
     
    	Gui, -Disabled
     
    	SplitPath, url, , link
    	MobyArray[CurrentMobyGame] := link "/" GameLink
    	Navigate(link "/" GameLink)
    }
     
    DialogProceed:
    	Gui, Dialog:Submit
    	Gui, -Disabled
    return
     
    SubScrapeBtn:
    	Gui, ListView, MobySysLV
    	LV_Delete()
     
    	IfNotExist, %dataDir%
    		FileCreateDir, %dataDir%
     
    	UrlDownloadToFile, http://www.mobygames.com/images/sitemap/sitemap_index.xml, %DataDir%\sitemap.txt
     
    	Loop, Read, %DataDir%\sitemap.txt
    	{
    		RegExMatch(A_LoopReadLine, "(?<=<loc>).*?(?=</loc>)", URL)
    		SplitPath, URL, name
    		name := RegExReplace(name, "(sitemap_|_games)")
    		UrlDownloadToFile, %URL%, %DataDir%\%name%
    	}
    	PopulateMobySysLV()
    return
     
    ;Google Search button label --------------------------------------------------------------------------------------------------------
    SubSearch:
    	StringTrimRight, NameNoExt, CurrentFile, 4
    	googleterms := NameNoExt . "+" . CurrentFields[2]
    	run, http://www.google.com/search?q=%googleterms%
    Return ; important to end the label!!!
     
    ; Edit button label ----------------------------------------------------------------------------------------------------------------
    SubEditBtn:
    	;GuiControl, Disable, FileLV
    	GuiControl, Disable, GameLV
    	GuiControl, Disable, EditBtn
    	Loop, %NumOfFields%
    		GuiControl, -ReadOnly, ED%A_Index%
    	GuiControl, Enable, CancelBtn
    	GuiControl, Focus, ED2
    	Modified := False
    	Editing := True
    Return
     
    ; Save button label ----------------------------------------------------------------------------------------------------------------
    SubSaveBtn:
    	Gui, +OwnDialogs
    	Editing := False
    	SplitPath, CurrentFile, , , , FileName
    	MsgBox, 4, %GuiTitle%, Save the changes to file %FileName%.csv ?
    	IfMsgBox, Yes
    	{
    		Gui, Submit, NoHide
    		Loop, %NumOfFields% { ; update the game record
    			GuiControlGet, Value, , ED%A_Index%
    			CurrentFields[A_Index] := RegExReplace(Value, "`n", "¤")
    		}
     
    		GameArray[CurrentGame ? CurrentGame : CurrentFields[2]] := CurrentFields.Clone()
     
    		; To-do: save the file!
    		NewContent := ""
    		For Each, GameRecord In GameArray {
    			Loop, %NumOfFields% {
    				NewContent .= GameRecord[A_Index] . (A_Index = NumOfFields ? "`r`n" : Separator)
    			}
    		}
     
    		if(HFILE := FileOpen(FileDir . "\" . FileName . ".csv", "w")) {
    			HFILE.Write(NewContent)
    			HFILE.Close()
     
    		} else {
    			MsgBox, 16, %GuiTitle%, Couldn't update file %FileName%.csv!`n`nError: %A_LastError%
    		}
    		PopulateFileLV()
    		PopulateGameLV(FileName ".csv")
    		CurrentGame := False
    		NewContent := ""
    	}
     
    ; Fall through to SubCancelBtn to do the rest
     
    ; Cancel button label --------------------------------------------------------------------------------------------------------------
    SubCancelBtn:
    	Editing := False
    	GuiControl, Disable, CancelBtn
    	GuiControl, Disable, SaveBtn
    	Loop, %NumOfFields% {
    		GuiControl, +ReadOnly, ED%A_Index%
    	}
    	GuiControl, Enable, EditBtn
    	GuiControl, Enable, GameLV
    	GuiControl, Enable, FileLV
    	GuiControl, Focus, GameLV
    	Gui, ListView, GameLV
    	LV_Modify(LV_GetNext(), "Select") ; refill the game record fields
    Return
     
    ; Edits label ----------------------------------------------------------------------------------------------------------------------
    SubEditChanged:
    	if(!Editing) { ; not in edit mode
    		Return
    	}
    	if(!Modified) { ; first call while editing
    		GuiControl, Enable, SaveBtn
    	}
    	Modified := True ; something in some of the edit control has been changed
    Return
     
    ; ----------------------------------------------------------------------------------------------------------------------------------
    CtlColorStatic(W, L) { ; changes the background of ReadOnly and disabled edits to white for better readability
    	Static Init := OnMessage(0x0138, "CtlColorStatic") ; WM_CTLCOLORSTATIC = 0x0138
    	Static DCBrush := DllCall("GetStockObject", "UInt", 18, "UPtr") ; DC_BRUSH = 18
    	GuiControlGet, ControlName, Name, %L%
    	If (SubStr(ControlName, 1, 2) = "ED") {
    		DllCall("SetDCBrushColor", "Ptr", W, "UInt", 0xFFFFFF)
    		Return DCBrush
    	}
    }
     
    KillIE(){
    	Global WB
    	WB.Quit()
    }
    
    
  6. ill try to do a mock up at the weekend, still got to finish my kitchen as ive been doing overtime at work and knackered when ive been getting in, but I'm sure I could work out a better spaced out theme to allow for bigger boxes, the kodi theme its taken from as 3 variants, tall box , wide box, and square box 

×
×
  • Create New...