Register | Login
Views: 19364387
Main | Memberlist | Active users | ACS | Commons | Calendar | Online users
Ranks | FAQ | Color Chart | Photo album | IRC Chat
11-02-05 12:59 PM
Acmlm's Board - I2 Archive - - Posts by Glyph Phoenix
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
User Post
Glyph Phoenix

Level: 39

Posts: 301/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-25-05 08:14 AM, in Read me. NOW. Link
I think you guys are missing the point. Old topics are often outdated and sometimes have pointless content built up but sometimes they have relevent information that shouldn't be shoved into some link when you make a new topic. It's the pointless part of pointless bumps that we have a problem with.

mikepjr shouldn't have to ask before he bumps an old topic of his with relevent information.

And that sticky thread idea would be a total waste of everyone's time. Just bump the damn thread if you feel compelled to add something useful and use your best judgement. Because it's the n00bs who are abusing their bump abilities, not people like mikepjr who just want to add some screenshots.
Glyph Phoenix

Level: 39

Posts: 302/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 03:42 AM, in Read me. NOW. Link
That is fine, just not what your original posts seemed to imply. But I'm just really sick of this "leave it to the mods" mentality.

"Stop acting like a mod". Argh. If somebody has a good point, they should never ever be told this. And yet they are, even by semi-sane people like Blackhole. Mods can lock/move topics and can access search.php. There's your big difference.

And yet some people seem to believe that only mods should bring topics back on topic, and only mods should make definitive decisions. The only real decision mods can make that regular members can't is exactly where topics go when they've outlived their usefulness (if the topic ever actually had any).
Glyph Phoenix

Level: 39

Posts: 303/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 03:46 AM, in Is it possible to... Link
We need a damn ASM sticky, that's what we need. Because once we have a sticky officially containing that information, "I caNNOT vined ASM/ ?? Where can I f8ind the aSM?" can be answered even more easily than before.

Even though no n00b has ever actually read a sticky, you can at least link to it when they complain and that way they have to stop complaining.

In fact, since I almost know ASM, I think I'll go get on that topic right now. I mean, it might not end up stickyworthy, but I might as well give it a shot.


(edited by Glyph Phoenix on 06-25-05 06:47 PM)
(edited by Glyph Phoenix on 06-25-05 06:49 PM)
Glyph Phoenix

Level: 39

Posts: 304/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 03:59 AM, in Is it possible to... Link
Hey. I called dibs on the idea. Dibs! So I'm making it right now. You guys can add to it if you want.
Glyph Phoenix

Level: 39

Posts: 305/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 05:36 AM, in Learning SMW ASM [ASM howto] Link
Here are some useful ASM resources:

MarcTheMer's SNES asm tutorial

SPASM ASM reference - This is a great .hlp file. It contains all the opcodes alphabetically organized.

Hex editors - You'll need one of these.

Escherial's SMW Memory Map - A great combination of RAM addresses

==Conversion==

Before you start, you should know how the Memory Map and ASM pointers work. Example:

Coins = 7E0DBF in the Memory Map. This is the preferred way to list a ram address.

Coins = BF 0D when you're pointing with ASM.

As you can see, the difference is simple: remove the 7E, which is often implied in ASM coding, and rearrange the two pointer bytes.

So 7E0DBF becomes BF0D.

==Starting out==

Super Mario World, if you haven't opened it up with a hex editor, is made up of hexadecimal numbers. These start at 0, and end at FF. Hexadecimal is weird. Look at how weird it is here.

Now, many numbers are just regular numbers. If you have Calculator in Windows you can open up the scientific part of it and convert between regular decimal and hexadecimal numbers. Many of them just values, like how many lives Mario starts out with.

Some numbers represent opcodes. These are commands that 65c816 ASM (which Super Mario World runs on) operates though. The help file linked above lists them all. They have two forms; one is a 3-letter pnumonic, the other is machine code. The lettered version can be assembled into machine code.

One of the best ways to learn anything is by doing. This thread is full of ASM traces. Here's one as an example:

x52D8, when Mario loses a life.

Using your hex editor, open up the SMW rom (you may need to edit it with Lunar Magic first so all the addresses are in the right place... not sure about this one) and jump to offset x52D8. You may need the x first, you may need an 0x first, or you may only need the numbers 52D8. Experiment to see exactly how your hex editor works.

At this place in the ROM, you should be reading the numberse CE, BE, and 0D. CE is a decremental opcode, and BE OD is a pointer to Mario's lives in ram. CE BE 0D tells the processor to take 1 from Mario's lives.

Now that you know this opcode and its pointer, you can change it to whatever you want.

Want it so Mario loses a coin instead of a life? Change the pointer BE 0D, Mario's lives in RAM, to BF 0D, Mario's coins. Tada. Mario loses a coin.

Another example? Change CE BE OD, Decrement lives by one, to 9C BF 0D. 9C is the absolute opcode STZ, Set To Zero, so the game goes to that address in RAM and sets it to zero. Tada. Now Mario loses all his coins. It is that simple.

Now, almost all opcodes work like or similar to that. They start with an opcode and are followed by more information pertaining to the opcode. But many opcodes need more than the pointer following it, and for that you need to use the accumulator, the status flags, and the X and Y registers which will be covered later.

At this point you only know one real place in the SMW rom, the 3 byte opcode that decrements your coins by one. There are other places out there you can decode with the 65816 help file or any other opcode list you can find. Check Hyperhacker's data, he listed a lot of nifty offsets in the memory locations thread. You will need to use Lunar Address to convert some of them. Check the section on Jump statements below if you want to know more about that.

The accumulator is this number always available to you. You load data into it using LDA, usually. In hexadecimal if you want to load the next byte you use A9 and if you want to load from a ram address you use AD. By writing A9, "Load number into accumulator" and 05, you load 05 into the accumulator. AD is "Load number from memory into accumulator", so writing AD and BF OD loads how many coins you have into the accumulator.

Now that that number is in the accumulator, you can do all kinds of nifty things with it. One of the most common is storing that number someplace else. This may not seem useful now, but if you create a blocktool block and a .bin file I can show you why it is.

Contents of the .bin file you should make:

A9 00 8D BF OD 60

A9 loads the next number, 00, into the accumulator. It is an immediate opcode, which means it uses the next number for whatever the opcode does, while absolute addressing opcodes would read the next two bytes and go to that space in RAM.

8D stores the accumulator into BF OD, where Mario's coins are located. 8D takes whatever's in your accumulator and since it's an absolute address opcode, it stores it at the space in ram designated by the next 2 bytes.

60 is a "return from subroutine" statement you have to put at the end of every blocktool bin file. More on that later.

Now create a block in blocktool and set its script address to the bin file you made. You have now just created your own block, which sets coins to zero. In Blocktool you should set all of the offset fields to -1 except for Above, Below, and Sides, which you should set to 0. Import the block into LM and set its type to 25.

Alternatively, set every setting to -1 except for Above and set the block's type to one of the question mark blocks. Now in addition to whatever the question mark block did, it will set your coins to zero.

You should be able to edit the BF OD to BE OD and it will set Mario's lives to 1. The reason it is one and not zero is because SMW is programmed funnily. If you change the 00 to 01 it will set Mario's coins to 1. You can modify this simple script using what you know.

Starting with simple stuff like this, you can move onto complex ASM hacks. That's all for now. Content added to this thread would be much appreciated.

==More Blocktool==

You already know how to create a basic blocktool block, but one of the nifty things about Blocktool is how within Blocktool code you can change the way a block acts.

Create a .bin file with the following code:

A0 01 A9 30 8D 93 16 60

A0 is a command that loads the next number into the Y register. The X and Y registers are variables like the accumulator that are used for storing temporary data. In blocktool code, Y is the high byte of the type of block you are coding. If you'll recall, 130 is the name of the concrete block in LM's map16 editor. A0 01 loads the "1" of "130" into the Y register.

Now you store the "30" of "130" at 93 16. That's where you store the low byte of block types. If you'll recall, 8D is "Store accumulator at address". Since your accumulator has been set to 30, this completes the code.

Well, actually, that mandatory 60 "return from subroutine" should complete the code.

So create a custom block and set the script to the one you just made. Set Above, Below, and Sides to 0 and the rest to -1. In LM set the block's type to 25. 25 is a block of blank space.

Now, what does this do? When touched, blocktool code activates. The code tells this block to act like 130. That means that from whatever the block is supposed to do, it instead acts like a concrete block.

But... the block is only set to activate when touched from sides, above, and below by Mario. Therefore all other sprites go through it. This is now a "block only Mario" block. By changing the settings, you can make it a "block everything but Mario" block.

Most likely the greatest thing you can do, however, with Blocktool block types is use it with branch statements. I'll get to that later.

==Branch Statements==

Branch statements are very important. If you know C or C++ or Java or Javascript or virtually any other programming language, it should have branch statements as well. (Usually called IF statements.)

Branch statements work a little differently in ASM. When the branch's requirements are met, the code jumps to a different place. I have made an example, but it is complicated and untested. I repeat, I have not tested this code, so I have no idea whether or not it will mess up your stuff.

My example, this blocktool .bin file code:

AD 86 00 C9 00 F0 03 CE 86 00 60

AD should load the data at 86 00 into the accumulator. 86 00 points to how slippery the level is. C9 is a comparison statement. It compares your accumulator (currently holding the level friction) and the byte that comes directly after it, in this case 00.

When you use comparisons this tells your emulator that whether or not there is a difference between the accumulator (holding the level friction) and the number after the C9 opcode (00).

Now, here's the clincher... F0 03 skips 3 spaces. But only if the zero status flag is set.

This means that if your coins are equal to 00, the code in bold is never read. How is this useful? You'll find out.

The code CE 86 00: CE decrements, and 86 00 is how slippery the level is.

The branch statement before the code is saving you from having the slippery level variable go below zero. Because if it, did we'd have an overflow on our hands and those suck.

60 at the end should finish every blocktool script.

To make sure the block doesn't go nuts and activate every frame that you're touching it, set all options to -1 except for below. In Lunar Magic, set the block type to one of the question mark blocks.

Now you have a block that, along with all the other things the question mark block did, will make the level less slippery and not glitch up when the level friction is equal to zero. At least, it shouldn't glitch up, but it might anyway because I haven't tested it.

== Jump Statements==

The stack is a place where memory is temporarily stored. You push and pull numbers onto it. Once you push a value onto the stack you can take it back off with a pull opcode. A basic understanding of this is useful when you get to JSR and JSL (and RTS and RTL) statements, but not necessary for now.

This was taken and edited from Darkflight's post.

Jump statements tell the processor to move to a new section of code, instead of simply increment a byte. JML is the 24-bit equivalent of JMP, wheras JMP is only 16-bit. JSR and JSL are the same as their respective counterparts, but they also push the current program counter to the stack (again, 16-bit and 24-bit addresses respectively), before jumping to the desired offset. RTS and RTL are the same as the JMP and JML commands, but instead of getting the destination address from code, they get their destination addresses from the stack.

After JSR and JSL push your original position onto the stack, RTS and RTL take that position and use it to go back once the opcode is finished. If you look at the Blocktool code above, you'll see the opcode RTS at the end of every block. This is what you put at the end of your block code to go back to wherever the code was called from.

RTL and RTS are easy to use because they are only one opcode byte; 6B and 60 respectively. Just place that whenever you want to return from your subroutine. But when jumping you will have to manually choose your address and that is quite a pain to do.

You should get Lunar Address for this. By putting the PC address (the one in your hex editor) in the right box, you can use Lunar Address to translate it from a PC to a SNES address.

But when hex editing you have yet another problem to face. If your SNES address is, say 028787 (not a valid address, don't try it), you will need to change it to 878702 for your Jump Long due to the way the SNES reads addresses.

==The Status Flags==
The 65c816 processor uses 8 flags that determine what certain opcodes do.

There is a carry flag, which adds or subtracts one from your ADC and SBC results (more later).

There is a negative flag, which is used by branch opcodes to check whether or not the number in your accumulator is above or below zero, and by comparison opcodes to check whether or not your accumulator is greater or less than the number you're comparing.

The rest have other purposes, which will likely be discussed here in more detail when I remember what they are.

==The X and Y Registers==

These are like Mini-accumulators. When you don't want to change your accumulator and you don't want to bother with addressing a special spot in RAM, just load your value into your X and Y registers. Also, they REALLY come in handy during indexing.

Indexing is when you take a normal storage opcode and make wherever it's supposed to store its location change based on your X or Y register. (Usually X.)

This means instead of manually telling the processor where to store each variable, you can just increase the X register by 1 and using an indexed storage opcode, it'll place your byte at wherever it would normally store it at + 1.

Be careful when you use these two in custom block code, as they take on other purposes. That's why you should push whatever's in your X and Y registers before use, and pull it once you're done. (see below)

==An explanation of the Stack==
Sukasa's explanation:

The Stack, in SNES programming, is a special memory address that is used for various things. Of these, it (in my experience) is mainly used for JSR and JSL statements, and preserving register states. Think of the stack like a book pile, you can add books (pushing to the stack), or remove a book (But only off of the top!). The stack can be helpful for a reson like this:

You have the accumulator set to $55, but need to use it for math. You have no available RAM, what do you do? Simple, you PusH the Accumulator (PHA), and do your math, storing it to it's RAM location. Now, to get the Accumulator back the way it was, you need to PuLl the Accumulator (PLA). in doing this, you put the Accumulator back to $55, AND did your math without losing any data. See how helpful the stack is?

Back to me again:

It's important to push your Y (and maybe X, too, I'm not so clear on that) registers onto the stack if you plan on using X and Y during blocktool code.

5A (PusH Y) pushes your Y register onto the stack and DA pushes X (PusH X), but it'll mess up your return from subroutine blocktool code if you're not careful. Once you're finished, pull Y again with 7A (PulL Y) and X with FZ (PulL X). Between the push and pull, you can do whatever you want with the registers.

That is, unless you want blocktool to change your type of block. That's what it does with the X and Y addresses. It allows you to manipulate them, and then your block. But if you're just using them for indexing, you can seriously mess up your block because you didn't push first and pull after.

==ADC and SBC==

Written by Sukasa, edited by me

ADC
ADC stands for ADd with Carry. It adds a number to the accumulator, and adds an extra 1 if the carry flag is set.

To use ADC for normal addition, you first want to clear the carry flag with the instruction CLC (CLear Carry flag). After that, you simple use the command
ADC ____, such as ADC #$88 or ADC $1A76. In both of these examples, the value after ADC is added to the accumulator, for the first, that's $88, and for the second that's the value at $1A76 in RAM. Let's say that the accumulator was originally $20, and $1A76 is $10. With the carry flag cleared, the results would be $A8 and $30, respectively. However, if the carry flag is set, then the results would have been $A9 and $31, respectively. See the difference?

When using this opcode, be careful that your result is never greater than FF in hex (255 decimal). If this happens, your number will loop around and become 00 in hex.

SBC
SBC stands for SuBtract with Carry. It is the opposite of ADC, and also affects the accumulator. Like ADC, to subtract properly the carry flag must be cleared (Use CLC). So, with A still being $20, and $1A76 still $10, here are the results for SBC #$18 and SBC $1A76 with the carry flag cleared- $08 and $10, respectively. Although you may guess what SBC will output with the carry flag set, I'll mention it anyways- $07 and $0F, respectively.

When using this opcode, be careful that your result is never less than 0. If it is, it'll loop back around and become FF in hex.

==Opcodes==

A9 - LDA - LoaD into Accumulator, immediate

This takes the number right after A9 and loads it into your accumulator.

AD - LDA - LoaD into Accumulator, absolute

Put a 2-byte RAM address right after AD, and it will be loaded into your accumulator.

8D - STA - STore Accumulator to Memory, absolute

Take what you loaded into your accumulator and store it at the place in ram signified by the next 2 bytes.


(edited by Glyph Phoenix on 06-25-05 08:37 PM)
(edited by Glyph Phoenix on 06-26-05 04:12 PM)
(edited by Glyph Phoenix on 06-27-05 05:17 PM)
(edited by Glyph Phoenix on 08-11-05 10:39 PM)
(edited by Glyph Phoenix on 10-07-05 05:08 PM)
(edited by Glyph Phoenix on 10-07-05 05:32 PM)
(edited by Glyph Phoenix on 10-15-05 10:14 PM)
(edited by Glyph Phoenix on 10-17-05 06:59 PM)
(edited by Glyph Phoenix on 10-17-05 07:37 PM)
Glyph Phoenix

Level: 39

Posts: 306/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 05:44 AM, in Learning SMW ASM [ASM howto] Link
No, no, no, Kyouji. Only the people who don't need to read them read the sticky threads. And now we have a solid defense against asm hacker wannabe lamers. Before it was "Er... we don't actually have a tutorial.... try google" and so the lamers could get off without as much as a lock. Now they'll have no such luck.

And wow, that was a fast sticky.
Glyph Phoenix

Level: 39

Posts: 307/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 05:58 AM, in Learning SMW ASM [ASM howto] Link
To JJ, Fu, BMF, Smallhacker, and HH:

You guys know this stuff far better than I do, and you'd probably do a better job editing the tutorial with more information than I would. If any of you guys wanted to add information into that first tutorial post or something, it would be much apprecated.

And to anybody else who has something to add, just PM or mention it in this thread and I'll probably end up adding it sometime.
Glyph Phoenix

Level: 39

Posts: 308/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 07:09 AM, in Learning SMW ASM [ASM howto] Link
No. Not yet. Maybe when I have resources to explain HDMA and stuff, but for now I think I'll keep it to simple information and then expand the tutorial to encompass complicated stuff like HDMA.

I mean, I haven't even gotten to BRANCH STATEMENTS yet. I'm not just going to toss HDMA into the tutorial.
Glyph Phoenix

Level: 39

Posts: 309/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 07:25 AM, in New screenshots from the depths of finality games Link
That banking system actually sounds pretty nifty. I should get around to implementing some sort of banking thing for my hack or other. I implemented this crap level system. A good coin system would blow it out of the water.
Glyph Phoenix

Level: 39

Posts: 310/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-26-05 04:21 PM, in Learning SMW ASM [ASM howto] Link
I do plan to get to all that eventually, though. How to use "No operation", EA if you have extra space and how to use subroutines and all that jive.
Glyph Phoenix

Level: 39

Posts: 311/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-27-05 12:21 AM, in SMB3 pipe demo Link
Kei, Mario and Luigi use... like... almost the exact same coding. In fact, they're not really so much separate entities as palette swaps whose only real differences are the fact that one is green and one red, a flag that tells you which you are currently playing, that tag on Layer 3, and having their coins stored at different places.
Glyph Phoenix

Level: 39

Posts: 312/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-27-05 01:12 AM, in [ASM]Making Blocks change/explode Link
Blocktool already has blocks that change into other blocks and blocks that explode at certain times. Use those.

Now, I'm not quite sure how to graphically change a block, but I do know that there are two bytes in RAM you can change in custom block code that will cause the custom block to act like a different LM block.

Since I don't want to write out the explanation to this twice, I have added this to the ASM tutorial.
Glyph Phoenix

Level: 39

Posts: 313/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-27-05 01:27 AM, in Toad's quest: new screen shots and more.... Link
Hey, man. The physical properties of Warp Pipes are complex. Maybe your puny human mind is simply to simple to comprehend their complexity!

Really, though, Wario's pretty bad. He did try to take over Mario Land at one point. Wario really is a villian, he's just not obsessed with defeating Mario or kidnapping the princess. He branches out into stuff like Minigames, but even then he usually ends up swindling people out of their work.
Glyph Phoenix

Level: 39

Posts: 314/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-27-05 01:53 AM, in Toad's quest: new screen shots and more.... Link
When somebody makes a post calling anybody a "puny human" chances are they're not being serious.
Glyph Phoenix

Level: 39

Posts: 315/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-28-05 01:38 AM, in help with the level background..... Link
Ugh. You probably didn't press F9 in order to save custom background tiles in the Map16. All this information is in Lunar Magic's help file and repeated in the stickied threads. Don't make new threads about it.
Glyph Phoenix

Level: 39

Posts: 316/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-28-05 08:52 AM, in Learning SMW ASM [ASM howto] Link
The BRA opcode has a hexadecimal equivalent of 80.

During the tutorial I skipped the three letter opcodes completely. I find the hex numbers and their equivalents far easier to manage. If you're using an assembler or disassembler three letter opcodes are necessary, but they just get in the way if you're editing with hex.
Glyph Phoenix

Level: 39

Posts: 317/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-30-05 06:46 AM, in Screenshots From Super Mario Era: Bowser's Revenge [large, but linked SS] Link
Well, there were cyborg Chargin' Chucks in BMF's hack. And Trashy had Koopas in space suits. And those awesome robot spinys...

Aw, man. Now I'm all depressed because BMF hasn't released a demo in a long time.
Glyph Phoenix

Level: 39

Posts: 318/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-30-05 01:42 PM, in ASM hack requests Link
Definately not going to happen. At least, not for like... months and months, and even if then it'll be because I want to. Making a new Mario suit is not a job you undertake because some newbie wants you to, because it's a job only the experienced could do and even then they'd need to really work at it. It would take a lot of experience to first change the ROM so it can handle new suits, and then of course ASM the new graphics and such.

First HabsoluteFate has to come out with that thing of his that makes it easier to add different power ups, and even then it'd take quite a long time for me to learn to use it and efficiently add powerups. If ever either actually comes to pass.
Glyph Phoenix

Level: 39

Posts: 319/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 06-30-05 01:50 PM, in New Mario's Return screenshots Link
Kyouji doesn't know how to utilize things like HDMA.

As for the graveyard, you've screwed it up even worse. The poles still don't look... remotely like poles. The various enemies at the top wouldn't be so bad if they were paletted correctly and not obnoxiously foreground-looking like they are.

And your gravestones are still blah at best. A few RIP ExGFX tiles would do it good.
Glyph Phoenix

Level: 39

Posts: 320/745
EXP: 385876
For next: 18895

Since: 11-07-04

Since last post: 2 hours
Last activity: 2 hours
Posted on 07-01-05 08:51 AM, in New Mario's Return screenshots Link
Damn it. You have to find a nice medium level of shading to use here. First they were so different they screwed with the foreground, and now they are so dark they're hard to make out. You claim the Boo and Lantern ghost are too light, but I'd say they're both better than the others.

But at least you fixed the poles now. It looks like an actual fence now. Good.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
Acmlm's Board - I2 Archive - - Posts by Glyph Phoenix


ABII


AcmlmBoard vl.ol (11-01-05)
© 2000-2005 Acmlm, Emuz, et al



Page rendered in 0.018 seconds.