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

14
channel/Makefile Normal file
View File

@@ -0,0 +1,14 @@
.PHONY: clean installer
all:
@$(MAKE) -C channelapp channel
@$(MAKE) -C banner
@$(MAKE) -C title
clean:
@$(MAKE) -C channelapp clean
@$(MAKE) -C banner clean
@$(MAKE) -C title clean
@$(MAKE) -C wiiload clean
@$(MAKE) -C wiiload clean WIN32=1

69
channel/README Normal file
View File

@@ -0,0 +1,69 @@
The Homebrew Channel v1.1.2
Copyright (C) 2007-2012 Team Twiizers, all rights reserved.
All rights reserved; do not redistribute
Update instructions:
If you have previously installed The Homebrew Channel, you can update it. If
this is the first time you are installing it, see README.txt for installation
instructions. The easiest way to update is using the built-in online update
functionality. Simply configure the WiFi network settings for your Wii for
proper Internet connectivity, and boot up the channel. If the connection is
established, you'll see an opaque white (not semitransparent) world icon
in the lower right corner, and an update prompt will automatically appear.
Accept it to begin downloading the update. If you cannot or do not want to
connect your Wii to the Internet, simply run the boot.elf file using any
homebrew booting method. For example, you can upload it using wiiload or
you can make a directory inside /apps (for example, /apps/Update) and copy
boot.elf there. Then, simply run it from the previous version of The Homebrew
Channel.
Adding and customizing apps:
All user applications should be stored in their own subdirectory inside of
apps/; some examples have been provided. Each subdirectory should have at
least three files; ScummVM will be used as an example.
* apps/ScummVM/boot.elf main executable to be loaded
* apps/ScummVM/icon.png icon to be displayed in The Homebrew Channel
Menu; should be 128 x 48 pixels
* apps/ScummVM/meta.xml XML description of the channel. This format
might change for future releases of The
Homebrew channel, but we will try to remain
backwards-compatible. See
http://wiibrew.org/wiki/Homebrew_Channel
for information on what data should be included
in this file.
Staying current with new releases:
Relax, you will not need to do anything to keep up with new releases of the
Homebrew Channel. When a new version is available, a message will appear
giving you the option to download and install the new version, if your Wii
is configured to connect to the Internet.
Uninstallation:
You may uninstall the channel as you would any other channel, by using the Data
Management screen of the Wii Menu. Erasing every last trace of The Homebrew
Channel is not practical on a complex system such as the Wii. If a need
arises, we will develop a more thorough uninstaller application.
Reminder about elf files:
Old ELF files were incorrect and will not work. Please use DOL files or
recompile with the latest version of devkitPPC. You can use the following
command to convert a broken ELF file to a DOL file:
powerpc-gekko-objcopy -O binary boot.elf boot.dol

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;
}

10
channel/channelapp/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
stub.bin
*.dol
*.elf
.*.swp
dist
build
i18n/merge
i18n/*.gen
*.map

230
channel/channelapp/Makefile Normal file
View File

@@ -0,0 +1,230 @@
#pngcrush -rem iTXt -rem tEXt -d out *.png
PREFIX = $(DEVKITPPC)/bin/powerpc-eabi-
CC = $(PREFIX)gcc
AS = $(PREFIX)as
OBJCOPY = $(PREFIX)objcopy
ELF2DOL =$(DEVKITPPC)/bin/elf2dol
GDB = $(PREFIX)gdb
BIN2S = $(DEVKITPPC)/bin/bin2s
TARGET_STUB = stub
TARGET_APP = channelapp
TARGET_CHAN = channelapp-channel
WIIPAX = ../../wiipax/client/wiipax
BASE_ADDR = 0x81330000
DIR_STUB = stub
DIR_SRC = source
DIR_DATA = data
DIR_DATA_CRYPT = $(DIR_DATA)/crypt
DIR_I18N = i18n
DIR_BUILD = build
DIR_BUILD_CHAN = $(DIR_BUILD)/channel
DIR_INCLUDES = $(DIR_BUILD) \
$(DEVKITPRO)/libogc/include \
$(DEVKITPRO)/3rd/include \
$(DEVKITPRO)/3rd/include/freetype2
DIR_LIBS = \
$(DEVKITPRO)/libogc/lib/wii \
$(DEVKITPRO)/3rd/lib
LIBS = fat wiiuse bte mxml png15 z ogc m db freetype
MACHDEP = -g -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float
CFLAGS = $(MACHDEP) -Os -Wall -DBASE_ADDR=$(BASE_ADDR) $(DIR_INCLUDES:%=-I%)
# using -Os for the stub makes it dependent on libgcc
CFLAGS_STUB = $(MACHDEP) -O2 -Wall -DBASE_ADDR=$(BASE_ADDR) $(DIR_INCLUDES:%=-I%)
ASFLAGS = -D_LANGUAGE_ASSEMBLY -DHW_RVL
LDFLAGS_STUB = $(MACHDEP) -Wl,--section-start,.init=0x80001800 -nostartfiles -nodefaultlibs
LDFLAGS_APP = $(MACHDEP) -specs=newrvl.spec -Wl,--section-start,.init=$(BASE_ADDR) \
$(DIR_LIBS:%=-L%) $(LIBS:%=-l%) -Wl,-Map,channelapp.map
LDFLAGS_CHAN = $(MACHDEP) -specs=newrvl.spec -Wl,--section-start,.init=$(BASE_ADDR) -Wl,-e,_stub_start $(DIR_LIBS:%=-L%) $(LIBS:%=-l%) -Wl,-Map,channelapp_chan.map
FILES_STUB = $(wildcard $(DIR_STUB)/*.S) $(wildcard $(DIR_STUB)/*.c)
FILES_STUB_OBJx = $(FILES_STUB:$(DIR_STUB)/%.S=$(DIR_BUILD)/%.o)
FILES_STUB_OBJ = $(FILES_STUB_OBJx:$(DIR_STUB)/%.c=$(DIR_BUILD)/%.o)
BANNER_BIN = banner/banner.bin
BANNER_OBJ = $(DIR_BUILD)/banner_bin.o
FILES_TTF = $(wildcard $(DIR_DATA)/*.ttf)
FILES_TTF_OBJ = $(FILES_TTF:$(DIR_DATA)/%.ttf=$(DIR_BUILD)/%_ttf.o)
FILES_PNG = $(wildcard $(DIR_DATA)/*.png)
FILES_PNG_OBJ = $(FILES_PNG:$(DIR_DATA)/%.png=$(DIR_BUILD)/%_png.o)
POTPL = $(DIR_I18N)/template.pot
POTPL_MRG = $(DIR_I18N)/template.merge.pot
FILES_PO = $(wildcard $(DIR_I18N)/*.po)
FILES_PO_ENC = $(FILES_PO:$(DIR_I18N)/%.po=$(DIR_BUILD)/%.enc.po)
FILES_MO = $(FILES_PO_ENC:$(DIR_BUILD)/%.enc.po=$(DIR_BUILD)/%.mo)
FILES_MO_OBJ = $(FILES_MO:$(DIR_BUILD)/%.mo=$(DIR_BUILD)/%_mo.o)
ENCODING = utf-8
FILES_PO_MRG = $(FILES_PO:$(DIR_I18N)/%.po=$(DIR_I18N)/merge/%.po)
FILES_SRC = $(wildcard $(DIR_SRC)/*.c)
FILES_SRC_OBJ = $(FILES_SRC:$(DIR_SRC)/%.c=$(DIR_BUILD)/%.o) \
$(DIR_BUILD)/$(TARGET_STUB)_bin.o $(BANNER_OBJ) \
$(FILES_PNG_OBJ) $(FILES_MO_OBJ) $(FILES_TTF_OBJ)
FILES_CHAN = $(DIR_CHAN)/nandloader.S
FILES_CHAN_OBJ = $(DIR_BUILD)/nandloader.o $(FILES_SRC_OBJ)
.PHONY: all channel world clean upload gdb debug
all:
@[ -d $(DIR_BUILD) ] || mkdir $(DIR_BUILD)
@$(MAKE) --no-print-directory data
@$(MAKE) --no-print-directory $(TARGET_APP).elf
channel:
@$(MAKE) --no-print-directory all
@$(MAKE) --no-print-directory $(TARGET_CHAN).dol
world:
@$(MAKE) --no-print-directory all
@$(MAKE) --no-print-directory $(TARGET_CHAN).dol
data: $(BANNER_OBJ) $(FILES_PNG_OBJ) $(FILES_MO_OBJ) \
$(FILES_PNG_INT_OBJ) $(FILES_INT_OBJ) \
$(FILES_TTF_OBJ)
%.bin: %.elf
@echo $(@F)
@$(OBJCOPY) -O binary $< $@
%.dol: %.elf $(ELF2DOL)
@echo $(@F)
@$(ELF2DOL) $< $@
$(TARGET_STUB).elf: $(FILES_STUB_OBJ)
@echo $(@F)
@$(CC) $(FILES_STUB_OBJ) $(LDFLAGS_STUB) -o $@
$(TARGET_APP)_nopax.elf: $(FILES_SRC_OBJ) newrvl.ld
@echo $(@F)
@$(CC) $(FILES_SRC_OBJ) $(LDFLAGS_APP) -o $@
$(TARGET_APP).elf: $(TARGET_APP)_nopax.elf
@$(WIIPAX) -s devkitfail $< $@
$(TARGET_CHAN).elf: $(TARGET_APP)_nopax.elf
@echo $(@F)
@$(WIIPAX) -s dkfailchannel $< $@
$(DIR_BUILD)/$(TARGET_STUB)_bin.o: $(TARGET_STUB).bin
@echo $(@F)
@$(BIN2S) -a 32 $< | $(AS) -o $@
$(BANNER_BIN):
@$(MAKE) -C banner
$(BANNER_OBJ): $(BANNER_BIN)
@echo $(@F)
@$(BIN2S) -a 32 $< | $(AS) -o $@
@echo "extern const u8 $(<F:%.bin=%_bin)[];" > $(@:%.o=%.h)
@echo "extern const u8 $(<F:%.bin=%_bin)_end;" >> $(@:%.o=%.h)
@echo "extern const u32 $(<F:%.bin=%_bin)_size;" >> $(@:%.o=%.h)
$(DIR_BUILD)/%_png.o: $(DIR_DATA)/%.png
@echo $(@F)
@$(BIN2S) -a 32 $< | $(AS) -o $@
@echo "extern const u8 $(<F:%.png=%_png)[];" > $(@:%.o=%.h)
@echo "extern const u8 $(<F:%.png=%_png)_end;" >> $(@:%.o=%.h)
@echo "extern const u32 $(<F:%.png=%_png)_size;" >> $(@:%.o=%.h)
$(DIR_BUILD)/%_ttf.o: $(DIR_DATA)/%.ttf
@echo $(@F)
@$(BIN2S) -a 32 $< | $(AS) -o $@
@echo "extern const u8 $(<F:%.ttf=%_ttf)[];" > $(@:%.o=%.h)
@echo "extern const u8 $(<F:%.ttf=%_ttf)_end;" >> $(@:%.o=%.h)
@echo "extern const u32 $(<F:%.ttf=%_ttf)_size;" >> $(@:%.o=%.h)
$(DIR_BUILD)/%_mo.o: $(DIR_BUILD)/%.mo
@echo $(@F)
@$(BIN2S) -a 32 $< | $(AS) -o $@
@echo "extern const u8 $(<F:%.mo=%_mo)[];" > $(@:%.o=%.h)
@echo "extern const u8 $(<F:%.mo=%_mo)_end;" >> $(@:%.o=%.h)
@echo "extern const u32 $(<F:%.mo=%_mo)_size;" >> $(@:%.o=%.h)
$(DIR_BUILD)/%.o: $(DIR_INT)/%
@echo $(@F)
@$(BIN2S) -a 32 $< | $(AS) -o $@
@echo "extern const u8 $(subst .,_,$(<F))[];" > $(@:%.o=%.h)
@echo "extern const u8 $(subst .,_,$(<F))_end;" >> $(@:%.o=%.h)
@echo "extern const u32 $(subst .,_,$(<F))_size;" >> $(@:%.o=%.h)
$(DIR_BUILD)/%.mo: $(DIR_BUILD)/%.enc.po
@echo $(@F)
@msgfmt --no-hash -o $@ $<
$(DIR_BUILD)/%.enc.po: $(DIR_I18N)/%.po
@echo $(@F)
@msgconv -t $(ENCODING) -o $@ $<
$(DIR_BUILD)/%.o: $(DIR_STUB)/%.c
@echo $(@F)
@$(CC) $(CFLAGS_STUB) -MMD -MP -MF $(@:%.o=%.d) -c $< -o $@
$(DIR_BUILD)/%.o: $(DIR_STUB)/%.S
@echo $(@F)
@$(CC) $(ASFLAGS) -c $< -o $@
$(DIR_BUILD)/%.o: $(DIR_SRC)/%.c
@echo $(@F)
@$(CC) $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) -c $< -o $@
-include $(FILES_SRC_OBJ:%.o=%.d)
clean:
rm -rf $(DIR_BUILD) \
*.elf *.dol *.bin *.map i18n/merge/* $(POTPL).gen
@$(MAKE) -C banner clean
wiiload:
@$(MAKE) --no-print-directory all
@$(DEVKITPPC)/bin/wiiload $(TARGET_APP).elf
upload: wiiload
$(POTPL).gen: source/*.c
@echo "GETTEXT $(POTPL).gen"
@xgettext --from-code=UTF-8 -C -o $(POTPL).gen --keyword=_ source/*.c
@sed -i.bak s/CHARSET/UTF-8/g $(POTPL).gen
$(POTPL): $(POTPL).gen
@echo "MERGE $(POTPL_MRG)"
@msgmerge $(POTPL) $(POTPL).gen > $(POTPL_MRG)
@mv -v $(POTPL_MRG) $(POTPL)
@rm $(POTPL).gen.bak
genmsgs: $(POTPL)
msgmerge: $(POTPL) $(FILES_PO_MRG)
movemerge:
@mv -v i18n/merge/* i18n
msgupdate: msgmerge movemerge msgstats
%.postats: %.po
@echo -n "$<: "
@msgfmt --statistics -o /dev/null $<
msgstats: $(FILES_PO:%.po=%.postats)
msgmergestats: msgmerge $(FILES_PO_MRG:%.po=%.postats)
$(DIR_I18N)/merge/%.po : $(DIR_I18N)/%.po $(POTPL)
@[ ! -d $(DIR_I18N)/merge ] && mkdir -p $(DIR_I18N)/merge || true
@echo "MERGE $(@F)"
@msgmerge -o $@ $(@:$(DIR_I18N)/merge/%.po=$(DIR_I18N)/%.po) $(POTPL)
gdb:
$(GDB) -n $(TARGET_APP)_nopax.elf
debug:
$(GDB) -n $(TARGET_APP)_nopax.elf -x gdb.txt

3
channel/channelapp/banner/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
twintig
banner.bin

View File

@@ -0,0 +1,11 @@
all: banner.bin
banner.bin: twintig title banner.ppm icon.ppm
@$(CURDIR)/twintig
twintig: twintig.c
@gcc -g -O2 -Wall $< -o $@
clean:
rm -f twintig banner.bin

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -0,0 +1,103 @@
// Copyright 2007,2008 Segher Boessenkool <segher@kernel.crashing.org>
// Licensed under the terms of the GNU GPL, version 2
// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define ERROR(s) do { fprintf(stderr, s "\n"); exit(1); } while (0)
// basic data types
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
void wbe16(u8 *p, u16 x) {
p[0] = x >> 8;
p[1] = x;
}
void wbe32(u8 *p, u32 x) {
wbe16(p, x >> 16);
wbe16(p + 2, x);
}
static int read_image(u8 *data, u32 w, u32 h, const char *name) {
FILE *fp;
u32 x, y;
u32 ww, hh;
fp = fopen(name, "rb");
if (!fp)
return -1;
if (fscanf(fp, "P6 %d %d 255\n", &ww, &hh) != 2)
ERROR("bad ppm");
if (ww != w || hh != h)
ERROR("wrong size ppm");
for (y = 0; y < h; y++)
for (x = 0; x < w; x++) {
u8 pix[3];
u16 raw;
u32 x0, x1, y0, y1, off;
x0 = x & 3;
x1 = x >> 2;
y0 = y & 3;
y1 = y >> 2;
off = x0 + 4 * y0 + 16 * x1 + 4 * w * y1;
if (fread(pix, 3, 1, fp) != 1)
ERROR("read");
raw = (pix[0] & 0xf8) << 7;
raw |= (pix[1] & 0xf8) << 2;
raw |= (pix[2] & 0xf8) >> 3;
raw |= 0x8000;
wbe16(data + 2*off, raw);
}
fclose(fp);
return 0;
}
int main(int argc, char **argv) {
FILE *in, *fp;
u8 header[0x72a0];
fp = fopen("banner.bin", "wb+");
if (!fp)
ERROR("open banner.bin");
memset(header, 0, sizeof header);
memcpy(header, "WIBN", 4);
header[9] = 2; // wtf
in = fopen("title", "rb");
if (!in)
ERROR("open title");
if (fread(header + 0x20, 0x80, 1, in) != 1)
ERROR("read title");
fclose(in);
if(read_image(header + 0xa0, 192, 64, "banner.ppm"))
ERROR("open banner.ppm");
if(read_image(header + 0x60a0, 48, 48, "icon.ppm"))
ERROR("open icon.ppm");
if (fwrite(header, 0x72a0, 1, fp) != 1)
ERROR("write header");
fclose(fp);
return 0;
}

143
channel/channelapp/config.h Normal file
View File

@@ -0,0 +1,143 @@
#ifndef _CONFIG_H_
#define _CONFIG_H_
#define CHANNEL_VERSION_DATE 201611230000llu
#define CHANNEL_VERSION_STR "1.1.3"
//#define DEBUG_APP
//#define DEBUG_STUB
#define ENABLE_WIDESCREEN
#define ENABLE_SCREENSHOTS
//#define ENABLE_UPDATES
//#define FORCE_LANG CONF_LANG_JAPANESE
#ifdef DEBUG_APP
void gprintf_enable(int enable);
int gprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
void hexdump(const void *d, int len);
void memstats(int reset);
#define CHKBUFACC(access, ptr, len) \
do { \
if ((access < ptr) || (access >= ptr + len)) \
gprintf("WARNING: buffer access out of range: %s:%d\n", __FILE__, __LINE__); \
} while (0)
#else
#define gprintf(...)
#define hexdump(...)
#define memstats(...)
#define gprintf_enable(...)
#define CHKBUFACC(...)
#endif
#define UPDATE_URL "http://example.com/update.sxml"
#define UPDATE_PUBLIC_KEY \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
#define USBGECKO_CHANNEL 1
#define STUB_MAGIC 0x4c4f41444b544858ull
#define STUB_ADDR_MAGIC ((u64 *) 0x80002f00)
#define STUB_ADDR_TITLE ((u64 *) 0x80002f08)
#define BOOTMII_IOS 254
#define TITLEID_BOOTMII (0x0000000100000000LL | BOOTMII_IOS)
#define PREFERRED IOS_GetPreferredVersion()
#define UNCHANGED IOS_GetVersion()
#define MY_TITLEID 0x000100014f484243ull
#define STUB_LOAD_IOS_VERSION UNCHANGED
#define APPS_IOS_VERSION PREFERRED
#define VIEW_Z_ORIGIN -420
#define GFX_ORIGIN_STACK_SIZE 16
// peak bubbles
#define MAX_BUBBLE_COUNT 20
// minimum bubbles
#define MIN_BUBBLE_COUNT 4
// cycle time in minutes
#define BUBBLE_TIME_CYCLE (60*24)
// time (in minutes, inside cycle) of minimum bubbles
#define BUBBLE_MIN_TIME (60*4)
// time (in minutes) offset from BUBBLE_MIN_TIME of maximum bubbles
#define BUBBLE_MAX_OFFSET (60*12)
// bubble size
#define BUBBLE_SIZE_MIN 0.4
#define BUBBLE_SIZE_MAX 1.0
// bubble pop radius modifier
#define BUBBLE_POP_RADIUS 0.8
// bubble pop generates this many bubbles
#define BUBBLE_POP_MAX 10
#define BUBBLE_POP_MIN 5
// bubble pop sub-bubble size
#define BUBBLE_POP_SIZE_MIN 0.2
#define BUBBLE_POP_SIZE_MAX 0.4
// bubble pop spread out range
#define BUBBLE_POP_SPREAD_X 40
#define BUBBLE_POP_SPREAD_Y 30
#define IRAND(max) ((int) ((float) (max) * (rand () / (RAND_MAX + 1.0))))
#define FRAND(max) ((max) * (rand () / (RAND_MAX + 1.0)))
#define WIDGET_DISABLED_COLOR 0xFFFFFF54
#define DIALOG_MASK_COLOR 0x101010a0
#define TEX_LAYER_WIDGETS 2
#define TEX_LAYER_DIALOGS 30
#define TEX_LAYER_CURSOR 80
#define APP_ENTRY_ICON_X 8
#define APP_ENTRY_ICON_Y 8
#define GRID_APP_ENTRY_ICON_X 8
#define GRID_APP_ENTRY_ICON_Y 8
#define APP_ENTRY_ICON_WIDTH 128
#define APP_ENTRY_ICON_HEIGHT 48
#define APP_ENTRY_TEXT1_X 156
#define APP_ENTRY_TEXT1_Y 8
#define APP_ENTRY_TEXT2_X 156
#define APP_ENTRY_TEXT2_Y 54
#define MAX_ENTRIES 1024
#define TCP_CONNECT_TIMEOUT 5000
#define TCP_BLOCK_SIZE (16 * 1024)
#define TCP_BLOCK_RECV_TIMEOUT 10000
#define TCP_BLOCK_SEND_TIMEOUT 4000
#define WIILOAD_MIN_VERSION 0x0005
#define ARGS_MAX_LEN 1024
#define LD_TCP_PORT 4299
#define LD_THREAD_STACKSIZE (1024 * 8)
#define LD_THREAD_PRIO 48
#define LD_TIMEOUT 3000
#define LD_MIN_ADDR 0x80003400
#define LD_MAX_ADDR (BASE_ADDR - 1 - ARGS_MAX_LEN)
#define LD_MAX_SIZE (LD_MAX_ADDR - LD_MIN_ADDR)
#define LD_ARGS_ADDR (LD_MAX_ADDR + 1)
#define HTTP_THREAD_STACKSIZE (1024 * 8)
#define HTTP_THREAD_PRIO 48
#define HTTP_TIMEOUT 30000
#define MANAGE_THREAD_STACKSIZE (1024 * 16)
#define MANAGE_THREAD_PRIO 48
#define APPENTRY_THREAD_STACKSIZE (1024 * 16)
#define APPENTRY_THREAD_PRIO 62
#define UPDATE_THREAD_STACKSIZE (1024 * 8)
#define UPDATE_THREAD_PRIO 58
#define FORCE_INLINE __attribute__((always_inline))
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Binary file not shown.

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: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,4 @@
target remote /dev/ttyUSB0
info threads
bt

View File

@@ -0,0 +1,257 @@
# translation of template.pot to Dutch
# Dutch translations for PACKAGE package.
# Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# blasty
msgid ""
msgstr ""
"Project-Id-Version: nederlands\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: 2008-05-21 01:17+0200\n"
"Last-Translator: ChronoX\n"
"Language-Team: Dutch\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: KBabel 1.11.4\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr "Geen omschrijving beschikbaar"
#: source/dialogs.c:55
msgid "Information"
msgstr "Informatie"
#: source/dialogs.c:56
msgid "Confirmation"
msgstr "Bevestiging"
#: source/dialogs.c:57
msgid "Warning"
msgstr "Waarschuwing"
#: source/dialogs.c:58
msgid "Error"
msgstr "Error"
#: source/dialogs.c:59
msgid "Ok"
msgstr "OK"
#: source/dialogs.c:60
msgid "Cancel"
msgstr "Annuleren"
#: source/dialogs.c:61
msgid "Yes"
msgstr "Ja"
#: source/dialogs.c:62
msgid "No"
msgstr "Nee"
#: source/dialogs.c:63
msgid "Delete"
msgstr "Verwijder"
#: source/dialogs.c:64
msgid "Load"
msgstr "Start"
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr "Terug"
#: source/dialogs.c:66
msgid "Options"
msgstr "Opties"
#: source/dialogs.c:67
msgid "Device:"
msgstr "Apparaat:"
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr "Intern SD Slot"
#: source/dialogs.c:69
msgid "USB device"
msgstr "USB apparaat"
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr "SDGecko Slot A"
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr "SDGecko Slot B"
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr "Sorteer applicaties op:"
#: source/dialogs.c:73
msgid "Name"
msgstr "Naam"
#: source/dialogs.c:74
msgid "Date"
msgstr "Datum"
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr "Nederlandse vertaling door bLAStY en ChronoX"
#: source/dialogs.c:115
msgid "Theme:"
msgstr "Thema:"
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr "Versie: %s"
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr "Auteur: %s"
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr ""
"Er is een fout opgetreden tijdens het lezen van de applicatie van de SD kaart"
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr "Er is een fout opgetreden tijdens het ontvangen van de applicatie"
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr "Error tijdens het uitpakken van de ontvangen data"
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr "Dit is geen geldige Wii applicatie"
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr "Dit is geen bruikbaar ZIP bestand"
#: source/loader.c:721
msgid "Not enough memory"
msgstr "Niet genoeg geheugen"
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr "Bezig met laden van %s"
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr "Ontvangen via USBGecko"
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr "Laden via %s"
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
"Pak het ontvangen ZIP bestand uit?\n"
"%s aan vrije ruimte is vereist."
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr "WAARSCHUWING: Bestanden in '%s' zullen worden overschreven"
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr "Er is een fout opgetreden tijdens het uitpakken van de ZIP filee"
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr "Wil je echt deze applicatie verwijderen?"
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr "Kon '%s' niet verwijderen"
#: source/manage.c:518
msgid "Extracting"
msgstr "Uitpakken"
#: source/m_main.c:80
msgid "Network not initialized"
msgstr "Netwerk niet geïnitialiseerd"
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr "IP adres: %u.%u.%u.%u"
#: source/m_main.c:97
msgid "About"
msgstr "Info"
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr "BootMii starten"
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr "Terug naar System Menu"
#: source/m_main.c:109
msgid "Shutdown"
msgstr "Afsluiten"
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
"Een update voor het Homebrew Kanaal (%s zal de huidige %s vervangen) is "
"beschikbaar, wil je nu updaten?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr "Update wordt gedownload (%u kB)"
#: source/update.c:304
msgid "Download failed"
msgstr "Downloaden mislukt"
#: source/widgets.c:16
msgid "<no description>"
msgstr "<geen omschrijving>"
#~ msgid "Version: <unknown>"
#~ msgstr "Versie: <onbekend>"
#~ msgid "Coder: <unknown>"
#~ msgstr "Auteur: <onbekend>"
#~ msgid "Deleting"
#~ msgstr "Verijwderen"

View File

@@ -0,0 +1,261 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: 2008-05-23 08:52+0100\n"
"Last-Translator: Bruno C. <Chandler>\n"
"Language-Team: LANGUAGE\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr "aucune description disponible"
# This and the following strings are dialog box "title bars"
#: source/dialogs.c:55
msgid "Information"
msgstr "Information"
#: source/dialogs.c:56
msgid "Confirmation"
msgstr "Confirmation"
#: source/dialogs.c:57
msgid "Warning"
msgstr "Avertissement"
#: source/dialogs.c:58
msgid "Error"
msgstr "Erreur"
# button text
#: source/dialogs.c:59
msgid "Ok"
msgstr "Ok"
# button text
#: source/dialogs.c:60
msgid "Cancel"
msgstr "Annuler"
# button text
#: source/dialogs.c:61
msgid "Yes"
msgstr "Oui"
# button text
#: source/dialogs.c:62
msgid "No"
msgstr "Non"
#: source/dialogs.c:63
msgid "Delete"
msgstr "Supprimer"
# button text
#: source/dialogs.c:64
msgid "Load"
msgstr "Charger"
# button text
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr "Retour"
#: source/dialogs.c:66
msgid "Options"
msgstr "Options"
#: source/dialogs.c:67
msgid "Device:"
msgstr "Dispositif:"
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr "Lecteur de carte SD"
#: source/dialogs.c:69
msgid "USB device"
msgstr "Dispositif USB"
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr "Lecteur SDGecko A"
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr "Lecteur SDGecko B"
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr "Trier les applications par:"
#: source/dialogs.c:73
msgid "Name"
msgstr "Nom"
#: source/dialogs.c:74
msgid "Date"
msgstr "Date"
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr "Traduction française par Chandler et Strangerke"
#: source/dialogs.c:115
msgid "Theme:"
msgstr "Thème:"
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr "Version : %s"
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr "Auteur : %s"
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr "Erreur de lecture de l'application à partir de la carte SD"
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr "Erreur lors de la réception de l'application"
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr "Erreur de décompression des données reçues"
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr "Application Wii non valide"
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr "Ce fichier ZIP est inutilisable"
#: source/loader.c:721
msgid "Not enough memory"
msgstr "Mémoire insuffisante"
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr "Chargement de %s"
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr "Réception sur USBGecko"
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr "Réception à partir de %s"
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
"Decompression du fichier ZIP reçu?\n"
"Un espace libre de %s est nécessaire."
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr "ATTENTION: Les fichiers dans '%s' seront écrasés"
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr "Erreur de décompression du fichier ZIP"
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr "Voulez-vous vraiment supprimer cette application?"
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr "Errur lors de la suppression de '%s'"
#: source/manage.c:518
msgid "Extracting"
msgstr "Extraction en cours"
#: source/m_main.c:80
msgid "Network not initialized"
msgstr "Réseau non initialisé"
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr "L'IP de votre Wii est %u.%u.%u.%u"
# button text
#: source/m_main.c:97
msgid "About"
msgstr "À propos de"
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr "Lancer BootMii"
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr "Retour au menu système"
#: source/m_main.c:109
msgid "Shutdown"
msgstr "Arrêt"
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
"Une mise à jour de la chaine Homebrew (version %s, remplaçant la version "
"installée %s) est disponible. Voulez-vous faire la mise à jour maintenant ?\n"
"\n"
"Notes de version :\n"
"\n"
"%s"
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr "Téléchargement... (%u Ko)"
#: source/update.c:304
msgid "Download failed"
msgstr "Échec du téléchargement"
#: source/widgets.c:16
msgid "<no description>"
msgstr "<aucune description>"
#~ msgid "Version: <unknown>"
#~ msgstr "Version : <inconnue>"
#~ msgid "Coder: <unknown>"
#~ msgstr "Auteur : <inconnu>"
#~ msgid "Deleting"
#~ msgstr "Suppression en cours"

View File

@@ -0,0 +1,256 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: NICKNAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr "keine Beschreibung"
#: source/dialogs.c:55
msgid "Information"
msgstr "Information"
#: source/dialogs.c:56
msgid "Confirmation"
msgstr "Bestätigen"
#: source/dialogs.c:57
msgid "Warning"
msgstr "Achtung"
#: source/dialogs.c:58
msgid "Error"
msgstr "Fehler"
#: source/dialogs.c:59
msgid "Ok"
msgstr "OK"
#: source/dialogs.c:60
msgid "Cancel"
msgstr "Abbrechen"
#: source/dialogs.c:61
msgid "Yes"
msgstr "Ja"
#: source/dialogs.c:62
msgid "No"
msgstr "Nein"
#: source/dialogs.c:63
msgid "Delete"
msgstr "Löschen"
# button text
#: source/dialogs.c:64
msgid "Load"
msgstr "Laden"
# button text
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr "Zurück"
#: source/dialogs.c:66
msgid "Options"
msgstr "Einstellungen"
#: source/dialogs.c:67
msgid "Device:"
msgstr "Quelle:"
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr "Interner SD Slot"
#: source/dialogs.c:69
msgid "USB device"
msgstr "USB-Laufwerk"
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr "SDGecko Slot A"
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr "SDGecko Slot B"
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr "Anwendungen sortieren nach:"
#: source/dialogs.c:73
msgid "Name"
msgstr "Name"
#: source/dialogs.c:74
msgid "Date"
msgstr "Datum"
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr "Deutsche Übersetzung: Elena Vectoradvenberg"
#: source/dialogs.c:115
msgid "Theme:"
msgstr "Thema:"
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr "Version: %s"
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr "Autor: %s"
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr "Fehler beim Lesen der Anwendung von der SD-Karte"
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr "Fehler beim Empfang der Anwendung"
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr "Fehler beim Entpacken der empfangenen Daten"
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr "Das ist keine gültige Wii-Anwendung"
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr "Dies ist keine gültige ZIP-Datei"
#: source/loader.c:721
msgid "Not enough memory"
msgstr "Nicht genug Speicher"
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr "Lade %s"
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr "Empfange über USBGecko"
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr "Empfange von %s"
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
"Entpacken der empfangenen ZIP-Datei?\n"
"%s bytes freier Speicherplatz werden benötigt."
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr "ACHTUNG: Dateien in '%s' werden überschrieben"
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr "Fehler beim Empfang der Anwendung"
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr "Soll die Anwendung wirklich gelöscht werden?"
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr "Fehler beim Löschen von '%s'"
#: source/manage.c:518
msgid "Extracting"
msgstr "Entpacke"
#: source/m_main.c:80
msgid "Network not initialized"
msgstr "Netzwerk nicht initialisiert"
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr "Die IP deiner Wii ist %u.%u.%u.%u"
# button text
#: source/m_main.c:97
msgid "About"
msgstr "Info"
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr "BootMii starten"
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr "Beenden, zum Systemmenü"
#: source/m_main.c:109
msgid "Shutdown"
msgstr "Herunterfahren"
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
"Ein Update für den Homebrew Channel ist verfügbar (Version %s, ersetzt die "
"aktuelle Version %s). Soll jetzt aktualisiert werden?\n"
"\n"
"Versionsinfo:\n"
"\n"
"%s"
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr "Lade Update (%u KB)"
#: source/update.c:304
msgid "Download failed"
msgstr "Download fehlgeschlagen"
#: source/widgets.c:16
msgid "<no description>"
msgstr "<keine Beschreibung>"
#~ msgid "Version: <unknown>"
#~ msgstr "Version: <unbekannt>"
#~ msgid "Coder: <unknown>"
#~ msgstr "Coder: <unbekannt>"
#~ msgid "Deleting"
#~ msgstr "Lösche"

View File

@@ -0,0 +1,267 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: NICKNAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr "nessuna descrizione disponibile"
# This and the following strings are dialog box "title bars"
#: source/dialogs.c:55
msgid "Information"
msgstr "Informazioni"
#: source/dialogs.c:56
msgid "Confirmation"
msgstr "Conferma"
#: source/dialogs.c:57
msgid "Warning"
msgstr "Avvertenza"
#: source/dialogs.c:58
msgid "Error"
msgstr "Errore"
# button text
#: source/dialogs.c:59
msgid "Ok"
msgstr "Ok"
# button text
#: source/dialogs.c:60
msgid "Cancel"
msgstr "Annulla"
# button text
#: source/dialogs.c:61
msgid "Yes"
msgstr "Sì"
# button text
#: source/dialogs.c:62
msgid "No"
msgstr "No"
#: source/dialogs.c:63
msgid "Delete"
msgstr "Elimina"
# button text
#: source/dialogs.c:64
msgid "Load"
msgstr "Carica"
# button text
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr "Indietro"
#: source/dialogs.c:66
msgid "Options"
msgstr "Opzioni"
#: source/dialogs.c:67
msgid "Device:"
msgstr "Periferica:"
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr "Slot SD Interno"
#: source/dialogs.c:69
msgid "USB device"
msgstr "Pendrive USB"
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr "SDGecko Slot A"
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr "SDGecko Slot B"
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr "Ordina applicazioni per:"
#: source/dialogs.c:73
msgid "Name"
msgstr "Nome"
#: source/dialogs.c:74
msgid "Date"
msgstr "Data"
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr ""
"Traduzione italiana di EnricoBr\n"
"Aggiornata da The Lemon Man"
#: source/dialogs.c:115
msgid "Theme:"
msgstr "Tema:"
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr "Versione: %s"
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr "Autore: %s"
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr "Errore durante la lettura dell'applicazione dalla scheda SD"
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr "Errore durante la ricezione dell'applicazione"
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr "Errore durante la decompressione dei dati ricevuti"
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr "Non è un'applicazione Wii valida"
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr "Questo non è un file ZIP utilizzabile"
#: source/loader.c:721
msgid "Not enough memory"
msgstr "Memoria insufficiente"
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr "Caricamento di %s"
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr "Ricezione su USBGecko"
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr "Ricezione da %s"
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
"Estrarre il file ZIP ricevuto?\n"
"Sono richiesti %s di spazio libero."
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr "ATTENZIONE: I file in '%s' verranno sovrascritti"
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr "Errore durante l'estrazione del file ZIP"
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr "Sei sicuro di voler cancellare questa domanda?"
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr "Errore durante l' eliminazione di '%s'"
#: source/manage.c:518
msgid "Extracting"
msgstr "Estraendo"
#: source/m_main.c:80
msgid "Network not initialized"
msgstr "Rete non inizializzata"
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr "L'indirizzo IP del Wii è %u.%u.%u.%u"
# button text
#: source/m_main.c:97
msgid "About"
msgstr "Informazioni"
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr "Lanciare BootMii"
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr "Ritorna al Menu di Sistema"
#: source/m_main.c:109
msgid "Shutdown"
msgstr "Spegni"
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
"È disponibile per l'installazione un aggiornamento di Homebrew Channel "
"(versione %s, in sostituzione della versione %s installata); vuoi eseguire "
"adesso l'aggiornamento?\n"
"\n"
"Note sulla versione:\n"
"\n"
"%s"
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr "Download (%u kB)"
#: source/update.c:304
msgid "Download failed"
msgstr "Download non riuscito"
#: source/widgets.c:16
msgid "<no description>"
msgstr "<nessuna descrizione>"
#~ msgid "Version: <unknown>"
#~ msgstr "Versione: <unknown>"
#~ msgid "Coder: <unknown>"
#~ msgstr "Sviluppatore: <unknown>"
#~ msgid "Deleting"
#~ msgstr "Eliminando"
#~ msgid "Do you really want to exit to the boring, boring System Menu?\n"
#~ msgstr "Confermi di voler uscire al noiosissimo menu di sistema?\n"

View File

@@ -0,0 +1,253 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: homebrew_channel\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: 2011-01-10 05:53+0200\n"
"Last-Translator: Jan Ekstrom <jeebjp@gmail.com>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr "詳細情報はありません "
# This and the following strings are dialog box "title bars"
#: source/dialogs.c:55
msgid "Information"
msgstr "報告"
#: source/dialogs.c:56
msgid "Confirmation"
msgstr "確認"
#: source/dialogs.c:57
msgid "Warning"
msgstr "警告"
#: source/dialogs.c:58
msgid "Error"
msgstr "エラー"
# button text
#: source/dialogs.c:59
msgid "Ok"
msgstr "Ok"
# button text
#: source/dialogs.c:60
msgid "Cancel"
msgstr "キャンセル"
# button text
#: source/dialogs.c:61
msgid "Yes"
msgstr "はい"
# button text
#: source/dialogs.c:62
msgid "No"
msgstr "いいえ"
#: source/dialogs.c:63
msgid "Delete"
msgstr "削除"
# button text
#: source/dialogs.c:64
msgid "Load"
msgstr "起動"
# button text
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr "戻る"
#: source/dialogs.c:66
msgid "Options"
msgstr "オプション"
#: source/dialogs.c:67
msgid "Device:"
msgstr "デバイス:"
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr "内部SDスロット"
#: source/dialogs.c:69
msgid "USB device"
msgstr "USBデバイス"
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr "SDGeckoのスロットA"
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr "SDGeckoのスロットB"
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr "アプリケーションの並べ替え順序 "
#: source/dialogs.c:73
msgid "Name"
msgstr "名前"
#: source/dialogs.c:74
msgid "Date"
msgstr "日付"
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr "日本語、JEEB氏による翻訳"
#: source/dialogs.c:115
msgid "Theme:"
msgstr "テーマ:"
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr "バージョン: %s"
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr "作者: %s"
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr "アプリケーションをSDカードから読み込んでいる最中エラーが発生しました。"
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr "アプリケーションを受信している最中エラーが発生しました。"
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr "受信されたデータを解凍中エラーが発生しました。"
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr "これは妥当なWiiアプリケーションではありません。"
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr "これは妥当なZIPファイルではありません。"
#: source/loader.c:721
msgid "Not enough memory"
msgstr "メモリーが足りません。"
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr "%sをロード中。"
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr "USBGecko経由で受信中。"
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr "%sから受信中。"
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
"受信されたZIPファイルを解凍しますか。\n"
"%sの空き領域が必要になります。"
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr "警告: 「%s」の中のファイルはすべて上書きされます。"
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr "ZIPファイルを解凍中エラーが発生しました。"
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr "本当にこのアプリケーションを削除しますか。"
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr "「%s」を削除中にエラーが発生しました。"
#: source/manage.c:518
msgid "Extracting"
msgstr "解凍中"
#: source/m_main.c:80
msgid "Network not initialized"
msgstr "ネットワークが初期化されていません。"
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr "このWiiのIPアドレスは %u.%u.%u.%u"
# button text
#: source/m_main.c:97
msgid "About"
msgstr "このアプリケーションについて"
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr "BootMiiを起動"
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr "システムメニューへ戻る"
#: source/m_main.c:109
msgid "Shutdown"
msgstr "シャットダウン"
# note: a non-breaking space is used in "Homebrew Channel" here.
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
"Homebrew Channelに利用可能な更新があります。 (バージョン%s、現在のバージョ"
"ン%sを置換 今すぐ更新しますか。\n"
"\n"
"リリース ノート :\n"
"\n"
"%s"
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr "更新をダウンロード中 (%u kB)"
#: source/update.c:304
msgid "Download failed"
msgstr "ダウンロードが失敗しました。"
#: source/widgets.c:16
msgid "<no description>"
msgstr "<詳細情報はありません >"

View File

@@ -0,0 +1,258 @@
# translation of template.pot to Spanish
# Spanish translations for PACKAGE package.
# Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# marcan <marcan@marcansoft.com>, 2008.
msgid ""
msgstr ""
"Project-Id-Version: spanish\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: 2008-05-21 01:17+0200\n"
"Last-Translator: marcan <marcan@marcansoft.com>\n"
"Language-Team: Spanish\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: KBabel 1.11.4\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr "descripción no disponible"
#: source/dialogs.c:55
msgid "Information"
msgstr "Información"
#: source/dialogs.c:56
msgid "Confirmation"
msgstr "Confirmación"
#: source/dialogs.c:57
msgid "Warning"
msgstr "Advertencia"
#: source/dialogs.c:58
msgid "Error"
msgstr "Error"
#: source/dialogs.c:59
msgid "Ok"
msgstr "Aceptar"
#: source/dialogs.c:60
msgid "Cancel"
msgstr "Cancelar"
#: source/dialogs.c:61
msgid "Yes"
msgstr "Sí"
#: source/dialogs.c:62
msgid "No"
msgstr "No"
#: source/dialogs.c:63
msgid "Delete"
msgstr "Eliminar"
# button text
#: source/dialogs.c:64
msgid "Load"
msgstr "Cargar"
# button text
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr "Atrás"
#: source/dialogs.c:66
msgid "Options"
msgstr "Opciones"
#: source/dialogs.c:67
msgid "Device:"
msgstr "Dispositivo:"
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr "Ranura SD Interna"
#: source/dialogs.c:69
msgid "USB device"
msgstr "Dispositivo USB"
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr "SDGecko en Slot A"
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr "SDGecko en Slot B"
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr "Ordenar aplicaciones por:"
#: source/dialogs.c:73
msgid "Name"
msgstr "Nombre"
#: source/dialogs.c:74
msgid "Date"
msgstr "Fecha"
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr "Traducción al español - marcan"
#: source/dialogs.c:115
msgid "Theme:"
msgstr "Tema:"
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr "Versión: %s"
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr "Autor: %s"
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr "Error al leer la aplicación desde la tarjeta SD"
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr "Error al recibir la aplicación"
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr "Error al descomprimir los datos recibidos"
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr "Esta no es una aplicación de Wii válida"
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr "Este archivo ZIP no se puede utilizar"
#: source/loader.c:721
msgid "Not enough memory"
msgstr "Memoria insuficiente"
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr "Cargando %s"
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr "Recibiendo por USBGecko"
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr "Recibiendo desde %s"
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
"¿Desea extraer el archivo ZIP recibido?\n"
"Se requiren %s de espacio libre."
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr "AVISO: Se reemplazarán archivos en '%s'"
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr "Error al extraer el archivo ZIP"
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr "¿Estás seguro de que quieres eliminar esta aplicación?"
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr "Error al eliminar '%s'"
#: source/manage.c:518
msgid "Extracting"
msgstr "Extrayendo"
#: source/m_main.c:80
msgid "Network not initialized"
msgstr "La red no se ha inicializado"
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr "La IP de tu Wii es %u.%u.%u.%u"
#: source/m_main.c:97
msgid "About"
msgstr "Acerca de"
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr "Lanzar BootMii"
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr "Salir al menú del sistema"
#: source/m_main.c:109
msgid "Shutdown"
msgstr "Apagar"
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
"Está disponible la versión %s del Canal Homebrew, que sustituye a la versión "
"instalada (%s). ¿Quieres actualizar ahora?\n"
"\n"
"Notas sobre la versión:\n"
"\n"
"%s"
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr "Descargando (%u kB)"
#: source/update.c:304
msgid "Download failed"
msgstr "Error al descargar"
#: source/widgets.c:16
msgid "<no description>"
msgstr "<sin descripción>"
#~ msgid "Version: <unknown>"
#~ msgstr "Versión: <desconocida>"
#~ msgid "Coder: <unknown>"
#~ msgstr "Autor: <desconocido>"
#~ msgid "Deleting"
#~ msgstr "Eliminando"

View File

@@ -0,0 +1,244 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-22 21:29+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: NICKNAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: source/dialogs.c:53
msgid "no description available"
msgstr ""
# This and the following strings are dialog box "title bars"
#: source/dialogs.c:55
msgid "Information"
msgstr ""
#: source/dialogs.c:56
msgid "Confirmation"
msgstr ""
#: source/dialogs.c:57
msgid "Warning"
msgstr ""
#: source/dialogs.c:58
msgid "Error"
msgstr ""
# button text
#: source/dialogs.c:59
msgid "Ok"
msgstr ""
# button text
#: source/dialogs.c:60
msgid "Cancel"
msgstr ""
# button text
#: source/dialogs.c:61
msgid "Yes"
msgstr ""
# button text
#: source/dialogs.c:62
msgid "No"
msgstr ""
#: source/dialogs.c:63
msgid "Delete"
msgstr ""
# button text
#: source/dialogs.c:64
msgid "Load"
msgstr ""
# button text
#: source/dialogs.c:65 source/m_main.c:95
msgid "Back"
msgstr ""
#: source/dialogs.c:66
msgid "Options"
msgstr ""
#: source/dialogs.c:67
msgid "Device:"
msgstr ""
#: source/dialogs.c:68
msgid "Internal SD Slot"
msgstr ""
#: source/dialogs.c:69
msgid "USB device"
msgstr ""
#: source/dialogs.c:70
msgid "SDGecko Slot A"
msgstr ""
#: source/dialogs.c:71
msgid "SDGecko Slot B"
msgstr ""
#: source/dialogs.c:72
msgid "Sort applications by:"
msgstr ""
#: source/dialogs.c:73
msgid "Name"
msgstr ""
#: source/dialogs.c:74
msgid "Date"
msgstr ""
#: source/dialogs.c:110
msgid "<YourLanguageHere> translation by <YourNickNameHere>"
msgstr ""
#: source/dialogs.c:115
msgid "Theme:"
msgstr ""
#: source/dialogs.c:125
#, c-format
msgid "Version: %s"
msgstr ""
#: source/dialogs.c:126
#, c-format
msgid "Author: %s"
msgstr ""
#: source/loader.c:716
msgid "Error while reading the application from the SD card"
msgstr ""
#: source/loader.c:717
msgid "Error while receiving the application"
msgstr ""
#: source/loader.c:718
msgid "Error uncompressing the received data"
msgstr ""
#: source/loader.c:719
msgid "This is not a valid Wii application"
msgstr ""
#: source/loader.c:720
msgid "This is not a usable ZIP file"
msgstr ""
#: source/loader.c:721
msgid "Not enough memory"
msgstr ""
#: source/loader.c:763
#, c-format
msgid "Loading %s"
msgstr ""
#: source/loader.c:772
#, c-format
msgid "Receiving over USBGecko"
msgstr ""
#: source/loader.c:782
#, c-format
msgid "Receiving from %s"
msgstr ""
#: source/loader.c:968
#, c-format
msgid ""
"Extract the received ZIP file?\n"
"%s of free space are required."
msgstr ""
#: source/loader.c:969
#, c-format
msgid "WARNING: Files in '%s' will be overwritten"
msgstr ""
#: source/loader.c:970
msgid "Error while extracting the ZIP file"
msgstr ""
#: source/main.c:250
msgid "Do you really want to delete this application?"
msgstr ""
#: source/main.c:251
#, c-format
msgid "Error deleting '%s'"
msgstr ""
#: source/manage.c:518
msgid "Extracting"
msgstr ""
#: source/m_main.c:80
msgid "Network not initialized"
msgstr ""
#: source/m_main.c:81
#, c-format
msgid "Your Wii's IP is %u.%u.%u.%u"
msgstr ""
# button text
#: source/m_main.c:97
msgid "About"
msgstr ""
#: source/m_main.c:102
msgid "Launch BootMii"
msgstr ""
#: source/m_main.c:106
msgid "Exit to System Menu"
msgstr ""
#: source/m_main.c:109
msgid "Shutdown"
msgstr ""
#: source/update.c:232
#, c-format
msgid ""
"An update to the Homebrew Channel (version %s, replacing the installed "
"version %s) is available for installation, do you want to update now?\n"
"\n"
"Release notes:\n"
"\n"
"%s"
msgstr ""
#: source/update.c:262
#, c-format
msgid "Downloading Update (%u kB)"
msgstr ""
#: source/update.c:304
msgid "Download failed"
msgstr ""
#: source/widgets.c:16
msgid "<no description>"
msgstr ""

Some files were not shown because too many files have changed in this diff Show More