‡ HOW TO MAKE A TRAINER --------------------- This article might be the beginnig of a complete trainig instruction-course, which will be written by STRANGER / ENERGY and published here in the following issues of SUICID! You should have some knowledge in Assembler (No need of perfection!) already and you should be able to work with an assembler monitor (If not, get the DOCS for it somewhere, this really shouldn't be that of a problem!) and it would be good if you are a little bit in coding, the more the better it is! And first let me say something: If you ever need a program for that or Docs or if you have any questions or if you want a game trained, then contact me! I'll try to answer all letters I get and I also try to help you with your problem(s). Write to: ENERGY, POSTLAGERND, 8160 WEIZ, AUSTRIA. How to make a trainer? What a stupid question, some of you might think. "I press my Cartridge-Freezer Button and use the Trainer-Search-Command to find unlimited lives!" this people would say. Well, that's true, but what happens if the Cartridge can't find anything or if you would like to have a trainer-menu, where you can choose, whether you prefer 'Unlimited Lives' or not ?!?! What happens, if you want some more functions like 'Unlimited Time', 'Unlimited Energy', 'No Collision', 'Starting Level', 'Unlimited Extra Weapons' and 'Keyfunctions' (for Level-Jump, Extra Weapons,...) all put together in a nice menu before the game starts??? Well, of course some of the above named functions also can be find using a cartridge, but this requests some knowledge already. As you might guess, it's impossible to explain the trainer work for every game here, but this (maybe beginnig of a serie) article should give you some basic facts you'll have to know, if you are planning to do trainers with menu. ***************************************************************************** Now let's start the DOCS? with something, that might seem unimportant to you but what can be GREAT help if you want to understand the game (or better it's assembler code!) from it's beginning. If you just want to have your few options quick installed, you probably won't need the following paragraph. ----------------------------------------------------------------------------- Well, if we turn on the computer and we insert the Game-disc we shouldn't just wait until the game starts and we can begin to play. We really should watch everything (!!!) important, that can be seen or heard. This means that we shall take a careful look, what happens when we insert the disc after turning on the computer. We should bear every 'event' in our mind, until we are in the assembler monitor afterwards, or we could write some short notes down to paper (you might laugh at that, but it's really helpful!) of the things that happen between inserting the disc and playing the game. Some Examples of this kind of notes shall be written here to explain it in detail: A) 1. I THE INSERT DISC 2. BLACK SCREEN, FOR 3 SECONDS 3. "LOADING - PLEASE WAIT" WRITTEN ON SCREEN 4. MUSIC STARTS PLAYING 5. 4 SECONDS TIME OF LOADING AGAIN 6. TITLE PIC APPEARS 7. PROGRAM WAITING FOR MOUSE BUTTON TO CONTINUE 8. BLACK SCREEN, "PLEASE WAIT" ON SCREEN 9. 10 SECONDS OF LOADING 10. HIGH SCORES ON SCREEN 11. WAITING FOR 'FIRE-BUTTON' TO START PLAYING 12. GAME STARTS, BEGINNING OF FIRST LEVEL B) 1. I INSERT THE DISC 2. WHITE SCREEN, LOADING SOMETHING 3. AFTER 4 SECONDS THERE COMES A INTRO 4. EXIT=LMB, NOW LOADING AGAIN 5. 20 SECONDS LATER A TITLE ANIMATION BEGINS 6. AFTER THAT LOADING AGAIN, ANIMATION CONTINUES 7. LOADING AGAIN, ANIMATION AGAIN (GOES TO 7. FOR THREE MORE TIMES) 8. NOW MESSAGE "CHANGE DISC" ON SCREEN 9. CHANGING DISC, LEFT MOUSE REQUIRED 10. AFTER 5 SECONDS OF LOADING TITLE PIC APPEARS 11. PROGRAMM WAITING FOR MOUSE BUTTON AGAIN 12. ENTERING OPTIONS MENU (1,2 PLAYER - MOUSE,JOY - SOUND,MUSIC) 13. EXITING MENU AND LOADING AGAIN 14. GAME BEGINS IN THE 1. LEVEL I guess now you understand what I mean with notes. Here are just two examples but, I think you got the message of it. You won't believe maybe, but, I say it again, if you want to disassemble to game from it's beginning (and this is important when you want to get experienced in that stuff!) it is a great help. In fact, if you do it like that, there should be much much more points than in example A) and B), because you should write down (or bear in mind) all things like : (Probably not all of them, but the ones that seem important to you. The more, the better it is!) - SCREEN GOES BLACK, WHITE, BLUE OR WHATEVER - MUSIC ON/OFF - GRAPHIC FADING ONTO THE SCREEN (APPEAR)/GRAPHIC FADING AWAY (DISAPPEAR) - LOADING (MAYBE YOU CAN COUNT THE AMOUNT OF LOADED TRACKS OR THE LOAD-TIME!) - WAITING FOR LEFT/RIGHT MOUSE-BUTTON OR FOR JOYSTICK-BUTTON - DISC MUST BE CHANGED - PROGRAM WANTS TO TYPE IN NAME OF THE PLAYER - ............... ----------------------------------------------------------------------------- Now we got that and the next thing is to test ALL keys during game if they have any effect! If none of them has, ok. If there are some, then write down f.e. P - PAUSE, Q - QUIT LIFE, ESC - GO TO MENU, SPACE - THROW BOMB, ....... This is also very important for keyfunctions, for inbuilt cheats, and it also helps to understand the aim of the gaim', if we don't know it! By the way, this is the next necessary we need to know : What is the aim in that game? We should be able to play the game a little bit and to understand most of it! If we have all this, the 'EVENT TABLE' or the 'EVENT LIST' (remember A. and B. - the notes), the List of the used keys and the aim of the game we have already done some important work for the complete trainer-project. ***************************************************************************** Now let's start the second big part of our work: OK, first thing is, that there are only 2 possibilities a game uses to start itself. It's always easy to find out, which way of booting is used in a game. 1) First possibility : It has a DOS-Bootblock ( or a Utility Boot like the one from N.O.M.A.D., XCOPY, or something like that) and loads some files and the main program using the 'STARTUP-SEQUENCE' in Drawer 'S'. If so, just print the Startup-sequence on screen (Use Type) or load it with an text-editor or look at it somehow else, no matter how you do it! (You should really manage that, if not please learn it somewhere else and continue on that article when you know it!) Now you can see, which files are loaded and executed from DOS. You should note it and load any assembler monitor then (e.g. Cmon, Amon, Sim, Asmone or Mseka), but you should know how to use it of course! 2) The only other way to start a game is using the Bootblock: The so called Boot-program is executed ALWAYS (Also at the above written example-but it has no important effect there! It returns to the CLI!). You can check the 'version' (1 or 2) of a game like this: If you insert a disc and after a while you watch a lovely(?) CLI-Window then it's the first one! If you insert the disc and the drive loads something immediately (Title Pic, Intro, Music,...) then it's version two! ------------------------------------------------------------------------------ Ok, now we know what kind of booting the game uses and can load any assembler monitor now. In this article I will explain how to work with 'DOS-GAMES (Version 1)' and in the next one (should be in SUICID #4) I will explain what to do with non-DOS GAMES (Version 2), the ones that use only the Bootblock for loading or booting! Well, in a standard Amiga Game (maybe cracked!) the s/startup-sequence file could f.e. look like one of the following: TYPE 'CRACKERGROUP.TEXT' INTRO MAIN.PRG or ADD21K LOADER or BORDER -OFF FASTMEM -OFF TYPE XXXX INTRO GAMENAME or : : or can be a mixture of the above written commands or something else, but in principle every startup-sequence looks somehow like this. As we want to train the game we load the Main Program (e.g. here 'MAIN.PRG' or 'GAMENAME') or the loader (e.g. here 'LOADER') into the memory using our monitor (From now on I will use the word "MON" for assembler monitor!). In general we always load the name last written in the startup-sequence. ----------------------------------------------------------------------------- A short note for Workbench games: The startup-sequence might look like this: TYPE 'CRACKERGROUP.TEXT' INTRO ADD21K LOADWB ENDCLI We said, the last command (here ENDCLI) is the one we load. But here it is a command to close the CLI, after the Workbench is loaded. So, if we have a 'Workbench-Game' we go to the WB and take a look at the available ICONS on the Game-Disk. There should be something like 'GAMENAME' or something else to start the game. Well, easily the title of that Icon is the Filename on disc, so we load it into our mon (assembler monitor, like above!) and we have now reached the same level as we had already, when the game didn't use WB but normal CLI. ------------------------------------------------------------------------------ Before I continue, you should know that all the things written and explained here can never be used for ALL GAMES!!!! This would be impossible, because no game equals another game!!! (Except the Booting: 1. Via DOS or 2. only via Bootblock, remember?) Everything here is just for the most games (at least the ones I saw+trained) and of course NOT for all games on Amiga! ****************************************************************************** Ok, now we have the program (Loader or the Main Program) in memory and can now start to disassemble it. You should be able to understand most of commands written there. Now I'll have to split into two groups again: First, if we have loaded the LOADER (or some Intro that loads the main code afterwards) or if we have loaded the MAIN PROGRAM of the game directly already. How can I know? you might think now. Well, there are some things that might give you the right information which program you're looking at: a) Watch your EVENT-LIST, you made first of all!!!! What is the program doing, what happens? Is there just a black screen (or the DOS screen) and the drive is loading or is there maybe a title- picture or/and -tune and the drive is loading then the program should be a LOADER program, except for one reason: b) The size of the program. If you have just some few (Kilo-)bytes of lenght, you will probably have that LOADER. But if the program is really big (at least it should have about $8000=32768 Bytes, depends on the kind of game. If you have a stupid Pac-Man game it is shorter than a complex strategic-simulation!) you're probably watching the main-program already. c) The contents of a File: If possible, watch the whole file (maybe as HEX Bytes, as ASCII Text, as Bitplane,....) and try to infer what it is. If you f.e. see some text, that is printed on screen while loading it will be the LOADER; if you see text, that is printed during game (like "PRESS FIRE TO START", "CHANGE DISC", "GAME OVER", "xx LIVES LEFT",....) then the file is the main program (That doesn't exclude that there also might be a text like "Loading, Please Wait" because also main-programs can load some data before the game-begins). In general, you just compare the lenght and the contents of the program with your EVENT LIST and then you should get it out, whether you have the main- or the loader program in front of you. The reason, why we want to have the main program is the fact, that in this program all evil things like Subtract one Life, loose Energy, loose weapons and ammo, collision with enemies,... are made; which we want to remove (If we are still planning to train the game!) ------------------------------------------------------------------------------ When we found out, which of the two (Main or loader) we can continue. I'll explain now both possibilities, 1st the one with loader and 2nd the one, where we have the main-program in memory already. #1: We have the Loader. Disassemble the program, it shouldn't be too heavy to understand it all, because the program is short and we have our EVENT LIST!!! The only thing a loader does, are f.e. turning on some graphics or music, clear some memory, copy itself to a better(!) place in memory (We'll talk about that in the upcoming articles!) and and and..... Somewhen it will load something (also the main program!) and start it afterwards. You can see that usually at the last command of the loader program, which should be (for 99%) a JMP $xxxx or JMP $xxxxxxxx or JMP (Ax) command. You should be able to find where the main-program is loaded, use your EVENT LIST and compare it with the things that the code of the loader does (Take a look at the size or filenames or load-adress as a little support!). Graphics + Music are always loaded into CHIPMEM, Code (= Mainprogram) can also be loaded into FASTMEM ! We just load the main program into memory using the same load-routine as the load-program (Can be 'READ' from dos.library, 'LOADSEG', or a own hardware- register-using routine), but we must avoid that it is started! F.E. we could start the loader (Use GO or JUMP), but then we have to remove the JMP Command that starts the Main-program and set a breakpoint there (Most MON's have that function!). If the loader loads with READ or LOADSEG, we can do the same with the MON. 'READ' means, that the File (Ofcourse I'm only talking about the main program, not about any title-pictures that can also be loaded!) is only data or image or plain, 'LOADSEG' means that the file is an object or executable file. Having done this (loaded the main-program) and being still in the monitor we can say that we have reached the same level as we would have had when the main program itself would have been started from the startup-sequence. #2: We have the main program. (Again) we disassemble this program and now we might find a routine, that is some few bytes long and afterwards there is only stupid (?) data, no graphics, no text, no assembler code,.... We might have found a DECRUNCH routine then, which is also often seen here! ----------------------------------------------------------------------------- If we have managed all this, the training itself may begin. This means, the search for options, which is quite comfortable with a cartridge, may begin. I won't tell you how to do that here, because first we have to explain what the people with the "Bootblock-starting-games" (remember that? Yes? - Great! No? - Start reading the whole article again!) have to do, that they can start to disassemble their main-program and train it then. As I'm planning to write that in the second part of "HOW_TO_MAKE_A TRAINER", the first article stops here at the 264. textline! Next time I'll write about the Bootblock Games, and then about the essential, real training stuff, that shouldn't be done before all this I wrote here!!! (Only if you don't want to use a menu as I said already!) Ok, I hope that the article is somehow helpful and that the readers, who didn't know everything from it, know it now. Of course some professional trainer makers or good coders won't need any of that text here, but for the ones, who tried to learn something from it: I really hope my English is OK and also the whole writing and the style isn't too bad. I spent some time for this article and I would love, if you would tell me your opinion about it. Please write or call to the team members of SUICID and bring some new ideas, critics or improvements for this one. Also tell us, what you liked and what you didn't like!!! For all this and anything else write to the current SUICIDal addresses!! C.U next time! STRANGER / ENERGY …