Difference between revisions of "Temporal Flux Event Tricks"
m (Style fix.) |
|||
(21 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
+ | ==Adding the Epoch== | ||
+ | |||
+ | The first time you add the epoch to the game you will have to Do some memory commands in some arbitrary in your code and call that arbitrary. | ||
+ | |||
+ | <pre>Assign(Mem.7E0290=Pixel) //XCoord on Map | ||
+ | Assign(Mem.7E0292=Pixel) //YCoord on Map | ||
+ | Assign(Mem.7E029F=MapNumber)//Map LOCATION number 1FX | ||
+ | Assign(Mem.7E0294=XX)// A0 for wings 00 for no wings</pre> | ||
+ | |||
+ | Note: After some debugging it was found that the pixels for the X and Y coordinates should end in 0 and be far away from exits. Also make the width to two bytes for all assignments except the 7E0294. | ||
+ | |||
+ | ==Battle with Monsters== | ||
+ | |||
+ | ===Making an Enemy Walk Around=== | ||
+ | |||
+ | <pre>StartupIdle | ||
+ | -load enemy (remember prm has to be 3--?) | ||
+ | -set coordinates | ||
+ | -return | ||
+ | -move sprite | ||
+ | -move sprite | ||
+ | -go to (first move sprite) | ||
+ | |||
+ | Arbitrary 0 | ||
+ | -explore mode off | ||
+ | -move party to right spot | ||
+ | -move enemy(s) to right spot | ||
+ | -scroll screen | ||
+ | -Battle! | ||
+ | -remove objects | ||
+ | -return</pre> | ||
+ | |||
+ | ===Causing the Battle=== | ||
+ | |||
+ | This Code can be activated either by stepping on a spot (placing an object at the spot and making it's arb. 0 this code) or by touching an enemy (Making the enemies arb. 0 this code) | ||
+ | |||
+ | Arbitrary 0 | ||
+ | |||
+ | <pre>ExploreModeOff | ||
+ | Move Party //move party to correct tiles | ||
+ | Move Sprite //if this is not the enemies arb do a callObjectFunction | ||
+ | Scroll Screen //params are upper left corner tile (x,y) | ||
+ | Battle | ||
+ | //if this is a random encounter (not touching enemy) | ||
+ | Remove (object) | ||
+ | ExploreModeOn</pre> | ||
+ | |||
+ | ==Change Locations with Fade Effects== | ||
+ | |||
+ | In the first location, put: | ||
+ | |||
+ | * Pause(0.250) | ||
+ | * Darken(06) | ||
+ | * FadeOutScreen | ||
+ | * SoundCmd(SongVol, 18, 00) | ||
+ | * WaitForSilence | ||
+ | * Pause(0.250) | ||
+ | * ChangeLocation (variant DF) | ||
+ | |||
+ | In the second one, put in Object00 after the Return: | ||
+ | |||
+ | * Pause(0.875) | ||
+ | * Darken(F6) | ||
+ | * Pause(3.125) | ||
+ | |||
+ | Of course, the pauses are optional and can be adjusted to your liking. | ||
+ | |||
+ | I believe variant E0 will automatically do a fade in/out, though it may not do it at the speed you like. It may also not handle sound the same way. | ||
+ | |||
+ | Yes, the darken command allows to adjust the speed of the fades, and the song this way is also faded. I find this code useful to highlight special sequences such as ellipsises or "in the meanwhile" scenes. | ||
+ | |||
+ | ==Change the Opening== | ||
+ | |||
+ | ===Getting Rid of the 1000 A.D. Scene=== | ||
+ | |||
+ | There's two ways: | ||
+ | |||
+ | Overworld event editing | ||
+ | |||
+ | *Open up 1000 AD events | ||
+ | *Scroll down till you see [2ab] | ||
+ | *In the middle of that you'll see "init memory" and then Command 28 | ||
+ | *Leave the command 28 but you can delete all other commands below that | ||
+ | *Leave AddObjects Mem.XXXXX='s, the Change location, and the end | ||
+ | *Update and write to memory | ||
+ | |||
+ | Note: This method I think switches to 1000 AD for like a tenth of a second. | ||
+ | |||
+ | Location Event editing: | ||
+ | |||
+ | *Open up location {000} | ||
+ | *Under if(mem.70061=00) is a change location to 1F0 (above it is the change Crono's name dialogue box) | ||
+ | *Change that location to 10F (instead of changing to 1000 AD map we just skip to the "wake up crono" map) | ||
+ | |||
+ | ===Adding a New Scene=== | ||
+ | |||
+ | # Open up Location {1b1} Title Screen. | ||
+ | # Object 1 Arbitrary 1 has a "change Location at the end" | ||
+ | # Change that Location to the location that you will have your new Title screen be | ||
+ | # In the events of your new location make some sort of small intro, make sure at the end of the intro you have a change location {000} Load Screen | ||
+ | |||
+ | ...but in the intro location events, add those commands in Object00 after the Return (delete the End): | ||
+ | |||
+ | <pre>-CheckButton (All, Type1) | ||
+ | --ChangeLocation {000} | ||
+ | -GoTo the checkbutton</pre> | ||
+ | |||
+ | Note that if you have some Pause or ScrollScreen in Object00 they will probably interfer with the Check Button, so move them to a new object. | ||
+ | |||
+ | Now if you push a button during your intro you will be teleported back to the load screen, just like in CT. Unfortunately this doesn't work for the Start button, but the other buttons are fine. | ||
+ | |||
+ | ==Check for Gold Amounts Over 65535== | ||
+ | |||
+ | Use Memory Assignment commands to copy the 3 gold bytes (7E2C53, 7E2C54, 7E2C55) somewhere into the 7F02xx+ location event temp memory. | ||
+ | |||
+ | Then, use several If Statements on those bytes to check for the gold amount. | ||
+ | |||
+ | Example - check if 500,000G or more obtained ($07A120) | ||
+ | |||
+ | *Assignment, Mem to Mem, Variant 48, 7E2C55 to 7F0200, Width 1 byte | ||
+ | *Assignment, Mem to Mem, Variant 49, 7E2C53 to 7F0202, Width 2 byte | ||
+ | |||
+ | *Comparison, Value to Mem, Variant 12, 7F0200, Value 07, Width 1 byte, Operation >= | ||
+ | |||
+ | *Comparison, Value to Mem, Variant 13. 7F0202, Value A120, Width 2 byte, Operation >= | ||
+ | |||
+ | The second If Statement should be inside the first one. The code window will look similar to: | ||
+ | |||
+ | <pre>Assign(data) | ||
+ | Assign(data) | ||
+ | If(address >= 1 byte number) | ||
+ | If(address >= 2 byte number) | ||
+ | Code to use if gold amount or higher is obtained</pre> | ||
+ | |||
+ | ==Check the Game Clock== | ||
+ | |||
+ | This is very similar to the above example. Copy the clock bytes you want from the 7E0400-7E0406 range to 7F0200+ location event temp memory and use If checks. Read the Memory Locations.txt of the Offsets Guide from Geiger's Crypt to find out how the clock values are stored. | ||
+ | |||
+ | Basic example - check if game clock > 99:59: | ||
+ | |||
+ | Assignment, Mem to Mem, Variant 48, 7E0406 to 7F0200, Width 1 byte | ||
+ | |||
+ | Comparison, Value to Mem, Variant 12, 7F0200, Value 00, Width 1 byte, Operation > | ||
+ | |||
==Draw Geometry== | ==Draw Geometry== | ||
Line 24: | Line 168: | ||
Set these memory values to make the screen wobbly. | Set these memory values to make the screen wobbly. | ||
− | |||
*7E1DF9 to 1 | *7E1DF9 to 1 | ||
+ | *7E1DFD to 1 | ||
==Fade / Darken== | ==Fade / Darken== | ||
Line 108: | Line 252: | ||
*Pause(1.000) (0.250) | *Pause(1.000) (0.250) | ||
*MemCpy2E(50,00,72,0F) | *MemCpy2E(50,00,72,0F) | ||
+ | |||
+ | ==Force a Cutscene== | ||
+ | |||
+ | How to.....Force a cut scene, the easy way! | ||
+ | |||
+ | For the longest time I didn't know this....You'll notice parts of crimson echoes where you have to touch a very specific spot to do anything. Now you can easily set a whole "area" to trigger a scene. Through the power of getObjectCoordinates: | ||
+ | |||
+ | First off your going to need a loop that continuously checks coordinates do do this simply follow these steps: | ||
+ | |||
+ | <pre>//I chose the last two myself, as long as they are above 7f0200 it's fine. | ||
+ | getObjectCoordinates, variant 22, PC, 00, 7f0220, 7f0222 //store crono's | ||
+ | pos in two memory spots | ||
+ | |||
+ | ......//code goes here</pre> | ||
+ | |||
+ | goto line of get object coordinates | ||
+ | |||
+ | The goto command isn't the most user friendly. There's a very large drop down list and you have to find a very specific line number. But it's doable. Now in between those two lines you are going to put conditionals, for example if you want them to not cross a certain X coordinate you can do something like this | ||
+ | |||
+ | <pre>getObjectCoordinates, variant 22, PC, 00, 7f0220, 7f0222 | ||
+ | |||
+ | if( 7f0220 >= (x coordinate) | ||
+ | - explore mode off | ||
+ | - begin cutscene | ||
+ | |||
+ | goto line of get object coordinates</pre> | ||
+ | |||
+ | If you wanted a specific block of the map to trigger a battle | ||
+ | |||
+ | <pre>getObjectCoordinates, variant 22, PC, 00, 7f0220, 7f0222 | ||
+ | |||
+ | if( 7f0220 >= (x coordinate)) | ||
+ | if (7f0222 >- (y coordinate) | ||
+ | - explore mode off | ||
+ | - move party | ||
+ | - move enemies | ||
+ | - move screen | ||
+ | - battle | ||
+ | |||
+ | goto line of get object coordinates</pre> | ||
+ | |||
+ | It really is that easy. Stick that code in any startup/idle object and have fun. | ||
+ | |||
+ | ==Increase Sound Volume with Approach== | ||
+ | |||
+ | Sounds that get louder when you get closer(ambient?) using music ...sort of. Works good for "Running Water", "Hail Magus", or Dungeon Drip sound, even "Lavos Breath" | ||
+ | |||
+ | <pre>represents == <= >= and such | ||
+ | set volume louder when getting closer | ||
+ | |||
+ | GetObjCoord(PC00, Xvalue, Yvalue) | ||
+ | |||
+ | If(Xpos or Ypos ** char_coordinates) | ||
+ | Soundcmd(SongVol, duration, volume) | ||
+ | |||
+ | If(Xpos or Ypos ** char_coordinates) | ||
+ | Soundcmd(SongVol, duration, volume) | ||
+ | |||
+ | If(Xpos or Ypos ** char_coordinates) | ||
+ | Soundcmd(SongVol, duration, volume)</pre> | ||
+ | |||
+ | ==Make a Bed== | ||
+ | |||
+ | 1) Draw the bed | ||
+ | 2) When you want your character to go to sleep you call an arbitrary | ||
+ | 3) In the arbitrary you | ||
+ | |||
+ | <pre>--set the coordinates (guess and check) | ||
+ | --set animation to 28 (I believe) | ||
+ | 4)if you are having some tiles go over the sprite you | ||
+ | --select the tile | ||
+ | --On the locations tab you should see tile properties | ||
+ | --select which quadrant y ou no longer want to be over the sprites head (NW, NE, SW, SE) | ||
+ | --change priority to false</pre> | ||
+ | |||
+ | ==Make a Character Turn White== | ||
+ | |||
+ | Chickenlump posted this in a similar thread a long time ago: | ||
+ | |||
+ | <pre>Category: Memory Copy | ||
+ | Command: Multi-mode 88 | ||
+ | MemCpy88 | ||
+ | mode = 40 | ||
+ | Param 1 = F | ||
+ | Param 2 = F | ||
+ | Param 3 = 2 | ||
+ | Data leave blank | ||
+ | |||
+ | Pause(3 seconds) | ||
+ | |||
+ | Category: Memory Copy | ||
+ | Command: Multi-mode 88 | ||
+ | MemCpy88 | ||
+ | mode = 0</pre> | ||
+ | |||
+ | Put that in a characters (or NPC) arbitrary and then use Call object function to call it. | ||
+ | |||
+ | ==Make a Conveyor Belt / Wind== | ||
+ | |||
+ | Make a Conveyor Belt (I guess also can be how to make wind): | ||
+ | |||
+ | # Choose tileset with Conveyor belt | ||
+ | # Draw the belt | ||
+ | # Open up Tile properties (window-->location-->tile properties) | ||
+ | # turn on Movement (Map Movement (ctrl+7 to, if you are going to use TF a lot learn the ctrl+??s)) | ||
+ | # Set direction of conveyor belt under Wind direction | ||
+ | # Set Speed (3 means you can't run against, 2 means it slows down if you run against) | ||
+ | |||
+ | Extra! (this is actually why I made this) | ||
+ | |||
+ | # To change the direction of the conveyor belt draw the opposite direction of the belt somewhere off the scroll screen of the map (remember to put it's wind movement/speed) | ||
+ | # Add the switch on the map and as an object | ||
+ | # Open up its activate | ||
+ | # Put a copy tiles, make the source your new belt and it's destination your old belt (remember to drop the 3rd digit in coordinates) | ||
+ | # In the unknown put "B" | ||
+ | |||
+ | Ta da. | ||
+ | |||
+ | I believe the copy tile "layer properties" only copies solidity. You need to set the unknown to something to change other tile properties (Z plane/wind direction etc). Because I have had the problem before, I learned to set it to B by looking at blackbird events. | ||
+ | |||
+ | ==Make a Save Point== | ||
+ | |||
+ | First off put a save point NPC on the map (for simplicity make the last digit of the object coordinates 0) | ||
+ | |||
+ | Next put an object at the same location as the save point | ||
+ | |||
+ | Now have a getObjectCoords for PC 00 | ||
+ | |||
+ | <pre>If( X of PC 00 ) = (first 2 digits of object coord) // he's at the right X | ||
+ | If (Y of PC 00 ) = (first 2 digits of object coord) // he's at the right Y | ||
+ | if (Memory & bit) | ||
+ | If (a button is pressed) // he pressed A | ||
+ | Special Dialogue --Save (under category text) | ||
+ | go to getObjectCoords | ||
+ | play save point sound | ||
+ | set Memory bit | ||
+ | go to getObjectCoords | ||
+ | reset bit | ||
+ | go to get object coord</pre> | ||
+ | |||
+ | I'm not sure what the point is of setting the object Bit. In the example I pulled up it was | ||
+ | 7f01CF bit 80. It may be a bit that allows Saving in the menu (just a guess hopefully someone can confirm this). But the main point is to check the X and Y coordinates of PC 00 (just drop the 3rd digit of the object coordinates). | ||
+ | |||
+ | ==Make a Treasure Chest== | ||
+ | |||
+ | Make A Chest: | ||
+ | |||
+ | 1. Place on Map, Place Open Chest off map | ||
+ | 2. Make an Object and set Coordinates on the chest | ||
+ | 3. Pseudo code that Object | ||
+ | |||
+ | Startup/idle: | ||
+ | |||
+ | <pre>set Object Coord //at chest area | ||
+ | if(MemorySpotOfChest && Bit) | ||
+ | ---Copy Tiles from open chest on map | ||
+ | ---remove this object</pre> | ||
+ | |||
+ | Activate: | ||
+ | |||
+ | <pre>ExploreMode Off | ||
+ | Copy Tiles as before | ||
+ | 7f0200==Index of Item | ||
+ | "you got {item}" | ||
+ | BitMath(MemorySpotOfChest, Bit, Set) | ||
+ | RemoveObject | ||
+ | ExploreMode On</pre> | ||
+ | |||
+ | Note 1: Every memory spot of chest has 8 bits you can set to either true of false, thus every memory spot can be used for 8 chests. | ||
+ | |||
+ | Note 2: 7F0200 is the memory spot used when you put {item} in a string. You set 7F0200 to the number of the item you'll be receiving then by saying "you got {item}". It'll display you got Wood Sword (for example). | ||
+ | |||
+ | You can randomize the contents, too! | ||
+ | |||
+ | First you must make a chest like the one in "Castle Magus: Hall of Deceit", the chest here uses event code to make a treasure chest instead of using defualt game style. | ||
+ | |||
+ | Then just add a random number generator, certain values would give you multiple random items. | ||
+ | |||
+ | Here is an example: | ||
+ | |||
+ | <pre>Random Number | ||
+ | If RandomNumber < 75 (item drop chance) | ||
+ | Random Number (new random number from item type) | ||
+ | If RandomNumber < 30 | ||
+ | ~Give items 5 Tonics | ||
+ | ~Goto 1000 | ||
+ | If RandomNumber < 70 | ||
+ | ~Give item Mid Tonic | ||
+ | ~Goto 1000 | ||
+ | If RandomNumber < 90 (rarer items have smaller chances) | ||
+ | ~Give item Full Tonic | ||
+ | ~Goto 1000 | ||
+ | If RandomNumber < D0 | ||
+ | ~Give item Elixir | ||
+ | ~Goto 1000 | ||
+ | If RandomNumber < FF | ||
+ | ~Give item Mega-Elixir | ||
+ | ~Goto 1000</pre> | ||
+ | |||
+ | [1000] ... | ||
+ | |||
+ | (here's where you could end the script or add another random item possibility. | ||
+ | |||
+ | ==Make Treasure Randomly Grow or Appear== | ||
+ | |||
+ | First create the desired item with an item editor. | ||
+ | |||
+ | <pre>Code: | ||
+ | Hide Sprite | ||
+ | Random number | ||
+ | if random number > X | ||
+ | Draw Sprite ( sapling ) | ||
+ | |||
+ | use another random number generator to choose the sprites position if you want (example) | ||
+ | if random number > X; setObjCoords (10,F) | ||
+ | if random number < X; setObjCoords (1A,23) | ||
+ | |||
+ | when you activate the object, it display a textbox that tells you "you got ..." | ||
+ | give the item to the player | ||
+ | remove the object | ||
+ | |||
+ | I use this code for finding random gems that appear in cave walls too.</pre> | ||
+ | |||
+ | ==Make Doors== | ||
+ | |||
+ | To make doors: put the door tiles on layer 1, and in the tile propriety of the bottom door tiles, set the "door trigger" option to yes (simple, but the thing to remember is that there's no need to put the opened door tiles on the map and no need for CopyTile events). | ||
+ | |||
+ | ==Multiple Planes== | ||
+ | |||
+ | ''jsondag2'': | ||
+ | This is a really cool feature and quite literally adds a whole new dimension to your map (i crack myself up). This is something that had bugged me for a really long time and actually now that I understand it it helps me realize what is going on in the maps alot more. First off what is the multiple planes? Well have you ever wondered how at one point in a map you can go "under' a bridge but then at then you climb a ladder walk around and all of a sudden you go right over the bridge...how does this work on a 2D map? Well it turns out it's all cause of planes. | ||
+ | |||
+ | Now I realized that there were planes while toying with TF but I never knew how to use them. It turns out it's actually really easy I just had been missing one piece. First off open a map and turn on the "Z plane" by going map -> Zplane or just press ctrl + 8 (you want to learn these shortcuts trust me). Then open up tile properties by going window -> location -> tile properties. | ||
+ | |||
+ | If your map already has 4 colors you can go on to the next step, otherwise you'll need to do the following: | ||
+ | |||
+ | *Make a tile of Plane 1 (dark blue): in the tile properties window go Z plane make it Plane 1 and click a tile | ||
+ | *Make a tile of Plane 2 (light blue): In the tile properties window go to Z plane make it plane 2 and click a tile | ||
+ | *Make a transitional walkable tile (gray): In the tile properties window go to Z plane make it plane 2 and click a tile. | ||
+ | *Make a transitional solid tile (pink): In the tile properties window go to Z plane make it plane 2 and click a tile. | ||
+ | |||
+ | Now that we have all of the Z planes we can start making a cool map. Now I know it's tempting to use solidity to make walls and such but if you are making a map with multiple planes you might as well use planes as walls (except for corners and such since Z planes don't have "corners). | ||
+ | |||
+ | Wherever Crono loads becomes the first plane that he is on. Whatever plane he loads on he can walk on and the opposite is solid. Now here's the cool part once Crono touches a "transition tile" (gray) the roles reverse I.E. if he started on dark blue then dark blue becomes solid and Light blue becomes walkable. Finally the pink is always solid. So in a nutshell, always make solid things pink (walls) make the ground blue and make the upstairs light blue. Then stick a transition tile at the top or bottom of ladders (or stairs). | ||
+ | |||
+ | What's even cooler is some tiles have different properties if crono is on a certain plane. I'm still working on mastering that but currently I just use pre - existing examples (one is grates in robot levels when you are on plane 1 crono is under them when you are on plane 2 crono is above them). | ||
+ | |||
+ | I'm working on a map right now so if I figure something out I'll add to this post. | ||
+ | |||
+ | ==Position the Epoch== | ||
+ | |||
+ | Step 1: | ||
+ | |||
+ | ~ | ||
+ | |||
+ | <pre>Category Memory Copy | ||
+ | Command Memory Copy | ||
+ | Variant 4E | ||
+ | Copy to 7E0290 | ||
+ | Data: 00000000A0</pre> | ||
+ | |||
+ | The four 00 bytes are the X and Y coords (2 bytes each) If you leave it like that it'll place the Epoch at 0,0 on the map (very upper-left corner) The A0 is the Epoch status byte. A0 is for upgraded, and IIRC 80 is for the original Epoch. | ||
+ | |||
+ | Here's an easy method to get the Epoch X and Y coords you want to use without having to calculate stuff. In ZSNES, fly the Epoch to where you want it to be parked in your event code. Then open the cheat search and hit Size 1 byte, Format Hex, Comparative Search, and press Start. Then press the View button. Scroll to 7E0290 and you'll see the 4 coordinates bytes. | ||
+ | |||
+ | Let's say I do this, and see the following: | ||
+ | |||
+ | <pre>7E0290 A8 | ||
+ | 7E0291 01 | ||
+ | 7EE292 10 | ||
+ | 7E0293 01</pre> | ||
+ | |||
+ | Then instead of the 00000000A0 above, enter A8011001A0. | ||
+ | |||
+ | Step 2: | ||
+ | |||
+ | ~ | ||
+ | |||
+ | <pre>Assignment | ||
+ | Value-to-Mem | ||
+ | Variant 4B | ||
+ | Value 1F0 | ||
+ | Store to 7E029F | ||
+ | Width Two Byte</pre> | ||
+ | |||
+ | The value box is where you put the map you want the Epoch to be on. In this case it is 1F0, 1000 AD map. Use 1F1 for 600 AD, 1F2 for 2300 AD, etc. etc. | ||
+ | |||
+ | ~ | ||
+ | |||
+ | If you put in A8011001A0 for Data in Step 1, and 1F0 for Value in Step 2, it'll park a winged Epoch right in front of Crono's house. | ||
+ | |||
+ | BTW, don't forget, if you don't where the Epoch is you can press Select to view the zoomed out map and look for the flashing yellow dot. | ||
+ | |||
+ | HOWEVER...Your Epoch can't land in that spot in the example, even though the PCs can walk there. It's too close to one of the nearby exits - Epoch can't land on exit tiles. When you change the X, Y coords, check the Epoch can land first, then look at the coords in the cheat search. | ||
+ | |||
+ | ==Prevent Crono from Speaking== | ||
+ | |||
+ | How to prevent Crono from talking: | ||
+ | |||
+ | In textboxes, the tags {PC1}, {PC2}, and {PC3} can be written to insert the name of each character from the party. This is useful to make the party members speak with their names (like {PC1}: text). | ||
+ | |||
+ | However, to make sure that Crono doesn't speak one of those generic sentences, a small trick must be used. There are many different way to do it but this one is simple: Mem7e2980 is PC1 and is equal to 0 if it's Crono. So: | ||
+ | |||
+ | * Assign Mem7e2980 to some other free Mem | ||
+ | * If the other free Mem == 00 | ||
+ | |||
+ | ** Textbox ("{PC2}: the text") | ||
+ | ** Go To (the rest of the code) | ||
+ | |||
+ | * Textbox ("{PC1}: the same text") | ||
+ | * (the rest of the code) | ||
+ | |||
+ | Thus, if Crono is in the first position in the party, the second character will speak for him. If Crono is not first (he may be second, third, or not in the active party at all) then the first character will speak normally. | ||
+ | |||
+ | ==Put More than One Room on a Map== | ||
+ | |||
+ | How to put more than one room on a map. | ||
+ | |||
+ | Credit again to chickenlump: | ||
+ | |||
+ | Ever wonder how some of the CT maps can have so many rooms close to each other but you still don't see them? | ||
+ | |||
+ | Well the easy answer is to use the "scroll" locks of a location but sometimes you don't want to use a whole bunch of for all these small rooms. Well thats where the RAM location of the scroll locks come into play. | ||
+ | |||
+ | Here is the memory locations for scroll: | ||
+ | |||
+ | <pre>7E1D1A: Left | ||
+ | 7E1D1B: Right | ||
+ | 7E1D1C: UP | ||
+ | 7E1D1D: Down</pre> | ||
+ | |||
+ | (thanks to chickenlump for figuring this out) | ||
+ | |||
+ | First off since it's all one one big map you need to know which part of the map your character is in. Lucky there's a getObjectCoord command | ||
+ | |||
+ | <pre>Category: Object Coordinates | ||
+ | Command: GetObjectCoordinates | ||
+ | Variant: 22 (not sure this matters) | ||
+ | Mode: PC (your getting your playable character) | ||
+ | Obj/PC: 00 (there's always atleast one character in your party) | ||
+ | XCoord: 7F0220 | ||
+ | YCoord: 7F0222 (these can be any temp memory)</pre> | ||
+ | |||
+ | Now that you know have the x/y coordinates you can know which room your character is in and set the scrolls appropriately. Here's an example. Imagine a map with 6 rooms in 2 columns, 3 rows. Put this in object 00's activate: | ||
+ | |||
+ | <pre>if(mem.7f0220 < 0F ) //he's in the left column TF calls this Comparison, value to mem | ||
+ | if(mem.7f0222 < 11) //he's in the top row | ||
+ | mem.7E1D1A = 0 | ||
+ | mem.7E1D1B = F | ||
+ | mem.7E1D1C = 0 | ||
+ | mem.7E1D1D = F | ||
+ | return | ||
+ | if(mem.7f0222 > 23) //he's in the Bottom row left column | ||
+ | mem.7E1D1A = 0 | ||
+ | mem.7E1D1B = F | ||
+ | mem.7E1D1C = 23 | ||
+ | mem.7E1D1D = 2f | ||
+ | return | ||
+ | //he's in the middle row | ||
+ | mem.7E1D1A = 0 | ||
+ | mem.7E1D1B = F | ||
+ | mem.7E1D1C = 11 | ||
+ | mem.7E1D1D = 20 | ||
+ | return</pre> | ||
+ | |||
+ | You can do a similar thing for the right column. A few notes: | ||
+ | |||
+ | Object 00's activate gets called automatically after the player goes to a menu. That's why you put this code there (that way if they hit a menu and come back it's not reset.....this is also where you put code for copytiles that need to stay copied after a user hits menu). | ||
+ | |||
+ | Make sure you make your scrolls atleast the size of one screen otherwise there are bugs......and really annoying hard to figure out ones too. | ||
+ | |||
+ | ==Quickly Detect Text Corruption== | ||
+ | |||
+ | How to quickly detect text corruption: | ||
+ | |||
+ | Just a little trick to quickly detect text corruption when you're working extensively on a location. Put a text command in Object00 right after the Return, with a short placeholder sentence like "Text{null}". Each time you'll enter the location in the game, this sentence will be shown before the rest of the events. This way, if the strings in the location get corrupted (they become non-ending garbage texts), you'll know it as soon as you enter the location. This is useful to avoid spending time coding something while not realizing that at some point the location strings became corrupted. | ||
==Random Enemies or NPCs== | ==Random Enemies or NPCs== | ||
Line 120: | Line 640: | ||
Remember in Final Fantasy 7, in the Golden Saucer, the shady guy that would appear at random and sell you points in exchange for your money? That would be cool to have a super rare occurance of some sort of merchant that sold great items, like one value out of 255 possibilities the player would run across this salesman. Or a powerful optional enemy that the most unlucky players will come across when they least expect it...Hey... random title screens! Why just have one? Every time they power on, they get a different title screen.... Nothing too fancy, just some fun automated events to watch, give the player more reasons to keep coming back. Anything is possible! | Remember in Final Fantasy 7, in the Golden Saucer, the shady guy that would appear at random and sell you points in exchange for your money? That would be cool to have a super rare occurance of some sort of merchant that sold great items, like one value out of 255 possibilities the player would run across this salesman. Or a powerful optional enemy that the most unlucky players will come across when they least expect it...Hey... random title screens! Why just have one? Every time they power on, they get a different title screen.... Nothing too fancy, just some fun automated events to watch, give the player more reasons to keep coming back. Anything is possible! | ||
+ | |||
+ | ==MemCopy88 Notes== | ||
+ | |||
+ | <pre>Notes by Myself086 | ||
+ | |||
+ | command mode p2 p3 p4 | ||
+ | 88 40 1f ff 02 | ||
+ | |||
+ | command 88 executes code at c04892 | ||
+ | |||
+ | mode 0x40-0x4f does the following | ||
+ | mode 0x50-0x5f does similar operations, but darkens sprite instead | ||
+ | |||
+ | writes 1 element at 7e0520 (12 bytes per element) | ||
+ | +0 = mode & 0xf0 | ||
+ | +1 = ??? + p2 | ||
+ | +2 = p2 & 0x0f | ||
+ | +3 = 8 | ||
+ | +4 = 0 | ||
+ | +5 = p4 | ||
+ | +6 = mode & 0x0f | ||
+ | +7 = (p3 >> 4) | (p3 & 0xf0) | ||
+ | +8 = (p3 << 4) | (p3 & 0x0f) | ||
+ | +9 = | ||
+ | +10= | ||
+ | +11= | ||
+ | |||
+ | What I understand so far (mode 0x40, may vary for other modes) | ||
+ | +0, Upper bits define what action to take (0=nothing) | ||
+ | +1, Last palette color index to change (loop goes down, see +2) | ||
+ | +2, Number of colors to change | ||
+ | +3, Count down step for +7 and +8 | ||
+ | +4, Frame counter for +5 | ||
+ | +5, Wait this number of frames before doing anything | ||
+ | +6, Some action to take (0 = palette brightness) | ||
+ | +7, Counts down by the number indicated at +3, this is also brightness multiplier | ||
+ | +8, if +7 is lower than +8, erase +0 | ||
+ | +9, | ||
+ | +10, | ||
+ | +11, </pre> | ||
+ | |||
+ | ''Thanks to Jsondag2, Chickenlump, Zakyrus, Chrono'99, and others'' | ||
''From'': [[Modification]] | ''From'': [[Modification]] |
Revision as of 02:53, 27 February 2019
Contents
- 1 Adding the Epoch
- 2 Battle with Monsters
- 3 Change Locations with Fade Effects
- 4 Change the Opening
- 5 Check for Gold Amounts Over 65535
- 6 Check the Game Clock
- 7 Draw Geometry
- 8 Drugged / Confused Effect
- 9 Fade / Darken
- 10 Force a Cutscene
- 11 Increase Sound Volume with Approach
- 12 Make a Bed
- 13 Make a Character Turn White
- 14 Make a Conveyor Belt / Wind
- 15 Make a Save Point
- 16 Make a Treasure Chest
- 17 Make Treasure Randomly Grow or Appear
- 18 Make Doors
- 19 Multiple Planes
- 20 Position the Epoch
- 21 Prevent Crono from Speaking
- 22 Put More than One Room on a Map
- 23 Quickly Detect Text Corruption
- 24 Random Enemies or NPCs
- 25 MemCopy88 Notes
Adding the Epoch
The first time you add the epoch to the game you will have to Do some memory commands in some arbitrary in your code and call that arbitrary.
Assign(Mem.7E0290=Pixel) //XCoord on Map Assign(Mem.7E0292=Pixel) //YCoord on Map Assign(Mem.7E029F=MapNumber)//Map LOCATION number 1FX Assign(Mem.7E0294=XX)// A0 for wings 00 for no wings
Note: After some debugging it was found that the pixels for the X and Y coordinates should end in 0 and be far away from exits. Also make the width to two bytes for all assignments except the 7E0294.
Battle with Monsters
Making an Enemy Walk Around
StartupIdle -load enemy (remember prm has to be 3--?) -set coordinates -return -move sprite -move sprite -go to (first move sprite) Arbitrary 0 -explore mode off -move party to right spot -move enemy(s) to right spot -scroll screen -Battle! -remove objects -return
Causing the Battle
This Code can be activated either by stepping on a spot (placing an object at the spot and making it's arb. 0 this code) or by touching an enemy (Making the enemies arb. 0 this code)
Arbitrary 0
ExploreModeOff Move Party //move party to correct tiles Move Sprite //if this is not the enemies arb do a callObjectFunction Scroll Screen //params are upper left corner tile (x,y) Battle //if this is a random encounter (not touching enemy) Remove (object) ExploreModeOn
Change Locations with Fade Effects
In the first location, put:
- Pause(0.250)
- Darken(06)
- FadeOutScreen
- SoundCmd(SongVol, 18, 00)
- WaitForSilence
- Pause(0.250)
- ChangeLocation (variant DF)
In the second one, put in Object00 after the Return:
- Pause(0.875)
- Darken(F6)
- Pause(3.125)
Of course, the pauses are optional and can be adjusted to your liking.
I believe variant E0 will automatically do a fade in/out, though it may not do it at the speed you like. It may also not handle sound the same way.
Yes, the darken command allows to adjust the speed of the fades, and the song this way is also faded. I find this code useful to highlight special sequences such as ellipsises or "in the meanwhile" scenes.
Change the Opening
Getting Rid of the 1000 A.D. Scene
There's two ways:
Overworld event editing
- Open up 1000 AD events
- Scroll down till you see [2ab]
- In the middle of that you'll see "init memory" and then Command 28
- Leave the command 28 but you can delete all other commands below that
- Leave AddObjects Mem.XXXXX='s, the Change location, and the end
- Update and write to memory
Note: This method I think switches to 1000 AD for like a tenth of a second.
Location Event editing:
- Open up location {000}
- Under if(mem.70061=00) is a change location to 1F0 (above it is the change Crono's name dialogue box)
- Change that location to 10F (instead of changing to 1000 AD map we just skip to the "wake up crono" map)
Adding a New Scene
- Open up Location {1b1} Title Screen.
- Object 1 Arbitrary 1 has a "change Location at the end"
- Change that Location to the location that you will have your new Title screen be
- In the events of your new location make some sort of small intro, make sure at the end of the intro you have a change location {000} Load Screen
...but in the intro location events, add those commands in Object00 after the Return (delete the End):
-CheckButton (All, Type1) --ChangeLocation {000} -GoTo the checkbutton
Note that if you have some Pause or ScrollScreen in Object00 they will probably interfer with the Check Button, so move them to a new object.
Now if you push a button during your intro you will be teleported back to the load screen, just like in CT. Unfortunately this doesn't work for the Start button, but the other buttons are fine.
Check for Gold Amounts Over 65535
Use Memory Assignment commands to copy the 3 gold bytes (7E2C53, 7E2C54, 7E2C55) somewhere into the 7F02xx+ location event temp memory.
Then, use several If Statements on those bytes to check for the gold amount.
Example - check if 500,000G or more obtained ($07A120)
- Assignment, Mem to Mem, Variant 48, 7E2C55 to 7F0200, Width 1 byte
- Assignment, Mem to Mem, Variant 49, 7E2C53 to 7F0202, Width 2 byte
- Comparison, Value to Mem, Variant 12, 7F0200, Value 07, Width 1 byte, Operation >=
- Comparison, Value to Mem, Variant 13. 7F0202, Value A120, Width 2 byte, Operation >=
The second If Statement should be inside the first one. The code window will look similar to:
Assign(data) Assign(data) If(address >= 1 byte number) If(address >= 2 byte number) Code to use if gold amount or higher is obtained
Check the Game Clock
This is very similar to the above example. Copy the clock bytes you want from the 7E0400-7E0406 range to 7F0200+ location event temp memory and use If checks. Read the Memory Locations.txt of the Offsets Guide from Geiger's Crypt to find out how the clock values are stored.
Basic example - check if game clock > 99:59:
Assignment, Mem to Mem, Variant 48, 7E0406 to 7F0200, Width 1 byte
Comparison, Value to Mem, Variant 12, 7F0200, Value 00, Width 1 byte, Operation >
Draw Geometry
You can only see it's effects if there is a Brighten command right after it. The brighten command controlls the color, intensity, duration, etc. of the geometry, and the Draw Geometry data controlls what it looks like, how it forms, it's angle, various other stuff. Play around with both of them for cool effects. The other variables are fuzzy.
- 00 . Modality - which coordinates are active, etc.
- 01 . Point 1 X1 - which moves to...
- 02 . Point 1 X2
- 03 . Point 1 Y1 - which moves to...
- 04 . Point 1 Y2
- 05:08 . Point 2
- 09:0C . Point 3
- 0D:10 . Point 4
Someone else should take a look at this to confirm. The modality byte is fairly confusing. The coordinates are pixel relative to the screen (not the map). X can handle a value of 0xFF. Y cannot (not sure of maximum).
Now, for a demonstration:
Drugged / Confused Effect
Set these memory values to make the screen wobbly.
- 7E1DF9 to 1
- 7E1DFD to 1
Fade / Darken
All notes use
Memory Copy
Multimode 2E
Mode 40
Except where noted
Darken the Scene
Use this to darken the entire scene a little, making it appear gloomy.
Fade a Character to White
Use this to fade a sprite to almost pure white permanently; put it in that object's event code.
- MemCpy88(40,0F,0F,01)
You can undo the effect and return the character to normal with this.
- MemCpy88(40,0F,F0,08)
To use this, a certain MemCpy command must be employed:
Memory Copy
Multimode 88
Param 1 - F
Param 2 - F
Param 3 - 1
Data - Leave empty
Fade in Characters from Black
These two memcopy commands will start your characters out completely black, and then slowly fade them into color.
- MemCpy2E(50,80,80,00)
- MemCpy2E(50,80,80,0F)
Of course, you can split these two up if you want them to stay dark while something goes on, and then fade them in afterwards.
Fade in Scene from Black
This 4 command memcopy segment is for the begining of an area, it fades the location in from black slowly (like it did for the characters, except this is for the whole screen).
- MemCpy2E(50,00,1C,00)
- MemCpy2E(50,1F,E0,00)
- MemCpy2E(50,00,1C,0F)
- MemCpy2E(50,1F,E0,0F)
Fade in Scene from White
Here is one that flashes the background white, like lightning, and fades back in, all smooth and cool-looking.
- MemCpy2E(40,10,70,08)
- MemCpy2E(40,10,70,80)
Fade the Background to Black with Visible Characters
This one fades the background to black, but your sprites remain visible.
- MemCpy2E(50,10,62,F0)
- Pause(0.500) (0.125)
- MemCpy2E(50,72,0A,F8)
Combination Fade
This one fades the screen in from black, but the characters fade in first, and then the background.
- MemCpy2E(50,00,80,00)
- MemCpy2E(50,7C,04,0F)
- Pause(3.000) (0.750)
- MemCpy2E(50,72,0A,08)
- Pause(4.000) (1.000)
- Pause(2.000) (0.500)
- MemCpy2E(50,72,0A,8F)
- Pause(1.000) (0.250)
- MemCpy2E(50,00,72,0F)
Force a Cutscene
How to.....Force a cut scene, the easy way!
For the longest time I didn't know this....You'll notice parts of crimson echoes where you have to touch a very specific spot to do anything. Now you can easily set a whole "area" to trigger a scene. Through the power of getObjectCoordinates:
First off your going to need a loop that continuously checks coordinates do do this simply follow these steps:
//I chose the last two myself, as long as they are above 7f0200 it's fine. getObjectCoordinates, variant 22, PC, 00, 7f0220, 7f0222 //store crono's pos in two memory spots ......//code goes here
goto line of get object coordinates
The goto command isn't the most user friendly. There's a very large drop down list and you have to find a very specific line number. But it's doable. Now in between those two lines you are going to put conditionals, for example if you want them to not cross a certain X coordinate you can do something like this
getObjectCoordinates, variant 22, PC, 00, 7f0220, 7f0222 if( 7f0220 >= (x coordinate) - explore mode off - begin cutscene goto line of get object coordinates
If you wanted a specific block of the map to trigger a battle
getObjectCoordinates, variant 22, PC, 00, 7f0220, 7f0222 if( 7f0220 >= (x coordinate)) if (7f0222 >- (y coordinate) - explore mode off - move party - move enemies - move screen - battle goto line of get object coordinates
It really is that easy. Stick that code in any startup/idle object and have fun.
Increase Sound Volume with Approach
Sounds that get louder when you get closer(ambient?) using music ...sort of. Works good for "Running Water", "Hail Magus", or Dungeon Drip sound, even "Lavos Breath"
represents == <= >= and such set volume louder when getting closer GetObjCoord(PC00, Xvalue, Yvalue) If(Xpos or Ypos ** char_coordinates) Soundcmd(SongVol, duration, volume) If(Xpos or Ypos ** char_coordinates) Soundcmd(SongVol, duration, volume) If(Xpos or Ypos ** char_coordinates) Soundcmd(SongVol, duration, volume)
Make a Bed
1) Draw the bed 2) When you want your character to go to sleep you call an arbitrary 3) In the arbitrary you
--set the coordinates (guess and check) --set animation to 28 (I believe) 4)if you are having some tiles go over the sprite you --select the tile --On the locations tab you should see tile properties --select which quadrant y ou no longer want to be over the sprites head (NW, NE, SW, SE) --change priority to false
Make a Character Turn White
Chickenlump posted this in a similar thread a long time ago:
Category: Memory Copy Command: Multi-mode 88 MemCpy88 mode = 40 Param 1 = F Param 2 = F Param 3 = 2 Data leave blank Pause(3 seconds) Category: Memory Copy Command: Multi-mode 88 MemCpy88 mode = 0
Put that in a characters (or NPC) arbitrary and then use Call object function to call it.
Make a Conveyor Belt / Wind
Make a Conveyor Belt (I guess also can be how to make wind):
- Choose tileset with Conveyor belt
- Draw the belt
- Open up Tile properties (window-->location-->tile properties)
- turn on Movement (Map Movement (ctrl+7 to, if you are going to use TF a lot learn the ctrl+??s))
- Set direction of conveyor belt under Wind direction
- Set Speed (3 means you can't run against, 2 means it slows down if you run against)
Extra! (this is actually why I made this)
- To change the direction of the conveyor belt draw the opposite direction of the belt somewhere off the scroll screen of the map (remember to put it's wind movement/speed)
- Add the switch on the map and as an object
- Open up its activate
- Put a copy tiles, make the source your new belt and it's destination your old belt (remember to drop the 3rd digit in coordinates)
- In the unknown put "B"
Ta da.
I believe the copy tile "layer properties" only copies solidity. You need to set the unknown to something to change other tile properties (Z plane/wind direction etc). Because I have had the problem before, I learned to set it to B by looking at blackbird events.
Make a Save Point
First off put a save point NPC on the map (for simplicity make the last digit of the object coordinates 0)
Next put an object at the same location as the save point
Now have a getObjectCoords for PC 00
If( X of PC 00 ) = (first 2 digits of object coord) // he's at the right X If (Y of PC 00 ) = (first 2 digits of object coord) // he's at the right Y if (Memory & bit) If (a button is pressed) // he pressed A Special Dialogue --Save (under category text) go to getObjectCoords play save point sound set Memory bit go to getObjectCoords reset bit go to get object coord
I'm not sure what the point is of setting the object Bit. In the example I pulled up it was 7f01CF bit 80. It may be a bit that allows Saving in the menu (just a guess hopefully someone can confirm this). But the main point is to check the X and Y coordinates of PC 00 (just drop the 3rd digit of the object coordinates).
Make a Treasure Chest
Make A Chest:
1. Place on Map, Place Open Chest off map 2. Make an Object and set Coordinates on the chest 3. Pseudo code that Object
Startup/idle:
set Object Coord //at chest area if(MemorySpotOfChest && Bit) ---Copy Tiles from open chest on map ---remove this object
Activate:
ExploreMode Off Copy Tiles as before 7f0200==Index of Item "you got {item}" BitMath(MemorySpotOfChest, Bit, Set) RemoveObject ExploreMode On
Note 1: Every memory spot of chest has 8 bits you can set to either true of false, thus every memory spot can be used for 8 chests.
Note 2: 7F0200 is the memory spot used when you put {item} in a string. You set 7F0200 to the number of the item you'll be receiving then by saying "you got {item}". It'll display you got Wood Sword (for example).
You can randomize the contents, too!
First you must make a chest like the one in "Castle Magus: Hall of Deceit", the chest here uses event code to make a treasure chest instead of using defualt game style.
Then just add a random number generator, certain values would give you multiple random items.
Here is an example:
Random Number If RandomNumber < 75 (item drop chance) Random Number (new random number from item type) If RandomNumber < 30 ~Give items 5 Tonics ~Goto 1000 If RandomNumber < 70 ~Give item Mid Tonic ~Goto 1000 If RandomNumber < 90 (rarer items have smaller chances) ~Give item Full Tonic ~Goto 1000 If RandomNumber < D0 ~Give item Elixir ~Goto 1000 If RandomNumber < FF ~Give item Mega-Elixir ~Goto 1000
[1000] ...
(here's where you could end the script or add another random item possibility.
Make Treasure Randomly Grow or Appear
First create the desired item with an item editor.
Code: Hide Sprite Random number if random number > X Draw Sprite ( sapling ) use another random number generator to choose the sprites position if you want (example) if random number > X; setObjCoords (10,F) if random number < X; setObjCoords (1A,23) when you activate the object, it display a textbox that tells you "you got ..." give the item to the player remove the object I use this code for finding random gems that appear in cave walls too.
Make Doors
To make doors: put the door tiles on layer 1, and in the tile propriety of the bottom door tiles, set the "door trigger" option to yes (simple, but the thing to remember is that there's no need to put the opened door tiles on the map and no need for CopyTile events).
Multiple Planes
jsondag2: This is a really cool feature and quite literally adds a whole new dimension to your map (i crack myself up). This is something that had bugged me for a really long time and actually now that I understand it it helps me realize what is going on in the maps alot more. First off what is the multiple planes? Well have you ever wondered how at one point in a map you can go "under' a bridge but then at then you climb a ladder walk around and all of a sudden you go right over the bridge...how does this work on a 2D map? Well it turns out it's all cause of planes.
Now I realized that there were planes while toying with TF but I never knew how to use them. It turns out it's actually really easy I just had been missing one piece. First off open a map and turn on the "Z plane" by going map -> Zplane or just press ctrl + 8 (you want to learn these shortcuts trust me). Then open up tile properties by going window -> location -> tile properties.
If your map already has 4 colors you can go on to the next step, otherwise you'll need to do the following:
- Make a tile of Plane 1 (dark blue): in the tile properties window go Z plane make it Plane 1 and click a tile
- Make a tile of Plane 2 (light blue): In the tile properties window go to Z plane make it plane 2 and click a tile
- Make a transitional walkable tile (gray): In the tile properties window go to Z plane make it plane 2 and click a tile.
- Make a transitional solid tile (pink): In the tile properties window go to Z plane make it plane 2 and click a tile.
Now that we have all of the Z planes we can start making a cool map. Now I know it's tempting to use solidity to make walls and such but if you are making a map with multiple planes you might as well use planes as walls (except for corners and such since Z planes don't have "corners).
Wherever Crono loads becomes the first plane that he is on. Whatever plane he loads on he can walk on and the opposite is solid. Now here's the cool part once Crono touches a "transition tile" (gray) the roles reverse I.E. if he started on dark blue then dark blue becomes solid and Light blue becomes walkable. Finally the pink is always solid. So in a nutshell, always make solid things pink (walls) make the ground blue and make the upstairs light blue. Then stick a transition tile at the top or bottom of ladders (or stairs).
What's even cooler is some tiles have different properties if crono is on a certain plane. I'm still working on mastering that but currently I just use pre - existing examples (one is grates in robot levels when you are on plane 1 crono is under them when you are on plane 2 crono is above them).
I'm working on a map right now so if I figure something out I'll add to this post.
Position the Epoch
Step 1:
~
Category Memory Copy Command Memory Copy Variant 4E Copy to 7E0290 Data: 00000000A0
The four 00 bytes are the X and Y coords (2 bytes each) If you leave it like that it'll place the Epoch at 0,0 on the map (very upper-left corner) The A0 is the Epoch status byte. A0 is for upgraded, and IIRC 80 is for the original Epoch.
Here's an easy method to get the Epoch X and Y coords you want to use without having to calculate stuff. In ZSNES, fly the Epoch to where you want it to be parked in your event code. Then open the cheat search and hit Size 1 byte, Format Hex, Comparative Search, and press Start. Then press the View button. Scroll to 7E0290 and you'll see the 4 coordinates bytes.
Let's say I do this, and see the following:
7E0290 A8 7E0291 01 7EE292 10 7E0293 01
Then instead of the 00000000A0 above, enter A8011001A0.
Step 2:
~
Assignment Value-to-Mem Variant 4B Value 1F0 Store to 7E029F Width Two Byte
The value box is where you put the map you want the Epoch to be on. In this case it is 1F0, 1000 AD map. Use 1F1 for 600 AD, 1F2 for 2300 AD, etc. etc.
~
If you put in A8011001A0 for Data in Step 1, and 1F0 for Value in Step 2, it'll park a winged Epoch right in front of Crono's house.
BTW, don't forget, if you don't where the Epoch is you can press Select to view the zoomed out map and look for the flashing yellow dot.
HOWEVER...Your Epoch can't land in that spot in the example, even though the PCs can walk there. It's too close to one of the nearby exits - Epoch can't land on exit tiles. When you change the X, Y coords, check the Epoch can land first, then look at the coords in the cheat search.
Prevent Crono from Speaking
How to prevent Crono from talking:
In textboxes, the tags {PC1}, {PC2}, and {PC3} can be written to insert the name of each character from the party. This is useful to make the party members speak with their names (like {PC1}: text).
However, to make sure that Crono doesn't speak one of those generic sentences, a small trick must be used. There are many different way to do it but this one is simple: Mem7e2980 is PC1 and is equal to 0 if it's Crono. So:
- Assign Mem7e2980 to some other free Mem
- If the other free Mem == 00
- Textbox ("{PC2}: the text")
- Go To (the rest of the code)
- Textbox ("{PC1}: the same text")
- (the rest of the code)
Thus, if Crono is in the first position in the party, the second character will speak for him. If Crono is not first (he may be second, third, or not in the active party at all) then the first character will speak normally.
Put More than One Room on a Map
How to put more than one room on a map.
Credit again to chickenlump:
Ever wonder how some of the CT maps can have so many rooms close to each other but you still don't see them?
Well the easy answer is to use the "scroll" locks of a location but sometimes you don't want to use a whole bunch of for all these small rooms. Well thats where the RAM location of the scroll locks come into play.
Here is the memory locations for scroll:
7E1D1A: Left 7E1D1B: Right 7E1D1C: UP 7E1D1D: Down
(thanks to chickenlump for figuring this out)
First off since it's all one one big map you need to know which part of the map your character is in. Lucky there's a getObjectCoord command
Category: Object Coordinates Command: GetObjectCoordinates Variant: 22 (not sure this matters) Mode: PC (your getting your playable character) Obj/PC: 00 (there's always atleast one character in your party) XCoord: 7F0220 YCoord: 7F0222 (these can be any temp memory)
Now that you know have the x/y coordinates you can know which room your character is in and set the scrolls appropriately. Here's an example. Imagine a map with 6 rooms in 2 columns, 3 rows. Put this in object 00's activate:
if(mem.7f0220 < 0F ) //he's in the left column TF calls this Comparison, value to mem if(mem.7f0222 < 11) //he's in the top row mem.7E1D1A = 0 mem.7E1D1B = F mem.7E1D1C = 0 mem.7E1D1D = F return if(mem.7f0222 > 23) //he's in the Bottom row left column mem.7E1D1A = 0 mem.7E1D1B = F mem.7E1D1C = 23 mem.7E1D1D = 2f return //he's in the middle row mem.7E1D1A = 0 mem.7E1D1B = F mem.7E1D1C = 11 mem.7E1D1D = 20 return
You can do a similar thing for the right column. A few notes:
Object 00's activate gets called automatically after the player goes to a menu. That's why you put this code there (that way if they hit a menu and come back it's not reset.....this is also where you put code for copytiles that need to stay copied after a user hits menu).
Make sure you make your scrolls atleast the size of one screen otherwise there are bugs......and really annoying hard to figure out ones too.
Quickly Detect Text Corruption
How to quickly detect text corruption:
Just a little trick to quickly detect text corruption when you're working extensively on a location. Put a text command in Object00 right after the Return, with a short placeholder sentence like "Text{null}". Each time you'll enter the location in the game, this sentence will be shown before the rest of the events. This way, if the strings in the location get corrupted (they become non-ending garbage texts), you'll know it as soon as you enter the location. This is useful to avoid spending time coding something while not realizing that at some point the location strings became corrupted.
Random Enemies or NPCs
I make use of the Random Number generator and have some comparison commands decide which monster gets loaded into the scene. In this example, I have 2 monsters, Gato, and Masa& Mune. Only one of them will load, based on the random number written to memory. Walk into Gato's Exhibit and Gato may be there, but the next time, maybe Masa & Mune will be there waiting. Imagine dungeons and areas where the monsters can be as unpredictable as you want (with a little work). If there are 255 possible random numbers to be generated, you could code in a monster for each possibility.
That would make for an awesome Colloseum type area (think FF6), where one party member is chosen, to face a random monster, and win a random prize...Here is my code, not copied from anywhere in the ROM, just sort of thrown together (I'm surprised it works).
The Random Number is written to a different space in memory (It's 8 bytes off) but it's easy enough to see where using Geiger's Debugger RAM viewer. (That's why my comparison checks are checking a different location than what the Random Number command says it's writing to).
Remember in Final Fantasy 7, in the Golden Saucer, the shady guy that would appear at random and sell you points in exchange for your money? That would be cool to have a super rare occurance of some sort of merchant that sold great items, like one value out of 255 possibilities the player would run across this salesman. Or a powerful optional enemy that the most unlucky players will come across when they least expect it...Hey... random title screens! Why just have one? Every time they power on, they get a different title screen.... Nothing too fancy, just some fun automated events to watch, give the player more reasons to keep coming back. Anything is possible!
MemCopy88 Notes
Notes by Myself086 command mode p2 p3 p4 88 40 1f ff 02 command 88 executes code at c04892 mode 0x40-0x4f does the following mode 0x50-0x5f does similar operations, but darkens sprite instead writes 1 element at 7e0520 (12 bytes per element) +0 = mode & 0xf0 +1 = ??? + p2 +2 = p2 & 0x0f +3 = 8 +4 = 0 +5 = p4 +6 = mode & 0x0f +7 = (p3 >> 4) | (p3 & 0xf0) +8 = (p3 << 4) | (p3 & 0x0f) +9 = +10= +11= What I understand so far (mode 0x40, may vary for other modes) +0, Upper bits define what action to take (0=nothing) +1, Last palette color index to change (loop goes down, see +2) +2, Number of colors to change +3, Count down step for +7 and +8 +4, Frame counter for +5 +5, Wait this number of frames before doing anything +6, Some action to take (0 = palette brightness) +7, Counts down by the number indicated at +3, this is also brightness multiplier +8, if +7 is lower than +8, erase +0 +9, +10, +11,
Thanks to Jsondag2, Chickenlump, Zakyrus, Chrono'99, and others
From: Modification