From SMWiki
Revision as of 18:31, 4 December 2012 by Ultimaximus (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search




#serioushax, some minor channels

Most important function

Looking in the ROM and RAM maps, including a more flexible system than ctrl-f

AlcaRobot is a c00lsaucen0ice bot on the IRC. He can mainly do stuff related to SMW hacking, like looking in the ROM and RAM maps. It also has some unrelated functions.
If you want him on your channel, use /invite or contact Alcaro. Note that he doesn't rejoin if he's kicked, nor does he rejoin a channel he's invited to if the server dies (but nothing's stopping you from inviting him again).



(Note that this was typed down in August 2011 entirely from memory. It is very likely slightly inaccurate.)

Work on this bot started in July 2009, after a bunch of spammers struck SMW Central. Alcaro wanted an automatic way to tell when someone registered on SMW Central, so he grabbed his C++ compiler and made an IRC bot with the nick RegCheck, which was sent it to #staff. It helped catch another spammer the same day.

It quickly got a bunch of new features, for example telling the title of a linked HTML document. This meant the nick was now inaccurate, so it was changed to AlcaRobot, which it has kept since then.

When this bot got a feature to tell what a ROM or RAM address does, it was also sent to #serioushax. A few days later, Kieran told #staff that he doesn't like bots like that (Alcaro was AFK and couldn't respond, but he removed the bot when he returned). It never returned to #staff, but it has remained at #serioushax ever since.

The bot quickly got more features and joined some more channels, and became a welcome addition to #serioushax. But one problem remained: Alcaro didn't have access to any computer that could run 24/7, so when he went to bed, AlcaRobot also disappeared.

A while (a year I think) later, Smallhacker appeared and offered to host this bot. Shortly before, it was rewritten in PHP, and lost a bunch of useless features, including a permanent removal of the title grabber (which had been kept, but commented out, for many months), but gained some other features, for example the ability to create new commands without rebooting the bot (an impossibility in C++, at least without some really weird tricks), and the ability to run on non-Windows systems (which was never used).

A few more months later, Alcaro found that PHP has some annoying limits, and rewrote it in C++. Very little code from the old bot was kept, and a few more useless features from version 2 was removed, but the most useful features was readded.

It is currently hosted by p4plus2.


To use a command, you need to prefix it with "!ar" and/or send it in a query for him to notice it. Then you need to tell which command you want to use (feel free to experiment with the ones in this list), and then put the proper parameters after it.


This command tells about a ROM or RAM address (it uses the rom/ram maps on smwc). Note that it'll just give you a link to the information if the output is too long. It will also guess what you meant if you don't ask for the first byte in the address. For ROM, both PC and SNES addresses are allowed.

<Alcaro> !ar ram 7f
<AlcaRobot> Address not found, showing $7E007E instead:
<AlcaRobot> Player X position (16-bit), within the borders of the screen. (2 bytes, ends at $7E007F)
<Alcaro> !ar rom 0030e
<AlcaRobot> (JSR) OW Music uploader. (15 bytes, ends at 0x0031C)


This command looks for one or more words in the ROM or RAM maps and presents it in a condensed form that's easier to traverse, if you know what you're looking for but not exactly where it is.

<Alcaro> !ar findram player coin
<AlcaRobot> $7E0DB6: Mario's coins. Note that this is only used in two player games, you'll want $7E:0DBF in 99% of the cases.
<AlcaRobot> $7E0DB7: Luigi's coins. Note that this is only used in two player games, you'll want $7E:0DBF in 99% of the cases.
<AlcaRobot> $7E0DBF: Current player coin count.
<AlcaRobot> $7E13F4: A byte assigned to each row of blocks in the coin bonus game. Updated as blocks are chosen by the player to decide whether a life is given or not.
<AlcaRobot> $7E1432: Directional coin activation flag.
<AlcaRobot> $7E18E3: How many of the coins from the coin game cloud (the one that appears if Yoshi eats two pink berries) the player has collected.


This command finds all addresses containing the defined words.

<Alcaro> !ar postall xspeed
<AlcaRobot> --$7E007B--
<AlcaRobot> Mario Xspeed. #$7F is the fastest rightwards speed, while #$80 is the highest leftwards. +/-#$15 is fully walking, +/-#$30 is fully running. #$00-#$7F is right, #$80-#$FF is left.
<AlcaRobot> Length: 1 byte.
<AlcaRobot> --------
<AlcaRobot> --$7E16B5--
<AlcaRobot> Block Bounce Sprite XSpeed Table
<AlcaRobot> Length: 4 bytes, ends at $7E16B8.


For a few pieces of information that are not in the RAM map for some reason.

<Alcaro> !ar xram
<AlcaRobot> List of topics: INTERACT, SPR
<Alcaro> !ar xram interact
<AlcaRobot> 00 - X low B     01 - Y low B
<AlcaRobot> 02 - Width B     03 - Height B
<AlcaRobot> 04 - X low A     05 - Y low A
<AlcaRobot> 06 - Width A     07 - Height A
<AlcaRobot> 08 - X high B    09 - Y high B
<AlcaRobot> 0A - X high A    0B - Y high A
<AlcaRobot> Mario uses slot B.


This one tells a bit about the commands used when porting music.

<Alcaro> !ar music
<Alcaro> !ar music owhead
<AlcaRobot> $ED $80 $6D $68
<AlcaRobot> $ED $80 $7D $00
<AlcaRobot> $F0
<Alcaro> !ar music $ED
<AlcaRobot> This is ADSR.


These two are for keeping track of the sound list.

<Alcaro> !ar sound
<Alcaro> !ar sound 1dfb 03
<AlcaRobot> Water Level
<Alcaro> !ar findsound coin
<AlcaRobot> $1DF9:1C: Yoshi/Dragon coin
<AlcaRobot> $1DFB:0E: P-Switch (also known as Direct Coins)
<AlcaRobot> $1DFC:01: Coin


This command converts between level number and $13BF format. It works in both directions. It is allowed to prepend a $ to the command name if you prefer that.

<Alcaro> !ar 13bf 105
<AlcaRobot> $029
<Alcaro> !ar $13bf 29
<AlcaRobot> $105


This command converts between SNES and PC addresses, in case you're too lazy to open Lunar Address.

<Alcaro> !ar addr 00f176
<AlcaRobot> $00F176 is 0x07376
<Alcaro> !ar addr 07376
<AlcaRobot> 0x07376 is $00F176
<Alcaro> !ar addr -nohead 00f176 -lorom
<AlcaRobot> $00F176 is 0x07176
<Alcaro> !ar addr -hi 07376 -noheader
<AlcaRobot> 0x07376 is $C07376


This command takes an address in one of RAM addresses $0200 and $0420 and returns the corresponding byte in the other. Not useful for most users, but it's useful if you're manipulating OAM directly.

<Alcaro> !ar oam 0313
<AlcaRobot> $0464
<Alcaro> !ar oam $0466
<AlcaRobot> $0318


This one tells what a sprite is. You can also use FINDSPRITE if you know the description but not the ID.

<Alcaro> !ar sprite 7d
<AlcaRobot> Balloon. (SP4=GFX02)
<Alcaro> !ar findsprite key
<AlcaRobot> 0E Keyhole.
<AlcaRobot> 70 Pokey. (SP4=GFX09)
<AlcaRobot> 80 Key.


This assembles an opcode ... or actually as many as you want. Colons are optional. Note that it is not a fully featured assembler, and supports only labels and undecorated opcodes. No defines, no math, no header : lorom, and no other funny xkas/Asar features. Not even decimal mode works.

<Alcaro> !ar as lda #$d0 sta $ad55 rts
<AlcaRobot> A9 D0 8D 55 AD 60


This command disassembles one or more bytes. If you want linebreaks between each opcode, add -s before the hex string.

<Alcaro> !ar dis a9
<AlcaRobot> LDA #$xx
<Alcaro> !ar dis a9 00 85 19
<AlcaRobot> LDA #$00 STA $19
<Alcaro> !ar dis a2 00 01 9e 00 00
<AlcaRobot> LDX #$0100 STZ $0000,X
<Alcaro> !ar dis -s a2 00 01 9e 00 00
<AlcaRobot> LDX #$0100
<AlcaRobot> STZ $0000,X


Forces the output of a command into AlcaRobot's internal pastebin, as if it were a large piece of text. Pasted documents expire after 24 hours.

<Alcaro> !ar ram 19
<AlcaRobot> Player powerup/status. #$00 = small; #$01 = big; #$02 = cape; #$03 = fire. (1 byte)
<Alcaro> !ar paste ram 19


Returns the string you give it. Pretty much useless for anything except testing stuff (for example if you want to know if making it say /quit kills it (it doesn't)).


Returns a nonsense string. Often used to check if your connection, or the bot, is still alive.


This command takes a string ctrl-c'd from Translhextion and gives you the raw hex values. However, it is more commonly used to convert a string unrelated to Translhextion to hex. You can also use !ar hex to disable the Translhextion decoding, or if you simply prefer it that way.

<Alcaro> !ar th <bh:af><bh:0b><bh:01>~)<bh:04><bh:f0><bh:08><bh:a9><bh:00><bh:eb><bh:a9>  J<bh:01>`<bh:af><bh:0b><bh:01>~)<bh:08><bh:f0><bh:08><bh:a9><bh:00><bh:eb><bh:a9>  J<bh:01>`
<AlcaRobot> AF 0B 01 7E 29 04 F0 08 A9 00 EB A9 20 20 4A 01 60 AF 0B 01 7E 29 08 F0 08 A9 00 EB A9 20 20 4A 01 60
<Alcaro> !ar dis AF 0B 01 7E 29 04 F0 08 A9 00 EB A9 20 20 4A 01 60 AF 0B 01 7E 29 08 F0 08 A9 00 EB A9 20 20 4A 01 60
<AlcaRobot> <AlcaRobot> LDA $7E010B AND #$04 BEQ .arLabel10 LDA #$00 XBA LDA #$20 JSR $014A .arLabel10 RTS LDA $7E010B AND #$08 BEQ .arLabel21 LDA #$00 XBA LDA #$20 JSR $014A .arLabel21 RTS


These commands give information on the specified topic. None of them takes any arguments, and most posts links to elsewhere.

<Alcaro> !ar rats
<Alcaro> !ar btsdoff
<AlcaRobot> db $42
<AlcaRobot> JMP MarioBelow : JMP MarioAbove : JMP MarioSide
<AlcaRobot> JMP SpriteV : JMP SpriteH : JMP MarioCape : JMP MarioFireball
<AlcaRobot> JMP TopCorner : JMP HeadInside : JMP BodyInside
<AlcaRobot> ;Labels can be found at


Shows how to JSL to a routine ending in RTS. If you give it an address, it will fill in the placeholders.

<Alcaro> !ar jslrts
<AlcaRobot> PHK
<AlcaRobot> PEA.w .jslrtsreturn-1
<AlcaRobot> PEA.w $yyyy ; varies per bank, must point to RTL-1 in the same bank as the JML target (example: $0084CF-1)
<AlcaRobot> JML $xxxxxx
<AlcaRobot> .jslrtsreturn
<Alcaro> !ar jslrts 0085D2
<AlcaRobot> PHK
<AlcaRobot> PEA.w .jslrtsreturn-1
<AlcaRobot> PEA.w $0084CF-1
<AlcaRobot> JML $0085D2
<AlcaRobot> .jslrtsreturn


This command converts between PC and SNES colors.

<Alcaro> !ar col 001f
<AlcaRobot> FF0000
<Alcaro> !ar col ff0000
<AlcaRobot> 001F


This one tells the length of the input. Nothing else.

<Alcaro> !ar strlen SUPER MARIOWORLD
<AlcaRobot> 16


CALC/MATH takes a string and calculates it. Both ways to call it give identical results, which to use is a matter of preference.
Valid operators are +, -, *, /, %, (), sqrt(), **, <<, >>, |, & and ^. The last three are like ORA, AND, and EOR. Numbers can be prefixed with % or $ to specify binary or hex, respectively. Note that it counts left to right, it does not know anything about priority (unless you spam () everywhere).

<Alcaro> !ar math 1337+666+42
<AlcaRobot> 2045 = $07FD = %0000011111111101
<Alcaro> !ar math (3*5)/(6*4)
<AlcaRobot> 0.625
<Alcaro> !ar math $1000
<AlcaRobot> 4096 = $1000 = %0001000000000000


This one can also do math, but instead of doing the calculations by itself, it sends it to Google Calculate.

<Alcaro> !ar gmath $40 in €
<AlcaRobot> 27.3466876 €


This is another math command. It's similar to GMATH, but instead of sending it to Google Calculate, it sends the string Wolfram|Alpha, which takes slightly longer to respond but often gives much better results.

<Alcaro> !ar wmath solve 2x+xx=8
<AlcaRobot> x = -4
<AlcaRobot> x = 2
<Alcaro> !ar wmath solve 2x+xx=-8
<AlcaRobot> x = -1-i sqrt(7) ~~ -1.-2.64575 i
<AlcaRobot> x = -1+i sqrt(7) ~~ -1.+2.64575 i


Translates a string between two languages using Google Translate. If no languages are given, it defaults to Detect Automatically and English.

<Alcaro> !ar trans クリスマス
<AlcaRobot> Christmas
<Alcaro> !ar trans sv|en tre
<AlcaRobot> three


This one highlights you when the specified time has passed. The time format is 1y2w3d4h5m6s, but due to some users setting 25 year delays, it's limited to four days.

[13:08:47] <Alcaro> !ar timemsg 5m pizza
[13:08:49] <AlcaRobot> Timer started.
[13:13:49] <AlcaRobot> Alcaro, time for pizza.


These two bans a user for the specified time. The difference is that TIMEBAN kicks the user, while TIMEMUTE doesn't. TIMEMUTE also adds ~q: on the ban, meaning that the victim can still join (but not talk). Swapping the time and username is allowed, and it is allowed to use a *!*@* hostmask instead of the nick. It is not allowed to use those unless you can also kick the relevant user for yourself, with one exception: You can use these commands on yourself if you want, but due to people being fooled into banning themselves, there's a ten minute limit on self bans. For non-suicides, the limit is three months.
It will obviously fail if AlcaRobot isn't an op on the channel.

[13:10:52] <Alcaro> !ar timeban troll 30s get out
[13:10:55] * AlcaRobot sets mode #serioushax +b *!
[13:10:55] * AlcaRobot has kicked troll from #serioushax (get out)
[13:11:25] * AlcaRobot sets mode #serioushax -b *!


Tells how long ago the last activity was, and what it was. It tries ignoring a bunch of non-activity, for example greetings, but it's not completely foolproof. It also ignores the command sender when calculating this.

[21:12:55] <dax> !ar loldead
[21:12:55] <&AlcaRobot> Last activity was 4 hours ago by imamelia. (<imamelia> It took a bit longer than it probably should have, but they work fine.)


Posts the last few observed users matching the given hostmask, and how long ago they last were seen. You can also ask for a specific number of matches; the default is 5.

<Alcaro> !ar whois alcaro!*
<AlcaRobot> Alcaro! (0 seconds ago)
<AlcaRobot> Alcaro! (4 days and 2 hours ago)
<AlcaRobot> Alcaro! (5 days and 2 hours ago)
<AlcaRobot> Alcaro! (8 days and 5 hours ago)
<AlcaRobot> Alcaro! (9 days and 2 hours ago)
<AlcaRobot> 26 more matches, 31 total.
<Alcaro> !ar whois * 0
<AlcaRobot> 4923 matches.


Tells when the last user with this nick was seen.

<Alcaro> !ar last AlcaRobot_Jr
<AlcaRobot> 6 minutes and 46 seconds ago.


Sets the specified mode (+v, -h, etc) on all users in the channel.

<Alcaro> !ar mmode +v
* AlcaRobot sets mode #serioushax +vvvvvv AbSeNNt Adam Alcaro AlcaRobot AlcaRobot_Jr Amos
* AlcaRobot sets mode #serioushax +vvvvv bahamete Chdata dax[sleep] Dragonite E-102_Gamma
* AlcaRobot sets mode #serioushax +vvvvv fsvgm777 Hathor Iceguy imamelia Jayfeather
* AlcaRobot sets mode #serioushax +vvvvvvv Ladida Lexie Lightvayne Lui37 MarioE Mienshao Nimono
* AlcaRobot sets mode #serioushax +vvvvvvvv p4plus2 PatPatPat SecretExit Seru-kun snesasdfghjkl Sonikku Telinc1 TheCowDestroyer
* AlcaRobot sets mode #serioushax +vvv TOS|iPhone VitorVilela ZBot


This command sends a message to the specified user when he appears, in case you're not online during the same hours.
Example: Too lazy.


This command enables or disables logging in a channel. The logs can be viewed by anyone.
To enable: !ar log on
To disable: !ar log off
To get the link to the logs: !ar log
It is also possible to use !ar logs instead of !ar log if you prefer that.
Enabling and disabling the logs is only possible for the channel owner, but everyone can use !ar log to get the link to them. They look like this.

Personal tools