Advertisement
Guest User

Untitled

a guest
May 23rd, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.74 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "crypto/md5"
  6. "fmt"
  7. "io"
  8. "log"
  9. "os"
  10. "os/exec"
  11. "path/filepath"
  12. "strings"
  13. )
  14.  
  15. const (
  16. slot = "KSBx"
  17. mfolder = "projectm/pf/"
  18. ofolder = "ssbb.d/files/"
  19. pc = "4333"
  20. gid = "RSBEC3"
  21. gctsize = "106D8"
  22. gctpath = "RSBE01.gct"
  23. modname = "Project M 3.5 Netplay Build"
  24. wflags = "-ovv"
  25. )
  26.  
  27. var pmfp []string
  28. var ofp []string
  29.  
  30. func cerr(err error) {
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. }
  35.  
  36. // Extract the contents of the SSBB iso
  37. // In desperate need of a better option
  38. func unpackIso() {
  39. cmd := exec.Command("wit-lin/wit",
  40. "extract", "-s", ".", "-1", "-n",
  41. "RSBE01", ".", "ssbb.d", "--psel=DATA",
  42. "-ovv")
  43. cmd.Stdout = os.Stdout
  44. cmd.Stderr = os.Stderr
  45. if err := cmd.Start(); err != nil {
  46. log.Fatal(err)
  47. }
  48. if err := cmd.Wait(); err != nil {
  49. log.Fatal(err)
  50. }
  51. }
  52.  
  53. // Copy file from src -> dst
  54. func copyFileContents(dst, src string) (n int64, err error) {
  55. in, err := os.Open(src)
  56. cerr(err)
  57. defer in.Close()
  58.  
  59. out, err := os.Create(dst)
  60. cerr(err)
  61. defer out.Close()
  62.  
  63. if n, err = io.Copy(out, in); err != nil {
  64. return n, err
  65. }
  66. err = out.Sync()
  67.  
  68. return n, nil
  69. }
  70.  
  71. // Scan through the file paths and copy over Project M files
  72. func copyFiles() {
  73. for i := 0; i < len(pmfp); i++ {
  74. _, err := os.Stat(ofp[i])
  75. if os.IsNotExist(err) {
  76. dir, _ := filepath.Split(ofp[i])
  77. err := os.MkdirAll(dir, 0775)
  78. cerr(err)
  79. }
  80. n, err := copyFileContents(ofp[i], pmfp[i])
  81. cerr(err)
  82. fmt.Printf("--> %s (%d) [%d]\n", pmfp[i], n, len(pmfp)-i)
  83. }
  84. _, err := copyFileContents("ssbb.d/files/sound/smashbros_sound.brsar",
  85. "smashbros_sound.brsar")
  86. cerr(err)
  87. }
  88.  
  89. // Patch the iso with gct codeset
  90. func patchDol() {
  91. cmd := exec.Command("wit-lin/wit",
  92. "dolpatch", "ssbb.d/sys/main.dol",
  93. "NEW=TEXT,80001800,10C0",
  94. "LOAD=80001800,patch/codehandler.bin",
  95. "XML=patch/PatchCommon.xml",
  96. "805A14B8="+pc,
  97. "NEW=DATA,80570000,"+gctsize,
  98. "LOAD=80570000,"+gctpath)
  99. cmd.Stdout = os.Stdout
  100. cmd.Stderr = os.Stderr
  101. if err := cmd.Start(); err != nil {
  102. log.Fatal(err)
  103. }
  104. if err := cmd.Wait(); err != nil {
  105. log.Fatal(err)
  106. }
  107. }
  108.  
  109. // Rebuild-the-Iso
  110. func rebuildIso() {
  111. // cmd := exec.Command("wit-lin/wit",
  112. // "copy", "ssbb.d", "Project M Community.iso",
  113. // "-ovv", "--disc-id="+gid, "--boot-id="+gid,
  114. // "--tt-id="+slot, "--name", modname)
  115. cmd := exec.Command("wit-lin/wit",
  116. "copy", "ssbb.d", "Project M Community.iso",
  117. "-ovv", "--disc-id=RSBEC3", "--boot-id=RSBEC3",
  118. "--tt-id=KSBx", "--name", modname)
  119. cmd.Stdout = os.Stdout
  120. cmd.Stderr = os.Stderr
  121. if err := cmd.Start(); err != nil {
  122. log.Fatal(err)
  123. }
  124. if err := cmd.Wait(); err != nil {
  125. log.Fatal(err)
  126. }
  127. }
  128.  
  129. // Clean up the mess
  130. func cleanUp() {
  131. fmt.Println("Cleaning up the mess...")
  132. err := os.RemoveAll("ssbb.d")
  133. cerr(err)
  134. }
  135.  
  136. // Add paths to either pmfp or ofp slices
  137. func populatePaths() {
  138. err := filepath.Walk(".", WalkFunc)
  139. cerr(err)
  140. }
  141.  
  142. // Walk function supplied to PopulatePaths
  143. func WalkFunc(path string, info os.FileInfo, err error) error {
  144. ispm := strings.HasPrefix(path, mfolder)
  145. if !info.IsDir() && ispm {
  146. pmfp = append(pmfp, path)
  147. // Replace projectm/pf/ with wits crap
  148. dir, file := filepath.Split(path)
  149. dl := strings.ToLower(dir)
  150. ofpj := filepath.Join(dl, file)
  151. ofp = append(ofp, strings.Replace(ofpj, mfolder, ofolder, 1))
  152. }
  153. return nil
  154. }
  155.  
  156. func genHash() {
  157. var iso string = "Project M Community.iso"
  158. fmt.Println("Generating md5 hash...")
  159. h := md5.New()
  160. o, err := os.Open(iso)
  161. cerr(err)
  162. defer o.Close()
  163. r := bufio.NewReader(o)
  164. io.Copy(h, r)
  165. fmt.Printf("%x %s\n", h.Sum(nil), iso)
  166. }
  167.  
  168. func main() {
  169. unpackIso()
  170. populatePaths()
  171. copyFiles()
  172. patchDol()
  173. rebuildIso()
  174. cleanUp()
  175. genHash()
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement