News:

Don't forget to visit the main site! There's lots of helpful docs, patches, and more!

Main Menu

Cheesy development thread.

Started by interdpth, July 27, 2010, 04:56:19 PM

Previous topic - Next topic

squishy_ichigo

I don't know how hard it would be to implement or if it would even be that useful but:

A realtime FX1 view option that showed all the FX1 editable things as they would appear in game.
Ie. glows glowing, water flowing, background heatwaves, etc.

You'd hit that option, and see the these things in Cheesey without having to open the game to see them. This would be an extension of Quietus suggesting a layer 3 viewer, but so much better.

And an extension of this would be an integrated editor for all the FX1 stuff like palette blends, glow locations, etc.

Charmander106

1) I think that an import and export a rooms level data option should be implemented, if it can be done.

Like you can export a room you have made to a file and import it into another room or use the file as a backup to your room in case something goes wrong.


2) Another idea is be able to enable a grid in the level editor.

Parabox

Seeds for everything, or at least a lot of things. Rooms, states, etc. I know, flying castles...

begrimed

I don't know how hard this would be, but what about being able to edit the .GFX file right within cheesy? I know there's external programs for that and yadda yadda. Sometimes though I only need to edit a few pixels of a certain tile or something at a time, and it's kinda troublesome exporting/loading GFX in another program/loading palette/changing a few pixels/saving/importing/clicking the save 16x16 button, ya dig? Not crucial, but would be cool.

Oh yeah, and adding documented I'm-A-Genius palette locations right into the program kinda goes without saying. Also, having a real-time pixel color view when you're adjusting the color sliders (like with Samus in the Beauty Salon, but imagine it for bosses/enemies/other stuff too).

What about applying/unapplying ASM files right within the program? I understand this might not be easy to do either since ASM files can vary in byte length depending if people add more variables. Just an idea. Same goes for good hex tweaks, which seems more conceivable since many of them are only like 1-4 bytes long at a time.

Another one: How 'bout an option to make CRE palettes universal or something? Say you make a single CRE palette that you want to use for every tileset in the game. You could check an option + save and the new CRE colors would be copied to every other tileset palette. Or to the same end, importing/exporting CRE palettes only.

Quietus

Quote from: Grime on April 12, 2011, 01:15:05 AMWhat about applying/unapplying ASM files right within the program? I understand this might not be easy to do either since ASM files can vary in byte length depending if people add more variables. Just an idea. Same goes for good hex tweaks, which seems more conceivable since many of them are only like 1-4 bytes long at a time.
As a slight extension to this, the ability for Cheesy to notify you of any clashes before applying the code / tweak / .ips would be very handy.

Silver Skree

#80
An option to detect (specified?) air/all-black behind-wall tiles and change them to a uniform flip (by default, unflipped). Works as a great cover-all tool alongside Grime's suggestion.

Edit: threadkill get?

Another edit: You know how SMILE has the = key? If you hold that down, after a brief delay, you can run your mouse over blocks without clicking anything to transfer the block type. I want that carried over to Cheesy, except as an actual built in feature instead of just a really fast unconditional repeated action like how SMILE does it

Also, any control key used with = should copy over BTS as well.

interdpth

Most of this was planned, but I was asking for things to actually help with editing levels XD

squishy_ichigo

You should have it where your editor displays images of what the room will look like in game. And have some sort of way to edit this image, to change what would be in game. Yes, that would be very useful to edit levels.

You know what else would be useful for editing levels? :D

Releasing something. :/

interdpth

Honestly squishy, it is currently a level viewer. Thus this is why I asked how people wanted to edit rooms, otherwise I'd just import DH's functionality.

interdpth

Can now place basic tiles in a room.

Quietus

Dang!  I forgot to mention that feature in my list. :heheh:

Qactis

Quote from: Grime on April 12, 2011, 01:15:05 AM
I don't know how hard this would be, but can you integrate yy-chr/tlp/FaTILEty + xkas v 0.6 + Projectiler + SMALL + SMILE into Cheesy? Adobe CS2 would be great too kthx.

Just kidding, everyone put some wonderful ideas out there I wouldn't have thought of myself.

My only real contribution [for now]: Opening up multiple ROMs in the same instance of Cheesy? Who knows how many times you can fuck up a ROM and lose a room going to a backup, being able to open both of the ROMs would allow you to copy what you need over on the fly. Just my 2 cents.

interdpth


Quietus

Scrolling tileset...  Seizure imminent... :affraid:

:wink:

interdpth


Quietus


Qactis

Quote from: Quietus on May 13, 2011, 06:28:14 PM
:cheers:
^ This

and, I don't know if it was mentioned, but, Undo and/or Real-Time auto-backup every X timeframe would be all anyone could ask for

interdpth

#92
Please create a mockup of how to place BTS, tile types(IE Xray blocks) and Tile Flip properties.
So basically, please create a mockup of tile properties. Thanks.

Silver Skree

Dunno about BTS, but for tile types (Solid, Air, Slope...) you could have a dropdown whose entries begin with single-digit number values. Example:

0 - Air
1 - Slope
3 - Air. Fool X-ray
4 - Treadmill
...
F - Bomb Block

This way you can browse for the type you want by word, learn its value at the same time as you use the program more, and finally be able to, at least on windows, quickly select it simply by pressing that digit when the dropdown is focused.

As for flip, I'm pretty fond of how SMILE does it: arrow keys affect whatever your mouse is over (don't forget making it alter the BTS appropriately as well). Making it a little more dynamic for mass flipping (ugh damn tiny-ass checkboxes) in the clipboard as well as enabling arrow key flipping in the clipboard would be nice as well.

begrimed

Select a group of files via right-click like SMILE does it, except:

- Be able to flip all the tiles vertically/horizontally with the arrow keys like Skree mentioned.

- Flip the arrangement of the tiles horizontally/vertically, so the tiles themselves aren't flipped. Would be good for generating random-ish looking foregrounds and stuff a lot faster without eating up unnecessary tile data by flipping the tiles themselves if you don't want that. Might be hard to do? Also an option to flip and unflip the arrangement of all tiles in a room?!?!? lolol.

- Turn all selected tiles into another BTS type, like air, solid, etc.

- Turn a specified tile into another type (all solid tiles into spike block, all spike blocks into air fool X-ray with a certain BTS ##, etc.)

- Apply a BTS number to all selected tiles at once.

- Erase all selected tiles instantly by pressing delete key, same with single tiles.

- Uh. Quick option to flip and unflip all tiles in the room?

- Option to 'lock' / disable the flipping of air tiles. So you could copy a big chunk of landscape, flip it, and not have invisible flipped air tiles taking up extra level data. Or to expand on this idea, options to disable flipping of any specified tile type/BTS.

- A better 'hack locking' system for long-awaited hacks that creators don't want people viewing solutions to right away. Maybe password protected?

- Integration of long-standing, well-made patches by other people, as in applying/unapplying them. Would need to allocate different areas of free space for each one. For patches that use air fool X-ray blocks, these would need to separated too. Lots of people tend to make them affect air fool X-ray BTS 03/04, etc.

Black Falcon

#95
What Grime said.

I dunno if you got SMILE's source from Jathys, because I'd like to be able to quickmet again.

Some more ideas that came to my mind:
- like Squishy mentioned, a feature that displays how the room would look ingame, ie also display FX1 (liquid/gof/spores) with
 the palette you've chosen (also add/substract palette setting).
- Ctrl + click adjusts liquid level (like in SMILE, would be a great help)
- maybe some sort of a little sequence preview for raising lava/other liquids
- better Tourian/Ceres escape text support (not that important to me though)
- map editor supports arrangement of tiles, also copy/paste/flip/reveal with map station feature of said arrangements and
 maybe the whole map,
 because placing map tiles piece by piece doesn't make fun at all
- map icon support, also add/remove feature of said icons (dunno how hard it would be, 'cause I never messed with them)
- iirc JAM made the use of the Debug area possible, so a support of his patch (when released) would be nice, too
- SABS (<3) v. 2.0:
 - feature to add/remove/edit entries to/from the list so you don't have to paste the offset and the palette number
    over and over again
 -  better "wash out" and "heat glow" feature, because it currently still adds white to the palettes, even when the
    palette is set to black
 -  "substract color from palette" feature

- tileset repoint support (?)
- of course 'classic' things like gfx/bg/roomstate editor and all that stuff I forgot to mention
- And maybe an integrated Projectiler :>

X-tradyte

So will it be possible to get custom GFX in there, You need to make sure you can edited most, if not everything that SMILE can. Wish you lucky, inter.

~DarkSamus

KT JDDD

How about this for changing BTS.  If you click with a scroll wheel (or something like Ctrl+shift+click), a menu appears with the BTS choices.  As for applying slopes (and things like super missile blocks), I would kind of like the same drag-n-drop functionality that was in smile.  But maybe, instead of being another tab by the clipboard, it would be nice if it was another window.  If you're trying to keep it one window, then tabbing it with the tilesets would make sense to me.

I also agree with whoever said having multiple Rooms open.  But what about copying/pasting between ROMs?

This would also be nice, set a fallback BTS, and whatever is set to is automatically applied to the tiles you place.  I hate placing a bunch of tiles that should be solid, find out their default was AIR, and find errors in quickmet, so I have to change 1 to a solid, and then copy it over all the other ones I placed.

Parabox

Would be awesome if there was a better editor for Samus' sprites, one that arranged the tiles per pose instead of the hopeless garbage we get in tile editors.

Silver Skree

I'm currently writing a tool to help users easily extract a room's level data by just providing the room ID and the size of the data. But come to think of it, this is really a feature that would do better in Cheesy rather than as a standalone tool. I don't have it anywhere near done at the moment, but you can take what I have here and do with it as you please. I'll try to keep this particular post updated as I work on it.

[spoiler=Python]
import os
import sys

def print2(word):
print " "
print word
print " "

#...---===THIS BE THE MENUS SECTION===---...

def main_menu(paths):
SMC = None
loop = -1
while (loop != 0):
print " "
choice = menu(["Target SMILE data", "Target ROM", "Extract data from targeted ROM", "Insert .fragment into targeted ROM", "Exit program"])
if (choice == 1):
paths = smile_path()
if (paths == None):
print2("Could not acquire target!")
else:
print2("Targeted new SMILE data!")
elif (choice == 2):
SMC = SMC_path()
elif (choice == 3):
if (SMC == None):
print2("Target a ROM first!")
else:
extract_menu(SMC, paths[0], paths[1])
elif (choice == 4):
if (SMC == None):
print2("Target a ROM first!")
else:
if (paths[0] == None) or (paths[1] == None):
print "insert_menu(SMC)"
else:
print "advanced_insert_menu(SMC, paths[0], paths[1]"
elif (choice == 5):
sys.exit("User quit")
else:
print2("Invalid value")

def extract_menu(SMC, mdb, lvlentries):
loop = -1
while (loop != 0):
print " "
choice = menu(["Extract a room's level data", "Extract data by providing addresses", "Main menu"])
if (choice == 1):
room_lvl_extract()
return
elif (choice == 2):
extract(SMC, None)
return
elif (choice == 3):
return
else:
print2("Invalid value")

#...---===THIS BE THE MENU GENERATOR===---...

def menu(menu):
count = 0
for item in menu:
count += 1
print str(count) + ") " + item
choice = raw_input("Action: ")
if (choice.isdigit()):
choice = int(choice)
else:
choice = -1
return choice

#...---===THIS BE THE AUTOMATIC SHIT DETECTOR===---...

def auto_detect():
if os.path.exists("smile.exe"):
if os.path.exists(os.path.join("files", "mdb.txt")):
mdb = os.path.join("files", "mdb.txt")
else:
return
if os.path.exists(os.path.join("files", "level_entries.txt")):
lvlentries = os.path.join("files", "level_entries.txt")
else:
return
paths = mdb, lvlentries
print2("Auto-detected SMILE data!")
choice = ad_keep_menu()
if (choice == "OK"):
return paths
else:
return
elif os.path.exists(os.path.join("smile", "smile.exe")):
if os.path.exists(os.path.join("smile", "files", "mdb.txt")):
mdb = os.path.join("smile", "files", "mdb.txt")
else:
return
if os.path.exists(os.path.join("smile", "files", "level_entries.txt")):
lvlentries = os.path.join("smile", "files", "level_entries.txt")
else:
return
paths = mdb, lvlentries
print2("Auto-detected SMILE data!")
choice = ad_keep_menu()
if (choice == "OK"):
return paths
else:
return
else:
return

def ad_keep_menu():
choice = menu(["Target and use this information", "Discard"])
if (choice == 1):
return "OK"
elif (choice == 2):
return
else:
print "Invalid value"
return ad_keep_menu()

#...---===THIS BE THE FILEPATH HANDLER===---...

def create_path(words):
choice = (raw_input(words))
if os.path.exists(choice):
print " "
print choice
print "This file already exists! Overwrite?"
overwrite = menu(["No", "Yes, overwrite"])
if (overwrite == 1):
return create_path(words)
else:
return choice
else:
return choice

def SMC_path():
choice = raw_input("Please provide .smc path: ")
if not (os.path.exists(choice)) or not (os.path.isfile(choice)):
print "Erroneous path; try again."
return SMC_path()
else:
print2("Targeted ROM!")
return choice

def frag_path():
choice = raw_input("Please provide .fragment path: ")
if not os.path.exists(choice):
print "Erroneous path; try again"
return frag_path()
else:
return choice

def smile_path():
smile = raw_input("Please point to smile.exe: ")
smiledir = os.path.dirname(smile)
if not (os.path.exists(smile)) or (os.path.isdir(smile)) or not (os.path.isfile(smile)) or (smile[-9:] != "smile.exe"):
print2("Erroneous path.")
return
else:
return (mdb_path(smiledir), lvlentries_path(smiledir))

def mdb_path(root):
if os.path.exists(os.path.join(root,"files", "mdb.txt")):
mdb = os.path.join(root,"files", "mdb.txt")
print2("Found mdb.txt!")
return mdb
else:
print2("Could not find mdb.txt!")
return

def lvlentries_path(root):
if os.path.exists(os.path.join(root,"files", "level_entries.txt")):
lvlentries = os.path.join(root,"files", "lvlentries.txt")
print2("Found level_entries.txt!")
return lvlentries
else:
print2("Could not find mdb.txt!")
return

#...---===THIS BE THE ADDRESS HANDLER===---...

def address_sequence():
return choose_address_type()

def get_address():
address = raw_input("6-digit address: ")
if (len(address) == 6):
return address
else:
print2("Enter a SIX-DIGIT address you moron!")
return get_address()

def choose_address_type():
choice = menu(["Provide SNES address", "Provide PC file address"])
if (choice == 1):
address = get_address()
PCaddress = convert_SNESaddress(address)
return PCaddress
elif (choice == 2):
PCaddress = get_address()
return PCaddress
else:
print "Erroneous value; try again"
return choose_address_type()

def verify_SNES_address(rawword, rawbank):
if not (int(rawword,16) > 0x7fff):
print "INVALID SNES ADDRESS"
return choose_address_type()
if not (int(rawbank,16) > 0x7f):
print "INVALID SNES ADDRESS"
return choose_address_type()
return

def convert_SNESaddress(address):
rawbank = str(address)[:2]
rawword = str(address)[2:]
verify_SNES_address(rawword, rawbank)
if (int(rawbank,16)%2 == 0):
word = int(rawword,16) - int("8000",16)
bank = ((int(rawbank,16) - int("80",16)) / 2)
PCaddress = hex((bank * 65536)+ word)
print "Converted address to", PCaddress
return PCaddress
elif (int(rawbank,16)%2 == 1):
word = int(rawword,16)
bank = ((int(rawbank,16) - int("80",16)) / 2)
PCaddress = hex((bank * 65536)+ word)
print "Converted address to", PCaddress
return PCaddress
else:
print "REPENT"

#...---===THIS BE THE LENGTH SPECIFICATION===---...

def get_length(operation):
print " "
print "Please specify the decimal length, in bytes, of the data you wish to extract."
print "(For level data, SMILE displays this when you save the room.)"
print " "
length = raw_input("Length in bytes: ")
if not (length.isdigit()):
print2("Please provide a decimal number!")
return get_length(operation)
else:
return length

#...---===THIS BE THE EXTRACTION HANDLER===---...

def room_lvl_extract(SMC):
print " "
room_id = raw_input("5-digit Room ID of the room from which you wish to extract level data: ")
if ((room_id.isdigit) and (len(room_id = 5))):

else:
print2("Erroneous Room ID!")
return room_lvl_extract()

def extract(SMC, fragpath):
operation = "extract"
print2("From where are you extracting data?")
offset = address_sequence()
length = get_length(operation)
if (fragpath == None):
fragpath = (create_path("Please name the .fragment: ") + ".fragment")
xtract = open(SMC, 'rb')
xtract.seek(int(offset,16))
frag = xtract.read(int(length))
xtract = open(fragpath, 'wb')
xtract.write(frag)
print " "
print "Extraction to", fragpath, "successful! File is", length, "bytes!"
print " "
return

#...---===THIS BE THE INSERTION HANDLER===---...

def insert(SMC):
operation = "insert"
print " "
print "To where are you inserting data?"
offset = address_sequence()
fragpath = "8.fragment"
return finish_menu(SMC)

#...---===THIS BE THE FINISHING MENU SECTION===---...

def finish_menu(SMC):
choice = menu(["Continue work with same ROM", "Target different ROM", "Exit program"])
if (choice == 1):
done = choice + 10
return done
elif (choice == 2):
done = choice + 10
return done
elif (choice == 3):
sys.exit("User terminated program")
else:
print "Invalid value!"
return finish_menu(SMC)

#...---===THIS BE THE OPENING MENU SECTION===---...

print " "
print "---===WELCOME===---"
print " "
print "FragXTractor v0.2"
print "by Silver_Skree"
print " "
print "You can quit at any time with Ctrl+C or by exiting the prompt."
print "Neither will damage nor corrupt your data."
print " "
print "---===*******===---"
print " "
paths = auto_detect()
if (paths == None):
paths = (None, None)
main_menu(paths)
else:
main_menu(paths)
[/spoiler]
And do keep in mind, this is my second-ever application, so it's probably a little spartan compared to what a seasoned programmer would write.