/=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\=-=-=-=-=-=-=-=-=\ | RPGTCool 2000 (RPGMaker 2000) | Version 1.00 | | A Guide to Events \=-=-=-=-=-=-=-=-=/ | | Copyright 2001 \ | By Sky Render | Sky Render | | | Translations | | Programming is an art. | All rights | | | reserved | \=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=/=-=-=-=-=-=-=-=-=/ Table of Contents Preface Custom Events Airship Events Summoning the Airship by an Item Summoning the Airship by Keystroke From Ship to Submarine Day/Night Effects Designing a Battle Arena Designing a Casino Blackjack Roulette Slot Machine The Variable-Based Party Changing Between Members Variable Party Members in Cutscenes Other Uses for this System Multiple World Maps: A How-To Guide Evening Out Levels Misc. Events Conclusion =-=-=-= PREFACE =-=-=-= RPGTCool 2000. Or RPGMaker 2000, if you like the English translation's name. The poor man's power tool, and an RPG player's dream come true. RPGTCool allows the user to design their own RPG with mere mouse clicks and keyboard commands, instead of hours and hours of frustrating coding with a programming language made for designing text-based calculation programs. This program acts as a front-end of sorts, allowing the user to program complex events and scenes without having to write the code manually. However, being a front-end, RM2K does have limitations. But not as many as it may seem, due to the Events system. The Events system is complex in comparison to the simplistic design system, and has several layers of interactivity, but by mastering it, you can design fantastic effects that RM2K is not normally capable of. This guide is designed for the experienced user, who has experimented with the Events system to some extent, and is ready to test new waters, and find new ways of designing complex events. Note that all of these events are listed as commands, according to the names used in RPGMaker2K v1.05b by Don Miguel, so if you're using a different version, then you may have a bit of trouble, unless you happen to be familiar with the Events system to a great extent (in which case, this guide would probably be useless to you, anyway). If you find yourself confused by this guide, you may want to look over my very large, very concise Database Guide for RM2K. =-=-=-=-=-=-= CUSTOM EVENTS =-=-=-=-=-=-= What is a custom event, you ask? Well, by my definition, a custom event is an event that works in a manner that's not normal for RPGMaker2K. These events use multiple commands to do something that improves the game (or adds effects that are otherwise impossible to make in RM2K). =-=-=-=-=-=-=-= AIRSHIP EVENTS =-=-=-=-=-=-=-= The airship is a particularly interesting event to mess with. Airships are usually the key vehicle in an RPG, and almost always the last vehicle that you obtain. Many RPG's allow you to access your party from the airship, and some let you summon the airship from anywhere instantly. This guide covers how to do both of these in detail. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= SUMMONING THE AIRSHIP BY AN ITEM =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= This is considerably easier than the other method listed below. Make an item that acts as a switch, and call it what you want (I reccomend Remote Control, so that it makes sense). Call the switch something like Summoning Airship. Now, you probably don't want the player calling the airship in a town, so you'll want to make a switch called In Town for when they enter a town, and have it turn on every time they enter an area in which the airship shouldn't be callable. Anyway, make a new common event, and call it Summon the Airship. Make it a parallel process, and code the following: Wait 0.1 seconds Fork: SWITCH [001: Summoning Airship] - ON set Fork: Airship Riding <> ELSE Case Play SE: Absorption1 (Tempo: 150%) Memorize Location: [003], [004], [005] Teleport: (Airship map, where you want them to be on it) SWITCH [001: Summoning Airship] - OFF set SWITCH [002: In Town] - ON set <> END Case <> END Case <> This way, the player is taken to the airship sub-map instantly (with a sound effect, in my case, Absorption1, to indicate this). Now, on the controls, add the following code for the take-off option (if you let them have a choice): Goto Memorized Location: [003], [004], [005] Set Airship Place: [003], [004], [005] Ride Vehicle SWITCH [002: In Town] - OFF set <> Voila! They're flying the ship! NOTE: To make the transition look better (so it doesn't look like they're taking off), use this code instead of the above for the take-off code: Erase Screen: Fade-out Goto Memorized Location: [003], [004], [005] Set Airship Place: [003], [004], [005] SWITCH [002: In Town] - OFF set Ride Vehicle Wait 0.2 seconds Show Screen: Fade-in <> This will conceal the airship taking off. =-=-=-=-=-=-=-=-=-=-=-= FROM SHIP TO SUBMARINE =-=-=-=-=-=-=-=-=-=-=-= This is a neat little trick I've made use of, turning the ship into a below- and above-water vessel. The first step in this is to finalize the structure of your world map, and copy it. Re-design the copied map to be an underwater realm of sorts, and be sure to make all areas where you can resurface the same tile (this will be explained later). Add an event on your world's main map, and call it Submerge. Make it a Parallel Process, no pre-requisites, and put the following code in it: Wait: 0.1s FORK Optn:Ship Riding Enter Passowrd:[0015:Submarine Control] (NOTE: Set Wait Until Key Hit to on) FORK Optn: Varbl[0015:Submarine Control]-6 FORK Optn:Ship Riding (NOTE: This is required, believe me) Messg:Submerge? Show Choice: Yes/No/Open Menu [Yes] Case Fork Optn:Ship Riding (NOTE: There's a good reason for this, trust me) Variable Ch:[0016:Underwater Map] Set, 6 (NOTE: Change this to match your underwater map's MapID) Change Switch:[0015:Underwater]-ON Set Set Screen Tone:[R000,G000,B000,S100],0.03sec(W) Chang.Screen Transition: Teleport/Eras,Instant Chang.Screen Transition: Teleport/Show,Instant Call Weather Effect: None Goto Memorized Plac:(V[0001] V[0002],V[0016]) (NOTE: This only works properly if you used the player tracking code I provided earlier) Change System BGM: Ship -> ... (Whatever you want) Chang.Screen Transition: Teleport/Eras,Fade-Out Chang.Screen Transition: Teleport/Show,Fade-in Set Screen Tone: [R080,G080,B120,S050),0.3sec END Case ELSE Case Messg:You need to be on the ship to submerge! END Case [No] Case END Case [Open Menu] Case Call System Menu END Case END Case END Case END Case Hefty, isn't it? On your underwater map, add a similarly set up event, and use this code in it instead of the above: Wait: 0.1s Set Terrain's ID: (V[0001],V[0002]), [0017:Current Tile] Enter Password:[0015:Submarine Control] (NOTE: Set Wait Until Key Hit to on) FORK Optn:Varbl[0015:Submarine Control]-6 Messg:Resurface? Show Choice: Yes/No/Open Menu [Yes] Case Set Terrain's ID: (V[0001],V[0002]), [0017:Current Tile] FORK Optn: Varbl[0017:Current Tile]-11 (NOTE: Set this to the tile number which you have designated as the re- surfacing tile) Variable Ch:[0016: Underwater Map] Set, 1 (NOTE: Set this to the MapID of your world map) Change Switch:[0015:Underwater]-OFF Set Set Screen Tone:(R000,G000,B000,S100),0.3sec(W) Chang.Screen Transition: Teleport/Eras,Instant Chang.Screen Transition: Teleport/Show,Instant Goto Memorized Plac:(V[0001] V[0002],[V0016]) (NOTE: As before, you need to use the player tracking code for this to work) Change System BGM: Ship -> ... (Whatever it's normally set to) Chang.Screen Transition: Teleport/Eras,Fade-Out Chang.Screen Transition: Teleport/Show,Fade-in Set Screen Tone:(R100,G100,B100,S100),0.3sec ELSE Case Messg:You can't resurface here! END Case [No] Case END Case [Open Menu] Case Call System Menu END Case END Case Much smaller. Be sure to set up your underwater tileset so it's compatible with your above-water tileset (so you don't resurface on land), and test it out. It should work well. You can modify this code to work with a time cycler, as well, but the code for this would take a lot of work to write into this guide, so you'll just have to figure it out yourself. :P Seriously, though, it's not very hard to do. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= SUMMONING THE AIRSHIP BY KEYSTROKE =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= This is a bit more tricky, and takes more time and code, but it lets you have a Final Fantasy-like airship. Make a new common event parallel process, and title it Go Amidship (or something to that extent). Add the following code to it: Wait 0.1 seconds Fork: Airship Riding Enter Password (Menu only, wait until key is hit): [001: Airship Keystroke] Fork: [001: Airship Keystroke] - Set, 5 Memorize Location: [002, 003, 004] Set Screen Tone: [000, 000, 000, 100], 0.3 seconds (wait) Teleport: (For this, make a fake map with all airship-landable terrain, and set the BGM to the airship's theme; make the airship land around the middle) Wait 0.4 seconds Move Event: Hero, left Ride Vehicle Wait 0.6 seconds Teleport: (where you want them on your airship, probably in front of the controls) Set Screen Tone: [100, 100, 100, 100], 0.3 seconds (wait) <> END Case <> END Case <> Just use the second take-off code in the previous airship event above (where you can summon the airship) on the controls for the controls. There you have it, an airship that works like an FF airship (if somewhat slower). KNOWN BUGS: If the player calls the menu while taking off, landing, or about 0.5 seconds after having landed, the game will automatically teleport them back to the deck of the airship. No known solution as of yet. =-=-=-=-=-=-=-=-= DAY/NIGHT EFFECTS =-=-=-=-=-=-=-=-= One of the most interesting effects in RPG's has always been the day/night system (mainly because so many RPG's don't have a day/night system). Of course, it's hard to make a realistic one (where it's not always day or night everywhere on the planet), but that's an issue for a later date. There are two ways to make a day/night cycler work. The first is fairly easy, and requires only a bit of work to pull off. METHOD 1: The Timer Method REQUIREMENTS: 2 Switches (Daytime, Not Afternoon/Dawn) OPTIONAL: 3 Variables (Current day, day of week, days passed) To have this work, make a parallel process on the map that you want a day/night cycler on (probably, you won't want one in every town, especially if you want special day/night events for them). Make 2 pages, one that activates only when the timer is at 10 seconds and the when switch Not Afternoon/Dawn is on. Make the first page activate when the timer is at 1 second. On the first page, code the following: Wait 0.1 seconds Fork: [001: Daytime] ON Set Set screen tone [040, 040, 080, 050], 1.0 seconds (no wait) Timer Operation: Set to 30 seconds, don't show Change switch: [001: Daytime] - OFF Set Change switch: [002: Not Afternoon/Dawn] - OFF Set <> ELSE Case Set screen tone [100, 100, 100, 100], 1.0 seconds (no wait) Timer Operation: Set to 30 seconds, don't show Change switch: [001: Daytime] - ON Set Change switch: [002: Not Afternoon/Dawn] - OFF Set Change variable: [001: Day], + 1 <> END Case <> On the second page (which should also be parallel), add the following code: Wait 0.1 seconds Fork: [001: Daytime] ON Set Set screen tone [080, 080, 020, 020], 4.0 seconds (no wait) Change switch: [002: Not Afternoon/Dawn] - ON Set <> ELSE Case Set screen tone [060, 060, 100, 020], 4.0 seconds (no wait) Change switch: [002: Not Afternoon/Dawn] - ON Set <> END Case <> Note that when your RPG starts, you'll want to add code to set the timer to 30 seconds (or whatever suits you; feel free to modify this to suit your needs). METHOD 2: The Variable Method This method is not only cleaner, but also much more convenient. It works as follows... REQUIREMENTS: 1 Variable (Time Flow) 2 Switches (Outside, Nighttime) OPTIONAL: 2 extra Variables (day of week, total days passed) or 3 extra Variables (day, month, year) To make this work, make a common event, Parallel Process, appearance switch Outside. Then, code as follows... Wait 1.0s. Variable Ch:[0010:Time Flow]+, 1 FORK Optn:Varbl[0010:Time Flow]-30 Set Screen Tone:[R050,G050,B060,S020),1.0sec Change Switch:[0002: Nighttime]-ON Set END Case FORK Optn:Varbl[0010:Time Flow]-60 Set Screen Tone:[R100,G100,B100,S100),1.0sec Change Switch:[0002: Nighttime]-OFF Set Variable Ch:[0010:Time Flow] Set, 0 END Case Yep, that's it. You'll have to add the code to turn off Outside when the player enters towns or dungeons, and to turn it back on when they exit towns and dungeons, but it's not too hard to get it to work. EXTENSIONS: Add this code to extend the effects of the variable time flow system. FORK Optn:Varbl[0010:Time Flow]-15 Set Screen Tone:[R080,G080,B020,S010),1.0sec END Case FORK Optn:Varbl[0010:Time Flow]-45 Set Screen Tone:[R060,G060,B100,S020),1.0sec END Case This will add the effect of afternoon and early morning to the game. You may also want to add this in the second fork condition listed above. FORK Optn:Varbl[0011:Day of Week]-6 Variable Ch:[0011:Day of Week] Set, -1 END Case Variable Ch:[0011:Day of Week]+, 1 Variable Ch:[0012:Days Passed]+, 1 These will add the flow of weeks (you can have as many days in your week as you want, just set 6 to whatever number you want minus 1), as well as a tracking of how many days have passed since the player started playing (game-days, that is). You can code another event that allows the player to check the current day/time of day, or if you want, you can simply add some event somewhere in-game where the player can check the day of the week. You could even possibly code events that only occur on certain days, during certain times of the day. FURTHER EXTENSIONS: This code, when used to replace the above extension, allows you to track the passage of days/months/years. FORK Optn:Varbl[0011:Day]-30 Variable Ch:[0011:Day] Set, 1 Variable Ch:[0012:Month]+, 1 END Case FORK Optn:Varbl[0012:Month]-12 Variable Ch:[0012:Month] Set, 1 Variable Ch:[0013:Year]+, 1 END Case Using this code, you can make a realistic flow of time. See below for some useful code to make weather effects. WEATHER EFFECTS These are add-ons to the tine cycler functions, and should be added at some point in the code that suits you. Variable Ch:[0014:Weather Randomizer]Set, Randm(1*100) FORK Optn:Varbl[0014:Weather Randomizer]-50abov Call Weather Effect: Ra, Me ELSE Case Call Weather Effect: None END Case This will randomly generate rain 50% of the time. You can use this in conjunction with the day/month/year code to make weather patterns depending on what time of the year it is (via many, many more fork conditions). Experiment, and have fun making weather patterns. =-=-=-=-=-=-=-=-=-=-=-=-= DESIGNING A BATTLE ARENA =-=-=-=-=-=-=-=-=-=-=-=-= These things are tricky to code. I'll cover this later. =-=-=-=-=-=-=-=-=-= DESIGNING A CASINO =-=-=-=-=-=-=-=-=-= I've figured out how to make quite a few casino games with RM2K (seeing as most casino games are simply games of numbers), most notably Roulette and Blackjack. MAKING ROULETTE: REQUIREMENTS: 2 Variables (Player Guess, Spinner Value) This is so easy, it's almost silly. Make your roulette manager, and have the player input a value between, say, 0 and 99 (a reasonable challenge, odds of winning 1 in 100, but you could make them 1 in 1000, or even 1 in 10000, if you happen to be sadistic...), and have it be stored in a variable (Player Guess, in this case). Then, have the second variable generate a random number between 0 and 99 (or higher, if you were sadistic, or want to be excessively sadistic). Then, compare the two numbers, and if the player has somehow managed to get the exact same value, then I advise you reward them (lest you want them to seek you out and stuff your head with garlic and stab you with silver weapons). Ah, ahem! Anyway, that's how you do it. Any dialogue/prizes/etc. you wish to put in are up to you. MAKING BLACKJACK: REQUIREMENTS: 2 Variables (Player's Hand, Dealer's Hand) Blackjack is probably the world's easiest card game to simulate digitally. As always, the goal of blackjack is to get as close to 21 as you can without going over. And the dealer, to prevent itself from over-dealing, should be made to be cautious, to a certain extent, as well. To start, have both the player and dealer's hands have added to them a random value between 1 and 10, twice. Then comes the semi-messy bit, the dealer "AI". Have the dealer not draw if his score is 17 or higher (to prevent the dealer from shooting himself in the foot too much, of course). Give the player the option to draw or hold, and should the player choose to hold, and the dealer does not draw (check this by seeing if the dealer's score is at/above 17), then you can gague the player/dealer scores, and reward or taunt the player accordingly. SLOT MACHINE: Not done with this part, not going to write it yet, so bleh. :P =-=-=-=-=-=-=-=-=-=-=-=-= THE VARIABLE-BASED PARTY =-=-=-=-=-=-=-=-=-=-=-=-= This tool, while complicated, makes controlling and managing parties larger than 4 people not only easier, but far more powerful. The first thing you need to do is define 5 variables, and one switch for each party member. Name the first 4 variables "Party Member #x", where x is obviously the party member number. Name the 5th variable "Party Size". Now, call the switches "(name) in Party", where (name) is the character from your party list's name. As you have no doubt noticed, they all have an index number. This is critical for code that uses the variable-based party system. This should give you all of the basics required in order to take advantage of the following code. =-=-=-=-=-=-=-=-=-=-=-=-= CHANGING BETWEEN MEMBERS =-=-=-=-=-=-=-=-=-=-=-=-= Now, you'll want to build an area (probably an airship deck or somesuch) for your party to hang out on (or in) while they're not in the party. Make an event for each party member, that only appears when their switch is on, and add a second page which only appears when they are literally in the party. On the first page, set up the graphic to be that of the character you want to have in that spot. Leave page 2 blank. Now, on the first page, add something like the following: Variable Ch:[005:Party Size]Set, Size of Party Play BGM: (character's theme, this is optional) Messg:\N[x](x=party member #) "(add some sort of dialogue here)" Messg:Add \N[x] to your party? Show Choice: Yes/No :[Yes] Case FORK Optn:Varbl[005:Party Size]-4 Messg:Sorry, your party is too big! <> ELSE Case Change Hero's Party:(hero) ->Add Variable Ch:[005:Party Count]Set, Size of Party FORK Optn:Varbl[005:Party Size]-2 Variable Ch:[002:Party Member #2]Set, x <> END Case FORK Optn:Varbl[005:Party Size]-3 Variable Ch:[002:Party Member #3]Set, x <> END Case FORK Optn:Varbl[005:Party Size]-4 Variable Ch:[002:Party Member #4]Set, x <> END Case <> END Case <> :[No] Case <> :END Case <> Just replace x with the party member's index number throughout, and you now have a variable party member! Now, this means that you'll need a "party manager", so add a character for the job. For his one page of code: Messg:Steven (or whatever you name him/her) "Care to change to a different party?" Show Choice: Yes/No :[Yes] Case Erase Screen:Fade-Out (for smooth transition) Change Hero's Party: (hero) -> Remv (Repeat the above for all characters you want to remove from the party) Variable Ch:[005:Party Size]Set, Size of Party Variable Ch:[002:Party Member #2]Set, 0 Variable Ch:[002:Party Member #3]Set, 0 Variable Ch:[002:Party Member #4]Set, 0 Show Screen:Fade-In <> :[No] Case <> :END Case <> With this system, however, you'll always have the same hero character. To have a variable leader, you'll have to add some more code which asks the player to select a new leader (store a value according to their choice into Party Member #1), and set it up to add a party member by that variable's number. This code should be placed between the Erase Screen and Show Screen code. I'll explain in more detail later. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= VARIABLE PARTY MEMBERS IN CUTSCENES =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Cutscenes can really make a game look neat, especially when you have characters appear to "come out" of the hero to talk or do something. Here's a neat trick to make the right party member appear! To make it work, you'll need three new switches, though. Make a new event, and call it something like "Party Member #2". On the first page, set the appearance requirements to a new switch (PM#2 Not Hidden), and set it so the variable Party Member #2 has to be above 2 (or 1, if you have a variable leader system). Now, set the graphics to the second (or first) person in your character index. Add a new page, and continue on through until you have all party members covered, each with 1 higher setting for Party Member #2 (ie. the 3rd character would be 3, the 4th 4, and so on). Now, copy it, and paste it twice. Change everything so that it will work for party members 3 and 4 for each seperate one (time-consuming, but self-explainatory; just change PM#2 Not Hidden to new switches PM#3 and PM#4 Not Hidden, and the Party Member #2 to Party Member #3 and 4). Now, these events only need to be in "rooms" where an event that requires the party to "fan out" exists. Just add code in that event to locate all of the Party Member events to exist over the top of the hero (can be tricky, but it's do-able), and have them all appear and step out in the direction you so desire. There you have it, a variable party that shows up correctly in cutscenes! =-=-=-=-=-=-=-=-=-=-=-=-=-= OTHER USES FOR THIS SYSTEM =-=-=-=-=-=-=-=-=-=-=-=-=-= This system can obviously be used for many more things (including making the battle arena mentioned above possible). Experiment, and find out the power of variables used to store character data like this. You can really do a lot with it, if you set your mind to it. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= MULTIPLE WORLD MAPS: A HOW-TO GUIDE =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= This is actually more useful than most RPG makers may realize. Sometimes, the map needs to change, but this means making a new copy of the map with the change intact. That can be a bit of a hassle, since the teleport command is a one-map-only sort of thing. The method to do this is a bit more complicated than the standard "click location to set teleport destination" method, but it's the only way to pull off multiple world maps. The key to this is (like many things) Common Events. Make a Call type Common Event, and call it something like Set World Map. The code for it is fairly simple: make the event set a variable to a number that coincides with the current world map's MapID number. You'll have to keep track of what world map you're working with in-game by changing a different variable to reflect this each time the world map changes. =-=-=-=-=-=-=-=-=-= EVENING OUT LEVELS =-=-=-=-=-=-=-=-=-= In many recent (and even some older) RPG's with many party members, there has been a system to even out the overall level of your party according to the average level (a good example of this is FF6 or Xenogears). The feature is woefully non-existent in RM2K (given that you can have such huge parties, this can be a serious disadvantage). This code will allow you to raise party member levels to a higher level if they are too low (such as a character that is never used, and thus always stays at level 1 otherwise, totally useless forever). REQUIRED TO WORK: 2 Variables 1 Common Event WHAT IT DOES: * Raises the level of party members whose levels are below the party's average level Set up a new common event, type Call, and call it Even out Levels. Add the following code to it: Variable Ch:[0010:Average Party Level]Set, (Character 1) Level Variable Ch:[0010:Average Party Level]+, (Character 2) Level Variable Ch:[0010:Average Party Level]+, (Character 3) Level (do this for every party member) . . . Variable Ch:[0010:Average Party Level]/, (total # of char.'s) After this, for each party member, write the following code: Variable Ch:[0011:New Level]Set, Var.[0010]val. Variable Ch:[0011:New Level]-, (Character) Level FORK Optn:Varbl[0011:New Level]-0 more than Change Level: (Character) Level V[0011]Incr. END Case And that's all there is to it! Just call this event whenever you want to even out the party's levels a bit. I suggest you do this after major events, but you can add code for it to activate during every battle, if you're really bored enough to. NOTE: I don't reccomend trying to average out experience with this code idea. Experience can get a LOT higher than levels and you may end up with a cut-off point in experience given through this system. KNOWN BUGS: There's really only one: by raising lower-leveled party members up in levels, you raise the average level, too. So, if the player can run this event whenever they wish, they can keep raising those low-leveled party member's levels up to about the same level as your best party members. Maybe you want that, I don't know, but be aware that this code allows that to happen. I have reasoned out a method to prevent this, but have not tested it yet. By the next revision, you may find something about it here. =-=-=-=-=-=-= MISC. EVENTS =-=-=-=-=-=-= I've got so frickin' many to put in here... Later, later. Patience, young Padewan! =-=-=-=-=-= CONCLUSION =-=-=-=-=-= All said and done, I've learned more about RM2K in a span of half a year than I've learned about any other program in the same time period. A lot of this guide to advanced events was written in late 2000, and bits were thrown in up to April of 2001, when I finished off what I felt the ambition to finish off in one brief flurry. I hope this thing is understandable by somebody, because I sure as hell don't know if it is or not. Copyright 2001 Sky Render Translations