Initial commit

This commit is contained in:
Hector Martin
2016-11-23 14:35:12 +09:00
commit 5b1c4f85b6
296 changed files with 39925 additions and 0 deletions

6
channel/banner/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
build
channel.imet
tools/png2tpl
tools/mkbns
tools/lz77
*.raw

64
channel/banner/Makefile Normal file
View File

@@ -0,0 +1,64 @@
ifeq ($(WIN32), 1)
export PREFIX = i586-mingw32msvc-
export EXE := .exe
export LFLAGS = -lws2_32
else
export PREFIX =
export EXE =
export LFLAGS =
endif
export PYWII := $(CURDIR)/../../pywii/pywii-tools
export ALAMEDA := $(CURDIR)/../../pywii/Alameda
export PNG2TPL := $(CURDIR)/tools/png2tpl$(EXE)
export MKBNS := $(CURDIR)/tools/mkbns$(EXE)
export LZ77 := $(CURDIR)/tools/lz77$(EXE)
export ADDIMD5 := python $(CURDIR)/tools/addimd5.py
export ARCPACK := python $(PYWII)/arcpack.py
export SOX := sox
all: channel.imet
channel.imet: build/data.arc names.txt tools/join-imet.py
python tools/join-imet.py $@ build/data.arc build/icon.arc build/banner.arc build/sound.bns names.txt
build/data.arc : build/data/meta/icon.bin build/data/meta/banner.bin build/data/meta/sound.bin
$(ARCPACK) $@ build/data
build/data/meta/icon.bin : icon/* $(PNG2TPL) $(LZ77)
$(MAKE) -C icon -f ../Makefile.section
build/data/meta/banner.bin : banner/* $(PNG2TPL) $(LZ77)
$(MAKE) -C banner -f ../Makefile.section
build/data/meta/sound.bin : build/sound.bns
@[ ! -d build/data/meta ] && mkdir -p build/data/meta || true
$(ADDIMD5) $< $@
build/sound.bns : build/wiibrew-banner-intro-part.raw build/wiibrew-banner-loop-part.raw $(MKBNS)
@[ ! -d build ] && mkdir -p build || true
$(MKBNS) build/wiibrew-banner-intro-part.raw $@ 1 build/wiibrew-banner-loop-part.raw
build/%.raw : sound/%.wav
@[ ! -d build ] && mkdir -p build || true
$(SOX) $< -r 32000 -c 2 -e signed-integer -b 16 -t raw $@
testi : channel.imet
python $(ALAMEDA)/Alameda.py channel.imet icon
testb : channel.imet
python $(ALAMEDA)/Alameda.py channel.imet banner
$(PNG2TPL): tools/*.c
$(MAKE) -C tools png2tpl$(EXE)
$(MKBNS): tools/*.c
$(MAKE) -C tools mkbns$(EXE)
$(LZ77): tools/*.c
$(MAKE) -C tools lz77$(EXE)
clean:
rm -f channel.imet
rm -rf build
$(MAKE) -C tools clean

View File

@@ -0,0 +1,30 @@
TYPE = $(notdir $(CURDIR))
PNGS = $(wildcard *.png)
TPLS = $(patsubst %.png,../build/$(TYPE)/arc/timg/%.tpl,$(PNGS))
../build/data/meta/$(TYPE).bin : ../build/$(TYPE).lz77
@[ ! -d ../build/data/meta ] && mkdir -p ../build/data/meta || true
$(ADDIMD5) $< $@
../build/$(TYPE).lz77 : ../build/$(TYPE).arc
$(LZ77) $< $@
ifeq ($(TYPE),banner)
ANIMS = ../build/$(TYPE)/arc/anim/$(TYPE)_Start.brlan ../build/$(TYPE)/arc/anim/$(TYPE)_Loop.brlan
else
ANIMS = ../build/$(TYPE)/arc/anim/$(TYPE).brlan
endif
../build/$(TYPE)/arc/blyt/$(TYPE).brlyt $(ANIMS) : mk$(TYPE).py
@[ ! -d ../build/$(TYPE)/arc/anim ] && mkdir -p ../build/$(TYPE)/arc/anim || true
@[ ! -d ../build/$(TYPE)/arc/blyt ] && mkdir -p ../build/$(TYPE)/arc/blyt || true
python mk$(TYPE).py ../build/$(TYPE)/arc/blyt/$(TYPE).brlyt $(ANIMS)
../build/$(TYPE).arc : $(TPLS) ../build/$(TYPE)/arc/blyt/$(TYPE).brlyt $(ANIMS)
$(ARCPACK) ../build/$(TYPE).arc ../build/$(TYPE)
../build/$(TYPE)/arc/timg/%.tpl : %.png
@[ ! -d ../build/$(TYPE)/arc/timg ] && mkdir -p ../build/$(TYPE)/arc/timg || true
$(PNG2TPL) $< $@ `grep $< textures.txt | cut -f 2-`

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

View File

@@ -0,0 +1,383 @@
import sys, os, random
sys.path.append(os.environ['ALAMEDA']+"/../Common")
sys.path.append(os.environ['ALAMEDA'])
from Alameda import *
brlyt = Brlyt(None, None, None)
brlyt.Width = 810
brlyt.Height = 456
brlyt.Textures.add(Brlyt.BrlytTexture("banner_title.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("white.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("banner_wavea.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("banner_waveb.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("banner_wave1a.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("banner_wave1b.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("banner_shape2.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("banner_fade.tpl"))
brlyt.Materials.add(Brlyt.BrlytMaterial("title"))
brlyt.Materials[0].Textures.append((0,0,0))
brlyt.Materials[0].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[0].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("white"))
brlyt.Materials[1].Textures.append((1,1,1))
brlyt.Materials[1].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[1].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("wavea"))
brlyt.Materials[2].Textures.append((2,1,0))
brlyt.Materials[2].TextureCoords.append([0,2,0,3,6])
brlyt.Materials[2].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("waveb"))
brlyt.Materials[3].Textures.append((3,1,0))
brlyt.Materials[3].TextureCoords.append([0,2,0,3,6])
brlyt.Materials[3].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("wave1a"))
brlyt.Materials[4].Textures.append((4,0,0))
brlyt.Materials[4].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[4].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("wave1b"))
brlyt.Materials[5].Textures.append((5,0,0))
brlyt.Materials[5].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[5].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("shape2"))
brlyt.Materials[6].Textures.append((6,0,0))
brlyt.Materials[6].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[6].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("fade"))
brlyt.Materials[7].Textures.append((7,0,0))
brlyt.Materials[7].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[7].SthB.append(0x01041e00)
brlyt.RootPane = Pane("RootPane")
brlyt.RootPane.Width = brlyt.Width
brlyt.RootPane.Height = brlyt.Height
waterpane = Pane("water")
bubblepane = Pane("bubbles")
bkg = Picture("background")
bkg.Material = 1
bkg.X, bkg.Y, bkg.Width, bkg.Height = 0,0,brlyt.Width,brlyt.Height
tit = Picture("title")
tit.Material = 0
tit.X, tit.Y, tit.Width, tit.Height = 0,32,400,180
wavea = Picture("wavea")
wavea.Material = 2
wavea.X, wavea.Y, wavea.Width, wavea.Height = -300,35,3072,384
waveb = Picture("waveb")
waveb.Material = 3
waveb.X, waveb.Y, waveb.Width, waveb.Height = -300,32,3072,384
wave1a = Picture("wave1a")
wave1a.Material = 4
wave1a.X, wave1a.Y, wave1a.Width, wave1a.Height = -200,160,382,32
wave1b1 = Picture("wave1b1")
wave1b1.Material = 5
wave1b1.X, wave1b1.Y, wave1b1.Width, wave1b1.Height = 200,170,527,37
wave1b2 = Picture("wave1b2")
wave1b2.Material = 5
wave1b2.X, wave1b2.Y, wave1b2.Width, wave1b2.Height = -380,170,527,37
shadow = Picture("shadow")
shadow.Material = 6
shadow.X, shadow.Y, shadow.Width, shadow.Height = -180,150,644,28
fade = Picture("fade")
fade.Material = 7
fade.X, fade.Y, fade.Width, fade.Height = 0,8,brlyt.Width,256
boom = Picture("boom")
boom.Material = 1
boom.Alpha = 0
boom.X, boom.Y, boom.Width, boom.Height = 0,0,brlyt.Width,brlyt.Height
waterpane.Add(wavea)
waterpane.Add(waveb)
waterpane.Add(wave1a)
waterpane.Add(wave1b1)
waterpane.Add(wave1b2)
waterpane.Add(shadow)
waterpane.Add(fade)
waterpane.Add(bubblepane)
brlyt.RootPane.Add(bkg)
brlyt.RootPane.Add(waterpane)
brlyt.RootPane.Add(tit)
brlyt.RootPane.Add(boom)
fakeStart = -60 * 10
loopStart = 60 * 6
loopEnd = 60 * 22
brlan = Brlan()
brlan.Anim.add(Brlan.BrlanAnimSet("water"))
brlan.Anim.add(Brlan.BrlanAnimSet("wavea"))
brlan.Anim.add(Brlan.BrlanAnimSet("waveb"))
brlan.Anim.add(Brlan.BrlanAnimSet("wave1a"))
brlan.Anim.add(Brlan.BrlanAnimSet("wave1b1"))
brlan.Anim.add(Brlan.BrlanAnimSet("wave1b2"))
brlan.Anim.add(Brlan.BrlanAnimSet("shadow"))
brlan.Anim.add(Brlan.BrlanAnimSet("title"))
brlan.Anim.add(Brlan.BrlanAnimSet("boom"))
brlan.Anim['title'].add(Brlan.BrlanAnimClass(Brlan.A_COORD))
brlan.Anim['title'][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_Y))
brlan.Anim['title'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 12, 32, 0, 20, 0)
brlan.Anim['title'].add(Brlan.BrlanAnimClass(Brlan.A_PARM))
brlan.Anim['title'][Brlan.A_PARM].add(Brlan.BrlanAnim(Brlan.P_ALPHA))
brlan.Anim['title'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((0, 0, 0))
brlan.Anim['title'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((243, 0, 0))
brlan.Anim['title'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((244, 255, 0))
brlan.Anim['boom'].add(Brlan.BrlanAnimClass(Brlan.A_PARM))
brlan.Anim['boom'][Brlan.A_PARM].add(Brlan.BrlanAnim(Brlan.P_ALPHA))
brlan.Anim['boom'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((0, 0, 0))
brlan.Anim['boom'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((243, 0, 0))
brlan.Anim['boom'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((244, 255, 0))
brlan.Anim['boom'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((246, 255, 0))
brlan.Anim['boom'][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((256, 0, 0))
for i in ['wavea', 'waveb', 'wave1a', 'wave1b1', 'wave1b2', 'shadow']:
brlan.Anim[i].add(Brlan.BrlanAnimClass(Brlan.A_COORD))
brlan.Anim[i][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_X))
brlan.Anim[i][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_Y))
brlan.Anim['wavea'][Brlan.A_COORD][Brlan.C_X].repsimple(fakeStart, loopEnd, 4, -300, 0, 300, 0)
brlan.Anim['waveb'][Brlan.A_COORD][Brlan.C_X].repsimple(fakeStart, loopEnd, 4, -300, 2.0, 300, 2.0)
brlan.Anim['wavea'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 6, 35, 0, 55, 0)
brlan.Anim['waveb'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 8, 45, 0, 55, 0)
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].repsimple(fakeStart, loopEnd, 4, -200, 4.0, 200, 4.0)
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 6, 160, 0.2, 180, 0.2)
brlan.Anim['wave1b1'][Brlan.A_COORD][Brlan.C_X].repsimple(fakeStart, loopEnd, 4, 200, 3.2, 400, 3.2)
brlan.Anim['wave1b1'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 6, 170, 0.2, 183, 0.2)
brlan.Anim['wave1b2'][Brlan.A_COORD][Brlan.C_X].repsimple(fakeStart, loopEnd, 4, -400, 3.7, -200, 3.7)
brlan.Anim['wave1b2'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 6, 165, 0.2, 185, 0.2)
brlan.Anim['shadow'][Brlan.A_COORD][Brlan.C_X].repsimple(fakeStart, loopEnd, 4, -180, 1.4, 100, 1.4)
brlan.Anim['shadow'][Brlan.A_COORD][Brlan.C_Y].repsimple(fakeStart, loopEnd, 6, 150, 0.2, 155, 0.2)
brlan.Anim.add(Brlan.BrlanAnimSet("water"))
brlan.Anim['water'].add(Brlan.BrlanAnimClass(Brlan.A_COORD))
brlan.Anim['water'][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_Y))
brlan.Anim['water'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((0, -320, 0))
brlan.Anim['water'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((160, 0, 0))
##### Bubble generation #####
random.seed(1)
class BubbleType:
def __init__(self, name, width, height):
self.Name = name
self.TextureName = name + ".tpl"
self.Width = width
self.Height = height
self.PicCtr = 0
def makemat(self, brlyt):
self.Brlyt = brlyt
self.Texture = len(brlyt.Textures)
brlyt.Textures.add(Brlyt.BrlytTexture(self.TextureName))
self.Material = len(brlyt.Materials)
brlyt.Materials.add(Brlyt.BrlytMaterial(self.Name))
brlyt.Materials[self.Material].Textures.append((self.Texture,0,0))
brlyt.Materials[self.Material].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[self.Material].SthB.append(0x01041e00)
def makepic(self):
name = "%s_%d"%(self.Name,self.PicCtr)
pic = Picture(name)
pic.Material = self.Material
pic.X, pic.Y, pic.Width, pic.Height = 0,-600,self.Width,self.Height
self.PicCtr += 1
return pic
class BubbleInstance:
YSTART = -150
YEND = 170
FADESTART = 0.7
def __init__(self, start, length=None, x=None, xp=None):
if x is None:
x = random.uniform(-brlyt.Width/2-64, brlyt.Width/2+64)
if xp is None:
xp = random.uniform(0, 32)
if length is None:
length = random.uniform(50, 170)
self.X = x
self.XP = xp
self.Start = start
self.Length = length
self.End = self.Start + self.Length
self.TypeID = None
def render(self, brlan):
if self.Picture.Name not in brlan.Anim:
#print "Adding animation set for %s"%self.Picture.Name
brlan.Anim.add(Brlan.BrlanAnimSet(self.Picture.Name))
brlan.Anim[self.Picture.Name].add(Brlan.BrlanAnimClass(Brlan.A_COORD))
brlan.Anim[self.Picture.Name].add(Brlan.BrlanAnimClass(Brlan.A_PARM))
brlan.Anim[self.Picture.Name][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_X))
brlan.Anim[self.Picture.Name][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_Y))
brlan.Anim[self.Picture.Name][Brlan.A_PARM].add(Brlan.BrlanAnim(Brlan.P_ALPHA))
tps = [
brlan.Anim[self.Picture.Name][Brlan.A_COORD][Brlan.C_X],
brlan.Anim[self.Picture.Name][Brlan.A_COORD][Brlan.C_Y],
brlan.Anim[self.Picture.Name][Brlan.A_PARM][Brlan.P_ALPHA]
]
for i in tps:
if len(i.Triplets) > 0:
if i.Triplets[-1][0] >= self.Start:
print "WTF at %s: %f >= %f"%(self.Picture.Name,i.Triplets[-1][0],self.Start)
raise RuntimeError("We Have A Problem")
brlan.Anim[self.Picture.Name][Brlan.A_COORD][Brlan.C_X].Triplets.append((self.Start, self.X, 0))
brlan.Anim[self.Picture.Name][Brlan.A_COORD][Brlan.C_Y].Triplets.append((self.Start, self.YSTART, 1))
brlan.Anim[self.Picture.Name][Brlan.A_COORD][Brlan.C_X].Triplets.append((self.End, self.X, 0))
brlan.Anim[self.Picture.Name][Brlan.A_COORD][Brlan.C_Y].Triplets.append((self.End, self.YEND, 1))
fadepoint = self.Start + self.Length * self.FADESTART
brlan.Anim[self.Picture.Name][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((self.Start, 0, 0))
brlan.Anim[self.Picture.Name][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((self.Start, 255, 0))
brlan.Anim[self.Picture.Name][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((fadepoint, 255, 0))
brlan.Anim[self.Picture.Name][Brlan.A_PARM][Brlan.P_ALPHA].Triplets.append((self.End, 0, 0))
def clone(self):
new = BubbleInstance(self.Start, self.Length, self.X, self.XP)
new.TypeID = self.TypeID
return new
class BubbleCollection:
def __init__(self, brlyt, brlan, pane):
self.Brlyt = brlyt
self.Brlan = brlan
self.Pane = pane
self.BubbleTypes = []
self.Instances = []
def addtype(self, t, chance):
self.BubbleTypes.append((t, chance))
def choosetype(self):
sumchances = sum([c for t,c in self.BubbleTypes])
opt = random.uniform(0,sumchances)
for i,bt in enumerate(self.BubbleTypes):
t,c = bt
if c > opt:
return i
opt -= c
return i
def addinstance(self, i):
if i.TypeID is None:
i.TypeID = self.choosetype()
self.Instances.append(i)
def cleanInstances(self, time):
for tis in self.TypeInstances:
for i, ti in enumerate(tis):
pic, user = ti
if user is not None and user.End < time:
#print "Freeing instance: [%f-%f]"%(user.Start,user.End)
tis[i] = pic, None
def printinstances(self):
print "Type Instances:"
for tid, tis in enumerate(self.TypeInstances):
print " Type Instances for type %d (%s):"%(tid, self.BubbleTypes[tid][0].Name)
for i, ti in enumerate(tis):
pic, user = ti
if user is None:
print " %d: Picture %s, free"%(i,pic.Name)
else:
print " %d: Picture %s, user: %s [%f-%f]"%(i,pic.Name,repr(user),user.Start,user.End)
def render(self):
for t,c in self.BubbleTypes:
t.makemat(self.Brlyt)
self.TypeInstances = []
for i in range(len(self.BubbleTypes)):
self.TypeInstances.append([])
self.Instances.sort(key=lambda x: x.Start)
for n,i in enumerate(self.Instances):
#print "Processing instance %d of type %d (%f-%f)"%(n,i.TypeID,i.Start,i.End)
time = i.Start
self.cleanInstances(time)
tis = self.TypeInstances[i.TypeID]
for nti,ti in enumerate(tis):
pic, user = ti
if user is None:
tis[nti] = (pic,i)
i.Picture = pic
#print "Found space"
break
else:
#print "No space for type %d"%i.TypeID
pic = self.BubbleTypes[i.TypeID][0].makepic()
self.Pane.Add(pic)
tis.append((pic, i))
i.Picture = pic
i.render(self.Brlan)
#self.printinstances()
print "Fake Start",fakeStart
print "Loop Start",loopStart
print "Loop End",loopEnd
col = BubbleCollection(brlyt, brlan, bubblepane)
col.addtype(BubbleType("abubble1", 48, 48),1)
col.addtype(BubbleType("abubble2", 32, 32),1)
col.addtype(BubbleType("abubble3", 16, 16),1)
col.addtype(BubbleType("abubble4", 24, 24),1)
col.addtype(BubbleType("abubble5", 32, 32),1)
col.addtype(BubbleType("abubble6", 16, 16),1)
col.addtype(BubbleType("bbubble1", 48, 48),1)
col.addtype(BubbleType("cbubble1", 64, 64),1)
col.addtype(BubbleType("cbubble2", 16, 16),1)
bubbleBoom = 190
# bubble mania!
for i in range(100):
col.addinstance(BubbleInstance(bubbleBoom))
# now fill things
for i in range(280):
start = random.uniform(bubbleBoom, loopEnd)
col.addinstance(BubbleInstance(start))
# clear the ones that overrun the loop
for i in col.Instances:
if i.End > loopEnd:
col.Instances.remove(i)
# and copy the loop start bubbles to the end
for i in col.Instances:
if i.Start < loopStart and i.End > loopStart:
new = i.clone()
new.Start -= loopStart
new.Start += loopEnd
new.End -= loopStart
new.End += loopEnd
col.Instances.append(new)
col.render()
brldata = brlyt.Pack()
open(sys.argv[1],"w").write(brldata)
bradata = brlan.Pack(loopStart)
open(sys.argv[2],"w").write(bradata)
bradata = brlan.Pack(loopStart, loopEnd)
open(sys.argv[3],"w").write(bradata)

View File

@@ -0,0 +1,20 @@
#-----------------------
# texture x y
#-----------------------
abubble1.png 0 0
abubble2.png 0 0
abubble3.png 0 0
abubble4.png 0 0
abubble5.png 0 0
abubble6.png 0 0
bbubble1.png 0 0
cbubble1.png 0 0
cbubble2.png 0 0
white.png 1 1
banner_fade.png 1 0
banner_title.png 0 0
banner_wave1a.png 0 0
banner_wave1b.png 0 0
banner_wavea.png 1 0
banner_waveb.png 1 0
banner_shape2.png 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

View File

@@ -0,0 +1,182 @@
import sys, os, struct, random
sys.path.append(os.environ['ALAMEDA']+"/../Common")
sys.path.append(os.environ['ALAMEDA'])
from Alameda import *
brlyt = Brlyt(None, None, None)
brlyt.Width = 170
brlyt.Height = 96
brlyt.Textures.add(Brlyt.BrlytTexture("icon_title.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("white.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("icon_wavea.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("icon_waveb.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("icon_wave1a.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("icon_wave1b.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("icon_shape2.tpl"))
brlyt.Textures.add(Brlyt.BrlytTexture("icon_fade.tpl"))
brlyt.Materials.add(Brlyt.BrlytMaterial("title"))
brlyt.Materials[0].Textures.append((0,0,0))
brlyt.Materials[0].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[0].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("white"))
brlyt.Materials[1].Textures.append((1,1,1))
brlyt.Materials[1].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[1].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("wavea"))
brlyt.Materials[2].Textures.append((2,1,0))
brlyt.Materials[2].TextureCoords.append([0,2,0,4,6])
brlyt.Materials[2].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("waveb"))
brlyt.Materials[3].Textures.append((3,1,0))
brlyt.Materials[3].TextureCoords.append([0,2,0,4,6])
brlyt.Materials[3].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("wave1a"))
brlyt.Materials[4].Textures.append((4,0,0))
brlyt.Materials[4].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[4].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("wave1b"))
brlyt.Materials[5].Textures.append((5,0,0))
brlyt.Materials[5].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[5].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("shape2"))
brlyt.Materials[6].Textures.append((6,0,0))
brlyt.Materials[6].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[6].SthB.append(0x01041e00)
brlyt.Materials.add(Brlyt.BrlytMaterial("fade"))
brlyt.Materials[7].Textures.append((7,0,0))
brlyt.Materials[7].TextureCoords.append([0,0,0,1,1])
brlyt.Materials[7].SthB.append(0x01041e00)
brlyt.RootPane = Pane("RootPane")
brlyt.RootPane.Width = brlyt.Width
brlyt.RootPane.Height = brlyt.Height
waterpane = Pane("water")
bkg = Picture("background")
bkg.Material = 1
bkg.X, bkg.Y, bkg.Width, bkg.Height = 0,0,170,96
tit = Picture("title")
tit.Material = 0
tit.X, tit.Y, tit.Width, tit.Height = 0,-7,110,49
wavea = Picture("wavea")
wavea.Material = 2
wavea.X, wavea.Y, wavea.Width, wavea.Height = -171,-5,1024,96
waveb = Picture("waveb")
waveb.Material = 3
waveb.X, waveb.Y, waveb.Width, waveb.Height = -171,-3,1024,96
wave1a = Picture("wave1a")
wave1a.Material = 4
wave1a.X, wave1a.Y, wave1a.Width, wave1a.Height = -75,27,94,8
wave1b = Picture("wave1b")
wave1b.Material = 5
wave1b.X, wave1b.Y, wave1b.Width, wave1b.Height = 65,27,130,9
shadow = Picture("shadow")
shadow.Material = 6
shadow.X, shadow.Y, shadow.Width, shadow.Height = -45,21,159,7
fade = Picture("fade")
fade.Material = 7
fade.X, fade.Y, fade.Width, fade.Height = 0,-16,170,80
waterpane.Add(wavea)
waterpane.Add(waveb)
waterpane.Add(wave1a)
waterpane.Add(wave1b)
waterpane.Add(shadow)
waterpane.Add(fade)
brlyt.RootPane.Add(bkg)
brlyt.RootPane.Add(waterpane)
brlyt.RootPane.Add(tit)
brldata = brlyt.Pack()
open(sys.argv[1],"w").write(brldata)
brlan = Brlan()
brlan.Anim.add(Brlan.BrlanAnimSet("water"))
brlan.Anim.add(Brlan.BrlanAnimSet("wavea"))
brlan.Anim.add(Brlan.BrlanAnimSet("waveb"))
brlan.Anim.add(Brlan.BrlanAnimSet("wave1a"))
brlan.Anim.add(Brlan.BrlanAnimSet("wave1b"))
brlan.Anim.add(Brlan.BrlanAnimSet("shadow"))
brlan.Anim.add(Brlan.BrlanAnimSet("title"))
brlan.Anim['title'].add(Brlan.BrlanAnimClass(Brlan.A_COORD))
brlan.Anim['title'][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_Y))
brlan.Anim['title'][Brlan.A_COORD][Brlan.C_Y].repsimple(0, 960, 8, -7, 0, -11, 0)
for i in ['wavea', 'waveb', 'wave1a', 'wave1b', 'shadow']:
brlan.Anim[i].add(Brlan.BrlanAnimClass(Brlan.A_COORD))
brlan.Anim[i][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_X))
brlan.Anim[i][Brlan.A_COORD].add(Brlan.BrlanAnim(Brlan.C_Y))
brlan.Anim['wavea'][Brlan.A_COORD][Brlan.C_X].repsimple(0, 960, 2, -130, 0, 130, 0)
brlan.Anim['waveb'][Brlan.A_COORD][Brlan.C_X].repsimple(0, 960, 2, -130, 2.0, 130, 2.0)
brlan.Anim['wavea'][Brlan.A_COORD][Brlan.C_Y].repsimple(0, 960, 3, -5, 0, 1, 0)
brlan.Anim['waveb'][Brlan.A_COORD][Brlan.C_Y].repsimple(0, 960, 4, -3, 0, 3, 0)
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((0, -75, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((0, 27, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((100, 0, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((100, 29, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((200, 50, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((200, 27, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((400, -75, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((400, 27, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((500, -40, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((500, 30, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((600, -40, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((600, 30, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((750, 15, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((750, 28, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_X].Triplets.append((960, -75, 0.2))
brlan.Anim['wave1a'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((960, 27, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((0, 65, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((0, 27, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((120, 10, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((120, 29, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((190, 65, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((190, 27, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((430, 20, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((430, 27, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((510, -20, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((510, 30, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((670, -40, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((670, 30, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((710, 0, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((710, 28, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_X].Triplets.append((960, 65, 0.2))
brlan.Anim['wave1b'][Brlan.A_COORD][Brlan.C_Y].Triplets.append((960, 27, 0.2))
brlan.Anim['shadow'][Brlan.A_COORD][Brlan.C_Y].repsimple(0, 960, 4, 21, -0.1, 25, -0.1)
brlan.Anim['shadow'][Brlan.A_COORD][Brlan.C_X].repsimple(0, 960, 2, -45, -0.1, 45, -0.1)
bradata = brlan.Pack(60*16)
for a,b,c in brlan.Anim['waveb'][Brlan.A_COORD][Brlan.C_X].Triplets:
print a,b,c
open(sys.argv[2],"w").write(bradata)

View File

@@ -0,0 +1,11 @@
#-----------------------
# texture x y
#-----------------------
white.png 1 1
icon_fade.png 1 0
icon_title.png 0 0
icon_wave1a.png 0 0
icon_wave1b.png 0 0
icon_wavea.png 1 0
icon_waveb.png 1 0
icon_shape2.png 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

9
channel/banner/names.txt Normal file
View File

@@ -0,0 +1,9 @@
jp=Homebrewチャンネル
en=Homebrew Channel
de=Homebrewkanal
fr=Chaîne Homebrew
sp=Canal Homebrew
it=Canale Homebrew
nl=Homebrewkanaal
cn=Homebrew频道
ko=Homebrew 채널

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,19 @@
CFLAGS = -O3 -Wall -I/usr/local/include -L/usr/local/lib
CC = $(PREFIX)gcc
STRIP = $(PREFIX)strip
all: mkbns$(EXE) png2tpl$(EXE) lz77$(EXE)
mkbns$(EXE): mkbns.c
$(CC) $(CFLAGS) -o mkbns mkbns.c -lm
png2tpl$(EXE): png2tpl.c
$(CC) $(CFLAGS) -o png2tpl png2tpl.c -lpng
lz77$(EXE): lz77.c
$(CC) $(CFLAGS) -o lz77 lz77.c
clean:
rm -f mkbns$(EXE) png2tpl$(EXE) lz77$(EXE)

View File

@@ -0,0 +1,13 @@
import md5, sys, struct
data= open(sys.argv[1]).read()
digest = md5.new(data).digest()
hdr = struct.pack(">4sI8x","IMD5",len(data))
f2 = open(sys.argv[2],"w")
f2.write(hdr)
f2.write(digest)
f2.write(data)
f2.close()

View File

@@ -0,0 +1,48 @@
import os, sys, struct, md5
output, datafile, iconarc, bannerarc, soundbns, namesfile = sys.argv[1:]
data = open(datafile,"r").read()
names={}
for i in open(namesfile,"r"):
a,b = i.split("=")
while b[-1] == "\n":
b = b[:-1]
b = b.replace("\\n","\n")
names[a] = b.decode("utf-8")
def getsize(x):
return os.stat(x).st_size
def pad(x,l):
if len(x) > l:
raise ValueError("%d > %d",len(x),l)
n = l-len(x)
return x + "\x00"*n
imet = "\x00"*0x40
imet += struct.pack(">4sIIIIII","IMET",0x600,3,getsize(iconarc),getsize(bannerarc),getsize(soundbns),1)
for i in ["jp", "en", "de", "fr", "sp", "it", "nl", "cn", None, "ko"]:
try:
imet += pad(names[i].encode("UTF-16BE"),0x54)
except KeyError:
imet += "\x00"*0x54
imet += "\x00"*(0x600 - len(imet))
imet = imet[:-16] + md5.new(imet).digest()
open(output,"w").write(imet)
f = open(sys.argv[1],"w")
f.write(imet)
f.write(data)
fsize = f.tell()
if (fsize % 20) != 0:
f.write("\x00"*(20-(fsize%20)))
f.close()

273
channel/banner/tools/lz77.c Normal file
View File

@@ -0,0 +1,273 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
/*Altered by Kuwanger*/
/*************************************************************************
* Name: lz.c
* Author: Marcus Geelnard
* Description: LZ77 coder/decoder implementation.
* Reentrant: Yes
* $Id: lz.c,v 1.4 2004/10/08 19:28:04 marcus256 Exp $
*
* The LZ77 compression scheme is a substitutional compression scheme
* proposed by Abraham Lempel and Jakob Ziv in 1977. It is very simple in
* its design, and uses no fancy bit level compression.
*
* This is my first attempt at an implementation of a LZ77 code/decoder.
*
* The principle of the LZ77 compression algorithm is to store repeated
* occurrences of strings as references to previous occurrences of the same
* string. The point is that the reference consumes less space than the
* string itself, provided that the string is long enough (in this
* implementation, the string has to be at least 4 bytes long, since the
* minimum coded reference is 3 bytes long). Also note that the term
* "string" refers to any kind of byte sequence (it does not have to be
* an ASCII string, for instance).
*
* The coder uses a brute force approach to finding string matches in the
* history buffer (or "sliding window", if you wish), which is very, very
* slow. I recon the complexity is somewhere between O(n^2) and O(n^3),
* depending on the input data.
*
* There is also a faster implementation that uses a large working buffer
* in which a "jump table" is stored, which is used to quickly find
* possible string matches (see the source code for LZ_CompressFast() for
* more information). The faster method is an order of magnitude faster,
* and also does a full string search in the entire input buffer (it does
* not use a sliding window).
*
* The upside is that decompression is very fast, and the compression ratio
* is often very good.
*
* The reference to a string is coded as a (length,offset) pair, where the
* length indicates the length of the string, and the offset gives the
* offset from the current data position. To distinguish between string
* references and literal strings (uncompressed bytes), a string reference
* is preceded by a marker byte, which is chosen as the least common byte
* symbol in the input data stream (this marker byte is stored in the
* output stream as the first byte).
*
* Occurrences of the marker byte in the stream are encoded as the marker
* byte followed by a zero byte, which means that occurrences of the marker
* byte have to be coded with two bytes.
*
* The lengths and offsets are coded in a variable length fashion, allowing
* values of any magnitude (up to 4294967295 in this implementation).
*
* With this compression scheme, the worst case compression result is
* (257/256)*insize + 1.
*
*-------------------------------------------------------------------------
* Copyright (c) 2003-2004 Marcus Geelnard
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would
* be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
* Marcus Geelnard
* marcus.geelnard at home.se
*************************************************************************/
/*************************************************************************
* Constants used for LZ77 coding
*************************************************************************/
/* Maximum offset (can be any size < 2^32). Lower values gives faster
compression, while higher values gives better compression.
NOTE: LZ_CompressFast does not use this constant. */
#define LZ_MAX_OFFSET 4096
/*************************************************************************
* INTERNAL FUNCTIONS *
*************************************************************************/
/*************************************************************************
* _LZ_StringCompare() - Return maximum length string match.
*************************************************************************/
static unsigned int _LZ_StringCompare( unsigned char * str1,
unsigned char * str2, unsigned int minlen, unsigned int maxlen )
{
unsigned int len;
for( len = minlen; (len < maxlen) && (str1[len] == str2[len]); ++ len );
// for( len = minlen; (len < maxlen) && (str2+len+1 < str1-1) && (str1[len] == str2[len]); ++ len );
return len;
}
/*************************************************************************
* PUBLIC FUNCTIONS *
*************************************************************************/
/*************************************************************************
* LZ_Compress() - Compress a block of data using an LZ77 coder.
* in - Input (uncompressed) buffer.
* out - Output (compressed) buffer. This buffer must be 0.4% larger
* than the input buffer, plus one byte.
* insize - Number of input bytes.
* The function returns the size of the compressed data.
*************************************************************************/
int LZ_Compress( unsigned char *in, unsigned char *out,
unsigned int insize )
{
unsigned char mask, bundle1, bundle2;
int inpos, outpos, bytesleft;
int maxoffset, offset, bestoffset;
int maxlength, length, bestlength;
unsigned char *ptr1, *ptr2, *flags;
/* Do we have anything to compress? */
if( insize < 1 )
{
return 0;
}
/* Remember the repetition marker for the decoder */
out[0] = 0x10;
out[1] = insize&0xFF;
out[2] = (insize>>8)&0xFF;
out[3] = (insize>>16)&0xFF;
flags = &out[4];
*flags = 0;
mask = 128;
/* Start of compression */
inpos = 0;
outpos = 5;
/* Main compression loop */
bytesleft = insize;
do
{
/* Determine most distant position */
if( inpos > LZ_MAX_OFFSET ) maxoffset = LZ_MAX_OFFSET;
else maxoffset = inpos;
/* Get pointer to current position */
ptr1 = &in[ inpos ];
/* Search history window for maximum length string match */
bestlength = 2;
bestoffset = 0;
for( offset = 3; offset <= maxoffset; ++ offset )
{
/* Get pointer to candidate string */
ptr2 = &ptr1[ -offset ];
/* Quickly determine if this is a candidate (for speed) */
if( (ptr1[ 0 ] == ptr2[ 0 ]) &&
(ptr1[ bestlength ] == ptr2[ bestlength ]) )
{
/* Determine maximum length for this offset */
maxlength = ((inpos+1) > 18 ? 18 : inpos + 1);
/* Count maximum length match at this offset */
length = _LZ_StringCompare( ptr1, ptr2, 0, maxlength );
/* Better match than any previous match? */
if( length > bestlength )
{
bestlength = length;
bestoffset = offset;
}
}
}
/* Was there a good enough match? */
if( bestlength > 2)
{
*flags |= mask;
mask >>= 1;
bundle2 = ((bestlength-3)<<4) | (((bestoffset-1)&0xF00)>>8);
bundle1 = (bestoffset-1)&0xFF;
out [ outpos++ ] = bundle2;
out [ outpos++ ] = bundle1;
inpos += bestlength;
bytesleft -= bestlength;
if (!mask) {
mask = 128;
flags = &out [ outpos++ ];
*flags = 0;
}
}
else
{
mask >>= 1;
out[ outpos ++ ] = in[ inpos++ ];
-- bytesleft;
if (!mask) {
mask = 128;
flags = &out [ outpos++ ];
*flags = 0;
}
}
}
while( bytesleft > 3 );
/* Dump remaining bytes, if any */
while( inpos < insize )
{
out[ outpos ++ ] = in[ inpos++ ];
}
while(outpos&3)
out [ outpos ++] = 0;
return outpos;
}
int main(int argc, char *argv[])
{
int in, out, size;
struct stat buf;
unsigned char *uncompressed, *compressed;
if (argc == 3) {
in = open(argv[1], O_RDONLY);
out = creat(argv[2], 0600);
fstat(in, &buf);
uncompressed = malloc(buf.st_size);
read(in, uncompressed, buf.st_size);
close(in);
compressed = malloc(buf.st_size*2);
size = LZ_Compress(uncompressed, compressed, buf.st_size);
write(out, "LZ77", 4);
write(out, compressed, size);
close(out);
free(compressed);
free(uncompressed);
return 0;
}
printf("Usage: %s file.bin file.lz77\n", argv[0]);
return 1;
}

View File

@@ -0,0 +1,353 @@
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#if 0
uint16_t deftbl[16] = {
2048, 0,
4096, -2048,
0, 0,
1536, 512,
1920, 0,
2176, 0,
3680, -1664,
3136, -1856
};
#endif
#if 0
int16_t deftbl[16] = {
2048, 0,
0,0,
0,0,
0,0,
0,0,
0,0,
0,0,
0,0,
};
#endif
int16_t deftbl[16] = {
674,1040,
3598,-1738,
2270,-583,
3967,-1969,
1516,381,
3453, -1468,
2606, -617,
3795, -1759,
};
typedef struct {
uint32_t fourcc;
uint32_t unk;
uint32_t filesize;
uint16_t unk1,unk2;
uint32_t infooff;
uint32_t infosize;
uint32_t dataoff;
uint32_t datasize;
} bnshdr;
typedef struct {
uint32_t fourcc;
uint32_t size;
uint16_t looped;
uint16_t unk2;
uint16_t srate;
uint16_t unk3;
uint32_t looppoint;
uint32_t samples;
uint32_t unknown1[6];
uint32_t start1;
uint32_t start2;
uint32_t unknown2[2];
int16_t tbl1[16];
uint16_t unka1[8];
int16_t tbl2[16];
uint16_t unka2[8];
} bnsinfo;
float tables[2][16];
typedef struct {
uint32_t fourcc;
uint32_t size;
} bnsdatahdr;
#define SWAB16(x) ((((x)>>8)&0xFF) | (((x)&0xFF)<<8))
#define SWAB32(x) ((SWAB16((x)&0xFFFF)<<16)|(SWAB16(((x)>>16)&0xFFFF)))
#define ISWAB16(x) x=SWAB16(x)
#define ISWAB32(x) x=SWAB32(x)
typedef struct {
int16_t l;
int16_t r;
} sample;
int16_t lsamps[2][2] = {{0,0},{0,0}};
int16_t rlsamps[2][2] = {{0,0},{0,0}};
#define CLAMP(a,min,max) (((a)>(max))?(max):(((a)<(min))?(min):(a)))
void unpack_adpcm(int idx, int16_t *table, uint8_t *data, int16_t *outbuf)
{
int32_t index = (data[0] >> 4) & 0x7; //highest bit of byte is ignored
uint32_t exponent = 28 - (data[0] & 0xf);
int32_t factor1 = table[2*index];
int32_t factor2 = table[2*index + 1];
int i;
int32_t sample;
for(i=0;i<14;i++) {
sample = data[1+(i/2)];
if(!(i&1)) {
sample = (sample&0xf0)<<24;
} else {
sample = (sample)<<28;
}
sample = ((lsamps[idx][1]*factor1 + lsamps[idx][0]*factor2)>>11) + (sample>>exponent);
if(sample>32767) sample=32767;
if(sample<-32768) sample=-32768;
if(abs(sample)>20000) printf("dammit %d\n",sample);
outbuf[i] = sample;
lsamps[idx][0] = lsamps[idx][1];
lsamps[idx][1] = outbuf[i];
}
}
uint8_t findexp(float residual, uint8_t *nybble)
{
uint8_t exp = 0;
while((residual > 7.5f) || (residual < -8.5f)) {
exp++;
residual /= 2;
}
if(nybble)
*nybble = CLAMP((int16_t)floor(residual),-8,7);
return exp;
}
uint8_t determine_std_exponent(int idx, int16_t *table, int index, int16_t *inbuf)
{
int32_t maxres = 0;
int32_t factor1 = table[2*index];
int32_t factor2 = table[2*index + 1];
int32_t predictor;
int32_t residual;
int i;
int16_t elsamps[2];
memcpy(elsamps,rlsamps[idx],sizeof(int16_t)*2);
for(i=0;i<14;i++) {
predictor = (elsamps[1]*factor1 + elsamps[0]*factor2)/2048;
residual = inbuf[i] - predictor;
if(residual > maxres) maxres = residual;
elsamps[0] = elsamps[1];
elsamps[1] = inbuf[i];
}
return findexp(maxres,NULL);
}
float compress_adpcm(int idx, int16_t *table, uint8_t tblidx, uint8_t *data, int16_t *inbuf, int16_t *lsamps) {
int32_t factor1 = table[2*tblidx];
int32_t factor2 = table[2*tblidx + 1];
int32_t predictor;
int32_t residual;
uint8_t exp;
int8_t nybble;
int i;
float error = 0;
exp = determine_std_exponent(idx, table, tblidx, inbuf);
while(exp<=15) {
memcpy(lsamps,rlsamps[idx],sizeof(int16_t)*2);
data[0] = exp | tblidx<<4;
error = 0;
for(i=0;i<14;i++) {
predictor = (lsamps[1]*factor1 + lsamps[0]*factor2)>>11;
residual = inbuf[i] - predictor;
residual = residual>>exp;
if((residual > 7) || (residual < -8)) {
exp++;
break;
}
nybble = CLAMP(residual,-8,7);
if(i&1) {
data[i/2+1] |= nybble&0xf;
} else {
data[i/2+1] = nybble<<4;
}
predictor += nybble<<exp;
lsamps[0] = lsamps[1];
lsamps[1] = CLAMP(predictor,-32768,32767);
error += powf(lsamps[1] - inbuf[i],2.0f);
}
if(i == 14) break;
}
return error;
}
void repack_adpcm(int idx, int16_t *table, uint8_t *data, int16_t *inbuf)
{
uint8_t tblidx;
uint8_t testdata[8];
int16_t tlsamps[2];
int16_t blsamps[2];
float error;
float besterror = 99999999.0f;
for(tblidx = 0; tblidx < 8; tblidx++) {
error = compress_adpcm(idx, table, tblidx, testdata, inbuf, tlsamps);
if(error < besterror) {
besterror = error;
memcpy(data, testdata, 8);
memcpy(blsamps, tlsamps, sizeof(int16_t)*2);
}
}
memcpy(rlsamps[idx], blsamps, sizeof(int16_t)*2);
}
int main(int argc, char **argv)
{
FILE *f;
FILE *f2 = NULL;
FILE *fo;
int i,j;
int16_t sampbuf[14];
bnshdr hdr;
bnsinfo info;
bnsdatahdr datahdr;
uint8_t *databuf;
uint8_t *data1;
uint8_t *data2;
sample *datain;
int samples;
int loop_pt = 0;
int blocks;
int separated_loop = 0;
if(argc > 4 && (atoi(argv[3]) == 1))
separated_loop = 1;
f = fopen(argv[1],"r");
fo = fopen(argv[2],"w");
fseek(f,0,SEEK_END);
samples = ftell(f)/(sizeof(uint16_t)*2);
if(separated_loop) {
f2 = fopen(argv[4],"r");
fseek(f2,0,SEEK_END);
loop_pt = samples;
samples += ftell(f2)/(sizeof(uint16_t)*2);
}
blocks = (samples+13)/14;
memset(&hdr,0,sizeof(hdr));
memset(&info,0,sizeof(info));
memset(&datahdr,0,sizeof(datahdr));
hdr.fourcc = 0x20534e42;
hdr.unk = SWAB32(0xfeff0100);
hdr.filesize = SWAB32(blocks * 16 + sizeof(hdr) + sizeof(info) + sizeof(datahdr));
hdr.unk1 = SWAB16(32);
hdr.unk2 = SWAB16(2);
hdr.infooff = SWAB32(sizeof(hdr));
hdr.infosize = SWAB32(sizeof(info));
hdr.dataoff = SWAB32(sizeof(hdr) + sizeof(info));
hdr.datasize = SWAB32(sizeof(datahdr) + blocks * 16);
info.fourcc = 0x4f464e49;
info.size = SWAB32(sizeof(info));
info.srate = SWAB16(32000);
if(argc > 3 && (atoi(argv[3]) == 1))
info.looped = SWAB16(1);
info.unk2 = SWAB16(0x200);
info.looppoint = SWAB32(loop_pt);
info.samples = SWAB32(samples);
info.unknown1[0] = SWAB32(0x18);
info.unknown1[1] = SWAB32(0x00);
info.unknown1[2] = SWAB32(0x20);
info.unknown1[3] = SWAB32(0x2c);
info.unknown1[4] = SWAB32(0x00);
info.unknown1[5] = SWAB32(0x38);
info.unknown2[0] = SWAB32(0x68);
info.unknown2[1] = SWAB32(0x00);
info.start1 = SWAB32(0);
info.start2 = SWAB32(blocks * 8);
for(i=0;i<16;i++) {
info.tbl1[i] = SWAB16((int16_t)(deftbl[i]));
info.tbl2[i] = SWAB16((int16_t)(deftbl[i]));
}
datahdr.fourcc = 0x41544144;
datahdr.size = SWAB32(blocks * 16);
fwrite(&hdr,sizeof(hdr),1,fo);
fwrite(&info,sizeof(info),1,fo);
fwrite(&datahdr,sizeof(datahdr),1,fo);
datain = malloc(sizeof(uint16_t)*2*blocks*14);
memset(datain,0,sizeof(uint16_t)*2*blocks*14);
databuf = malloc(blocks * 16);
data1 = databuf;
data2 = databuf + blocks * 8;
if(separated_loop) {
fseek(f,0,SEEK_SET);
fread(datain,sizeof(uint16_t)*2,loop_pt,f);
fseek(f2,0,SEEK_SET);
fread(&datain[loop_pt],sizeof(uint16_t)*2,samples-loop_pt,f2);
fclose(f);
fclose(f2);
} else {
fseek(f,0,SEEK_SET);
fread(datain,sizeof(uint16_t)*2,samples,f);
fclose(f);
}
printf("Samples: 0x%x\n",samples);
printf("Blocks: 0x%x Size ADPCM: 0x%x Size PCM: 0x%x\n",blocks,blocks*8,blocks*14);
if(separated_loop)
printf("Loop point: 0x%x samples\n",loop_pt);
for(i=0;i<blocks;i++) {
//printf("Block %d\n",i);
for(j=0;j<14;j++) {
sampbuf[j] = datain[i*14+j].l;
}
repack_adpcm(0,deftbl,data1,sampbuf);
//unpack_adpcm(0,deftbl,data1,sampbuf);
for(j=0;j<14;j++) {
sampbuf[j] = datain[i*14+j].r;
}
repack_adpcm(1,deftbl,data2,sampbuf);
//unpack_adpcm(1,deftbl,data2,sampbuf);
data1 += 8;
data2 += 8;
}
fwrite(databuf, blocks*16, 1, fo);
fclose(fo);
free(datain); free(databuf);
return 0;
}

View File

@@ -0,0 +1,221 @@
#include <stdio.h>
#include <png.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
struct tpl_hdr {
uint32_t magic;
uint32_t ntextures;
uint32_t hdrsize;
};
struct tpl_tex {
uint32_t hdroff;
uint32_t pltoff;
};
struct tpl_texhdr {
uint16_t height;
uint16_t width;
uint32_t format;
uint32_t offset;
uint32_t wraps;
uint32_t wrapt;
uint32_t minfilter;
uint32_t maxfilter;
float lodbias;
uint8_t edgelod;
uint8_t minlod;
uint8_t maxlod;
uint8_t unpacked;
};
#define SWAB16(x) ((((x)>>8)&0xFF) | (((x)&0xFF)<<8))
#define SWAB32(x) ((SWAB16(((uint32_t)(x))&0xFFFF)<<16)|(SWAB16((((uint32_t)(x))>>16)&0xFFFF)))
#define ISWAB16(x) x=SWAB16(x)
#define ISWAB32(x) x=SWAB32(x)
#define ALIGN(x) (((x)+31)&(~31))
void do_ia8(int width, int height, FILE *fp, uint8_t **row_pointers) {
uint16_t **in = (uint16_t **)row_pointers;
int wo, ho, wt, i, j;
uint16_t *out;
wo = (width + 3) & ~3;
ho = (height + 3) & ~3;
wt = wo/4;
out = malloc(wo*ho*2);
memset(out,0,wo*ho*2);
for(i=0; i<height; i++) {
for(j=0; j<width; j++) {
int tx,ty,opos;
tx = j / 4;
ty = i / 4;
opos = (tx*16) + (ty*16*wt) + j%4 + (i%4)*4;
out[opos] = in[i][j];
}
}
fwrite(out,2,wo*ho,fp);
}
void do_rgb565(int width, int height, FILE *fp, uint8_t **row_pointers) {
uint8_t **in = (uint8_t **)row_pointers;
int wo, ho, wt, i, j;
uint16_t *out;
wo = (width + 3) & ~3;
ho = (height + 3) & ~3;
wt = wo/4;
out = malloc(wo*ho*2);
memset(out,0,wo*ho*2);
for(i=0; i<height; i++) {
for(j=0; j<width; j++) {
int tx,ty,opos;
tx = j / 4;
ty = i / 4;
opos = (tx*16) + (ty*16*wt) + j%4 + (i%4)*4;
out[opos] = SWAB16((in[i][j*3]<<8) & 0xF800);
out[opos] |= SWAB16((in[i][j*3+1]<<3) & 0x07E0);
out[opos] |= SWAB16((in[i][j*3+2]>>3) & 0x001F);
}
}
fwrite(out,2,wo*ho,fp);
}
void do_i8(int width, int height, FILE *fp, uint8_t **in) {
int wo, ho, wt, i, j;
uint8_t *out;
wo = (width + 7) & ~7;
ho = (height + 3) & ~3;
wt = wo/8;
out = malloc(wo*ho);
memset(out,0,wo*ho);
for(i=0; i<height; i++) {
for(j=0; j<width; j++) {
int tx,ty,opos;
tx = j / 8;
ty = i / 4;
opos = (tx*32) + (ty*32*wt) + j%8 + (i%4)*8;
out[opos] = in[i][j];
}
}
fwrite(out,1,wo*ho,fp);
}
void do_rgba8(int width, int height, FILE *fp, uint8_t **row_pointers) {
uint32_t **in = (uint32_t **)row_pointers;
int wo, ho, wt, i, j;
uint16_t *out;
wo = (width + 3) & ~3;
ho = (height + 3) & ~3;
wt = wo/4;
out = malloc(wo*ho*4);
memset(out,0,wo*ho*4);
for(i=0; i<height; i++) {
for(j=0; j<width; j++) {
int tx,ty,opos;
tx = j / 4;
ty = i / 4;
opos = (tx*32) + (ty*32*wt) + j%4 + (i%4)*4;
out[opos] = (in[i][j]&0xFFFF);
out[opos+16] = (in[i][j]>>16);
}
}
fwrite(out,2,wo*ho*2,fp);
}
int main(int argc, char **argv)
{
png_structp png_ptr = png_create_read_struct
(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(png_ptr);
if (setjmp(png_jmpbuf(png_ptr)))
{
printf("PNG error\n");
return 1;
}
FILE *fp = fopen(argv[1],"rb");
png_init_io(png_ptr, fp);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_PACKING|PNG_TRANSFORM_EXPAND|PNG_TRANSFORM_STRIP_16|PNG_TRANSFORM_SWAP_ALPHA, NULL);
uint8_t **row_pointers = png_get_rows(png_ptr, info_ptr);
png_uint_32 width, height;
int bit_depth, color_type, filter_method, compression_type, interlace_type;
png_get_IHDR(png_ptr, info_ptr, &width, &height,
&bit_depth, &color_type, &interlace_type,
&compression_type, &filter_method);
printf("Texture: %d x %d\n",(int)width,(int)height);
FILE *fo = fopen(argv[2],"wb");
struct tpl_hdr tplhdr;
tplhdr.magic = SWAB32(0x0020af30);
tplhdr.ntextures = SWAB32(1);
tplhdr.hdrsize = SWAB32(sizeof(struct tpl_hdr));
fwrite(&tplhdr,sizeof(struct tpl_hdr),1,fo);
struct tpl_tex tpltex;
tpltex.hdroff = SWAB32(ftell(fo) + sizeof(struct tpl_tex));
tpltex.pltoff = SWAB32(0);
fwrite(&tpltex,sizeof(struct tpl_tex),1,fo);
struct tpl_texhdr texhdr;
memset(&texhdr,0,sizeof(struct tpl_texhdr));
texhdr.width = SWAB16(width);
texhdr.height = SWAB16(height);
texhdr.offset = SWAB32(ALIGN(ftell(fo) + sizeof(struct tpl_texhdr)));
texhdr.minfilter = SWAB32(1);
texhdr.maxfilter = SWAB32(1);
texhdr.wraps = SWAB32(atoi(argv[3]));
texhdr.wrapt = SWAB32(atoi(argv[4]));
switch(color_type) {
case PNG_COLOR_TYPE_GRAY_ALPHA:
texhdr.format = SWAB32(3); //IA8
fwrite(&texhdr,sizeof(struct tpl_texhdr),1,fo);
fseek(fo,SWAB32(texhdr.offset),SEEK_SET);
do_ia8(width, height, fo,row_pointers);
break;
case PNG_COLOR_TYPE_GRAY:
texhdr.format = SWAB32(1); //I8
fwrite(&texhdr,sizeof(struct tpl_texhdr),1,fo);
fseek(fo,SWAB32(texhdr.offset),SEEK_SET);
do_i8(width, height, fo,row_pointers);
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
texhdr.format = SWAB32(6); //ARGB
fwrite(&texhdr,sizeof(struct tpl_texhdr),1,fo);
fseek(fo,SWAB32(texhdr.offset),SEEK_SET);
do_rgba8(width, height, fo,row_pointers);
break;
case PNG_COLOR_TYPE_RGB:
texhdr.format = SWAB32(4); //RGB565
fwrite(&texhdr,sizeof(struct tpl_texhdr),1,fo);
fseek(fo,SWAB32(texhdr.offset),SEEK_SET);
do_rgb565(width, height, fo,row_pointers);
break;
}
return 0;
}