Forums

Sega Master System / Mark III / Game Gear
SG-1000 / SC-3000 / SF-7000 / OMV
Home - Forums - Games - Scans - Maps - Cheats - Credits
Music - Videos - Development - Hacks - Translations - Homebrew

View topic - Create adventure games for the SMS using Twine

Reply to topic Goto page 1, 2, 3  Next
Author Message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Create adventure games for the SMS using Twine
Post Posted: Fri Jan 24, 2014 2:14 am
This is my current project, twee2sam: a tool that can convert Twee source files (that can be exported from Twine) into S.A.M. source files, which can then be compiled into Sega Master System ROMs.

So, you can basically write your story using Twine, export it to Twee using 'File -> Export Source Code' and then convert it to S.A.M. using twee2sam. The process may look a bit convoluted now, but that's because it's still under development; later on, I intend to directly integrate the tool with Twine.

So far, the tool is minimally functional: Text works okay, links work okay; images will probably be supported in the next version; conditionals, expressions and commands in general shall be supported in a future version (or a limited subset of them, anyway).

Current version
  View user's profile Send private message Visit poster's website
  • Joined: 14 Oct 2006
  • Posts: 259
  • Location: NYC
Reply with quote
Post Posted: Sat Jan 25, 2014 3:25 am
A+ work haroldoop. I've been entertaining the idea of a cyberpunk adventure game and the SMS would be an awesome platform to make a game for. I'll keep an eye out for this for when you get graphics going.
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Sun Jan 26, 2014 3:13 am
olaf wrote
A+ work haroldoop. I've been entertaining the idea of a cyberpunk adventure game and the SMS would be an awesome platform to make a game for. I'll keep an eye out for this for when you get graphics going.


Your wish is an order! ;)

The tool now has image support. The images must be in the png format, have a resolution of 256x144, and can't have more than 16 colors. Be careful to not use an exceedingly detailed image, as SAM can't display images with more than 320 tiles.

Get current version
  View user's profile Send private message Visit poster's website
  • Joined: 11 Oct 2007
  • Posts: 17
  • Location: uk
Reply with quote
Post Posted: Sun Jan 26, 2014 1:56 pm
just wanted to drop by and say this is really, really cool :-)
  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Mon Jan 27, 2014 8:26 am
I just stumbled across this place a while ago and as soon as I saw this, I downloaded everything required so a friend and I could sort of do a little game jam and make something. The problem is, I cannot get twee2sam.py to work at all.

First, it doesn't come with two of the libraries the program needs to run and doesn't really explicitly state their requirement anywhere. Had I no previous experience with Python, I'd probably have been stuck right there. Fortunately, I figured it out and managed to find the Twee libraries I needed. However, there's now another problem cropping up: it absolutely will not compile my Twee source. It's only two passages with an image each, just as a sort of test. Seems that the thing is having a hard time figuring out how to process the images, though. Below is the text of the exact error I am receiving.

C:\twee2sam-master>twee2sam.py HPOM.TWEE C:\twee2sam-master\HPOM
Traceback (most recent call last):
  File "C:\twee2sam-master\twee2sam.py", line 209, in <module>
    main(sys.argv[1:])
  File "C:\twee2sam-master\twee2sam.py", line 201, in main
    shutil.copyfile(src_dir + os.sep + image_path, dest_dir + os.sep + image_nam
e + '.png')
  File "C:\Python27\lib\shutil.py", line 81, in copyfile
    with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: '\\SCREEN_01'


So what's going on here? I know enough about Python to figure out when a thing's missing a library, but not enough to tell much more beyond that it appears it's looking for a physical copy of the images that are stored in the Twee source somewhere external to it.

EDIT: Further investigation showed that I was supposed to use external .PNG files, something I didn't immediately realize I could do. Changing this hasn't 100% fixed it though, instead changing my error to this:

C:\twee2sam-master>twee2sam.py HPOM.TWEE C:\twee2sam-master\HPOM
Traceback (most recent call last):
  File "C:\twee2sam-master\twee2sam.py", line 209, in <module>
    main(sys.argv[1:])
  File "C:\twee2sam-master\twee2sam.py", line 201, in main
    shutil.copyfile(src_dir + os.sep + image_path, dest_dir + os.sep + image_nam
e + '.png')
  File "C:\Python27\lib\shutil.py", line 81, in copyfile
    with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: '\\SCREEN_02.png'


EDIT #2: Okay, alright, I finally got it to work. Putting the .twee (renamed to .txt), the PNG files and the original .tws in the /tw/ directory and putting the PNG files in the /sam/ directory and running it again made it go, no errors.

Except now SAM is giving me grief with this. Even after copying the files to /bin/ and editing build.bat to include "SET SAMBINPATH=C:\SAM\bin\" at the top, it still won't compile. It wants game.asm and Music.list.txt, but those didn't generate from twee2sam and copying the ones from the example project over aren't making it go either. I'm stumped and it's nearly 5 AM here so I'm giving up and going to sleep.
  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Mon Jan 27, 2014 12:07 pm
First of all, thanks for your interest on the tool.
Also, thanks for the bug reports; I'll try to fix the problems as the time goes; I hope to someday make it into something that 'just works, right out of the box'. ;)
I'll try to give a more technical explanation about the problems you're having later, but for now, I'm attaching a ZIP containing a fully configured version of twee2sam including dependencies. Please, take a look, and see if at least the sample application 'example/simple/' compiles. Please, tell me if something goes wrong.

  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Mon Jan 27, 2014 6:55 pm
For some reason, it doesn't want to recognize python as a command that can be run from anywhere. Here's the exact results of running Compile.bat in the sample:

Could Not Find C:\twee2sam\example\simple\sam\*.twsam
        1 file(s) copied.
Could Not Find C:\twee2sam\example\simple\sam\Script.list.txt
Could Not Find C:\twee2sam\example\simple\sam\output.sms
Could Not Find C:\twee2sam\example\simple\sam\output.sms.sym
'python' is not recognized as an internal or external command,
operable program or batch file.
twee2sam returned an error
Press any key to continue . . .


Also, unrelated to bugs and whatnot, but it seems SAM has the ability to use music. I'm not that experienced with Twine either, but even assuming it doesn't have the ability to play music natively, would it be possible to come up with a sort of fake code statement that twee2sam could interpret as one? Something kind of like the [img[image]] code.

EDIT: Apparently I can't post a link to my test files. Let's try this then: www mediafire com download c97jvs94w2343s9 HPOM.RAR
  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Mon Jan 27, 2014 9:49 pm
Zero X. Diamond wrote
For some reason, it doesn't want to recognize python as a command that can be run from anywhere. Here's the exact results of running Compile.bat in the sample:

Could Not Find C:\twee2sam\example\simple\sam\*.twsam
        1 file(s) copied.
Could Not Find C:\twee2sam\example\simple\sam\Script.list.txt
Could Not Find C:\twee2sam\example\simple\sam\output.sms
Could Not Find C:\twee2sam\example\simple\sam\output.sms.sym
'python' is not recognized as an internal or external command,
operable program or batch file.
twee2sam returned an error
Press any key to continue . . .



Oh, that's because even though Python is installed, it wasn't added to Window's search path. But nevermind that part: I've just compiled twee2sam.py into an .exe file, so that it can be executed directly; now you won't even need Python installed. I'm attaching the new version to this post. Please, take a look and see if it works.

Zero X. Diamond wrote

Also, unrelated to bugs and whatnot, but it seems SAM has the ability to use music. I'm not that experienced with Twine either, but even assuming it doesn't have the ability to play music natively, would it be possible to come up with a sort of fake code statement that twee2sam could interpret as one? Something kind of like the [img[image]] code.


Yes, I intend to add music support. I think I'll probably just use twine/twee conventions for custom commands and define it as something like <<music>>

Zero X. Diamond wrote

EDIT: Apparently I can't post a link to my test files. Let's try this then: www mediafire com download c97jvs94w2343s9 HPOM.RAR


Okay, I'll take a look at your files and see what I can do.

Anyway, here's the new version, as mentioned above.
vvvvvvv
twee2sam-2014-01-27b.rar (2.96 MB)
twee2sam, with twee2sam.py compiled into an .exe

  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Mon Jan 27, 2014 10:10 pm
Okay, it worked this time! Still gave me some errors at the top (and as such I've included another log below) but the output.sms it gave me runs properly in the emulator so it looks like it'll work.
        1 file(s) copied.
Could Not Find C:\twee2sam\example\simple\sam\*(tiles).pscompr
Could Not Find C:\twee2sam\example\simple\sam\*(tile numbers).bin
Could Not Find C:\twee2sam\example\simple\sam\*(palette).bin
Could Not Find C:\twee2sam\example\simple\sam\*.txt.inc
DISCARD: object.o:..\..\..\sam\lib\Useful functions.inc: Section "Get VCount" wa
s discarded.
DISCARD: object.o:..\..\..\sam\lib\Useful functions.inc: Section "Wait for VBlan
k without interrupts" was discarded.
DISCARD: object.o:..\..\..\sam\lib\Phantasy Star decompressors.inc: Section "Til
e loader (4 bpp RLE, no di/ei)" was discarded.
DISCARD: object.o:..\..\..\sam\lib\Phantasy Star decompressors.inc: Section "Dec
ompress to TileMapData" was discarded.
DISCARD: object.o:..\..\..\sam\lib\Phantasy Star decompressors.inc: Section "Dec
ompress tilemap to VRAM" was discarded.
Free space at $0037.
Free space at $3f89-$3fff.
Free space at $6e62-$7fdf.
Free space at $7ff8-$7ff9.
Free space at $7ffc-$7ffe.
Free space at $c000-$ffff.
Bank 00 has 00120 bytes (0.73%) free.
Bank 01 has 04483 bytes (27.36%) free.
Bank 02 has 00000 bytes (0.00%) free.
Bank 03 has 16384 bytes (100.0%) free.
20987 unused bytes of total 65536.
Press any key to continue . . .


My files also convert errorlessly with twee2sam, but I still don't get a game.asm or a Music.list.txt so Compile.bat isn't working.
  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Mon Jan 27, 2014 10:14 pm
haroldoop wrote

Zero X. Diamond wrote

EDIT: Apparently I can't post a link to my test files. Let's try this then: www mediafire com download c97jvs94w2343s9 HPOM.RAR


Okay, I'll take a look at your files and see what I can do.

Anyway, here's the new version, as mentioned above.


Okay, I've managed to make it work, see attachments. Nice looking game, BTW. ;)

Anyway, the included project supposes that the 'hpom' folder is placed inside 'twee/example/'; that is, after unzipping it inside the 'example' folder, your folder structure should look something like this:


twee2sam
... bin
... example
    ... hpom
        ... sam
        ... tw
    ... simple
... lib
... sam
... tw


In other words, the hpom folder inside the .rar file should be placed inside the 'twee/example/' folder.
hpom_project.rar (6.97 KB)
HPOM project
hpom_rom.rar (9.28 KB)
HPOM compiled into a ROM

  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Mon Jan 27, 2014 10:32 pm
Hey man, thanks a lot. It's really exciting to see our project running on an emulator! And you're a really nice guy; not everybody would go out of their way to be as helpful as you've been.

Quote
Nice looking game, BTW. ;)

Thanks! I'm mostly just writing (though I did do a rough draft of the mushroom mummy room), while a friend of mine is handling most of the art. We were originally gonna take turns but my art was too complicated and looked way different than hers so we're mostly just giving each other suggestions now.

While I've got you, can you give me an idea of our limitations? If we have a picture per link and about two short paragraphs of text each, about how many will we be able to fit into this? I'm not really well-versed on the SMS's hardware and don't know how this stuff translates for conversion's sake.
  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Tue Jan 28, 2014 12:28 am
Zero X. Diamond wrote
Hey man, thanks a lot. It's really exciting to see our project running on an emulator! And you're a really nice guy; not everybody would go out of their way to be as helpful as you've been.


Hey, no problem, I'm pleased to help.

Zero X. Diamond wrote
While I've got you, can you give me an idea of our limitations? If we have a picture per link and about two short paragraphs of text each, about how many will we be able to fit into this? I'm not really well-versed on the SMS's hardware and don't know how this stuff translates for conversion's sake.


Mmm... that's a bit difficult to estimate precisely, since it mostly depends on how detailed the images are, but I'd guess about 40 to 90 images for a 512kb ROM; I wouldn't worry much about text length; it's one byte per character, or about 200 bytes per paragraph; the images will be the greater problem.


Here goes a technical explanation about image size:

All graphics on the SMS are composed of 8x8 pixel tiles; these tiles are used by the background, that's composed of a grid of tiles placed side by side covering the whole screen plus a bit more, and by the sprites, that are composed by one or two tiles, and can be placed anywhere on the screen, but there can be only a few of them on the screen at any time. The Master System's video memory can hold up to 448 tiles, and the background is arranged on a 32x28 grid that tells which tiles go in each position.

SAM uses the background both for displaying the text, and for displaying the images. It uses the first 128 tiles to represent the standard ASCII character set (that is, the letters), leaving free 320 tiles for the image. In the ROM, the image is composed by a tileset of up to 320 tiles (compressed), plus a 32x18 tilemap that represents which tiles will go where in the area that will be covered by the image. Depending on how complex the image is, some areas may have repeated 8x8 patterns, meaning that the same tile can be used in more than one place; then again, some images can be too complex and have too few repeated patterns, meaning that 320 tiles wouldn't be enough to represent them; even 448 non-repeated tiles wouldn't be enough to completely cover the 32x18 area; it's a hardware limitation.

That being said, the amount of images you'll be able to use will mostly depend on the amount of tiles you end up using, and how well those tile compress: each tile takes, when not compressed, 32 bytes; moreover, SAM also uses compression to save space; that compression can wildly vary depending on the tileset.

So, let's imagine a worst case scenario, where every image uses 320 tiles, and they don't compress at all:
- Each tileset would occupy 320 times 32 bytes, that is, 10240 bytes;
- Each tilemap would occupy 32 times 18 times 2 bytes, that is, 1152 bytes;
- That gives us a total of a little more than 11 kilobytes per image supposing there's no compression at all;
- The biggest non-Brazilian SMS cartridges had 512kb, in wich you could fit up to 46 of such images;
- Some Brazilian cartridges had a 1024kb capacity, that is, 92 images;
- The theorethical limit using the standard bankswitching scheme would be 4096 kb (368 unconpressed images); note that no SMS game was ever made with this capacity (Yours could be the first!).

Of course, as mentioned, since there's compression involved, in practice, there will be more images fitting in the same space.

Well, that being said, my suggestion would be to keep the images simple, so that they'll take less space.
  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Tue Jan 28, 2014 6:40 am
Got a bug(?) for you. I'm trying to make a nice page that's just a title screen, but doing it with text is giving me weird results. Twine will let you make an image a link, so I figured I'd try that so it'd just be the title picture, but instead when it compiles it just prints the syntax of the link and I can't continue past the screen.

EDIT: Also, it appears that the entire bottom row of tiles for the title image is blanked out with solid green. And while I'm at it, is there a way to make the links just go straight to the selection and not display by themselves? Like if I wanted to just have your choices separate from the story's text.

Another really nitpicky thing, but while it's capable of displaying 30 characters per line, if you attempt to do manual breaks in the text instead of letting it autoformat, it automatically puts a blank line between the line of 30 and whatever comes next.
  View user's profile Send private message
  • Site Admin
  • Joined: 19 Oct 1999
  • Posts: 12483
  • Location: London
Reply with quote
Post Posted: Tue Jan 28, 2014 8:46 am
If you make the art match the limitations - 8x8 tiles with flipping - it will greatly reduce the file size. Working with a grid and using aligned clones (with flipping) to draw will help.

haroldoop, what compression are you using? PS Gaiden compression is generally the best we have currently. Could you analyse the script and remove the characters that aren't used? That'd leave more room for graphics, even more if you can do the analysis per-image. Also, do you support compressed data spanning more than one bank? The packing problem is a real issue for large blobs, potentially making the ROM usage quite inefficient.
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Tue Jan 28, 2014 2:55 pm
Zero X. Diamond wrote
Got a bug(?) for you. I'm trying to make a nice page that's just a title screen, but doing it with text is giving me weird results. Twine will let you make an image a link, so I figured I'd try that so it'd just be the title picture, but instead when it compiles it just prints the syntax of the link and I can't continue past the screen.


I see that more as a feature request... but maybe it could be implemented in the future.

Zero X. Diamond wrote

EDIT: Also, it appears that the entire bottom row of tiles for the title image is blanked out with solid green.


Yes, I see... while the characters are using a separate palette, the text box itself is using the same palette as the image; well, another bug to correct. :P

Zero X. Diamond wrote

And while I'm at it, is there a way to make the links just go straight to the selection and not display by themselves? Like if I wanted to just have your choices separate from the story's text.


That's already supported, in a way: in order to make the links without displaying them as part of the text, you can just put each link per its own line, preceded by an asterisk as in:


* [[This is a hidden menu option]]
* [[This is another hidden menu option|Go to another page]]


Then the menu will show, without showing as part of the text.

I know it does deviate a bit from the standard Twine syntax, and I'm not sure whether or not it should be changed, but, for now, it works okay.

Zero X. Diamond wrote

Another really nitpicky thing, but while it's capable of displaying 30 characters per line, if you attempt to do manual breaks in the text instead of letting it autoformat, it automatically puts a blank line between the line of 30 and whatever comes next.


Oh, I see. Maybe there's an one-off error on the word wrapping routines... anyway, until it's fixed, one way to get around that would be to use an inverted slash '\' at the end of the line; this tells twee2sam that the next line is a continuation of the current one.

Maxim wrote

haroldoop, what compression are you using? PS Gaiden compression is generally the best we have currently.


Hello, Maxim,

I'm currently using the Phantasy Star (not Gaiden) compression format; SAM uses your bmp2tile tool to do the image conversion. Anyway, yeah, I think it's worth some experimentation.

Maxim wrote

Could you analyse the script and remove the characters that aren't used? That'd leave more room for graphics, even more if you can do the analysis per-image.


It's an interesting idea, maybe I could do some experimentation with that.

Maxim wrote
Also, do you support compressed data spanning more than one bank?
The packing problem is a real issue for large blobs, potentially making the ROM usage quite inefficient.


I see what you mean: allowing data to span more than a bank would greatly reduce bank fragmentation, leading to less wasted space; It's worth a look too.
  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Tue Jan 28, 2014 8:35 pm
haroldoop wrote
Oh, I see. Maybe there's an one-off error on the word wrapping routines... anyway, until it's fixed, one way to get around that would be to use an inverted slash '\' at the end of the line; this tells twee2sam that the next line is a continuation of the current one.

I definitely think it's an issue with the word wrapping routine. I was doing my own formatting because the auto wrap does two odd things. First, if it drops text down from a line that perfectly ends at 30 characters with a space right after, it carries the space down to the beginning of the line. Not a bug, per se, but not usually what word wrapping does. And second, it seems that if a word brings a line over the 30 character limit by only one character, instead of dropping the whole word as usual, it only drops the last letter to the next line.

Now for the bad news: my latest build is showing some VERY buggy behavior. Once you go east into the mummy room, you now have the option to approach the mummy. This is supposed to load a close-up of the mummy's face, but when it tries to load the picture into memory, it fails and loads a bunch of garbage instead, and the text displays incorrectly, loading part of one "page" and part of another. Pressing a button kicks you back to the title screen, though I can't tell you exactly what's making that happen.

I've attached the output.sms in an archive, and I've also updated HPOM.RAR at the same link as earlier with my current source files.
output.rar (15.35 KB)

  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Wed Jan 29, 2014 12:34 am
Zero X. Diamond wrote
Now for the bad news: my latest build is showing some VERY buggy behavior. Once you go east into the mummy room, you now have the option to approach the mummy. This is supposed to load a close-up of the mummy's face, but when it tries to load the picture into memory, it fails and loads a bunch of garbage instead, and the text displays incorrectly, loading part of one "page" and part of another. Pressing a button kicks you back to the title screen, though I can't tell you exactly what's making that happen.

I've attached the output.sms in an archive, and I've also updated HPOM.RAR at the same link as earlier with my current source files.


Yes, that's strange. I'm taking a look to see what is going wrong.

-- edit --

Found it. twee2sam's script interpreter currently can't handle quotation marks; until that's corrected, I've implemented a workaround on twee2sam that automatically replaces quotation marks with single quotes.

  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Wed Jan 29, 2014 9:13 am
I know it's a bit early for this, since music probably won't be properly implemented for a while, but what format does SAM support? My guess from the sample SAM game's files is that it uses mod2psg files? I've got a friend who's interested in doing a few tunes for us so I'd like to give him some time to familiarize himself with whatever he's up against.
  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Wed Jan 29, 2014 2:30 pm
Zero X. Diamond wrote
I know it's a bit early for this, since music probably won't be properly implemented for a while, but what format does SAM support? My guess from the sample SAM game's files is that it uses mod2psg files? I've got a friend who's interested in doing a few tunes for us so I'd like to give him some time to familiarize himself with whatever he's up against.


Exactly; SAM uses Mod2PSG2 for playing music.
  View user's profile Send private message Visit poster's website
  • Joined: 27 Jan 2014
  • Posts: 13
Reply with quote
Post Posted: Thu Jan 30, 2014 8:31 am
More screens, more problems. Just tried to compile again after adding five more rooms, but I'm getting the following errors:

Could Not Find C:\twee2sam\example\hpom\sam\*.twsam
        1 file(s) copied.
Could Not Find C:\twee2sam\example\hpom\sam\Script.list.txt
Could Not Find C:\twee2sam\example\hpom\sam\output.sms
Could Not Find C:\twee2sam\example\hpom\sam\output.sms.sym
Could Not Find C:\twee2sam\example\hpom\sam\*(tiles).pscompr
Could Not Find C:\twee2sam\example\hpom\sam\*(tile numbers).bin
Could Not Find C:\twee2sam\example\hpom\sam\*(palette).bin
Could Not Find C:\twee2sam\example\hpom\sam\*.txt.inc
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 0: SCREEN_06" doesn't fit into
 the specified 6 bytes. Enlarging to 4058 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 1: SCREEN_02" doesn't fit into
 the specified 2 bytes. Enlarging to 3565 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 2: SCREEN_09" doesn't fit into
 the specified 9 bytes. Enlarging to 5784 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 3: SCREEN_01" doesn't fit into
 the specified 1 bytes. Enlarging to 3529 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 4: SCREEN_03" doesn't fit into
 the specified 3 bytes. Enlarging to 4857 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 5: SCREEN_07" doesn't fit into
 the specified 7 bytes. Enlarging to 5599 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 7: SCREEN_05" doesn't fit into
 the specified 5 bytes. Enlarging to 5584 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 8: SCREEN_04" doesn't fit into
 the specified 4 bytes. Enlarging to 4944 bytes.
Images.txt.inc: INTERNAL_PASS_2: Section "Picture 9: SCREEN_08" doesn't fit into
 the specified 8 bytes. Enlarging to 4234 bytes.
DISCARD: object.o:..\..\..\sam\lib\Useful functions.inc: Section "Get VCount" wa
s discarded.
DISCARD: object.o:..\..\..\sam\lib\Useful functions.inc: Section "Wait for VBlan
k without interrupts" was discarded.
DISCARD: object.o:..\..\..\sam\lib\Phantasy Star decompressors.inc: Section "Til
e loader (4 bpp RLE, no di/ei)" was discarded.
DISCARD: object.o:..\..\..\sam\lib\Phantasy Star decompressors.inc: Section "Dec
ompress to TileMapData" was discarded.
DISCARD: object.o:..\..\..\sam\lib\Phantasy Star decompressors.inc: Section "Dec
ompress tilemap to VRAM" was discarded.
object.o:Images.txt.inc: INSERT_SECTIONS: No room for section "Picture 1: SCREEN
_02" (3565 bytes).
The system cannot find the file specified.
Press any key to continue . . .


Once again, source files have been updated at the link from earlier.
  View user's profile Send private message
  • Site Admin
  • Joined: 19 Oct 1999
  • Posts: 12483
  • Location: London
Reply with quote
Post Posted: Thu Jan 30, 2014 1:51 pm
"Could not find...": that's the cleanup script being too noisy.

"...doesn't fit into the specified n bytes" is because the section naming convention for screen images is matching a section padding convention in WLA DX, but not in a way that will break things.

"DISCARD: ... was discarded" is WLA DX explaining that it optimised out some unused code. That's normal.

"...No room for section" is the real error. Your data is now too big to fit in the ROM size. I think one of the things you provide is a game.asm file; you need to edit it like so:

.rombankmap
   bankstotal 64
   banksize $4000
   banks 64
.endro


That'll get you 1MB of space. I guess it'd be better if the framework made the ROM as big as it needs to be, but that's a bit tricky to predict.
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Thu Jan 30, 2014 3:02 pm
Zero X. Diamond wrote
More screens, more problems. Just tried to compile again after adding five more rooms, but I'm getting the following errors:
(...)


Maxim wrote

"...No room for section" is the real error. Your data is now too big to fit in the ROM size. I think one of the things you provide is a game.asm file; you need to edit it like so:

.rombankmap
   bankstotal 64
   banksize $4000
   banks 64
.endro


That'll get you 1MB of space. I guess it'd be better if the framework made the ROM as big as it needs to be, but that's a bit tricky to predict.


It's exactly as Maxim said: the current bank configuration is only allowing ROMs up to 64k; by manually editing 'game.asm', inside example/your_project/sam' (example/hpom/sam, in this case) up to 32/64 banks (512kb/1MB) the game starts compiling again.

I guess it would be possible to automatically calculate the required ROM size but, yeah, without the ability for data to span multiple banks, it would be quite tricky; still, I'm taking note of the idea.

I'm also thinking about making twee2sam generate game.asm automatically; besides allowing the user to choose the ROM size in an easier way, it would also allow the project to be stored in any folder, without requiring manual editing on 'game.asm'.

I've also noticed that certain rooms are causing SAM to fill the screen with random sprites; I gotta study what causes this bug, too.

-- edit --

Okay, found out the random sprite bug: the text was exceeding the 512 character limit and overflowing into places it shouldn't. :P

Until that's properly corrected, twee2sam will give an alert when the limit is exceeded, and cut off the excess. A less kludgy handling of this limit may be implemented later.

Also, a new command was added: now you can use the <<pause>> macro to force a page break; if the text starts getting too big, or if you just want to force a pause at a specific place, just use this new command.

  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Sat Feb 01, 2014 11:16 pm
Here's the new version of twee2sam, now with support for conditionals (<<if>> clause).
The examples have also been modified to show the new capabilities, and also to generate a 512kb ROM by default.

The supported commands so far are:



[[Description|Target]] Shows a menu option that's shown as 'Description' and that goes to 'Target'

[img[imagename.png]] Displays an image

<<pause>>
Forces a page break or, if there's no text, just waits for the user to press any button.

<<set>> Sets the value of a variable to the value of the expression.

<<if>>...<<endif>>
Conditionally executes the code between <<if>> and <<endif>> if the expression evaluates to true.
Note: <<else>> is not implemented yet.

Expressions
Currently, twee2sam has only limited expression support:
    true evaluates to true;
    false evaluates to false;
    variable name evaluates to the current value of the variable;
    not variable_name or !variable_name evaluates to the logical negation of the current value of the variable; that is, if 'variable' is true, '!variable' is false, and vice versa.

twee2sam-2014-02-01a.rar (2.9 MB)
New version of twee2sam, now with conditionals

  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Tue Feb 18, 2014 1:02 am
New update: Squashed the word wrapping bug that had been reported by Zero X. Diamond.

  View user's profile Send private message Visit poster's website
  • Joined: 08 Dec 2013
  • Posts: 189
Reply with quote
Post Posted: Tue Feb 18, 2014 3:34 pm
You could use 5-bit text encoding to save a lot of space on the text, should you get to that point. 5-bit encoding gives you 31 common letters with a marker for uncommon characters stored as a marker+byte.

Sonic 1 on the SMS has a quick and effective image compression algo. It splits the tileset into lines per tile and groups the same ones and the different ones. I've disassembled the routine so it wouldn't be difficult to implement.

Update: We've been looking at image compression and it looks as if Phantasy Star Gaiden is best: http://www.smspower.org/forums/viewtopic.php?t=14626
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Wed Feb 19, 2014 1:47 am
Kroc wrote
You could use 5-bit text encoding to save a lot of space on the text, should you get to that point. 5-bit encoding gives you 31 common letters with a marker for uncommon characters stored as a marker+byte.


You mean, Z-machine style text encoding? Maybe I could experiment with that; combined with some dictionary-based compression scheme, it could lead to some very efficient text compression.

Anyway, I'm also thinking about replacing SAM's current script format with something more efficient; as I was developing twee2sam, I've noticed how awkward SAM's scripting really was, specially for menus with conditionally-rendered options. Maybe I should go back to GINCS-style scripts; they would probably be less inadequate for automated conversion from Twine files.

Kroc wrote

Sonic 1 on the SMS has a quick and effective image compression algo. It splits the tileset into lines per tile and groups the same ones and the different ones. I've disassembled the routine so it wouldn't be difficult to implement.

Update: We've been looking at image compression and it looks as if Phantasy Star Gaiden is best: http://www.smspower.org/forums/viewtopic.php?t=14626


Maybe I could experiment with that too. It would mostly mean updating the version of BMP2Tile that's used by SAM and then replace the graphics decompression routine to the PS Gaiden one. Shouldn't be too difficult.
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Thu Feb 20, 2014 2:25 am
Here's a new version of twee2sam; as suggested by Maxim and Kroc, it is now using the PS Gaiden compressor for improved image compression.
twee2sam-2014-02-19a.rar (2.95 MB)
twee2sam, now with improved image crunching goodness

  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Tue Mar 11, 2014 1:21 am
Here's a new version of twee2sam, now with support for Mod2PSG2 music.

  View user's profile Send private message Visit poster's website
  • Joined: 14 Oct 2006
  • Posts: 259
  • Location: NYC
Reply with quote
Post Posted: Tue Mar 11, 2014 7:34 am
Is an example game available that makes use of all the features?
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Tue Mar 11, 2014 10:48 am
Yes, it comes with a couple of examples included.
  View user's profile Send private message Visit poster's website
  • Joined: 01 Aug 2012
  • Posts: 266
  • Location: Porto, Portugal
Reply with quote
Post Posted: Tue Mar 11, 2014 4:39 pm
haroldoop wrote
Yes, it comes with a couple of examples included.

missing the compiled sms files for the lazy people... ;)
  View user's profile Send private message Visit poster's website
  • Site Admin
  • Joined: 19 Oct 1999
  • Posts: 12483
  • Location: London
Reply with quote
Post Posted: Tue Mar 11, 2014 9:51 pm
They're just tests, not real games.
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Wed Mar 12, 2014 10:17 pm
nitrofurano wrote
haroldoop wrote
Yes, it comes with a couple of examples included.

missing the compiled sms files for the lazy people... ;)


Okay, here goes a version that includes the precompiled ROMs. :P

Maxim wrote
They're just tests, not real games.


Well, I may try to cook up something later...
twee2sam-2014-03-12a.rar (2.99 MB)
Twee2SAM extra-lazy edition! ;)

  View user's profile Send private message Visit poster's website
  • Joined: 16 Mar 2014
  • Posts: 3
  • Location: Auckland
Reply with quote
Great program
Post Posted: Sun Mar 16, 2014 12:15 pm
I really love all the work you've done on this!
I've been trying to put together a test ROM, but I keep getting an error. Most likely some amateur mistake. Here's what the compiler is showing me.

KeyError: 'Start'
tree2sam returned an error
Press any key to continue . . .


Any idea as to what I can do? There is the twee, txt and tws in the correct directory. I'm sure I put the story together fine, it works on HTML. There aren't even any images in it either. I've got the feeling I'm missing something really simple.
  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Sun Mar 16, 2014 2:18 pm
imp wrote
I really love all the work you've done on this!


Thanks! It's nice to know that people are using it. ;)

imp wrote
I've been trying to put together a test ROM, but I keep getting an error. Most likely some amateur mistake. Here's what the compiler is showing me.

KeyError: 'Start'
tree2sam returned an error
Press any key to continue . . .


Any idea as to what I can do? There is the twee, txt and tws in the correct directory. I'm sure I put the story together fine, it works on HTML. There aren't even any images in it either. I've got the feeling I'm missing something really simple.


Oh, I think it's missing the 'Start' passage. Twee2SAM requires an special passage named 'Start' in order to find out where it should begin. I gotta improve the error message in order to make it clearer but, for now, all you'll need to do is to rename your starting passage as 'Start', and that error should go away.
  View user's profile Send private message Visit poster's website
  • Joined: 16 Mar 2014
  • Posts: 3
  • Location: Auckland
Reply with quote
Post Posted: Sun Mar 16, 2014 9:37 pm
haroldoop wrote

Oh, I think it's missing the 'Start' passage. Twee2SAM requires an special passage named 'Start' in order to find out where it should begin. I gotta improve the error message in order to make it clearer but, for now, all you'll need to do is to rename your starting passage as 'Start', and that error should go away.


Yeah that's what I originally thought it was, except I do have my starting passage named "Start". I've attached my txt file for inspection.
test.txt (635 B)
Slightly more complicated one
othertest.txt (130 B)
Extremely simple, just to try get something working

  View user's profile Send private message
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Mon Mar 17, 2014 1:24 am
imp wrote
Yeah that's what I originally thought it was, except I do have my starting passage named "Start". I've attached my txt file for inspection.


Okay, problem solved: it was an UTF-8 encoding issue. This new version solves that bug.

  View user's profile Send private message Visit poster's website
  • Joined: 31 Aug 2014
  • Posts: 2
Reply with quote
Post Posted: Mon Sep 01, 2014 7:32 am
Thanks a lot for this! This is really cool. I just started work on a game using this, and made a few improvements that helped with the stuff I was doing. I've submitted 4 pull requests on the Github repo with a couple of new features, and a couple of cleanups.
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Tue Sep 02, 2014 11:27 am
mstea wrote
Thanks a lot for this! This is really cool. I just started work on a game using this, and made a few improvements that helped with the stuff I was doing. I've submitted 4 pull requests on the Github repo with a couple of new features, and a couple of cleanups.


Wow, thanks! ;)

I haven't taken a look at my Github repositories for a while... I shall merge the modifications later on.
  View user's profile Send private message Visit poster's website
  • Joined: 31 Aug 2014
  • Posts: 2
Reply with quote
Post Posted: Fri Sep 05, 2014 5:23 pm
Thanks!

A few of the PRs make big changes to the same areas of code; let me know what order you want to merge them in, and I'll rebase them as appropriate.
  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Wed Dec 31, 2014 2:15 pm
Hi, I'm trying to use twee2sam to put together a simple D&D style adventure game... nothing to show at the moment, but I'm having a right nightmare getting things to work correctly.

A couple of queries:

1. How do I embed newlines? Everything I try results in the text running on from the previous line.

2. What is the correct format for images? I'm using 256x144 png, no compression, no interlacing, 16 colours. I've got SAM downloaded and running via Wine (I'm on Linux) and it seems to be generating the tiles/tilemap and palette files, but when the resulting rom file runs I either get corrupted images, or an endless cycling of flashing corrupted sprites (does the latter mean the image is too complex? I'm using GIMP to reduce colour range and dither the image/flatten it, maybe there's something better suited though?).

I've attached my twee source code, image and twee2sam output directory, as well as the generated output.sms rom file.

Is anyone else using this tool?
test.zip (43.26 KB)
test files

  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Wed Dec 31, 2014 5:46 pm
Megatron-UK wrote
Hi, I'm trying to use twee2sam to put together a simple D&D style adventure game... nothing to show at the moment, but I'm having a right nightmare getting things to work correctly.


It's always nice to see someone using the tool. ;)

Megatron-UK wrote

1. How do I embed newlines? Everything I try results in the text running on from the previous line.


Nothing special about it: any line breaks on the source text will be interpreted literally.

Megatron-UK wrote

2. What is the correct format for images? I'm using 256x144 png, no compression, no interlacing, 16 colours. I've got SAM downloaded and running via Wine (I'm on Linux) and it seems to be generating the tiles/tilemap and palette files, but when the resulting rom file runs I either get corrupted images, or an endless cycling of flashing corrupted sprites (does the latter mean the image is too complex? I'm using GIMP to reduce colour range and dither the image/flatten it, maybe there's something better suited though?).


The image seems to be correct: I compiled the project on my computer, and the image displayed okay. The only difference I've noticed was that, in my case, "gates (tiles).pscompr" was 207 bytes long, while in the zip you sent, the file is 213 bytes long. There seems to be some incompatibility in the conversion process; maybe a different version of bmp2tile?

Megatron-UK wrote

Is anyone else using this tool?


I'm sorry; unfortunately, I haven't received any news about any other projects using twee2sam so far... :P

Anyway, I'm sending back the test project, as compiled on Windows; maybe we can compare the differences to see what may be going wrong.
sandsofterror-windows.zip (15.62 KB)
Sands of terror test

  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Thu Jan 01, 2015 10:12 am
Yes, that output.sms file works correctly for me.

I'm using a git clone of your SAM package, dated Feb 19th. I'm wondering if there is a problem running the included bmp2tile binary under Wine?
  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Thu Jan 01, 2015 10:40 am
Yep, to confirm, the generated .pscompr file that I'm getting is completely different.

Here's your working file:

$ hexdump -C gates\ \(tiles\).pscompr
00000000  23 00 00 80 fc 00 01 03  80 f0 00 3f ff ff ff 80  |#..........?....|
00000010  f0 00 80 e0 f0 f8 80 f8  00 0f 3f 7f 80 f8 00 e0  |..........?.....|
00000020  f8 fc 80 fc 00 01 07 80  fc 00 fc ff 80 3f 0f 07  |.............?..|
00000030  07 40 80 3f fe fc fc 80  1f 03 00 01 01 80 7f ff  |.@.?............|
00000040  fe 80 1f 80 00 00 00 80  0f 7f 0f 1f 3f 3f 80 0f  |............??..|
00000050  f0 80 c0 e0 e0 80 07 00  0f 07 07 03 01 80 fc ff  |................|
00000060  3f 00 c0 fe fc fc f8 f0  e0 80 00 80 0f 00 03 03  |?...............|
00000070  01 01 80 f8 ff 7f 3f 0f  80 f0 ff fe fc f8 e0 80  |......?.........|
00000080  3f 00 80 80 80 e0 7f 3f  3f 1f 0f 07 80 e0 f0 e0  |?......??.......|
00000090  e0 c0 80 00 80 7f 00 01  80 7f 00 fc 80 e0 00 01  |................|
000000a0  03 07 0f 0f 80 1f ff 00  00 7f 80 e0 00 c0 e0 f0  |................|
000000b0  f8 f8 80 fe 1f 0f 80 fe  fc f8 80 0f 00 0f 07 03  |................|
000000c0  01 80 f0 ff 7f 00 00 00  80 0f 00 f8 f0 e0 c0     |...............|
000000cf


... and here's mine:

$ hexdump -C gates.tiles.pscompr
00000000  0e 00 82 01 03 04 00 81  3f 03 ff 04 00 84 80 e0  |........?.......|
00000010  f0 f8 05 00 83 0f 3f 7f  05 00 83 e0 f8 fc 06 00  |......?.........|
00000020  82 01 07 06 00 84 fc ff  07 07 06 0f 08 ff 02 fc  |................|
00000030  06 fe 83 00 01 01 05 03  81 fe 07 ff 03 00 05 80  |................|
00000040  84 0f 1f 3f 3f 04 7f 84  80 c0 e0 e0 04 f0 85 0f  |...??...........|
00000050  07 07 03 01 03 00 06 ff  8e 3f 00 fe fc fc f8 f0  |.........?......|
00000060  e0 80 00 03 03 01 01 04  00 05 ff 83 7f 3f 0f 04  |.............?..|
00000070  ff 86 fe fc f8 e0 80 80  06 00 03 7f 02 3f 83 1f  |.............?..|
00000080  0f 07 03 f0 02 e0 84 c0  80 00 01 07 00 81 fc 0a  |................|
00000090  00 88 01 03 07 0f 0f 00  00 7f 05 ff 03 00 85 c0  |................|
000000a0  e0 f0 f8 f8 07 1f 81 0f  07 fc 85 f8 0f 07 03 01  |................|
000000b0  04 00 04 ff 81 7f 03 00  84 f8 f0 e0 c0 04 00 00  |................|
000000c0  7f 00 7f 00 1a 00 00 7f  00 7f 00 1a 00 00 7f 00  |................|
000000d0  7f 00 1a 00 00                                    |.....|
000000d5


So it seems like bmp2tile doesn't run as expected under Wine. I'll need to look into this a bit further.

Anyone have a working bmp2tile solution for Linux?
  View user's profile Send private message Visit poster's website
  • Site Admin
  • Joined: 19 Oct 1999
  • Posts: 12483
  • Location: London
Reply with quote
Post Posted: Thu Jan 01, 2015 11:13 am
Virtualbox? The compressor code is not platform specific, can you confirm if the uncompressed data is the same?
  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Thu Jan 01, 2015 11:43 am
I can try a Vista VM that I've got, but it would be a pain to fire that up just to run the convertor. It could be that there's a dll missing or a wrong version in my Wine setup that is causing the problem.

Can you clarify what files you want me to compare?
  View user's profile Send private message Visit poster's website
  • Joined: 25 Feb 2006
  • Posts: 509
  • Location: Belo Horizonte, MG, Brazil
Reply with quote
Post Posted: Thu Jan 01, 2015 11:51 am
That's really weird; I don't see why bmp2tile would give different results under Wine.

Maybe it's drunk? :P

Now, seriously, it's a really weird problem. The bmp2tile version should be 0.4, but since you're using a repository clone from Feb 19, you should already have the correct version.

If you try to convert the image using the bmp2tile GUI, instead of command line, using PS Gaiden compression, does the resulting compressed tile file have the same size?

One possible (if mildly complex) option would be to compile BMP2Tile's source; the DLLs seem to be implemented in C++, but the main program is implemented in Delphi, which should prove to be more of a challenge to adapt to Linux; Lazarus could take you halfway there.

I guess that, if everything fails, one final option would be to hack SAM to use some other compressed format, just to see if it works or not.
  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Thu Jan 01, 2015 5:21 pm
It is indeed strange... via the gui I get the same 213 byte file, so there's something odd going on somewhere!
  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Thu Jan 01, 2015 5:45 pm
Aha! Think I've got it - it's a file naming thing... I had to alter convtiles.bat to convtiles.sh to run via Bash and I *think* I've mucked up the file suffix ... it's creating .pscompr and not psgcompr... the PSG format generates a 207 byte file, the PS format 213... and I presume that SAM is assuming the tiles are always in PSG?

Let me check what my shell-script version of your convtiles.bat file is actually doing!
  View user's profile Send private message Visit poster's website
  • Joined: 27 May 2012
  • Posts: 30
  • Location: UK
Reply with quote
Post Posted: Thu Jan 01, 2015 6:07 pm
Yep, this is down to the 'rn' commands in convtiles.sh - I didn't notice that they do a rename of the generates psgcompr tiles to pscompr suffix (as that is what SAM is expecting in the Images.txt.inc file.

I've just added a sed command in build.sh to process the entries in Images.txt.inc to the correct suffix (rather than renaming the files to an incorrect suffix) and it works correctly now!
  View user's profile Send private message Visit poster's website
Reply to topic Goto page 1, 2, 3  Next



Back to the top of this page

Back to SMS Power!