Language…
16 users online: bradcomp, BUX88, DanMario24YT, deported,  DeppySlide, Domokun007, ForthRightMC, Heitor Porfirio, hhuxy, Knight of Time, mtheordinarygamer,  Ringo, Sammmoo,  StayAtHomeStegosaurus, The_Uber_Camper, Tomi P - Guests: 293 - Bots: 245
Users: 64,795 (2,375 active)
Latest user: mathew

Blockreator - Make blocks without knowing ASM

Quote
You do realize that this tool is very limited, right? There are still so many blocks you can make manually that you can't make with Blockreator.

It seems I'm not good enough to code something this tool cannot do... Yet. I still have a tutorial on my hands, anyway, so I'll keep learning stuff.

Quote
Also the chance that a tool will come along that allows you to make custom sprites with ease is incredibly unlikely. Sprites are so much more complex than blocks that nobody would ever have the patience to create a tool that generated them flawlessly.

Wee. I hope nobody will ever try, really.
It's easily the best thing I've done
So why the empty numb?
I'd say ~30% of sprite code is the same between most custom sprite; the chances of a sprite(creator) being made and being relatively useful are high.
Originally posted by Ladida
I'd say ~30% of sprite code is the same between most custom sprite; the chances of a sprite(creator) being made and being relatively useful are high.


I personally don't think it would be too hard. Just use a standard 16x32/16x16 (let the user choose) graphics routine, let the player choose some variables, give a dozen different behaviors. Great for minor little sprites and such.
Originally posted by Vitor Vilela
Although SA-1 doesn't handle blocks right now, you need to change all RAM access to right area.

$0000-$00FF: $3000-$30FF
$0100-$1FFF: $6100-$7FFF

Also with SA-1 doesn't work with FastROM addresses, so better you make FastROM option gets ignored then using SA-1.


Alright, it's been implemented; thanks for helping me out there.

Originally posted by Wiimeiser
Blocktool refuses to insert the block for some reason if I put a shake the screen and a stun the player in the same action...


I'm not having any problems with that.

Originally posted by TLMB
It'd be nice if you could add an option for changing the map16 not only the custom block, but a block adjacent to it from either side. That way you can make nicer locked door/pipe blocks or other things.


That has been added; thanks for the suggestion. You can now change a tile any number of spaces from the current tile.

Originally posted by TLMB
Another feature I'd like is to be able to save the logic for a block I'm working with rather than only saving the generated code having to redo everything and build upon that.


Unless I get more demand for this, it's probably not going to happen; sorry. There's not really an easy way to implement it given the way I've set everything up, and blocks are usually so small that recreating them shouldn't take too long.

Originally posted by Daizo
Could it be possible if you could add a "If the player press the Silver/Blue P-switch..." option?


It's already there. Under Environment, use "If the blue p-switch timer is a value...".

Originally posted by Austin
Wee. I hope nobody will ever try, really.


Why? If people want to be able to make their own sprites but, for whatever reason, can't/don't want to learn ASM, it would be an incredibly useful tool for them.

Also, I've fixed the bug where multiple "Or"s in a row (e.g. if the player is small or big or fiery) would cause errors. Just redownload from the first post to get the newest version. If nobody can find any bugs, I'll officially release this to the Tools section soon.
I should get a new layout.

Probably won't, though.
I forgot to say that you don't need to change $XX to $30XX in SA-1, since Direct Page is set to $3000, unless if some code uses $00XX (i.e indexed with y)
GitHub - Twitter - YouTube - SnesLab Discord
The new download link contains two different Block making tools, is there any specific differences between the two tools other than the date they were modified?
I wonder what a HFD opcode would do in ASM...
Originally posted by Vitor Vilela
I forgot to say that you don't need to change $XX to $30XX in SA-1, since Direct Page is set to $3000, unless if some code uses $00XX (i.e indexed with y)


Ah. Thank you; it's been fixed.

Originally posted by TLMB
The new download link contains two different Block making tools, is there any specific differences between the two tools other than the date they were modified?


What? Try...um...downloading the file again, I think you'll find it was just a glitch on your end....

Joking aside, BlockMaker.exe was the original name of the program before I gave it its proper name, so that's always the name of the generated executable. When I copy-pasted it into the ZIP file, I forgot to rename it properly, resulting in it keeping both the old file (Blockreator.exe) and the new one (BlockMaker.exe).
I should get a new layout.

Probably won't, though.
WOW, this tool is AWESOME!

I'm very new to hacking and this tool will help me out A LOT!

I once read a tutorial on basic ASM here. I didn't know ASM before I read that tutorial and there are still lots of things that I don't understand about ASM even after reading it. There was a section in that tutorial that tells you how to insert custom blocks into your ROM. So using previous knowlege from the tutorial, using ASM, I made a block that makes Mario big when he touches it, but it didn't play neither the animation nor the sound, it just made him big.

Using this tool, I was able to make a block that made Mario big and played the animation (though still no sound) EASILY!

I mean, think about the possibilities of this tool. No more endless RAM address hunting! No more endless tutorial readings on ASM just to make blocks!

This tool will GREATLY shorten our times to make blocks, and will make a lot more people able to make custom blocks, and a lot more blocks will be put in the blocks section for people to download for use in their hacks!

Click the character on the right side of my layout to visit my Discord server and discuss and play and look at and get updates and sneak peeks of the games and other things I'm making.

The authors of these 2 My Little Pony fan games have removed their games from the Internet.
Rise of the Clockwork Stallions has been updated! Download My Little Pony: Rise of the Clockwork Stallions DX: Director's Cut and My Little Pony: Magic Shards now! Spread this link!

Wow! Juat what most hackers needed, easy ASM coding. Great work!
Magnificent work there, Kipernal. Useful for those select few who don't want to be burdened with learning Proper ASM.
Why have I not run across this till now? Anyways though I'm good at making blocks this does make it easier and helps with building a base block for later uses.

Also I keep reading the name as "Block-Reactor" and not "Block-creator"
It looks like you're reinventing BASIC...

No seriously, providing a simple high-level language to code old 8-bit computers in is exactly what BASIC was designed for. You should study it a bit for some thoughts on how to design this tool. Right now it looks like you can only code by selecting a statement and clicking "add"? (I assume you're not actually trying to parse those English statements in your screenshots o.o) This is a good feature to have, but to have it as the only way, that's inefficient... for anything more than a couple lines people are going to want to be able to type their programs.

...and especially save them.

Originally posted by Kipernal
Originally posted by TLMB
Another feature I'd like is to be able to save the logic for a block I'm working with rather than only saving the generated code having to redo everything and build upon that.


Unless I get more demand for this, it's probably not going to happen; sorry. There's not really an easy way to implement it given the way I've set everything up, and blocks are usually so small that recreating them shouldn't take too long.

Whaaaaaaaat? What the hell kind of crazy code do you have going here? From the looks of your screenshots the logic is represented internally as a simple list of statement IDs. Write that list to a file and read it back. Bam, saving. And nevermind what kind of code you have that would make it difficult, where do you get the idea that not being able to save your program makes any sense? Go read a book on UI design.

Anyway, it's a good start, will be helpful for newbies who want some obscure logic in a block and can't figure out a few ASM instructions...


Oh yeah, and what I was really curious about, is how does this handle complex nested expressions? Your building-block interface is fine for simple expressions, but how would you represent
Code
if mario_is_small or (time < 100
and (coins < 10 or lives < 2 or
  (level == 0x105 and yoshi_type == none))) then
    activate_bullet_hell_mode()
elseif mario_is_caped and (yoshi_type == green or yoshi_type == yellow)
and time > 200 and more_deliberately_contrived_conditions then
    commit_seppuku()
    if frame_counter == 27 or (bonus_stars == 99 and yoshi_coins == 5) then
       play_happy_lucky_bonus_song()
    end
else
    give_coins(lives + ((frame_counter) * 4 & 3))
end

with your simple statement lists?
Renamon is best pony.
Originally posted by Rena Kunisaki
No seriously, providing a simple high-level language to code old 8-bit computers in is exactly what BASIC was designed for. You should study it a bit for some thoughts on how to design this tool. Right now it looks like you can only code by selecting a statement and clicking "add"? (I assume you're not actually trying to parse those English statements in your screenshots o.o) This is a good feature to have, but to have it as the only way, that's inefficient... for anything more than a couple lines people are going to want to be able to type their programs.


This tool isn't meant for massive, game-changing coding, nor is it meant to implement its own programming language. It's meant for blocks that usually, at most, require one or two logic statements to work. Don't get me wrong, I do understand that it's not the most efficient way of going about things, but it's the easiest to understand, and that's my goal. The moment any actual typing is required to code, the entry level goes through the roof, and I've failed.

Originally posted by Rena Kunisaki
Whaaaaaaaat? What the hell kind of crazy code do you have going here? From the looks of your screenshots the logic is represented internally as a simple list of statement IDs.


No. Each action is its own class inherited from a base class of actions. The solution to this problem would be for each class to also have a method that would describe how it could load its necessary information from whatever save file it's reading from, but as I said, I don't see the demand for it being worth the time needed.

Originally posted by Rena Kunisaki
...where do you get the idea that not being able to save your program makes any sense? Go read a book on UI design.


Because, like I said, the demand isn't there, 99% of all blocks made with this tool will be a handful of lines each, and I'm a busy person. It's not impossible, but it's sufficiently time-consuming that I don't want to implement it if only one or two people feel that they would actually use it on a regular basis. Most of the time, it's just create, compile, quit.

Originally posted by Rena Kunisaki
Oh yeah, and what I was really curious about, is how does this handle complex nested expressions? Your building-block interface is fine for simple expressions, but how would you represent
Code
if mario_is_small or (time < 100
and (coins < 10 or lives < 2 or
  (level == 0x105 and yoshi_type == none))) then
    activate_bullet_hell_mode()
elseif mario_is_caped and (yoshi_type == green or yoshi_type == yellow)
and time > 200 and more_deliberately_contrived_conditions then
    commit_seppuku()
    if frame_counter == 27 or (bonus_stars == 99 and yoshi_coins == 5) then
       play_happy_lucky_bonus_song()
    end
else
    give_coins(lives + ((frame_counter) * 4 & 3))
end

with your simple statement lists?


For and statements, the typical way is this:

Code
If a
	If b
		If c
			Do XXXX
		otherwise,
			Do YYY
		-------------
	-------------
Otherwise,
	Do ZZ
---------------


Alternatively, if you absolutely need them "chained",

Code
If !a
or
If !b
or
If !c
	Do XXXX
Otherwise,
	Do YYY
---------------


For the deliberately contrived conditions, yes, they're possible but rather hard to recreate, and while that may be annoying for normal programming, if you need something that convoluted for just a simple block, you're doing something wrong.

So to sum up my statements, I'm not building some massive, ASM-coding suite that's designed for people to build patches and bosses in. I'm building a tool that lets users with no ASM knowledge build their own blocks instead of relying on others to do it for them. Moving beyond the building block interface that this provides is not anywhere on my to-do list, because it violates the purpose of the program. If you know how to code in an actual programming language, chances are you can figure out ASM, especially ASM as simple as the 65C816's. And if you know how to use ASM, chances are you don't need this tool.

EDIT: Just to be clear, I do appreciate and am grateful for your feedback, so don't take my comments as just blindly rebutting everything you're saying. I just don't think we're seeing eye to eye on the goals of the program right now.

UltiEdit: Table stretch
Originally posted by Kipernal

No. Each action is its own class inherited from a base class of actions. The solution to this problem would be for each class to also have a method that would describe how it could load its necessary information from whatever save file it's reading from, but as I said, I don't see the demand for it being worth the time needed.


Welcome to Serialization!
layouts suck
Originally posted by CommieYoshi
Originally posted by Kipernal

No. Each action is its own class inherited from a base class of actions. The solution to this problem would be for each class to also have a method that would describe how it could load its necessary information from whatever save file it's reading from, but as I said, I don't see the demand for it being worth the time needed.


Welcome to Serialization!

If you were using Python, you could just pickle the objects and save them to a file. Dynamic languages are cool.

That said, a simple CSV with number identifiers would be more than sufficient.
Serialization shouldn't be too difficult. Each class needs to be able to write all its important state/config information to a binary stream and read it back again. I doubt these classes have much more than a couple variables?

Originally posted by Kipernal
For and statements, the typical way is this:

[...]
Alternatively, if you absolutely need them "chained",
[...]

I wonder how efficient the resulting code is, though... SNES isn't really a place where you can spare cycles, especially when SMW is hogging up most of your CPU time.
Renamon is best pony.
Originally posted by Kipernal
Originally posted by TLMB
It'd be nice if you could add an option for changing the map16 not only the custom block, but a block adjacent to it from either side. That way you can make nicer locked door/pipe blocks or other things.

Going back to this, is it possibe to have an option to change multiple blocks at once? I tried doing it for 3 other blocks and itself and the code became bulky do the the same routine being pasted into the block.
I wonder what a HFD opcode would do in ASM...
It's pretty good, but it appeared an error.
Every time I created a block with hurt player, it didn't really hurt the player. Help, please.
OMG IT'S OVER!!!
Originally posted by Rena Kunisaki
Serialization shouldn't be too difficult. Each class needs to be able to write all its important state/config information to a binary stream and read it back again. I doubt these classes have much more than a couple variables?

Originally posted by Kipernal
For and statements, the typical way is this:

[...]
Alternatively, if you absolutely need them "chained",
[...]

I wonder how efficient the resulting code is, though... SNES isn't really a place where you can spare cycles, especially when SMW is hogging up most of your CPU time.

If anything, if serialization is like this, it should be simple.
layouts suck
Nice job Kipernal!

I have a few questions:

First off, could you tell us a bit about the program itself?
For example, what did you code it in(and with what library(/ies))
Could it be ported to other platforms, or is it Windows-only?

Secondly, I have some suggestions:
simple - I see that you already have a "do something every x frame " or "every other x frames" code. Think you could incorporate the Framal blocks code(i.e., changing behavior depending on exAnim frame)
link for more info

possibly less simple - The program right now is a bit to mouse-centric IMO. Think you could add some keyboard shortcuts? For example, if I have marked a line in the commands window, and press enter or insert, it should perform the "add" buttons code. Or if I mark a line in the "actions" window and press del or backspace, it should delete the line. If I press page down or page up it could move the line up or down, respectively. Perhaps also something for the other buttons.
Ideally, one should be able to use the whole thing without using the mouse at all(which right now is actually possible; you just have to endure some very awkward tabbing =P). But of course, having a few shortcuts would be good enough.

Definitely less simple - How possible would it be to allow typing in the "actions" window? I'm going to assume that it's set up in a way that makes this very hard to implement now, but you never know, so I'll ask anyways.


Either way, this project looks very promising, and I'm looking forward to its development


Edit: A few things I've noticed:
a) If you want several events to perform the same code(say, you want MarioAbove and MarioBelow to do the same things), you either have to recreate the entire Actions block(which is tedious, and takes up n-times space), or you have to edit the generated code, by either changing the JMP labels, or moving the labels next to each other(which isn't as user friendly as it could be).
How about you add a new "Act like event..." column below the events list, above the "generate" button.
For example, if you go to "Mario above" and set the act like event to "Mario Below", it would disable the actions for Mario above, and place the "MarioAbove:" label directly under the "MarioBelow:" one.

Nevermind, just noticed the "go straight to another event" action.


b) the "Change this block into a Map16 tile" action will insert the routine n times, once for every time you call it. Add a boolean that is set once it has been inserted once, and don't insert it if the boolean is set.