--- /dev/null
+ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+ ³ V2 Console Command Summary ³\r
+ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+Current as of 5.9.99\r
+\r
+Using the Command Console\r
+ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄ ÄÄÄÄ ÄÄ Ä\r
+The command console is summoned by the ~ (tilde) key. Pressing the same key\r
+a second time hide the console as well. If ~ does not bring the console down,\r
+the game designer has disabled it via the AllowConsole(0); call.\r
+\r
+You basically use it by just typing commands into it. The actual commands will\r
+be detailed below. However, in addition to typing commands, it also supports\r
+the following features:\r
+\r
+ The UP/DOWN keys are a 10-entry Last Command Memory.\r
+ The PGUP/PGDN keys allow you to use the scrollback features.\r
+ TAB is command-name completion.\r
+\r
+Console Command Reference\r
+ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄ ÄÄÄÄ ÄÄ Ä\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ ACTIVEENTS ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: ACTIVEENTS ³\r
+³ Description: Lists the index numbers of all active (onscreen) ³\r
+³ entities. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ BROWSETILES ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: BROWSETILES ³\r
+³ Description: Displays the tileset currently loaded. Inside the browse ³\r
+³ interface, the up/down keys scroll through the tiles if there are ³\r
+³ more than fit on the screen. The A key toggles tile animation, Q ³\r
+³ exits the browse interface. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ CAMERATRACKING ³ Parameters: [on/off] ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: CAMERATRACKING [0/1] ³\r
+³ Description: If CAMERATRACKING is executed with no parameters, the ³\r
+³ status (0 or 1) will be returned. If 0 or 1 is specified as the 1st ³\r
+³ parameter, that will set a new value for cameratracking. This ³\r
+³ variable controls whether or not the camera follows the player ³\r
+³ around at all times. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ CD_OPEN ³ Parameters: None ³\r
+³ CD_CLOSE ³ Usage: CD_OPEN ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÙ Usage: CD_CLOSE ³\r
+³ Description: Opens or closes the CD tray door, respectively. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ CD_PLAY ³ Usage: CD_PLAY <tracknum> ³\r
+³ CD_STOP ³ Usage: CD_STOP ³\r
+ÃÄÄÄÄÄÄÄÄÄÙ Description: CD_PLAY begins CD audio playback at the ³\r
+³ specified track number. CD_STOP stops all CD audio playback. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ CONSOLEBG ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÙ Usage: CONSOLEBG <imagename> ³\r
+³ Description: Sets the specified image as the console background. The ³\r
+³ image can be in PCX, GIF or BMP format, but must be 320x240. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ CPU_USAGE ³ Parameters: [on/off] ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÙ Usage: CPU_USAGE [0/1] ³\r
+³ Description: Turns on or off the CPU usage monitor. When it's on, it ³\r
+³ displays an FPS report and shows CPU usage in the categories of ³\r
+³ rendering, pageflipping, and game ai (etc). ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ CURPOS ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÙ Usage: CURPOS ³\r
+³ Description: Returns the current coordinates of the player. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ ENITITY ³ Parameters: [index] ³\r
+ÃÄÄÄÄÄÄÄÄÄÙ Usage: ENTITY [ent num] ³\r
+³ Description: Returns the current coordinates of the given entity. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ ENITITYSTAT ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: ENTITYSTAT ³\r
+³ Description: Gives a report on the current entity stats. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ EXIT ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÙ Usage: EXIT ³\r
+³ Description: Exits to DOS. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ LISTCMDS ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÙ Usage: LISTCMDS ³\r
+³ Description: Lists all registered console commands. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ LISTMOUNTS ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: LISTMOUNTS ³\r
+³ Description: Lists all currently mounted packfiles. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ MAP ³ Parameters: [MAP name] ³\r
+ÃÄÄÄÄÄÙ Usage: MAP [MAP name] ³\r
+³ Description: MAP with no parameters gives a statistics report about ³\r
+³ the currently loaded MAP. Otherwise, it will attempt to map switch ³\r
+³ to the map file specified. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ MOUNT ³ Parameters: [Packfile] ³\r
+ÃÄÄÄÄÄÄÄÙ Usage: MOUNT [packfile name] ³\r
+³ Description: MOUNT will mount the specified packfile and add it to ³\r
+³ VERGE's packfile search list. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ PACKINFO ³ Parameters: [Packindex] ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÙ Usage: PACKINFO [packindex] ³\r
+³ Description: Packinfo returns a list of files and in a given packfile.³\r
+³ To view the first packfile mounted, you would type "packinfo 0". ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ PHANTOM ³ Parameters: [On/Off] ³\r
+ÃÄÄÄÄÄÄÄÄÄÙ Usage: PHANTOM [0/1] ³\r
+³ Description: Turns on or off Phantom mode (no clipping) ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ PLAYER ³ Parameters: [Entity index] ³\r
+ÃÄÄÄÄÄÄÄÄÙ Usage: PLAYER [idx] ³\r
+³ Description: Sets the player to the given entity number. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ PLAYERSPEED ³ Parameters: [speed] ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: PLAYERSPEED [1-7] ³\r
+³ Description: Sets the player speed ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ SHOWOBS ³ Parameters: [on/off] ³\r
+ÃÄÄÄÄÄÄÄÄÄÙ Usage: SHOWOBS [0/1] ³\r
+³ Description: If this is turned on, grid will be drawn on top of the ³\r
+³ render process denoting where the obstruction are on the map. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ SHOWZONES ³ Parameters: [on/off] ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÙ Usage: SHOWZONES [0/1] ³\r
+³ Description: If this is turned on, grid will be drawn on top of the ³\r
+³ render process denoting where the zones are on the map, color coded. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ SPEEDDEMON ³ Parameters: None ³\r
+ÃÄÄÄÄÄÄÄÄÄÄÄÄÙ Usage: SPEEDDEMON ³\r
+³ Description: This command will enable the "2x speed" cheat to allow ³\r
+³ the player to move twice his normal velocity when the CTRL key is ³\r
+³ held down. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ VER ³ Parameters: None ³\r
+ÃÄÄÄÄÄÙ Usage: VER ³\r
+³ Description: Displays a V2 version report and build info. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+³ WARP ³ Parameters: [tile-x, tile-y] ³\r
+ÃÄÄÄÄÄÄÙ Usage: WARP [x] [y] ³\r
+³ Description: Warps the player to the specified location. ³\r
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+Special Commands: RV/SV\r
+ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄ ÄÄÄÄ ÄÄ Ä\r
+These two additional console commands are extremely useful in the development\r
+and debugging of your Verge game, especially with advanced VC. These commands\r
+stand for ReadVariable and SetVariable, respectively; they allow you to access\r
+the value of any user declared (system.vc global) variable (ints only, not\r
+strings). You can access both single ints and array components.\r
+\r
+For example, to read the value of a variable named "gold" you'd simply do:\r
+RV GOLD\r
+and the value of the variable would be printed out. To set the value of "gold"\r
+to a really big value, you'd type:\r
+SV GOLD 1500000\r
+\r
+To use array variables, you simply add another parameter which is the array\r
+offset, ie:\r
+RV FLAGS 105\r
+Would return the value of flags[105]. Likewise, to set the value of flags[20]\r
+to 0, you'd type:\r
+SV FLAGS 20 0\r
+\r
+Have an idea for a console command you'd like to see implemented? Mail me\r
+at aen@verge-rpg.com and We'll consider your request.\r
+\r
+- Verge2 staff\r
--- /dev/null
+vidmode 0 \r
+pad 1 \r
+scrollmode 1 \r
+mouse_scroll 1 \r
+black 1 \r
+white 31 \r
+winbg 23 \r
+shadow 13 \r
+darkred 44 \r
+titlebg 125 \r
+th 1 \r
+mh 1 \r
+md_device 0 \r
+amxofs 60 \r
+amyofs 60 \r
+mmxofs 60 \r
+mmyofs 50 \r
+cnxofs 114 \r
+cnyofs 70 \r
+lmxofs 80 \r
+lmyofs 50 \r
+lvxofs 80 \r
+lvyofs 50 \r
+mpxofs 60 \r
+mpyofs 60 \r
+vaxofs 20 \r
+vayofs 20 \r
+zexofs 80 \r
+zeyofs 40 \r
+exofs 70 \r
+eyofs 30 \r
+prxofs 50 \r
+pryofs 60 \r
+rsxofs 20 \r
+rsyofs 20 \r
+vced edit \r
+difficulty 4 \r
--- /dev/null
+-------------------------\r
+MapEd 2.0 Release Edition\r
+-------------------------\r
+\r
+I) Intro to Maped 2.0\r
+II) Running Maped 2.0\r
+ A) Moving within Maped\r
+ B) Selection modes\r
+ i) Layer Modes\r
+ a) Tile Layers\r
+ *) TileEd\r
+ b) Special Layers\r
+III) Our friend the Program Menu\r
+ A) Save/Load Functions\r
+ B) Map Properties\r
+ C) Layers\r
+ D) Options \r
+ E) Fun Crap(tm)\r
+ i) MOD Player\r
+ ii) CD Player\r
+ iii) Columns\r
+IV) Miscellaneous\r
+ i) Bug Fixes\r
+\r
+I) Intro to Maped 2.0\r
+---------------------\r
+MapEd 2.0 is essentially the same program as the one users had grown accustomed\r
+to with V1 but with significant enhancement and miscellaneous Fun Crap(tm). \r
+If you are unfamiliar with MapEd, it can be described as the "heart" of VERGE. \r
+Most of elements that will be seen by the player in terms of characters (entities)\r
+and backgrounds (tiles) will be setup within MapEd. \r
+\r
+Some of the most notable features of MapEd 2.0 are the windows-like enhancements;\r
+Dialog boxes can be dragged by their title bars and text boxes can be advanced\r
+with 'Tab'.\r
+\r
+Items added since the beta release are annoted with '***'\r
+\r
+I) Running Maped \r
+----------------\r
+MapEd can be run from the command line simply as 'maped' or with the \r
+specification of a map. (i.e. 'maped vospram1.map')\r
+\r
+MapEd 2.0 can be started without an additional map parameter, unlike its \r
+predecessor, to load a blank map and vsp. This has been stabalized from previous \r
+betas to load the default palette. Once inside the program, use the mouse to scroll \r
+around the map by moving it to the borders of the screen or use the cardinal \r
+direction keys.\r
+\r
+A) Moving within MapEd\r
+ \r
+You can scroll the map a screen at a time by using one of the quick scroll keys:\r
+\r
+Page Up - Up\r
+Page Down - Down\r
+End - Right\r
+Home - Left\r
+\r
+You can summon the mini-map (just what the name implies) by pressing 'M'. \r
+Move the white screen outline to a portion of the map and click to move there \r
+quickly. \r
+Pressing 'Escape' while in the mini-map mode will return to MapEd without moving \r
+the screen.\r
+\r
+B) Selection Modes\r
+\r
+At the bottom of the main MapEd screen is are boxes indicating the current \r
+layers of the map. To the lower right is the information HUD for that layer.\r
+\r
+\r
+i) Layer Modes\r
+\r
+a) Tile Layers \r
+The numbers located in the lower left portion of the main MapEd screen are the \r
+tile layers available. (see the layers section of the menu chapter for instructions \r
+for adding new tile layers)\r
+\r
+Pressing the corresponding keyboard shortcut or clicking on a number shown in these \r
+boxes will toggle that tile layer's visibility and its background will become red to \r
+indicate that it is visible. (When switching to the special layers, all available \r
+tile layers will be shown.) \r
+While you can press a layer's number to make it immediately visable, you must click \r
+on it or press "shift+layer number" in order to hide it.\r
+\r
+When one or more of the tile layers is selected, two tile boxes will appear in the \r
+lower right portion of the screen to indicate the tile assigned to each mouse \r
+button. The left box is assigned to the left mouse button while the right is assigned \r
+to the right mouse button. (I hope your head isn't hurting, yet) \r
+\r
+Pressing 'Ctrl' while in the tile layer editing mode, will cause the \r
+'Maped 2.0 Tile Selector' to pop-up. Basically the same as ME1, simply press up or \r
+down or mouse scroll through the VSP and click on a tile to select with the mouse \r
+button you wish to assign it to.\r
+\r
+While in tile layer editing mode, A/Z will change the tile assigned to the left \r
+button and S/X will change the tile assigned tot the right. \r
+The former letter scrolls forward through the VSP while the latter scrolls back.\r
+Also while in tile layer editing mode, clicking on a tile while holding '/' will \r
+assign that tile to the chosen mouse button. (Also, pressing 'H' will toggle tile\r
+highlighting.)\r
+\r
+Back to the Tile Selector, the buttons seen on the panel at the bottom of the \r
+screen are somewhat self explanatory.\r
+\r
+-Add Tiles adds the specified number of blank tiles to the end of the vsp.\r
+\r
+-Animation (can be called with 'V') brings up a dialog box showing an animation \r
+ specified in the vsp. The Up/Down keys change the shown animation, while the \r
+ text boxes across from it alter the shown animation's traits. Start and End \r
+ are the animation's starting and ending tiles (Animations must be tiles in \r
+ sequential order in the vsp.), Delay is the amount of time in milliseconds \r
+ between each frame (100ms = 1 second), and mode is the animation's display \r
+ mode. (0 = Linear(normal); 1 = Reverse; 2 = Random; 3 = Loop Back and Forth)\r
+\r
+-Import PCX/Import VSP are used to pilfer tiles from an existing image or \r
+ tileset respectively. Import PCX is more complicated in that you are prompted\r
+ to choose whether or not the imported image is a tileset or an image. If the \r
+ pcx is set up as a tileset (with 1 pixel padding) then import it as a tileset.\r
+ If appears as a normal image, import it as such.\r
+ ***When selecting tiles to import, those which have already been imported will \r
+ appear with a grey mask. You can still import multiple copies of each tile, but \r
+ the masks will keep track. Pressing 'B' will build a list of imported tiles, \r
+ automatically greying duplicates which already exist in the VSP. 'N' will \r
+ import all non-existing tiles within the image to the VSP, while 'A' imports \r
+ them all, regardless.\r
+\r
+-H/P toggles tile selector highlighting and tile padding respectively. Tile \r
+ padding adds or removes a 1 pixel border in between tiles to make them more\r
+ distinguished.\r
+\r
+-Select/Edit modes determine what happens when you click on a tile. In 'Select \r
+ Mode' the selected tile is assigned to that button as previously mentioned, \r
+ unlike 'Edit Mode' which causes TileEd to be launched and the selected tile to\r
+ be loaded. You can also enter edit mode by pressing 'E' with the cursor over the \r
+ tile to edit.\r
+\r
+While in the Tile Selector with the cursor positioned over a tile you wish to \r
+copy, press 'Ctrl+C' to copy that tile onto the clipboard. If you wish to carbon\r
+copy the tile onto another, position the cursor over the tile you wish to overlay\r
+and press 'Ctrl+S'. If you only want to paste the non-0 color portions of the \r
+tile, press 'Ctrl+T'.\r
+\r
+To delete a tile entirely from the VSP, postion the cursor over it and press \r
+'Ctrl+D'. If you accidently delete an important tile from your VSP by mistake,\r
+you can reload the map it to recover the lost tile. Also, be warned that the tiles\r
+are recognized by number and as such, deleting a single tile will cause the \r
+following tiles to move one number higher. This will seriously screw up your maps,\r
+so be careful. A work around is to delete the tile then insert a blank one in its\r
+place to be used later. \r
+***The Super Delete function, 'ctrl+alt+d' will alter the map information so that \r
+all of the deleted tile's instances on the map will be replaced with the default,\r
+rather than creating a big mess.\r
+\r
+To insert a blank tile into the vsp, position the cursor over the tile\r
+you want to add the blank one before and press 'Ctrl+I'. \r
+***Similar to Super Delete, Super Insert, 'ctrl+alt+i' will insert a blank\r
+tile while reassigning the current tiles to their original artwork.\r
+\r
+***Note*** Do not super delete or insert too quickly, do it slow and\r
+rhythmically... i know it sounds stupid but for some reason, doing it too fast\r
+messes things up.\r
+\r
+X/Y/Z- X and Y will mirror chosen tile upon the pressed key's related axis. 'X' for \r
+instance, will flip the tile left to right, 'Y' will flip it up and down.\r
+'Z' however, will turn the tile 90 degrees clockwise.\r
+\r
+*) TileEd \r
+\r
+TileEd primary method of drawing tiles, and has improved exponetially from ME1.\r
+Most of the manipulation functions are self-explanatory or ported similarly from\r
+ACE, but there are a few new features. Key shortcuts are courtesy of Ric:\r
+\r
+CTRL/S + mouse click - (over edit window) Pick up colour under mouse\r
+SPACEBAR - toggle between draw mode and select mode\r
+CTRL+Z or U - one level undo\r
+CTRL+A - select all\r
+CTRL+U - unselect all\r
+CTRL+C - copy selected area\r
+CTRL+X - cut selected area\r
+CTRL+V - paste\r
+DEL - clears selected area\r
+CTRL+R - reverts the tile to the original (like undo in maped 1)\r
+G - toggles grid on/off\r
+H - toggles hilight on/off\r
+M - toggles mask on/off\r
+I - inverts mask\r
+X - mirrors image\r
+Y - flips image \r
+L/R - Rotates tile 90 degrees anti-clockwise/clockwise\r
+Q/W - Steps through animation (in tile edit mode) if any\r
+A/Z and S/X - changes the left or right drawing colours\r
+PGUP/PGDN - Colour shift up/down\r
+[ and ] - toggle screen resolutions\r
+ALT+X - quits to DOS (Note: This doesn't prompt you to save nor does \r
+ it save automatically at the moment. It just dumps you \r
+ straight to DOS)\r
+\r
+b) Special Layers\r
+The letters adjacent to the tile layers in the lower left portion indicate the \r
+map's special layers as follows:\r
+\r
+O - Obstructions \r
+----------------\r
+Areas the main character and designated entities cannot enter. When editing in \r
+layer mode, you simply left click the area upon which you wish to add an \r
+obstruction or right click to remove it.\r
+\r
+N - Zones\r
+---------\r
+Zones are triggers that link to events in the map's vc code of which there may be \r
+a maximum of 256 per map.\r
+Pressing A/Z scrolls through the available zones (or shift-clicking a zone to \r
+adopt it), and pressing 'ctrl' will bring up the zone info box for the active zone. \r
+\r
+Name: A description of the zone for the creator's use alone. The player will \r
+ never see it.\r
+\r
+Script: This is the number of the event in the map's vc code that will be called \r
+ when the player successfully activated the zone.\r
+\r
+Chance: This value determines whether the zone will be activated by determining \r
+ the randomness of success. A value of 0 will cause the event never to occur \r
+ (unless over-ridden by Adjacent Activation) while 256 (the maximum) will \r
+ cause it never to fail.\r
+\r
+Delay: A value of 0 is assigned to the chance of the zone before this number of \r
+ steps have been taken within the zone. From then, the Chance it returned to \r
+ the default you've set and calculated normally. For instance, on a map if the \r
+ chance of incurring a random battle is 50%, and the delay s 10, a minimum \r
+ of 10 steps must be taken after each battle before another may occur. \r
+\r
+Entity: This specifies a script number to be executed when an entity enters the zone. \r
+ 0 means no script.\r
+\r
+Allow Adjacent Activation: If this is checked, then the player may stand in an \r
+ adjacent tile and while facing the zone, activate it with the 'Talk/Confirm' \r
+ button. This over-rides the chance factor.\r
+\r
+E - Entities\r
+------------\r
+Entities are generally the characters that roam your maps but can become more dynamic \r
+if you so choose. In entity editing mode, clicking on a blank space on the map creates \r
+an entity doppelganger there and assigns it the lowest untaken entity number. Pressing \r
+'Del' while the cursor is over an entity will prompt you to erase that entity. When \r
+done so, that entity and it's properties will be gone and the next numbered entity \r
+with become one number lower and so on. (i.e. Deleting Entity0 on a map will cause \r
+Entity1 to become Entity0 and Entity2 to become Entity1, etc)\r
+\r
+Clicking on an existing entity will call that character's information dialog box.\r
+(Pressing Up/Down while in this box will scroll through the available entities.)\r
+The entity properties include a description (for your benefit alone), the XY \r
+coordinated of the entity (which are useful when you want to move a single entity \r
+without disrupting the whole order of your entities by deleting one), the number of \r
+the chr (as referenced to the chr list (see below) which may be accessed by a button \r
+adjacent to the chr text box), the speed of the entity (see Appendix A), and the \r
+activation script called when the entity is activated.\r
+\r
+Pressing the 'CHR list' from the entity properties box will bring up a listing of \r
+chrs that may be used in the map. Clicking on an empty text box to enter the chrs \r
+name with the attached extention, or choose browse to search for the file locally.\r
+\r
+Once the chr for the entity has been chosen, the appropriate chr will be displayed in \r
+the upper right corner of the property box.\r
+\r
+The addtional boxes control:\r
+\r
+-Autoface- Causes entity to face the player when "activated."\r
+\r
+-Active/Adjacent Method- If active, the entity will be activated when faced and \r
+ "talked to" by the player. In Adjacent mode, it is activated as soon as the player \r
+ comes in contact with it by occupying the space adjacent to it.\r
+\r
+-Obstructable/Obstruction- If the entity is obstructable, it will be stopped as the \r
+ player would by map obstruction. If obstruction is unchecked, the player will be \r
+ able to walk through the entity. (useful for flying chrs or invisible trigger chrs)\r
+\r
+Below these are the Movement Code/Scripts for the entity which control its movement \r
+behaviour in the game.\r
+\r
+The MoveCodes are:\r
+0 - Stopped\r
+1 - Causes the entity to roam aimlessly the specified number of steps before \r
+ pausing for the specified delay.\r
+2 - Causes the entity only to wander within a specified area.\r
+3 - Causes the entity to wander within a specified zone.\r
+4 - Causes the entity to enact a movement script specified in the 'scripts box'. \r
+ (see below)\r
+\r
+If you select 4, fill in the last text box with the *number* of the movement script\r
+you wish the entity to use, not the actual movement code. \r
+\r
+Scripts: This button brings up a list of the predefined scripts for the entities to \r
+follow. Using Up/Down you can find the numbered slot to fill in the movement script \r
+using a letter followed by the value of the direction. \r
+\r
+The letters are: \r
+U - Up\r
+D - Down\r
+L - Left\r
+R - Right\r
+X - Move to X axis value\r
+Y - Move to Y axis value\r
+Z - Special Frame\r
+F - Face (See Appendix B)\r
+W - Wait\r
+\r
+If you wanted the entity to move up two spaces, left 1, then move to 21 on the X axis, \r
+face down, pause for one second, and display its 22nd frame then repeat, you would use:\r
+\r
+ U2L1X21F0B\r
+\r
+III) The Program Menu\r
+---------------------\r
+The program menu is the most crucial and integral part of MapEd 2.0. How else would you \r
+get to Columns? It can be called by pressing 'Esc' or (if you have a three-button mouse)\r
+with the middle (or third bound) mouse button within the main editing window. \r
+\r
+A) New/Save/Load Functions\r
+\r
+Using 'New MAP' from the menu will abort the current map (after a prompt) and begin\r
+an blank map and VSP. In order to use an existing VSP with the new map, you must enter\r
+one in the MAP properties (see below) or use the 'Import VSP' function from the tile \r
+selector.\r
+\r
+The Save/Load features are fairly obvious; Pressing 'F10' or accessing 'Save MAP' from \r
+the menu will save the map contents including the VSP, map contents and it will compile\r
+the map's VC code into the map itself. \r
+***Saving a new VSP does so in a compressed format, although Maped2 and the engine can \r
+load older, uncompressed VSP formats. Maps must be resaved in order to be used, however.\r
+-If you save a New MAP generated from the menu or one generated if maped is run without \r
+a map parameter, it will automatically be saved as "untitled.map" with "untitled.vsp"\r
+Load will bring up a Load Map Dialog box. Either enter the map's name (with .map \r
+extention) or press the 'Browse' button to search for the map locally. You will be \r
+prompted to save the current map before it is aborted.\r
+\r
+Save VSP will save just the VSP independant of the map and entailing information. \r
+Useful if you were to create a few nice tiles, yet accidently delete a layer.\r
+\r
+B) MAP properties\r
+\r
+This dialog box is used to enter the important map information and the map resize \r
+function. \r
+\r
+-Music: This is the initial music file that will be played upon map startup.\r
+-VSP: The VSP this map will use. Note that if you use the same VSP for multiple \r
+ maps, all alterations made to it will affect ALL of its maps.\r
+-Rstring: This indicates the order and display values of the layers. (see below) The \r
+ order of the the layer numbers determines in which order they will be \r
+ displayed. Also, the letter 'E' should be added in order to determine upon \r
+ which layer they will be shown. Additionally, you may add an 'R' to \r
+ determine where to display a hookretrace script or you may define a specific \r
+ script begun with an 'S' followed by the script number appended with an 'X'. \r
+ Therefore, if you had four map layers, the obligatory entities drawn on the \r
+ first layer and script 3 to drawn over all the other layers, your Rstring \r
+ would look like: 1E234S3X\r
+\r
+-MAP Resize:\r
+ This calls a box used to edit the X/Y sizes of the map. Just enter the new values and \r
+ press 'Resize'.\r
+\r
+C) Layers:\r
+ Layers are a somewhat complicated aspect of your map. Accessing 'Layers' on the \r
+ program menu calls a submenu which is used to add or edit existing map layers.\r
+ 'Add Layer' will generate a new layer for the map. After adding it to the \r
+ Rstring (IIIb), you can then add tiles to it as you would the other layers. 'Edit\r
+ Layer' allows you to edit the layer properties including parallax and \r
+ h-line/transparency. The parallax values alter the movement of the layers in \r
+ accordance with the party's movement. The X/Y multipliers alter the direction of the\r
+ layer opposite to the party while the divider does vice versa. Keep in mind that\r
+ these are multipliers and dividers, hence, are fractions so an x multiplier and \r
+ divider of 20 reduces to 1/1 and cancels movement.\r
+ 'Import Image' directly crops all tiles from an image and places them in proper order\r
+ directly onto a selected layer. If the selected layer has tiles currently on it, that \r
+ information will discarded. ***The checkbox 'Eliminate Duplicates' will not crop and \r
+ tiles that are identical to ones already a part of the vsp, instead substituting the\r
+ original when they are actually imported.\r
+-Destroyer: \r
+ Destroys specific elements entirely from the map. Destroying Zones will get rid of \r
+ the physical placement of the zones while destroying zone data will eliminate the \r
+ information about the zones from the zone's property box. You can also eliminate\r
+ all entities and obstructions with destroyer.\r
+\r
+D) Options\r
+Most of these values are self explanatory; You can toggle smooth scrolling as opposed \r
+to tile based scrolling, mouse scrolling, whether you cursor will have a white tile \r
+outline and alternate between graphics modes. \r
+You can also set the color of the window title bar, box background, highlight color, \r
+and white offset color. \r
+The window color options are based on the numbers of the currently active palette.\r
+\r
+E) Fun Crap (tm)\r
+\r
+These are some assorted throw ins that are determined to throw all sorts of road \r
+blocks in front of you as you attempt to concentrate. \r
+\r
+i) MOD Player\r
+This is a simple interface for loading MOD, XM, or S3M music file. In the future it \r
+may be used for playing ITs as well. Simply enter the name of the music file or \r
+browse for it locally and press play.\r
+\r
+ii) CD Player\r
+This feature is capable of loading and playing CD music tracks. Unfortunately, it has \r
+some issues conflicting with Windows' Auto-Load and CD-Player.\r
+\r
+iii) Columns\r
+If you want to know the real reason V2 was delayed, look no further. The great spanning\r
+abyss of wasted time, this is Columns!\r
+In case you've never played the original SEGA classic, the object of Columns is to align\r
+three of the same colored crystals (orbs) and they will disappear. \r
+Pressing 'Up' will alternate the colors of the orbs, and Left/Right move the stack \r
+accordingly. Press 'Down' to accelerate the stack.\r
+\r
+To change the difficulty setting, alter the 'difficulty' variable in MAPED.CFG (found at \r
+the end of maped.cfg) \r
+\r
+(Courtesy of vecna:)\r
+The difficulty levels are as follows:\r
+ 4 - Normal\r
+ 5 - Harder\r
+ 6 - Your death is assured. ^_^\r
+\r
+ The difficulty controls not how fast the blocks fall, but how many\r
+ different colors of blocks are on the playing field. A value of greater\r
+ than 6 will error the program, and a difficulty less than 4 is outright\r
+ cheating. If you ever LOSE with a difficulty less than 4 you have\r
+ serious problems.\r
+ \r
+ You can now skin the background and sprite graphics for Columns. The\r
+ default is still hardcoded into the EXE, however, if the external files\r
+ COLBACK.PCX and/or COLSPR.PCX are found, they will be used. You can\r
+ download the default skin from www.verge-rpg.com, and other graphic sets can\r
+ be found at Extended Play. \r
+ (http://www.doc.ic.ac.uk/~rwkl97/ep/download.html#me2skins)\r
+\r
+iv) Quitting!\r
+Accessing 'Exit to DOS' from the main menu or 'Alt+X' will quit to DOS.\r
+\r
+IV) Miscellaneous\r
+-----------------\r
+***'F11' will take a proper screen shot, making the 'prntscrn' method obsolete.\r
+ Map movement has been retooled so that it will scroll independant of CPU speed.\r
+ \r
+There are a few other features such as the trippy built-in screen saver that are\r
+left for you to uncover. ^_^\r
+\r
+*) Various Fixes \r
+----------------\r
+(From whatsnew.txt in Maped Beta 3)\r
+ - Out-of-Bounds rendering protections reintroduced to the map renderer.\r
+ These were originally in ME2 a while ago, but somehow along the line\r
+ they got lost while juggling around different copies of the source.\r
+ This should prevent ME2 from crashing even if a mapfile or VSP is\r
+ partially corrupt.\r
+ - Fixed a problem with an internal tileset helper array not being\r
+ updated if you loaded a map from the commandline, resulting in the\r
+ map being drawn erratically.\r
+ - Problems with the sound system crashing the DOS box if sound\r
+ couldn't be initialized fixed. Now you just won't hear sound if\r
+ there are problems; The only reason ME2 should crash on startup\r
+ now is 1) you're running Windows NT or 2) you need to use the\r
+ nocdaudio option in MAPED.CFG\r
+ - Increased the tilebay size from 2048 tiles to 10240 tiles.\r
+ - Some improvements have been made with the CD audio situation; Exiting\r
+ ME2 will no longer stop the CD playback unless you used the ME2 CD\r
+ player. This was causing problems with people who were using Windows\r
+ CD Player to listen to CDs while going in and out of MapEd, which could\r
+ get very annoying. ^_^ It's still not perfect tho.\r
+\r
+***The map movement clipping has been fixed so you can now access every tile \r
+in the map.\r
+\r
+***Maped2 won't crash and burn hardcode if your map is less than the screen\r
+size. Not that you shouldn't have maps less than the screen size, but if you're\r
+stupid and try it, it'll handle it. \r
+This will become an issue with the multi-res versions of Maped.\r
+\r
+========================================================================================\r
+\r
+Appendix A: Entity/Character Speeds\r
+-----------------------------------\r
+ Speed Pixels/second\r
+ 1 25\r
+ 2 33\r
+ 3 50\r
+ 4 100\r
+ 5 200\r
+ 6 300\r
+ 7 400\r
+The default speed of the main character is 4.\r
+\r
+Appendix B: Face direction values\r
+---------------------------------\r
+\r
+ 1-Up\r
+ |\r
+ 2-Left - - 3-Right\r
+ |\r
+ 0-Down\r
+\r
--- /dev/null
+ +----------------------------------+\r
+ Ý VergeC 2.0 Reference File Ý\r
+ Ý Language Specification Ý\r
+ Ý VC Built-ins reference Ý\r
+ +----------------------------------+\r
+\r
+Current as of 5.9.99\r
+\r
+=============================================================================\r
+\r
+I. Language Specification\r
+\r
+A. Comments\r
+-----------\r
+Just as in VC1, both C and C++ style comment conventions are supported.\r
+\r
+ 1. Comments: Comments are not required in your VergeC code, but smart\r
+ event coders will use them to help organize and make their event\r
+ scripts readable for future reference. They are ignored by the\r
+ compiler. There are two ways to use comments:\r
+\r
+ a. If you type a double slash (//) in your code, everything on that\r
+ line after the slashes will be ignored.\r
+\r
+ Event // #75: When Dexter joins\r
+ {\r
+ Addcharacter(3);\r
+ }\r
+\r
+ b. The second method is to use /* and */. When the compiler encounters\r
+ a /*, everything will be ignored until it sees a */. Example:\r
+\r
+ Event\r
+ {\r
+ /* This is the part where Dexter joins after\r
+ being seen on the path of Jujube mountains.\r
+ The event below is number 75. */\r
+ addcharacter(3);\r
+ }\r
+\r
+ The // is preferred for simple phrases that you wish commented, while\r
+ the /* */ method is best for large areas of text to be left commented.\r
+\r
+ NOTE: Try using commenting if you have a problematic area of your\r
+ event script that refuses to compile. Use // before the lines\r
+ that create errors and try recompiling until you can isolate\r
+ the problem.\r
+\r
+B. Code control structures\r
+---------------------------\r
+VergeC 2.0 supports most of the code control structures that genuine ANSI C\r
+does, with some differences that are explained below:\r
+\r
+ 1. IFs: if statements are the most basic form of code execution control.\r
+ They have been much improved since VC1, primarily from the addition\r
+ of OR conditionals as well as the ELSE branching statement.\r
+ The basic format of an IF is:\r
+\r
+ if (condition <list>)\r
+ {\r
+ (code to be executed if condition is true)\r
+ }\r
+ else\r
+ {\r
+ (code to be executed if condition is false)\r
+ }\r
+\r
+ 2. SWITCHs: switch/case statements basically replace a series of IF\r
+ statements. Cases are yet another method of simplifying and\r
+ empowering your VC code's flexibility. They are most useful in\r
+ situations where you wish to provide multiple results based on the\r
+ condition of some variable. Here's how they're used:\r
+\r
+ Switch(<variable to be tested>)\r
+ {\r
+ Case <result 1>: <command>;\r
+ Case <result 2>: <command>;\r
+ Case <result 3>: <command>;\r
+ }\r
+\r
+ When the interpreter encounters this construct, it will test the value\r
+ of what is given in the Switch parentheses, then run the Case statement\r
+ that matches it, if any. Note that unlike C, no break; statements are\r
+ in the below example; break statement in VC are not only unnecessary but\r
+ will cause an error if they are present. Example:\r
+\r
+ switch (PartyIndex(1))\r
+ {\r
+ case 1: Text(1,"My name's Darin and I'm leading this party!","","");\r
+ case 2: Text(2,"I'm Sara and I'm here to pump you up!","","");\r
+ case 3: Text(3,"Dexter is leading this party.","","");\r
+ }\r
+\r
+ 3. WHILE loops:\r
+ It works much the same as a FOR loop, but can use nearly any condition\r
+ to control how long it executes. The syntax is such:\r
+\r
+ while (<condition>)\r
+ {\r
+ commands;\r
+ }\r
+\r
+ The condition inside the parentheses after WHILE can be anything you can\r
+ stuff in an IF statement. When the engine encounters a WHILE loop, it will\r
+ repeatedly execute the commands inside the curly braces until the condition\r
+ inside the parentheses is NOT true. Therefore, your WHILE loop should\r
+ contain some commands that affect that condition, or else your loop will\r
+ run endlessly.\r
+\r
+ 4. FOR loops:\r
+ FOR loops are perhaps more commonly used than WHILE, altho I personally\r
+ dig WHILE loops greatly. Anyhow, FOR loops in VergeC 2.0 are much closer\r
+ to their true C counterparts than they were in VC1. The syntax now is:\r
+\r
+ for (init; condition; post)\r
+ {\r
+ commands;\r
+ }\r
+\r
+ To clarify, an example would be:\r
+\r
+ for (i=0; i<5; i++)\r
+ {\r
+ printstring(i,"This is font "+str(i)+".");\r
+ }\r
+\r
+C. system.vc, map-based VC, and the relationship thereof\r
+--------------------------------------------------------\r
+There are two distinct types of VC in V2, and that is the system.vc, and\r
+everything else, which are MAP-based VC files. MAP based VC is very similar\r
+to how VC was in V1. You cannot declare your own functions or variables in\r
+a MAP vc. They use the familiar event { } style scripts. When they are\r
+compiled their pcode is attached directly into the MAPfile itself.\r
+\r
+The other type is system.vc, which is compiled into the files system.vcs and\r
+system.idx, respectively. system.vc allows you to declare your own functions\r
+and variables - the trick comes in that any of your map VC can access any\r
+and all of the functions and variables set up in system.vc.\r
+\r
+The only real problem arises that, because of the new relationship between\r
+system.vc and map-based VC, it's conceivable (quite likely, actually) that\r
+if you modify system.vc you'll break MAPs that you've already compiled. As\r
+such, VCC now has a 'vcc all' option, that will compile system.vc, and then\r
+recompile all maps it can find in the given directory. ME2 has a shortcut\r
+to do this right from inside MapEd - Just hit F6 and it'll rebuild all of\r
+your VC files. (of course, this means you can't have an ALL.MAP. Oh well,\r
+live with it. ^_-)\r
+\r
+There is nothing like startup.vc or startup.scr in V2. When you execute\r
+verge.exe, it always starts execution at a MAP file. Which mapfile it starts\r
+at is determined in user.cfg, by the 'startmap' command. Additionally, you can\r
+start verge.exe at a specific map by specifying the mapfile on the command\r
+line, which MapEd makes use of to directly test out the mapfile you're\r
+currently working on.\r
+\r
+D. Syntax for user-declared variables and functions\r
+---------------------------------------------------\r
+\r
+ 1. Funtions\r
+ There are two types of user declared functions, ones that return a\r
+ value and those that don't. The simplist declaration for a function\r
+ would be:\r
+\r
+ void MyFunc()\r
+ { }\r
+\r
+ You can add passed parameters like so:\r
+\r
+ void MyFunc(int a, string b)\r
+ { }\r
+\r
+ These parameters would be accessed inside this function as any other\r
+ variable would be, but it only exists inside the function. You would\r
+ call this function from map or other system.vc code with something\r
+ like this: MyFunc(5, "Hello.");\r
+\r
+ To make your function return a value, you'd declare it like so:\r
+\r
+ int MyAdd(int a, int b)\r
+ {\r
+ return a+b;\r
+ }\r
+\r
+ You cannot currently have a function return a string type. This may\r
+ change in a future version of V2/VC.\r
+\r
+ 2. Variables\r
+ There are only two variable types in VC, int (integer) and string.\r
+ Both are declared the same basic way:\r
+\r
+ int num;\r
+ string name;\r
+\r
+ You can define multiple variables of the same type onto a single line:\r
+\r
+ int x1, y1, x2, y2;\r
+\r
+ You can also declare arrays of variables:\r
+\r
+ int flags[8000];\r
+\r
+ You can declare arrays of both ints and strings. You can only declare\r
+ them in SYSTEM.VC (and any #included sub-files). Variables declared\r
+ outside of any function are global and can be accessed by any system.vc\r
+ OR map-based VC event at all. Variables declared inside a given\r
+ system.vc function are local variables, which only exist during the\r
+ duration of that function's execution, and can't be accessed outside\r
+ of that function.\r
+\r
+ Limits of passed parameters and local variables: For any given system.vc\r
+ function, the total number of passed parameters and local variables\r
+ cannot exceed 20, and the total number of passed and locally declared\r
+ strings cannot exceed 10. However, if you have 10 strings, you can only\r
+ have 10 ints, otherwise the total limit of 20 variables\r
+ (int and otherwise) would be exceeded.\r
+\r
+ If there is a global variable and local variable of the same name,\r
+ inside the function the local variable will be used instead. But in\r
+ a function where that local var isn't declared, or a map-vc event,\r
+ the global variable will be used instead.\r
+\r
+ We may add the ability to declare local variables in map-vc events in\r
+ a later release.\r
+\r
+E. Special string operators\r
+---------------------------\r
+\r
+We strived to make VC2 closer to "real" C in most aspects, but strings is not\r
+one of them. In real C, string manipulation is fairly clunky, and not very\r
+easy for beginners to pick up. So, we have created a string system that's\r
+somewhat like a mix of Pascal and BASIC.\r
+\r
+Any string can be combined any number of times, altho the total length of\r
+any one string cannot exceed 255 characters. For instance, if you had a string\r
+variable named OurHero, and it contained the main character's name, you\r
+could do something like:\r
+\r
+ Text(0,"Greetings, "+OurHero+". We",\r
+ "have been expecting you.", "");\r
+\r
+Additionally, there are 4 other commands which can be used during string\r
+combination: str(), left(), right(), and mid():\r
+\r
+ str(int) - converts a numerical value into string form.\r
+ left(string, n) - returns the leftmost n characters of string.\r
+ right(string, n) - returns the rightmost n characters of string.\r
+ mid(string, start, run) - returns a section of string, starting at the\r
+ start character, run characters long.\r
+\r
+And lastly, the val(string) attempts to convert a string back to an\r
+interger value. If the string has too many non-numerical characters in it,\r
+however, it may not be able to.\r
+\r
+F. Preprocessor directives\r
+--------------------------\r
+\r
+As in the original VC, VC2 emulates two primary C preprocessor directives,\r
+#include and #define. #include has been expanded, while #define has been\r
+scaled back.\r
+\r
+#include is more stable than before, and you can have nested #includes without\r
+any problems. The primary purpose of #includes in VC2 is to allow you to break\r
+up your system.vc into sub-files such as menu.vc, battle.vc, or similar\r
+divisions, and just #include those units into your main system.vc.\r
+\r
+Since VC2 now has proper functions, the macro-like behavior of #define in the\r
+VC1 preprocessor is no longer necessary, and since it was rather highly\r
+unstable, it was taken out. The primary purpose of #defines in VC2 is to\r
+allow an unlimited number of simple symbolic constants. An example would be:\r
+\r
+#define k_ESC 1\r
+if (key[k_ESC]) Text(0,"ESC has been pressed.","","");\r
+\r
+We may also later add conditional compilaton if there is a request for it.\r
+\r
+G. Pointers and direct memory access\r
+------------------------------------\r
+\r
+If you are not a native C programmer, you are more than welcome to skip over\r
+this section. I would not dare attempt to teach the principals of pointers\r
+to those who aren't programmers in their own right, and you don't really need\r
+to understand VC2's implementation using pointers for direct memory access for\r
+the vast majority of things you could ever want to do in VergeC.\r
+\r
+Since VC deals with all numeric variables as integers (signed, 32-bit values),\r
+it would not really make sense for us to implement the standard * and &\r
+operators, since you'd only be able to operate on data of type int.\r
+\r
+So, we have 6 builtins which aren't quite functions, and they aren't quite\r
+variables, but whatever they are, they're there. They are:\r
+\r
+(unsigned) byte[ptr]\r
+(unsigned) word[ptr]\r
+(unsigned) quad[ptr]\r
+ (signed) sbyte[ptr]\r
+ (signed) sword[ptr]\r
+ (signed) squad[ptr]\r
+\r
+Note: signed allows for negative numbers.\r
+\r
+Using the convention:\r
+ byte = 8 bits\r
+ word = 16 bits\r
+ quad = 32 bits\r
+\r
+The main reason these don't quite qualify as C functions is that you can also\r
+assign them values. Ie:\r
+\r
+ byte[myptr]=5;\r
+ if (byte[myptr] != 5)\r
+ Exit("Your computer is smoking crack, my friend.");\r
+\r
+H. Misc\r
+-------\r
+1. Alternate ways of expressing numbers\r
+ VC has three ways that it recognizes an immediate numerical value.\r
+\r
+ a. Standard/Decimal\r
+ The first is a standard, base-10 number. Just 65 or something. ex:\r
+\r
+ myval=65;\r
+ if (myval != 65)\r
+ Exit("Woe to thee, for thine computer smoketh crack, verily.");\r
+\r
+ b. Hexademical\r
+ VC uses Pascal's convention for handling hexademinal numbers, which\r
+ is to preceed a hexadecimal numerical delcaration with a $ sign. ex:\r
+\r
+ myval=255;\r
+ if (myval != $FF)\r
+ Exit("For thus sayeth the Lord, that thine processor was created by"+\r
+ "those darwinists who would believe that a CPU can be created"+\r
+ "by putting silicon in a frying pan and shaking it around a lot."+\r
+ "Well, either that, or you're running a Microsoft OS.");\r
+\r
+ c. ASCII character conversions\r
+ You can use C style single tick marks to denote an ASCII char conversion.\r
+ However, it does not support C's \ codes. Whats in between the tick\r
+ marks is taken directly. ex:\r
+\r
+ myval=65;\r
+ if (myval != 'A')\r
+ Exit("A stroke from the brush does not guarantee art from the bristles.");\r
+ \r
+2. Order of Operations\r
+ Does not exist. Use parentheses gratuitously. \r
+ Oftentimes you will want to do something like this: putpixel(x+y*320\r
+ This will not work! V2 will add x and y, then multiply the result by 320.\r
+ As always, any order of operations expression can be rewritten with\r
+ parentheses. In the example: putpixel(x+(y*320)\r
+\r
+=============================================================================\r
+\r
+II. Builtin Functions\r
+\r
+---------------------------\r
+void AllowConsole(int flag)\r
+---------------------------\r
+Controls whether or not the ` key will summon the console or not. 0 will\r
+disallow the console, 1 will activate it. Disabling the console is a good\r
+way to prevent cheating, however having it enabled will make developing\r
+and testing the game easier.\r
+\r
+Example:\r
+ AllowConsole(1);\r
+\r
+-------------------------------\r
+int CacheSound(string filename)\r
+-------------------------------\r
+Loads a specified sound effect (8-bit, mono, un-compressed WAV file), and\r
+returns the slot number that you'll access this sound with for PlaySound.\r
+\r
+See also: FreeAllSounds(), PlaySound()\r
+\r
+Example:\r
+ snd_shriek = CacheSound("SHRIEK.WAV");\r
+\r
+-----------------------\r
+void CD_Play(int track)\r
+-----------------------\r
+Begins playing CD audio at the specified track number.\r
+\r
+Example:\r
+ CD_Play(6);\r
+\r
+--------------\r
+void CD_Stop()\r
+--------------\r
+Stops all CD audio playing.\r
+\r
+Example:\r
+ CD_Stop();\r
+\r
+------------------------------------------------\r
+void Circle(int x, int y, int radius, int color)\r
+------------------------------------------------\r
+Draws a circle (outline only) of the given radius, centered at the given\r
+coordinates, in the given color.\r
+\r
+See also: CircleFill()\r
+\r
+Example:\r
+ Circle(screenx/2, screeny/2, 50, 128);\r
+\r
+----------------------------------------------------\r
+void CircleFill(int x, int y, int radius, int color)\r
+----------------------------------------------------\r
+Draws a filled circle of the given radius, centered at the given\r
+coordinates, in the given color.\r
+\r
+See also: Circle()\r
+\r
+Example:\r
+ CircleFill(screenx/2, screeny/2, 50, 128);\r
+\r
+---------------------------------------------------------------\r
+void CopySprite(int x, int y, int width, int height, int image)\r
+---------------------------------------------------------------\r
+Blits the image pointed to by image with the given dimensions at the\r
+given location on screen. No transparency, clipping is performed.\r
+\r
+See also: TCopySprite\r
+\r
+Example:\r
+ im = LoadImage("VECNA.PCX");\r
+ CopySprite(0, 0, image_width, image_height, im);\r
+ free(im);\r
+\r
+-------------------\r
+int cos(int degree)\r
+-------------------\r
+Returns the cosine of the given degree of measure (0-360) in 16.16 fixed\r
+point.\r
+\r
+See also: sin(), tan()\r
+\r
+Example:\r
+ result = cos(45);\r
+\r
+----------------------------------------------\r
+void EntityMove(int entity, string movescript)\r
+----------------------------------------------\r
+Sets the given entity to the specified movement script. As in V1,\r
+you cannot use 'B', the loop command, in an EntityMove given script.. But\r
+I should be able to work around that so that it will work eventually.\r
+\r
+Example:\r
+ ent = EntitySpawn(0, 1, "VECNA.CHR");\r
+ EntityMove(ent, "D2R2");\r
+\r
+---------------------------------------------\r
+int EntitySpawn(int x, int y, string chrname)\r
+---------------------------------------------\r
+Allocates a new entity at the given coordinates, using the specified CHR file.\r
+The entity index of the new entity is returned.\r
+\r
+See also: SetPlayer()\r
+\r
+Example:\r
+ ent = EntitySpawn(0, 1, "VECNA.CHR");\r
+\r
+-------------------------\r
+void Exit(string message)\r
+-------------------------\r
+Completely exits out of the engine leaving the user with the specified\r
+message.\r
+\r
+Example:\r
+ Exit("Thank you for playing!");\r
+\r
+---------------------------\r
+void fclose(int filehandle)\r
+---------------------------\r
+Closes the file given by the specified file handle.\r
+\r
+See also: fopen()\r
+\r
+Example:\r
+ file = fopen("EXAMPLE.DAT");\r
+ // ** use file here **\r
+ fclose(file);\r
+\r
+----------------------------\r
+int fgetbyte(int filehandle)\r
+----------------------------\r
+Gets a single byte from the specified file and returns it's value.\r
+\r
+Example:\r
+ file = fopen("TEST.DAT");\r
+ Message("First byte in TEST.DAT is: "+str(fgetbyte(file)), 200);\r
+ fclose(file);\r
+\r
+----------------------------\r
+int fgetword(int filehandle)\r
+----------------------------\r
+Gets a single word (2 bytes) from the specified file and returns it's value.\r
+\r
+Example:\r
+ file = fopen("TEST.DAT");\r
+ Message("First word in TEST.DAT is: "+str(fgetword(file)), 200);\r
+ fclose(file);\r
+\r
+----------------------------\r
+int fgetquad(int filehandle)\r
+----------------------------\r
+Gets a single quad (4 bytes) from the specified file and returns it's value.\r
+\r
+Example:\r
+ file = fopen("TEST.DAT");\r
+ Message("First quad in TEST.DAT is: "+str(fgetquad(file)), 200);\r
+ fclose(file);\r
+\r
+----------------------------------------------\r
+void fgetline(string variable, int filehandle)\r
+----------------------------------------------\r
+Grabs the next line from the specified text file handle and returns it in the\r
+string variable passed.\r
+\r
+Example:\r
+ file = fopen("EXAMPLE.TXT");\r
+ fgetline(my_string, file);\r
+ Message("First line in EXAMPLE.TXT is: "+my_string, 200);\r
+ fclose(file);\r
+\r
+Note: String support is a bit sketchy in V2 at the moment, and this command,\r
+ along with fgettoken(), only accept global strings as valid parameters.\r
+ It also will not read correctly into string arrays.\r
+\r
+-----------------------------------------------\r
+void fgettoken(string variable, int filehandle)\r
+-----------------------------------------------\r
+Grabs the next token (space delimited) from the specified text file handle\r
+and returns it in the string variable passed.\r
+\r
+Example:\r
+ file = fopen("EXAMPLE.TXT");\r
+ fgettoken(my_string, file);\r
+ Message("First token in EXAMPLE.TXT is: "+my_string, 200);\r
+ fclose(file);\r
+\r
+---------------------------\r
+int FontHeight(int fontidx)\r
+---------------------------\r
+Returns the height of the font at the given font index.\r
+\r
+See also: FontWidth()\r
+\r
+Example:\r
+ height = FontHeight(0);\r
+\r
+--------------------------\r
+int FontWidth(int fontidx)\r
+--------------------------\r
+Returns the width of the font at the given font index.\r
+\r
+See also: FontHeight()\r
+\r
+Example:\r
+ width = FontWidth(0);\r
+\r
+--------------------------\r
+int fopen(string filename)\r
+--------------------------\r
+Opens the given file and returns a unique file handle integer.\r
+\r
+See also: fclose()\r
+\r
+Example:\r
+ file = fopen("EXAMPLE.TXT");\r
+ fclose(file);\r
+\r
+--------------------------------------------------\r
+void fread(int buffer, int length, int filehandle)\r
+--------------------------------------------------\r
+Reads in a given amount of data from the specified file into the given buffer.\r
+Thus buffer must be pre-allocated by the user.\r
+\r
+Example:\r
+ file = fopen("TEST.DAT");\r
+ buffer = malloc(100);\r
+ fread(buffer, 100, file);\r
+ fclose(file);\r
+\r
+----------------------\r
+void free(int pointer)\r
+----------------------\r
+Frees the memory space pointed to by the given pointer. (ie, you would pass\r
+the same value returned by malloc for a memory segment)\r
+\r
+Example:\r
+ buffer = malloc(100);\r
+ // ** use buffer here **\r
+ free(buffer);\r
+\r
+--------------------\r
+void FreeAllSounds()\r
+--------------------\r
+Frees all sound effect slots.\r
+\r
+See also: CacheSound(), PlaySound()\r
+\r
+Example:\r
+ FreeAllSounds();\r
+\r
+-----------------------------\r
+void fdelete(string filename)\r
+-----------------------------\r
+Deletes the specified file. (uhm.. obviously, be careful with this command.\r
+This doesn't send it to the recycle bin or anything, the file is GONE after\r
+this command is executed. Like all the other file I/O vc commands, this\r
+will ONLY work on files in the main directory VERGE is being run from)\r
+\r
+Example:\r
+ fdelete("EXAMPLE.TXT");\r
+\r
+---------------------------------------------\r
+void frename(string filename, string newname)\r
+---------------------------------------------\r
+Renames the specified file to the new name.\r
+\r
+Example:\r
+ frename("EXAMPLE.TXT", "TEST.TXT");\r
+\r
+----------------------------------------\r
+void fseekline(int line, int filehandle)\r
+----------------------------------------\r
+Moves the file pointer to the given line number in a pre-opened text file.\r
+\r
+Example:\r
+ file = fopen("EXAMPLE.TXT");\r
+ fseekline(3, file);\r
+ fgetline(my_string, file);\r
+ Message("Line #3 in EXAMPLE.TXT is: "+my_string, 200);\r
+ fclose(file);\r
+\r
+--------------------------------------\r
+void fseekpos(int pos, int filehandle)\r
+--------------------------------------\r
+Moves the file pointer to the given byte position in a pre-opened binary file.\r
+\r
+Example:\r
+ file = fopen("TEST.DAT");\r
+ fseekpos(20, file);\r
+ Message("Byte #20 in TEST.DAT is: "+str(fgetbyte(file)), 200);\r
+ fclose(file);\r
+\r
+----------------------------\r
+void fwclose(int filehandle)\r
+----------------------------\r
+Closes the given file that was open for writing. Be *sure* not to mix\r
+file handles that were opened for reading and those that were opened\r
+for writing.\r
+\r
+See also: fwopen()\r
+\r
+Example:\r
+ file = fwopen("EXAMPLE.TXT");\r
+ // ** use file here **\r
+ fwclose(file);\r
+\r
+------------------------\r
+int fwopen(string fname)\r
+------------------------\r
+Opens the specified filename for writing.\r
+\r
+See also: fwclose(), fwrite(), fwritestring()\r
+\r
+Example:\r
+ file = fwopen("EXAMPLE.TXT");\r
+ // ** use file here **\r
+ fwclose(file);\r
+\r
+------------------------------------------------\r
+void fwrite(int ptr, int length, int filehandle)\r
+------------------------------------------------\r
+Writes the data at the given data pointer to the specified file.\r
+\r
+Example:\r
+ file = fwopen("EXAMPLE.TXT");\r
+ buffer = malloc(screenx * screeny);\r
+ GrabRegion(0,0, screenx-1,screeny-1, buffer);\r
+ fwrite(buffer, screenx * screeny, file);\r
+ fwclose(file);\r
+ free(buffer);\r
+\r
+----------------------------------------------\r
+void fwritestring(string text, int filehandle)\r
+----------------------------------------------\r
+Writes the passed string to the specified file. The string is written in\r
+text mode format, with a CR/LF pair at the end.\r
+\r
+Example:\r
+ file = fwopen("EXAMPLE.TXT");\r
+ my_string = "VERGE 2";\r
+ fwritestring(my_string, file);\r
+ fwclose(file);\r
+\r
+--------------------------\r
+int GetPixel(int x, int y)\r
+--------------------------\r
+Returns the color of the specified pixel coordinate.\r
+\r
+See also: SetPixel();\r
+\r
+Example:\r
+ color = GetPixel(screenx/2, screeny/2);\r
+\r
+------------------------------------\r
+int GetTile(int x, int y, int layer)\r
+-----------------------------------\r
+Returns the value of the given map layer at the given coordinates. For\r
+layer, 0 through 5 are the first 6 possible map layers, a value of 6\r
+will always denote the obstruction field, and 7 denotes zone information.\r
+\r
+See also: SetTile()\r
+\r
+Example:\r
+ tile = GetTile(0, 0, 0);\r
+\r
+-------------------------\r
+void GotoXY(int x, int y)\r
+-------------------------\r
+Sets the current text output "cursor" to the given location. This is where\r
+calls to PrintString will be displayed at.\r
+\r
+See also: PrintString()\r
+\r
+Example:\r
+ GotoXY(screenx/2, screeny/2);\r
+ PrintString(0, "Hyuck.");\r
+\r
+-----------------------------------------------------------\r
+void GrabRegion(int x1, int y1, int x2, int y2, int buffer)\r
+-----------------------------------------------------------\r
+This routine captures a region of the screen and copies it into\r
+a bitmap buffer. The main trick with using this routine is that you are\r
+responsible for creating and destroying this buffer with the malloc/free\r
+commands, and to be sure that you allocate enough memory in your malloc call\r
+to contain the image. For instance, if you capture the region from (0,0) to\r
+(49,49), this is a 50x50 square, and you will need to allocate 2500 bytes.\r
+\r
+Example:\r
+ save_screen = malloc(screenx * screeny);\r
+ GrabRegion(0, 0, screenx-1, screeny-1, save_screen);\r
+ // ** use save_screen here **\r
+ free(save_screen);\r
+\r
+-------------------------------------------\r
+void HLine(int x, int y, int x2, int color)\r
+-------------------------------------------\r
+Draws a horizontal line using the specified coordinates in the given color.\r
+\r
+See also: VLine(), Line()\r
+\r
+Example:\r
+ HLine(0, screeny/2, screenx-1, 128);\r
+\r
+-----------------------------------------\r
+void HookKey(int scancode, system script)\r
+-----------------------------------------\r
+Binds an event to a specified keypress. This allows you to create menus and\r
+other types of key-based events easily.\r
+\r
+ex: HookKey(1, Menu);\r
+When Escape is pressed (key scancode 1), the function Menu() in system.vc\r
+will be executed.\r
+\r
+See also: HookTimer(), HookRetrace()\r
+\r
+Example:\r
+ HookKey(1, menu_script);\r
+\r
+-------------------------------\r
+void HookRetrace(system script)\r
+-------------------------------\r
+Given a non-zero event number, it will execute the given VergeC event (from the\r
+Map VC) each time a frame is rendered. Note that it will be called at the 'R'\r
+position in the Renderstring, so if there *is* no 'R' position, then it will\r
+never be executed. As in verge 1, HookRetrace is quite stable, and should be\r
+used instead of HookTimer whenever possible. You can pass zero to this event\r
+to turn off the HookRetrace.\r
+\r
+See also: HookTimer(), HookKey()\r
+\r
+Example:\r
+ HookRetrace(my_script); // hook script\r
+ HookRetrace(1); // hook event\r
+\r
+-----------------------------\r
+void HookTimer(system script)\r
+-----------------------------\r
+Given a non-zero event number, it will execute the given VergeC event (from the\r
+Map VC) each timer tick (ie, 100 times per second). Note that, like verge 1,\r
+this is the more volatile of the Hook* family of functions, and HookRetrace\r
+should be used in place of HookTimer whenever possible. When using HookTimer,\r
+you should never call any rendering functions, and in general you should do as\r
+little as possible inside the hooked event as you can. As with HookRetrace,\r
+passing 0 to this function will turn off the HookTimer.\r
+\r
+See also: HookRetrace(), HookKey()\r
+\r
+Example:\r
+ HookTimer(my_script); // hook script\r
+ HookTimer(1); // hook event\r
+\r
+---------------------\r
+int InitMosaicTable()\r
+---------------------\r
+If you wish to use the Mosaic() routine, you must call this function to\r
+generate a mosaic palette-matching table (store the value returned by this\r
+function and pass it to Mosaic each time you call it). We would precompute\r
+this table, however, it depends on the palette. The table calculations can\r
+take a while, it takes about 12 seconds on my P200. It is possible, of course,\r
+to precompute the table in VC and load it at runtime for people that want\r
+to use this feature and wish to avoid the long table computation time.\r
+\r
+See also: Mosaic()\r
+\r
+Example:\r
+ table = InitMosaicTable();\r
+\r
+--------------------------------------------------\r
+void Line(int x, int y, int x2, int y2, int color)\r
+--------------------------------------------------\r
+Draws an arbitary-angled line from any two sets of coordinates in the\r
+given color.\r
+\r
+See also: HLine(), VLine()\r
+\r
+Example:\r
+ Line(0,0, screenx-1,screeny-1, 128);\r
+\r
+-----------------------------\r
+int LoadFont(string filename)\r
+-----------------------------\r
+Loads the specified font file and returns the font slot which is used by\r
+PrintString.\r
+\r
+See also: GotoXY(), PrintString()\r
+\r
+Example:\r
+ my_font = LoadFont("MYFONT.FNT");\r
+\r
+----------------------------\r
+int LoadRaw(string filename)\r
+----------------------------\r
+Loads the specied file as raw data into an allocated buffer and returns\r
+a pointer to that buffer.\r
+\r
+Example:\r
+ raw = LoadRaw("SPEECH.SPC");\r
+ // ** use raw here **\r
+ free(raw);\r
+\r
+------------------------------\r
+int LoadImage(string filename)\r
+------------------------------\r
+Loads the specified image, allocating enough memory for it, and returns\r
+a pointer to the image. If you no longer need the image, you should\r
+free() it. The image can be any of the supported V2 image types, which\r
+are currently PCX, BMP, and GIF.\r
+\r
+Example:\r
+ im = LoadImage("CHEESE.GIF");\r
+ // ** use im here **\r
+ free(im);\r
+\r
+---------------------\r
+void Log(string text)\r
+---------------------\r
+Outputs a message to VERGE.LOG, assuming verge.log is enabled by the user.\r
+This can be useful for debugging.\r
+\r
+Example:\r
+ Log("VERGE 2");\r
+\r
+----------------------\r
+int malloc(int amount)\r
+----------------------\r
+Allocates the given amount of memory and returns a pointer to the memory\r
+space allocated.\r
+\r
+Example:\r
+ buffer = malloc(100);\r
+ free(buffer);\r
+\r
+------------------------\r
+void Map(string mapname)\r
+------------------------\r
+Loads the specified MAP file as the current map. Upon encountering this\r
+command, VC execution is immediately terminated completely and resumed at\r
+the new map's Autoexec event.\r
+\r
+Example:\r
+ Map("TEST.MAP");\r
+\r
+------------------------------------------\r
+void Message(string message, int duration)\r
+------------------------------------------\r
+Issues the specified system message, lasting the given duration in hundreths\r
+of a second. This message is displayed in the upper left corner of the screen\r
+for the given duration, and noted in the verge.log file.\r
+\r
+Example:\r
+ Message("VERGE 2", 200);\r
+\r
+-------------------------------------------------------------------------\r
+void Mosaic(int xfocus, int yfocus, int tablepointer, int x1, y1, x2, y2)\r
+-------------------------------------------------------------------------\r
+"Mosaics" the screen so far; The best way to describe it is as the mode7\r
+effect used in FF2 and such to make the screen "blur out" during screen\r
+transitions. xfocus and yfocus control the "granularity" of this blurring,\r
+tablepointer must be the value returned by InitMosaicTable or a pointer\r
+to a precomputed table loaded in memory. The x1,y1,x2,y2 values specify\r
+the section of the screen to apply the mosaic effect to.\r
+\r
+So, to apply the mosaic effect with a 3-to-1 pixel ratio to the whole screen,\r
+you'd use Mosaic(3, 3, MyMosaicTable, 0, 0, ScreenX, ScreenY);\r
+\r
+See also: InitMosaicTable()\r
+\r
+Example:\r
+ table = InitMosaicTable();\r
+ Mosaic(4,4, table, 0,0, screenx-1, screeny-1);\r
+\r
+-------------------------------------------------------------\r
+void PaletteMorph(int r, int g, int b, int mix, int lighting)\r
+-------------------------------------------------------------\r
+This command alters the entire game palette, which will effect the entire\r
+screen. It changes the 'tint' of the screen; the RGB values are the color\r
+you want to tint the screen with, and range from 0 to 63. So, 63,0,0 would\r
+be red, 0,63,0 is green, and 0,0,63 is blue. 0,0,0 is black and 63,63,63\r
+is white. The mix value controls how 'thickly' the screen is tinted\r
+with this color. 0 would mean no mix whatsoever, while 100 would change\r
+the screen to be the color you specified solidly. The lighting value simply\r
+controls how light or dark the screen will be as a whole; 63 is normal\r
+brightness, 0 is black.\r
+\r
+Example:\r
+ PaletteMorph(0,0,0,0, 63);\r
+\r
+---------------------------------\r
+void PartyMove(string movescript)\r
+---------------------------------\r
+This command will have the party follow the specified movement script; player\r
+control will resume after the script is completed.\r
+\r
+Example:\r
+ PartyMove("U1R1D1L1");\r
+\r
+-----------------------------\r
+void PlayFLI(string filename)\r
+-----------------------------\r
+Plays the specified FLI or FLC file. Does not loop. The timing in the V2\r
+playback may be slightly off, but it should be so slight as to be completely\r
+unnoticable in the vast majority of cases. Also, it would be a good idea to\r
+set the video mode beforehand to something appropriate to fit the resolution of\r
+the FLI.\r
+\r
+SeeAlso: SetResolution()\r
+\r
+Example:\r
+ PlayFLI("INTRO.FLC");\r
+\r
+-------------------------------\r
+void PlayMusic(string filename)\r
+-------------------------------\r
+Plays the specified music file. In this version of V2, only MODs, MTMs, S3Ms,\r
+and XMs are supported.\r
+\r
+See also: StopMusic();\r
+\r
+Example:\r
+ PlayMusic("AURORA.MOD");\r
+\r
+--------------------------------------------------\r
+void PlaySound(int soundslot, int volume, int pan)\r
+--------------------------------------------------\r
+Plays the specified sound effect at the given slot index; volume is a value\r
+from 0 to 64 indicating the volume the sound file will be played at, and pan\r
+is a value from 0 to 255; 0 is all the way left, and 255 is all the way right,\r
+128 is in the center.\r
+\r
+See also: CacheSound(), FreeAllSounds()\r
+\r
+Example:\r
+ shriek = CacheSound("SHRIEK.WAV");\r
+ PlaySound(shriek, 64, 128);\r
+\r
+--------------------------\r
+int pow(int base, int exp)\r
+--------------------------\r
+Raises base to the exp power and returns that value.\r
+\r
+Example:\r
+ result = pow(16, 3); // 4096\r
+\r
+----------------------\r
+void ProcessEntities()\r
+----------------------\r
+Processes one tick worth of entity movement. If you call this 100 times a\r
+second it will keep the game moving as normal. For example, the following code\r
+could be used to draw something on top of the normal map view:\r
+\r
+Example:\r
+ while (!done)\r
+ {\r
+ while (timer)\r
+ {\r
+ timer--;\r
+ ProcessEntities();\r
+ }\r
+ Render();\r
+ // Put additional things to be drawn per frame here\r
+ ShowPage();\r
+ }\r
+\r
+---------------------------------------\r
+void PrintString(int font, string text)\r
+---------------------------------------\r
+Displays the given string in the specified font index, at the location\r
+last given by GotoXY.\r
+\r
+See also: LoadFont(), GotoXY()\r
+\r
+Example:\r
+ PrintString(0, "VERGE 2");\r
+\r
+---------------------\r
+int Random(int range)\r
+---------------------\r
+Returns a random number between 0 and the range given.\r
+\r
+Example:\r
+ if (Random(100) < 50)\r
+ PrintString(0, "Heads!");\r
+ else PrintString(0, "Tails!");\r
+\r
+----------------\r
+void ReadMouse()\r
+----------------\r
+Updates the mouse status variables mx, my, and mb.\r
+\r
+See also: SetMousePos()\r
+\r
+Example:\r
+ ReadMouse();\r
+\r
+------------------------------\r
+void ReadVars(int filepointer)\r
+------------------------------\r
+Reads all the global variables that have been written to a file by WriteVars().\r
+You're responsible for opening and closing the file for reading, mainly used\r
+for savegames.\r
+\r
+See also: WriteVars(), fopen(), fclose()\r
+\r
+Example:\r
+ file = fopen("SAVE.DAT");\r
+ ReadVars(file);\r
+ fclose(file);\r
+\r
+----------------------------------------------\r
+void Rect(int x, int y, int x2, int y2, int c)\r
+----------------------------------------------\r
+Draws an outlined rectangle of the given coordinate set in the specified\r
+color.\r
+\r
+See also: RectFill()\r
+\r
+Example:\r
+ Rect(0, 0, screenx-1, screeny-1, 128);\r
+\r
+--------------------------------------------------\r
+void RectFill(int x, int y, int x2, int y2, int c)\r
+--------------------------------------------------\r
+Draws a filled rectangle of the given coordinate set in the specified\r
+color.\r
+\r
+See also: Rect()\r
+\r
+Example:\r
+ RectFill(0, 0, screenx-1, screeny-1, 128);\r
+\r
+-------------\r
+void Render()\r
+-------------\r
+Performs a render, per the render string, but does not copy the screen\r
+buffer to the visible screen, allowing you to draw additional items on top\r
+of the game screen.\r
+\r
+See also: ShowPage()\r
+\r
+Example:\r
+ Render();\r
+\r
+----------------------------\r
+void RestoreRenderSettings()\r
+----------------------------\r
+Restores the default clipping window for the given video mode, and restores\r
+the render destination to the video buffer.\r
+\r
+See also: SetClipRect(), SetRenderDest()\r
+\r
+Example:\r
+ RestoreRenderSettings();\r
+\r
+----------------------------------------------------------------------------\r
+void ScaleSprite(int x, int y, int iw, int ih, int dw, int dh, int imageptr)\r
+----------------------------------------------------------------------------\r
+Draws a scaled image. A bit more complex than the other blitters to use.\r
+The x,y values give the upper-left corner of where the blit will start.\r
+iw,ih are the width and height of the *source* image. dw, dh are the width\r
+and height that the image should appear on screen. (ie, the end result\r
+bounding box of the image would be, x, y, x+dw, y+dh) Imageptr is, as with\r
+the other blit routines, a pointer to the image graphic.\r
+\r
+See also: TScaleSprite()\r
+\r
+Example:\r
+ im = LoadImage("VECNA.PCX");\r
+ ScaleSprite(0,0, image_width,image_height, image_width*2,image_height*2, im);\r
+ free(im);\r
+\r
+----------------------\r
+void SetClip(int clip)\r
+----------------------\r
+Determines whether clipping versions of general VC graphics routines are\r
+used. Defaults to 1; You will never need to turn this off, turn it offers\r
+no functional difference, except faster blitting routines, however, great care\r
+must be used when turning it off that no part of any blit or graphics call\r
+draws off screen boundaries.\r
+\r
+Example:\r
+ SetClip(1);\r
+\r
+------------------------------------------------\r
+void SetClipRect(int x1, int y1, int x2, int y2)\r
+------------------------------------------------\r
+Sets the rectangle that image drawing will be clipped to.\r
+\r
+See also: RestoreRenderSettings()\r
+\r
+Example:\r
+ im = LoadImage("PATTERN.PCX");\r
+ SetClipRect(screenx/4, screeny/4, screenx-(screenx/4), screeny-(screeny/4));\r
+ WrapBlit(0, 0, image_width, image_height, im);\r
+ RestoreRenderSettings();\r
+ free(im):\r
+\r
+-----------------------------------------------------\r
+void SetRenderDest(int width, int height, int buffer)\r
+-----------------------------------------------------\r
+This sets the video buffer that all VC video functions will draw into.\r
+\r
+See also: RestoreRenderSettings()\r
+\r
+Example:\r
+ buffer = malloc(32 * 32);\r
+ SetRenderDest(32, 32, buffer);\r
+ Line(0,0, 15,15, 128);\r
+ Line(0,15, 15,0, 128);\r
+ Rect(0,0, 15,15, 128);\r
+ RestoreRenderSettings();\r
+ CopySprite(0, 0, 32, 32, buffer);\r
+ free(buffer);\r
+\r
+--------------------------\r
+void SetLucent(int lucent)\r
+--------------------------\r
+Determines whether translucent versions of general VC graphics routines are\r
+used. Defaults to 0.\r
+\r
+Example:\r
+ SetLucent(1);\r
+\r
+------------------------------\r
+void SetMousePos(int x, int y)\r
+------------------------------\r
+Sets the current mouse position to the given x and y coordinates. Does no\r
+checking to make sure the coordinates are valid, so check that yourself, they\r
+should between 0 and screenx and 0 and screeny, respectively.\r
+\r
+See also: ReadMouse()\r
+\r
+Example:\r
+ SetMousePos(screenx/2, screeny/2);\r
+\r
+----------------------------------\r
+void SetPixel(int x, int y, int c)\r
+----------------------------------\r
+Sets the specified pixel coordinate to the given color.\r
+\r
+See also: GetPixel();\r
+\r
+Example:\r
+ SetPixel(screenx/2, screeny/2, 128);\r
+\r
+-------------------------------\r
+void SetPlayer(int entityindex)\r
+-------------------------------\r
+Sets the specified entity index as the active player.\r
+\r
+See also: EntitySpawn()\r
+\r
+Example:\r
+ ent = EntitySpawn(0, 1, "VECNA.CHR");\r
+ SetPlayer(ent);\r
+\r
+-------------------------------------\r
+int SetResolution(int xres, int yres)\r
+-------------------------------------\r
+Sets the video mode to the specified resolution. Returns 1 if successful, 0\r
+if the mode set failed.\r
+\r
+Common video modes:\r
+-------------------\r
+ DOS Windows\r
+ --- -------\r
+ 320x200 320x200\r
+ 320x240 320x240\r
+ 360x240 512x384\r
+ 256x256 640x480\r
+ 640x480 800x600\r
+ 1024x768\r
+\r
+Example:\r
+ SetResolution(320, 240);\r
+\r
+-------------------------------\r
+void SetRString(string rstring)\r
+-------------------------------\r
+Updates the RenderString to the specified string.\r
+\r
+Example:\r
+ SetRString("1E2");\r
+\r
+------------------------------------------------\r
+void SetTile(int x, int y, int layer, int value)\r
+------------------------------------------------\r
+Sets a new value to the given map layer at the given coordinates. For\r
+layer, 0 through 5 are the first 6 possible map layers, a value of 6\r
+will always denote the obstruction field, and 7 denotes zone information.\r
+\r
+See also: GetTile()\r
+\r
+Example:\r
+ SetTile(0, 0, 0, 2);\r
+\r
+---------------\r
+void ShowPage()\r
+---------------\r
+Copys the screen buffer to the visible screen.\r
+\r
+See also: Render(), CopySprite(), TCopySprite()\r
+\r
+Example:\r
+ ShowPage();\r
+\r
+--------------------------------------------------------------------------\r
+void Silhouette(int x, int y, int width, int height, int color, int image)\r
+--------------------------------------------------------------------------\r
+Renders a silhouette of the specified image. The silhouette is generated\r
+by looking for all non-zero pixels in the image and replacing them with\r
+the specified color.\r
+\r
+Example:\r
+ im = LoadImage("GOAT.PCX");\r
+ Silhouette(0, 0, image_width, image_height, 128, im);\r
+ free(im);\r
+\r
+-------------------\r
+int sin(int degree)\r
+-------------------\r
+Returns the sine of the given degree of measure (0-360) in 16.16 fixed\r
+point.\r
+\r
+See also: cos(), tan()\r
+\r
+Example:\r
+ result = sin(180);\r
+\r
+----------------\r
+void StopMusic()\r
+----------------\r
+Stops currently playing music.\r
+\r
+See also: PlayMusic()\r
+\r
+Example:\r
+ StopMusic();\r
+\r
+------------------------------------\r
+int strcmp(string str1, string str2)\r
+------------------------------------\r
+Compares the two passed strings. Returns 0 if they're identical, or\r
+a nonzero number porportional to the difference between the strings.\r
+\r
+Example:\r
+ string_a = "alpha";\r
+ string_b = "zeta";\r
+ result = strcmp(string_a, string_b);\r
+ if (!result)\r
+ PrintString(0, "Strings are equal");\r
+ else if (result < 0)\r
+ PrintString(0, string_a+" comes before "+string_b);\r
+ else\r
+ PrintString(0, string_b+" comes before "+string_a);\r
+\r
+----------------------\r
+int strlen(string str)\r
+----------------------\r
+Returns the length of the passed string.\r
+\r
+Example:\r
+ my_string = "VERGE 2";\r
+ length = strlen(my_string);\r
+\r
+-------------------\r
+int tan(int degree)\r
+-------------------\r
+Returns the tangent of the given degree of measure (0-360) in 16.16 fixed\r
+point.\r
+\r
+See also: sin(), cos()\r
+\r
+Example:\r
+ result = tan(270);\r
+\r
+----------------------------------------------------------------\r
+void TCopySprite(int x, int y, int width, int height, int image)\r
+----------------------------------------------------------------\r
+Blits the image pointed to by image with the given dimensions at the\r
+given location on screen. Transparency and clipping are performed.\r
+\r
+See also: CopySprite\r
+\r
+Example:\r
+ im = LoadImage("SLIME.PCX");\r
+ TCopySprite(0, 0, image_width, image_height, im);\r
+ free(im);\r
+\r
+-----------------------------------------------------------------------------\r
+void TScaleSprite(int x, int y, int iw, int ih, int dw, int dh, int imageptr)\r
+-----------------------------------------------------------------------------\r
+Draws a scaled image. A bit more complex than the other blitters to use.\r
+The x,y values give the upper-left corner of where the blit will start.\r
+iw,ih are the width and height of the *source* image. dw, dh are the width\r
+and height that the image should appear on screen. (ie, the end result\r
+bounding box of the image would be, x, y, x+dw, y+dh) Imageptr is, as with\r
+the other blit routines, a pointer to the image graphic. This routines draws\r
+the image with transparency, unlike ScaleSprite().\r
+\r
+See also: ScaleSprite()\r
+\r
+Example:\r
+ im = LoadImage("SLIME.PCX");\r
+ TScaleSprite(0,0, image_width,image_height, image_width*2,image_height*2, im);\r
+ free(im);\r
+\r
+--------------------------------------------------------------------\r
+void TWrapBlit(int xofs, int yofs, int width, int height, int image)\r
+--------------------------------------------------------------------\r
+Blits an image of any size repeatedly so that it fills the entire screen;\r
+This version is color-0 transparent unlike the normal WrapBlit version.\r
+\r
+See also: WrapBlit();\r
+\r
+Example:\r
+ im = LoadImage("PATTERN.PCX");\r
+ TWrapBlit(0, 0, image_width, image_height, im);\r
+ free(im);\r
+\r
+-------------------------\r
+void UnPress(int control)\r
+-------------------------\r
+This will read a control currently being pressed as not pressed until it\r
+is released and then pressed again. The values of control are:\r
+ 0: All buttons, not directionals\r
+ 1: b1 5: up\r
+ 2: b2 6: down\r
+ 3: b3 7: left\r
+ 4: b4 8: right\r
+\r
+Example:\r
+ UnPress(0);\r
+\r
+---------------------\r
+void UpdateControls()\r
+---------------------\r
+Updates the control variables up, down, left, right, b1, b2, b3, and b4.\r
+\r
+Example:\r
+ UpdateControls();\r
+\r
+-------------------------------------------\r
+void VLine(int x, int y, int y2, int color)\r
+-------------------------------------------\r
+Draws a vertical line from the specified coordinates in the given color.\r
+\r
+See also: HLine(), Line()\r
+\r
+Example:\r
+ VLine(screenx/2, 0, screeny-1, 128);\r
+\r
+-------------------------------------------------------------------\r
+void WrapBlit(int xofs, int yofs, int width, int height, int image)\r
+-------------------------------------------------------------------\r
+Blits an image of any size repeatedly so that it fills the entire screen;\r
+\r
+See also: TWrapBlit();\r
+\r
+Example:\r
+ im = LoadImage("PATTERN.PCX");\r
+ WrapBlit(0, 0, image_width, image_height, im);\r
+ free(im);\r
+\r
+-------------------------------\r
+void WriteVars(int filepointer)\r
+-------------------------------\r
+Writes all global variables (ints and strings) to the specified file. You\r
+must take care of opening and closing the file for writing. Mostly used\r
+for savegames.\r
+\r
+See also: ReadVars(), fwopen(), fwclose()\r
+\r
+Example:\r
+ file = fwopen("SAVE.DAT");\r
+ WriteVars(file);\r
+ fwclose(file);\r
+\r
+=============================================================================\r
+\r
+III. Builtin Variables\r
+\r
+b1, b2, b3, b4\r
+--------------\r
+These represent four primary control buttons. They are updated by the\r
+UpdateControls() function. [read-only]\r
+\r
+Example:\r
+ UpdateControls();\r
+ if (b1) Message("Button 1!", 100);\r
+ if (b2) Message("Button 2!", 100);\r
+ if (b3) Message("Button 3!", 100);\r
+ if (b4) Message("Button 4!", 100);\r
+\r
+cameratracking, tracker\r
+-----------------------\r
+If cameratracking is 0, the camera is free to be altered by the xwin/ywin\r
+variables. If cameratracking is 1, the camera will always follow the player.\r
+If cameratracking is 2, the camera will always follow the entity specified in\r
+tracker. [read/write]\r
+\r
+Example:\r
+ ent = EntitySpawn(0, 1, "VECNA.CHR");\r
+ cameratracking = 2;\r
+ tracker = ent;\r
+ EntityMove("R2D2L2U2");\r
+\r
+entity.x, entity.y\r
+------------------\r
+x/y coordinates of the specified entity in world-coordinates (pixel-accurate).\r
+[read/write]\r
+\r
+Example:\r
+ Log("Player X="+str(entity.x[player])+", Y="+str(entity.y[player]));\r
+\r
+entity.tx, entity.ty\r
+--------------------\r
+x/y coordinates of the specified entity in tile coordinate. [read/write]\r
+\r
+Example:\r
+ Log("Player TX="+str(entity.tx[player])+", TY="+str(entity.ty[player]));\r
+\r
+entity.facing, entity.moving, entity.specframe, entity.speed, entity.movecode\r
+-----------------------------------------------------------------------------\r
+Various variables effecting the specified stats of the given entity.\r
+[read/write]\r
+\r
+Example:\r
+ Log("Player info");\r
+ Log(" Facing: "+str(entity.facing[player]));\r
+ Log(" Moving: "+str(entity.moving[player]));\r
+ Log("SpecFrame: "+str(entity.specframe[player]));\r
+ Log(" Speed: "+str(entity.speed[player]));\r
+ Log(" MoveCode: "+str(entity.movecode[player]));\r
+\r
+entsonscreen\r
+------------\r
+Array of entity indexes which are currently onscreen.\r
+\r
+Example:\r
+ // log all tile coordinates of entities onscreen\r
+ for (i=0; i<numentsonscreen; i++)\r
+ Log("X="+str(entity.tx[entsonscreen[i]])+", Y="+str(entity.ty[entsonscreen[i]]));\r
+\r
+key\r
+---\r
+Returns or set the on/off flag of the specified key scancode.\r
+\r
+Example:\r
+ if (key[1])\r
+ Message("ESC is pressed", 200);\r
+ else Message("ESC is not pressed", 200);\r
+\r
+lastent\r
+-------\r
+The last entity that called a VC event, either via movement script or\r
+activation.\r
+\r
+Example:\r
+ Message("Last entity: "+str(lastent), 200);\r
+ \r
+Note: Untested currently.\r
+\r
+mx, my, mb\r
+----------\r
+mx and my are the x and y coordinates of the mouse pointer. mb returns the\r
+mouse button status.\r
+\r
+Example:\r
+ Message("Mouse info: X="+str(mx)+", Y="+str(my)+", B="+str(mb), 200);\r
+\r
+numentsonscreen\r
+---------------\r
+Number of entities currently on screen, number of values in entsonscreen array\r
+that are valid.\r
+\r
+Example:\r
+ Message("Number of entities onscreen: "+str(numentsonscreen), 200);\r
+\r
+pal\r
+---\r
+Active palette array (256 RGB entries; 768 bytes). Changes made will only\r
+be enforced when PaletteMorph() is next called.\r
+\r
+Example:\r
+ // greyscale the active palette\r
+ for (i=0; i<256; i++)\r
+ {\r
+ r=pal[i*3+0];\r
+ g=pal[i*3+1];\r
+ b=pal[i*3+2];\r
+ average=(r+g+b)/3;\r
+ pal[i*3+0]=average;\r
+ pal[i*3+1]=average;\r
+ pal[i*3+2]=average;\r
+ }\r
+ PaletteMorph(0,0,0,0, 63);\r
+\r
+player\r
+------\r
+Returns which entity index number is currently the active player. [read-only]\r
+\r
+Example:\r
+ ent = EntitySpawn(0, 1, "VECNA.CHR");\r
+ SetPlayer(ent);\r
+ Message("Active entity index is #"+str(player));\r
+\r
+screen\r
+------\r
+Single-dimensional array access to the video virtual buffer. [read/write]\r
+\r
+Example:\r
+ SetResolution(320, 240);\r
+ screen[(120*320)+160]=128;\r
+\r
+screenx, screeny\r
+----------------\r
+Return the x and y dimensions of the current video mode. [read-only]\r
+\r
+Example:\r
+ Message("Current resolution is "+str(screenx)+"x"+str(screeny));\r
+\r
+timer\r
+-----\r
+This variable is incremented 100 times per second. It can be used to for\r
+timing purposes. [read/write]\r
+\r
+Example:\r
+ while (timer)\r
+ {\r
+ timer--;\r
+ ProcessEntities();\r
+ }\r
+\r
+up, down, left, right\r
+---------------------\r
+These represent the four directional controls. Also updated by\r
+UpdateControls(). [read-only]\r
+\r
+Example:\r
+ UpdateControls();\r
+ if (up) Message("UP!", 100);\r
+ if (down) Message("DOWN!", 100);\r
+ if (left) Message("LEFT!", 100);\r
+ if (right) Message("RIGHT!", 100);\r
+\r
+vctrace\r
+-------\r
+This is a 0/1, off/on variable that defaults to 0; when it is turned on,\r
+VERGE.LOG will contain dumps tracing the code flow of system.vc function\r
+calls. However, this log can get very big very quickly, so it's recommended\r
+that you turn it on to track and debug a particular section of code and then\r
+turn it off afterwards.\r
+\r
+Example:\r
+ vctrace = 1;\r
+\r
+vsp\r
+---\r
+Array of tile image data. Sequential ordering of 256 byte (16*16) blocks.\r
+\r
+Example:\r
+ TCopySprite(screenx/2,screeny/2, 16,16, vsp+(slot*256));\r
+\r
+xwin, ywin\r
+----------\r
+These control the camera, if cameratracking is 0. Otherwise, the camera will\r
+follow the player. [read/write]\r
+\r
+Example:\r
+ xwin = 100;\r
+ ywin = 200;\r
--- /dev/null
+v2t5_9.zip -- verge2 engine, maped, vcc\r
+v2u5_9.zip -- misc. useful utilities\r
+template -- a (mostly) blank game for you to jumpstart with\r
+\r
+questions, comments @ aen@verge-rpg.com zeromus@verge-rpg.com
\ No newline at end of file
--- /dev/null
+/*\r
+ * $Id: audio.h 1.17 1996/09/25 17:13:02 chasan released $\r
+ *\r
+ * SEAL Synthetic Audio Library API Interface\r
+ *\r
+ * Copyright (C) 1995, 1996 Carlos Hasan. All Rights Reserved.\r
+ *\r
+ */\r
+\r
+#ifndef __AUDIO_H\r
+#define __AUDIO_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifndef WIN32\r
+#define AIAPI\r
+#else\r
+#define AIAPI __stdcall\r
+#endif\r
+\r
+#ifndef WINAPI\r
+\r
+/* atomic data types definitions */\r
+typedef void VOID;\r
+typedef char CHAR;\r
+typedef int INT;\r
+typedef long LONG;\r
+typedef int BOOL;\r
+\r
+typedef unsigned char BYTE;\r
+typedef unsigned short WORD;\r
+typedef unsigned int UINT;\r
+typedef unsigned long DWORD;\r
+\r
+typedef VOID* LPVOID;\r
+typedef CHAR* LPCHAR;\r
+typedef INT* LPINT;\r
+typedef LONG* LPLONG;\r
+typedef BOOL* LPBOOL;\r
+typedef BYTE* LPBYTE;\r
+typedef WORD* LPWORD;\r
+typedef UINT* LPUINT;\r
+typedef DWORD* LPDWORD;\r
+typedef CHAR* LPSTR;\r
+typedef DWORD HANDLE;\r
+\r
+/* helper macros */\r
+#define LOBYTE(s) ((BYTE)(s))\r
+#define HIBYTE(s) ((BYTE)((WORD)(s)>>8))\r
+#define LOWORD(l) ((WORD)(l))\r
+#define HIWORD(l) ((WORD)((DWORD)(l)>>16))\r
+#define MAKEWORD(l,h) ((WORD)(((BYTE)(l))|(((WORD)((BYTE)(h)))<<8)))\r
+#define MAKELONG(l,h) ((DWORD)(((WORD)(l))|(((DWORD)((WORD)(h)))<<16)))\r
+\r
+#endif\r
+\r
+\r
+/* audio system version number */\r
+#define AUDIO_SYSTEM_VERSION 0x0101\r
+\r
+/* audio capabilities bit fields definitions */\r
+#define AUDIO_FORMAT_1M08 0x00000001\r
+#define AUDIO_FORMAT_1S08 0x00000002\r
+#define AUDIO_FORMAT_1M16 0x00000004\r
+#define AUDIO_FORMAT_1S16 0x00000008\r
+#define AUDIO_FORMAT_2M08 0x00000010\r
+#define AUDIO_FORMAT_2S08 0x00000020\r
+#define AUDIO_FORMAT_2M16 0x00000040\r
+#define AUDIO_FORMAT_2S16 0x00000080\r
+#define AUDIO_FORMAT_4M08 0x00000100\r
+#define AUDIO_FORMAT_4S08 0x00000200\r
+#define AUDIO_FORMAT_4M16 0x00000400\r
+#define AUDIO_FORMAT_4S16 0x00000800\r
+\r
+/* audio format bit fields defines for devices and waveforms */\r
+#define AUDIO_FORMAT_8BITS 0x0000\r
+#define AUDIO_FORMAT_16BITS 0x0001\r
+#define AUDIO_FORMAT_LOOP 0x0010\r
+#define AUDIO_FORMAT_BIDILOOP 0x0020\r
+#define AUDIO_FORMAT_REVERSE 0x0080\r
+#define AUDIO_FORMAT_MONO 0x0000\r
+#define AUDIO_FORMAT_STEREO 0x0100\r
+#define AUDIO_FORMAT_FILTER 0x8000\r
+\r
+/* audio resource limits defines */\r
+#define AUDIO_MAX_VOICES 32\r
+#define AUDIO_MAX_SAMPLES 16\r
+#define AUDIO_MAX_PATCHES 128\r
+#define AUDIO_MAX_PATTERNS 256\r
+#define AUDIO_MAX_ORDERS 256\r
+#define AUDIO_MAX_NOTES 96\r
+#define AUDIO_MAX_POINTS 12\r
+#define AUDIO_MIN_PERIOD 1\r
+#define AUDIO_MAX_PERIOD 31999\r
+#define AUDIO_MIN_VOLUME 0x00\r
+#define AUDIO_MAX_VOLUME 0x40\r
+#define AUDIO_MIN_PANNING 0x00\r
+#define AUDIO_MAX_PANNING 0xFF\r
+#define AUDIO_MIN_POSITION 0x00000000L\r
+#define AUDIO_MAX_POSITION 0x00100000L\r
+#define AUDIO_MIN_FREQUENCY 0x00000200L\r
+#define AUDIO_MAX_FREQUENCY 0x00080000L\r
+\r
+/* audio error code defines */\r
+#define AUDIO_ERROR_NONE 0x0000\r
+#define AUDIO_ERROR_INVALHANDLE 0x0001\r
+#define AUDIO_ERROR_INVALPARAM 0x0002\r
+#define AUDIO_ERROR_NOTSUPPORTED 0x0003\r
+#define AUDIO_ERROR_BADDEVICEID 0x0004\r
+#define AUDIO_ERROR_NODEVICE 0x0005\r
+#define AUDIO_ERROR_DEVICEBUSY 0x0006\r
+#define AUDIO_ERROR_BADFORMAT 0x0007\r
+#define AUDIO_ERROR_NOMEMORY 0x0008\r
+#define AUDIO_ERROR_NODRAMMEMORY 0x0009\r
+#define AUDIO_ERROR_FILENOTFOUND 0x000A\r
+#define AUDIO_ERROR_BADFILEFORMAT 0x000B\r
+#define AUDIO_LAST_ERROR 0x000B\r
+\r
+/* audio device identifiers */\r
+#define AUDIO_DEVICE_NONE 0x0000\r
+#define AUDIO_DEVICE_MAPPER 0xFFFF\r
+\r
+/* audio product identifiers */\r
+#define AUDIO_PRODUCT_NONE 0x0000\r
+#define AUDIO_PRODUCT_SB 0x0001\r
+#define AUDIO_PRODUCT_SB15 0x0002\r
+#define AUDIO_PRODUCT_SB20 0x0003\r
+#define AUDIO_PRODUCT_SBPRO 0x0004\r
+#define AUDIO_PRODUCT_SB16 0x0005\r
+#define AUDIO_PRODUCT_AWE32 0x0006\r
+#define AUDIO_PRODUCT_WSS 0x0007\r
+#define AUDIO_PRODUCT_ESS 0x0008\r
+#define AUDIO_PRODUCT_GUS 0x0009\r
+#define AUDIO_PRODUCT_GUSDB 0x000A\r
+#define AUDIO_PRODUCT_GUSMAX 0x000B\r
+#define AUDIO_PRODUCT_IWAVE 0x000C\r
+#define AUDIO_PRODUCT_PAS 0x000D\r
+#define AUDIO_PRODUCT_PAS16 0x000E\r
+#define AUDIO_PRODUCT_ARIA 0x000F\r
+#define AUDIO_PRODUCT_WINDOWS 0x0100\r
+#define AUDIO_PRODUCT_LINUX 0x0101\r
+#define AUDIO_PRODUCT_SPARC 0x0102\r
+#define AUDIO_PRODUCT_SGI 0x0103\r
+#define AUDIO_PRODUCT_DSOUND 0x0104\r
+\r
+/* audio envelope bit fields */\r
+#define AUDIO_ENVELOPE_ON 0x0001\r
+#define AUDIO_ENVELOPE_SUSTAIN 0x0002\r
+#define AUDIO_ENVELOPE_LOOP 0x0004\r
+\r
+/* audio pattern bit fields */\r
+#define AUDIO_PATTERN_PACKED 0x0080\r
+#define AUDIO_PATTERN_NOTE 0x0001\r
+#define AUDIO_PATTERN_SAMPLE 0x0002\r
+#define AUDIO_PATTERN_VOLUME 0x0004\r
+#define AUDIO_PATTERN_COMMAND 0x0008\r
+#define AUDIO_PATTERN_PARAMS 0x0010\r
+\r
+/* audio module bit fields */\r
+#define AUDIO_MODULE_AMIGA 0x0000\r
+#define AUDIO_MODULE_LINEAR 0x0001\r
+#define AUDIO_MODULE_PANNING 0x8000\r
+\r
+#pragma pack(1)\r
+\r
+/* audio capabilities structure */\r
+typedef struct {\r
+ WORD wProductId; /* product identifier */\r
+ CHAR szProductName[30]; /* product name */\r
+ DWORD dwFormats; /* formats supported */\r
+} AUDIOCAPS, *LPAUDIOCAPS;\r
+\r
+/* audio format structure */\r
+typedef struct {\r
+ UINT nDeviceId; /* device identifier */\r
+ WORD wFormat; /* playback format */\r
+ WORD nSampleRate; /* sampling frequency */\r
+} AUDIOINFO, *LPAUDIOINFO;\r
+\r
+/* audio waveform structure */\r
+typedef struct {\r
+ LPBYTE lpData; /* data pointer */\r
+ DWORD dwHandle; /* waveform handle */\r
+ DWORD dwLength; /* waveform length */\r
+ DWORD dwLoopStart; /* loop start point */\r
+ DWORD dwLoopEnd; /* loop end point */\r
+ WORD nSampleRate; /* sampling rate */\r
+ WORD wFormat; /* format bits */\r
+} AUDIOWAVE, *LPAUDIOWAVE;\r
+\r
+\r
+/* audio envelope point structure */\r
+typedef struct {\r
+ WORD nFrame; /* envelope frame */\r
+ WORD nValue; /* envelope value */\r
+} AUDIOPOINT, *LPAUDIOPOINT;\r
+\r
+/* audio envelope structure */\r
+typedef struct {\r
+ AUDIOPOINT aEnvelope[AUDIO_MAX_POINTS]; /* envelope points */\r
+ BYTE nPoints; /* number of points */\r
+ BYTE nSustain; /* sustain point */\r
+ BYTE nLoopStart; /* loop start point */\r
+ BYTE nLoopEnd; /* loop end point */\r
+ WORD wFlags; /* envelope flags */\r
+ WORD nSpeed; /* envelope speed */\r
+} AUDIOENVELOPE, *LPAUDIOENVELOPE;\r
+\r
+/* audio sample structure */\r
+typedef struct {\r
+ CHAR szSampleName[32]; /* sample name */\r
+ BYTE nVolume; /* default volume */\r
+ BYTE nPanning; /* default panning */\r
+ BYTE nRelativeNote; /* relative note */\r
+ BYTE nFinetune; /* finetune */\r
+ AUDIOWAVE Wave; /* waveform handle */\r
+} AUDIOSAMPLE, *LPAUDIOSAMPLE;\r
+\r
+/* audio patch structure */\r
+typedef struct {\r
+ CHAR szPatchName[32]; /* patch name */\r
+ BYTE aSampleNumber[AUDIO_MAX_NOTES]; /* multi-sample table */\r
+ WORD nSamples; /* number of samples */\r
+ BYTE nVibratoType; /* vibrato type */\r
+ BYTE nVibratoSweep; /* vibrato sweep */\r
+ BYTE nVibratoDepth; /* vibrato depth */\r
+ BYTE nVibratoRate; /* vibrato rate */\r
+ WORD nVolumeFadeout; /* volume fadeout */\r
+ AUDIOENVELOPE Volume; /* volume envelope */\r
+ AUDIOENVELOPE Panning; /* panning envelope */\r
+ LPAUDIOSAMPLE aSampleTable; /* sample table */\r
+} AUDIOPATCH, *LPAUDIOPATCH;\r
+\r
+/* audio pattern structure */\r
+typedef struct {\r
+ WORD nPacking; /* packing type */\r
+ WORD nTracks; /* number of tracks */\r
+ WORD nRows; /* number of rows */\r
+ WORD nSize; /* data size */\r
+ LPBYTE lpData; /* data pointer */\r
+} AUDIOPATTERN, *LPAUDIOPATTERN;\r
+\r
+/* audio module structure */\r
+typedef struct {\r
+ CHAR szModuleName[32]; /* module name */\r
+ WORD wFlags; /* module flags */\r
+ WORD nOrders; /* number of orders */\r
+ WORD nRestart; /* restart position */\r
+ WORD nTracks; /* number of tracks */\r
+ WORD nPatterns; /* number of patterns */\r
+ WORD nPatches; /* number of patches */\r
+ WORD nTempo; /* initial tempo */\r
+ WORD nBPM; /* initial BPM */\r
+ BYTE aOrderTable[AUDIO_MAX_ORDERS]; /* order table */\r
+ BYTE aPanningTable[AUDIO_MAX_VOICES]; /* panning table */\r
+ LPAUDIOPATTERN aPatternTable; /* pattern table */\r
+ LPAUDIOPATCH aPatchTable; /* patch table */\r
+} AUDIOMODULE, *LPAUDIOMODULE;\r
+\r
+/* audio callback function defines */\r
+typedef VOID (AIAPI* LPFNAUDIOWAVE)(LPBYTE, UINT);\r
+typedef VOID (AIAPI* LPFNAUDIOTIMER)(VOID);\r
+typedef VOID (AIAPI* LPFNAUDIOCALLBACK)(BYTE, UINT, UINT);\r
+\r
+/* audio handle defines */\r
+typedef HANDLE HAC;\r
+typedef HAC* LPHAC;\r
+\r
+#pragma pack()\r
+\r
+\r
+/* audio interface API prototypes */\r
+UINT AIAPI AInitialize(VOID);\r
+UINT AIAPI AGetVersion(VOID);\r
+UINT AIAPI AGetAudioNumDevs(VOID);\r
+UINT AIAPI AGetAudioDevCaps(UINT nDeviceId, LPAUDIOCAPS lpCaps);\r
+UINT AIAPI AGetErrorText(UINT nErrorCode, LPSTR lpText, UINT nSize);\r
+\r
+UINT AIAPI APingAudio(LPUINT lpnDeviceId);\r
+UINT AIAPI AOpenAudio(LPAUDIOINFO lpInfo);\r
+UINT AIAPI ACloseAudio(VOID);\r
+UINT AIAPI AUpdateAudio(VOID);\r
+\r
+UINT AIAPI AOpenVoices(UINT nVoices);\r
+UINT AIAPI ACloseVoices(VOID);\r
+\r
+UINT AIAPI ASetAudioCallback(LPFNAUDIOWAVE lpfnAudioWave);\r
+UINT AIAPI ASetAudioTimerProc(LPFNAUDIOTIMER lpfnAudioTimer);\r
+UINT AIAPI ASetAudioTimerRate(UINT nTimerRate);\r
+\r
+LONG AIAPI AGetAudioDataAvail(VOID);\r
+UINT AIAPI ACreateAudioData(LPAUDIOWAVE lpWave);\r
+UINT AIAPI ADestroyAudioData(LPAUDIOWAVE lpWave);\r
+UINT AIAPI AWriteAudioData(LPAUDIOWAVE lpWave, DWORD dwOffset, UINT nCount);\r
+\r
+UINT AIAPI ACreateAudioVoice(LPHAC lphVoice);\r
+UINT AIAPI ADestroyAudioVoice(HAC hVoice);\r
+\r
+UINT AIAPI APlayVoice(HAC hVoice, LPAUDIOWAVE lpWave);\r
+UINT AIAPI APrimeVoice(HAC hVoice, LPAUDIOWAVE lpWave);\r
+UINT AIAPI AStartVoice(HAC hVoice);\r
+UINT AIAPI AStopVoice(HAC hVoice);\r
+\r
+UINT AIAPI ASetVoicePosition(HAC hVoice, LONG dwPosition);\r
+UINT AIAPI ASetVoiceFrequency(HAC hVoice, LONG dwFrequency);\r
+UINT AIAPI ASetVoiceVolume(HAC hVoice, UINT nVolume);\r
+UINT AIAPI ASetVoicePanning(HAC hVoice, UINT nPanning);\r
+\r
+UINT AIAPI AGetVoicePosition(HAC hVoice, LPLONG lpdwPosition);\r
+UINT AIAPI AGetVoiceFrequency(HAC hVoice, LPLONG lpdwFrequency);\r
+UINT AIAPI AGetVoiceVolume(HAC hVoice, LPUINT lpnVolume);\r
+UINT AIAPI AGetVoicePanning(HAC hVoice, LPUINT lpnPanning);\r
+UINT AIAPI AGetVoiceStatus(HAC hVoice, LPBOOL lpnStatus);\r
+\r
+UINT AIAPI APlayModule(LPAUDIOMODULE lpModule);\r
+UINT AIAPI AStopModule(VOID);\r
+UINT AIAPI APauseModule(VOID);\r
+UINT AIAPI AResumeModule(VOID);\r
+UINT AIAPI ASetModuleVolume(UINT nVolume);\r
+UINT AIAPI ASetModulePosition(UINT nOrder, UINT nRow);\r
+UINT AIAPI AGetModuleVolume(LPUINT lpnVolume);\r
+UINT AIAPI AGetModulePosition(LPUINT pnOrder, LPUINT lpnRow);\r
+UINT AIAPI AGetModuleStatus(LPBOOL lpnStatus);\r
+UINT AIAPI ASetModuleCallback(LPFNAUDIOCALLBACK lpfnAudioCallback);\r
+\r
+UINT AIAPI ALoadModuleFile(LPSTR lpszFileName,\r
+ LPAUDIOMODULE* lplpModule, DWORD dwFileOffset);\r
+UINT AIAPI AFreeModuleFile(LPAUDIOMODULE lpModule);\r
+\r
+UINT AIAPI ALoadWaveFile(LPSTR lpszFileName,\r
+ LPAUDIOWAVE* lplpWave, DWORD dwFileOffset);\r
+UINT AIAPI AFreeWaveFile(LPAUDIOWAVE lpWave);\r
+\r
+#ifdef __cplusplus\r
+};\r
+#endif\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+#include "verge.h"\r
+\r
+// *****\r
+// TODO: Move the chunk list from an array to a linked list?\r
+// Would eliminate hardcoded chunk limit, but would make\r
+// general operation slower. Probably not The Right Thing,\r
+// sides the chunk limit can be interesting sometimes. If\r
+// it becomes problematic, consider a Binary Tree.\r
+// *****\r
+\r
+// ***************************** Data *****************************\r
+\r
+#define MAXCHUNKS 1000\r
+#define PARANOID\r
+#define PADFILLVALUE 254\r
+#define PADSIZE 256\r
+\r
+typedef struct\r
+{\r
+ void *pointer;\r
+ int size;\r
+ int owner;\r
+ char desc[40];\r
+} memblockType;\r
+\r
+memblockType chunks[MAXCHUNKS+1];\r
+int numchunks=0;\r
+\r
+// ***************************** Code *****************************\r
+\r
+void *valloc(int amount, char *desc, int owner)\r
+{\r
+ if (numchunks == MAXCHUNKS)\r
+ err("Failed allocated %d bytes (%s), reason: Out of chunks.",\r
+ amount, desc);\r
+\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ chunks[numchunks].pointer = (void *) ((int) malloc(amount + (PADSIZE * 2)) + PADSIZE);\r
+ chunks[numchunks].size = amount;\r
+ memset((char *) chunks[numchunks].pointer - PADSIZE, PADFILLVALUE, PADSIZE);\r
+ memset((char *) chunks[numchunks].pointer +\r
+ chunks[numchunks].size, PADFILLVALUE, PADSIZE);\r
+#else\r
+ chunks[numchunks].pointer = malloc(amount);\r
+ chunks[numchunks].size = amount;\r
+#endif\r
+ chunks[numchunks].owner = owner;\r
+ strncpy(chunks[numchunks].desc, desc, 39);\r
+ return chunks[numchunks++].pointer;\r
+}\r
+\r
+void *qvalloc(int amount)\r
+{\r
+ void *ptr;\r
+\r
+ // Quick and dirty memory allocation. Should be used ONLY\r
+ // for temporary blocks in speed-critical loops.\r
+\r
+ ptr = malloc(amount);\r
+ if (!ptr) err("qvalloc: Failed allocating %d bytes.", amount);\r
+ return ptr;\r
+}\r
+\r
+void qvfree(void *ptr)\r
+{\r
+ free(ptr);\r
+}\r
+\r
+int TotalBytesAllocated(void)\r
+{\r
+ int i, tally=0;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ tally += chunks[i].size;\r
+\r
+ return tally;\r
+}\r
+\r
+int FindChunk(void *pointer)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].pointer == pointer) return i;\r
+ return -1;\r
+}\r
+\r
+void FreeChunk(int i)\r
+{\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ free((void *) ((int) chunks[i].pointer - PADSIZE));\r
+#else\r
+ free(chunks[i].pointer);\r
+#endif\r
+ for (; i<numchunks; i++)\r
+ chunks[i]=chunks[i+1];\r
+ numchunks--;\r
+}\r
+\r
+int v_free(void *ptr)\r
+{\r
+ int i=FindChunk(ptr);\r
+ if (i == -1)\r
+ {\r
+ Log("vfree: Attempted to free ptr %u that was not allocated. [dumping mem report]", ptr);\r
+ MemReport();\r
+ return -1;\r
+ }\r
+ FreeChunk(i);\r
+\r
+ return 0;\r
+}\r
+\r
+void FreeByOwner(int owner)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].owner == owner)\r
+ FreeChunk(i--);\r
+}\r
+\r
+void MemReport(void)\r
+{\r
+ int i;\r
+\r
+ Log("");\r
+ Log("========================================");\r
+ Log("= Memory usage report for this session =");\r
+ Log("========================================");\r
+ Log("Chunks currently allocated: %d (MAXCHUNKS %d)", numchunks, MAXCHUNKS);\r
+ Log("%d total bytes allocated. ", TotalBytesAllocated());\r
+#ifdef PARANOID\r
+ Log("PARANOID is ON. (pad size: %d pad value: %d)", PADSIZE, PADFILLVALUE);\r
+#else\r
+ Log("PARANOID is OFF.");\r
+#endif\r
+ Log("");\r
+ Log("Per-chunk analysis: ");\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ Log("[%3d] Ptr at: %8u size: %8d owner: %3d desc: %s",\r
+ i, chunks[i].pointer, chunks[i].size, chunks[i].owner, chunks[i].desc);\r
+ }\r
+}\r
+\r
+#ifdef PARANOID\r
+int ChunkIntegrity(int i)\r
+{\r
+ char *tptr;\r
+\r
+ tptr=(char *) malloc(PADSIZE);\r
+ memset(tptr, PADFILLVALUE, PADSIZE);\r
+ if (memcmp((char *) chunks[i].pointer - PADSIZE, tptr, PADSIZE))\r
+ return -1; // Prefix corruption\r
+ if (memcmp((char *) chunks[i].pointer + chunks[i].size, tptr, PADSIZE))\r
+ return 1; // Suffix corruption\r
+ free(tptr);\r
+ return 0; // no corruption\r
+}\r
+\r
+void CheckCorruption(void)\r
+{\r
+ int i, j;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ j=ChunkIntegrity(i);\r
+ if (!j) continue;\r
+ if (j == -1) { MemReport(); err("Prefix corruption on chunk %d.", i); }\r
+ if (j == 1) { MemReport(); err("Suffix corruption on chunk %d.", i); }\r
+ }\r
+}\r
+#else\r
+void CheckCorruption(void)\r
+{\r
+ return;\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MEMORY_H\r
+#define MEMORY_H\r
+\r
+extern void *valloc(int amount, char *desc, int owner);\r
+extern void *qvalloc(int amount);\r
+extern void qvfree(void *ptr);\r
+extern int TotalBytesAllocated(void);\r
+extern int FindChunk(void *pointer);\r
+extern void FreeChunk(int i);\r
+extern int vfree(void *pointer);\r
+extern void FreeByOwner(int owner);\r
+extern void MemReport(void);\r
+extern int ChunkIntegrity(int i);\r
+extern void CheckCorruption(void);\r
+\r
+// Standardized OID (Owner ID) values\r
+\r
+#define OID_TEMP 0\r
+#define OID_VFILE 1\r
+#define OID_IMAGE 2\r
+#define OID_MISC 3\r
+#define OID_MAP 4\r
+#define OID_VC 5\r
+\r
+#endif // MEMORY_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+byte cpu_watch, cpubyte=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void ListMounts()\r
+{ int i;\r
+\r
+ Con_NextLine();\r
+ sprintf(strbuf,"There are \81%d~ files mounted.",filesmounted);\r
+ Con_Printf(strbuf);\r
+ for (i=0; i<filesmounted; i++)\r
+ {\r
+ sprintf(strbuf,"File \80%s~ contains \81%d~ files.",pack[i].mountname, pack[i].numfiles);\r
+ Con_Printf(strbuf);\r
+ }\r
+}\r
+\r
+void PackInfo()\r
+{ int i,j;\r
+\r
+ Con_NextLine();\r
+ i=atoi((char *) args[1]);\r
+ sprintf(strbuf,"Files in %s:",pack[i].mountname);\r
+ Con_Printf(strbuf);\r
+\r
+ for (j=0; j<pack[i].numfiles; j++)\r
+ {\r
+ sprintf(strbuf,"\80%s~ ",pack[i].files[j].fname);\r
+ sprintf(&strbuf[20],"\81%d~ bytes",pack[i].files[j].size);\r
+ Con_Printf(strbuf);\r
+ }\r
+}\r
+\r
+void FileInfo()\r
+{ VFILE *f;\r
+\r
+ Con_NextLine();\r
+ sprintf(strbuf,"File stats for \80%s~:",args[1]);\r
+ Con_Printf(strbuf);\r
+\r
+ f=vopen((char *) args[1]);\r
+ if (!f)\r
+ {\r
+ Con_Printf("File not found.");\r
+ return;\r
+ }\r
+\r
+ if (f->s)\r
+ {\r
+ sprintf(strbuf,"File is in \80%s~, index \81%d~",pack[f->v].mountname, f->i);\r
+ Con_Printf(strbuf);\r
+ sprintf(strbuf,"Packofs: \81%d~ current ofs: \81%d~",pack[f->v].files[f->i].packofs,pack[f->v].files[f->i].curofs);\r
+ Con_Printf(strbuf);\r
+ if (pack[f->v].files[f->i].extractable)\r
+ Con_Printf("File is extractable.");\r
+ else Con_Printf("File is not extractable.");\r
+ if (pack[f->v].files[f->i].override)\r
+ Con_Printf("Override allowed.");\r
+ else Con_Printf("Override not allowed.");\r
+ }\r
+ else Con_Printf("File is external.");\r
+ sprintf(strbuf,"File is \81%d~ bytes.",filesize(f));\r
+ Con_Printf(strbuf);\r
+ vclose(f);\r
+}\r
+\r
+void vid_mode()\r
+{ int xres,yres;\r
+\r
+ xres=atoi((char *)args[1]);\r
+ yres=atoi((char *)args[2]);\r
+ Con_NextLine();\r
+\r
+ ShutdownVideo(0);\r
+ if (InitVideo(xres, yres))\r
+ {\r
+ Con_Printf("{||||||||||||}");\r
+ Con_Printf("Loading new video driver...");\r
+ Con_Printf(DriverDesc);\r
+ Con_Printf("{||||||||||||}");\r
+ }\r
+ else Con_Printf("Unsupported/unknown video mode.");\r
+ set_intensity(63);\r
+}\r
+\r
+void CPU_Usage()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"cpu_usage is \81%d~", cpu_watch);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else cpu_watch=atoi((char *) args[1]);\r
+}\r
+\r
+void Mount()\r
+{\r
+ MountVFile((char *) args[1]);\r
+ sprintf(strbuf,"%s mounted.",args[1]);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void ZeroConWarp(char **args)\r
+{\r
+ player->x=atoi(args[1])*16;\r
+ player->y=atoi(args[2])*16;\r
+ player->tx=atoi(args[1]);\r
+ player->ty=atoi(args[2]);\r
+}\r
+\r
+void ZeroConBrowseTiles(void)\r
+{\r
+ int x,y,n,k=0,a=0;\r
+\r
+ while(last_pressed!=SCAN_Q)\r
+ {\r
+ ClearScreen();\r
+ UpdateControls();\r
+ CheckMessages();\r
+ if(last_pressed==SCAN_A) { if(a) a=0; else a=1; last_pressed=0; }\r
+ if(last_pressed==SCAN_DOWN&&(k+(ty-3)*(tx-3)-tx+4)<numtiles)\r
+ {\r
+ k+=tx-4;\r
+ last_pressed=0;\r
+ }\r
+ if(last_pressed==SCAN_UP&&k>0)\r
+ {\r
+ k-=tx-4;\r
+ last_pressed=0;\r
+ }\r
+ for(y=1; y<ty-2; y++)\r
+ {\r
+ for(x=1; x<tx-3; x++)\r
+ {\r
+ n=((y-1)*(tx-4)+x-1+k);\r
+ if (n<numtiles)\r
+ {\r
+ if (!a) CopyTileClip(x*16,y*16,(unsigned char*)((unsigned int)vsp+((y-1)*(tx-4)+x-1+k)*256));\r
+ else CopyTileClip(x*16,y*16,(unsigned char*)((unsigned int)vsp+tileidx[(y-1)*(tx-4)+x-1+k]*256));\r
+ }\r
+\r
+ }\r
+ GotoXY((tx-2)*16-8,y*16+5);\r
+ sprintf(strbuf,"%i",(y-1)*(tx-4)+k);\r
+ printstring(0,strbuf);\r
+ }\r
+ GotoXY(16,(ty-1)*16-8);\r
+ printstring(0,"Hit Q to quit, A to toggle anim,");\r
+ GotoXY(16,(ty-1)*16);\r
+ printstring(0,"up/down to change tiles");\r
+ ShowPage();\r
+ }\r
+}\r
+\r
+void CameraTracking()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"cameratracking is \81%d~", cameratracking);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else cameratracking=atoi((char *) args[1]);\r
+}\r
+\r
+void ZeroSetRString(char **args)\r
+{\r
+ memcpy(rstring,args[1],strlen(args[1])+1);\r
+}\r
+\r
+void ZeroGetRString(void)\r
+{\r
+ sprintf(strbuf,"Renderstring: \80%s~",rstring);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void Obstructions()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"showobs is \81%d~", showobs);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else showobs=atoi((char *) args[1]);\r
+}\r
+\r
+void MoveGranularity()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"movegranularity is \81%d~", movegranularity);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else movegranularity=atoi((char *) args[1]);\r
+}\r
+\r
+void Phantom()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"phantom is \81%d~", phantom);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else phantom=atoi((char *) args[1]);\r
+}\r
+\r
+void CurPos()\r
+{\r
+ Con_NextLine();\r
+ sprintf(strbuf,"xwc: \82%d~ ywc: \82%d~", player->x, player->y); Con_Printf(strbuf);\r
+ sprintf(strbuf,"xtc: \82%d~ ytc: \82%d~", player->x>>4, player->y>>4); Con_Printf(strbuf);\r
+}\r
+\r
+void PlayerSpeed()\r
+{\r
+ if (!player)\r
+ {\r
+ Con_Printf("No player.");\r
+ return;\r
+ }\r
+ if (numargs==1)\r
+ {\r
+ Con_NextLine();\r
+ sprintf(strbuf,"speed is is \81%d~", player->speed);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else\r
+ {\r
+ player->speed=atoi((char *) args[1]);\r
+ player->speedct=0;\r
+ }\r
+}\r
+\r
+void Player()\r
+{ int i;\r
+\r
+ i=atoi((char *) args[1]);\r
+ if (i<entities)\r
+ {\r
+ player=&entity[i];\r
+ playernum=i;\r
+// entity[i].movecode=0;\r
+ entity[i].moving=0;\r
+ SiftEntities();\r
+ Con_Printf("Player updated.");\r
+ }\r
+ else Con_Printf("No such entity.");\r
+}\r
+\r
+void SpawnEntity()\r
+{ int i;\r
+\r
+ i=AllocateEntity(atoi((char *) args[1]), atoi((char *) args[2]), (char *) args[3]);\r
+ sprintf(strbuf,"Entity %d allocated.",i);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void ShowZones()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"showzones is \81%d~", showzone);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else showzone=atoi((char *) args[1]);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONLIB_H\r
+#define CONLIB_H\r
+\r
+#define ETC 0\r
+#define RENDER 1\r
+#define PFLIP 2\r
+\r
+extern byte cpu_watch, cpubyte;\r
+\r
+void ListMounts();\r
+void PackInfo();\r
+void FileInfo();\r
+void CD_Play();\r
+void vid_mode();\r
+void CPU_Usage();\r
+void Mount();\r
+void ZeroConWarp(char **args);\r
+void ZeroConBrowseTiles(void);\r
+void CameraTracking();\r
+void ZeroGetRString();\r
+void ZeroSetRString(char **args);\r
+void Obstructions();\r
+void MoveGranularity();\r
+void Phantom();\r
+void CurPos();\r
+void PlayerSpeed();\r
+void Player();\r
+void SpawnEntity();\r
+void ShowZones();\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define CONSOLE_H\r
+#include "verge.h"\r
+#define conwidth 40\r
+\r
+// ================================= Data ====================================\r
+\r
+byte *consolebg; // Console background image\r
+char *consoletext; // Console text buffer\r
+byte *cmd, *cmd2, cmdlen=0; // command line buffer\r
+char *lastcmds, numcmds=0, cmdpos=0; // last-command memory\r
+byte *args[10], numargs; // command argument pointers\r
+char cursor=1; // flag on/off cursor visible\r
+int cswtime=0; // cursor switch time.\r
+int conlines=1; // Number of visible lines\r
+int lines=0; // number of lines entered since last draw\r
+char startln=36; // Start display ofs (for scrollback)\r
+char allowconsole=1;\r
+char consoleoverride=0;\r
+\r
+byte key_ascii_tbl[128] =\r
+{\r
+ 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8, 9,\r
+ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 13, 0, 'a', 's',\r
+ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 39, 0, 0, 92, 'z', 'x', 'c', 'v',\r
+ 'b', 'n', 'm', ',', '.', '/', 0, '*', 0, ' ', 0, 3, 3, 3, 3, 8,\r
+ 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 0, 127, 0, 0, 92, 3, 3, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+byte key_shift_tbl[128] =\r
+{\r
+ 0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 126, 126,\r
+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 126, 0, 'A', 'S',\r
+ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', 34, 0, 0, '|', 'Z', 'X', 'C', 'V',\r
+ 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, 1, 0, 1, 1, 1, 1, 1,\r
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 1, 127, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+#define NUMCMDS 31\r
+char *concmds[] = {\r
+ "CONSOLEBG","LISTMOUNTS","PACKINFO","LISTCMDS","CD_PLAY","CD_STOP",\r
+ "CD_OPEN","CD_CLOSE","EXIT","VID_MODE","CPU_USAGE","MOUNT","MAP",\r
+ "VER","BROWSETILES","WARP","CAMERATRACKING","RSTRING","SHOWOBS",\r
+ "PHANTOM","ENTITYSTAT","ACTIVEENTS","ENTITY","CURPOS","PLAYERSPEED",\r
+ "SPEEDDEMON","RV","SV","PLAYER","SPAWNENTITY","SHOWZONES"\r
+ };\r
+byte sortedcmds[NUMCMDS];\r
+\r
+// ================================= Code ====================================\r
+\r
+void SortConCmds(void)\r
+/* -- ric: 03/Jun/98 --\r
+ * creates the sorted index into concmds\r
+ */\r
+{\r
+ int i,j;\r
+ int temp;\r
+\r
+ for (i=0; i<NUMCMDS; i++)\r
+ sortedcmds[i]=i;\r
+ for (i=1; i<NUMCMDS; i++)\r
+ {\r
+ for (j=NUMCMDS-1; j>=i; j--)\r
+ if (strcmp(concmds[sortedcmds[j-1]],concmds[sortedcmds[j]])>0)\r
+ {\r
+ // swap the indices\r
+ temp=sortedcmds[j-1];\r
+ sortedcmds[j-1]=sortedcmds[j];\r
+ sortedcmds[j]=temp;\r
+ }\r
+ }\r
+}\r
+\r
+void InitConsole(void)\r
+{\r
+ Logp("Initialize console.");\r
+ LoadFont("system.fnt");\r
+ consolebg=VLoadImageBuf("console.gif");\r
+\r
+ consoletext=(char *) valloc(45*50, "consoletext", OID_MISC);\r
+ cmd=(byte *) valloc(40, "InitConsole:cmd", OID_MISC);\r
+ cmd2=(byte *) valloc(40, "InitConsole:cmd2", OID_MISC);\r
+ memset(cmd, 0, 40);\r
+ memset(cmd2, 0, 40);\r
+ memset(consoletext, 0, 2250);\r
+\r
+ lastcmds=(char *) valloc(400, "InitConsole:lastcmds", OID_MISC);\r
+ memset(lastcmds, 0, 400);\r
+\r
+ SortConCmds();\r
+ LogDone();\r
+}\r
+\r
+void DrawConsole();\r
+\r
+void Con_Printf(char *str)\r
+{ char tbuf[2250];\r
+\r
+ // move buffer up a line\r
+ memcpy(tbuf, consoletext+50, 2200);\r
+ memcpy(consoletext, tbuf, 2200);\r
+\r
+ memcpy(consoletext+2200, str, strlen(str)+1);\r
+ lines++;\r
+}\r
+\r
+void Con_NextLine(void)\r
+{\r
+ Con_Printf("");\r
+ lines=0;\r
+}\r
+\r
+int ShowConsole(void)\r
+{\r
+ conlines+=2;\r
+ if (conlines > 120)\r
+ {\r
+ callback=0;\r
+ conlines=120;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int HideConsole(void)\r
+{\r
+ if (conlines > 3)\r
+ {\r
+ conlines-=2;\r
+ }\r
+ else\r
+ {\r
+ conlines=1;\r
+ callback=0;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void DrawConsole(void)\r
+{ int i;\r
+ int tagline=0;\r
+\r
+ lines=0;\r
+ tagline=conlines;\r
+\r
+ Render();\r
+ CopySpriteZoomClip(0,-120+tagline, 320,120, sx,120, consolebg);\r
+\r
+ // write console text\r
+\r
+ for (i=0; i<9; i++)\r
+ {\r
+ GotoXY(1, 1+(i*10)-(120-tagline));\r
+ printstring(0,consoletext+((startln+i)*50));\r
+ }\r
+\r
+ GotoXY(1,101-(120-tagline));\r
+ printstring(0,"]");\r
+ printstring(0,(char *) cmd);\r
+\r
+ if (systemtime>=cswtime)\r
+ {\r
+ cursor ^= 1;\r
+ cswtime = systemtime+40;\r
+ }\r
+\r
+ if (cursor) printstring(0, "&");\r
+\r
+ if (startln<36)\r
+ {\r
+ GotoXY(1, 91-(120-tagline));\r
+ printstring(0, "^ ^ ^ ^ ^ ^ ^ ^ ^ ^");\r
+ }\r
+}\r
+\r
+int Args(int num)\r
+{\r
+ if (numargs>=num) return 1;\r
+ sprintf(strbuf,"This function needs \81%d~ arguments.",num-1);\r
+ Con_Printf(strbuf);\r
+ return 0;\r
+}\r
+\r
+void ListCmds(void)\r
+{ int i;\r
+\r
+ Con_NextLine();\r
+ for (i=0; i<NUMCMDS; i++)\r
+ Con_Printf(concmds[sortedcmds[i]]);\r
+}\r
+\r
+void ConsoleBackground()\r
+{\r
+ vfree(consolebg);\r
+ consolebg=VLoadImageBuf((char *) args[1]);\r
+}\r
+\r
+void ExecuteCommand(int i)\r
+{\r
+ switch(i)\r
+ {\r
+ case 0: if (Args(2)) ConsoleBackground(); break;\r
+ case 1: ListMounts(); break;\r
+ case 2: if (Args(2)) PackInfo(); break;\r
+ case 3: ListCmds(); break;\r
+ case 4: break; //if (Args(2)) CD_Play(atoi((char *) args[1])); break;\r
+ case 5: break; //CD_Stop(); break;\r
+ case 6: break; //CD_Open_Door(); break;\r
+ case 7: break; //CD_Close_Door(); break;\r
+ case 8: err(""); break;\r
+ case 9: if (Args(3)) vid_mode(); break;\r
+ case 10: CPU_Usage(); break;\r
+ case 11: if (Args(2)) Mount(); break;\r
+ case 12: if (numargs<2) MAPstats(); else MAPswitch(); break;\r
+ case 13: ver(); break;\r
+ case 14: ZeroConBrowseTiles(); break;\r
+ case 15: if (numargs==3) ZeroConWarp((char**)args); else { Con_Printf("\82syntax:"); Con_Printf("Warp <x> <y>~"); } break;\r
+ case 16: CameraTracking(); break;\r
+ case 17: if (numargs==1) ZeroGetRString();\r
+ if (numargs==2) ZeroSetRString((char**)args); break;\r
+ case 18: Obstructions(); break;\r
+ case 19: Phantom(); break;\r
+ case 20: EntityStat(); break;\r
+ case 21: ListActiveEnts(); break;\r
+ case 22: if (Args(2)) EntityS(); break;\r
+ case 23: CurPos(); break;\r
+ case 24: PlayerSpeed(); break;\r
+ case 25: speeddemon=1; break;\r
+ case 26: ReadVCVar(); break;\r
+ case 27: WriteVCVar(); break;\r
+ case 28: if (Args(2)) Player(); break;\r
+ case 29: if (Args(4)) SpawnEntity(); break;\r
+ case 30: ShowZones(); break;\r
+ case NUMCMDS: Con_Printf((char *) cmd); break;\r
+ }\r
+}\r
+\r
+void ParseCommand(void)\r
+{ byte *src;\r
+ // breaks the command string into arguements and stuff. (in cmd2)\r
+\r
+ numargs=0;\r
+ src=(byte *) cmd2;\r
+ args[0]=src;\r
+\r
+ while (*src==' ') src++;\r
+\r
+ if (!*src) return;\r
+\r
+ while (1)\r
+ {\r
+ if (*src==' ')\r
+ {\r
+ while (*src== ' ')\r
+ {\r
+ *src=0;\r
+ src++;\r
+ }\r
+ if (*src)\r
+ {\r
+ numargs++;\r
+ args[numargs]=src;\r
+ }\r
+ src--;\r
+ }\r
+ src++;\r
+ if (!*src)\r
+ {\r
+ numargs++;\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void ProcessCommand(void)\r
+{ byte i;\r
+\r
+ memcpy(cmd2, cmd, 40);\r
+ strupr((char *) cmd2);\r
+ ParseCommand();\r
+\r
+ i=0;\r
+ while (i<NUMCMDS)\r
+ {\r
+ if (!strcmp(concmds[i], (char *) args[0])) break;\r
+ i++;\r
+ }\r
+ ExecuteCommand(i);\r
+ memcpy(lastcmds, lastcmds+40, 360);\r
+ memcpy(lastcmds+360, cmd, 40);\r
+ if (numcmds<10) numcmds++;\r
+ cmdpos=0;\r
+ memset(cmd, 0, 40);\r
+ cmdlen=0;\r
+}\r
+\r
+void CommandInput(void)\r
+{ byte c, len, cc;\r
+\r
+ UpdateControls();\r
+ if (!last_pressed) return;\r
+\r
+ // Handle the Shift key\r
+\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ c=key_shift_tbl[last_pressed];\r
+ }\r
+ else\r
+ {\r
+ c=key_ascii_tbl[last_pressed];\r
+ }\r
+\r
+ // Handle special cases first\r
+ if (last_pressed == SCAN_PGUP)\r
+ {\r
+ if (startln) startln--;\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_PGDN)\r
+ {\r
+ if (startln < 36) startln++;\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_UP)\r
+ {\r
+ if (cmdpos<numcmds)\r
+ {\r
+ cmdpos++;\r
+ memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);\r
+ cmdlen=strlen((char *) cmd);\r
+ }\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_DOWN)\r
+ {\r
+ if (cmdpos)\r
+ {\r
+ cmdpos--;\r
+ if (!cmdpos)\r
+ {\r
+ memset(cmd, 0, 40);\r
+ cmdlen=0;\r
+ }\r
+ else\r
+ {\r
+ memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);\r
+ cmdlen=strlen((char *) cmd);\r
+ }\r
+ }\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (!c)\r
+ {\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_BACKSP)\r
+ {\r
+ if (cmdlen)\r
+ {\r
+ cmdlen--;\r
+ cmd[cmdlen]=0;\r
+ }\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_TAB)\r
+ {\r
+ last_pressed=0;\r
+ len=strlen((char *) cmd);\r
+ if (!len) return;\r
+ for (cc=0; cc<NUMCMDS; cc++)\r
+ if (!strncasecmp((char *) cmd, concmds[sortedcmds[cc]], len))\r
+ {\r
+ memcpy((char *) cmd, concmds[sortedcmds[cc]], strlen(concmds[sortedcmds[cc]])+1);\r
+ strlwr((char *) cmd);\r
+ cmdlen=strlen((char *) cmd);\r
+ return;\r
+ }\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_ENTER)\r
+ {\r
+ ProcessCommand();\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (cmdlen<38)\r
+ {\r
+ cmd[cmdlen++]=c;\r
+ cmd[cmdlen]=0;\r
+ }\r
+\r
+ last_pressed=0;\r
+}\r
+\r
+void ActivateConsole(void)\r
+{\r
+ if (!allowconsole && !consoleoverride) return;\r
+ conlines=1;\r
+ callback=ShowConsole;\r
+ cswtime=systemtime+40;\r
+\r
+ while (!key[SCAN_RQUOTA])\r
+ {\r
+ DrawConsole();\r
+ ShowPage();\r
+ CheckMessages();\r
+ CommandInput();\r
+ }\r
+\r
+ callback=HideConsole;\r
+ while (conlines > 1)\r
+ {\r
+ CheckMessages();\r
+ DrawConsole();\r
+ ShowPage();\r
+ }\r
+ conlines=0;\r
+ key[SCAN_RQUOTA]=0;\r
+ timer_count=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONSOLE_H\r
+#define CONSOLE_H\r
+\r
+#include "main.h"\r
+\r
+// -- externs --\r
+\r
+extern byte *consolebg; // Console background image\r
+extern byte *consoletext; // Console text buffer\r
+extern byte *cmd, *cmd2, cmdlen; // command line buffer\r
+extern char *lastcmds, numcmds, cmdpos; // last-command memory\r
+extern byte *args[10], numargs; // command argument pointers\r
+extern char cursor, more; // flag on/off cursor visible\r
+extern int cswtime; // cursor switch time.\r
+extern int conlines; // Number of visible lines\r
+extern int lines; // number of lines entered since last draw\r
+extern char startln; // Start display ofs (for scrollback)\r
+extern char allowconsole;\r
+extern char consoleoverride;\r
+\r
+extern byte key_ascii_tbl[128];\r
+extern byte key_shift_tbl[128];\r
+\r
+extern char *concmds[];\r
+\r
+// -- prototypes --\r
+\r
+extern void InitConsole(void);\r
+extern void Con_Printf(char *str);\r
+extern void Con_NextLine(void);\r
+\r
+extern int ShowConsole(void);\r
+extern int HideConsole(void);\r
+\r
+extern void DrawConsole(void);\r
+extern int Args(int num);\r
+extern void ListCmds(void);\r
+extern void LastCmds(void);\r
+extern void ExecuteCommand(int i);\r
+extern void ParseCommand(void);\r
+extern void ProcessCommand(void);\r
+extern void CommandInput(void);\r
+extern void ActivateConsole(void);\r
+\r
+#endif // CONSOLE_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// -- Hardware Dependent -- //\r
+\r
+int kb1, kb2, kb3, kb4; // keyboard controls\r
+int jb1, jb2, jb3, jb4; // joystick controls\r
+\r
+// -- Unified Interface -- //\r
+\r
+char b1, b2, b3, b4;\r
+char up, down, left, right;\r
+\r
+// -- UnPress support variables -- //\r
+\r
+char wb1, wb2, wb3, wb4;\r
+char wup, wdown, wleft, wright;\r
+\r
+char rb1, rb2, rb3, rb4;\r
+char rup, rdown, rleft, rright;\r
+\r
+// ================================= Code ====================================\r
+\r
+void UpdateControls()\r
+{\r
+ rb1=0; rb2=0; rb3=0; rb4=0;\r
+ rup=0; rdown=0; rleft=0; rright=0;\r
+\r
+ if (key[SCAN_UP]) rup=1;\r
+ if (key[SCAN_DOWN]) rdown=1;\r
+ if (key[SCAN_RIGHT]) rright=1;\r
+ if (key[SCAN_LEFT]) rleft=1;\r
+\r
+ if (key[kb1]) rb1=1;\r
+ if (key[kb2]) rb2=1;\r
+ if (key[kb3]) rb3=1;\r
+ if (key[kb4]) rb4=1;\r
+\r
+ if (wb1 && rb1) rb1=0;\r
+ else if (wb1 && !rb1) wb1=0;\r
+ b1=rb1;\r
+\r
+ if (wb2 && rb2) rb2=0;\r
+ else if (wb2 && !rb2) wb2=0;\r
+ b2=rb2;\r
+\r
+ if (wb3 && rb3) rb3=0;\r
+ else if (wb3 && !rb3) wb3=0;\r
+ b3=rb3;\r
+\r
+ if (wb4 && rb4) rb4=0;\r
+ else if (wb4 && !rb4) wb4=0;\r
+ b4=rb4;\r
+\r
+ if (wup && rup) rup=0;\r
+ else if (wup && !rup) wup=0;\r
+ up=rup;\r
+\r
+ if (wdown && rdown) rdown=0;\r
+ else if (wdown && !rdown) wdown=0;\r
+ down=rdown;\r
+\r
+ if (wleft && rleft) rleft=0;\r
+ else if (wleft && !rleft) wleft=0;\r
+ left=rleft;\r
+\r
+ if (wright && rright) rright=0;\r
+ else if (wright && !rright) wright=0;\r
+ right=rright;\r
+}\r
+\r
+void UnPress(int control)\r
+{\r
+ switch (control)\r
+ {\r
+ case 0: wb1=1; wb2=1; wb3=1; wb4=1;\r
+ b1=0; b2=0; b3=0; b4=0;\r
+ key[kb1]=0; key[kb2]=0; key[kb3]=0; key[kb4]=0; break;\r
+ case 1: wb1=1; b1=0; key[kb1]=0; break;\r
+ case 2: wb2=1; b2=0; key[kb2]=0; break;\r
+ case 3: wb3=1; b3=0; key[kb3]=0; break;\r
+ case 4: wb4=1; b4=0; key[kb4]=0; break;\r
+ case 5: wup=1; up=0; key[SCAN_UP]=0; break;\r
+ case 6: wdown=1; down=0; key[SCAN_DOWN]=0; break;\r
+ case 7: wleft=1; left=0; key[SCAN_LEFT]=0; break;\r
+ case 8: wright=1; right=0; key[SCAN_RIGHT]=0; break;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONTROL_H\r
+#define CONTROL_H\r
+\r
+extern int kb1, kb2, kb3, kb4;\r
+extern int jb1, jb2, jb3, jb4;\r
+\r
+extern char b1, b2, b3, b4;\r
+extern char up, down, left, right;\r
+\r
+void UpdateControls();\r
+void UnPress(int);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero 5.7.99>\r
+// + added ScreenShot() on F11\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+\r
+#define ENGINE_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ word start; // strand start\r
+ word finish; // strand end\r
+ word delay; // tile-switch delay\r
+ word mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+zoneinfo zones[256]; // zone data records\r
+layer_r layer[6]; // Array of layer data\r
+vspanim_r vspanim[100]; // tile animation data\r
+unsigned short vadelay[100]; // Tile animation delay ctr\r
+\r
+char mapname[60]; // MAP filename\r
+char vspname[60]; // VSP filemap\r
+char musname[60]; // MAP bkgrd music default filename\r
+char rstring[20]; // render-order string\r
+char numlayers; // number of layers in map\r
+byte *obstruct, *zone; // obstruction and zone buffers\r
+char layertoggle[8]; // layer visible toggles\r
+word xstart, ystart; // MAP start x/y location\r
+int bufsize; // how many bytes need to be written\r
+int numzones; // number of active zones\r
+\r
+word *layers[6]; // Raw layer data\r
+int xwin=0, ywin=0; // camera offset\r
+\r
+// -- vsp data --\r
+\r
+byte *vsp=0,*vspmask; // VSP data buffer.\r
+unsigned short numtiles; // number of tiles in VSP.\r
+unsigned short *tileidx; // tile index thingamajig\r
+char *flipped; // bi-direction looping flag\r
+\r
+// entity stuffs\r
+\r
+char *msbuf[100]; // ptr-table to script offset\r
+char *ms; // script text buffer\r
+byte nms; // number of movescripts\r
+\r
+char numfollowers=0; // number of party followers\r
+byte follower[10]; // maximum of 10 followers.\r
+char laststeps[10]={ 0 }; // record of last movements\r
+int lastent;\r
+\r
+// -- stuff --\r
+\r
+byte movegranularity; // means nothing now, please remove\r
+byte movectr=0;\r
+\r
+byte phantom=0; // walk-through-walls\r
+byte speeddemon=0; // doublespeed cheat\r
+int bindarray[128]; // bind script offset\r
+\r
+// ================================= Code ====================================\r
+\r
+void ReadCompressedLayer1(byte *dest, int len, char *buf)\r
+{\r
+ int j,n;\r
+ byte run, w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ w=*buf; buf++;\r
+ if (w==0xFF)\r
+ {\r
+ run=*buf; buf++;\r
+ w=*buf; buf++;\r
+ for (j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while (n<len);\r
+}\r
+\r
+void ReadCompressedLayer2(word *dest, int len, word *buf)\r
+{\r
+ int j,n;\r
+ byte run;\r
+ word w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ w=*buf; buf++;\r
+ if ((w & 0xFF00)==0xFF00)\r
+ {\r
+ run=(w & 0x00FF);\r
+ w=*buf; buf++;\r
+ for(j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while(n<len);\r
+}\r
+\r
+void LoadVSP(char *fname)\r
+{\r
+ VFILE *f;\r
+ int i;\r
+ word ver;\r
+ char *cb;\r
+\r
+// Mwahaha! The Indefatigable Grue has snuck into the V2 source code! It is forever corrupted by his evil touch! Cower in fear, oh yes, FEAR! MwahahaHA..ha...hem...\r
+\r
+ if (!(f=vopen(fname))) err("*error* Could not open VSP file %s.",fname);\r
+ vread(&ver, 2, f);\r
+ vread(&pal, 768, f);\r
+ vread(&numtiles, 2, f);\r
+\r
+ vsp=(byte *) valloc(numtiles*256, "vsp", OID_IMAGE);\r
+ if (ver==2)\r
+ {\r
+ vread(vsp, (256*numtiles), f);\r
+ }\r
+ else\r
+ {\r
+ vread(&i, 4, f);\r
+ cb=(char *) valloc(i, "LoadVSP:cb", OID_TEMP);\r
+ vread(cb, i, f);\r
+ ReadCompressedLayer1(vsp, 256*numtiles, cb);\r
+ vfree(cb);\r
+ }\r
+ vread(&vspanim, sizeof vspanim, f);\r
+ vclose(f);\r
+\r
+ // Now calculate VSP transparency mask.\r
+\r
+ vspmask=(byte *) valloc(numtiles*256, "vspmask", OID_MISC);\r
+ for (i=0; i<(numtiles*256); i++)\r
+ {\r
+ if (vsp[i]) vspmask[i]=0;\r
+ else vspmask[i]=255;\r
+ }\r
+\r
+ // Allocate and build tileidx.\r
+\r
+ tileidx=(unsigned short *) valloc(numtiles*2, "tileidx", OID_MISC);\r
+ for (i=0; i<numtiles; i++)\r
+ tileidx[i]=i;\r
+\r
+ flipped=(char *) valloc(numtiles, "flipped", OID_MISC);\r
+ animate=TRUE;\r
+}\r
+\r
+void FreeVSP()\r
+{\r
+ animate=FALSE;\r
+ vfree(vsp);\r
+ vfree(vspmask);\r
+ vfree(tileidx);\r
+ vfree(flipped);\r
+ vfree(mapvc);\r
+}\r
+\r
+void LoadMAP(char *fname)\r
+{\r
+ VFILE *f;\r
+ char *cb;\r
+ int i;\r
+\r
+// No matter where you go, you're there.\r
+\r
+ Logp("Loading MAP %s.",fname);\r
+ memcpy(mapname, fname, strlen(fname)+1);\r
+ memcpy(strbuf, "MAPù5", 6);\r
+ if (!(f=vopen(fname))) err("Could not find %s.",fname);\r
+ vread(strbuf, 6, f);\r
+ if (strcmp(strbuf,"MAPù5"))\r
+ err("%s is not a recognized MAP file.",fname);\r
+\r
+// Lalala! Can you find Waldo hiding in the code? Here's a hint, he likes to dress like a candy-cane.\r
+\r
+ vread(&i, 4, f);\r
+ vread(vspname, 60, f);\r
+ vread(musname, 60, f);\r
+ vread(rstring, 20, f);\r
+ vread(&xstart, 2, f);\r
+ vread(&ystart, 2, f);\r
+ vread(strbuf, 51, f);\r
+ vread(&numlayers, 1, f);\r
+ for (i=0; i<numlayers; i++)\r
+ vread(&layer[i], 12, f);\r
+\r
+ memset(&layertoggle, 0, 8);\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ vread(&bufsize, 4, f);\r
+ layers[i]=(unsigned short *) valloc(layer[i].sizex*(layer[i].sizey+2)*2, "LoadMAP:layers[i]", OID_MAP);\r
+ cb=(char *) valloc(bufsize, "LoadMAP:cb", OID_TEMP);\r
+ vread(cb, bufsize, f);\r
+ ReadCompressedLayer2(layers[i],(layer[i].sizex * layer[i].sizey), (word *) cb);\r
+ vfree(cb);\r
+ layertoggle[i]=1;\r
+ }\r
+ obstruct=(byte *) valloc(layer[0].sizex*(layer[0].sizey+2), "obstruct", OID_MAP);\r
+ zone=(byte *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone", OID_MAP);\r
+\r
+ vread(&bufsize, 4, f);\r
+ cb=(char *) valloc(bufsize, "LoadMAP:cb (2)", OID_TEMP);\r
+ vread(cb, bufsize, f);\r
+ ReadCompressedLayer1(obstruct,(layer[0].sizex * layer[0].sizey), cb);\r
+ vfree(cb);\r
+ vread(&bufsize, 4, f);\r
+ cb=(char *) valloc(bufsize, "LoadMAP:cb (3)", OID_TEMP);\r
+ vread(cb, bufsize, f);\r
+ ReadCompressedLayer1(zone,(layer[0].sizex * layer[0].sizey), cb);\r
+ vfree(cb);\r
+ memset(&zones, 0, sizeof zones);\r
+ vread(&numzones, 4, f);\r
+ vread(&zones, numzones*50, f);\r
+\r
+ memset(&chrlist, 0, sizeof chrlist);\r
+ vread(&nmchr, 1, f);\r
+ vread(&chrlist, 60*nmchr, f);\r
+\r
+// Cheese is good, cheese is nice. Cheese is better, than body lice.\r
+\r
+ memset(&entity, 0, sizeof entity);\r
+ vread(&entities, 1, f);\r
+ vread(&entity, (sizeof(entity)/256*entities), f);\r
+ for (i=0; i<entities; i++)\r
+ {\r
+ entity[i].tx=entity[i].x;\r
+ entity[i].ty=entity[i].y;\r
+ entity[i].x*=16;\r
+ entity[i].y*=16;\r
+ }\r
+\r
+ vread(&nms, 1, f);\r
+ vread(&i, 4, f);\r
+ vread(&msbuf, nms*4, f);\r
+ if (nms)\r
+ {\r
+ ms=(char *) valloc(i, "LoadMAP:ms", OID_MAP);\r
+ vread(ms, i, f);\r
+ }\r
+ else\r
+ {\r
+ vseek(f, i, 0);\r
+ ms=(char *) malloc(16);\r
+ }\r
+ vread(&i, 4, f); // # of things\r
+ LoadMapVC(f);\r
+ vclose(f);\r
+\r
+ memset(&chr, 0, sizeof chr);\r
+ LoadVSP(vspname);\r
+ LoadCHRList();\r
+ Logp(" [%d] ",mapevents);\r
+ if (strlen(musname))\r
+ PlayMusic(musname);\r
+ LogDone();\r
+ ExecuteEvent(0);\r
+}\r
+\r
+void FreeMAP()\r
+{\r
+ int i;\r
+\r
+ vfree(obstruct);\r
+ vfree(zone);\r
+ for (i=0; i<numlayers; i++)\r
+ vfree(layers[i]);\r
+ vfree(ms);\r
+ player=0;\r
+ memset(&entity, 0, sizeof entity);\r
+ entities=0; nmchr=0; numchrs=0;\r
+ xwin=0; ywin=0;\r
+ vfree(mapvc);\r
+}\r
+\r
+void MAPswitch()\r
+{\r
+ hookretrace=0;\r
+ hooktimer=0;\r
+ kill=1;\r
+ memcpy(startmap, (char *) args[1], strlen((char *) args[1]));\r
+ key[SCAN_RQUOTA]=1;\r
+ conlines=2;\r
+}\r
+\r
+// The_Edge rules. Really. I mean it. Wyrdwad too. They're as cool as Omniphile!\r
+\r
+void MAPstats()\r
+{ int a;\r
+\r
+ Con_NextLine();\r
+ Con_Printf("{||||||||||||||||||||}");\r
+ sprintf(strbuf,"MAP stats for \80%s~ - \81%d~ layers",mapname,numlayers); Con_Printf(strbuf);\r
+ sprintf(strbuf,"Base dimensions \81%d~ x \81%d~", layer[0].sizex, layer[0].sizey);\r
+ Con_Printf(strbuf); a=layer[0].sizex*layer[0].sizey;\r
+ sprintf(strbuf,"MAP using \81%d~ bytes of memory",\r
+ a*(2+(numlayers*2))); Con_Printf(strbuf);\r
+ sprintf(strbuf,"\81%d~ active zones.",numzones); Con_Printf(strbuf);\r
+ Con_Printf("{||||||||||||||||||||}");\r
+ sprintf(strbuf,"VSP file: \80%s~",vspname); Con_Printf(strbuf);\r
+ sprintf(strbuf,"VSP has \81%d~ tiles using \81%d~ bytes",numtiles,\r
+ (numtiles*256)+800+(numtiles*3)); Con_Printf(strbuf);\r
+ Con_Printf("{||||||||||||||||||||}");\r
+}\r
+\r
+int PlayerObstructed(char dir)\r
+{\r
+ if (phantom) return 0;\r
+ switch (dir)\r
+ {\r
+ case 0: if (ObstructionAt(player->tx, player->ty+1)) return 1; break;\r
+ case 1: if (ObstructionAt(player->tx, player->ty-1)) return 1; break;\r
+ case 2: if (ObstructionAt(player->tx-1, player->ty)) return 1; break;\r
+ case 3: if (ObstructionAt(player->tx+1, player->ty)) return 1; break;\r
+ }\r
+ switch (dir)\r
+ {\r
+ case 0: if (EntityObsAt(player->tx, player->ty+1)) return 1; break;\r
+ case 1: if (EntityObsAt(player->tx, player->ty-1)) return 1; break;\r
+ case 2: if (EntityObsAt(player->tx-1, player->ty)) return 1; break;\r
+ case 3: if (EntityObsAt(player->tx+1, player->ty)) return 1; break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void CheckZone()\r
+{\r
+ int curzone;\r
+ static int lz=0, zonedelay=0;\r
+\r
+ curzone=zone[(player->ty * layer[0].sizex) + player->tx];\r
+ if (lz!=curzone)\r
+ {\r
+ zonedelay=0;\r
+ lz=curzone;\r
+ }\r
+ if (!zones[curzone].percent) return;\r
+ if (zonedelay < zones[curzone].delay)\r
+ {\r
+ zonedelay++;\r
+ return;\r
+ }\r
+ if (curzone)\r
+ if (zones[curzone].script &&\r
+ zones[curzone].percent >= rnd(0,255))\r
+ {\r
+ ExecuteEvent(zones[curzone].script);\r
+ zonedelay=0;\r
+ }\r
+}\r
+\r
+int InvFace()\r
+{\r
+ switch(player -> facing)\r
+ {\r
+ case 0: return 1;\r
+ case 1: return 0;\r
+ case 2: return 3;\r
+ case 3: return 2;\r
+ }\r
+ return -1;\r
+}\r
+\r
+void Activate()\r
+{\r
+ byte tz;\r
+ int ax=0, ay=0;\r
+\r
+ switch(player->facing)\r
+ {\r
+ case 0: ax=player->tx; ay=player->ty+1; break;\r
+ case 1: ax=player->tx; ay=player->ty-1; break;\r
+ case 2: ax=player->tx-1; ay=player->ty; break;\r
+ case 3: ax=player->tx+1; ay=player->ty; break;\r
+ }\r
+ tz=zone[(ay*layer[0].sizex)+ax];\r
+ if (zones[tz].aaa)\r
+ {\r
+ ExecuteEvent(zones[tz].script);\r
+ return;\r
+ }\r
+ if ((tz=EntityAt(ax, ay)))\r
+ {\r
+ tz--;\r
+ if (entity[tz].face)\r
+ {\r
+ entity[tz].facing=InvFace();\r
+ AnimateEntity(&entity[tz]);\r
+ }\r
+ if (entity[tz].actscript)\r
+ {\r
+ lastent=tz;\r
+ ExecuteEvent(entity[tz].actscript);\r
+ }\r
+ }\r
+}\r
+\r
+void ResetFollowers()\r
+{\r
+ int i;\r
+\r
+ player->x=player->tx<<4;\r
+ player->y=player->ty<<4;\r
+ player->moving=0;\r
+ player->movecnt=0;\r
+ player->reset=1;\r
+ for (i=0; i<numfollowers; i++)\r
+ {\r
+ entity[follower[i]].x=player->x;\r
+ entity[follower[i]].y=player->y;\r
+ entity[follower[i]].tx=player->tx;\r
+ entity[follower[i]].ty=player->ty;\r
+ entity[follower[i]].facing=player->facing;\r
+ entity[follower[i]].reset=1;\r
+ }\r
+ memset(laststeps, 0, 10);\r
+}\r
+\r
+void MoveFollowers()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numfollowers; i++)\r
+ {\r
+ entity[follower[i]].moving=laststeps[i+1];\r
+ entity[follower[i]].movecnt=15;\r
+ if (entity[follower[i]].reset ||\r
+ entity[follower[i]].facing != laststeps[i+1]-1)\r
+ {\r
+ //player->animofs=chr[player->chrindex].uanim;\r
+ entity[follower[i]].delayct=0;\r
+ entity[follower[i]].reset=0;\r
+ }\r
+ entity[follower[i]].facing=laststeps[i+1]-1;\r
+ }\r
+}\r
+\r
+//--- zero 5.7.99\r
+\r
+void WritePalette(FILE *f)\r
+{ char b;\r
+ int i;\r
+ byte pal3[768];\r
+\r
+ for (i=0; i<768; i++)\r
+ pal3[i]=pal2[i] << 2;\r
+\r
+ b=12; fwrite(&b, 1, 1, f);\r
+ fwrite(pal3, 1, 768, f);\r
+}\r
+\r
+void WritePCXLine(unsigned char *p,int len,FILE *pcxf)\r
+{ int i;\r
+ unsigned char byt, samect, repcode;\r
+\r
+ i=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<(unsigned) 63 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1 || (byt & 0xC0) != 0)\r
+ {\r
+ repcode=0xC0 | samect;\r
+ fwrite(&repcode,1,1,pcxf);\r
+ }\r
+ fwrite(&byt,1,1,pcxf);\r
+ } while (i<len);\r
+}\r
+\r
+\r
+void ScreenShot()\r
+{\r
+ unsigned char b1;\r
+ unsigned short int w1;\r
+ int i,n;\r
+ char fnamestr[13];\r
+ static int ss=0;\r
+ FILE *pcxf;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+ pcxf=fopen(fnamestr,"r");\r
+ i=(int)pcxf;\r
+ if(pcxf) fclose(pcxf);\r
+ n++;\r
+ } while(i);\r
+ n--;\r
+\r
+ // Takes a snapshot of the current screen.\r
+\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+\r
+ pcxf=fopen(fnamestr,"wb");\r
+ ss++;\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=sx-1; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+ w1=sy-1; fwrite(&w1, 1, 2, pcxf); // ymax = 199;\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w1=sy; fwrite(&w1, 1, 2, pcxf); // vres = 200;\r
+\r
+ fwrite(screen,1,48,pcxf);\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(screen, 1, 59, pcxf); // filler\r
+\r
+ for (w1=0; w1<sy; w1++)\r
+ WritePCXLine(screen+w1*tsx, sx, pcxf);\r
+\r
+ WritePalette(pcxf);\r
+ fclose(pcxf);\r
+// timer_count=0;\r
+}\r
+//---\r
+\r
+\r
+void LastMove(char dir)\r
+{\r
+ laststeps[9]=laststeps[8];\r
+ laststeps[8]=laststeps[7];\r
+ laststeps[7]=laststeps[6];\r
+ laststeps[6]=laststeps[5];\r
+ laststeps[5]=laststeps[4];\r
+ laststeps[4]=laststeps[3];\r
+ laststeps[3]=laststeps[2];\r
+ laststeps[2]=laststeps[1];\r
+ laststeps[1]=laststeps[0];\r
+ laststeps[0]=dir;\r
+\r
+ MoveFollowers();\r
+}\r
+\r
+void ProcessControls1()\r
+{\r
+ if (!player->moving)\r
+ {\r
+ if (down && !PlayerObstructed(0))\r
+ {\r
+ player->ty++;\r
+ player->moving=1;\r
+ player->movecnt=15;\r
+ player->y++;\r
+ if (player->reset || player->facing != 0)\r
+ {\r
+ player->animofs=chr[player->chrindex].danim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=0;\r
+ LastMove(1);\r
+ return;\r
+ }\r
+ if (up && !PlayerObstructed(1))\r
+ {\r
+ player->ty--;\r
+ player->moving=2;\r
+ player->movecnt=15;\r
+ player->y--;\r
+ if (player->reset || player->facing != 1)\r
+ {\r
+ player->animofs=chr[player->chrindex].uanim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=1;\r
+ LastMove(2);\r
+ return;\r
+ }\r
+ if (left && !PlayerObstructed(2))\r
+ {\r
+ player->tx--;\r
+ player->moving=3;\r
+ player->movecnt=15;\r
+ player->x--;\r
+ if (player->reset || player->facing != 2)\r
+ {\r
+ player->animofs=chr[player->chrindex].lanim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=2;\r
+ LastMove(3);\r
+ return;\r
+ }\r
+ if (right && !PlayerObstructed(3))\r
+ {\r
+ player->tx++;\r
+ player->moving=4;\r
+ player->movecnt=15;\r
+ player->x++;\r
+ if (player->reset || player->facing != 3)\r
+ {\r
+ player->animofs=chr[player->chrindex].ranim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=3;\r
+ LastMove(4);\r
+ return;\r
+ }\r
+ if (down) player->facing=0;\r
+ if (up) player->facing=1;\r
+ if (left) player->facing=2;\r
+ if (right) player->facing=3;\r
+ }\r
+\r
+ switch (player->moving)\r
+ {\r
+ case 0: player->reset=1; player->animofs=0; player->delayct=0; break;\r
+ case 1: player->y++; player->movecnt--; break;\r
+ case 2: player->y--; player->movecnt--; break;\r
+ case 3: player->x--; player->movecnt--; break;\r
+ case 4: player->x++; player->movecnt--; break;\r
+ }\r
+ if (!player->movecnt && player->moving)\r
+ {\r
+ player->moving=0;\r
+ CheckZone();\r
+ }\r
+ if (!player->movecnt && b1) Activate();\r
+}\r
+\r
+void ProcessControls()\r
+{ int i;\r
+\r
+ if (key[SCAN_RQUOTA])\r
+ {\r
+ key[SCAN_RQUOTA]=0; last_pressed=0;\r
+ ActivateConsole();\r
+ }\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+//--- zero 5.7.99\r
+ if (key[SCAN_F11])\r
+ {\r
+ Message("ss",50);\r
+ ScreenShot();\r
+ key[SCAN_F11]=0;\r
+ }\r
+//---\r
+ if (!player) return;\r
+\r
+ if (player->speed<4)\r
+ {\r
+ switch (player->speed)\r
+ {\r
+ case 1: if (player->speedct<3) { player->speedct++; return; } break;\r
+ case 2: if (player->speedct<2) { player->speedct++; return; } break;\r
+ case 3: if (player->speedct<1) { player->speedct++; return; } break;\r
+ }\r
+ }\r
+ if (player->speed<5)\r
+ {\r
+ ProcessControls1();\r
+ player->speedct=0;\r
+ AnimateEntity(player);\r
+ }\r
+ switch (player->speed)\r
+ {\r
+ case 5: for (i=0; i<2; i++) { ProcessControls1(); AnimateEntity(player); } return;\r
+ case 6: for (i=0; i<3; i++) { ProcessControls1(); AnimateEntity(player); } return;\r
+ case 7: for (i=0; i<4; i++) { ProcessControls1(); AnimateEntity(player); } return;\r
+ }\r
+}\r
+\r
+void GameTick()\r
+{\r
+ UpdateControls();\r
+ CheckMessages();\r
+ if (bindarray[last_pressed])\r
+ HookKey(bindarray[last_pressed]);\r
+ ProcessControls();\r
+ if (speeddemon && key[SCAN_CTRL]) ProcessControls();\r
+ ProcessEntities();\r
+}\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero 5.7.99>\r
+// + added ScreenShot() headers\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+\r
+#ifndef ENGINE_H\r
+#define ENGINE_H\r
+\r
+typedef struct\r
+{\r
+ word start; // strand start\r
+ word finish; // strand end\r
+ word delay; // tile-switch delay\r
+ word mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+extern layer_r layer[4]; // Array of layer data\r
+extern vspanim_r vspanim[100]; // tile animation data\r
+extern unsigned short vadelay[100]; // Tile animation delay ctr\r
+\r
+extern char mapname[60]; // MAP filename\r
+extern char vspname[60]; // VSP filemap\r
+extern char rstring[20]; // render-order string\r
+extern char numlayers; // number of layers in map\r
+extern byte *obstruct, *zone; // obstruction and zone buffers\r
+extern int bufsize; // how many bytes need to be written\r
+extern char layertoggle[4]; // layer visible toggles\r
+\r
+extern word *layers[4]; // Raw layer data\r
+extern int xwin, ywin;\r
+\r
+// -- entity things --\r
+\r
+extern char *msbuf[100]; // ptr-table to script offset\r
+extern char *ms; // script text buffer\r
+extern byte nms; // number of movescripts\r
+\r
+extern char numfollowers; // number of party followers\r
+extern byte follower[10]; // maximum of 10 followers.\r
+extern char laststeps[10]; // record of last movements\r
+extern int lastent;\r
+\r
+// -- vsp data --\r
+\r
+extern byte *vsp,*vspmask; // VSP data buffer.\r
+extern unsigned short numtiles; // number of tiles in VSP.\r
+extern unsigned short *tileidx; // tile index thingamajig\r
+extern char *flipped; // bi-direction looping flag\r
+extern byte movegranularity, phantom, speeddemon, movectr;\r
+extern int bindarray[128];\r
+\r
+// -- prototypes --\r
+\r
+extern void LoadVSP(char *fname);\r
+extern void FreeVSP(void);\r
+extern void LoadMAP(char *fname);\r
+extern void FreeMAP(void);\r
+extern void MAPswitch(void);\r
+extern void MAPstats(void);\r
+extern void ProcessControls(void);\r
+extern void GameTick(void);\r
+\r
+extern void ReadCompressedLayer1(byte*, int, char*);\r
+\r
+//--- zero 5.7.99\r
+void WritePalette(FILE *f);\r
+void WritePCXLine(unsigned char *p,int len,FILE *pcxf);\r
+void ScreenShot();\r
+//\r
+#endif // ENGINE_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero, 5.6.98>\r
+// + corrected oversight in movement script management by sticking a hack in\r
+// MoveScript(). Bug caused Fx commands to not work sometimes.\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#define ENTITY_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *scriptofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ byte *imagedata; // CHR frame data\r
+ int fxsize, fysize; // frame x/y dimensions\r
+ int hx, hy; // x/y obstruction hotspot\r
+ int totalframes; // total # of frames.\r
+ int lidle, ridle;\r
+ int uidle, didle;\r
+ char lanim[100];\r
+ char ranim[100];\r
+ char uanim[100];\r
+ char danim[100];\r
+} chrdata;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+chrlist_r chrlist[100];\r
+byte nmchr,playernum;\r
+entity_r *player=0;\r
+entity_r entity[256];\r
+byte entities=0;\r
+chrdata chr[100];\r
+byte numchrs=0;\r
+byte entidx[256], cc;\r
+byte movesuccess;\r
+\r
+// ================================= Code ====================================\r
+\r
+int ObstructionAt(int tx, int ty)\r
+{\r
+ if (obstruct[(ty*layer[0].sizex)+tx]) return 1;\r
+ if (tx==-1 || ty==-1) return 1;\r
+ if (tx==layer[0].sizex || ty==layer[0].sizey) return 1;\r
+ return 0;\r
+}\r
+\r
+int Zone(int tx, int ty)\r
+{\r
+ return zone[(ty*layer[0].sizex)+tx];\r
+}\r
+\r
+void LoadCHR(char *fname, chrdata *c)\r
+{\r
+ VFILE *f;\r
+ char b, *ptr=0;\r
+ int i;\r
+\r
+ f=vopen(fname);\r
+ if (!f) err("Could not open CHR file %s.",fname);\r
+ vread(&b, 1, f);\r
+ if (b!=2) err("CHR %s incorrect CHR format version.",fname);\r
+ vread(&c->fxsize, 2, f);\r
+ vread(&c->fysize, 2, f);\r
+ vread(&c->hx, 2, f);\r
+ vread(&c->hy, 2, f);\r
+ vread(strbuf, 4, f); // skip the hotspot size.\r
+ vread(&c->totalframes, 2, f);\r
+\r
+ vread(&i, 4, f);\r
+ ptr=(char *) valloc(i, "LoadCHR:ptr", OID_TEMP);\r
+ vread(ptr, i, f);\r
+ c->imagedata=(byte *) valloc(c->fxsize * c->fysize * c->totalframes, "LoadCHR:c->imagedata", OID_IMAGE);\r
+ ReadCompressedLayer1(c->imagedata, c->fxsize * c->fysize * c->totalframes, ptr);\r
+ vfree(ptr);\r
+\r
+\r
+ vread(&c->lidle, 4, f);\r
+ vread(&c->ridle, 4, f);\r
+ vread(&c->uidle, 4, f);\r
+ vread(&c->didle, 4, f);\r
+\r
+ for (b=0; b<4; b++)\r
+ {\r
+ switch (b)\r
+ {\r
+ case 0: ptr=c->lanim; break;\r
+ case 1: ptr=c->ranim; break;\r
+ case 2: ptr=c->uanim; break;\r
+ case 3: ptr=c->danim; break;\r
+ }\r
+ vread(&i, 4, f);\r
+ if (i>100) err("Animation strand too long. %d",i);\r
+ vread(ptr, i, f);\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+int CacheCHR(char *fname)\r
+{\r
+ LoadCHR(fname, &chr[numchrs]);\r
+ numchrs++;\r
+ return (numchrs-1);\r
+}\r
+\r
+void FreeCHRList()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchrs; i++)\r
+ vfree(chr[i].imagedata);\r
+ memset(chr, i, sizeof chr);\r
+}\r
+\r
+void LoadCHRList()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<nmchr; i++)\r
+ if (strlen(chrlist[i].t)) CacheCHR(chrlist[i].t);\r
+}\r
+\r
+void DrawEntity(int i)\r
+{\r
+ int a, b, dx, dy;\r
+\r
+ dx=entity[i].x-xwin;\r
+ dy=entity[i].y-ywin;\r
+ a=entity[i].chrindex;\r
+ if (a>=numchrs) return;\r
+ b=entity[i].specframe ? entity[i].specframe : entity[i].frame;\r
+ TCopySpriteClip(dx-chr[a].hx, dy-chr[a].hy, chr[a].fxsize, chr[a].fysize,\r
+ (byte *) (chr[a].imagedata+(b*chr[a].fxsize*\r
+ chr[a].fysize)));\r
+}\r
+\r
+static int cmpent(const void* a, const void* b)\r
+{\r
+ return entity[*(byte*)a].y - entity[*(byte*)b].y;\r
+}\r
+\r
+void RenderEntities()\r
+{\r
+ int i;\r
+\r
+ qsort(entidx, cc, 1, cmpent);\r
+ for (i=0; i<cc; i++) DrawEntity(entidx[i]);\r
+}\r
+\r
+int GetArg(entity_r *p)\r
+{\r
+ int j;\r
+ static char token[10];\r
+\r
+ j=0;\r
+ while (*p->animofs==' ') p->animofs++;\r
+ while (*p->animofs>=48 && *p->animofs<=57)\r
+ {\r
+ token[j]=*p->animofs;\r
+ p->animofs++;\r
+ j++;\r
+ }\r
+ token[j]=0;\r
+ return atoi(token);\r
+}\r
+\r
+void GetNextCommand(entity_r *p)\r
+{\r
+ byte s;\r
+\r
+ while (*p->animofs==' ') p->animofs++;\r
+ s=*p->animofs;\r
+ p->animofs++;\r
+ switch (s)\r
+ {\r
+ case 'F': p->frame=GetArg(p); break;\r
+ case 'W': p->delayct=GetArg(p); break;\r
+ case 0: if (p->moving)\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=chr[p->chrindex].danim; break;\r
+ case 1: p->animofs=chr[p->chrindex].uanim; break;\r
+ case 2: p->animofs=chr[p->chrindex].lanim; break;\r
+ case 3: p->animofs=chr[p->chrindex].ranim; break;\r
+ }\r
+ else\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=0; p->frame=chr[p->chrindex].didle; break;\r
+ case 1: p->animofs=0; p->frame=chr[p->chrindex].uidle; break;\r
+ case 2: p->animofs=0; p->frame=chr[p->chrindex].lidle; break;\r
+ case 3: p->animofs=0; p->frame=chr[p->chrindex].ridle; break;\r
+ }\r
+ p->delayct=0; break;\r
+ }\r
+}\r
+\r
+void AnimateEntity(entity_r *p)\r
+{\r
+ if (!p->animofs && p->moving)\r
+ {\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=chr[p->chrindex].danim; break;\r
+ case 1: p->animofs=chr[p->chrindex].uanim; break;\r
+ case 2: p->animofs=chr[p->chrindex].lanim; break;\r
+ case 3: p->animofs=chr[p->chrindex].ranim; break;\r
+ }\r
+ p->delayct=0;\r
+ }\r
+ if (!p->animofs && !p->moving)\r
+ {\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=0; p->frame=chr[p->chrindex].didle; break;\r
+ case 1: p->animofs=0; p->frame=chr[p->chrindex].uidle; break;\r
+ case 2: p->animofs=0; p->frame=chr[p->chrindex].lidle; break;\r
+ case 3: p->animofs=0; p->frame=chr[p->chrindex].ridle; break;\r
+ }\r
+ p->delayct=0;\r
+ }\r
+ if (p->delayct)\r
+ {\r
+ p->delayct--;\r
+ }\r
+ else GetNextCommand(p);\r
+}\r
+\r
+int EntityAt(int ex, int ey)\r
+{ int i;\r
+\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ if (&entity[entidx[i]]==player) continue;\r
+ if (ex==entity[entidx[i]].tx && ey==entity[entidx[i]].ty)\r
+ return entidx[i]+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int EntityObsAt(int ex, int ey)\r
+{ int i;\r
+\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ if (&entity[entidx[i]]==player) continue;\r
+ if (ex==entity[entidx[i]].tx && ey==entity[entidx[i]].ty &&\r
+ entity[entidx[i]].obsmode2)\r
+ return entidx[i]+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int AEntityObsAt(int ex, int ey)\r
+{ int i;\r
+\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ if (ex==entity[entidx[i]].tx && ey==entity[entidx[i]].ty &&\r
+ entity[entidx[i]].obsmode2)\r
+ return entidx[i]+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void SiftEntities()\r
+{ int i, dx, dy;\r
+\r
+ memset(&entidx, 0, 256); cc=0;\r
+ for (i=0; i<entities; i++)\r
+ {\r
+ dx=entity[i].x-xwin+16;\r
+ dy=entity[i].y-ywin+16;\r
+\r
+ if (dx<0 || dx>sx+chr[entity[i].chrindex].fxsize) continue;\r
+ if (dy<0 || dy>sy+chr[entity[i].chrindex].fysize) continue;\r
+ entidx[cc]=i; cc++;\r
+ }\r
+}\r
+\r
+void MoveRight(int i)\r
+{\r
+ int tx,ty;\r
+\r
+ tx=entity[i].tx+1; ty=entity[i].ty;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+ if (entity[i].facing!=3)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].x++; entity[i].facing=3; entity[i].moving=4; entity[i].ctr=15;\r
+ entity[i].tx++; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void MoveLeft(int i)\r
+{\r
+ int tx, ty;\r
+\r
+ tx=entity[i].tx-1; ty=entity[i].ty;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+\r
+ if (entity[i].facing!=2)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].x--; entity[i].facing=2; entity[i].moving=3; entity[i].ctr=15;\r
+ entity[i].tx--; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void MoveUp(int i)\r
+{\r
+ int tx, ty;\r
+\r
+ tx=entity[i].tx; ty=entity[i].ty-1;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+ if (entity[i].facing!=1)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].y--; entity[i].facing=1; entity[i].moving=2; entity[i].ctr=15;\r
+ entity[i].ty--; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void MoveDown(int i)\r
+{\r
+ int tx, ty;\r
+\r
+ tx=entity[i].tx; ty=entity[i].ty+1;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+ if (entity[i].facing!=0)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].y++; entity[i].facing=0; entity[i].moving=1; entity[i].ctr=15;\r
+ entity[i].ty++; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void Wander1(int i)\r
+{\r
+ if (!entity[i].data1)\r
+ {\r
+ entity[i].data2=rnd(0,3);\r
+ entity[i].data1=entity[i].step+1;\r
+ }\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr++;\r
+ if (entity[i].delayctr>=entity[i].delay)\r
+ entity[i].data1=0;\r
+ return;\r
+ }\r
+ if (entity[i].data1>1)\r
+ {\r
+ switch(entity[i].data2)\r
+ {\r
+ case 0: MoveUp(i); break;\r
+ case 1: MoveDown(i); break;\r
+ case 2: MoveLeft(i); break;\r
+ case 3: MoveRight(i); break;\r
+ }\r
+ entity[i].data1--;\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr=0;\r
+ entity[i].animofs=0;\r
+ entity[i].delayct=0;\r
+ }\r
+ }\r
+}\r
+\r
+void Wander2(int i)\r
+{\r
+ if (!entity[i].data1)\r
+ {\r
+ entity[i].data3=rnd(0,3);\r
+ entity[i].data1=entity[i].step+1;\r
+ }\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr++;\r
+ if (entity[i].delayctr>=entity[i].delay)\r
+ entity[i].data1=0;\r
+ return;\r
+ }\r
+ if (entity[i].data1>1)\r
+ {\r
+ switch(entity[i].data3)\r
+ {\r
+ case 0: if (Zone(entity[i].tx,entity[i].ty-1)==entity[i].data2) MoveUp(i); break;\r
+ case 1: if (Zone(entity[i].tx,entity[i].ty+1)==entity[i].data2) MoveDown(i); break;\r
+ case 2: if (Zone(entity[i].tx-1,entity[i].ty)==entity[i].data2) MoveLeft(i); break;\r
+ case 3: if (Zone(entity[i].tx+1,entity[i].ty)==entity[i].data2) MoveRight(i); break;\r
+ }\r
+ entity[i].data1--;\r
+ if (entity[i].data1==1) entity[i].delayctr=0;\r
+ }\r
+}\r
+\r
+void Wander3(int i)\r
+{\r
+ if (!entity[i].data1)\r
+ {\r
+ entity[i].data2=rnd(0,3);\r
+ entity[i].data1=entity[i].step+1;\r
+ }\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr++;\r
+ if (entity[i].delayctr>=entity[i].delay)\r
+ entity[i].data1=0;\r
+ return;\r
+ }\r
+ if (entity[i].data1>1)\r
+ {\r
+ switch(entity[i].data2)\r
+ {\r
+ case 0: if (entity[i].ty>entity[i].data3) MoveUp(i); break;\r
+ case 1: if (entity[i].ty<entity[i].data6) MoveDown(i); break;\r
+ case 2: if (entity[i].tx>entity[i].data2) MoveLeft(i); break;\r
+ case 3: if (entity[i].tx<entity[i].data5) MoveRight(i); break;\r
+ }\r
+ entity[i].data1--;\r
+ if (entity[i].data1==1) entity[i].delayct=0;\r
+ }\r
+}\r
+\r
+void Whitespace(int i)\r
+{\r
+ while (*entity[i].scriptofs==' ')\r
+ entity[i].scriptofs++;\r
+}\r
+\r
+void GetArgMS(int i)\r
+{ int j;\r
+ char token[10];\r
+\r
+ j=0;\r
+ Whitespace(i);\r
+ while (*entity[i].scriptofs>=48 && *entity[i].scriptofs<=57)\r
+ {\r
+ token[j]=*entity[i].scriptofs;\r
+ entity[i].scriptofs++;\r
+ j++;\r
+ }\r
+ token[j]=0;\r
+ entity[i].data1=atoi(token);\r
+}\r
+\r
+void GetNextCommandMS(int i)\r
+{ unsigned char s;\r
+\r
+ Whitespace(i);\r
+ s=*entity[i].scriptofs;\r
+ entity[i].scriptofs++;\r
+ switch (s)\r
+ {\r
+ case 'U': entity[i].mode=1; GetArgMS(i); break;\r
+ case 'D': entity[i].mode=2; GetArgMS(i); break;\r
+ case 'L': entity[i].mode=3; GetArgMS(i); break;\r
+ case 'R': entity[i].mode=4; GetArgMS(i); break;\r
+ case 'S': entity[i].mode=5; GetArgMS(i); break;\r
+ case 'W': entity[i].mode=6; GetArgMS(i); entity[i].animofs=0;\r
+ entity[i].delayct=0; break;\r
+ case 0: switch (entity[i].facing)\r
+ {\r
+ case 0: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].didle; break;\r
+ case 1: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].uidle; break;\r
+ case 2: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].lidle; break;\r
+ case 3: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].ridle; break;\r
+ }\r
+ entity[i].movecode=0; entity[i].mode=7; entity[i].data1=0;\r
+ entity[i].scriptofs=0; entity[i].delayct=0; break;\r
+ case 'C': entity[i].mode=8; GetArgMS(i); break;\r
+ case 'B': entity[i].mode=9; break;\r
+ case 'X': entity[i].mode=10; GetArgMS(i); break;\r
+ case 'Y': entity[i].mode=11; GetArgMS(i); break;\r
+ case 'F': entity[i].mode=12; GetArgMS(i); break;\r
+ case 'Z': entity[i].mode=13; GetArgMS(i); break;\r
+ default: err("Invalid entity movement script.");\r
+ }\r
+}\r
+\r
+void MoveScript(int i)\r
+{\r
+ if (!entity[i].scriptofs) entity[i].scriptofs=(char *) (int) ms+(int) msbuf[entity[i].movescript];\r
+ if (!entity[i].mode) GetNextCommandMS(i);\r
+\r
+ switch(entity[i].mode)\r
+ {\r
+ case 1: MoveUp(i); if (movesuccess) entity[i].data1--; break;\r
+ case 2: MoveDown(i); if (movesuccess) entity[i].data1--; break;\r
+ case 3: MoveLeft(i); if (movesuccess) entity[i].data1--; break;\r
+ case 4: MoveRight(i); if (movesuccess) entity[i].data1--; break;\r
+ case 5: entity[i].speed=entity[i].data1; entity[i].data1=0; break;\r
+ case 6: entity[i].data1--; break;\r
+ case 7: return;\r
+ case 8: ExecuteEvent(entity[i].data1); entity[i].data1=0; break;\r
+ case 9: entity[i].scriptofs=(char *) (int) ms+(int) msbuf[entity[i].movescript];\r
+ entity[i].data1=0; break;\r
+ case 10: if (entity[i].tx<entity[i].data1) MoveRight(i);\r
+ if (entity[i].tx>entity[i].data1) MoveLeft(i);\r
+ if (entity[i].tx==entity[i].data1) entity[i].data1=0; break;\r
+ break;\r
+ case 11: if (entity[i].ty<entity[i].data1) MoveDown(i);\r
+ if (entity[i].ty>entity[i].data1) MoveUp(i);\r
+ if (entity[i].ty==entity[i].data1) entity[i].data1=0; break;\r
+ break;\r
+ case 12: entity[i].facing=entity[i].data1;\r
+ entity[i].data1=0;\r
+ //--- zero 5.6.99\r
+ switch(entity[i].facing)\r
+ {\r
+ case 0: entity[i].frame=chr[entity[i].chrindex].didle; break;\r
+ case 1: entity[i].frame=chr[entity[i].chrindex].uidle; break;\r
+ case 2: entity[i].frame=chr[entity[i].chrindex].lidle; break;\r
+ case 3: entity[i].frame=chr[entity[i].chrindex].ridle; break;\r
+ }\r
+ //---\r
+ break;\r
+ case 13: entity[i].specframe=entity[i].data1;\r
+ entity[i].data1=0; break;\r
+ }\r
+ if (!entity[i].data1) entity[i].mode=0;\r
+}\r
+\r
+void TestActive(int i)\r
+{\r
+ int dx, dy;\r
+\r
+ dx=abs(entity[i].x - player->x);\r
+ dy=abs(entity[i].y - player->y);\r
+ if ((dx<=16 && dy<=3) || (dx<=3 && dy<=16))\r
+ {\r
+ if (!entity[i].expand4 && !invc)\r
+ {\r
+ entity[i].expand4=1;\r
+ ExecuteEvent(entity[i].actscript);\r
+ }\r
+ }\r
+ else\r
+ entity[i].expand4=0;\r
+}\r
+\r
+void ProcessEntity1(int i)\r
+{\r
+ entity[i].speedct=0;\r
+ if (entity[i].actm) TestActive(i);\r
+\r
+ if (!entity[i].moving)\r
+ {\r
+ switch(entity[i].movecode)\r
+ {\r
+ case 0: return;\r
+ case 1: Wander1(i); break;\r
+ case 2: Wander2(i); break;\r
+ case 3: Wander3(i); break;\r
+ case 4: MoveScript(i); break;\r
+ default: err("unknown entity movement pattern.");\r
+ }\r
+ if (!entity[i].reset) return;\r
+ }\r
+\r
+ if (entity[i].reset)\r
+ {\r
+ entity[i].animofs=0;\r
+ entity[i].delayct=0;\r
+ entity[i].reset=0;\r
+ }\r
+\r
+ if (entity[i].moving)\r
+ {\r
+ if (entity[i].moving==1)\r
+ { entity[i].y++; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (entity[i].moving==2)\r
+ { entity[i].y--; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (entity[i].moving==4)\r
+ { entity[i].x++; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (entity[i].moving==3)\r
+ { entity[i].x--; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (!entity[i].ctr) { entity[i].reset=1; entity[i].moving=0; }\r
+ }\r
+}\r
+\r
+void ProcessEntity(int i)\r
+{ int j;\r
+\r
+ if (player==&entity[i]) return;\r
+ if (entity[i].speed<4)\r
+ {\r
+ switch (entity[i].speed)\r
+ {\r
+ case 1: if (entity[i].speedct<3) { entity[i].speedct++; return; }\r
+ case 2: if (entity[i].speedct<2) { entity[i].speedct++; return; }\r
+ case 3: if (entity[i].speedct<1) { entity[i].speedct++; return; }\r
+ }\r
+ }\r
+ if (entity[i].speed<5)\r
+ {\r
+ ProcessEntity1(i);\r
+ entity[i].speedct=0;\r
+ }\r
+ switch (entity[i].speed)\r
+ {\r
+ case 5: for (j=0; j<2; j++) { ProcessEntity1(i); } return;\r
+ case 6: for (j=0; j<3; j++) { ProcessEntity1(i); } return;\r
+ case 7: for (j=0; j<4; j++) { ProcessEntity1(i); } return;\r
+ }\r
+}\r
+\r
+void ProcessEntities()\r
+{\r
+ int i;\r
+\r
+ SiftEntities();\r
+ for (i=0; i<entities; i++) ProcessEntity(i);\r
+}\r
+\r
+void EntityStat()\r
+{\r
+ Con_NextLine();\r
+ sprintf(strbuf,"There are \82%d~ entities on this map.",entities);\r
+ Con_Printf(strbuf);\r
+ sprintf(strbuf,"\82%d~ of those are onscreen / active.",cc);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void ListActiveEnts()\r
+{ int i;\r
+\r
+ Con_NextLine();\r
+ Con_Printf("Active entities:");\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ sprintf(strbuf,"\82%d~",entidx[i]);\r
+ Con_Printf(strbuf);\r
+ }\r
+}\r
+\r
+void EntityS()\r
+{ int i;\r
+\r
+ i=atoi((char *) args[1]);\r
+ Con_NextLine();\r
+\r
+ sprintf(strbuf,"Desc: \82%s~", entity[i].desc); Con_Printf(strbuf);\r
+ sprintf(strbuf,"tx: \82%d~ ty: \82%d~", entity[i].tx, entity[i].ty); Con_Printf(strbuf);\r
+ sprintf(strbuf,"CHR index: %d", entity[i].chrindex); Con_Printf(strbuf);\r
+}\r
+\r
+int AllocateEntity(int x1, int y1, char *fname)\r
+{\r
+ entity[entities].chrindex=CacheCHR(fname);\r
+ entity[entities].x=x1*16;\r
+ entity[entities].y=y1*16;\r
+ entity[entities].tx=x1;\r
+ entity[entities].ty=y1;\r
+ entity[entities].speed=4;\r
+ entity[entities].obsmode1=1;\r
+ entity[entities].obsmode2=1;\r
+ entities++;\r
+ return (entities-1);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef ENTITY_H\r
+#define ENTITY_H\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *scriptofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct\r
+{\r
+ byte *imagedata; // CHR frame data\r
+ int fxsize, fysize; // frame x/y dimensions\r
+ int hx, hy; // x/y obstruction hotspot\r
+ int totalframes; // total # of frames.\r
+ int lidle, ridle;\r
+ int uidle, didle;\r
+ char lanim[100];\r
+ char ranim[100];\r
+ char uanim[100];\r
+ char danim[100];\r
+} chrdata;\r
+\r
+extern chrlist_r chrlist[100];\r
+extern byte nmchr, playernum;\r
+extern entity_r *player;\r
+extern entity_r entity[256];\r
+extern chrdata chr[100];\r
+extern byte entities, numchrs;\r
+extern byte entidx[256], cc;\r
+\r
+void RenderEntities();\r
+void AnimateEntity(entity_r *p);\r
+void ProcessEntities();\r
+void SiftEntities();\r
+void LoadCHRList();\r
+void FreeCHRList();\r
+void EntityStat();\r
+void ListActiveEnts();\r
+void EntityS();\r
+int EntityAt(int ex, int ey);\r
+int EntityObsAt(int ex, int ey);\r
+int ObstructionAt(int ex, int ey);\r
+int CacheCHR(char *fname);\r
+int AllocateEntity(int x1, int y1, char *fname);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ported by aen\r
+\r
+#define FLI_H\r
+#include <sys/stat.h>\r
+#include <fcntl.h>\r
+#include <unistd.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#ifndef __WATCOMC__\r
+#define INT_MAX 0xFFFFFFFF\r
+#define INT_MIN 0\r
+#endif\r
+\r
+#ifndef MIN\r
+#define MIN(x,y) (((x) < (y)) ? (x) : (y))\r
+#define MAX(x,y) (((x) > (y)) ? (x) : (y))\r
+#define MID(x,y,z) MAX((x), MIN((y), (z)))\r
+#endif\r
+\r
+#ifndef ABS\r
+#define ABS(x) (((x) >= 0) ? (x) : (-(x)))\r
+#endif\r
+\r
+#ifndef SGN\r
+#define SGN(x) (((x) >= 0) ? 1 : -1)\r
+#endif\r
+\r
+#define FLI_MAGIC 0xAF11 // file header magic number\r
+#define FLC_MAGIC 0xAF12 // file magic number (Pro)\r
+#define FLI_FRAME_MAGIC 0xF1FA // frame header magic number\r
+#define FLI_FRAME_PREFIX 0xF100 // FLC's prefix info\r
+#define FLI_FRAME_USELESS 0x00A1 // FLC's garbage frame\r
+\r
+typedef struct\r
+{\r
+ int w,h;\r
+ byte *data;\r
+} BITMAP;\r
+\r
+#define FLI_OK 0 /* FLI player return values */\r
+#define FLI_EOF -1\r
+#define FLI_ERROR -2\r
+#define FLI_NOT_OPEN -3\r
+\r
+#ifdef __WATCOMC__\r
+#define PACKED\r
+#pragma pack(1);\r
+#endif\r
+\r
+#ifdef __DJGPP__\r
+#define PACKED __attribute__ ((packed))\r
+#endif\r
+\r
+typedef struct\r
+{\r
+ long size PACKED;\r
+ word type PACKED;\r
+ word frame_count PACKED;\r
+ word width PACKED;\r
+ word height PACKED;\r
+ word bpp PACKED;\r
+ word flags PACKED;\r
+ word speed PACKED;\r
+ long next_head PACKED;\r
+ long frames_in_table PACKED;\r
+ char reserved[102] PACKED;\r
+} FLI_HEADER;\r
+\r
+typedef struct\r
+{\r
+ quad size PACKED;\r
+ word type PACKED;\r
+ word chunks PACKED;\r
+ char pad[8] PACKED;\r
+} FLI_FRAME;\r
+\r
+typedef struct\r
+{\r
+ quad size PACKED;\r
+ word type PACKED;\r
+} FLI_CHUNK;\r
+\r
+#ifdef __WATCOMC__\r
+#pragma pack();\r
+#endif\r
+\r
+static int fli_status = FLI_NOT_OPEN; // current state of the FLI player\r
+\r
+int fli_bitmap_width = 0;\r
+int fli_bitmap_height = 0;\r
+byte *fli_bitmap_data = NULL; // current frame of the FLI\r
+byte fli_palette[768]; // current palette the FLI is using\r
+\r
+int fli_bmp_dirty_from = INT_MAX; // what part of fli_bitmap is dirty\r
+int fli_bmp_dirty_to = INT_MIN;\r
+int fli_pal_dirty_from = INT_MAX; // what part of fli_palette is dirty\r
+int fli_pal_dirty_to = INT_MIN;\r
+\r
+int fli_frame = 0; // current frame number in the FLI\r
+long speed;\r
+\r
+static int fli_file = 0; // the file we are reading\r
+\r
+static byte *fli_mem_data = NULL; // the memory FLI we are playing\r
+static int fli_mem_pos = 0; // position in the memory FLI\r
+\r
+static FLI_HEADER fli_header; // header structure\r
+static FLI_FRAME frame_header; // frame header structure\r
+\r
+// a block of temporary working memory\r
+byte *_scratch_mem = NULL;\r
+int _scratch_mem_size = 0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void reset_fli_variables(void);\r
+void close_fli(void);\r
+int next_fli_frame(int);\r
+int open_fli(char *);\r
+int open_memory_fli(byte *);\r
+\r
+void _grow_scratch_mem(int size)\r
+{\r
+ if (size > _scratch_mem_size) {\r
+ size = (size+1023) & 0xFFFFFC00;\r
+ _scratch_mem = realloc(_scratch_mem, size);\r
+ _scratch_mem_size = size;\r
+ }\r
+}\r
+\r
+void vsync()\r
+{\r
+ while (!(inp(986) & 8));\r
+}\r
+\r
+void set_palette_range(byte *pal, int from, int to, int sync)\r
+{\r
+ int i;\r
+\r
+ // swap?\r
+ if (to<from) { int t=from; from=to; to=t; }\r
+\r
+ // keep valid\r
+ if (from<0) from=0;\r
+ if (to>=256) to=255;\r
+\r
+ if (sync) vsync();\r
+\r
+ outp(968, from);\r
+ for (i=from; i<=to; i++)\r
+ {\r
+ outp(969, pal[(i*3)+0]);\r
+ outp(969, pal[(i*3)+1]);\r
+ outp(969, pal[(i*3)+2]);\r
+ }\r
+}\r
+\r
+static byte *fli_read(byte *buf, int size)\r
+{\r
+ int result;\r
+\r
+ if (fli_mem_data)\r
+ {\r
+ if (buf)\r
+ memcpy(buf, fli_mem_data+fli_mem_pos, size);\r
+ else\r
+ buf = fli_mem_data+fli_mem_pos;\r
+\r
+ fli_mem_pos += size;\r
+ }\r
+ else\r
+ {\r
+ if (!buf)\r
+ {\r
+ _grow_scratch_mem(size);\r
+ buf = _scratch_mem;\r
+ }\r
+\r
+ result = read(fli_file, buf, size);\r
+ if (result != size)\r
+ return NULL;\r
+ }\r
+ return buf;\r
+}\r
+\r
+static void fli_seek(int offset, int mode)\r
+{\r
+ if (fli_mem_data)\r
+ {\r
+ if (mode == SEEK_CUR)\r
+ fli_mem_pos += offset;\r
+ else\r
+ fli_mem_pos = offset;\r
+ }\r
+ else\r
+ lseek(fli_file, offset, mode);\r
+}\r
+\r
+// helpers for reading FLI chunk data\r
+#define READ_BYTE() ((sz-- > 0) ? *(((byte *)p)++) : 0)\r
+#define READ_CHAR() ((sz-- > 0) ? *(((signed char *)p)++) : 0)\r
+#define READ_SHORT() (((sz-=2) > 0) ? *(((signed short *)p)++) : 0)\r
+\r
+#define READ_BLOCK(pos, size) \\r
+ { \\r
+ if (sz >= (size)) \\r
+ { \\r
+ memcpy(pos, p, size); \\r
+ p += (size); \\r
+ sz -= (size); \\r
+ } \\r
+ else \\r
+ { \\r
+ char *_p = (char *)(pos); \\r
+ int _c; \\r
+ \\r
+ for (_c=0; _c < (size); _c++) \\r
+ *(_p++) = READ_BYTE(); \\r
+ } \\r
+ }\r
+\r
+#define READ_RLE_BYTE(pos, size) \\r
+ { \\r
+ memset(pos, READ_BYTE(), size); \\r
+ }\r
+\r
+#define READ_RLE_WORD(pos, size) \\r
+ { \\r
+ short *_p = (short *)(pos); \\r
+ short _v = READ_SHORT(); \\r
+ int _c; \\r
+ \\r
+ for (_c=0; _c < (size); _c++) \\r
+ *(_p++) = _v; \\r
+ }\r
+\r
+static void do_fli_256_color(byte *p, int sz)\r
+{\r
+ int packets;\r
+ int c, c2;\r
+ int offset;\r
+ int length;\r
+\r
+ offset = 0;\r
+ packets = READ_SHORT();\r
+ for (c=0; c<packets; c++)\r
+ {\r
+ offset += READ_BYTE();\r
+ length = READ_BYTE();\r
+ if (length == 0) length = 256;\r
+ for (c2=0; c2<length; c2++)\r
+ {\r
+ fli_palette[((offset+c2)*3)+0] = READ_BYTE() / 4;\r
+ fli_palette[((offset+c2)*3)+1] = READ_BYTE() / 4;\r
+ fli_palette[((offset+c2)*3)+2] = READ_BYTE() / 4;\r
+ }\r
+ fli_pal_dirty_from = MIN(fli_pal_dirty_from, offset);\r
+ fli_pal_dirty_to = MAX(fli_pal_dirty_to, offset+length-1);\r
+ offset += length;\r
+ }\r
+}\r
+\r
+static void do_fli_delta(byte *p, int sz)\r
+{\r
+ int lines;\r
+ int packets;\r
+ int size;\r
+ int x, y;\r
+\r
+ y = 0;\r
+ lines = READ_SHORT();\r
+\r
+ // for each line...\r
+ while (lines-- > 0)\r
+ {\r
+ packets = READ_SHORT();\r
+\r
+ while (packets < 0)\r
+ {\r
+ if (packets & 0x4000)\r
+ y -= packets;\r
+ else\r
+ fli_bitmap_data[(y*fli_bitmap_width)+fli_bitmap_width-1]=packets&0xff;\r
+ //fli_bitmap->line[y][fli_bitmap->w-1] = packets & 0xFF;\r
+\r
+ packets = READ_SHORT();\r
+ }\r
+ x=0;\r
+ while (packets-- > 0)\r
+ {\r
+ // skip bytes\r
+ x += READ_BYTE();\r
+\r
+ size = READ_CHAR();\r
+\r
+ // copy size words\r
+ if (size > 0)\r
+ {\r
+ READ_BLOCK(fli_bitmap_data+(y*fli_bitmap_width)+x, size*2);\r
+ //READ_BLOCK(fli_bitmap->line[y]+x, size*2);\r
+ x += size*2;\r
+ }\r
+ // repeat word -size times\r
+ else if (size < 0)\r
+ {\r
+ READ_RLE_WORD(fli_bitmap_data+(y*fli_bitmap_width)+x, -size);\r
+ //READ_RLE_WORD(fli_bitmap->line[y]+x, -size);\r
+ x -= size*2;\r
+ }\r
+ }\r
+ fli_bmp_dirty_from = MIN(fli_bmp_dirty_from, y);\r
+ fli_bmp_dirty_to = MAX(fli_bmp_dirty_to, y);\r
+ y++;\r
+ }\r
+}\r
+\r
+static void do_fli_color(byte *p, int sz)\r
+{\r
+ int packets;\r
+ int c, c2;\r
+ int offset;\r
+ int length;\r
+\r
+ offset = 0;\r
+ packets = READ_SHORT();\r
+\r
+ for (c=0; c<packets; c++)\r
+ {\r
+ offset += READ_BYTE();\r
+ length = READ_BYTE();\r
+ if (length == 0) length = 256;\r
+\r
+ for (c2=0; c2<length; c2++)\r
+ {\r
+ fli_palette[((offset+c2)*3)+0] = READ_BYTE();\r
+ fli_palette[((offset+c2)*3)+1] = READ_BYTE();\r
+ fli_palette[((offset+c2)*3)+2] = READ_BYTE();\r
+ }\r
+\r
+ fli_pal_dirty_from = MIN(fli_pal_dirty_from, offset);\r
+ fli_pal_dirty_to = MAX(fli_pal_dirty_to, offset+length-1);\r
+ offset += length;\r
+ }\r
+}\r
+\r
+static void do_fli_lc(byte *p, int sz)\r
+{\r
+ int lines;\r
+ int packets;\r
+ int size;\r
+ int x, y;\r
+\r
+ y = READ_SHORT();\r
+ lines = READ_SHORT();\r
+ fli_bmp_dirty_from = MIN(fli_bmp_dirty_from, y);\r
+ fli_bmp_dirty_to = MAX(fli_bmp_dirty_to, y+lines-1);\r
+\r
+ // for each line...\r
+ while (lines-- > 0)\r
+ {\r
+ packets = READ_BYTE();\r
+ x = 0;\r
+ while (packets-- > 0)\r
+ {\r
+ x += READ_BYTE();\r
+ size = READ_CHAR();\r
+\r
+ // copy size bytes\r
+ if (size > 0)\r
+ {\r
+ READ_BLOCK(fli_bitmap_data+(y*fli_bitmap_width)+x, size);\r
+ //READ_BLOCK(fli_bitmap->line[y]+x, size);\r
+ x += size;\r
+ }\r
+ else if (size < 0)\r
+ {\r
+ READ_RLE_BYTE(fli_bitmap_data+(y*fli_bitmap_width)+x, -size);\r
+ //READ_RLE_BYTE(fli_bitmap->line[y]+x, -size);\r
+ x -= size;\r
+ }\r
+ }\r
+ y++;\r
+ }\r
+}\r
+\r
+static void do_fli_black(byte *p, int sz)\r
+{\r
+ memset(fli_bitmap_data, 0, fli_bitmap_width*fli_bitmap_height);\r
+ //clear(fli_bitmap);\r
+\r
+ fli_bmp_dirty_from = 0;\r
+ fli_bmp_dirty_to = fli_bitmap_height-1;\r
+}\r
+\r
+static void do_fli_brun(byte *p, int sz)\r
+{\r
+ int packets;\r
+ int size;\r
+ int x, y;\r
+\r
+ // for each line...\r
+ for (y=0; y<fli_bitmap_height; y++)\r
+ {\r
+ packets = READ_BYTE();\r
+ x = 0;\r
+ while (packets-- > 0)\r
+ {\r
+ size = READ_CHAR();\r
+ if (size < 0)\r
+ {\r
+ READ_BLOCK(fli_bitmap_data+(y*fli_bitmap_width)+x, -size);\r
+ //READ_BLOCK(fli_bitmap->line[y]+x, -size);\r
+ x -= size;\r
+ }\r
+ // repeat byte size times\r
+ else if (size > 0)\r
+ {\r
+ READ_RLE_BYTE(fli_bitmap_data+(y*fli_bitmap_width)+x, size);\r
+ //READ_RLE_BYTE(fli_bitmap->line[y]+x, size);\r
+ x += size;\r
+ }\r
+ }\r
+ }\r
+ fli_bmp_dirty_from = 0;\r
+ fli_bmp_dirty_to = fli_bitmap_height-1;\r
+}\r
+\r
+static void do_fli_copy(byte *p, int sz)\r
+{\r
+ READ_BLOCK(fli_bitmap_data, fli_bitmap_width * fli_bitmap_height);\r
+ //READ_BLOCK(fli_bitmap->dat, fli_bitmap->w * fli_bitmap->h);\r
+\r
+ fli_bmp_dirty_from = 0;\r
+ fli_bmp_dirty_to = fli_bitmap_height-1;\r
+}\r
+\r
+static void read_frame()\r
+{\r
+ byte *p;\r
+ FLI_CHUNK *chunk;\r
+ int c, sz;\r
+\r
+ if (fli_status != FLI_OK)\r
+ return;\r
+\r
+get_another_frame:\r
+ if (!fli_read((byte *)&frame_header, sizeof(FLI_FRAME)))\r
+ {\r
+ fli_status = FLI_ERROR;\r
+ return;\r
+ }\r
+\r
+ if ((frame_header.type == FLI_FRAME_PREFIX)\r
+ || (frame_header.type == FLI_FRAME_USELESS))\r
+ {\r
+ fli_seek(frame_header.size-sizeof(FLI_FRAME), SEEK_CUR);\r
+ fli_frame++;\r
+\r
+ goto get_another_frame;\r
+ }\r
+\r
+ if (frame_header.type != FLI_FRAME_MAGIC)\r
+ {\r
+ fli_status = FLI_ERROR;\r
+ return;\r
+ }\r
+\r
+ if (frame_header.size == sizeof(FLI_FRAME))\r
+ {\r
+ fli_frame++;\r
+ return;\r
+ }\r
+ p = fli_read(NULL, frame_header.size-sizeof(FLI_FRAME));\r
+ if (!p)\r
+ {\r
+ fli_status = FLI_ERROR;\r
+ return;\r
+ }\r
+ for (c=0; c<frame_header.chunks; c++)\r
+ {\r
+ chunk = (FLI_CHUNK *)p;\r
+ sz = chunk->size - sizeof(FLI_CHUNK);\r
+ p += sizeof(FLI_CHUNK);\r
+ switch (chunk->type)\r
+ {\r
+ case 4: do_fli_256_color(p, sz); break;\r
+ case 7: do_fli_delta(p, sz); break;\r
+ case 11: do_fli_color(p, sz); break;\r
+ case 12: do_fli_lc(p, sz); break;\r
+ case 13: do_fli_black(p, sz); break;\r
+ case 15: do_fli_brun(p, sz); break;\r
+ case 16: do_fli_copy(p, sz); break;\r
+ default: err("Corrupt FLI chunk.");\r
+ }\r
+ p = ((byte *)chunk) + chunk->size;\r
+ }\r
+ fli_frame++;\r
+}\r
+\r
+static int do_play_fli(BITMAP *bmp, int loop, int (*callback)())\r
+{\r
+ int ret;\r
+\r
+ ret = next_fli_frame(loop);\r
+ while (ret == FLI_OK)\r
+ {\r
+ if (fli_pal_dirty_from <= fli_pal_dirty_to)\r
+ set_palette_range(fli_palette, fli_pal_dirty_from, fli_pal_dirty_to, 1);\r
+\r
+ if (fli_bmp_dirty_from <= fli_bmp_dirty_to)\r
+ {\r
+ int i,to=fli_bmp_dirty_to;\r
+ if (to>=bmp->h) to=bmp->h-1;\r
+\r
+// vsync();\r
+ for (i=fli_bmp_dirty_from; i<=to; i++)\r
+ {\r
+ memcpy(bmp->data+(i*bmp->w), fli_bitmap_data+(i*fli_bitmap_width),\r
+ (fli_bitmap_width>bmp->w) ? bmp->w : fli_bitmap_width);\r
+ }\r
+\r
+ //blit(\r
+ // fli_bitmap, bmp, 0, fli_bmp_dirty_from, 0, fli_bmp_dirty_from,\r
+ // fli_bitmap->w, 1+fli_bmp_dirty_to-fli_bmp_dirty_from);\r
+ }\r
+\r
+ reset_fli_variables();\r
+\r
+ if (callback)\r
+ {\r
+ ret = (*callback)();\r
+ if (ret != FLI_OK)\r
+ break;\r
+ }\r
+ ret = next_fli_frame(loop);\r
+ while (timer_count<speed) ShowPage();\r
+ timer_count=0;\r
+ }\r
+\r
+ close_fli();\r
+\r
+ return (ret == FLI_EOF) ? FLI_OK : ret;\r
+}\r
+\r
+int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)())\r
+{\r
+ if (open_fli(filename) != FLI_OK)\r
+ return FLI_ERROR;\r
+\r
+ return do_play_fli(bmp, loop, callback);\r
+}\r
+\r
+int play_memory_fli(byte *fli_data, BITMAP *bmp, int loop, int (*callback)())\r
+{\r
+ if (open_memory_fli(fli_data) != FLI_OK)\r
+ return FLI_ERROR;\r
+\r
+ return do_play_fli(bmp, loop, callback);\r
+}\r
+\r
+static int do_open_fli()\r
+{\r
+ // read the header\r
+ if (!fli_read((byte *)&fli_header, sizeof(FLI_HEADER)))\r
+ {\r
+ close_fli();\r
+ return FLI_ERROR;\r
+ }\r
+\r
+ // check magic numbers\r
+ if (((fli_header.bpp != 8) && (fli_header.bpp != 0))\r
+ || ((fli_header.type != FLI_MAGIC) && (fli_header.type != FLC_MAGIC)))\r
+ {\r
+ close_fli();\r
+ return FLI_ERROR;\r
+ }\r
+\r
+ if (fli_header.width == 0)\r
+ fli_header.width = 320;\r
+\r
+ if (fli_header.height == 0)\r
+ fli_header.height = 200;\r
+\r
+ // create the frame bitmap\r
+ fli_bitmap_width=fli_header.width;\r
+ fli_bitmap_height=fli_header.height;\r
+ fli_bitmap_data=(byte *)malloc(fli_bitmap_width*fli_bitmap_height);\r
+ if (!fli_bitmap_data)\r
+ {\r
+ close_fli();\r
+ return FLI_ERROR;\r
+ }\r
+\r
+ reset_fli_variables();\r
+ fli_frame = 0;\r
+ fli_status = FLI_OK;\r
+\r
+ if (fli_header.type == FLI_MAGIC)\r
+ speed = (long)fli_header.speed * 100 / 70;\r
+ else\r
+ speed = (long)fli_header.speed / 10;\r
+\r
+ if (speed == 0)\r
+ speed = 100;\r
+\r
+ return fli_status;\r
+}\r
+\r
+int open_fli(char *filename)\r
+{\r
+ if (fli_status != FLI_NOT_OPEN)\r
+ return FLI_ERROR;\r
+ fli_file = open(filename, O_RDONLY | O_BINARY, S_IRUSR | S_IWUSR);\r
+ if (fli_file < 0)\r
+ {\r
+ fli_file = 0;\r
+ return FLI_ERROR;\r
+ }\r
+ return do_open_fli();\r
+}\r
+\r
+int open_memory_fli(byte *fli_data)\r
+{\r
+ if (fli_status != FLI_NOT_OPEN)\r
+ return FLI_ERROR;\r
+ fli_mem_data = fli_data;\r
+ fli_mem_pos = 0;\r
+ return do_open_fli();\r
+}\r
+\r
+void close_fli()\r
+{\r
+ //remove_int(fli_timer_callback);\r
+\r
+ if (fli_file)\r
+ {\r
+ close(fli_file);\r
+ fli_file = 0;\r
+ }\r
+\r
+ if (fli_bitmap_data)\r
+ {\r
+ free(fli_bitmap_data);\r
+ fli_bitmap_data = NULL;\r
+ }\r
+\r
+ fli_mem_data = NULL;\r
+ fli_mem_pos = 0;\r
+ reset_fli_variables();\r
+ fli_status = FLI_NOT_OPEN;\r
+}\r
+\r
+int next_fli_frame(int loop)\r
+{\r
+ if (fli_status != FLI_OK)\r
+ return fli_status;\r
+\r
+ //fli_timer--;\r
+\r
+ // end of file? should we loop?\r
+ if (fli_frame >= fli_header.frame_count)\r
+ {\r
+ if (loop)\r
+ {\r
+ fli_seek(sizeof(FLI_HEADER), SEEK_SET);\r
+ fli_frame = 0;\r
+ }\r
+ else\r
+ {\r
+ fli_status = FLI_EOF;\r
+ return fli_status;\r
+ }\r
+ }\r
+ read_frame();\r
+ return fli_status;\r
+}\r
+\r
+void reset_fli_variables()\r
+{\r
+ fli_bmp_dirty_from = INT_MAX;\r
+ fli_bmp_dirty_to = INT_MIN;\r
+ fli_pal_dirty_from = INT_MAX;\r
+ fli_pal_dirty_to = INT_MIN;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef FLI_H\r
+#define FLI_H\r
+\r
+typedef struct\r
+{\r
+ int w,h;\r
+ byte *data;\r
+} BITMAP;\r
+\r
+int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)());\r
+int play_memory_fli(byte *fli_data, BITMAP *bmp, int loop, int (*callback)());\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define FONT_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+struct fontstruct\r
+{\r
+ byte width, height; // Font character dimensions\r
+ byte *data; // Font bitmap data\r
+};\r
+\r
+struct fontstruct font[10]; // Font stuff;\r
+int numfonts=0; // number of loaded fonts.\r
+int curx, cury; // x/y font location\r
+char tc=0; // text color\r
+\r
+// ================================= Code ====================================\r
+\r
+int LoadFont(char *fname)\r
+{ VFILE *f=0;\r
+ struct fontstruct *cfont=0;\r
+ int z=0;\r
+\r
+ if (!(f=vopen(fname)))\r
+ err("Could not open font %s. \n",fname);\r
+\r
+ // alias current font struct\r
+ cfont=font+numfonts;\r
+\r
+ if (vgetc(f) != 1)\r
+ err("Font file incorrect version number. \n");\r
+\r
+ // font dims\r
+ cfont->width=vgetw(f);\r
+ cfont->height=vgetw(f);\r
+\r
+ // get num of sub-set; calc total bytes as well\r
+ z=vgetw(f) * 96 * cfont->width*cfont->height;\r
+\r
+ // nab room for font and read it in\r
+ cfont->data=(byte *)valloc(z, "LoadFont:cfont->data", OID_IMAGE);\r
+ vread(cfont->data, z, f);\r
+\r
+ vclose(f);\r
+\r
+ return numfonts++;\r
+}\r
+\r
+void TextColor(int c)\r
+{\r
+ tc=c;\r
+}\r
+\r
+void GotoXY(int x, int y)\r
+{\r
+ curx=x;\r
+ cury=y;\r
+}\r
+\r
+static void pchar(int fnt, int x, int y, unsigned char c)\r
+{\r
+ int w;\r
+ if (c>31 && c<127)\r
+ {\r
+ w=font[fnt].width,h=font[fnt].height;\r
+ TCopySpriteClip(x,y, w,h, font[fnt].data+((c-32)*w*h)+((tc&3)*96*w*h));\r
+ }\r
+}\r
+\r
+void printstring(int fnt, char *str)\r
+{\r
+ if (fnt<0 || fnt >= numfonts)\r
+ return;\r
+ for (; *str; str++)\r
+ {\r
+ unsigned char c=*str;\r
+ switch (c)\r
+ {\r
+ case 126: tc=0; str++; continue;\r
+ case 128: tc=1; str++; continue;\r
+ case 129: tc=2; str++; continue;\r
+ case 130: tc=3; str++; continue;\r
+ }\r
+ pchar(fnt,curx,cury,c);\r
+ curx+=font[fnt].width;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef FONT_H\r
+#define FONT_H\r
+\r
+struct fontstruct\r
+{\r
+ byte width, height; // Font character dimensions\r
+ byte *data; // Font bitmap data\r
+};\r
+\r
+extern struct fontstruct font[10]; // Font stuff;\r
+extern int numfonts; // number of loaded fonts.\r
+extern int curx, cury;\r
+\r
+extern int LoadFont(char *fname);\r
+extern void TextColor(int c);\r
+extern void NumColor(int c);\r
+extern void GotoXY(int x, int y);\r
+extern void printstring(int fnt, char *str);\r
+extern void dec_to_asciiz(int num, char *buf);\r
+\r
+#endif // FONT_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Mega kudos to aen for porting that GIF code.\r
+\r
+#include <conio.h>\r
+#include "verge.h"\r
+\r
+// ========================= PCX Imaging routines ============================\r
+\r
+char manufacturer; // pcx header\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+word xmin, ymin;\r
+word xmax, ymax;\r
+word hres, vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+word bytes_per_line;\r
+word palette_type;\r
+char filler[58];\r
+\r
+word width, depth;\r
+word bytes;\r
+byte c, run, ss=0;\r
+quad vidoffset, n=0;\r
+VFILE *pcxf;\r
+char *cb,*src;\r
+int i;\r
+\r
+// ================================= Code ====================================\r
+\r
+void ReadPCXLine(byte *dest)\r
+{ n=0;\r
+ while (n<width)\r
+ {\r
+ run=1;\r
+ c=vgetc(pcxf); //*src++;\r
+ if (c>=0xc0) //(c & 0xc0)==0xc0)\r
+ {\r
+ run=c & 0x3f;\r
+ c=vgetc(pcxf); //*src++;\r
+ }\r
+ while (run--)\r
+ dest[vidoffset+n++]=c;\r
+ }\r
+ vseek(pcxf, bytes_per_line-width, 1);\r
+}\r
+\r
+void LoadPCXHeader(char *fname)\r
+{\r
+ if (!(pcxf=vopen(fname))) err("Could not open PCX file %s.",fname);\r
+ vread(&manufacturer,1,pcxf);\r
+ vread(&version,1,pcxf);\r
+ vread(&encoding,1,pcxf);\r
+ vread(&bits_per_pixel,1,pcxf);\r
+ vread(&xmin,2,pcxf);\r
+ vread(&ymin,2,pcxf);\r
+ vread(&xmax,2,pcxf);\r
+ vread(&ymax,2,pcxf);\r
+ vread(&hres,2,pcxf);\r
+ vread(&vres,2,pcxf);\r
+ vread(&palette,48,pcxf);\r
+ vread(&reserved,1,pcxf);\r
+ vread(&color_planes,1,pcxf);\r
+ vread(&bytes_per_line,2,pcxf);\r
+ vread(&palette_type,2,pcxf);\r
+ vread(&filler,58,pcxf);\r
+ //vseek(pcxf,filesize(pcxf)-768,SEEK_SET);\r
+ //vread(&pal,768,pcxf);\r
+ vseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+\r
+ bytes=bytes_per_line;\r
+\r
+ //for (i=0; i<768; i++)\r
+ // pal[i]=pal[i] >> 2;\r
+// SetPalette((byte *) &pal);\r
+\r
+ //i=filesize(pcxf);\r
+ //cb=(char *) valloc(i-896, "LoadPCXHeader:cb", OID_TEMP);\r
+ //vread(cb, i-(128+768+1), pcxf);\r
+}\r
+\r
+void LoadPCXHeaderNP(char *fname)\r
+{\r
+ if (!(pcxf=vopen(fname))) err("Could not open PCX file %s.",fname);\r
+ vread(&manufacturer,1,pcxf);\r
+ vread(&version,1,pcxf);\r
+ vread(&encoding,1,pcxf);\r
+ vread(&bits_per_pixel,1,pcxf);\r
+ vread(&xmin,2,pcxf);\r
+ vread(&ymin,2,pcxf);\r
+ vread(&xmax,2,pcxf);\r
+ vread(&ymax,2,pcxf);\r
+ vread(&hres,2,pcxf);\r
+ vread(&vres,2,pcxf);\r
+ vread(&palette,48,pcxf);\r
+ vread(&reserved,1,pcxf);\r
+ vread(&color_planes,1,pcxf);\r
+ vread(&bytes_per_line,2,pcxf);\r
+ vread(&palette_type,2,pcxf);\r
+ vread(&filler,58,pcxf);\r
+ vseek(pcxf,filesize(pcxf)-768,SEEK_SET);\r
+ vread(&pal,768,pcxf);\r
+ vseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+\r
+ i=filesize(pcxf);\r
+ cb=(char *) valloc(i-896, "LoadPCXHeaderNP:cb", OID_TEMP);\r
+ vread(cb, i-896, pcxf);\r
+}\r
+\r
+void LoadPCX(char *fname, byte *dest)\r
+{\r
+ LoadPCXHeader(fname);\r
+\r
+ src=cb;\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=(i*width);\r
+ ReadPCXLine(dest);\r
+ }\r
+ vfree(cb);\r
+ vclose(pcxf);\r
+}\r
+\r
+byte *LoadPCXBuf(char *fname)\r
+{ byte *buf=0;\r
+\r
+// LoadPCXHeaderNP(fname);\r
+ LoadPCXHeader(fname);\r
+ buf=(byte *) valloc(width*(depth+1), "LoadPCXBuf:buf", OID_IMAGE);\r
+ //src=cb;\r
+ for (vidoffset=0,i=0; i<depth; i++,vidoffset+=width)\r
+ ReadPCXLine(buf);\r
+ // palette avail?\r
+ if (12==vgetc(pcxf))\r
+ {\r
+ vread(pal,768,pcxf);\r
+ for (i=0; i<768; i++)\r
+ pal[i]>>=2;\r
+ }\r
+ //vfree(cb);\r
+ vclose(pcxf);\r
+ return buf;\r
+}\r
+\r
+// ========================= BMP Imaging routines ============================\r
+\r
+struct RGBQUAD\r
+{\r
+ unsigned char r,g,b,a;\r
+};\r
+\r
+struct RGBQUAD bmppalette[256];\r
+\r
+// ================================= Code ====================================\r
+\r
+byte *LoadBMPBuf(char *fname)\r
+{ byte pad[4], *buf;\r
+ VFILE* bmpfile;\r
+ int bwidth, bheight, y;\r
+\r
+ if (!(bmpfile=vopen(fname))) err("Could not open BMP file %s.",fname);\r
+ vseek(bmpfile, 18, SEEK_SET);\r
+ vread(&bwidth, 4, bmpfile); width=bwidth;\r
+ vread(&bheight, 4, bmpfile); depth=bheight;\r
+ vseek(bmpfile, 54, SEEK_SET);\r
+ vread(bmppalette, 1024, bmpfile);\r
+ buf=(byte*) valloc(bwidth*bheight, "LoadBMPBuf:buf", OID_IMAGE);\r
+\r
+ for (y=bheight-1; y>=0; y--)\r
+ {\r
+ vread((char *)((int)buf+y*width),width,bmpfile);\r
+ vread(pad,width%4,bmpfile);\r
+ }\r
+ for (y=0; y<256; y++)\r
+ {\r
+ pal[y*3]=bmppalette[y].b >> 2;\r
+ pal[y*3+1]=bmppalette[y].g >> 2;\r
+ pal[y*3+2]=bmppalette[y].r >> 2;\r
+ }\r
+ SetPalette((byte*)pal);\r
+ vclose(bmpfile);\r
+ return buf;\r
+}\r
+\r
+// ========================== GIF Imaging routines ===========================\r
+\r
+typedef unsigned char u8;\r
+typedef unsigned short u16;\r
+typedef unsigned long u32;\r
+\r
+typedef signed char s8;\r
+typedef signed short s16;\r
+typedef signed long s32;\r
+\r
+typedef struct\r
+{\r
+ u8 bits;\r
+ u8 background;\r
+ u8 * palette;\r
+ u8 * image;\r
+ s16 wide, deep;\r
+} gif_image_info;\r
+\r
+typedef struct\r
+{\r
+ char sig[7];\r
+ s16 screenwide, screendeep;\r
+ u8 hflags;\r
+ u8 background;\r
+ u8 aspect;\r
+} gif_header;\r
+\r
+typedef struct\r
+{\r
+ s16 top, left;\r
+ s16 wide, deep;\r
+ u8 iflags;\r
+} gif_image_descriptor;\r
+\r
+int NO_CODE = -1,// TRUE = 1,\r
+ ERROR_EOF = 0, ERROR_BAD_CODE = 1,\r
+ ERROR_BAD_HEADER = 2, ERROR_BAD_STARTCODE = 3,\r
+ ERROR_BAD_FIRST_CODE = 4, ERROR_BAD_FILE = 5,\r
+ ERROR_NO_IMAGE = 6;\r
+\r
+char* gif_error_messages[] =\r
+{\r
+ "Unexpected end of file\n",\r
+ "Bad code\n",\r
+ "Bad gif header\n",\r
+ "Bad symbol size\n",\r
+ "Bad first code\n",\r
+ "Error opening file\n",\r
+ "This file doesn't contain an image\n"\r
+};\r
+\r
+// read colour palette, vga palette values are 6 bit numbers\r
+// while gif allows for 8 bit so shift right to get correct colours\r
+\r
+u8* gif_read_palette(FILE* fp, s32 bytes)\r
+{\r
+ s32 i = 0;\r
+ u8* block = 0L;\r
+ s32 components = (bytes / 3) * 3;\r
+\r
+ block = (unsigned char *)valloc(components, "gif_read_palette:block", OID_IMAGE);\r
+\r
+ for (i = 0; i < components; ++i)\r
+ block[i] = fgetc(fp) >> 2;\r
+\r
+ return block;\r
+}\r
+\r
+// read a block of bytes into memory\r
+s32 block_mem_read(FILE* fp, u8* buffer, s32 bytes)\r
+{\r
+ s32 status = 0;\r
+\r
+ status = fread(buffer, 1, bytes, fp);\r
+ if (status != bytes) return EOF;\r
+\r
+ return TRUE;\r
+}\r
+\r
+// read a unsigned 16 bit value from file, low byte first; note that this\r
+// is reverse endian-ness (ie. fwrite(&s,1,2,fp); writes high byte first).\r
+\r
+s16 read_word_lbf(FILE* fp)\r
+{\r
+ s32 a, b;\r
+\r
+ a = fgetc(fp);\r
+ b = fgetc(fp);\r
+\r
+ return (b << 8) | a;\r
+}\r
+\r
+// read the GIF file header structure into a sequence\r
+gif_header* get_gif_header(FILE* fp)\r
+{\r
+ gif_header* h = 0L;\r
+\r
+ h = (gif_header *)valloc(sizeof(gif_header), "get_gif_header:h", OID_IMAGE);\r
+\r
+ fread(h->sig, 1, 6, fp);\r
+ h->sig[6] = 0;\r
+\r
+ if (strncmp(h->sig, "GIF", 3) != 0)\r
+ return NULL;\r
+\r
+ h->screenwide = read_word_lbf(fp); width=h->screenwide;\r
+ h->screendeep = read_word_lbf(fp); depth=h->screendeep;\r
+ h->hflags = fgetc(fp);\r
+ h->background = fgetc(fp);\r
+ h->aspect = fgetc(fp);\r
+\r
+ return h;\r
+}\r
+\r
+// gif file can contain more than one image,\r
+// each image is preceeded by a header structure\r
+gif_image_descriptor* get_image_descriptor(FILE* fp)\r
+{\r
+ gif_image_descriptor* id = 0L;\r
+\r
+ id = (gif_image_descriptor *)valloc(sizeof(gif_image_descriptor), "get_image_descriptor:id", OID_IMAGE);\r
+\r
+ id->left = read_word_lbf(fp);\r
+ id->top = read_word_lbf(fp);\r
+ id->wide = read_word_lbf(fp);\r
+ id->deep = read_word_lbf(fp);\r
+ id->iflags = fgetc(fp);\r
+\r
+ return id;\r
+}\r
+\r
+static u16 word_mask_table[] =\r
+{\r
+ 0x0000, 0x0001, 0x0003, 0x0007,\r
+ 0x000F, 0x001F, 0x003F, 0x007F,\r
+ 0x00FF, 0x01FF, 0x03FF, 0x07FF,\r
+ 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF\r
+};\r
+\r
+static u8 inc_table[] = { 8,8,4,2,0 };\r
+static u8 start_table[] = { 0,4,2,1,0 };\r
+\r
+// enables me to use indices as per EUPHORiA (ie. converts to C's 0 base)\r
+#define eui(i) ((i)-1)\r
+\r
+// unpack an LZW compressed image\r
+// returns a sequence containing screen display lines of the image\r
+u8* unpack_image(FILE* fp, s32 start_code_size, u32 width, u32 depth, u32 flags)\r
+{\r
+ u8* buffer;\r
+ u8* line_buffer;\r
+\r
+ u16 first_code_stack[4096];\r
+ u16 last_code_stack[4096];\r
+ u16 code_stack[4096];\r
+\r
+ s32 bits_left;\r
+ s32 clear_code;\r
+ s32 code_size;\r
+ s32 code_size2;\r
+ s32 next_code;\r
+ s32 this_code;\r
+ s32 old_token;\r
+ s32 current_code;\r
+ s32 old_code;\r
+ s32 block_size=0;\r
+ s32 line;\r
+ s32 a_byte;\r
+ s32 pass;\r
+ s32 u;\r
+\r
+ u8 b[256]; // read buffer; for block reads\r
+ u8* p; // current byte in read buffer\r
+ u8* q; // last byte in read buffer + 1\r
+\r
+ line_buffer = (u8 *)valloc(width, "unpack_image:line_buffer", OID_TEMP);\r
+ buffer = (u8 *)valloc(width * depth, "unpack_image:buffer", OID_IMAGE);\r
+\r
+ a_byte = 0;\r
+ line = 0;\r
+ pass = 0;\r
+ bits_left = 8;\r
+\r
+ if (start_code_size < 2 || start_code_size > 8)\r
+ err("\nERROR_BAD_STARTCODE"); // bad symbol size\r
+\r
+ p = b;\r
+ q = b;\r
+\r
+ clear_code = 1 << start_code_size; //pow(2, start_code_size);\r
+ next_code = clear_code + 2;\r
+ code_size = start_code_size + 1;\r
+ code_size2 = 1 << code_size; //pow(2, code_size);\r
+ old_code = NO_CODE;\r
+ old_token = NO_CODE;\r
+\r
+ while (1)\r
+ {\r
+ if (bits_left == 8)\r
+ {\r
+ ++p;\r
+ if (p >= q)\r
+ {\r
+ block_size = fgetc(fp);\r
+ if (block_mem_read(fp, b, block_size) == EOF)\r
+ err("\nERROR_EOF");\r
+ p = b;\r
+ q = b + block_size;\r
+ }\r
+ bits_left = 0;\r
+ }\r
+\r
+ this_code = *p;\r
+ current_code = code_size + bits_left;\r
+\r
+ if (current_code <= 8)\r
+ {\r
+ *p = *p >> code_size;\r
+ bits_left = current_code;\r
+ }\r
+ else\r
+ {\r
+ ++p;\r
+ if (p >= q)\r
+ {\r
+ block_size = fgetc(fp);\r
+ if (block_mem_read(fp, b, block_size) == EOF)\r
+ err("\nERROR_EOF");\r
+ p = b;\r
+ q = b + block_size;\r
+ }\r
+\r
+ this_code |= (*p << (8 - bits_left));\r
+\r
+ if (current_code <= 16)\r
+ {\r
+ bits_left = current_code - 8;\r
+ *p = *p >> bits_left;\r
+ }\r
+ else\r
+ {\r
+ if (++p >= q)\r
+ {\r
+ block_size = fgetc(fp);\r
+ if (block_mem_read(fp, b, block_size) == EOF)\r
+ err("\nERROR_EOF");\r
+ p = b;\r
+ q = b + block_size;\r
+ }\r
+\r
+ this_code |= (*p << (16 - bits_left));\r
+\r
+ bits_left = current_code - 16;\r
+ *p = *p >> bits_left;\r
+ }\r
+ }\r
+\r
+ this_code &= word_mask_table[code_size];\r
+ current_code = this_code;\r
+\r
+ if (this_code == (clear_code+1) || block_size == 0)\r
+ break;\r
+ if (this_code > next_code)\r
+ err("\nERROR_BAD_CODE");\r
+\r
+ if (this_code == clear_code)\r
+ {\r
+ next_code = clear_code + 2;\r
+ code_size = start_code_size + 1;\r
+ code_size2 = 1 << code_size; //pow(2, code_size);\r
+ old_code = NO_CODE;\r
+ old_token = NO_CODE;\r
+ }\r
+ else\r
+ {\r
+ u = 1;\r
+ if (this_code == next_code)\r
+ {\r
+ if (old_code == NO_CODE)\r
+ err("\nERROR_BAD_FIRST_CODE");\r
+\r
+ first_code_stack[eui(u)] = old_token;\r
+ u++;\r
+ this_code = old_code;\r
+ }\r
+\r
+ while (this_code >= clear_code)\r
+ {\r
+ first_code_stack[eui(u)] = last_code_stack[eui(this_code)];\r
+ u++;\r
+ this_code = code_stack[eui(this_code)];\r
+ }\r
+\r
+ old_token = this_code;\r
+ while (1)\r
+ {\r
+ line_buffer[a_byte] = this_code;\r
+ a_byte++;\r
+ if (a_byte >= width)\r
+ {\r
+ // full image line so add it into screen image\r
+ memcpy(buffer + (line * width), line_buffer, width);\r
+\r
+ a_byte = 0;\r
+ if (flags & 0x40)\r
+ {\r
+ line += inc_table[pass];\r
+ if (line >= depth)\r
+ {\r
+ pass++;\r
+ line = start_table[pass];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ line++;\r
+ }\r
+ }\r
+\r
+ // no more bytes on stack\r
+ if (u == 1) break;\r
+\r
+ u--;\r
+ this_code = first_code_stack[eui(u)];\r
+ }\r
+\r
+ if (next_code < 4096 && old_code != NO_CODE)\r
+ {\r
+ code_stack[eui(next_code)] = old_code;\r
+ last_code_stack[eui(next_code)] = old_token;\r
+ next_code++;\r
+ if (next_code >= code_size2 && code_size < 12)\r
+ {\r
+ code_size++;\r
+ code_size2 = 1 << code_size; //pow(2, code_size);\r
+ }\r
+ }\r
+\r
+ old_code = current_code;\r
+ }\r
+ }\r
+\r
+ // completed reading the image so return it\r
+ free(b);\r
+ return buffer;\r
+}\r
+\r
+// skip the extension blocks as we are only after the image\r
+void skip_extension(FILE* fp)\r
+{\r
+ s32 n;\r
+ char temp[256];\r
+\r
+ n = fgetc(fp); // throwaway extension function code\r
+ n = fgetc(fp); // get length of block\r
+\r
+ while (n > 0 && n != EOF)\r
+ {\r
+ // throwaway block\r
+ fread(temp, 1, n, fp);\r
+\r
+ n = fgetc(fp); // get length of next block\r
+ }\r
+}\r
+\r
+// unpack the GIF file\r
+// returns ImageInfo sequence containing image and image data\r
+gif_image_info* unpack_gif(char* filename)\r
+{\r
+ VFILE *f;\r
+ FILE* fp;\r
+ s32 c, b;\r
+ gif_header* h = 0L;\r
+ gif_image_info* ii = 0L;\r
+ gif_image_descriptor* id = 0L;\r
+ u8* local_palette = 0L;\r
+\r
+ ii = (gif_image_info *)valloc(sizeof(gif_image_info), "unpack_gif:ii", OID_IMAGE);\r
+\r
+ f = vopen(filename);\r
+ if (!f) err("Could not open GIF file %s.",filename);\r
+ fp = f->fp;\r
+ if (!fp) err("\nBad filename");\r
+\r
+ // file starts with the Logical Screen Descriptor structure\r
+ h = get_gif_header(fp);\r
+\r
+ // Size of Global Color Table\r
+ ii->bits = (h->hflags & 7) + 1;\r
+ ii->background = h->background;\r
+\r
+ // get Global colour palette if there is one\r
+ if (h->hflags & 0x80) // is flags bit 8 set?\r
+ {\r
+ c = 3 << ii->bits; // size of global colour map\r
+ ii->palette = gif_read_palette(fp, c);\r
+\r
+/* outp(968, 0);\r
+ // enforce global color map\r
+ for (s32 i=0; i < 768; ++i)\r
+ outp(969, ii->palette[i]); */\r
+ memcpy(pal, ii->palette, 768);\r
+ }\r
+\r
+ c = fgetc(fp);\r
+\r
+ while (c == 0x2c || c == 0x21 || c == 0)\r
+ {\r
+ // image separator so unpack the image\r
+ if (c == 0x2c)\r
+ {\r
+ id = get_image_descriptor(fp); // get the Image Descriptor\r
+ // if there is a local Color Table then overwrite the global table\r
+ if (id->iflags & 0x80)\r
+ {\r
+ ii->bits = (id->iflags & 7) + 1;\r
+ b = 3 << ii->bits;\r
+ if (local_palette)\r
+ free(local_palette);\r
+ local_palette = gif_read_palette(fp, b);\r
+ }\r
+\r
+ c = fgetc(fp); // get the LZW Minimum Code Size\r
+ ii->image = unpack_image(fp, c, id->wide, id->deep, id->iflags);\r
+ vclose(f);\r
+\r
+ // error reading image\r
+ if (!ii->image)\r
+ err("\nerror reading image data");\r
+\r
+ ii->wide = id->wide;\r
+ ii->deep = id->deep;\r
+\r
+ // return imagedata\r
+ return ii;\r
+ }\r
+ // extension introducer\r
+ else if (c == 0x21)\r
+ {\r
+ skip_extension(fp); // throw the extension away\r
+ }\r
+\r
+ c = fgetc(fp);\r
+ }\r
+\r
+ // no image?\r
+ return NULL;\r
+}\r
+\r
+byte *LoadGIFBuf(char *fname)\r
+{\r
+ gif_image_info *ii=0;\r
+ byte *t;\r
+\r
+ ii=unpack_gif(fname);\r
+ width=ii->wide;\r
+ depth=ii->deep;\r
+ t=ii->image;\r
+ free(ii);\r
+ return t;\r
+}\r
+\r
+// ====================== Universal Imaging Interface ========================\r
+\r
+byte imagetype;\r
+\r
+// ================================= Code ====================================\r
+\r
+void DetermineFileType(char *fname)\r
+{\r
+ strlwr(fname);\r
+ if (!strcmp(fname+(strlen(fname)-3),"pcx")) imagetype=0;\r
+ if (!strcmp(fname+(strlen(fname)-3),"gif")) imagetype=1;\r
+ if (!strcmp(fname+(strlen(fname)-3),"bmp")) imagetype=2;\r
+}\r
+\r
+void VLoadImage(char *fname, byte *dest)\r
+{\r
+ imagetype=255;\r
+ DetermineFileType(fname);\r
+ switch (imagetype)\r
+ {\r
+ case 0: LoadPCX(fname, dest); break;\r
+ case 1: err("VLoadImage() for GIF not supported; use VLoadImageBuf()"); break;\r
+ case 2: err("VLoadImage() for BMP not supported; use VLoadImageBuf()"); break;\r
+ default: err("%s: Unrecognized image type.",fname);\r
+ }\r
+}\r
+\r
+byte *VLoadImageBuf(char *fname)\r
+{\r
+ imagetype=255;\r
+ DetermineFileType(fname);\r
+ switch (imagetype)\r
+ {\r
+ case 0: return LoadPCXBuf(fname); break;\r
+ case 1: return LoadGIFBuf(fname); break;\r
+ case 2: return LoadBMPBuf(fname); break;\r
+ default: err("%s: Unrecognized image type.",fname);\r
+ }\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef IMAGE_H\r
+#define IMAGE_H\r
+\r
+word width, depth;\r
+\r
+void VLoadImage(char *fname, byte *dest);\r
+byte *VLoadImageBuf(char *fname);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(INTERINC)\r
+#define INTERINC\r
+\r
+#ifdef __WATCOMC__\r
+ #include <i86.h>\r
+ #define REGISTERS union REGS\r
+ #define SET_AX(r,v) (r).w.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).w.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).w.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).w.dx=(short)(v)\r
+ #define INTERRUPT(i,r) int386((i),&(r),&(r))\r
+#elif defined(__DJGPP__)\r
+ #include <dpmi.h>\r
+ #define REGISTERS __dpmi_regs\r
+ #define SET_AX(r,v) (r).x.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).x.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).x.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).x.dx=(short)(v)\r
+ #define INTERRUPT(i,r) __dpmi_int((i),&(r))\r
+// #define inp inportb\r
+ #define outp outportb\r
+ #define outpw outportw\r
+#endif // watcom | djgpp\r
+\r
+#endif // INTERINC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef KEYBOARD_H\r
+#define KEYBOARD_H\r
+\r
+extern volatile byte key[128];\r
+extern volatile byte last_pressed;\r
+extern int InitKeyboard(void);\r
+extern void ShutdownKeyboard(void);\r
+#ifdef DJGPP\r
+extern void keyboard_chain(int toggle);\r
+#endif\r
+\r
+/* Constants for keyboard scan-codes */\r
+\r
+#define SCAN_ESC 0x01\r
+#define SCAN_1 0x02\r
+#define SCAN_2 0x03\r
+#define SCAN_3 0x04\r
+#define SCAN_4 0x05\r
+#define SCAN_5 0x06\r
+#define SCAN_6 0x07\r
+#define SCAN_7 0x08\r
+#define SCAN_8 0x09\r
+#define SCAN_9 0x0a\r
+#define SCAN_0 0x0b\r
+#define SCAN_MINUS 0x0c\r
+#define SCAN_EQUALS 0x0d\r
+#define SCAN_BACKSP 0x0e\r
+#define SCAN_TAB 0x0f\r
+#define SCAN_Q 0x10\r
+#define SCAN_W 0x11\r
+#define SCAN_E 0x12\r
+#define SCAN_R 0x13\r
+#define SCAN_T 0x14\r
+#define SCAN_Y 0x15\r
+#define SCAN_U 0x16\r
+#define SCAN_I 0x17\r
+#define SCAN_O 0x18\r
+#define SCAN_P 0x19\r
+#define SCAN_LANGLE 0x1a\r
+#define SCAN_RANGLE 0x1b\r
+#define SCAN_ENTER 0x1c\r
+#define SCAN_CTRL 0x1d\r
+#define SCAN_A 0x1e\r
+#define SCAN_S 0x1f\r
+#define SCAN_D 0x20\r
+#define SCAN_F 0x21\r
+#define SCAN_G 0x22\r
+#define SCAN_H 0x23\r
+#define SCAN_J 0x24\r
+#define SCAN_K 0x25\r
+#define SCAN_L 0x26\r
+#define SCAN_SCOLON 0x27\r
+#define SCAN_QUOTA 0x28\r
+#define SCAN_RQUOTA 0x29\r
+#define SCAN_LSHIFT 0x2a\r
+#define SCAN_BSLASH 0x2b\r
+#define SCAN_Z 0x2c\r
+#define SCAN_X 0x2d\r
+#define SCAN_C 0x2e\r
+#define SCAN_V 0x2f\r
+#define SCAN_B 0x30\r
+#define SCAN_N 0x31\r
+#define SCAN_M 0x32\r
+#define SCAN_COMA 0x33\r
+#define SCAN_DOT 0x34\r
+#define SCAN_SLASH 0x35\r
+#define SCAN_RSHIFT 0x36\r
+#define SCAN_GREY_STAR 0x37\r
+#define SCAN_ALT 0x38\r
+#define SCAN_SPACE 0x39\r
+#define SCAN_CAPS 0x3a\r
+#define SCAN_F1 0x3b\r
+#define SCAN_F2 0x3c\r
+#define SCAN_F3 0x3d\r
+#define SCAN_F4 0x3e\r
+#define SCAN_F5 0x3f\r
+#define SCAN_F6 0x40\r
+#define SCAN_F7 0x41\r
+#define SCAN_F8 0x42\r
+#define SCAN_F9 0x43\r
+#define SCAN_F10 0x44\r
+#define SCAN_NUMLOCK 0x45\r
+#define SCAN_SCRLOCK 0x46\r
+#define SCAN_HOME 0x47\r
+#define SCAN_UP 0x48\r
+#define SCAN_PGUP 0x49\r
+#define SCAN_GREY_MINUS 0x4a\r
+#define SCAN_LEFT 0x4b\r
+#define SCAN_PAD_5 0x4c\r
+#define SCAN_RIGHT 0x4d\r
+#define SCAN_GREY_PLUS 0x4e\r
+#define SCAN_END 0x4f\r
+#define SCAN_DOWN 0x50\r
+#define SCAN_PGDN 0x51\r
+#define SCAN_INSERT 0x52\r
+#define SCAN_DEL 0x53\r
+#define SCAN_F11 0x57\r
+#define SCAN_F12 0x58\r
+#endif\r
--- /dev/null
+#\r
+# Copyright (C) 1998 BJ Eirich (aka vecna)\r
+# This program is free software; you can redistribute it and/or\r
+# modify it under the terms of the GNU General Public License\r
+# as published by the Free Software Foundation; either version 2\r
+# of the License, or (at your option) any later version.\r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. \r
+# See the GNU General Public Lic\r
+# See the GNU General Public License for more details.\r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+#\r
+\r
+ .file "keyboard.s"\r
+\r
+ .extern ___djgpp_base_address\r
+ .extern ___djgpp_ds_alias\r
+ .extern ___djgpp_dos_sel\r
+\r
+ # public functions and variables:\r
+\r
+ .global _key\r
+ .global _InitKeyboard\r
+ .global _ShutdownKeyboard\r
+ .global _keyboard_chain\r
+ .global _last_pressed\r
+\r
+ .text\r
+\r
+ .align 4\r
+\r
+locking_region_start:\r
+\r
+_key: .space 0x80, 0\r
+_last_pressed: .byte 0\r
+old_vector:\r
+old_vector_ofs: .long 0\r
+old_vector_sel: .word 0\r
+chain_flag: .long 1\r
+\r
+\r
+ .align 4\r
+\r
+handler_procedure:\r
+\r
+ #\r
+ # .. will be called every time a key is pressed/released\r
+ #\r
+ pushl %eax\r
+ pushl %edx\r
+ pushw %ds\r
+ #\r
+ # Load DS with our data selector\r
+ #\r
+ movw %cs:___djgpp_ds_alias, %ds\r
+ #\r
+ # Read the scancode from keyboard port and update key[]\r
+ #\r
+ inb $0x60, %al\r
+ movb %al, %dl\r
+ andl $0x7f, %edx\r
+ testb $0x80, %al\r
+ setz _key(%edx)\r
+ cmp $127, %al\r
+ ja nolastpressed\r
+ movb %edx, _last_pressed\r
+nolastpressed:\r
+\r
+ #\r
+ # Chain if flag is set, otherwise do what's necessary and return\r
+ #\r
+ cmpl $0, chain_flag\r
+ jne handler_chain\r
+ #\r
+ # Acknowledge keyboard and interrupt contollers\r
+ #\r
+ inb $0x61, %al\r
+ orb $0x80, %al\r
+ outb %al, $0x61\r
+ andb $0x7f, %al\r
+ outb %al, $0x61\r
+ movb $0x20, %al\r
+ outb %al, $0x20\r
+\r
+ popw %ds\r
+ popl %edx\r
+ popl %eax\r
+ sti\r
+ iret\r
+\r
+ .align 4\r
+\r
+handler_chain: popw %ds\r
+ popl %edx\r
+ popl %eax\r
+ ljmp %cs:(old_vector)\r
+\r
+locking_region_end:\r
+\r
+\r
+ .align 4\r
+_InitKeyboard:\r
+\r
+ #\r
+ # int keyboard_init(void);\r
+ #\r
+ # Initializes the keyboard handler and hooks the keyboard interrupt.\r
+ # Returns -1 on failure, zero on success\r
+ #\r
+ pushl %esi\r
+ pushl %edi\r
+ pushl %ebx\r
+ #\r
+ # First, we need to lock the handler and memory it touches, so\r
+ # it doesn't get swapped out to disk.\r
+ #\r
+ leal locking_region_start, %ecx\r
+ leal locking_region_end, %edi\r
+ subl %ecx, %edi\r
+ addl ___djgpp_base_address, %ecx\r
+ shldl $16, %ecx, %ebx # ecx -> bx:cx\r
+ shldl $16, %edi, %esi # edi -> si:di\r
+ movw $0x0600, %ax # lock linear region\r
+ int $0x31\r
+ jc init_error\r
+ #\r
+ # Now we need to save the old interrupt vector, so we can restore\r
+ # it later and also to know where to jump if chaining.\r
+ #\r
+ movw $0x0204, %ax # get pm int vector\r
+ movb $0x09, %bl\r
+ int $0x31\r
+ movw %cx, old_vector_sel\r
+ movl %edx, old_vector_ofs\r
+ #\r
+ # Make sure we chain after initialization.\r
+ #\r
+ movl $1, chain_flag\r
+ #\r
+ # Set the interrupt vector to point to our handler.\r
+ #\r
+ movw %cs, %cx\r
+ leal handler_procedure, %edx\r
+ movb $0x09, %bl\r
+ movw $0x0205, %ax # set pm int vector\r
+ int $0x31\r
+ #*\r
+ #* Actually we would have to unlock the locked region on failure\r
+ #* here. But since most programs would exit with an error message\r
+ #* in such case, there's no need to worry.\r
+ #*\r
+\r
+init_error:\r
+\r
+ #\r
+ # This sets EAX to -1 if CF is set and to 0 atherwise\r
+ #\r
+ movl $0, %eax\r
+ sbbl $0, %eax\r
+\r
+ popl %ebx\r
+ popl %edi\r
+ popl %esi\r
+ ret\r
+\r
+\r
+ .align 4\r
+_ShutdownKeyboard:\r
+\r
+ #\r
+ # void keyboard_close(void);\r
+ #\r
+ # Shuts the keyboard handler down.\r
+ #\r
+ pushl %esi\r
+ pushl %edi\r
+ pushl %ebx\r
+ #\r
+ # Unlock the region we locked at initialization\r
+ #\r
+ leal locking_region_start, %ecx\r
+ leal locking_region_end, %edi\r
+ subl %ecx, %edi\r
+ addl ___djgpp_base_address, %ecx\r
+ shldl $16, %ecx, %ebx\r
+ shldl $16, %edi, %esi\r
+ movw $0x0601, %ax # unlock linear region\r
+ int $0x31\r
+ #\r
+ # Restore the interrupt vector to its previous value\r
+ #\r
+ movw old_vector_sel, %cx\r
+ movl old_vector_ofs, %edx\r
+ movb $0x09, %bl\r
+ movw $0x0205, %ax # set pm int vector\r
+ int $0x31\r
+\r
+ popl %ebx\r
+ popl %edi\r
+ popl %esi\r
+ ret\r
+ #\r
+ # void keyboard_chain(int toggle);\r
+ #\r
+ .align 4\r
+_keyboard_chain:\r
+ cmpl $0, 4(%esp)\r
+ je chain_off\r
+chain_on:\r
+\r
+ #\r
+ # Set the chain_flag and clear BIOS shift/ctrl/alt status bits:\r
+ #\r
+ movl $1, chain_flag\r
+\r
+ push %es\r
+ movw ___djgpp_dos_sel, %es\r
+ andb $0xf0, %es:0x417\r
+ pop %es\r
+ jmp chain_done\r
+chain_off:\r
+ movl $0, chain_flag\r
+chain_done: ret\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MAIN_H\r
+#define MAIN_H\r
+\r
+//void *valloc(int amount);\r
+void err(char *message, ...);\r
+int sgn(int x);\r
+void ver();\r
+void CheckMessages();\r
+void Log(char *message, ...);\r
+void Logp(char *message, ...);\r
+void LogDone();\r
+void InitMouse(int, int);\r
+void ReadMouse();\r
+void SetMouse(int, int);\r
+\r
+extern char startmap[80], nocdaudio;\r
+extern int mx, my, mb;\r
+\r
+#define vfree(x) if (x) { free(x); x=0; }\r
+\r
+#ifndef DJGPP\r
+#define strncasecmp strnicmp\r
+#define strcasecmp strcmpi\r
+#endif\r
+\r
+#endif\r
--- /dev/null
+CC = gcc\r
+CFLAGS = -s -Wall -Werror\r
+\r
+OBJ = a_memory.o conlib.o console.o controls.o engine.o entity.o font.o image.o keyboard.o message.o modeinit.o render.o startup.o timer.o verge.o vc.o vdriver.o vfile.o fli.o sound.o mikmod.a\r
+\r
+verge: $(OBJ)\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+struct message\r
+{\r
+ char text[44]; // message text\r
+ int exptime; // message expire time\r
+};\r
+\r
+struct message messages[6]; // 5-message buffer\r
+byte num_msgs=0; // number of active messages\r
+\r
+// -- cpu usage --\r
+\r
+int cputimer=0, frames=0;\r
+char runprf[3];\r
+// -- final numbers --\r
+int fps=0;\r
+char profile[3];\r
+\r
+// ================================= Code ====================================\r
+\r
+void CheckMessageExpirations()\r
+{ int i;\r
+\r
+ for (i=0; i<num_msgs; i++)\r
+ if (systemtime>messages[i].exptime)\r
+ {\r
+ memcpy(messages[i].text, messages[i+1].text, (48*(num_msgs-i+1)));\r
+ num_msgs--;\r
+ }\r
+}\r
+\r
+void RenderGUI()\r
+{ int i;\r
+\r
+ CheckMessageExpirations();\r
+ for (i=0; i<num_msgs; i++)\r
+ {\r
+ GotoXY(1,1+(i*10));\r
+ printstring(0,messages[i].text);\r
+ }\r
+\r
+ if (!cpu_watch) return;\r
+ frames++;\r
+\r
+ i=sx-76;\r
+ GotoXY(i,sy-39);\r
+ sprintf(strbuf,"etc:%d",profile[0]);\r
+ printstring(0,strbuf);\r
+ GotoXY(i,sy-29);\r
+ sprintf(strbuf,"Render:%d",profile[1]);\r
+ printstring(0,strbuf);\r
+ GotoXY(i,sy-19);\r
+ sprintf(strbuf,"PFlip:%d",profile[2]);\r
+ printstring(0,strbuf);\r
+ GotoXY(i,sy-9);\r
+ sprintf(strbuf,"FPS:%d",fps);\r
+ printstring(0,strbuf);\r
+}\r
+\r
+void CPUTick()\r
+{\r
+ cputimer++;\r
+ runprf[cpubyte]++;\r
+ if (cputimer==100)\r
+ {\r
+ fps=frames;\r
+ frames=0;\r
+ cputimer=0;\r
+\r
+ profile[0]=runprf[0]; runprf[0]=0;\r
+ profile[1]=runprf[1]; runprf[1]=0;\r
+ profile[2]=runprf[2]; runprf[2]=0;\r
+ }\r
+}\r
+\r
+void Message(char *text, int duration)\r
+{\r
+ Log("Message: %s", text);\r
+\r
+ if (num_msgs<5)\r
+ {\r
+ memcpy(messages[num_msgs].text, text, strlen(text));\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+ num_msgs++;\r
+ return;\r
+ }\r
+\r
+ memcpy(&messages[0].text, &messages[1].text, 192);\r
+ memcpy(messages[4].text, text, strlen(text));\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MESSAGE_H\r
+#define MESSAGE_H\r
+\r
+void RenderGUI();\r
+void CPUTick();\r
+void Message(char *text, int duration);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+\r
+Name:\r
+MIKMOD.C\r
+\r
+Description:\r
+Modplaying example of mikmod.\r
+\r
+MSDOS: BC(y) Watcom(y) DJGPP(y)\r
+Win95: BC(y*)\r
+Os2: y\r
+Linux: n\r
+\r
+* console mode only\r
+(y) - yes\r
+(n) - no (not possible or not useful)\r
+(?) - may be possible, but not tested\r
+\r
+*/\r
+#ifdef __WIN32__\r
+#include <windows.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <conio.h>\r
+#include <string.h>\r
+\r
+#ifndef __OS2__\r
+#include <dos.h>\r
+#endif\r
+\r
+#include "wildfile.h"\r
+#include "mikmod.h"\r
+\r
+char helptext[]=\r
+\r
+"Available switches (CaSe SeNsItIvE!):\n"\r
+"\n"\r
+" /d x use device-driver #x for output (0 is autodetect). Default=0\n"\r
+" /ld List all available device-drivers\n"\r
+" /ll List all available loaders\n"\r
+" /x disables protracker extended speed\n"\r
+" /p disables panning effects (9fingers.mod)\n"\r
+" /v xx Sets volume from 0 (silence) to 100. Default=100\n"\r
+" /f xxxx Sets mixing frequency. Default=44100\n"\r
+" /m Force mono output (so sb-pro can mix at 44100)\n"\r
+" /8 Force 8 bit output\n"\r
+" /i Use interpolated mixing\n"\r
+" /r Restart a module when it's done playing";\r
+\r
+\r
+/*\r
+ declarations for boring old sys-v style getopt *yawn*:\r
+*/\r
+int getopt(int argc, char *argv[], char *optionS);\r
+extern char *optarg;\r
+extern int optind;\r
+extern int opterr;\r
+\r
+\r
+void tickhandler(void)\r
+{\r
+ MP_HandleTick(); /* play 1 tick of the module */\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+\r
+int main(int argc,char *argv[])\r
+{\r
+ UNIMOD *mf;\r
+ int cmderr=0; /* error in commandline flag */\r
+ int morehelp=0; /* set if user wants more help */\r
+ int quit;\r
+ int t;\r
+ static int nargc;\r
+ static char **nargv;\r
+\r
+ puts(mikbanner);\r
+\r
+ /* Expand wildcards on commandline */\r
+\r
+ nargc=argc; nargv=argv;\r
+#ifndef __DJGPP__\r
+ MyGlob(&nargc,&nargv,0);\r
+#else\r
+ setvbuf(stdout, NULL, _IONBF, 0);\r
+ __djgpp_set_ctrl_c(0);\r
+#endif\r
+\r
+ /*\r
+ Initialize soundcard parameters.. you _have_ to do this\r
+ before calling MD_Init(), and it's illegal to change them\r
+ after you've called MD_Init()\r
+ */\r
+\r
+ md_mixfreq =44100; /* standard mixing freq */\r
+ md_dmabufsize =20000; /* standard dma buf size */\r
+ md_mode =DMODE_16BITS|DMODE_STEREO; /* standard mixing mode */\r
+ md_device =0; /* standard device: autodetect */\r
+\r
+ /*\r
+ Register the loaders we want to use..\r
+ */\r
+\r
+ ML_RegisterLoader(&load_m15); /* if you use m15load, register it as first! */\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_mtm);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_stm);\r
+ ML_RegisterLoader(&load_ult);\r
+ ML_RegisterLoader(&load_uni);\r
+ ML_RegisterLoader(&load_xm);\r
+\r
+ /*\r
+ Register the drivers we want to use:\r
+ */\r
+\r
+ MD_RegisterDriver(&drv_nos);\r
+#ifdef __OS2__\r
+ MD_RegisterDriver(&drv_os2);\r
+#elif defined(__WIN32__)\r
+ MD_RegisterDriver(&drv_w95);\r
+#else\r
+ MD_RegisterDriver(&drv_ss);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+#endif\r
+\r
+ MD_RegisterPlayer(tickhandler);\r
+\r
+ /* Parse option switches using standard getopt function: */\r
+\r
+ opterr=0;\r
+\r
+ while( !cmderr &&\r
+ (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){\r
+\r
+ switch(t){\r
+\r
+ case 'd':\r
+ md_device=atoi(optarg);\r
+ break;\r
+\r
+ case 'l':\r
+ if(optarg[0]=='d') MD_InfoDriver();\r
+ else if(optarg[0]=='l') ML_InfoLoader();\r
+ else{\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ exit(0);\r
+\r
+ case 'r':\r
+ mp_loop=1;\r
+ break;\r
+\r
+ case 'm':\r
+ md_mode&=~DMODE_STEREO;\r
+ break;\r
+\r
+ case '8':\r
+ md_mode&=~DMODE_16BITS;\r
+ break;\r
+\r
+ case 'i':\r
+ md_mode|=DMODE_INTERP;\r
+ break;\r
+\r
+ case 'x':\r
+ mp_extspd=0;\r
+ break;\r
+\r
+ case 'p':\r
+ mp_panning=0;\r
+ break;\r
+\r
+ case 'v':\r
+ if((mp_volume=atoi(optarg))>100) mp_volume=100;\r
+ break;\r
+\r
+ case 'f':\r
+ md_mixfreq=atol(optarg);\r
+ break;\r
+\r
+ case 'h':\r
+ morehelp=1;\r
+ cmderr=1;\r
+ break;\r
+\r
+ case '?':\r
+ puts("\07Invalid switch or option needs an argument\n");\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(cmderr || optind>=nargc){\r
+\r
+ /*\r
+ there was an error in the commandline, or there were no true\r
+ arguments, so display a usage message\r
+ */\r
+\r
+ puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");\r
+\r
+ if(morehelp)\r
+ puts(helptext);\r
+ else\r
+ puts("Type MIKMOD /h for more help.");\r
+\r
+ exit(-1);\r
+ }\r
+\r
+ /* initialize soundcard */\r
+\r
+ if(!MD_Init()){\r
+ printf("Driver error: %s.\n",myerr);\r
+ return 0;\r
+ }\r
+\r
+ printf("Using %s for %d bit %s %s sound at %u Hz\n\n",\r
+ md_driver->Name,\r
+ (md_mode&DMODE_16BITS) ? 16:8,\r
+ (md_mode&DMODE_INTERP) ? "interpolated":"normal",\r
+ (md_mode&DMODE_STEREO) ? "stereo":"mono",\r
+ md_mixfreq);\r
+\r
+#ifdef __OS2__\r
+ DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );\r
+#endif\r
+\r
+ for(quit=0; !quit && optind<nargc; optind++){\r
+\r
+ printf("File : %s\n",nargv[optind]);\r
+\r
+ /* load the module */\r
+\r
+ mf=ML_LoadFN(nargv[optind]);\r
+\r
+ /* didn't work -> exit with errormsg. */\r
+\r
+ if(mf==NULL){\r
+ printf("MikMod Error: %s\n",myerr);\r
+ break;\r
+ }\r
+\r
+ /* initialize modplayer to play this module */\r
+\r
+ MP_Init(mf);\r
+\r
+ printf( "Songname: %s\n"\r
+ "Modtype : %s\n"\r
+ "Periods : %s,%s\n",\r
+ mf->songname,\r
+ mf->modtype,\r
+ (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",\r
+ (mf->flags&UF_LINEAR) ? "Linear" : "Log");\r
+\r
+ /*\r
+ set the number of voices to use.. you\r
+ could add extra channels here (e.g. md_numchn=mf->numchn+4; )\r
+ to use for your own soundeffects:\r
+ */\r
+\r
+ md_numchn=mf->numchn;\r
+\r
+ /* start playing the module: */\r
+\r
+ MD_PlayStart();\r
+\r
+ while(!MP_Ready()){\r
+\r
+ char c;\r
+\r
+ c=kbhit() ? getch() : 0;\r
+\r
+ if(c=='+')\r
+ MP_NextPosition();\r
+ else if(c=='-')\r
+ MP_PrevPosition();\r
+ else if(c==0x1b){\r
+ quit=1;\r
+ break;\r
+ }\r
+ else if(c==' ') break;\r
+\r
+ MD_Update();\r
+\r
+ /* wait a bit */\r
+\r
+#if defined(__OS2__)\r
+ DosSleep(40); /* hmmmm */\r
+#elif defined(__WIN32__)\r
+ Sleep(10);\r
+#elif defined(__DJGPP__)\r
+ /* no wait for djgpp ? */\r
+#else\r
+ delay(10);\r
+#endif\r
+ printf("\rsngpos:%d patpos:%d sngspd %d bpm %d ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);\r
+ }\r
+\r
+ MD_PlayStop(); /* stop playing */\r
+ ML_Free(mf); /* and free the module */\r
+ puts("\n");\r
+ }\r
+ MD_Exit();\r
+ return 0;\r
+}\r
--- /dev/null
+#ifndef MIKMOD_H\r
+#define MIKMOD_H\r
+\r
+#include <stdio.h>\r
+#include "mtypes.h" /* include atomic mikmod types */\r
+\r
+\r
+#define mikbanner \\r
+"=======================================================================\n" \\r
+"MIKMOD v2.10 - Portable version - Programmed by MikMak of HaRDCoDE '95\n" \\r
+"=======================================================================\n" \\r
+"This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \\r
+"E-Mail : mikmak@stack.urc.tue.nl\n"\r
+\r
+\r
+/*\r
+ error variables:\r
+ ===============\r
+*/\r
+\r
+extern char *ERROR_ALLOC_STRUCT;\r
+extern char *ERROR_LOADING_PATTERN;\r
+extern char *ERROR_LOADING_TRACK;\r
+extern char *ERROR_LOADING_HEADER;\r
+extern char *ERROR_NOT_A_MODULE;\r
+extern char *ERROR_LOADING_SAMPLEINFO;\r
+extern char *ERROR_OUT_OF_HANDLES;\r
+extern char *ERROR_SAMPLE_TOO_BIG;\r
+extern char *myerr;\r
+\r
+\r
+\r
+#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)\r
+int _mm_fseek(FILE *stream,long offset,int whence);\r
+void _mm_setiobase(long iobase);\r
+long _mm_ftell(FILE *stream);\r
+\r
+\r
+extern SBYTE _mm_read_SBYTE (FILE *fp);\r
+extern UBYTE _mm_read_UBYTE (FILE *fp);\r
+\r
+extern SWORD _mm_read_M_SWORD (FILE *fp);\r
+extern SWORD _mm_read_I_SWORD (FILE *fp);\r
+\r
+extern UWORD _mm_read_M_UWORD(FILE *fp);\r
+extern UWORD _mm_read_I_UWORD(FILE *fp);\r
+\r
+extern SLONG _mm_read_M_SLONG (FILE *fp);\r
+extern SLONG _mm_read_I_SLONG (FILE *fp);\r
+\r
+extern ULONG _mm_read_M_ULONG(FILE *fp);\r
+extern ULONG _mm_read_I_ULONG(FILE *fp);\r
+\r
+extern int _mm_read_str(char *str, int size, FILE *fp);\r
+\r
+extern int _mm_read_SBYTES (SBYTE *buffer, int number, FILE *fp);\r
+extern int _mm_read_UBYTES (UBYTE *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+\r
+\r
+extern void _mm_write_SBYTE (SBYTE data,FILE *fp);\r
+extern void _mm_write_UBYTE (UBYTE data,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORD (SWORD data,FILE *fp);\r
+extern void _mm_write_I_SWORD (SWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORD (UWORD data,FILE *fp);\r
+extern void _mm_write_I_UWORD (UWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONG (SLONG data,FILE *fp);\r
+extern void _mm_write_I_SLONG (SLONG data,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONG (ULONG data,FILE *fp);\r
+extern void _mm_write_I_ULONG (ULONG data,FILE *fp);\r
+\r
+extern void _mm_write_SBYTES (SBYTE *data, int number,FILE *fp);\r
+extern void _mm_write_UBYTES (UBYTE *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORDS (SWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_SWORDS (SWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONGS (SLONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_SLONGS (SLONG *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp);\r
+\r
+\r
+/**************************************************************************\r
+****** Unitrack stuff: ****************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ prototypes:\r
+*/\r
+\r
+void UniSetRow(UBYTE *t);\r
+UBYTE UniGetByte(void);\r
+UBYTE *UniFindRow(UBYTE *t,UWORD row);\r
+void UniReset(void);\r
+void UniWrite(UBYTE data);\r
+void UniNewline(void);\r
+void UniInstrument(UBYTE ins);\r
+void UniNote(UBYTE note);\r
+void UniPTEffect(UBYTE eff,UBYTE dat);\r
+UBYTE *UniDup(void);\r
+void UniSkipOpcode(UBYTE op);\r
+BOOL UniInit(void);\r
+void UniCleanup(void);\r
+UWORD TrkLen(UBYTE *t);\r
+BOOL MyCmp(UBYTE *a,UBYTE *b,UWORD l);\r
+\r
+/*\r
+ all known effects:\r
+*/\r
+\r
+enum {\r
+ UNI_NOTE=1,\r
+ UNI_INSTRUMENT,\r
+ UNI_PTEFFECT0,\r
+ UNI_PTEFFECT1,\r
+ UNI_PTEFFECT2,\r
+ UNI_PTEFFECT3,\r
+ UNI_PTEFFECT4,\r
+ UNI_PTEFFECT5,\r
+ UNI_PTEFFECT6,\r
+ UNI_PTEFFECT7,\r
+ UNI_PTEFFECT8,\r
+ UNI_PTEFFECT9,\r
+ UNI_PTEFFECTA,\r
+ UNI_PTEFFECTB,\r
+ UNI_PTEFFECTC,\r
+ UNI_PTEFFECTD,\r
+ UNI_PTEFFECTE,\r
+ UNI_PTEFFECTF,\r
+ UNI_S3MEFFECTA,\r
+ UNI_S3MEFFECTD,\r
+ UNI_S3MEFFECTE,\r
+ UNI_S3MEFFECTF,\r
+ UNI_S3MEFFECTI,\r
+ UNI_S3MEFFECTQ,\r
+ UNI_S3MEFFECTT,\r
+ UNI_XMEFFECTA,\r
+ UNI_XMEFFECTG,\r
+ UNI_XMEFFECTH,\r
+ UNI_XMEFFECTP\r
+};\r
+\r
+\r
+/**************************************************************************\r
+****** mikmod types: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+/*\r
+ Sample format flags:\r
+*/\r
+\r
+#define SF_16BITS 1\r
+#define SF_SIGNED 2\r
+#define SF_DELTA 4\r
+#define SF_BIG_ENDIAN 8\r
+#define SF_LOOP 16\r
+#define SF_BIDI 32\r
+#define SF_OWNPAN 64\r
+#define SF_REVERSE 128\r
+\r
+\r
+/*\r
+ Envelope flags:\r
+*/\r
+\r
+#define EF_ON 1\r
+#define EF_SUSTAIN 2\r
+#define EF_LOOP 4\r
+\r
+\r
+/*\r
+ Unimod flags\r
+*/\r
+\r
+#define UF_XMPERIODS 1 /* if set use XM periods/finetuning */\r
+#define UF_LINEAR 2 /* if set use LINEAR periods */\r
+\r
+\r
+typedef struct ENVPT{\r
+ SWORD pos;\r
+ SWORD val;\r
+} ENVPT;\r
+\r
+\r
+typedef struct SAMPLE{\r
+ UWORD c2spd; /* finetune frequency */\r
+ SBYTE transpose; /* transpose value */\r
+ UBYTE volume; /* volume 0-64 */\r
+ UBYTE panning; /* panning */\r
+ ULONG length; /* length of sample (in samples!) */\r
+ ULONG loopstart; /* repeat position (relative to start, in samples) */\r
+ ULONG loopend; /* repeat end */\r
+ UWORD flags; /* sample format */\r
+ ULONG seekpos; /* seek position in file */\r
+ char *samplename; /* name of the sample */\r
+ SWORD handle; /* sample handle */\r
+} SAMPLE;\r
+\r
+\r
+typedef struct INSTRUMENT{\r
+ UBYTE numsmp;\r
+ UBYTE samplenumber[96];\r
+\r
+ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE volpts;\r
+ UBYTE volsus;\r
+ UBYTE volbeg;\r
+ UBYTE volend;\r
+ ENVPT volenv[12];\r
+\r
+ UBYTE panflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE panpts;\r
+ UBYTE pansus;\r
+ UBYTE panbeg;\r
+ UBYTE panend;\r
+ ENVPT panenv[12];\r
+\r
+ UBYTE vibtype;\r
+ UBYTE vibsweep;\r
+ UBYTE vibdepth;\r
+ UBYTE vibrate;\r
+\r
+ UWORD volfade;\r
+ char *insname;\r
+ SAMPLE *samples;\r
+} INSTRUMENT;\r
+\r
+\r
+/*\r
+ MikMod UNImod types:\r
+ ====================\r
+*/\r
+\r
+typedef struct UNIMOD{\r
+ UBYTE numchn; /* number of channels */\r
+ UWORD numpos; /* number of positions in this song */\r
+ UWORD reppos; /* restart position */\r
+ UWORD numpat; /* number of patterns in this song */\r
+ UWORD numtrk; /* number of tracks */\r
+ UWORD numins; /* number of samples */\r
+ UBYTE initspeed; /* */\r
+ UBYTE inittempo; /* */\r
+ UBYTE positions[256]; /* all positions */\r
+ UBYTE panning[32]; /* 32 panning positions */\r
+ UBYTE flags; /* */\r
+ char *songname; /* name of the song */\r
+ char *modtype; /* string type of module */\r
+ char *comment; /* module comments */\r
+ INSTRUMENT *instruments; /* all samples */\r
+ UWORD *patterns; /* array of PATTERN */\r
+ UWORD *pattrows; /* array of number of rows for each pattern */\r
+ UBYTE **tracks; /* array of pointers to tracks */\r
+} UNIMOD;\r
+\r
+\r
+/**************************************************************************\r
+****** Loader stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ loader structure:\r
+*/\r
+\r
+typedef struct LOADER{\r
+ struct LOADER *next;\r
+ char *type;\r
+ char *version;\r
+ BOOL (*Init)(void);\r
+ BOOL (*Test)(void);\r
+ BOOL (*Load)(void);\r
+ void (*Cleanup)(void);\r
+} LOADER;\r
+\r
+\r
+/*\r
+ public loader variables:\r
+*/\r
+\r
+extern UNIMOD of;\r
+extern FILE *modfp;\r
+extern UWORD finetune[16];\r
+\r
+\r
+/*\r
+ main loader prototypes:\r
+*/\r
+\r
+void ML_InfoLoader(void);\r
+void ML_RegisterLoader(LOADER *ldr);\r
+UNIMOD *ML_LoadFP(FILE *fp);\r
+UNIMOD *ML_LoadFN(char *filename);\r
+void ML_Free(UNIMOD *mf);\r
+\r
+\r
+/*\r
+ other loader prototypes: (used by the loader modules)\r
+*/\r
+\r
+BOOL InitTracks(void);\r
+void AddTrack(UBYTE *tr);\r
+BOOL ReadComment(UWORD len);\r
+BOOL AllocPatterns(void);\r
+BOOL AllocTracks(void);\r
+BOOL AllocInstruments(void);\r
+BOOL AllocSamples(INSTRUMENT *i);\r
+char *DupStr(char *s,UWORD len);\r
+void *MyMalloc(size_t size);\r
+void *MyCalloc(size_t nitems,size_t size);\r
+\r
+\r
+/*\r
+ Declare external loaders:\r
+*/\r
+extern LOADER load_uni;\r
+extern LOADER load_mod;\r
+extern LOADER load_m15;\r
+extern LOADER load_mtm;\r
+extern LOADER load_s3m;\r
+extern LOADER load_stm;\r
+extern LOADER load_ult;\r
+extern LOADER load_xm;\r
+\r
+\r
+/**************************************************************************\r
+****** Wavload stuff: *****************************************************\r
+**************************************************************************/\r
+\r
+SAMPLE *MW_LoadWavFP(FILE *fp);\r
+SAMPLE *MW_LoadWavFN(char *filename);\r
+void MW_FreeWav(SAMPLE *si);\r
+\r
+\r
+/**************************************************************************\r
+****** Driver stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ max. number of handles a driver has to provide. (not strict)\r
+*/\r
+\r
+#define MAXSAMPLEHANDLES 128\r
+\r
+\r
+/*\r
+ possible mixing mode bits:\r
+*/\r
+\r
+#define DMODE_STEREO 1\r
+#define DMODE_16BITS 2\r
+#define DMODE_INTERP 4\r
+\r
+\r
+/*\r
+ driver structure:\r
+*/\r
+\r
+typedef struct DRIVER{\r
+ struct DRIVER *next;\r
+ char *Name;\r
+ char *Version;\r
+ BOOL (*IsPresent) (void);\r
+ SWORD (*SampleLoad) (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+ void (*SampleUnLoad) (SWORD handle);\r
+ BOOL (*Init) (void);\r
+ void (*Exit) (void);\r
+ void (*PlayStart) (void);\r
+ void (*PlayStop) (void);\r
+ void (*Update) (void);\r
+ void (*VoiceSetVolume) (UBYTE voice,UBYTE vol);\r
+ void (*VoiceSetFrequency) (UBYTE voice,ULONG frq);\r
+ void (*VoiceSetPanning) (UBYTE voice,UBYTE pan);\r
+ void (*VoicePlay) (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+} DRIVER;\r
+\r
+\r
+/*\r
+ public driver variables:\r
+*/\r
+\r
+extern DRIVER *md_driver;\r
+extern UWORD md_device;\r
+extern UWORD md_mixfreq;\r
+extern UWORD md_dmabufsize;\r
+extern UWORD md_mode;\r
+extern UBYTE md_numchn;\r
+extern UBYTE md_bpm;\r
+extern void (*md_player)(void);\r
+\r
+/*\r
+ main driver prototypes:\r
+*/\r
+\r
+void MD_InfoDriver(void);\r
+void MD_RegisterDriver(DRIVER *drv);\r
+void MD_RegisterPlayer(void (*plr)(void));\r
+SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void MD_SampleUnLoad(SWORD handle);\r
+BOOL MD_Init(void);\r
+void MD_Exit(void);\r
+void MD_PlayStart(void);\r
+void MD_PlayStop(void);\r
+void MD_SetBPM(UBYTE bpm);\r
+void MD_Update(void);\r
+void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);\r
+void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void MD_VoiceSetPanning(UBYTE voice,ULONG pan);\r
+void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);\r
+void SL_Load(void *buffer,ULONG length);\r
+\r
+/*\r
+ Declare external drivers:\r
+*/\r
+\r
+extern DRIVER drv_gus; /* gravis ultrasound driver */\r
+extern DRIVER drv_sb; /* soundblaster DSP driver */\r
+extern DRIVER drv_ss; /* ensoniq soundscape driver */\r
+extern DRIVER drv_nos; /* nosound driver */\r
+extern DRIVER drv_raw; /* file output driver */\r
+extern DRIVER drv_w95; /* win95 driver */\r
+extern DRIVER drv_awe; /* experimental SB-AWE driver */\r
+extern DRIVER drv_vox; /* linux voxware driver */\r
+extern DRIVER drv_af; /* Dec Alpha AudioFile driver */\r
+extern DRIVER drv_sun; /* Sun driver */\r
+extern DRIVER drv_os2; /* Os2 driver */\r
+extern DRIVER drv_tim; /* timing driver */\r
+\r
+/**************************************************************************\r
+****** Player stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+typedef struct ENVPR{\r
+ UBYTE flg; /* envelope flag */\r
+ UBYTE pts; /* number of envelope points */\r
+ UBYTE sus; /* envelope sustain index */\r
+ UBYTE beg; /* envelope loop begin */\r
+ UBYTE end; /* envelope loop end */\r
+ SWORD p; /* current envelope counter */\r
+ UWORD a; /* envelope index a */\r
+ UWORD b; /* envelope index b */\r
+ ENVPT *env; /* envelope points */\r
+} ENVPR;\r
+\r
+\r
+typedef struct AUDTMP{\r
+ INSTRUMENT *i;\r
+ SAMPLE *s;\r
+\r
+ UWORD fadevol; /* fading volume */\r
+\r
+ ENVPR venv;\r
+ ENVPR penv;\r
+\r
+ UBYTE keyon; /* if true=key is pressed. */\r
+ UBYTE kick; /* if true=sample has to be restarted */\r
+ UBYTE sample; /* which sample number (0-31) */\r
+ SWORD handle; /* which sample-handle */\r
+\r
+ ULONG start; /* The start byte index in the sample */\r
+\r
+ UBYTE panning; /* panning position */\r
+ UBYTE pansspd; /* panslide speed */\r
+\r
+ SBYTE volume; /* amiga volume (0 t/m 64) to play the sample at */\r
+ UWORD period; /* period to play the sample at */\r
+\r
+ /* You should not have to use the values\r
+ below in the player routine */\r
+\r
+ SBYTE transpose;\r
+\r
+ UBYTE note; /* */\r
+\r
+ SWORD ownper;\r
+ SWORD ownvol;\r
+\r
+ UBYTE *row; /* row currently playing on this channel */\r
+\r
+ SBYTE retrig; /* retrig value (0 means don't retrig) */\r
+ UWORD c2spd; /* what finetune to use */\r
+\r
+ SBYTE tmpvolume; /* tmp volume */\r
+\r
+ UWORD tmpperiod; /* tmp period */\r
+ UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */\r
+\r
+ UWORD slidespeed; /* */\r
+ UWORD portspeed; /* noteslide speed (toneportamento) */\r
+\r
+ UBYTE s3mtremor; /* s3m tremor (effect I) counter */\r
+ UBYTE s3mtronof; /* s3m tremor ontime/offtime */\r
+\r
+ UBYTE s3mvolslide; /* last used volslide */\r
+\r
+ UBYTE s3mrtgspeed; /* last used retrig speed */\r
+ UBYTE s3mrtgslide; /* last used retrig slide */\r
+\r
+ UBYTE glissando; /* glissando (0 means off) */\r
+ UBYTE wavecontrol; /* */\r
+\r
+ SBYTE vibpos; /* current vibrato position */\r
+ UBYTE vibspd; /* "" speed */\r
+ UBYTE vibdepth; /* "" depth */\r
+\r
+ SBYTE trmpos; /* current tremolo position */\r
+ UBYTE trmspd; /* "" speed */\r
+ UBYTE trmdepth; /* "" depth */\r
+\r
+ UWORD soffset; /* last used sample-offset (effect 9) */\r
+} AUDTMP;\r
+\r
+\r
+extern AUDTMP mp_audio[32]; /* max eight channels */\r
+extern UBYTE mp_bpm; /* beats-per-minute speed */\r
+extern UWORD mp_patpos; /* current row number (0-63) */\r
+extern SWORD mp_sngpos; /* current song position */\r
+extern UWORD mp_sngspd; /* current songspeed */\r
+\r
+extern BOOL mp_loop;\r
+extern BOOL mp_panning;\r
+extern BOOL mp_extspd;\r
+extern UBYTE mp_volume;\r
+\r
+/*\r
+ player prototypes:\r
+*/\r
+\r
+int MP_Ready(void);\r
+void MP_NextPosition(void);\r
+void MP_PrevPosition(void);\r
+void MP_SetPosition(UWORD pos);\r
+void MP_HandleTick(void);\r
+void MP_Init(UNIMOD *m);\r
+\r
+\r
+/**************************************************************************\r
+****** Virtual channel stuff: *********************************************\r
+**************************************************************************/\r
+\r
+BOOL VC_Init(void);\r
+void VC_Exit(void);\r
+\r
+void VC_PlayStart(void);\r
+void VC_PlayStop(void);\r
+\r
+SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void VC_SampleUnload(SWORD handle);\r
+\r
+void VC_WriteSamples(SBYTE *buf,UWORD todo);\r
+UWORD VC_WriteBytes(SBYTE *buf,UWORD todo);\r
+void VC_SilenceBytes(SBYTE *buf,UWORD todo);\r
+\r
+void VC_VoiceSetVolume(UBYTE voice,UBYTE vol);\r
+void VC_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void VC_VoiceSetPanning(UBYTE voice,UBYTE pan);\r
+void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+byte *screen, *screenx; // virscr | realscr\r
+\r
+// ================================= Code ====================================\r
+\r
+void SetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int Mode13hShutdown(void)\r
+{\r
+ SetMode(0x3);\r
+ free(screen);\r
+ return 0;\r
+}\r
+\r
+void xShowPage(int startofs)\r
+{\r
+ asm("movl _screen, %%esi \n\t"\r
+ "addl %0, %%esi \n\t"\r
+ "movl _screenx, %%edi \n\t"\r
+ "movl $200, %%eax \n\t"\r
+"lineloop: \n\t"\r
+ "movl $80, %%ecx \n\t"\r
+ "rep \n\t"\r
+ "movsl \n\t"\r
+ "addl $32, %%esi \n\t"\r
+ "decl %%eax \n\t"\r
+ "jnz lineloop \n\t"\r
+ :\r
+ : "m" (startofs)\r
+ : "esi", "edi", "cc", "eax", "ecx");\r
+}\r
+\r
+int Mode13hShowPage(void)\r
+{\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+ xShowPage((16*352)+16);\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%edx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"csl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $352, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%ecx \n\t"\r
+ "shrl $2, %%ecx \n\t"\r
+ "repz \n\t"\r
+ "movsl \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz csl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopyTile(int x, int y, byte *spr)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+" ctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl $352, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz ctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr)\r
+ : "eax","ecx","esi","edi","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%ecx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"tcsl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $352, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%edx \n\t"\r
+"drawloop: \n\t"\r
+ "lodsb \n\t"\r
+ "orb %%al, %%al \n\t"\r
+ "jz nodraw \n\t"\r
+ "stosb \n\t"\r
+ "decl %%edx \n\t"\r
+ "jz endline \n\t"\r
+ "jmp drawloop \n\t"\r
+"nodraw: \n\t"\r
+ "incl %%edi \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz drawloop \n\t"\r
+"endline: \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tcsl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCopyTile(int x, int y, byte *spr, byte *matte)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl %3, %%edx \n\t"\r
+"tctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl $352, %%edi \n\t"\r
+ "addl $16, %%edx \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr), "m" (matte)\r
+ : "eax","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hScaleSprite(int x, int y, int w, int h, int tw, int th, byte *s)\r
+{ int i,j,xm,ym,xd,yd,sx,sy=0,xs,ys,dys=0;\r
+ unsigned char *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (!tw || !th) return 0;\r
+ tw += sgn(tw); th += sgn(th);\r
+ xm = abs(tw); ym = abs(th);\r
+ xs = (w<<16)/xm; ys = (h<<16)/ym;\r
+ xd = sgn(tw); yd = sgn(th);\r
+\r
+ if (tw>0 && th>0) dys=tsx-xm;\r
+ else if (tw>0 && th<0) dys=(0-tsx)-xm;\r
+ else if (tw<0 && th>0) dys=tsx+xm;\r
+ else if (tw<0 && th<0) dys=(0-tsx)+xm;\r
+\r
+ d = screen+(y*tsx)+x;\r
+ for (i=0;i<ym;++i) {\r
+ sx=0;\r
+ for (j=0;j<xm;++j) {\r
+ *d=s[(sx>>16)];\r
+ d+=xd;\r
+ sx+=xs;\r
+ }\r
+ d+=dys;\r
+ sy+=ys;\r
+ s+=(sy>>16)*w;\r
+ sy&=0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl $22, %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "movl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl $22, %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop1: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "orw %%ax, %%ax \n\t"\r
+ "jz next1 \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "movl %%esi, %%edx \n\t"\r
+ "addl _vspmask, %%edx \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "addl %%eax, %%edx \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+"next1: \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hColorField(int x, int y, byte c)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%eax \n\t"\r
+ "imul $352, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl $8, %%ecx \n\t"\r
+ "movb %2, %%al \n\t"\r
+"lineloop1: \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "addl $336, %%edi \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "addl $336, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz lineloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (c)\r
+ : "eax","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(screen+(352*16)+16,0,(352*200));\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hPutPixel(int x, int y, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ screen[(y*tsx)+x]=color;\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hGetPixel(int x, int y)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ cpubyte=ETC;\r
+ return screen[(y*tsx)+x];\r
+}\r
+\r
+int Mode13hHLine(int x, int y, int x2, int color)\r
+{ byte *d;\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (x2<x) { int t=x2; x=x2; x2=t; }\r
+\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ x2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hVLine(int x, int y, int y2, int color)\r
+{ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (y2<y) { int t=y2; x=y2; y2=t; }\r
+\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ y2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hLine(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ x1+=16;y1+=16; // aen; adjust these here??\r
+ x2+=16;y2+=16;\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCircle(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ Mode13hPutPixel(x+cx,y+cy,color);\r
+ if (cx) Mode13hPutPixel(x-cx,y+cy,color);\r
+ if (cy) Mode13hPutPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) Mode13hPutPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ Mode13hPutPixel(x+cy,y+cx,color);\r
+ if (cx) Mode13hPutPixel(x+cy,y-cx,color);\r
+ if (cy) Mode13hPutPixel(x-cy,y+cx,color);\r
+ if (cx && cy) Mode13hPutPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCircleFill(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ Mode13hHLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) Mode13hHLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ Mode13hHLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) Mode13hHLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hRect(int x, int y, int x2, int y2, int color)\r
+{\r
+ Mode13hHLine(x,y,x2,color);\r
+ Mode13hHLine(x,y2,x2,color);\r
+ Mode13hVLine(x,y+1,y2-1,color);\r
+ Mode13hVLine(x2,y+1,y2-1,color);\r
+ return 0;\r
+}\r
+\r
+int Mode13hRectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (y2<y) { int t=y2; y=y2; y2=t; }\r
+\r
+ for (; y<=y2; y++)\r
+ Mode13hHLine(x,y,x2,color);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void InitMode13h(void)\r
+{\r
+ SetMode(0x13);\r
+\r
+ screenx=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ screen=(byte *) malloc(95744);\r
+ memset(screen, 0, 95744);\r
+\r
+ sx=320; sy=200;\r
+ tsx=352; tsy=232;\r
+ tx=20; ty=13;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo = Mode13hShutdown;\r
+ ShowPage = Mode13hShowPage;\r
+ CopySprite = Mode13hCopySprite;\r
+ TCopySprite = Mode13hTCopySprite;\r
+ CCopySprite = Mode13hCCopySprite;\r
+ TCCopySprite = Mode13hTCCopySprite;\r
+ CopyTile = Mode13hCopyTile;\r
+ TCopyTile = Mode13hTCopyTile;\r
+ ScaleSprite = Mode13hScaleSprite;\r
+ RenderMAPLine = Mode13hRenderMAPLine;\r
+ TRenderMAPLine = Mode13hTRenderMAPLine;\r
+ ColorField = Mode13hColorField;\r
+ ClearScreen = Mode13hClearScreen;\r
+ PutPixel = Mode13hPutPixel;\r
+ GetPixel = Mode13hGetPixel;\r
+ HLine = Mode13hHLine;\r
+ VLine = Mode13hVLine;\r
+ Line = Mode13hLine;\r
+ Circle = Mode13hCircle;\r
+ CircleFill = Mode13hCircleFill;\r
+ Rect = Mode13hRect;\r
+ RectFill = Mode13hRectFill;\r
+ DriverDesc = "320x200 (Mode 13h, linear)";\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+void BIOS_SetVideoMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+// =============================== Mode 13h ===================================\r
+\r
+int Mode13hShutdown(int i)\r
+{\r
+ if (i) BIOS_SetVideoMode(0x3);\r
+ free(screen);\r
+ return 0;\r
+}\r
+\r
+void InitMode13h(void)\r
+{\r
+ BIOS_SetVideoMode(0x13);\r
+\r
+ DriverDesc = "320x200 (Mode 13h, linear)";\r
+ sx=320, sy=200;\r
+ tx=20, ty=13;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+\r
+ // setup function drivers\r
+ ShowPage=LFB_ShowPage;\r
+ ShutdownVideo=Mode13hShutdown;\r
+\r
+ video=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vscreen=(byte *) valloc(sx*sy, "vscreen", 0);\r
+ screen=vscreen;\r
+ memset(screen, 0, sx*sy);\r
+}\r
+\r
+// ================================= Mode-X ==================================\r
+\r
+#define SEQU_ADDR 0x3c4\r
+#define CRTC_ADDR 0x3d4\r
+#define MISC_OUTPUT 0x3c2\r
+\r
+#define ATTRCON_ADDR 0x3c0\r
+#define MISC_ADDR 0x3c2\r
+#define VGAENABLE_ADDR 0x3c3\r
+#define SEQ_ADDR 0x3c4\r
+#define GRACON_ADDR 0x3ce\r
+#define CRTC_ADDR 0x3d4\r
+#define STATUS_ADDR 0x3da\r
+\r
+typedef struct\r
+{\r
+ unsigned port;\r
+ byte index, value;\r
+} Register;\r
+\r
+typedef Register *RegisterPtr;\r
+\r
+Register scr256x256[] =\r
+{\r
+ { 0x3c2, 0x00, 0xe3},{ 0x3d4, 0x00, 0x5f},{ 0x3d4, 0x01, 0x3f},\r
+ { 0x3d4, 0x02, 0x40},{ 0x3d4, 0x03, 0x82},{ 0x3d4, 0x04, 0x4A},\r
+ { 0x3d4, 0x05, 0x9A},{ 0x3d4, 0x06, 0x23},{ 0x3d4, 0x07, 0xb2},\r
+ { 0x3d4, 0x08, 0x00},{ 0x3d4, 0x09, 0x61},{ 0x3d4, 0x10, 0x0a},\r
+ { 0x3d4, 0x11, 0xac},{ 0x3d4, 0x12, 0xff},{ 0x3d4, 0x13, 0x20},\r
+ { 0x3d4, 0x14, 0x40},{ 0x3d4, 0x15, 0x07},{ 0x3d4, 0x16, 0x1a},\r
+ { 0x3d4, 0x17, 0xa3},{ 0x3c4, 0x01, 0x01},{ 0x3c4, 0x04, 0x0e},\r
+ { 0x3ce, 0x05, 0x40},{ 0x3ce, 0x06, 0x05},{ 0x3c0, 0x10, 0x41},\r
+ { 0x3c0, 0x13, 0x00}\r
+};\r
+\r
+// ================================= Code ====================================\r
+\r
+void plane(byte p)\r
+{\r
+ int hi=1<<p;\r
+ outpw(0x03c4, (hi<<8)|0x02);\r
+}\r
+\r
+int ModeXShutdown(int i)\r
+{\r
+ if (i) BIOS_SetVideoMode(0x3);\r
+ vfree(screen);\r
+ return 0;\r
+}\r
+\r
+int ModeXShowPage()\r
+{\r
+ byte *s,*d;\r
+ int x,y,k;\r
+ int sx2;\r
+\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ d=video;\r
+ sx2=sx>>2;\r
+\r
+ for (y=0; y<sy; ++y,d+=sx2)\r
+ {\r
+ s=screen+(y*sx);\r
+ for (k=0; k<4; k++,s-=sx)\r
+ {\r
+ plane(k);\r
+ for (x=0; x<sx2; x++,s+=4)\r
+ d[x]=s[k];\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+static void outReg(Register r)\r
+{\r
+ switch (r.port)\r
+ {\r
+ // First handle special cases:\r
+\r
+ case ATTRCON_ADDR:\r
+ // reset read/write flip-flop\r
+ inp(STATUS_ADDR);\r
+ // ensure VGA output is enabled\r
+ outp(ATTRCON_ADDR, r.index | 0x20);\r
+ outp(ATTRCON_ADDR, r.value);\r
+ break;\r
+\r
+ case MISC_ADDR:\r
+ case VGAENABLE_ADDR:\r
+ // directly to the port\r
+ outp(r.port, r.value);\r
+ break;\r
+\r
+ case SEQ_ADDR:\r
+ case GRACON_ADDR:\r
+ case CRTC_ADDR:\r
+ default:\r
+ // index to port\r
+ outp(r.port, r.index);\r
+ // value to port+1\r
+ outp(r.port + 1, r.value);\r
+ break;\r
+ }\r
+}\r
+\r
+// readyVgaRegs() does the initialization to make the VGA ready to\r
+// accept any combination of configuration register settings.\r
+//\r
+// This involves enabling writes to index 0 to 7 of the CRT controller\r
+// (port 0x3d4), by clearing the most significant bit (bit 7) of index\r
+// 0x11.\r
+\r
+static void readyVgaRegs(void)\r
+{\r
+ int v;\r
+\r
+ outp(0x3d4, 0x11);\r
+ v = inp(0x3d5) & 0x7f;\r
+ outp(0x3d4, 0x11);\r
+ outp(0x3d5, v);\r
+}\r
+\r
+// outRegArray sets n registers according to the array pointed to by r.\r
+// First, indexes 0-7 of the CRT controller are enabled for writing.\r
+\r
+static void outRegArray(Register *r, int n)\r
+{\r
+ readyVgaRegs();\r
+ while (n--)\r
+ outReg (*r++);\r
+}\r
+\r
+void Set256x256()\r
+{\r
+ DriverDesc = "256x256 (ModeX, planar)";\r
+\r
+ outRegArray(scr256x256, sizeof(scr256x256) / sizeof (Register));\r
+\r
+ sx=256, sy=256;\r
+ tx=17, ty=16;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+}\r
+\r
+void Set320x240()\r
+{ char in_byte;\r
+\r
+ DriverDesc = "320x240 (ModeX, planar)";\r
+\r
+ outpw(SEQU_ADDR, 0x0604);\r
+ memset((unsigned char *)0xA0000 + __djgpp_conventional_base,0,0x10000); // for clean mode switch\r
+ outpw(SEQU_ADDR, 0x0110);\r
+ outp(MISC_OUTPUT, 0xe3);\r
+ outpw(SEQU_ADDR, 0x0300);\r
+ outp(CRTC_ADDR, 0x11);\r
+ in_byte = inp((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outp((CRTC_ADDR+1), in_byte);\r
+ outpw(CRTC_ADDR, 0x0d06);\r
+ outpw(CRTC_ADDR, 0x3e07);\r
+ outpw(CRTC_ADDR, 0x4109);\r
+ outpw(CRTC_ADDR, 0xea10);\r
+ outpw(CRTC_ADDR, 0xac11);\r
+ outpw(CRTC_ADDR, 0xdf12);\r
+ outpw(CRTC_ADDR, 0x0014);\r
+ outpw(CRTC_ADDR, 0xe715);\r
+ outpw(CRTC_ADDR, 0x0616);\r
+ outpw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=320, sy=240;\r
+ tx=20, ty=15;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+}\r
+\r
+void Set360x240()\r
+{ char in_byte;\r
+\r
+ DriverDesc = "360x240 (ModeX, planar)";\r
+\r
+ outpw(SEQU_ADDR, 0x0604);\r
+ memset((unsigned char *)0xA0000 + __djgpp_conventional_base,0,0x10000); // for clean mode switch\r
+ outpw(SEQU_ADDR, 0x100);\r
+ outp(MISC_OUTPUT, 0xe7);\r
+ outpw(SEQU_ADDR, 0x300);\r
+ outp(CRTC_ADDR, 0x11);\r
+ in_byte = inp((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outp((CRTC_ADDR+1), in_byte);\r
+ outpw(CRTC_ADDR, 0x6b00);\r
+ outpw(CRTC_ADDR, 0x5901);\r
+ outpw(CRTC_ADDR, 0x5a02);\r
+ outpw(CRTC_ADDR, 0x8e03);\r
+ outpw(CRTC_ADDR, 0x5e04);\r
+ outpw(CRTC_ADDR, 0x8a05);\r
+ outpw(CRTC_ADDR, 0x0d06);\r
+ outpw(CRTC_ADDR, 0x3e07);\r
+ outpw(CRTC_ADDR, 0x4109);\r
+ outpw(CRTC_ADDR, 0xea10);\r
+ outpw(CRTC_ADDR, 0xac11);\r
+ outpw(CRTC_ADDR, 0xdf12);\r
+ outpw(CRTC_ADDR, 0x2d13);\r
+ outpw(CRTC_ADDR, 0x0014);\r
+ outpw(CRTC_ADDR, 0xe715);\r
+ outpw(CRTC_ADDR, 0x0616);\r
+ outpw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=360, sy=240;\r
+ tx=23, ty=15;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+}\r
+\r
+void InitModeX(int xres, int yres)\r
+{\r
+ int found;\r
+\r
+ BIOS_SetVideoMode(0x13);\r
+\r
+ found=0;\r
+ if (xres==320 && yres==240) { Set320x240(); found=1; }\r
+ if (xres==360 && yres==240) { Set360x240(); found=1; }\r
+ if (xres==256 && yres==256) { Set256x256(); found=1; }\r
+\r
+ if (!found)\r
+ {\r
+ // resolution not found, bitch...\r
+ err("Internal error: unknown ModeX resolution");\r
+ }\r
+ // resolution found..\r
+ else\r
+ {\r
+ ShowPage=LFB_ShowPage;\r
+ if (xres != 256 && yres != 256)\r
+ ShowPage=ModeXShowPage;\r
+ ShutdownVideo=ModeXShutdown;\r
+ }\r
+\r
+ video=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vscreen=(byte *) valloc(sx*sy, "vscreen", 0);\r
+ screen=vscreen;\r
+ memset(screen, 0, sx*sy);\r
+}\r
+\r
+// ================================= VESA ====================================\r
+\r
+int VESAShutdown(int i)\r
+{\r
+ if (i) BIOS_SetVideoMode(0x3);\r
+ free(screen);\r
+ return 0;\r
+}\r
+\r
+void VESASetBank(int bank)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, 0x4f05);\r
+ SET_BX(r, 0);\r
+ SET_DX(r, bank);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int VESAShowPage(void)\r
+{\r
+ byte *s,*d;\r
+ int y,bytes,bank;\r
+ int span;\r
+\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ s=screen;\r
+ d=video;\r
+\r
+ bank=0;\r
+ bytes=65536;\r
+ VESASetBank(bank++);\r
+\r
+ // *** no padding exists now, can be rewritten smaller/faster - aen\r
+ for (y=sy; y; y--)\r
+ {\r
+ if (bytes >= sx)\r
+ { memcpy(d,s,sx);\r
+ bytes-=sx;\r
+ s+=sx;\r
+ d+=sx;\r
+ }\r
+ else\r
+ { memcpy(d,s,bytes);\r
+ s+=bytes;\r
+ span=sx-bytes;\r
+\r
+ VESASetBank(bank++);\r
+ d=video;\r
+ bytes=65536;\r
+\r
+ memcpy(d,s,span);\r
+ bytes-=span;\r
+ s+=span;\r
+ d+=span;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void Set640x480()\r
+{\r
+ REGISTERS r;\r
+\r
+ DriverDesc = "640x480 (VESA, Banked)";\r
+\r
+ SET_BX(r, 0x0101);\r
+ SET_AX(r, 0x4f02);\r
+ INTERRUPT(0x10, r);\r
+\r
+ sx=640; sy=480;\r
+ tx=40; ty=30;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+}\r
+\r
+void InitVESA(int xres, int yres)\r
+{\r
+ int found;\r
+\r
+ found=0;\r
+ if (xres==640 && yres==480) { Set640x480(); found=1; }\r
+\r
+ if (!found)\r
+ err("Internal error: unknown VESA resolution");\r
+\r
+ // setup driver functions\r
+ ShowPage = VESAShowPage; // reassign for banked VESA video blt\r
+ ShutdownVideo = VESAShutdown;\r
+\r
+ video=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vscreen=(byte *) valloc(sx*sy, "vscreen", 0);\r
+ screen=vscreen;\r
+ memset(screen, 0, sx*sy);\r
+}\r
+\r
+// ============================================================================\r
+\r
+int InitVideo(int xres, int yres)\r
+{\r
+ int found;\r
+\r
+ found=0;\r
+ if (xres==320 && yres==200) { InitMode13h(); found=1; }\r
+ if (xres==320 && yres==240) { InitModeX(xres,yres); found=1; }\r
+ if (xres==360 && yres==240) { InitModeX(xres,yres); found=1; }\r
+ if (xres==256 && yres==256) { InitModeX(xres,yres); found=1; }\r
+ if (xres==640 && yres==480) { InitVESA(xres,yres); found=1; }\r
+\r
+ if (found)\r
+ {\r
+ tsx=xres; tsy=yres;\r
+ Logp("Sys: Initializing %s.", DriverDesc);\r
+ InitMouse(tsx, tsy);\r
+ }\r
+ else\r
+ {\r
+ InitMode13h();\r
+ tsx=320; tsy=200;\r
+ Logp("Unknown video mode %dx%d; defaulting to mode 13h.", xres, yres);\r
+ InitMouse(tsx, tsy);\r
+ }\r
+ LogDone();\r
+ return found;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#define SEQU_ADDR 0x3c4\r
+#define CRTC_ADDR 0x3d4\r
+#define MISC_OUTPUT 0x3c2\r
+\r
+byte *screenbase; // ptr to A000:0000\r
+int endcol,nextl; // end column number thingy | next line\r
+int winofs;\r
+\r
+// ================================= Code ====================================\r
+\r
+void ModeXSetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+void plane(byte p)\r
+{\r
+ int hi=1<<p;\r
+ outpw(0x03c4, (hi<<8)|0x02);\r
+}\r
+\r
+int ModeXShutdown()\r
+{\r
+ ModeXSetMode(0x3);\r
+ vfree(screen);\r
+ return 0;\r
+}\r
+\r
+void clearScreen()\r
+{\r
+ // set write to ALL PLANES simultaneously for extra-quick clears.\r
+ asm("movw $0x3c4, %%dx \n\t"\r
+ "movw $0x0f02, %%ax \n\t"\r
+ "outw %%ax, %%dx \n\t"\r
+ "movl _screenbase, %%edi \n\t"\r
+ "movl $0, %%eax \n\t"\r
+ "movl $11264, %%ecx \n\t"\r
+ "rep \n\t"\r
+ "stosl \n\t"\r
+ :\r
+ :\r
+ : "eax","edx","edi","ecx","cc" );\r
+}\r
+\r
+void SetView(word offset)\r
+{\r
+ while (inportb(0x3da) & 1);\r
+\r
+ _disable();\r
+\r
+ outportb(0x3d4, (offset >> 8) | 0x0c);\r
+ outportb(0x3d4, (offset & 0xff) | 0x0d);\r
+\r
+ _enable();\r
+}\r
+\r
+int ModeXShowPage()\r
+{\r
+ byte *s,*d;\r
+ int x,y,k;\r
+ int sx2;\r
+ int b;\r
+\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ //s=screen+(16*tsx)+16;\r
+ b=(16*tsx)+16;\r
+ d=screenbase;\r
+ sx2=sx>>2;\r
+\r
+ //while (!(inp(986) & 8));\r
+\r
+ for (y=0; y<sy; ++y,d+=sx2)\r
+ {\r
+ s=screen+(y*tsx)+b;\r
+ for (k=0; k<4; k++,s-=sx)\r
+ {\r
+ plane(k);\r
+ for (x=0; x<sx2; x++,s+=4)\r
+ d[x]=s[k];\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%edx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"csl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul _tsx, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%ecx \n\t"\r
+ "shrl $2, %%ecx \n\t"\r
+ "repz \n\t"\r
+ "movsl \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz csl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%ecx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"tcsl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul _tsx, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%edx \n\t"\r
+"drawloop: \n\t"\r
+ "lodsb \n\t"\r
+ "orb %%al, %%al \n\t"\r
+ "jz nodraw \n\t"\r
+ "stosb \n\t"\r
+ "decl %%edx \n\t"\r
+ "jz endline \n\t"\r
+ "jmp drawloop \n\t"\r
+"nodraw: \n\t"\r
+ "incl %%edi \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz drawloop \n\t"\r
+"endline: \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tcsl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCopyTile(int x, int y, byte *spr)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+" ctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl _tsx, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz ctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr)\r
+ : "eax","ecx","esi","edi","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTCopyTile(int x, int y, byte *spr, byte *matte)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl %3, %%edx \n\t"\r
+"tctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl _tsx, %%edi \n\t"\r
+ "addl $16, %%edx \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr), "m" (matte)\r
+ : "eax","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXScaleSprite(int x, int y, int w, int h, int tw, int th, byte *s)\r
+{ int i,j,xm,ym,xd,yd,sx,sy=0,xs,ys,dys=0;\r
+ unsigned char *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (!tw || !th) return 0;\r
+ tw += sgn(tw); th += sgn(th);\r
+ xm = abs(tw); ym = abs(th);\r
+ xs = (w<<16)/xm; ys = (h<<16)/ym;\r
+ xd = sgn(tw); yd = sgn(th);\r
+\r
+ if (tw>0 && th>0) dys=tsx-xm;\r
+ else if (tw>0 && th<0) dys=(0-tsx)-xm;\r
+ else if (tw<0 && th>0) dys=tsx+xm;\r
+ else if (tw<0 && th<0) dys=(0-tsx)+xm;\r
+\r
+ d = screen+(y*tsx)+x;\r
+ for (i=0;i<ym;++i) {\r
+ sx=0;\r
+ for (j=0;j<xm;++j) {\r
+ *d=s[(sx>>16)];\r
+ d+=xd;\r
+ sx+=xs;\r
+ }\r
+ d+=dys;\r
+ sy+=ys;\r
+ s+=(sy>>16)*w;\r
+ sy&=0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl _tx, %%ebx \n\t"\r
+ "incl %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "movl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl _tx, %%ebx \n\t"\r
+ "incl %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop1: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "orw %%ax, %%ax \n\t"\r
+ "jz next1 \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "movl %%esi, %%edx \n\t"\r
+ "addl _vspmask, %%edx \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "addl %%eax, %%edx \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+"next1: \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXColorField(int x, int y, byte c)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%eax \n\t"\r
+ "imul _tsx, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl $8, %%ecx \n\t"\r
+ "movb %2, %%al \n\t"\r
+"lineloop1: \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "addl _sx, %%edi \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "addl _sx, %%edi \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz lineloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (c)\r
+ : "eax","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(screen+(tsx*16)+16,0,(tsx*sy));\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXPutPixel(int x, int y, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ screen[(y*tsx)+x]=color;\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXGetPixel(int x, int y)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ cpubyte=ETC;\r
+ return screen[(y*tsx)+x];\r
+}\r
+\r
+int ModeXHLine(int x, int y, int x2, int color)\r
+{ byte *d;\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (x2<x) { int t=x2; x=x2; x2=t; }\r
+\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ x2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXVLine(int x, int y, int y2, int color)\r
+{ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (y2<y) { int t=y2; x=y2; y2=t; }\r
+\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ y2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXLine(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ x1+=16;y1+=16; // aen; adjust these here??\r
+ x2+=16;y2+=16;\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCircle(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ ModeXPutPixel(x+cx,y+cy,color);\r
+ if (cx) ModeXPutPixel(x-cx,y+cy,color);\r
+ if (cy) ModeXPutPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) ModeXPutPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ ModeXPutPixel(x+cy,y+cx,color);\r
+ if (cx) ModeXPutPixel(x+cy,y-cx,color);\r
+ if (cy) ModeXPutPixel(x-cy,y+cx,color);\r
+ if (cx && cy) ModeXPutPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCircleFill(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ ModeXHLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) ModeXHLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ ModeXHLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) ModeXHLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXRect(int x, int y, int x2, int y2, int color)\r
+{\r
+ ModeXHLine(x,y,x2,color);\r
+ ModeXHLine(x,y2,x2,color);\r
+ ModeXVLine(x,y+1,y2-1,color);\r
+ ModeXVLine(x2,y+1,y2-1,color);\r
+ return 0;\r
+}\r
+\r
+int ModeXRectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (y2<y) { int t=y2; y=y2; y2=t; }\r
+\r
+ for (; y<=y2; y++)\r
+ ModeXHLine(x,y,x2,color);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void Set256x256()\r
+// -- ric: 15/Jun/98 --\r
+// My first attempt at graphics code :)\r
+{\r
+ char in_byte;\r
+\r
+ outportw(SEQU_ADDR, 0x0100);\r
+ outportb(CRTC_ADDR, 0x11);\r
+ in_byte = inportb((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outportb((CRTC_ADDR+1), in_byte);\r
+ outportw(SEQU_ADDR, 0x0604);\r
+ outportb(MISC_OUTPUT, 0xe3);\r
+\r
+ outportb(CRTC_ADDR, 0x0); outportb(CRTC_ADDR+1, 0x5f);\r
+ outportb(CRTC_ADDR, 0x1); outportb(CRTC_ADDR+1, 0x3f);\r
+ outportb(CRTC_ADDR, 0x2); outportb(CRTC_ADDR+1, 0x40);\r
+ outportb(CRTC_ADDR, 0x3); outportb(CRTC_ADDR+1, 0x82);\r
+ outportb(CRTC_ADDR, 0x4); outportb(CRTC_ADDR+1, 0x4a);\r
+ outportb(CRTC_ADDR, 0x5); outportb(CRTC_ADDR+1, 0x9a);\r
+ outportb(CRTC_ADDR, 0x6); outportb(CRTC_ADDR+1, 0x23);\r
+ outportb(CRTC_ADDR, 0x7); outportb(CRTC_ADDR+1, 0xb2);\r
+ outportb(CRTC_ADDR, 0x8); outportb(CRTC_ADDR+1, 0x0);\r
+ outportb(CRTC_ADDR, 0x9); outportb(CRTC_ADDR+1, 0x61);\r
+ outportb(CRTC_ADDR, 0x10); outportb(CRTC_ADDR+1, 0xa);\r
+ outportb(CRTC_ADDR, 0x11); outportb(CRTC_ADDR+1, 0xac);\r
+ outportb(CRTC_ADDR, 0x12); outportb(CRTC_ADDR+1, 0xff);\r
+ outportb(CRTC_ADDR, 0x14); outportb(CRTC_ADDR+1, 0x0);\r
+ outportb(CRTC_ADDR, 0x15); outportb(CRTC_ADDR+1, 0x7);\r
+ outportb(CRTC_ADDR, 0x16); outportb(CRTC_ADDR+1, 0x1a);\r
+ outportb(CRTC_ADDR, 0x17); outportb(CRTC_ADDR+1, 0xe3);\r
+ outportb(SEQU_ADDR, 0x1); outportw(SEQU_ADDR+1, 0x1);\r
+ outportb(0x3ce, 0x5); outportb(0x3cf, 0x40);\r
+ outportb(0x3ce, 0x6); outportb(0x3cf, 0x5);\r
+ inportb(0x3DA);\r
+ outportb(0x3C0, 0x1 | 0x20);\r
+ outportb(0x3C0, 0x41);\r
+ outportb(CRTC_ADDR, 0x13);\r
+ outportb(CRTC_ADDR+1, 0x20);\r
+\r
+ outportw(SEQU_ADDR, 0x0300);\r
+\r
+ sx=256; sy=256;\r
+ tsx=288; tsy=288;\r
+ tx=17; ty=16;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+ endcol=272; nextl=64;\r
+ winofs=4608;\r
+ DriverDesc = "256x256 (ModeX, planar)";\r
+}\r
+\r
+void Set320x240()\r
+{ char in_byte;\r
+\r
+ outportw(SEQU_ADDR, 0x0604);\r
+ outportw(SEQU_ADDR, 0x0110);\r
+ outportb(MISC_OUTPUT, 0xe3);\r
+ outportw(SEQU_ADDR, 0x0300);\r
+ outportb(CRTC_ADDR, 0x11);\r
+ in_byte = inportb((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outportb((CRTC_ADDR+1), in_byte);\r
+ outportw(CRTC_ADDR, 0x0d06);\r
+ outportw(CRTC_ADDR, 0x3e07);\r
+ outportw(CRTC_ADDR, 0x4109);\r
+ outportw(CRTC_ADDR, 0xea10);\r
+ outportw(CRTC_ADDR, 0xac11);\r
+ outportw(CRTC_ADDR, 0xdf12);\r
+ outportw(CRTC_ADDR, 0x0014);\r
+ outportw(CRTC_ADDR, 0xe715);\r
+ outportw(CRTC_ADDR, 0x0616);\r
+ outportw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=320; sy=240;\r
+ tsx=352; tsy=272;\r
+ tx=20; ty=15;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+ endcol=336; nextl=80;\r
+ winofs=5632;\r
+ DriverDesc = "320x240 (ModeX, planar)";\r
+}\r
+\r
+void Set360x240()\r
+{ char in_byte;\r
+\r
+ outportw(SEQU_ADDR, 0x0604);\r
+ outportw(SEQU_ADDR, 0x100);\r
+ outportb(MISC_OUTPUT, 0xe7);\r
+ outportw(SEQU_ADDR, 0x300);\r
+ outportb(CRTC_ADDR, 0x11);\r
+ in_byte = inportb((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outportb((CRTC_ADDR+1), in_byte);\r
+ outportw(CRTC_ADDR, 0x6b00);\r
+ outportw(CRTC_ADDR, 0x5901);\r
+ outportw(CRTC_ADDR, 0x5a02);\r
+ outportw(CRTC_ADDR, 0x8e03);\r
+ outportw(CRTC_ADDR, 0x5e04);\r
+ outportw(CRTC_ADDR, 0x8a05);\r
+ outportw(CRTC_ADDR, 0x0d06);\r
+ outportw(CRTC_ADDR, 0x3e07);\r
+ outportw(CRTC_ADDR, 0x4109);\r
+ outportw(CRTC_ADDR, 0xea10);\r
+ outportw(CRTC_ADDR, 0xac11);\r
+ outportw(CRTC_ADDR, 0xdf12);\r
+ outportw(CRTC_ADDR, 0x2d13);\r
+ outportw(CRTC_ADDR, 0x0014);\r
+ outportw(CRTC_ADDR, 0xe715);\r
+ outportw(CRTC_ADDR, 0x0616);\r
+ outportw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=360; sy=240;\r
+ tsx=392; tsy=272;\r
+ tx=23; ty=15;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+ endcol=376; nextl=90;\r
+ winofs=6272;\r
+ DriverDesc = "360x240 (ModeX, planar)";\r
+}\r
+\r
+void InitModeX(int res)\r
+{\r
+ ModeXSetMode(0x13);\r
+\r
+ switch (res)\r
+ {\r
+ case 0: Set320x240(); break;\r
+ case 1: Set360x240(); break;\r
+ case 2: Set256x256(); break; /* -- ric: 15/Jun/98 -- */\r
+ default: err("Internal error: unknown ModeX resolution code");\r
+ }\r
+\r
+ screenbase=(char *) 0xA0000+__djgpp_conventional_base;\r
+ screen=(char *) malloc(107648);\r
+ memset(screen,0,107648);\r
+ clearScreen();\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+\r
+ ShutdownVideo = ModeXShutdown;\r
+ ShowPage = ModeXShowPage;\r
+ CopySprite = ModeXCopySprite;\r
+ TCopySprite = ModeXTCopySprite;\r
+ CCopySprite = ModeXCCopySprite;\r
+ TCCopySprite = ModeXTCCopySprite;\r
+ CopyTile = ModeXCopyTile;\r
+ TCopyTile = ModeXTCopyTile;\r
+ ScaleSprite = ModeXScaleSprite;\r
+ RenderMAPLine = ModeXRenderMAPLine;\r
+ TRenderMAPLine = ModeXTRenderMAPLine;\r
+ ColorField = ModeXColorField;\r
+ ClearScreen = ModeXClearScreen;\r
+ PutPixel = ModeXPutPixel;\r
+ GetPixel = ModeXGetPixel;\r
+ HLine = ModeXHLine;\r
+ VLine = ModeXVLine;\r
+ Line = ModeXLine;\r
+ Circle = ModeXCircle;\r
+ CircleFill = ModeXCircleFill;\r
+ Rect = ModeXRect;\r
+ RectFill = ModeXRectFill;\r
+}\r
--- /dev/null
+#ifndef MTYPES_H\r
+#define MTYPES_H\r
+\r
+/*\r
+ MikMod atomic types:\r
+ ====================\r
+*/\r
+\r
+\r
+#ifdef __OS2__\r
+\r
+typedef signed char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+/* ULONG and BOOL are already defined in OS2.H */\r
+\r
+#elif defined(__alpha)\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+/* long is 8 bytes on dec alpha - RCA */\r
+typedef int SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned int ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#else\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned long ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#endif\r
+\r
+\r
+#ifdef __OS2__\r
+#define INCL_DOS\r
+#define INCL_MCIOS2\r
+#define INCL_MMIOOS2\r
+#include <os2.h>\r
+#include <os2me.h>\r
+#include <mmio.h>\r
+#endif\r
+\r
+\r
+#ifdef __WATCOMC__\r
+#define inportb(x) inp(x)\r
+#define outportb(x,y) outp(x,y)\r
+#define inport(x) inpw(x)\r
+#define outport(x,y) outpw(x,y)\r
+#define disable() _disable()\r
+#define enable() _enable()\r
+#endif\r
+\r
+\r
+#ifdef __DJGPP__\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+#include <pc.h>\r
+#define inp inportw\r
+#define outport outportw\r
+#define inport inportw\r
+#define interrupt \r
+#endif\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef PCX_H\r
+#define PCX_H\r
+\r
+// -- globals --\r
+\r
+extern word width,depth;\r
+\r
+// -- prototypes --\r
+\r
+extern void ReadPCXLine(byte *dest);\r
+extern void LoadPCXHeader(char *fname);\r
+extern void LoadPCXHeaderNP(char *fname);\r
+extern void LoadPCX(char *fname, byte *dest);\r
+extern byte *LoadPCXBuf(char *fname);\r
+\r
+#endif // PCX_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+#include <math.h>\r
+\r
+// ================================= Data ====================================\r
+\r
+int oxw, oyw;\r
+int xofs, yofs;\r
+int xtc, ytc;\r
+\r
+byte curlayer, animate=0;\r
+byte cameratracking=1, tracker=0;\r
+byte showobs=0, showzone=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void BlitBackLayer(byte l)\r
+{\r
+ int i,j,c;\r
+ byte *img;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ // Adjust view\r
+\r
+ oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
+ oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
+ xofs=-(oxw&15); //(16-(oxw&15));\r
+ yofs=-(oyw&15); //(16-(oyw&15));\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ // Draw it, bitch!\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ c=layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)];\r
+ c=tileidx[c];\r
+ c=c<numtiles?c:0;\r
+ img=vsp+(256*c);\r
+ CopyTileClip((j*16)+xofs,(i*16)+yofs,img);\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+void TransBlitLayer(byte l)\r
+{\r
+ int i,j,offset,c;\r
+ byte *img,*mask;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ // Adjust view\r
+\r
+ oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
+ oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ // Draw it, bitch!\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];\r
+ c=c<numtiles?c:0;\r
+ offset=c*256;\r
+ img=vsp+offset; mask=vspmask+offset;\r
+ if (img!=vsp)\r
+ TCopyTileClip((j*16)+xofs,(i*16)+yofs,img,mask);\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+void BlitLayerLucent(byte l)\r
+{\r
+ int i,j,offset,c;\r
+ byte *img,*mask;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ // Adjust view\r
+\r
+ oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
+ oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ // Draw it, bitch!\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];\r
+ c=c<numtiles?c:0;\r
+ offset=c*256;\r
+ img=vsp+offset; mask=vspmask+offset;\r
+ if (img!=vsp)\r
+ TCopyTileLucentClip((j*16)+xofs,(i*16)+yofs,img);\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+void BlitLayer(byte c)\r
+{\r
+ if ( curlayer && !layer[c].hline && !layer[c].trans) { TransBlitLayer(c); return; }\r
+ if (!curlayer && !layer[c].hline && !layer[c].trans) { BlitBackLayer(c); return; }\r
+ if (layer[c].trans) { BlitLayerLucent(c); return; }\r
+ if (layer[c].hline) { ExecuteEvent(layer[c].hline); return; }\r
+}\r
+\r
+void DrawObstructions()\r
+{\r
+ int i,j;\r
+\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw/16;\r
+ ytc=oyw/16;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ if (obstruct[((ytc+i)*layer[0].sizex)+(xtc+j)])\r
+ ColorField((j*16)+xofs,(i*16)+yofs,7);\r
+ }\r
+}\r
+\r
+void DrawZones()\r
+{\r
+ int i,j;\r
+ char z;\r
+\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ z=zone[((ytc+i)*layer[0].sizex)+(xtc+j)];\r
+ if (z)\r
+ {\r
+ ColorField((j*16)+xofs,(i*16)+yofs,z);\r
+ }\r
+ if (player)\r
+ {\r
+ if ( ((player->x+7)/16)==(xtc+j) && ((player->y+7)/16)==(ytc+i))\r
+ {\r
+ ColorField((j*16)+xofs,(i*16)+yofs,31);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+void HookScriptThing(char *src)\r
+{\r
+ char mystr[10];\r
+\r
+ src++;\r
+ strcpy(mystr, src);\r
+ src=mystr;\r
+ while (*src != 'X') src++;\r
+ *src=0;\r
+ ExecuteEvent(atoi(mystr));\r
+}\r
+\r
+void RenderMAP()\r
+{ char *src;\r
+\r
+ curlayer=0;\r
+ src=rstring;\r
+ while (*src)\r
+ {\r
+ switch (*src)\r
+ {\r
+ case '1': BlitLayer(0); break;\r
+ case '2': BlitLayer(1); break;\r
+ case '3': BlitLayer(2); break;\r
+ case '4': BlitLayer(3); break;\r
+ case '5': BlitLayer(4); break;\r
+ case '6': BlitLayer(5); break;\r
+ case 'E': RenderEntities(); break;\r
+ case 'S': HookScriptThing(src); break;\r
+ case 'R': HookRetrace();\r
+ curlayer++; break;\r
+ }\r
+ src++;\r
+ }\r
+ if (!curlayer) ClearScreen();\r
+ if (showobs) DrawObstructions();\r
+ if (showzone) DrawZones();\r
+}\r
+\r
+void Render()\r
+{\r
+ if (cameratracking==1 && player)\r
+ {\r
+ if (player->x+8>(sx/2)) xwin=(player->x+8-(sx/2)); else xwin=0;\r
+ if (player->y+8>(sy/2)) ywin=(player->y+8-(sy/2)); else ywin=0;\r
+ if (xwin>((layer[0].sizex*16)-sx)) xwin=((layer[0].sizex*16)-sx);\r
+ if (ywin>((layer[0].sizey*16)-sy)) ywin=((layer[0].sizey*16)-sy);\r
+ }\r
+ if (cameratracking==2)\r
+ {\r
+ if (entity[tracker].x+8>(sx/2)) xwin=(entity[tracker].x+8-(sx/2)); else xwin=0;\r
+ if (entity[tracker].y+8>(sy/2)) ywin=(entity[tracker].y+8-(sy/2)); else ywin=0;\r
+ if (xwin>((layer[0].sizex*16)-sx)) xwin=((layer[0].sizex*16)-sx);\r
+ if (ywin>((layer[0].sizey*16)-sy)) ywin=((layer[0].sizey*16)-sy);\r
+ }\r
+ SiftEntities();\r
+ RenderMAP();\r
+}\r
+\r
+int rnd(int lo, int hi)\r
+{\r
+ int range=hi-lo+1;\r
+ int i=rand() % range;\r
+ return i+lo;\r
+}\r
+\r
+void AnimateTile(byte i, int l)\r
+{\r
+ switch (vspanim[i].mode)\r
+ {\r
+ case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
+ else tileidx[l]=vspanim[i].start;\r
+ break;\r
+ case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
+ else tileidx[l]=vspanim[i].finish;\r
+ break;\r
+ case 2: tileidx[l]=rnd(vspanim[i].start,vspanim[i].finish);\r
+ break;\r
+ case 3: if (flipped[l])\r
+ {\r
+ if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
+ else { tileidx[l]++; flipped[l]=0; }\r
+ }\r
+ else\r
+ {\r
+ if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
+ else { tileidx[l]--; flipped[l]=1; }\r
+ }\r
+ }\r
+}\r
+\r
+void Animate(byte i)\r
+{ static int l;\r
+\r
+ vadelay[i]=0;\r
+ for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
+ AnimateTile(i,l);\r
+}\r
+\r
+void CheckTileAnimation()\r
+{ static byte i;\r
+\r
+ if (!animate) return;\r
+ if (!vsp) return;\r
+ for (i=0; i<100; i++)\r
+ {\r
+ if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
+ Animate(i);\r
+ vadelay[i]++;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef RENDER_H\r
+#define RENDER_H\r
+\r
+extern byte animate, cameratracking, showobs, showzone, tracker;\r
+\r
+void Render();\r
+void BlitLayer(byte c);\r
+void CheckTileAnimation();\r
+int rnd(int min, int max);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+int sintbl[]=\r
+{\r
+ 0,\r
+ 1143,\r
+ 2287,\r
+ 3429,\r
+ 4571,\r
+ 5711,\r
+ 6850,\r
+ 7986,\r
+ 9120,\r
+ 10251,\r
+ 11380,\r
+ 12504,\r
+ 13625,\r
+ 14742,\r
+ 15854,\r
+ 16961,\r
+ 18063,\r
+ 19160,\r
+ 20251,\r
+ 21336,\r
+ 22414,\r
+ 23485,\r
+ 24549,\r
+ 25606,\r
+ 26655,\r
+ 27696,\r
+ 28728,\r
+ 29752,\r
+ 30766,\r
+ 31771,\r
+ 32767,\r
+ 33752,\r
+ 34728,\r
+ 35692,\r
+ 36646,\r
+ 37589,\r
+ 38520,\r
+ 39439,\r
+ 40347,\r
+ 41242,\r
+ 42125,\r
+ 42994,\r
+ 43851,\r
+ 44694,\r
+ 45524,\r
+ 46340,\r
+ 47141,\r
+ 47929,\r
+ 48701,\r
+ 49459,\r
+ 50202,\r
+ 50930,\r
+ 51642,\r
+ 52338,\r
+ 53018,\r
+ 53683,\r
+ 54330,\r
+ 54962,\r
+ 55576,\r
+ 56174,\r
+ 56754,\r
+ 57318,\r
+ 57863,\r
+ 58392,\r
+ 58902,\r
+ 59394,\r
+ 59869,\r
+ 60325,\r
+ 60762,\r
+ 61182,\r
+ 61582,\r
+ 61964,\r
+ 62327,\r
+ 62671,\r
+ 62996,\r
+ 63301,\r
+ 63588,\r
+ 63855,\r
+ 64102,\r
+ 64330,\r
+ 64539,\r
+ 64728,\r
+ 64897,\r
+ 65046,\r
+ 65175,\r
+ 65285,\r
+ 65375,\r
+ 65445,\r
+ 65495,\r
+ 65525,\r
+ 65534,\r
+ 65525,\r
+ 65495,\r
+ 65445,\r
+ 65375,\r
+ 65285,\r
+ 65176,\r
+ 65046,\r
+ 64897,\r
+ 64728,\r
+ 64539,\r
+ 64330,\r
+ 64102,\r
+ 63855,\r
+ 63588,\r
+ 63301,\r
+ 62996,\r
+ 62671,\r
+ 62327,\r
+ 61964,\r
+ 61582,\r
+ 61182,\r
+ 60763,\r
+ 60325,\r
+ 59869,\r
+ 59394,\r
+ 58902,\r
+ 58392,\r
+ 57864,\r
+ 57318,\r
+ 56755,\r
+ 56174,\r
+ 55576,\r
+ 54962,\r
+ 54331,\r
+ 53683,\r
+ 53019,\r
+ 52338,\r
+ 51642,\r
+ 50930,\r
+ 50202,\r
+ 49459,\r
+ 48702,\r
+ 47929,\r
+ 47142,\r
+ 46340,\r
+ 45524,\r
+ 44694,\r
+ 43851,\r
+ 42994,\r
+ 42125,\r
+ 41242,\r
+ 40347,\r
+ 39440,\r
+ 38520,\r
+ 37589,\r
+ 36646,\r
+ 35693,\r
+ 34728,\r
+ 33753,\r
+ 32767,\r
+ 31772,\r
+ 30766,\r
+ 29752,\r
+ 28728,\r
+ 27696,\r
+ 26655,\r
+ 25606,\r
+ 24549,\r
+ 23485,\r
+ 22414,\r
+ 21336,\r
+ 20251,\r
+ 19160,\r
+ 18064,\r
+ 16961,\r
+ 15854,\r
+ 14742,\r
+ 13625,\r
+ 12504,\r
+ 11380,\r
+ 10252,\r
+ 9120,\r
+ 7986,\r
+ 6850,\r
+ 5711,\r
+ 4571,\r
+ 3430,\r
+ 2287,\r
+ 1143,\r
+ 0,\r
+ -1143,\r
+ -2286,\r
+ -3429,\r
+ -4571,\r
+ -5711,\r
+ -6850,\r
+ -7986,\r
+ -9120,\r
+ -10251,\r
+ -11379,\r
+ -12504,\r
+ -13625,\r
+ -14741,\r
+ -15854,\r
+ -16961,\r
+ -18063,\r
+ -19160,\r
+ -20251,\r
+ -21335,\r
+ -22414,\r
+ -23485,\r
+ -24549,\r
+ -25606,\r
+ -26655,\r
+ -27696,\r
+ -28728,\r
+ -29752,\r
+ -30766,\r
+ -31771,\r
+ -32767,\r
+ -33752,\r
+ -34728,\r
+ -35692,\r
+ -36646,\r
+ -37589,\r
+ -38520,\r
+ -39439,\r
+ -40347,\r
+ -41242,\r
+ -42124,\r
+ -42994,\r
+ -43851,\r
+ -44694,\r
+ -45524,\r
+ -46340,\r
+ -47141,\r
+ -47929,\r
+ -48701,\r
+ -49459,\r
+ -50202,\r
+ -50930,\r
+ -51642,\r
+ -52338,\r
+ -53018,\r
+ -53682,\r
+ -54330,\r
+ -54962,\r
+ -55576,\r
+ -56174,\r
+ -56754,\r
+ -57318,\r
+ -57863,\r
+ -58392,\r
+ -58902,\r
+ -59394,\r
+ -59869,\r
+ -60325,\r
+ -60762,\r
+ -61182,\r
+ -61582,\r
+ -61964,\r
+ -62327,\r
+ -62671,\r
+ -62996,\r
+ -63301,\r
+ -63588,\r
+ -63855,\r
+ -64102,\r
+ -64330,\r
+ -64539,\r
+ -64728,\r
+ -64897,\r
+ -65046,\r
+ -65175,\r
+ -65285,\r
+ -65375,\r
+ -65445,\r
+ -65495,\r
+ -65525,\r
+ -65534,\r
+ -65525,\r
+ -65495,\r
+ -65445,\r
+ -65375,\r
+ -65285,\r
+ -65176,\r
+ -65046,\r
+ -64897,\r
+ -64728,\r
+ -64539,\r
+ -64330,\r
+ -64102,\r
+ -63855,\r
+ -63588,\r
+ -63302,\r
+ -62996,\r
+ -62671,\r
+ -62327,\r
+ -61964,\r
+ -61582,\r
+ -61182,\r
+ -60763,\r
+ -60325,\r
+ -59869,\r
+ -59395,\r
+ -58902,\r
+ -58392,\r
+ -57864,\r
+ -57318,\r
+ -56755,\r
+ -56174,\r
+ -55576,\r
+ -54962,\r
+ -54331,\r
+ -53683,\r
+ -53019,\r
+ -52338,\r
+ -51642,\r
+ -50930,\r
+ -50202,\r
+ -49460,\r
+ -48702,\r
+ -47929,\r
+ -47142,\r
+ -46340,\r
+ -45524,\r
+ -44694,\r
+ -43851,\r
+ -42995,\r
+ -42125,\r
+ -41242,\r
+ -40347,\r
+ -39440,\r
+ -38520,\r
+ -37589,\r
+ -36646,\r
+ -35693,\r
+ -34728,\r
+ -33753,\r
+ -32767,\r
+ -31772,\r
+ -30767,\r
+ -29752,\r
+ -28728,\r
+ -27696,\r
+ -26655,\r
+ -25606,\r
+ -24550,\r
+ -23485,\r
+ -22414,\r
+ -21336,\r
+ -20251,\r
+ -19160,\r
+ -18064,\r
+ -16962,\r
+ -15854,\r
+ -14742,\r
+ -13625,\r
+ -12504,\r
+ -11380,\r
+ -10252,\r
+ -9121,\r
+ -7987,\r
+ -6850,\r
+ -5712,\r
+ -4571,\r
+ -3430,\r
+ -2287,\r
+ -1144,\r
+};\r
+\r
+int costbl[]={\r
+ 65535,\r
+ 65525,\r
+ 65495,\r
+ 65445,\r
+ 65375,\r
+ 65285,\r
+ 65175,\r
+ 65046,\r
+ 64897,\r
+ 64728,\r
+ 64539,\r
+ 64330,\r
+ 64102,\r
+ 63855,\r
+ 63588,\r
+ 63301,\r
+ 62996,\r
+ 62671,\r
+ 62327,\r
+ 61964,\r
+ 61582,\r
+ 61182,\r
+ 60763,\r
+ 60325,\r
+ 59869,\r
+ 59394,\r
+ 58902,\r
+ 58392,\r
+ 57863,\r
+ 57318,\r
+ 56754,\r
+ 56174,\r
+ 55576,\r
+ 54962,\r
+ 54330,\r
+ 53683,\r
+ 53018,\r
+ 52338,\r
+ 51642,\r
+ 50930,\r
+ 50202,\r
+ 49459,\r
+ 48702,\r
+ 47929,\r
+ 47141,\r
+ 46340,\r
+ 45524,\r
+ 44694,\r
+ 43851,\r
+ 42994,\r
+ 42125,\r
+ 41242,\r
+ 40347,\r
+ 39439,\r
+ 38520,\r
+ 37589,\r
+ 36646,\r
+ 35692,\r
+ 34728,\r
+ 33753,\r
+ 32767,\r
+ 31772,\r
+ 30766,\r
+ 29752,\r
+ 28728,\r
+ 27696,\r
+ 26655,\r
+ 25606,\r
+ 24549,\r
+ 23485,\r
+ 22414,\r
+ 21336,\r
+ 20251,\r
+ 19160,\r
+ 18063,\r
+ 16961,\r
+ 15854,\r
+ 14742,\r
+ 13625,\r
+ 12504,\r
+ 11380,\r
+ 10252,\r
+ 9120,\r
+ 7986,\r
+ 6850,\r
+ 5711,\r
+ 4571,\r
+ 3429,\r
+ 2287,\r
+ 1143,\r
+ 0,\r
+ -1143,\r
+ -2287,\r
+ -3429,\r
+ -4571,\r
+ -5711,\r
+ -6850,\r
+ -7986,\r
+ -9120,\r
+ -10251,\r
+ -11379,\r
+ -12504,\r
+ -13625,\r
+ -14742,\r
+ -15854,\r
+ -16961,\r
+ -18063,\r
+ -19160,\r
+ -20251,\r
+ -21336,\r
+ -22414,\r
+ -23485,\r
+ -24549,\r
+ -25606,\r
+ -26655,\r
+ -27696,\r
+ -28728,\r
+ -29752,\r
+ -30766,\r
+ -31771,\r
+ -32767,\r
+ -33752,\r
+ -34728,\r
+ -35692,\r
+ -36646,\r
+ -37589,\r
+ -38520,\r
+ -39439,\r
+ -40347,\r
+ -41242,\r
+ -42124,\r
+ -42994,\r
+ -43851,\r
+ -44694,\r
+ -45524,\r
+ -46340,\r
+ -47141,\r
+ -47929,\r
+ -48701,\r
+ -49459,\r
+ -50202,\r
+ -50930,\r
+ -51642,\r
+ -52338,\r
+ -53018,\r
+ -53683,\r
+ -54330,\r
+ -54962,\r
+ -55576,\r
+ -56174,\r
+ -56754,\r
+ -57318,\r
+ -57863,\r
+ -58392,\r
+ -58902,\r
+ -59394,\r
+ -59869,\r
+ -60325,\r
+ -60762,\r
+ -61182,\r
+ -61582,\r
+ -61964,\r
+ -62327,\r
+ -62671,\r
+ -62996,\r
+ -63301,\r
+ -63588,\r
+ -63855,\r
+ -64102,\r
+ -64330,\r
+ -64539,\r
+ -64728,\r
+ -64897,\r
+ -65046,\r
+ -65175,\r
+ -65285,\r
+ -65375,\r
+ -65445,\r
+ -65495,\r
+ -65525,\r
+ -65534,\r
+ -65525,\r
+ -65495,\r
+ -65445,\r
+ -65375,\r
+ -65285,\r
+ -65176,\r
+ -65046,\r
+ -64897,\r
+ -64728,\r
+ -64539,\r
+ -64330,\r
+ -64102,\r
+ -63855,\r
+ -63588,\r
+ -63301,\r
+ -62996,\r
+ -62671,\r
+ -62327,\r
+ -61964,\r
+ -61582,\r
+ -61182,\r
+ -60763,\r
+ -60325,\r
+ -59869,\r
+ -59394,\r
+ -58902,\r
+ -58392,\r
+ -57864,\r
+ -57318,\r
+ -56755,\r
+ -56174,\r
+ -55576,\r
+ -54962,\r
+ -54331,\r
+ -53683,\r
+ -53019,\r
+ -52338,\r
+ -51642,\r
+ -50930,\r
+ -50202,\r
+ -49460,\r
+ -48702,\r
+ -47929,\r
+ -47142,\r
+ -46340,\r
+ -45524,\r
+ -44694,\r
+ -43851,\r
+ -42994,\r
+ -42125,\r
+ -41242,\r
+ -40347,\r
+ -39440,\r
+ -38520,\r
+ -37589,\r
+ -36646,\r
+ -35693,\r
+ -34728,\r
+ -33753,\r
+ -32767,\r
+ -31772,\r
+ -30767,\r
+ -29752,\r
+ -28728,\r
+ -27696,\r
+ -26655,\r
+ -25606,\r
+ -24550,\r
+ -23485,\r
+ -22414,\r
+ -21336,\r
+ -20251,\r
+ -19160,\r
+ -18064,\r
+ -16961,\r
+ -15854,\r
+ -14742,\r
+ -13625,\r
+ -12504,\r
+ -11380,\r
+ -10252,\r
+ -9120,\r
+ -7986,\r
+ -6850,\r
+ -5712,\r
+ -4571,\r
+ -3430,\r
+ -2287,\r
+ -1144,\r
+ 0,\r
+ 1143,\r
+ 2286,\r
+ 3429,\r
+ 4571,\r
+ 5711,\r
+ 6850,\r
+ 7986,\r
+ 9120,\r
+ 10251,\r
+ 11379,\r
+ 12504,\r
+ 13625,\r
+ 14741,\r
+ 15854,\r
+ 16961,\r
+ 18063,\r
+ 19160,\r
+ 20251,\r
+ 21335,\r
+ 22414,\r
+ 23485,\r
+ 24549,\r
+ 25606,\r
+ 26655,\r
+ 27696,\r
+ 28728,\r
+ 29752,\r
+ 30766,\r
+ 31771,\r
+ 32767,\r
+ 33752,\r
+ 34728,\r
+ 35692,\r
+ 36646,\r
+ 37589,\r
+ 38520,\r
+ 39439,\r
+ 40347,\r
+ 41242,\r
+ 42124,\r
+ 42994,\r
+ 43851,\r
+ 44694,\r
+ 45524,\r
+ 46340,\r
+ 47141,\r
+ 47929,\r
+ 48701,\r
+ 49459,\r
+ 50202,\r
+ 50930,\r
+ 51642,\r
+ 52338,\r
+ 53018,\r
+ 53682,\r
+ 54330,\r
+ 54962,\r
+ 55576,\r
+ 56174,\r
+ 56754,\r
+ 57318,\r
+ 57863,\r
+ 58391,\r
+ 58902,\r
+ 59394,\r
+ 59869,\r
+ 60325,\r
+ 60762,\r
+ 61182,\r
+ 61582,\r
+ 61964,\r
+ 62327,\r
+ 62671,\r
+ 62996,\r
+ 63301,\r
+ 63588,\r
+ 63855,\r
+ 64102,\r
+ 64330,\r
+ 64539,\r
+ 64728,\r
+ 64897,\r
+ 65046,\r
+ 65175,\r
+ 65285,\r
+ 65375,\r
+ 65445,\r
+ 65495,\r
+ 65525,\r
+};\r
+\r
+int tantbl[]=\r
+{\r
+ 0,\r
+ 1143,\r
+ 2288,\r
+ 3434,\r
+ 4582,\r
+ 5733,\r
+ 6888,\r
+ 8046,\r
+ 9210,\r
+ 10379,\r
+ 11555,\r
+ 12738,\r
+ 13929,\r
+ 15129,\r
+ 16339,\r
+ 17560,\r
+ 18791,\r
+ 20036,\r
+ 21293,\r
+ 22565,\r
+ 23852,\r
+ 25156,\r
+ 26477,\r
+ 27817,\r
+ 29178,\r
+ 30559,\r
+ 31963,\r
+ 33391,\r
+ 34845,\r
+ 36326,\r
+ 37836,\r
+ 39377,\r
+ 40950,\r
+ 42558,\r
+ 44203,\r
+ 45888,\r
+ 47613,\r
+ 49384,\r
+ 51201,\r
+ 53069,\r
+ 54990,\r
+ 56968,\r
+ 59007,\r
+ 61112,\r
+ 63286,\r
+ 65534,\r
+ 67863,\r
+ 70277,\r
+ 72783,\r
+ 75389,\r
+ 78101,\r
+ 80928,\r
+ 83880,\r
+ 86967,\r
+ 90201,\r
+ 93593,\r
+ 97159,\r
+ 100914,\r
+ 104877,\r
+ 109068,\r
+ 113509,\r
+ 118228,\r
+ 123253,\r
+ 128619,\r
+ 134366,\r
+ 140539,\r
+ 147193,\r
+ 154390,\r
+ 162204,\r
+ 170723,\r
+ 180055,\r
+ 190326,\r
+ 201695,\r
+ 214354,\r
+ 228546,\r
+ 244578,\r
+ 262845,\r
+ 283861,\r
+ 308316,\r
+ 337146,\r
+ 371664,\r
+ 413768,\r
+ 466301,\r
+ 533734,\r
+ 623516,\r
+ 749057,\r
+ 937177,\r
+ 1250451,\r
+ 1876607,\r
+ 3754215,\r
+ -2147483647, //8,\r
+ -3754786,\r
+ -1876749,\r
+ -1250515,\r
+ -937212,\r
+ -749080,\r
+ -623532,\r
+ -533746,\r
+ -466310,\r
+ -413775,\r
+ -371670,\r
+ -337151,\r
+ -308320,\r
+ -283865,\r
+ -262848,\r
+ -244581,\r
+ -228549,\r
+ -214356,\r
+ -201697,\r
+ -190328,\r
+ -180056,\r
+ -170725,\r
+ -162205,\r
+ -154391,\r
+ -147194,\r
+ -140540,\r
+ -134367,\r
+ -128620,\r
+ -123253,\r
+ -118228,\r
+ -113510,\r
+ -109068,\r
+ -104878,\r
+ -100915,\r
+ -97160,\r
+ -93594,\r
+ -90201,\r
+ -86968,\r
+ -83881,\r
+ -80929,\r
+ -78101,\r
+ -75389,\r
+ -72784,\r
+ -70277,\r
+ -67863,\r
+ -65535,\r
+ -63286,\r
+ -61112,\r
+ -59008,\r
+ -56968,\r
+ -54990,\r
+ -53069,\r
+ -51201,\r
+ -49384,\r
+ -47614,\r
+ -45888,\r
+ -44204,\r
+ -42559,\r
+ -40951,\r
+ -39377,\r
+ -37836,\r
+ -36326,\r
+ -34845,\r
+ -33391,\r
+ -31963,\r
+ -30559,\r
+ -29178,\r
+ -27818,\r
+ -26478,\r
+ -25156,\r
+ -23852,\r
+ -22565,\r
+ -21293,\r
+ -20036,\r
+ -18792,\r
+ -17560,\r
+ -16339,\r
+ -15130,\r
+ -13930,\r
+ -12738,\r
+ -11555,\r
+ -10379,\r
+ -9210,\r
+ -8046,\r
+ -6888,\r
+ -5733,\r
+ -4582,\r
+ -3434,\r
+ -2288,\r
+ -1144,\r
+ 0,\r
+ 1143,\r
+ 2288,\r
+ 3434,\r
+ 4582,\r
+ 5733,\r
+ 6887,\r
+ 8046,\r
+ 9210,\r
+ 10379,\r
+ 11555,\r
+ 12738,\r
+ 13929,\r
+ 15129,\r
+ 16339,\r
+ 17559,\r
+ 18791,\r
+ 20035,\r
+ 21293,\r
+ 22565,\r
+ 23852,\r
+ 25156,\r
+ 26477,\r
+ 27817,\r
+ 29177,\r
+ 30559,\r
+ 31963,\r
+ 33391,\r
+ 34845,\r
+ 36326,\r
+ 37836,\r
+ 39377,\r
+ 40950,\r
+ 42558,\r
+ 44203,\r
+ 45887,\r
+ 47613,\r
+ 49383,\r
+ 51201,\r
+ 53068,\r
+ 54990,\r
+ 56968,\r
+ 59007,\r
+ 61111,\r
+ 63285,\r
+ 65534,\r
+ 67863,\r
+ 70277,\r
+ 72783,\r
+ 75388,\r
+ 78101,\r
+ 80928,\r
+ 83880,\r
+ 86967,\r
+ 90200,\r
+ 93592,\r
+ 97158,\r
+ 100914,\r
+ 104877,\r
+ 109067,\r
+ 113509,\r
+ 118227,\r
+ 123252,\r
+ 128618,\r
+ 134365,\r
+ 140538,\r
+ 147192,\r
+ 154389,\r
+ 162203,\r
+ 170722,\r
+ 180053,\r
+ 190325,\r
+ 201693,\r
+ 214352,\r
+ 228544,\r
+ 244576,\r
+ 262842,\r
+ 283858,\r
+ 308312,\r
+ 337141,\r
+ 371659,\r
+ 413761,\r
+ 466292,\r
+ 533722,\r
+ 623500,\r
+ 749034,\r
+ 937141,\r
+ 1250388,\r
+ 1876464,\r
+ 3753644,\r
+ -2147483647, //8,\r
+ -3755357,\r
+ -1876892,\r
+ -1250578,\r
+ -937248,\r
+ -749103,\r
+ -623548,\r
+ -533757,\r
+ -466319,\r
+ -413782,\r
+ -371676,\r
+ -337155,\r
+ -308324,\r
+ -283868,\r
+ -262851,\r
+ -244584,\r
+ -228551,\r
+ -214358,\r
+ -201698,\r
+ -190330,\r
+ -180058,\r
+ -170726,\r
+ -162206,\r
+ -154392,\r
+ -147195,\r
+ -140541,\r
+ -134368,\r
+ -128621,\r
+ -123254,\r
+ -118229,\r
+ -113511,\r
+ -109069,\r
+ -104878,\r
+ -100916,\r
+ -97160,\r
+ -93594,\r
+ -90202,\r
+ -86968,\r
+ -83881,\r
+ -80929,\r
+ -78102,\r
+ -75390,\r
+ -72784,\r
+ -70278,\r
+ -67864,\r
+ -65535,\r
+ -63287,\r
+ -61112,\r
+ -59008,\r
+ -56969,\r
+ -54990,\r
+ -53069,\r
+ -51202,\r
+ -49384,\r
+ -47614,\r
+ -45888,\r
+ -44204,\r
+ -42559,\r
+ -40951,\r
+ -39377,\r
+ -37837,\r
+ -36327,\r
+ -34845,\r
+ -33392,\r
+ -31963,\r
+ -30559,\r
+ -29178,\r
+ -27818,\r
+ -26478,\r
+ -25156,\r
+ -23853,\r
+ -22565,\r
+ -21293,\r
+ -20036,\r
+ -18792,\r
+ -17560,\r
+ -16340,\r
+ -15130,\r
+ -13930,\r
+ -12739,\r
+ -11555,\r
+ -10380,\r
+ -9210,\r
+ -8047,\r
+ -6888,\r
+ -5733,\r
+ -4582,\r
+ -3434,\r
+ -2288,\r
+ -1144,\r
+};\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define SOUND_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+UNIMOD *mf;\r
+SAMPLE *sfx[100];\r
+int nsfx=0;\r
+char playing[60];\r
+\r
+// ================================= Code ====================================\r
+\r
+void PlaySound(int, int, int);\r
+\r
+void tickhandler()\r
+{\r
+ MP_HandleTick();\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+void InitMusicSystem()\r
+{\r
+ memset(playing, 0, 60);\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_uni);\r
+ ML_RegisterLoader(&load_xm);\r
+\r
+ MD_RegisterDriver(&drv_nos);\r
+// MD_RegisterDriver(&drv_ss);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+\r
+ MD_RegisterPlayer(tickhandler);\r
+ if (!MD_Init())\r
+ {\r
+ printf("Driver error: %s.\n",myerr);\r
+ exit(-1);\r
+ }\r
+}\r
+\r
+void PlayMusic(char *fname)\r
+{\r
+ strlwr(fname);\r
+ if (!strcmp(fname,playing)) return;\r
+ if (!MP_Ready())\r
+ {\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+ }\r
+ memcpy(playing, fname, strlen(fname));\r
+ if (!(mf=ML_LoadFN(fname))) err(myerr);\r
+ MP_Init(mf);\r
+ md_numchn=mf->numchn+2;\r
+ mp_loop=1; mp_volume=100;\r
+ MD_PlayStart();\r
+ PlaySound(0, 0, 0);\r
+ PlaySound(0, 0, 0);\r
+}\r
+\r
+void StopMusic()\r
+{\r
+ if (MP_Ready()) return;\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+}\r
+\r
+int CacheSound(char *fname)\r
+{\r
+ if (!(sfx[nsfx]=MW_LoadWavFN(fname)))\r
+ err("WAV [%s] load error: %s", fname, myerr);\r
+ return nsfx++;\r
+}\r
+\r
+void FreeAllSounds()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<nsfx; i++)\r
+ MW_FreeWav(sfx[i]);\r
+ nsfx=0;\r
+}\r
+\r
+void PlaySound(int index, int vol, int pan)\r
+{\r
+ static int switcher=1;\r
+ int chanl;\r
+\r
+ if (index >= nsfx) return;\r
+ switcher ^= 1;\r
+ chanl=md_numchn-1-switcher;\r
+ MD_VoiceSetVolume(chanl, vol);\r
+ MD_VoiceSetPanning(chanl, pan);\r
+ MD_VoiceSetFrequency(chanl, sfx[index]->c2spd);\r
+ MD_VoicePlay(chanl, sfx[index]->handle, 0, sfx[index]->length,\r
+ 0, 0, sfx[index]->flags);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef SOUND_H\r
+#define SOUND_H\r
+\r
+void InitMusicSystem();\r
+void PlayMusic(char *);\r
+void StopMusic();\r
+int CacheSound(char *);\r
+void FreeAllSounds();\r
+void PlaySound(int, int, int);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdarg.h> // va_*()\r
+#include <time.h>\r
+\r
+#define MAIN_H\r
+#include "verge.h"\r
+extern void vmain(int argc, char *argv[]);\r
+extern void Log(char *message, ...);\r
+\r
+int mx, my, mb;\r
+\r
+// ================================= Code ====================================\r
+\r
+void err(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ ShutdownVideo(1);\r
+ ShutdownTimer();\r
+ ShutdownKeyboard();\r
+// CD_Deinit();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ printf(tempbuf);\r
+ fflush(stdout);\r
+\r
+ Log("Sys: Exiting with message: %s", tempbuf);\r
+\r
+ exit(-1);\r
+}\r
+\r
+int sgn(int x)\r
+{\r
+ if (x>=0) return 1;\r
+ return 0;\r
+}\r
+\r
+void ver()\r
+{ char temp[256];\r
+\r
+ Con_NextLine();\r
+ Con_Printf("{|||||||||||||||||}");\r
+ sprintf(temp,"VERGE v.%s Copyright (C)1998 vecna",VERSION);\r
+ Con_Printf(temp);\r
+ Con_Printf("All rights reserved. DJGPP/DOS build.");\r
+ sprintf(strbuf,"Timestamp %s at %s.",__DATE__, __TIME__);\r
+ Con_Printf(strbuf);\r
+ Con_Printf("Options: -Wall -m486 -O1 -ffast-math");\r
+ Con_Printf("{|||||||||||||||||}");\r
+}\r
+\r
+void CheckMessages()\r
+{\r
+ // Win95 can bite me.\r
+}\r
+\r
+void InitMouse(int x, int y)\r
+{ REGISTERS r;\r
+\r
+ SET_AX(r,7);\r
+ SET_CX(r,0);\r
+ SET_DX(r,x);\r
+ INTERRUPT(0x33, r);\r
+\r
+ SET_AX(r,8);\r
+ SET_CX(r,0);\r
+ SET_DX(r,y);\r
+ INTERRUPT(0x33, r);\r
+}\r
+\r
+void ReadMouse()\r
+{ REGISTERS r;\r
+\r
+ SET_AX(r,3);\r
+ INTERRUPT(0x33, r);\r
+\r
+ mx=r.x.cx;\r
+ my=r.x.dx;\r
+ mb=r.x.bx;\r
+}\r
+\r
+void SetMouse(int x, int y)\r
+{ REGISTERS r;\r
+\r
+ SET_AX(r, 4);\r
+ SET_CX(r, x);\r
+ SET_DX(r, y);\r
+ INTERRUPT(0x33, r);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ if (argc==1)\r
+ {\r
+ printf("VERGE v.%s build %s at %s. \n",VERSION,__DATE__,__TIME__);\r
+ printf("Copyright (C)1998 vecna \n");\r
+ delay(500);\r
+ }\r
+ srand(time(NULL));\r
+ vmain(argc, argv);\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define TIMER_H\r
+#include <go32.h>\r
+#include <dpmi.h>\r
+#include <crt0.h>\r
+#include "verge.h"\r
+\r
+#define PIT0 0x40\r
+#define PIT1 0x41\r
+#define PIT2 0x42\r
+#define PITMODE 0x43\r
+#define PITCONST 1193180L\r
+\r
+#define OCR1 0x20\r
+#define IMR1 0x21\r
+\r
+#define OCR2 0xA0\r
+#define IMR2 0xA1\r
+\r
+// ================================= Data ====================================\r
+\r
+int _crt0_startup_flags = _CRT0_FLAG_NEARPTR;\r
+typedef __dpmi_paddr *PVI;\r
+static PVI oldhandler;\r
+\r
+unsigned int systemtime=0, timer_count=0;\r
+int (*callback) (void);\r
+\r
+// ================================= Code ====================================\r
+\r
+PVI DJSetHandlerFunc(unsigned char irqno, void (*handler)(), int len)\r
+{\r
+ PVI oldvect = (PVI) malloc(sizeof(__dpmi_paddr));\r
+ int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8;\r
+ _go32_dpmi_seginfo wrapper;\r
+ __dpmi_paddr new;\r
+\r
+ wrapper.pm_offset = (long int) handler;\r
+ wrapper.pm_selector = _my_cs();\r
+ _go32_dpmi_allocate_iret_wrapper(&wrapper);\r
+ new.offset32 = wrapper.pm_offset;\r
+ new.selector = wrapper.pm_selector;\r
+ __dpmi_get_and_disable_virtual_interrupt_state();\r
+ if (len) _go32_dpmi_lock_code(handler,len);\r
+ _go32_dpmi_lock_data(&wrapper,sizeof(_go32_dpmi_seginfo));\r
+ __dpmi_get_protected_mode_interrupt_vector(vecno,oldvect);\r
+ __dpmi_set_protected_mode_interrupt_vector(vecno,&new);\r
+ __dpmi_get_and_enable_virtual_interrupt_state();\r
+ return oldvect;\r
+}\r
+\r
+void DJSetHandlerAddr(unsigned char irqno, PVI handler)\r
+{\r
+ int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8;\r
+ _go32_dpmi_seginfo wrapper;\r
+ __dpmi_paddr oldhandler;\r
+\r
+ __dpmi_get_and_disable_virtual_interrupt_state();\r
+ __dpmi_get_protected_mode_interrupt_vector(vecno, &oldhandler);\r
+ wrapper.pm_offset = oldhandler.offset32;\r
+ wrapper.pm_selector = oldhandler.selector;\r
+ _go32_dpmi_free_iret_wrapper(&wrapper);\r
+ __dpmi_set_protected_mode_interrupt_vector(vecno,handler);\r
+ __dpmi_get_and_enable_virtual_interrupt_state();\r
+ free(handler);\r
+}\r
+\r
+static void SendEOI (unsigned char irqno)\r
+{\r
+ unsigned char ocr=(irqno>7) ? OCR2 : OCR1;\r
+ unsigned char eoi=0x60|(irqno&7);\r
+\r
+ outportb(ocr,eoi);\r
+ if (irqno>7) outportb(OCR1,0x20);\r
+}\r
+\r
+static void newhandler(void)\r
+{\r
+ systemtime++;\r
+ timer_count++;\r
+ if (cpu_watch) CPUTick();\r
+ if (callback) callback();\r
+ CheckTileAnimation();\r
+ HookTimer();\r
+ MD_Update();\r
+ SendEOI(0);\r
+}\r
+\r
+static void EndNewHandler() { }\r
+\r
+void sethz(unsigned int hz)\r
+{ unsigned int pit0_set, pit0_value;\r
+\r
+ disable();\r
+\r
+ outportb(PITMODE, 0x34);\r
+ pit0_value=PITCONST / hz;\r
+ pit0_set=(pit0_value & 0x00ff);\r
+ outportb(PIT0, pit0_set);\r
+ pit0_set=(pit0_value >> 8);\r
+ outportb(PIT0, pit0_set);\r
+\r
+ enable();\r
+}\r
+\r
+void restorehz()\r
+{\r
+ disable();\r
+ outportb(PITMODE, 0x34);\r
+ outportb(PIT0, 0x00);\r
+ outportb(PIT0, 0x00);\r
+ enable();\r
+}\r
+\r
+void InitTimer()\r
+{\r
+ oldhandler = DJSetHandlerFunc(0, (void *) newhandler,\r
+ ((int) EndNewHandler) - ((int) newhandler));\r
+ sethz(100);\r
+}\r
+\r
+void ShutdownTimer()\r
+{\r
+ DJSetHandlerAddr(0, oldhandler);\r
+ restorehz();\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TIMER_H\r
+#define TIMER_H\r
+\r
+void InitTimer();\r
+void ShutdownTimer();\r
+\r
+extern int systemtime, timer_count;\r
+extern int (*callback) (void);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#define VC_H\r
+#include <math.h>\r
+#include "verge.h"\r
+#include "vccode.h"\r
+#include "sincos.h"\r
+#include "mikmod.h"\r
+\r
+#define USERFUNC_MARKER 10000\r
+\r
+// ================================= Data ====================================\r
+\r
+char *sysvc, *mapvc, *basevc; // VC pool ptrs\r
+char *code; // VC current instruction pointer (IP)\r
+\r
+int *globalint; // system.vc global int variables\r
+int maxint; // maximum allocated # of ints\r
+char *stringbuf; // vc string workspace\r
+int vcreturn; // return value of last function\r
+char *movescriptbuf; // VC EntityMove buffer\r
+char vctrack=0; // VC call tracking to verge.log\r
+\r
+quad *vcstack; // VC stack (seperate from main stack)\r
+quad *vcsp; // VC stack pointer [esp]\r
+\r
+int mapevents; // number of map events in this VC\r
+char *mapvctbl[1024]; // map VC offset table\r
+\r
+int hookretrace=0;\r
+int hooktimer=0;\r
+int invc=0;\r
+\r
+// -----------------\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[20];\r
+ int numargs, numlocals;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+funcdecl *funcs;\r
+int numfuncs;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int vsofs;\r
+ int arraylen;\r
+} strdecl;\r
+\r
+strdecl *str;\r
+int numstr=0;\r
+int stralloc;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+vardecl *vars;\r
+int numvars;\r
+char kill=0;\r
+\r
+// -- local func vars --\r
+\r
+typedef struct\r
+{\r
+ int nargs[20];\r
+ char s[2560];\r
+} lvars;\r
+\r
+//lvars *lvar;\r
+lvars lvar;\r
+\r
+// ============================== Prototypes =================================\r
+\r
+void ResolveString(char *buffer);\r
+void ExecuteSection();\r
+void ExecuteEvent(int i);\r
+void ExecuteUserFunc(int i);\r
+\r
+// ================================= Code ====================================\r
+\r
+int ProcessOperand(); // Mutually dependant functions suck.\r
+int ProcessIfOperand(); // Hell yeah they do, bitch.\r
+void HandleExternFunc();\r
+void HandleStdLib();\r
+void ExecuteBlock();\r
+\r
+void LoadSystemVC()\r
+{\r
+ VFILE *f=0;\r
+ int i=0;\r
+\r
+ Log("Initializing VC interpreter");\r
+ if (!(f=vopen("system.idx"))) err("Could not open system.idx.");\r
+ vread(&numvars, 4, f);\r
+ vars=(vardecl *) valloc(numvars*sizeof(vardecl), "LoadSystemVC:vars", OID_VC);\r
+ vread(vars, numvars*48, f);\r
+ vread(&numfuncs, 4, f);\r
+ funcs=(funcdecl *) valloc(numfuncs*sizeof(funcdecl), "LoadSystemVC:funcs", OID_VC);\r
+ vread(funcs, numfuncs*76, f);\r
+ vread(&numstr, 4, f);\r
+ str=(strdecl *) valloc(numstr*sizeof(strdecl), "LoadSystemVC:str", OID_VC);\r
+ vread(str, numstr*44, f);\r
+ vclose(f);\r
+\r
+ if (!(f=vopen("system.vcs"))) err("Could not open system.vcs");\r
+ i=filesize(f);\r
+ sysvc=(char *) valloc(i, "LoadSystemVC:sysvc", OID_VC);\r
+ vread(&numfuncs, 4, f);\r
+ vread(&maxint, 4, f);\r
+ vread(&stralloc, 4, f);\r
+\r
+ globalint=(int *) valloc(maxint ? maxint*4 : 4, "globalint", OID_VC);\r
+ if (stralloc)\r
+ {\r
+ stringbuf=(char *) valloc((stralloc*256),\r
+ "LoadSystemVC:stringbuf", OID_VC);\r
+ }\r
+ else\r
+ {\r
+ stringbuf=(char *) valloc(256,\r
+ "LoadSystemVC:stringbuf (256)", OID_VC);\r
+ }\r
+ vread(sysvc, i, f);\r
+ vclose(f);\r
+\r
+ // Initialize VC stack\r
+ vcstack=(quad *) valloc(6000, "vcstack", OID_VC);\r
+ vcsp=vcstack;\r
+\r
+ movescriptbuf=(char *) valloc(65535, "movescriptbuf", OID_VC);\r
+\r
+Log("system vclib init: %d funcs, %d ints (%d bytes), %d strings (%d bytes)",\r
+ numfuncs, numvars, maxint*4, numstr, stralloc*256);\r
+}\r
+\r
+void LoadMapVC(VFILE *f)\r
+{ int codesize=0;\r
+\r
+ vread(&mapevents, 4, f);\r
+ vread(mapvctbl, 4*mapevents, f);\r
+ vread(&codesize, 4, f);\r
+ mapvc=(char *) valloc(codesize, "mapvc", OID_VC);\r
+ vread(mapvc, codesize, f);\r
+}\r
+\r
+byte GrabC()\r
+{\r
+ return *code++;\r
+}\r
+\r
+word GrabW(void)\r
+{\r
+ word *ptr=(word *) code;\r
+ code+=2;\r
+ return *ptr;\r
+}\r
+\r
+quad GrabD(void)\r
+{\r
+ quad *ptr=(quad *) code;\r
+ code+=4;\r
+ return *ptr;\r
+}\r
+\r
+void GrabString(char *str)\r
+{ int i=0;\r
+\r
+ i=0;\r
+ while (*code)\r
+ {\r
+ str[i]=*code;\r
+ code++;\r
+ i++;\r
+ }\r
+ str[i]=0;\r
+ code++;\r
+}\r
+\r
+int ReadInt(char category, int loc, int ofs)\r
+{\r
+ switch (category)\r
+ {\r
+ case op_UVAR: return globalint[loc];\r
+ case op_UVARRAY: return globalint[loc];\r
+ case op_HVAR0: switch (loc)\r
+ {\r
+ case 0: return xwin;\r
+ case 1: return ywin;\r
+ case 2: return cameratracking;\r
+ case 3: return timer_count;\r
+ case 4: return up;\r
+ case 5: return down;\r
+ case 6: return left;\r
+ case 7: return right;\r
+ case 8: return b1;\r
+ case 9: return b2;\r
+ case 10: return b3;\r
+ case 11: return b4;\r
+ case 12: return sx;\r
+ case 13: return sy;\r
+ case 14: return playernum;\r
+ case 15: return cc;\r
+ case 16: return tracker;\r
+ case 17: return mx;\r
+ case 18: return my;\r
+ case 19: return mb;\r
+ case 20: return vctrack;\r
+ case 21: return width;\r
+ case 22: return depth;\r
+ case 23: return mp_volume;\r
+ case 24: return (int)vsp;\r
+ case 25: return lastent;\r
+ case 26: return last_pressed;\r
+ }\r
+ case op_HVAR1: switch (loc)\r
+ {\r
+ case 0: return (int) screen[ofs];\r
+ case 1: return entity[ofs].x;\r
+ case 2: return entity[ofs].y;\r
+ case 3: return entity[ofs].tx;\r
+ case 4: return entity[ofs].ty;\r
+ case 5: return entity[ofs].facing;\r
+ case 6: return entity[ofs].moving;\r
+ case 7: return entity[ofs].specframe;\r
+ case 8: return entity[ofs].speed;\r
+// case 9: return entity[ofs].movecode;\r
+ case 10: return entidx[ofs];\r
+ case 11: return key[ofs];\r
+ case 12: return layer[ofs].hline;\r
+ case 13: return (int) (*(byte *)ofs);\r
+ case 14: return (int) (*(word *)ofs);\r
+ case 15: return (int) (*(quad *)ofs);\r
+ case 16: return (int) pal[ofs];\r
+ case 17: return (int) (*(char *)ofs);\r
+ case 18: return (int) (*(short*)ofs);\r
+ case 19: return (int) (*(int *)ofs);\r
+ }\r
+ case op_LVAR: return lvar.nargs[loc];\r
+ default:\r
+ err("VC Execution error: Invalid ReadInt category %d", (int) category);\r
+ }\r
+ return 0;\r
+}\r
+\r
+void WriteInt(char category, int loc, int ofs, int value)\r
+{\r
+ switch (category)\r
+ {\r
+ case op_UVAR: globalint[loc]=value; break;\r
+ case op_UVARRAY: globalint[loc]=value; break;\r
+ case op_HVAR0: switch (loc)\r
+ {\r
+ case 0: xwin=value; return;\r
+ case 1: ywin=value; return;\r
+ case 2: cameratracking=value; return;\r
+ case 3: timer_count=value; return;\r
+ case 16: tracker=value; return;\r
+ case 20: vctrack=value; return;\r
+ case 23: mp_volume=value; return;\r
+ case 26: last_pressed=value; return;\r
+ }\r
+ case op_HVAR1: switch (loc)\r
+ {\r
+ case 0: screen[ofs]=(byte) value; return;\r
+ case 1: entity[ofs].x=value; return;\r
+ case 2: entity[ofs].y=value; return;\r
+ case 3: entity[ofs].tx=value; return;\r
+ case 4: entity[ofs].ty=value; return;\r
+ case 5: entity[ofs].facing=value; return;\r
+ case 6: entity[ofs].moving=value; return;\r
+ case 7: entity[ofs].specframe=value; return;\r
+ case 8: entity[ofs].speed=value; return;\r
+// case 9: entity[ofs].movecode=value; return;\r
+// case 10:\r
+ case 11: key[ofs]=value; return;\r
+ case 12: layer[ofs].hline=value; return;\r
+ case 13: (*(byte *)ofs)=(byte) value; return;\r
+ case 14: (*(word *)ofs)=(word) value; return;\r
+ case 15: (*(quad *)ofs)=(quad) value; return;\r
+ case 16: pal[ofs]=value; return;\r
+ case 17: (*(char *)ofs)=(byte) value; return;\r
+ case 18: (*(short*)ofs)=(word) value; return;\r
+ case 19: (*(int *)ofs)=(quad) value; return;\r
+ }\r
+ case op_LVAR: lvar.nargs[loc]=value; return;\r
+ default:\r
+ err("VC Execution error: Invalid WriteInt category %d", (int) category);\r
+ }\r
+}\r
+\r
+int ResolveOperand()\r
+{\r
+ int cr=0;\r
+ int d=0;\r
+ byte c=0;\r
+\r
+ cr=ProcessOperand(); // Get base number\r
+ while (1)\r
+ {\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case op_ADD: cr += ProcessOperand(); continue;\r
+ case op_SUB: cr -= ProcessOperand(); continue;\r
+ case op_DIV: d=ProcessOperand();\r
+ if (!d) cr=0; else cr /= d; continue;\r
+ case op_MULT: cr = cr * ProcessOperand(); continue;\r
+ case op_MOD: d=ProcessOperand();\r
+ if (!d) cr=0; else cr %= d; continue;\r
+ case op_SHL: cr = cr << ProcessOperand(); continue;\r
+ case op_SHR: cr = cr >> ProcessOperand(); continue;\r
+ case op_AND: cr = cr & ProcessOperand(); continue;\r
+ case op_OR: cr = cr | ProcessOperand(); continue;\r
+ case op_XOR: cr = cr ^ ProcessOperand(); continue;\r
+ case op_END: break;\r
+ }\r
+ break;\r
+ }\r
+ return cr;\r
+}\r
+\r
+int ProcessOperand()\r
+{ byte op_desc=0;\r
+ byte c=0;\r
+ quad d=0;\r
+ quad ofs=0;\r
+\r
+ op_desc=GrabC();\r
+ switch (op_desc)\r
+ {\r
+ case op_IMMEDIATE: return GrabD();\r
+ case op_HVAR0: c=GrabC(); return ReadInt(op_HVAR0, c, 0);\r
+ case op_HVAR1: c=GrabC(); ofs=ResolveOperand(); return ReadInt(op_HVAR1, c, ofs);\r
+ case op_UVAR: d=GrabD(); return ReadInt(op_UVAR, d, 0);\r
+ case op_UVARRAY: d=GrabD(); d+=ResolveOperand(); return ReadInt(op_UVARRAY, d, 0);\r
+ case op_LVAR: c=GrabC(); return lvar.nargs[c];\r
+ case op_BFUNC: HandleStdLib();\r
+ return vcreturn;\r
+ case op_UFUNC: HandleExternFunc();\r
+ return vcreturn;\r
+ case op_GROUP: return ResolveOperand();\r
+ default: sprintf(strbuf,"VC Execution error: Invalid operand %d.",op_desc);\r
+ err(strbuf); break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void HandleStringOperand(char *buffer)\r
+{\r
+ char tbuf[256];\r
+ char *d=0;\r
+ word w=0;\r
+ int c=0;\r
+ int i=0;\r
+ int j=0;\r
+ int z=0;\r
+\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case s_IMMEDIATE: GrabString(buffer); break;\r
+ case s_GLOBAL: w=GrabW();\r
+ d=(char *) (int) stringbuf + (w*256);\r
+ z=strlen(d);\r
+ if (strlen(buffer)+z+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, d, z+1);\r
+ break;\r
+ case s_ARRAY: w=GrabW();\r
+ w+=ResolveOperand();\r
+ d=(char *) (int) stringbuf + (w*256);\r
+ z=strlen(d);\r
+ if (strlen(buffer)+z+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, d, z+1);\r
+ break;\r
+ case s_NUMSTR: i=ResolveOperand();\r
+ sprintf(buffer,"%d",i);\r
+ break;\r
+ case s_LEFT: ResolveString(tbuf);\r
+ i=ResolveOperand();\r
+ c=i<strlen(tbuf) ? i : strlen(tbuf);\r
+ if (strlen(buffer)+c+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, tbuf, c);\r
+ buffer[c]=0;\r
+ break;\r
+ case s_RIGHT: ResolveString(tbuf);\r
+ i=ResolveOperand();\r
+ c=i<strlen(tbuf) ? i : strlen(tbuf);\r
+ if (strlen(buffer)+c+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, tbuf+strlen(tbuf)-c, c);\r
+ buffer[c]=0;\r
+ break;\r
+ case s_MID: ResolveString(tbuf);\r
+ i=ResolveOperand();\r
+ j=ResolveOperand();\r
+ i=i<strlen(tbuf) ? i : strlen(tbuf);\r
+ j=j<strlen(tbuf)-i ? j : strlen(tbuf)-i;\r
+ if (strlen(buffer)+j+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, tbuf+i, j);\r
+ buffer[j]=0;\r
+ break;\r
+ case s_CHR: if (strlen(buffer)+2>50)\r
+ err("Combined string length exceeds 250 char max.");\r
+ buffer[0]=(char) ResolveOperand();\r
+ buffer[1]=0;\r
+ break;\r
+ case s_LOCAL: c=GrabC();\r
+ d=&lvar.s[c*256];\r
+ z=strlen(d);\r
+ if (strlen(buffer)+z+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, d, z+1);\r
+ break;\r
+ default: err("Invalid VC string operand %d", (int) c);\r
+ }\r
+}\r
+\r
+void ResolveString(char *buffer)\r
+{ char c=0;\r
+\r
+ HandleStringOperand(buffer);\r
+ while (1)\r
+ {\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case s_ADD:\r
+ HandleStringOperand((char *) (int) buffer + strlen(buffer)); break;\r
+ case s_END: return;\r
+ default:\r
+ err("VC execution error: Unknown string operator %d",(int) c);\r
+ }\r
+ }\r
+}\r
+\r
+void vcpush(quad info)\r
+{\r
+ if (vcsp>=vcstack+1500) err("VC stack overflow.");\r
+ *vcsp=info;\r
+ vcsp++;\r
+}\r
+\r
+quad vcpop()\r
+{\r
+ if (vcsp==vcstack) err("VC stack underflow.");\r
+ vcsp--;\r
+ return *vcsp;\r
+}\r
+\r
+void ReadVCVar()\r
+{ int i=0;\r
+ int j=0;\r
+\r
+ strlwr((char *) args[1]);\r
+ for (i=0; i<=numvars; i++)\r
+ if (!strcmp(vars[i].vname, (char *) args[1])) break;\r
+ if (i<numvars)\r
+ {\r
+ j=vars[i].varstartofs;\r
+ if (vars[i].arraylen>1)\r
+ j+=atoi((char *) args[2]);\r
+ j=globalint[j];\r
+ sprintf(strbuf,"%s:%d",vars[i].vname, j);\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ for (i=0; i<=numstr; i++)\r
+ if (!strcmp(str[i].vname, (char *) args[1])) break;\r
+ if (i<numstr)\r
+ {\r
+ j=(int) stringbuf + (i*256);\r
+ sprintf(strbuf,"%s:%s",str[i].vname, (char *) j);\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ Con_Printf("No such VC variable.");\r
+}\r
+\r
+void WriteVCVar()\r
+{ int i=0;\r
+ int j=0;\r
+\r
+ strlwr((char *) args[1]);\r
+ for (i=0; i<=numvars; i++)\r
+ if (!strcmp(vars[i].vname, (char *) args[1])) break;\r
+ if (i<numvars)\r
+ {\r
+ j=vars[i].varstartofs;\r
+ if (vars[i].arraylen>1)\r
+ {\r
+ j+=atoi((char *) args[2]);\r
+ globalint[j]=atoi((char *) args[3]);\r
+ }\r
+ else globalint[j]=atoi((char *) args[2]);\r
+ sprintf(strbuf,"%s:%d", vars[i].vname, atoi((char *) args[2]));\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ for (i=0; i<=numstr; i++)\r
+ if (!strcmp(str[i].vname, (char *) args[1])) break;\r
+ if (i<numstr)\r
+ {\r
+ j=(int) stringbuf + (i*256);\r
+ memcpy((char *) j, (char *) args[2], strlen((char *) args[2])+1);\r
+ sprintf(strbuf,"%s:%s", str[i].vname, (char *) args[2]);\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ Con_Printf("No such VC variable.");\r
+}\r
+\r
+// ======================= VC Standard Function Library =======================\r
+\r
+int ClipOn=1;\r
+int LucentOn=0;\r
+\r
+void vc_Exit_()\r
+{\r
+ ResolveString(strbuf);\r
+ err(strbuf);\r
+}\r
+\r
+void vc_Message()\r
+{\r
+ int i=0;\r
+ char str1[100];\r
+\r
+ ResolveString(str1);\r
+ i=ResolveOperand();\r
+ Message(str1, i);\r
+}\r
+\r
+void vc_Malloc()\r
+{\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ vcreturn=(int) valloc(i, "vcreturn", OID_TEMP);\r
+\r
+ Log("VC allocating %u bytes, ptr at %u.", i, vcreturn);\r
+\r
+ if (!vcreturn) Message("Warning: VC failed malloc", 750);\r
+}\r
+\r
+void vc_Free()\r
+{\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ vfree((char *) i);\r
+\r
+ Log("VC freeing allocated heap at %u.", i);\r
+}\r
+\r
+void vc_pow()\r
+{\r
+ int i=0;\r
+ int j=0;\r
+\r
+ i=ResolveOperand();\r
+ j=ResolveOperand();\r
+ vcreturn=pow(i,j);\r
+}\r
+\r
+void vc_loadimage()\r
+{\r
+ byte *t=0;\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ t=VLoadImageBuf(s);\r
+ vcreturn=(int) t;\r
+}\r
+\r
+void vc_copysprite()\r
+{\r
+ int a=0;\r
+ int b=0;\r
+ int c=0;\r
+ int d=0;\r
+ byte *e=0;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=(byte *) ResolveOperand();\r
+ if (!ClipOn && !LucentOn) CopySprite(a,b,c,d,e);\r
+ if ( ClipOn && !LucentOn) CopySpriteClip(a,b,c,d,e);\r
+ if (!ClipOn && LucentOn) CopySpriteLucent(a,b,c,d,e);\r
+ if ( ClipOn && LucentOn) CopySpriteLucentClip(a,b,c,d,e);\r
+}\r
+\r
+void vc_tcopysprite()\r
+{\r
+ int a=0;\r
+ int b=0;\r
+ int c=0;\r
+ int d=0;\r
+ byte *e=0;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=(byte *) ResolveOperand();\r
+ if (!ClipOn && !LucentOn) TCopySprite(a,b,c,d,e);\r
+ if ( ClipOn && !LucentOn) TCopySpriteClip(a,b,c,d,e);\r
+ if (!ClipOn && LucentOn) TCopySpriteLucent(a,b,c,d,e);\r
+ if ( ClipOn && LucentOn) TCopySpriteLucentClip(a,b,c,d,e);\r
+}\r
+\r
+void vc_EntitySpawn()\r
+{\r
+ int a=0;\r
+ int b=0;\r
+ char chrname[80];\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ ResolveString(chrname);\r
+ vcreturn=AllocateEntity(a, b, chrname);\r
+}\r
+\r
+void vc_SetPlayer()\r
+{\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=entities) err("SetPlayer(): Entity index out of range");\r
+\r
+ player=&entity[i];\r
+ playernum=i;\r
+\r
+// entity[i].movecode=0;\r
+ entity[i].moving=0;\r
+}\r
+\r
+void vc_Map()\r
+{\r
+ hookretrace=0;\r
+ hooktimer=0;\r
+ kill=1;\r
+ ResolveString(startmap);\r
+}\r
+\r
+void vc_LoadFont()\r
+{\r
+ char vcstr[80];\r
+\r
+ ResolveString(vcstr);\r
+ vcreturn=LoadFont(vcstr);\r
+}\r
+\r
+void vc_PlayFLI()\r
+{\r
+ char s[256];\r
+ BITMAP flibuf;\r
+ byte *data=0;\r
+ VFILE *f=0;\r
+ int i=0;\r
+\r
+ ResolveString(s);\r
+ flibuf.w=sx;\r
+ flibuf.h=sy;\r
+ flibuf.data=screen;\r
+ if (!(f=vopen(s))) err("PlayFLI: Could not open %s.",s);\r
+ i=filesize(f);\r
+ data=(byte *) malloc(i);\r
+ if (!data) err("Not enough memory to play FLI.");\r
+ vread(data, i, f);\r
+ vclose(f);\r
+ play_memory_fli(data, &flibuf, 0, ShowPage);\r
+ timer_count=0;\r
+ set_intensity(63);\r
+}\r
+\r
+void vc_PrintString()\r
+{\r
+ char s[256];\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ ResolveString(s);\r
+ printstring(i,s);\r
+}\r
+\r
+void vc_LoadRaw()\r
+{\r
+ char s[256];\r
+ char *t=0;\r
+ VFILE *f=0;\r
+ int i=0;\r
+\r
+ ResolveString(s);\r
+ if (!(f=vopen(s))) err("LoadRaw(): Could not open file %s",s);\r
+ i=filesize(f);\r
+ t=(char *) valloc(i, "LoadRaw:t", OID_VC);\r
+ vread(t, i, f);\r
+ vclose(f);\r
+ vcreturn=(int) t;\r
+}\r
+\r
+void vc_SetTile()\r
+{\r
+ int x=0;\r
+ int y=0;\r
+ int layr=0;\r
+ int value=0;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ layr=ResolveOperand();\r
+ value=ResolveOperand();\r
+\r
+ switch (layr)\r
+ {\r
+ case 0:\r
+ case 1:\r
+ case 2:\r
+ case 3:\r
+ case 4:\r
+ case 5: layers[layr][(y*layer[layr].sizex)+x] = (short) value; break;\r
+ case 6: obstruct[(y*layer[0].sizex)+x] = (byte) value; break;\r
+ case 7: zone[(y*layer[0].sizex)+x] = (byte) value; break;\r
+ default: err("SetTile(): Invalid layer value");\r
+ }\r
+}\r
+\r
+void vc_ScaleSprite()\r
+{\r
+ int x,y,iw,ih,dw,dh,image;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ iw=ResolveOperand();\r
+ ih=ResolveOperand();\r
+ dw=ResolveOperand();\r
+ dh=ResolveOperand();\r
+ image=ResolveOperand();\r
+ if (!LucentOn) CopySpriteZoomClip(x,y,iw,ih,dw,dh,(byte *)image);\r
+ if ( LucentOn) CopySpriteZoomLucentClip(x,y,iw,ih,dw,dh,(byte *)image);\r
+}\r
+\r
+void vc_EntityMove()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ entity[i].moving=0;\r
+ entity[i].speedct=0;\r
+\r
+ entity[i].delayct=0;\r
+ entity[i].mode=0;\r
+ entity[i].data1=0;\r
+\r
+ ResolveString((char *) (int) movescriptbuf + (int) (i*256));\r
+ entity[i].scriptofs=(char *) (int) movescriptbuf + (int) (i*256);\r
+ entity[i].movecode=4;\r
+}\r
+\r
+void vc_HLine()\r
+{\r
+ int x, y, x2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) HLineClip(x,y,x2,c);\r
+ if ( LucentOn) HLineLucentClip(x,y,x2,c);\r
+\r
+}\r
+\r
+void vc_VLine()\r
+{\r
+ int x, y, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) VLineClip(x,y,y2,c);\r
+ if ( LucentOn) VLineLucentClip(x,y,y2,c);\r
+}\r
+\r
+void vc_Line()\r
+{\r
+ int x, y, x2, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) LineClip(x,y,x2,y2,c);\r
+ if ( LucentOn) LineLucentClip(x,y,x2,y2,c);\r
+}\r
+\r
+void vc_Circle()\r
+{\r
+ int x, y, radius, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ radius=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) CircleClip(x,y,radius,c);\r
+ if ( LucentOn) CircleLucentClip(x,y,radius,c);\r
+}\r
+\r
+void vc_CircleFill()\r
+{\r
+ int x, y, radius, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ radius=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) CircleFillClip(x,y,radius,c);\r
+ if ( LucentOn) CircleFillLucentClip(x,y,radius,c);\r
+}\r
+\r
+void vc_Rect()\r
+{\r
+ int x, y, x2, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) RectClip(x,y,x2,y2,c);\r
+ if ( LucentOn) RectLucentClip(x,y,x2,y2,c);\r
+}\r
+\r
+void vc_RectFill()\r
+{\r
+ int x, y, x2, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) RectFillClip(x,y,x2,y2,c);\r
+ if ( LucentOn) RectFillLucentClip(x,y,x2,y2,c);\r
+}\r
+\r
+void vc_strlen()\r
+{\r
+ char str[256];\r
+\r
+ ResolveString(str);\r
+ vcreturn=strlen(str);\r
+}\r
+\r
+void vc_strcmp()\r
+{\r
+ char str1[256], str2[256];\r
+\r
+ ResolveString(str1);\r
+ ResolveString(str2);\r
+ vcreturn=strcmp(str1, str2);\r
+}\r
+\r
+void vc_FontWidth()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=numfonts)\r
+ {\r
+ vcreturn=0;\r
+ return;\r
+ }\r
+ vcreturn=font[i].width;\r
+}\r
+\r
+void vc_FontHeight()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=numfonts)\r
+ {\r
+ vcreturn=0;\r
+ return;\r
+ }\r
+ vcreturn=font[i].height;\r
+}\r
+\r
+void vc_SetPixel()\r
+{\r
+ int x, y, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ c=ResolveOperand();\r
+ SetPixelClip(x,y,c);\r
+}\r
+\r
+void vc_GetPixel()\r
+{\r
+ int x, y;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ vcreturn=GetPixelClip(x,y);\r
+}\r
+\r
+void vc_EntityOnScreen()\r
+{\r
+ int i,j;\r
+\r
+ i=ResolveOperand();\r
+ for (j=0; j<cc; j++)\r
+ if (entidx[j]==i)\r
+ {\r
+ vcreturn=1;\r
+ return;\r
+ }\r
+ vcreturn=0;\r
+}\r
+\r
+void vc_GetTile()\r
+{\r
+ int x, y, l;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ l=ResolveOperand();\r
+\r
+ switch (l)\r
+ {\r
+ case 0:\r
+ case 1:\r
+ case 2:\r
+ case 3:\r
+ case 4:\r
+ case 5: vcreturn=(int) layers[l][(y*layer[l].sizex)+x]; break;\r
+ case 6: vcreturn=(int) obstruct[(y*layer[0].sizex)+x]; break;\r
+ case 7: vcreturn=(int) zone[(y*layer[0].sizex)+x]; break;\r
+ default: err("GetTile(): Invalid layer value");\r
+ }\r
+}\r
+\r
+void vc_SetResolution()\r
+{\r
+ int xres, yres;\r
+\r
+ xres=ResolveOperand();\r
+ yres=ResolveOperand();\r
+ ShutdownVideo(0);\r
+ vcreturn=InitVideo(xres,yres);\r
+}\r
+\r
+void vc_SetRString()\r
+{\r
+ ResolveString(rstring);\r
+}\r
+\r
+void vc_SetClipRect()\r
+{\r
+ cx1=ResolveOperand();\r
+ cy1=ResolveOperand();\r
+ cx2=ResolveOperand();\r
+ cy2=ResolveOperand();\r
+}\r
+\r
+void vc_SetRenderDest()\r
+{\r
+ sx=ResolveOperand();\r
+ sy=ResolveOperand();\r
+ screen=(byte *) ResolveOperand();\r
+}\r
+\r
+void vc_RestoreRenderSettings()\r
+{\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+ sx=tsx;\r
+ sy=tsy;\r
+ screen=vscreen;\r
+}\r
+\r
+void vc_PartyMove()\r
+{\r
+ player=0;\r
+\r
+ entity[playernum].moving=0;\r
+ entity[playernum].speedct=0;\r
+ entity[playernum].delayct=0;\r
+ entity[playernum].mode=0;\r
+ entity[playernum].data1=0;\r
+\r
+ vcpush(cameratracking);\r
+ vcpush(tracker);\r
+ if (cameratracking==1)\r
+ {\r
+ cameratracking=2;\r
+ tracker=playernum;\r
+ }\r
+\r
+ ResolveString((char *) (int) movescriptbuf + (int) (playernum*256));\r
+ entity[playernum].scriptofs=(char *) (int) movescriptbuf + (int) (playernum*256);\r
+ entity[playernum].movecode=4;\r
+\r
+ while (entity[playernum].movecode)\r
+ {\r
+ while (timer_count)\r
+ {\r
+ ProcessEntities();\r
+ timer_count--;\r
+ }\r
+ Render();\r
+ ShowPage();\r
+ }\r
+ tracker=vcpop();\r
+ cameratracking=vcpop();\r
+ player=&entity[playernum];\r
+ timer_count=0;\r
+}\r
+\r
+void vc_WrapBlit()\r
+{\r
+ int a,b,c,d,e;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ if (!LucentOn) WrapBlit(a,b,c,d,(byte *) e);\r
+ else WrapBlitLucent(a,b,c,d,(byte *) e);\r
+}\r
+\r
+\r
+void vc_TWrapBlit()\r
+{\r
+ int a,b,c,d,e;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ if (!LucentOn) WrapBlitMasked(a,b,c,d,(byte *) e);\r
+ else WrapBlitLucentMasked(a,b,c,d,(byte *) e);\r
+}\r
+\r
+void vc_SetMousePos()\r
+{\r
+ int x, y;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ SetMouse(x, y);\r
+}\r
+\r
+void vc_HookRetrace()\r
+{\r
+ int script=0;\r
+ char which;\r
+\r
+ which=GrabC();\r
+ switch (which)\r
+ {\r
+ case 1: script=ResolveOperand(); break;\r
+ case 2: script=GrabD(); break;\r
+ }\r
+ if (which==2) script+=USERFUNC_MARKER;\r
+ hookretrace=script;\r
+}\r
+\r
+void vc_HookTimer()\r
+{\r
+ int script=0;\r
+ char which;\r
+\r
+ which=GrabC();\r
+ switch (which)\r
+ {\r
+ case 1: script=ResolveOperand(); break;\r
+ case 2: script=GrabD(); break;\r
+ }\r
+ if (which==2) script+=USERFUNC_MARKER;\r
+ hooktimer=script;\r
+}\r
+\r
+void vc_HookKey()\r
+{\r
+ int key, script=0;\r
+ char which;\r
+\r
+ key=ResolveOperand();\r
+ which=GrabC();\r
+\r
+ switch (which)\r
+ {\r
+ case 1: script=ResolveOperand(); break;\r
+ case 2: script=GrabD(); break;\r
+ }\r
+ if (which==2) script+=USERFUNC_MARKER;\r
+ bindarray[key]=script;\r
+}\r
+\r
+void vc_PlayMusic()\r
+{\r
+ char songname[256];\r
+\r
+ ResolveString(songname);\r
+ PlayMusic(songname);\r
+}\r
+\r
+void vc_PaletteMorph()\r
+{\r
+ int r,g,b,percent,intensity,i,wr,wg,wb;\r
+\r
+ r=ResolveOperand(); if (r<0) r=0; if (r>63) r=63;\r
+ g=ResolveOperand(); if (g<0) g=0; if (g>63) g=63;\r
+ b=ResolveOperand(); if (b<0) b=0; if (b>63) b=63;\r
+ percent=100-ResolveOperand();\r
+ intensity=ResolveOperand();\r
+\r
+ for (i=0; i<256; i++)\r
+ {\r
+ wr=pal[(i*3)];\r
+ wg=pal[(i*3)+1];\r
+ wb=pal[(i*3)+2];\r
+\r
+ wr=((wr*percent)+(r*(100-percent)))/100;\r
+ wg=((wg*percent)+(g*(100-percent)))/100;\r
+ wb=((wb*percent)+(b*(100-percent)))/100;\r
+\r
+ pal2[(i*3)]=wr*intensity/63;\r
+ pal2[(i*3)+1]=wg*intensity/63;\r
+ pal2[(i*3)+2]=wb*intensity/63;\r
+ }\r
+ SetPalette(pal2);\r
+}\r
+\r
+void EnforceNoDirectories(char *s)\r
+{\r
+ char y[256], *p;\r
+\r
+ strcpy(y, s);\r
+ p=(char *) (int) y + (int) strlen(y);\r
+ while (p>y && *p != '/' && *p != '\\')\r
+ p--;\r
+ if (*p == '/' || *p == '\\') p++;\r
+ strcpy(s, p);\r
+}\r
+\r
+void vc_OpenFile()\r
+{\r
+ VFILE *f;\r
+ char fname[256];\r
+\r
+ ResolveString(fname);\r
+ EnforceNoDirectories(fname);\r
+\r
+ f=vopen(fname);\r
+ vcreturn=(quad) f;\r
+\r
+ Log(" --> VC opened file %s, ptr %u", fname, (quad) f);\r
+}\r
+\r
+void vc_CloseFile()\r
+{\r
+ VFILE *f;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vclose(f);\r
+\r
+ Log(" --> VC closed file at ptr %u", (quad) f);\r
+}\r
+\r
+void vc_QuickRead()\r
+{\r
+ char fname[256], c, *p;\r
+ int d=0, l, i;\r
+ VFILE *f;\r
+ word w=0;\r
+\r
+ ResolveString(fname);\r
+ EnforceNoDirectories(fname);\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ d=0;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ d=ResolveOperand();\r
+ }\r
+ l=ResolveOperand();\r
+ l=l ? l : 1;\r
+ if (!(f=vopen(fname))) err("QuickRead() - could not open %s",fname);\r
+\r
+ p=(char *) (quad) stringbuf + ((w+d)*256);\r
+ for (i=0; i<l; i++)\r
+ vgets(p, 255, f);\r
+ while (*p)\r
+ {\r
+ if (*p == 10 || *p == 13) *p=0;\r
+ p++;\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+void vc_AddFollower()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=entities) err("AddFollower(): Not a valid entity index. (%d)",i);\r
+ follower[(int)numfollowers]=i;\r
+ numfollowers++;\r
+// ResetFollowers();\r
+}\r
+\r
+void vc_FlatPoly()\r
+{\r
+ int a, b, c, d, e, f, g;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+ FlatPoly(a,b,c,d,e,f,g);\r
+}\r
+\r
+void vc_TMapPoly()\r
+{\r
+ int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+ h=ResolveOperand();\r
+ i=ResolveOperand();\r
+ j=ResolveOperand();\r
+ k=ResolveOperand();\r
+ l=ResolveOperand();\r
+ m=ResolveOperand();\r
+ n=ResolveOperand();\r
+ o=ResolveOperand();\r
+ TMapPoly(a,b,c,d,e,f,g,h,i,j,k,l,m,n,(char *) o);\r
+}\r
+\r
+void vc_CacheSound()\r
+{\r
+ char fname[256];\r
+\r
+ ResolveString(fname);\r
+ vcreturn=CacheSound(fname);\r
+\r
+}\r
+\r
+void vc_PlaySound()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ PlaySound(a, b, c);\r
+}\r
+\r
+void vc_RotScale()\r
+{\r
+ int a, b, c, d, e, f, g;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+\r
+ RotScale(a, b, c, d, e*3.14159 / 180, (float) f/1000, (byte *) g);\r
+}\r
+\r
+void vc_MapLine()\r
+{\r
+ int x, y, sy, l;\r
+ int xtc, ytc, xofs, yofs;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ sy=ResolveOperand();\r
+ l=ResolveOperand();\r
+\r
+ xtc=x >> 4;\r
+ ytc=y >> 4;\r
+ xofs= -(x&15);\r
+ yofs= (y&15);\r
+\r
+ MapLine(xofs, sy, yofs, (word *) (layers[l]+((ytc*layer[l].sizex)+xtc)));\r
+}\r
+\r
+void vc_TMapLine()\r
+{\r
+ int x, y, sy, l;\r
+ int xtc, ytc, xofs, yofs;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ sy=ResolveOperand();\r
+ l=ResolveOperand();\r
+\r
+ xtc=x >> 4;\r
+ ytc=y >> 4;\r
+ xofs= -(x&15);\r
+ yofs= (y&15);\r
+\r
+ TMapLine(xofs, sy, yofs, (word *) (layers[l]+((ytc*layer[l].sizex)+xtc)));\r
+}\r
+\r
+void vc_val()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ vcreturn=atoi(s);\r
+}\r
+\r
+void vc_TScaleSprite()\r
+{\r
+ int x,y,iw,ih,dw,dh,image;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ iw=ResolveOperand();\r
+ ih=ResolveOperand();\r
+ dw=ResolveOperand();\r
+ dh=ResolveOperand();\r
+ image=ResolveOperand();\r
+ if (!LucentOn) TCopySpriteZoomClip(x,y,iw,ih,dw,dh,(byte *) image);\r
+ if ( LucentOn) TCopySpriteZoomLucentClip(x,y,iw,ih,dw,dh,(byte *) image);\r
+}\r
+\r
+void vc_GrabRegion()\r
+{\r
+ int x1, y1, x2, y2;\r
+ int i, j, w, h;\r
+ char *ptr;\r
+\r
+ x1=ResolveOperand();\r
+ y1=ResolveOperand();\r
+ x2=ResolveOperand()+1;\r
+ y2=ResolveOperand()+1;\r
+ ptr=(char *) ResolveOperand();\r
+\r
+ if (x2>sx-1) x2=sx-1;\r
+ if (y2>sy-1) y2=sy-1;\r
+ if (x1<0) x1=0;\r
+ if (y1<0) y1=0;\r
+\r
+ w=x2 - x1;\r
+ h=y2 - y1;\r
+\r
+ for (j=y1; j<y2; j++)\r
+ for (i=x1; i<x2; i++)\r
+ ptr[((j-y1)*w)+i]=screen[(j*sx)+i];\r
+}\r
+\r
+void vc_Log()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ Log(s);\r
+}\r
+\r
+void vc_fseekline()\r
+{\r
+ int line, i;\r
+ VFILE *f;\r
+\r
+ line=ResolveOperand();\r
+ f=(VFILE *) ResolveOperand();\r
+\r
+ vseek(f, 0, 0);\r
+ line=( line==0 ? 0 : line-1 );\r
+\r
+ for (i=0; i<line; i++)\r
+ vgets(strbuf, 255, f);\r
+}\r
+\r
+void vc_fseekpos()\r
+{\r
+ int pos;\r
+ VFILE *f;\r
+\r
+ pos=ResolveOperand();\r
+ f=(VFILE *) ResolveOperand();\r
+ vseek(f, pos, 0);\r
+}\r
+\r
+void vc_fread()\r
+{\r
+ char *buffer;\r
+ int len;\r
+ VFILE *f;\r
+\r
+ buffer=(char *) ResolveOperand();\r
+ len=ResolveOperand();\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(buffer, len, f);\r
+}\r
+\r
+void vc_fgetbyte()\r
+{\r
+ VFILE *f;\r
+ byte i;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(&i, 1, f);\r
+ vcreturn=(int) i;\r
+}\r
+\r
+void vc_fgetword()\r
+{\r
+ VFILE *f;\r
+ word i;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(&i, 2, f);\r
+ vcreturn=(int) i;\r
+}\r
+\r
+void vc_fgetquad()\r
+{\r
+ VFILE *f;\r
+ quad i;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(&i, 4, f);\r
+ vcreturn=(int) i;\r
+}\r
+\r
+void vc_fgetline()\r
+{\r
+ char c, *p;\r
+ VFILE *f;\r
+ word w=0;\r
+ quad d;\r
+\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ d=0;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ d=ResolveOperand();\r
+ }\r
+ f=(VFILE *) ResolveOperand();\r
+ p=(char *) (quad) stringbuf + (w*256);\r
+ vgets(p, 255, f);\r
+ while (*p)\r
+ {\r
+ if (*p == 10 || *p == 13) *p=0;\r
+ p++;\r
+ }\r
+}\r
+\r
+void vc_fgettoken()\r
+{\r
+ char c, *p;\r
+ VFILE *f;\r
+ word w=0;\r
+ quad d;\r
+\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ d=0;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ d=ResolveOperand();\r
+ }\r
+ f=(VFILE *) ResolveOperand();\r
+ p=(char *) (quad) stringbuf + (w*256);\r
+ vscanf(f, "%s", p);\r
+}\r
+\r
+void vc_fwritestring()\r
+{\r
+ char s[256];\r
+ FILE *f;\r
+\r
+ ResolveString(s);\r
+ f=(FILE *) ResolveOperand();\r
+ fprintf(f,"%s\n",s);\r
+}\r
+\r
+void vc_fwrite()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ fwrite((char *) a, 1, b, (FILE *) c);\r
+}\r
+\r
+void vc_frename()\r
+{\r
+ char s1[256], s2[256];\r
+\r
+ ResolveString(s1);\r
+ ResolveString(s2);\r
+ EnforceNoDirectories(s1);\r
+ EnforceNoDirectories(s2);\r
+ rename(s1, s2);\r
+\r
+ Log(" --> VC renamed %s to %s.", s1, s2);\r
+}\r
+\r
+void vc_fdelete()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ EnforceNoDirectories(s);\r
+ remove(s);\r
+\r
+ Log(" --> VC deleted %s.", s);\r
+}\r
+\r
+void vc_fwopen()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ EnforceNoDirectories(s);\r
+ vcreturn=(int) fopen(s,"wb");\r
+\r
+ Log(" --> VC opened %s for writing, ptr %u.", s, vcreturn);\r
+}\r
+\r
+void vc_fwclose()\r
+{\r
+ FILE *f;\r
+\r
+ f=(FILE *) ResolveOperand();\r
+ fclose(f);\r
+\r
+ Log(" --> VC close file opened for writing, ptr %u.", (int) f);\r
+}\r
+\r
+void vc_memcpy()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ memcpy((char *) a, (char *) b, c);\r
+}\r
+\r
+void vc_memset()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ memset((char *) a, (byte) b, c);\r
+}\r
+\r
+void vc_Silhouette()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int w=ResolveOperand();\r
+ int h=ResolveOperand();\r
+ byte *img=(byte *) ResolveOperand();\r
+ byte c=(byte) ResolveOperand();\r
+\r
+ if (ClipOn)\r
+ {\r
+ LucentOn ? SilhouetteLucentClip(x,y,w,h,c,img)\r
+ : SilhouetteClip(x,y,w,h,c,img);\r
+ }\r
+ else\r
+ {\r
+ LucentOn ? SilhouetteLucent(x,y,w,h,c,img)\r
+ : Silhouette(x,y,w,h,c,img);\r
+ }\r
+}\r
+\r
+void vc_SilhouetteScale()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int sw=ResolveOperand();\r
+ int sh=ResolveOperand();\r
+ int dw=ResolveOperand();\r
+ int dh=ResolveOperand();\r
+ byte *img=(byte *) ResolveOperand();\r
+ byte c=(byte) ResolveOperand();\r
+\r
+ if (ClipOn)\r
+ {\r
+ LucentOn ? SilhouetteZoomLucentClip(x,y,sw,sh,dw,dh,c,img)\r
+ : SilhouetteZoomClip(x,y,sw,sh,dw,dh,c,img);\r
+ }\r
+ else\r
+ {\r
+ LucentOn ? SilhouetteZoomLucent(x,y,sw,sh,dw,dh,c,img)\r
+ : SilhouetteZoom(x,y,sw,sh,dw,dh,c,img);\r
+ }\r
+}\r
+\r
+void vc_Tint()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int w=ResolveOperand();\r
+ int h=ResolveOperand();\r
+ byte *img=(byte *)ResolveOperand();\r
+ byte c=(byte)ResolveOperand();\r
+\r
+ ClipOn ? TintClip(x,y,w,h,c,img)\r
+ : Tint(x,y,w,h,c,img);\r
+}\r
+\r
+void vc_TintScale()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int sw=ResolveOperand();\r
+ int sh=ResolveOperand();\r
+ int dw=ResolveOperand();\r
+ int dh=ResolveOperand();\r
+ byte *img=(byte *) ResolveOperand();\r
+ byte c=(byte) ResolveOperand();\r
+\r
+ ClipOn ? TintZoomClip(x,y,sw,sh,dw,dh,c,img)\r
+ : TintZoom(x,y,sw,sh,dw,dh,c,img);\r
+}\r
+\r
+void vc_Mosaic()\r
+{\r
+ int a,b,c,d,e,f,g;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+ Mosaic(a,b,(byte *) c,d,e,f,g);\r
+}\r
+\r
+void vc_WriteVars()\r
+{\r
+ FILE *f;\r
+\r
+ f=(FILE *) ResolveOperand();\r
+ fwrite(globalint, 4, maxint, f);\r
+ fwrite(stringbuf, 256, stralloc, f);\r
+}\r
+\r
+void vc_ReadVars()\r
+{\r
+ VFILE *f;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(globalint, 4*maxint, f);\r
+ vread(stringbuf, 256*stralloc, f);\r
+}\r
+\r
+void vc_Asc()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ vcreturn=(int) s[0];\r
+}\r
+\r
+void vc_NumForScript()\r
+{\r
+ vcreturn=GrabD();\r
+}\r
+\r
+void vc_Filesize()\r
+{\r
+ char s[256];\r
+ VFILE *f;\r
+\r
+ ResolveString(s);\r
+ f=vopen(s);\r
+ vcreturn=filesize(f);\r
+ vclose(f);\r
+}\r
+\r
+void vc_FTell()\r
+{\r
+ VFILE *f=(VFILE *)ResolveOperand();\r
+ vcreturn=vtell(f);\r
+}\r
+\r
+void vc_CheckCorrupt()\r
+{\r
+ Log("checking for corruption...");\r
+ CheckCorruption();\r
+}\r
+\r
+void HandleStdLib()\r
+{\r
+ int x=0;\r
+ byte c=0;\r
+\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case 1: vc_Exit_(); break;\r
+ case 2: vc_Message(); break;\r
+ case 3: vc_Malloc(); break;\r
+ case 4: vc_Free(); break;\r
+ case 5: vc_pow(); break;\r
+ case 6: vc_loadimage(); break;\r
+ case 7: vc_copysprite(); break;\r
+ case 8: vc_tcopysprite(); break;\r
+ case 9: Render(); break;\r
+ case 10: ShowPage(); break;\r
+ case 11: vc_EntitySpawn(); break;\r
+ case 12: vc_SetPlayer(); break;\r
+ case 13: vc_Map(); break;\r
+ case 14: vc_LoadFont(); break;\r
+ case 15: vc_PlayFLI(); break;\r
+ case 16: curx=ResolveOperand(); cury=ResolveOperand(); break;\r
+ case 17: vc_PrintString(); break;\r
+ case 18: vc_LoadRaw(); break;\r
+ case 19: vc_SetTile(); break;\r
+ case 20: allowconsole=ResolveOperand(); break;\r
+ case 21: vc_ScaleSprite(); break;\r
+ case 22: ProcessEntities(); break;\r
+ case 23: UpdateControls(); break;\r
+ case 24: UnPress(ResolveOperand()); break;\r
+ case 25: vc_EntityMove(); break;\r
+ case 26: vc_HLine(); break;\r
+ case 27: vc_VLine(); break;\r
+ case 28: vc_Line(); break;\r
+ case 29: vc_Circle(); break;\r
+ case 30: vc_CircleFill(); break;\r
+ case 31: vc_Rect(); break;\r
+ case 32: vc_RectFill(); break;\r
+ case 33: vc_strlen(); break;\r
+ case 34: vc_strcmp(); break;\r
+ case 35: break; //CD_Stop(); break;\r
+ case 36: ResolveOperand(); break; //CD_Play(ResolveOperand()); break;\r
+ case 37: vc_FontWidth(); break;\r
+ case 38: vc_FontHeight(); break;\r
+ case 39: vc_SetPixel(); break;\r
+ case 40: vc_GetPixel(); break;\r
+ case 41: vc_EntityOnScreen(); break;\r
+ case 42: vcreturn=0;\r
+ if ((x=ResolveOperand()))\r
+ vcreturn=rand()%x;\r
+ break;\r
+ case 43: vc_GetTile(); break;\r
+ case 44: vc_HookRetrace(); break;\r
+ case 45: vc_HookTimer(); break;\r
+ case 46: vc_SetResolution(); break;\r
+ case 47: vc_SetRString(); break;\r
+ case 48: vc_SetClipRect(); break;\r
+ case 49: vc_SetRenderDest(); break;\r
+ case 50: vc_RestoreRenderSettings(); break;\r
+ case 51: vc_PartyMove(); break;\r
+ case 52: vcreturn=sintbl[ResolveOperand()]; break;\r
+ case 53: vcreturn=costbl[ResolveOperand()]; break;\r
+ case 54: vcreturn=tantbl[ResolveOperand()]; break;\r
+ case 55: ReadMouse(); break;\r
+ case 56: ClipOn=ResolveOperand(); break;\r
+ case 57: LucentOn=ResolveOperand(); break;\r
+ case 58: vc_WrapBlit(); break;\r
+ case 59: vc_TWrapBlit(); break;\r
+ case 60: vc_SetMousePos(); break;\r
+ case 61: vc_HookKey(); break;\r
+ case 62: vc_PlayMusic(); break;\r
+ case 63: StopMusic(); break;\r
+ case 64: vc_PaletteMorph(); break;\r
+ case 65: vc_OpenFile(); break;\r
+ case 66: vc_CloseFile(); break;\r
+ case 67: vc_QuickRead(); break;\r
+ case 68: vc_AddFollower(); break;\r
+// case 69: vc_KillFollower(); break;\r
+// case 70: vc_KillAllFollowers(); break;\r
+// case 71: ResetFollowers();\r
+ case 72: vc_FlatPoly(); break;\r
+ case 73: vc_TMapPoly(); break;\r
+ case 74: vc_CacheSound(); break;\r
+ case 75: FreeAllSounds(); break;\r
+ case 76: vc_PlaySound(); break;\r
+ case 77: vc_RotScale(); break;\r
+ case 78: vc_MapLine(); break;\r
+ case 79: vc_TMapLine(); break;\r
+ case 80: vc_val(); break;\r
+ case 81: vc_TScaleSprite(); break;\r
+ case 82: vc_GrabRegion(); break;\r
+ case 83: vc_Log(); break;\r
+ case 84: vc_fseekline(); break;\r
+ case 85: vc_fseekpos(); break;\r
+ case 86: vc_fread(); break;\r
+ case 87: vc_fgetbyte(); break;\r
+ case 88: vc_fgetword(); break;\r
+ case 89: vc_fgetquad(); break;\r
+ case 90: vc_fgetline(); break;\r
+ case 91: vc_fgettoken(); break;\r
+ case 92: vc_fwritestring(); break;\r
+ case 93: vc_fwrite(); break;\r
+ case 94: vc_frename(); break;\r
+ case 95: vc_fdelete(); break;\r
+ case 96: vc_fwopen(); break;\r
+ case 97: vc_fwclose(); break;\r
+ case 98: vc_memcpy(); break;\r
+ case 99: vc_memset(); break;\r
+ case 100: vc_Silhouette(); break;\r
+ case 101: vcreturn=(int) InitMosaicTable(); break;\r
+ case 102: vc_Mosaic(); break;\r
+ case 103: vc_WriteVars(); break;\r
+ case 104: vc_ReadVars(); break;\r
+ case 105: ExecuteEvent(ResolveOperand()); break;\r
+ case 106: vc_Asc(); break;\r
+ case 107: ExecuteUserFunc(ResolveOperand()); break;\r
+ case 108: vc_NumForScript(); break;\r
+ case 109: vc_Filesize(); break;\r
+ case 110: vc_FTell(); break;\r
+ case 111: vc_CheckCorrupt(); break;\r
+ default: err("VC Execution error: Invalid STDLIB index. (%d)",(int) c);\r
+ }\r
+}\r
+\r
+// ========================== VC Interpretation Core ==========================\r
+\r
+int ProcessIf()\r
+{\r
+ byte exec, c;\r
+\r
+ exec=ProcessIfOperand(); // Get base value;\r
+\r
+ while (1)\r
+ {\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case i_AND: exec=exec & ProcessIfOperand(); continue;\r
+ case i_OR: exec=exec | ProcessIfOperand(); continue;\r
+ case i_UNGROUP: break;\r
+ }\r
+ break;\r
+ }\r
+ return exec;\r
+}\r
+\r
+int ProcessIfOperand()\r
+{\r
+ byte op_desc;\r
+ int eval;\r
+\r
+ eval=ResolveOperand();\r
+ op_desc=GrabC();\r
+ switch (op_desc)\r
+ {\r
+ case i_ZERO: if (!eval) return 1; else return 0;\r
+ case i_NONZERO: if (eval) return 1; else return 0;\r
+ case i_EQUALTO: if (eval == ResolveOperand()) return 1; else return 0;\r
+ case i_NOTEQUAL: if (eval != ResolveOperand()) return 1; else return 0;\r
+ case i_GREATERTHAN: if (eval > ResolveOperand()) return 1; else return 0;\r
+ case i_GREATERTHANOREQUAL: if (eval >= ResolveOperand()) return 1; else return 0;\r
+ case i_LESSTHAN: if (eval < ResolveOperand()) return 1; else return 0;\r
+ case i_LESSTHANOREQUAL: if (eval <= ResolveOperand()) return 1; else return 0;\r
+ case i_GROUP: if (ProcessIf()) return 1; else return 0;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void HandleIf()\r
+{\r
+ char *d;\r
+\r
+ if (ProcessIf())\r
+ {\r
+ GrabD();\r
+ return;\r
+ }\r
+ d=(char *) GrabD();\r
+ code=(char *) (int) basevc + (int) d;\r
+\r
+ return;\r
+}\r
+\r
+void HandleExternFunc()\r
+{\r
+ word i, j, k;\r
+ //lvars *ob = NULL;\r
+ //lvars *save = NULL;\r
+ lvars temp;\r
+ lvars ob;\r
+\r
+ // save lvar\r
+ memcpy(&temp, &lvar, sizeof(lvars));\r
+\r
+ memset(&ob, 0, sizeof(lvars));\r
+ //ob = (lvars *)valloc(sizeof(lvars)); //2640); //sizeof(lvars)); //2640);\r
+ //MSS_CHECK_POINTER_VALIDITY(ob);\r
+ //MSS_SET_BLOCK_LABEL(ob, "ob");\r
+\r
+ k = 0;\r
+ i = GrabW();\r
+ for (j=0; j<funcs[i].numargs; j++)\r
+ {\r
+ switch (funcs[i].argtype[j])\r
+ {\r
+ case 1: ob.nargs[j] = ResolveOperand(); break;\r
+ case 3: ResolveString(ob.s + (k << 8)), k++; break;\r
+ }\r
+ }\r
+\r
+ // copy in ob\r
+ memcpy(&lvar, &ob, sizeof(lvars));\r
+ //lvar = &ob;\r
+ //save = lvar\r
+ //lvar = ob;\r
+ //ob = save;\r
+\r
+ vcpush((quad)basevc);\r
+ vcpush((quad)code);\r
+\r
+ basevc = sysvc;\r
+ code = (char *)(sysvc + funcs[i].syscodeofs);\r
+\r
+ if (vctrack)\r
+ {\r
+ Log(" --> Entering user func %s, codeofs %d",\r
+ funcs[i].fname, funcs[i].syscodeofs);\r
+ }\r
+\r
+ ExecuteBlock();\r
+ basevc = (char *)vcpop();\r
+\r
+ // restore lvar\r
+ memcpy(&lvar, &temp, sizeof(lvars));\r
+ //memcpy(lvar, &temp, sizeof(lvars));\r
+ //vfree(lvar);\r
+ //lvar = ob;\r
+\r
+ if (vctrack)\r
+ {\r
+ Log(" --> Returned from %s", funcs[i].fname);\r
+ }\r
+\r
+// MSS_CHECK_ALL_BLOCKS;\r
+}\r
+\r
+void HandleAssign()\r
+{\r
+ byte c, d;\r
+ word w;\r
+ quad location=0, value, ofs=0;\r
+\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ c=GrabC();\r
+ if (c!=a_SET) err("VC execution error: Corrupt string assignment");\r
+ location=(quad) stringbuf + (w*256);\r
+ ResolveString((char *) location);\r
+ return;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ w+=ResolveOperand();\r
+ c=GrabC();\r
+ if (c!=a_SET) err("VC execution error: Corrupt string assignment");\r
+ location=(quad) stringbuf + (w*256);\r
+ ResolveString((char *) location);\r
+ return;\r
+ }\r
+ if (c==op_SLOCAL)\r
+ {\r
+ w=GrabW();\r
+ c=GrabC();\r
+ if (c!=a_SET) err("VC execution error: Corrupt string assignment");\r
+ location=(quad) &lvar.s[w*256];\r
+ ResolveString((char *) location);\r
+ return;\r
+ }\r
+ switch (c)\r
+ {\r
+ case op_UVAR: location=GrabD(); break;\r
+ case op_UVARRAY: location=GrabD(); location+=ResolveOperand(); break;\r
+ case op_HVAR0: location=(int) GrabC(); break;\r
+ case op_HVAR1: location=(int) GrabC(); ofs=ResolveOperand(); break;\r
+ case op_LVAR: location=(int) GrabC(); break;\r
+ default: err("VC Execution error: Unknown assignment category.");\r
+ }\r
+ value=ReadInt(c, location, ofs);\r
+ d=GrabC();\r
+ switch(d)\r
+ {\r
+ case a_SET: value=ResolveOperand(); break;\r
+ case a_INC: value++; break;\r
+ case a_DEC: value--; break;\r
+ case a_INCSET: value+=ResolveOperand(); break;\r
+ case a_DECSET: value-=ResolveOperand(); break;\r
+ default:\r
+ err("VC Execution error: Invalid assignment operator %d.", (int) d);\r
+ }\r
+ WriteInt(c, location, ofs, value);\r
+}\r
+\r
+void HandleSwitch()\r
+{\r
+ int realvalue=0;\r
+ int compvalue=0;\r
+ byte c=0;\r
+ byte *next=0;\r
+\r
+ realvalue=ResolveOperand();\r
+ c=GrabC();\r
+ while (c!=opRETURN)\r
+ {\r
+ compvalue=ResolveOperand();\r
+ next=(byte *) GrabD();\r
+ if (compvalue!=realvalue)\r
+ {\r
+ code=(char *) (int) basevc+(int) next;\r
+ c=GrabC();\r
+ continue;\r
+ }\r
+ ExecuteSection();\r
+ c=GrabC();\r
+ }\r
+}\r
+\r
+void ExecuteVC()\r
+{\r
+ byte c=0;\r
+\r
+ while (1)\r
+ {\r
+ if (kill) break;\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case opEXEC_STDLIB: HandleStdLib(); break;\r
+ case opEXEC_LOCALFUNC: break;\r
+ case opEXEC_EXTERNFUNC: HandleExternFunc(); break;\r
+ case opIF: HandleIf(); break;\r
+ case opELSE: break;\r
+ case opGOTO: code=basevc+GrabD(); break;\r
+ case opSWITCH: HandleSwitch(); break;\r
+ case opASSIGN: HandleAssign(); break;\r
+ case opRETURN: code=(char *) vcpop(); break;\r
+ case opSETRETVAL: vcreturn=ResolveOperand(); break;\r
+ default:\r
+ err("Internal VC execution error. (%d)",(int) code - (int) basevc);\r
+ }\r
+ if ((int) code != -1) continue; else break;\r
+ }\r
+}\r
+\r
+void ExecuteBlock()\r
+{\r
+ byte c=0;\r
+\r
+ while (1)\r
+ {\r
+ if (kill) break;\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case opEXEC_STDLIB: HandleStdLib(); break;\r
+ case opEXEC_LOCALFUNC: break;\r
+ case opEXEC_EXTERNFUNC: HandleExternFunc(); break;\r
+ case opIF: HandleIf(); break;\r
+ case opELSE: break;\r
+ case opGOTO: code=basevc+GrabD(); break;\r
+ case opSWITCH: HandleSwitch(); break;\r
+ case opASSIGN: HandleAssign(); break;\r
+ case opRETURN: code=(char *) vcpop(); break;\r
+ case opSETRETVAL: vcreturn=ResolveOperand(); break;\r
+ default:\r
+ err("Internal VC execution error. (%d)",(int) code - (int) basevc);\r
+ }\r
+ if (c != opRETURN) continue; else break;\r
+ }\r
+}\r
+\r
+void ExecuteSection()\r
+{\r
+ byte c=0;\r
+\r
+ while (1)\r
+ {\r
+ if (kill) break;\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case opEXEC_STDLIB: HandleStdLib(); break;\r
+ case opEXEC_LOCALFUNC: break;\r
+ case opEXEC_EXTERNFUNC: HandleExternFunc(); break;\r
+ case opIF: HandleIf(); break;\r
+ case opELSE: break;\r
+ case opGOTO: code=basevc+GrabD(); break;\r
+ case opSWITCH: HandleSwitch(); break;\r
+ case opASSIGN: HandleAssign(); break;\r
+ case opRETURN: break;\r
+ case opSETRETVAL: vcreturn=ResolveOperand(); break;\r
+ default:\r
+ err("Internal VC execution error. (%d)", (int) code - (int) basevc);\r
+ }\r
+ if (c != opRETURN) continue; else break;\r
+ }\r
+}\r
+\r
+void ExecuteEvent(int i)\r
+{\r
+ invc++;\r
+ vcpush((quad) code);\r
+ vcpush((quad) basevc);\r
+ if (i>mapevents) err("VC event out of bounds (%d)",i);\r
+ basevc=mapvc;\r
+ code=(char *) (int) mapvc + (int) mapvctbl[i];\r
+ vcpush(-1);\r
+ ExecuteVC();\r
+ basevc=(char *) vcpop();\r
+ code=(char *) vcpop();\r
+ invc--;\r
+}\r
+\r
+void ExecuteUserFunc(int i)\r
+{\r
+ //lvars *ob=0;\r
+ lvars temp;\r
+\r
+ // save lvar\r
+ memcpy(&temp, &lvar, sizeof(lvars));\r
+\r
+ vcpush((quad) code);\r
+ vcpush((quad) basevc);\r
+\r
+ if (i > numfuncs)\r
+ err("VC event out of bounds");\r
+\r
+ basevc = sysvc;\r
+ code = (char *)(sysvc + funcs[i].syscodeofs);\r
+\r
+ vcpush(-1);\r
+\r
+ memset(&lvar, 0, sizeof(lvar));\r
+ //ob = lvar;\r
+ //lvar = (lvars *)valloc(sizeof(lvars)); //2640);\r
+ //MSS_SET_BLOCK_LABEL(lvar, "lvar");\r
+\r
+ ExecuteVC();\r
+ basevc = (char *) vcpop();\r
+ code = (char *) vcpop();\r
+\r
+ //free(lvar);\r
+ //lvar = ob;\r
+\r
+ // restore lvar\r
+ memcpy(&lvar, &temp, sizeof(lvars));\r
+}\r
+\r
+void HookRetrace()\r
+{\r
+ if (!hookretrace) return;\r
+ if (hookretrace<USERFUNC_MARKER) ExecuteEvent(hookretrace);\r
+ if (hookretrace>=USERFUNC_MARKER) ExecuteUserFunc(hookretrace-USERFUNC_MARKER);\r
+}\r
+\r
+void HookTimer()\r
+{\r
+ if (!hooktimer) return;\r
+ if (hooktimer<USERFUNC_MARKER) ExecuteEvent(hooktimer);\r
+ if (hooktimer>=USERFUNC_MARKER) ExecuteUserFunc(hooktimer-USERFUNC_MARKER);\r
+}\r
+\r
+void HookKey(int script)\r
+{\r
+ if (!script) return;\r
+ if (script<USERFUNC_MARKER) ExecuteEvent(script);\r
+ if (script>=USERFUNC_MARKER) ExecuteUserFunc(script-USERFUNC_MARKER);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VC_H\r
+#define VC_H\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[12];\r
+ int numargs;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+extern funcdecl funcs[100];\r
+extern int numfuncs, mapevents;\r
+extern int hookretrace, hooktimer;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+extern vardecl vars[100];\r
+extern int numvars, invc;\r
+extern char *mapvc, kill;\r
+extern char *vcsp, *vcstack;\r
+\r
+void LoadSystemVC();\r
+void LoadMapVC(VFILE *f);\r
+void ReadVCVar();\r
+void WriteVCVar();\r
+void ExecuteEvent(int);\r
+void ExecuteUserFunc(int);\r
+\r
+void HookRetrace();\r
+void HookTimer();\r
+void HookKey(int script);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// We never use zero as a tag. This makes it easier to track down misbehaving\r
+// VC code, since zero is commonly come-by when going off into uncharted\r
+// depths of memory.\r
+\r
+#define ERROR 0\r
+\r
+// Opcode values.\r
+\r
+#define opEXEC_STDLIB 1\r
+#define opEXEC_LOCALFUNC 2\r
+#define opEXEC_EXTERNFUNC 3\r
+#define opIF 4\r
+#define opELSE 5\r
+#define opGOTO 6\r
+#define opSWITCH 7\r
+#define opCASE 8\r
+#define opRETURN 9\r
+#define opASSIGN 10\r
+#define opSETRETVAL 11\r
+#define opSETLOCALSTACK 12\r
+\r
+// Operand types.\r
+\r
+#define op_IMMEDIATE 1\r
+#define op_HVAR0 2\r
+#define op_HVAR1 3\r
+#define op_UVAR 4\r
+#define op_UVARRAY 5\r
+#define op_LVAR 6\r
+#define op_BFUNC 7\r
+#define op_UFUNC 8\r
+#define op_GROUP 9\r
+#define op_STRING 10\r
+#define op_SARRAY 11\r
+#define op_SLOCAL 12\r
+\r
+// Variable types.\r
+\r
+#define v_IMMEDIATE 1 // is this necessary?\r
+#define v_CHAR 2\r
+#define v_PTR 3\r
+#define v_INT 4\r
+\r
+// IF relational operators.\r
+\r
+#define i_ZERO 1\r
+#define i_NONZERO 2\r
+#define i_EQUALTO 3\r
+#define i_NOTEQUAL 4\r
+#define i_GREATERTHAN 5\r
+#define i_LESSTHAN 6\r
+#define i_GREATERTHANOREQUAL 7\r
+#define i_LESSTHANOREQUAL 8\r
+#define i_GROUP 9\r
+#define i_UNGROUP 10\r
+#define i_AND 11\r
+#define i_OR 12\r
+\r
+// Assignment operators.\r
+\r
+#define a_SET 1\r
+#define a_INC 2\r
+#define a_DEC 3\r
+#define a_INCSET 4\r
+#define a_DECSET 5\r
+#define a_MULTSET 6\r
+#define a_DIVSET 7\r
+\r
+// Operand combination operators.\r
+\r
+#define op_ADD 1\r
+#define op_SUB 2\r
+#define op_MULT 3\r
+#define op_DIV 4\r
+#define op_MOD 5\r
+#define op_SHL 6\r
+#define op_SHR 7\r
+#define op_AND 8\r
+#define op_OR 9\r
+#define op_XOR 10\r
+#define op_END 11\r
+\r
+// String components\r
+\r
+#define s_IMMEDIATE 1\r
+#define s_GLOBAL 2\r
+#define s_ARRAY 3\r
+#define s_NUMSTR 4\r
+#define s_LEFT 5\r
+#define s_RIGHT 6\r
+#define s_MID 7\r
+#define s_LOCAL 8\r
+#define s_ADD 9\r
+#define s_CHR 10\r
+#define s_END 11\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define VDRIVER_H\r
+\r
+#include <malloc.h>\r
+#include <mem.h>\r
+#include <conio.h>\r
+#include <math.h>\r
+#include "verge.h"\r
+\r
+#define SWAP(a,b) { a-=b; b+=a; a=b-a; }\r
+\r
+// ================================= Data ====================================\r
+\r
+char *DriverDesc;\r
+\r
+byte *screen,*video,*vscreen;\r
+byte pal[768], pal2[768];\r
+byte *translucency_table;\r
+\r
+int sx, sy;\r
+int tx, ty;\r
+int tsx, tsy;\r
+int cx1=0,cy1=0,cx2=319,cy2=199;\r
+\r
+// Driver function-pointers.\r
+int (*ShutdownVideo) (int i);\r
+int (*ShowPage) (void);\r
+\r
+// ================================= Code ====================================\r
+\r
+void SetPalette(byte *pall)\r
+{ quad i;\r
+\r
+ outp(0x03c8, 0);\r
+ for (i=0; i<768; i++)\r
+ outp(0x03c9, pall[i]);\r
+}\r
+\r
+void GetPalette()\r
+{ quad i;\r
+\r
+ outp(0x03c7, 0);\r
+ for (i=0; i<768; i++)\r
+ pal[i]=inp(0x03c9);\r
+}\r
+\r
+void set_intensity(quad n)\r
+{ quad i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal2[i] = (pal[i] * n) >> 6;\r
+\r
+ SetPalette(pal2);\r
+}\r
+\r
+int LFB_ShowPage(void)\r
+{\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+ memcpy(video,screen,sx*sy);\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void CopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ memcpy(d,src,width);\r
+ src+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d, c;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++,src++)\r
+ {\r
+ c=*src;\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteLucent(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++,src++)\r
+ d[x]=translucency_table[d[x]|(*src<<8)];\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteLucent(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d, c;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++,src++)\r
+ {\r
+ c=*src;\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoom(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ d[j]=src[(xerr>>16)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoom(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ byte c;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=c;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ d[j]=translucency_table[d[j]|(src[(xerr>>16)]<<8)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ byte c;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=c;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void Silhouette(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *d=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (height<1 || width<1) return;\r
+ d=screen+(y*sx)+x;\r
+ do {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ if (src[x])\r
+ d[x]=color;\r
+ }\r
+ src+=width;\r
+ d+=sx;\r
+ } while (--height);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj=(sw<<16)/dw;\r
+ yadj=(sh<<16)/dh;\r
+ d=screen+(y*sx)+x;\r
+ yerr=0;\r
+ do {\r
+ xerr=0;\r
+ for (x=0; x<dw; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=color;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ } while (--dh);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteLucent(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *d=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (width<1 || height<1) return;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ do {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ if (src[x])\r
+ d[x]=range[d[x]];\r
+ }\r
+ src+=width;\r
+ d+=sx;\r
+ } while (--height);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj=(sw<<16)/dw;\r
+ yadj=(sh<<16)/dh;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr=0;\r
+ do {\r
+ xerr=0;\r
+ for (x=0; x<dw; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=range[d[x]];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ } while (--dh);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void Tint(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *d=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (width<1 || height<1) return;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ do {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ c=src[x];\r
+ if (c)\r
+ d[x]=range[c];\r
+ }\r
+ src+=width;\r
+ d+=sx;\r
+ } while (--height);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TintZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj=(sw<<16)/dw;\r
+ yadj=(sh<<16)/dh;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr=0;\r
+ do {\r
+ xerr=0;\r
+ for (x=0; x<dw; x++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[x]=range[c];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ } while (--dh);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteLucentClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ d[x]=translucency_table[d[x]|(s[x]<<8)];\r
+\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteLucentClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoomClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ d[j]=src[(xerr>>16)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoomClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ byte c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=c;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ d[j]=translucency_table[d[j]|(src[(xerr>>16)]<<8)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ int c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=translucency_table[d[j]|(c<<8)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteClip(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *s=0,*d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (s[x])\r
+ d[x]=color;\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xerr_start=0, yerr_start=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=color;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteLucentClip(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *s=0,*d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (s[x])\r
+ d[x]=range[d[x]];\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xerr_start=0, yerr_start=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr = yerr_start & 0xffff;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=range[d[x]];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TintClip(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *s=0,*d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=range[c];\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TintZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xerr_start=0, yerr_start=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr = yerr_start & 0xffff;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[x]=range[c];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopyTile(int x, int y, byte *src)\r
+{\r
+ CopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTile(int x, int y, byte *src, byte *matte)\r
+{\r
+ matte=matte;\r
+ TCopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void CopyTileLucent(int x, int y, byte *src)\r
+{\r
+ CopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTileLucent(int x, int y, byte *src)\r
+{\r
+ TCopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+void CopyTileClip(int x, int y, byte *src)\r
+{\r
+ CopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTileClip(int x, int y, byte *src, byte *matte)\r
+{\r
+ matte=matte;\r
+ TCopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void CopyTileLucentClip(int x, int y, byte *src)\r
+{\r
+ CopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTileLucentClip(int x, int y, byte *src)\r
+{\r
+ TCopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+// aen\r
+void MapLine(int x, int y, int yofs, word *map)\r
+{\r
+ byte *d;\r
+ int tilesx,startx;\r
+ int counter;\r
+ int span, s;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // y clipping\r
+ if (y<0 || y>=tsy) return;\r
+ // x clipping\r
+ startx=0;\r
+ if (x<0) { startx=-x; x=0; }\r
+\r
+ d=screen+(y*sx)+x;\r
+ tilesx=(tsx/16);\r
+\r
+ // do clipped left tile\r
+ counter=0;\r
+ s=tileidx[*map];\r
+ memcpy(d, vsp+((s<numtiles ? s : 0)*256)+(yofs*16)+startx, 16-startx);\r
+ d+=16-startx;\r
+ counter+=16-startx;\r
+ map++;\r
+ // do midsection of line\r
+ for (x=1; x<tilesx; x++,counter+=16)\r
+ {\r
+ s=tileidx[*map];\r
+ memcpy(d, vsp+((s<numtiles ? s : 0)*256)+(yofs*16), 16);\r
+\r
+ d+=16;\r
+ map++;\r
+ }\r
+ // do clipped right tile\r
+ while (counter<tsx)\r
+ {\r
+ span=(tsx-counter);\r
+ if (span>16) span=16;\r
+ s=tileidx[*map];\r
+ memcpy(d, vsp+((s<numtiles ? s : 0)*256)+(yofs*16), span);\r
+ d+=span;\r
+ counter+=span;\r
+ map++;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TMapLine(int x, int y, int yofs, word *map)\r
+{\r
+ byte *s,*d;\r
+ byte c;\r
+ int tilesx,startx;\r
+ int counter;\r
+ int span;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // y clipping\r
+ if (y<0 || y>=tsy) return;\r
+ // x clipping\r
+ startx=0;\r
+ if (x<0) { startx=-x; x=0; }\r
+\r
+ d=screen+(y*sx)+x;\r
+ tilesx=(tsx/16);\r
+\r
+ // do clipped left tile\r
+ counter=0;\r
+ s=vsp+(256*tileidx[*map])+(16*yofs)+startx;\r
+ for (x=0; x<16-startx; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=16-startx;\r
+ counter+=16-startx;\r
+ map++;\r
+ // do midsection of line\r
+ for (y=1; y<tilesx; y++,counter+=16)\r
+ {\r
+ s=vsp+(256*tileidx[*map])+(16*yofs);\r
+ for (x=0; x<16; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=16;\r
+ map++;\r
+ }\r
+ // do clipped right tile\r
+ while (counter<tsx)\r
+ {\r
+ span=(tsx-counter);\r
+ if (span>16) span=16;\r
+ s=vsp+(256*tileidx[*map])+(16*yofs);\r
+ for (x=0; x<span; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=span;\r
+ counter+=span;\r
+ map++;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+}\r
+\r
+void ClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(screen, 0, sx*sy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SetPixel(int x, int y, int color)\r
+{\r
+ screen[(y*sx)+x]=color;\r
+}\r
+\r
+void SetPixelLucent(int x, int y, int color)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ *d=translucency_table[*d|(color<<8)];\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SetPixelClip(int x, int y, int color)\r
+{\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2) return;\r
+ screen[(y*sx)+x]=color;\r
+}\r
+\r
+void SetPixelLucentClip(int x, int y, int color)\r
+{\r
+ byte *d;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2) return;\r
+ d=screen+(y*sx)+x;\r
+ *d=translucency_table[*d|(color<<8)];\r
+}\r
+\r
+int GetPixel(int x, int y)\r
+{\r
+ return screen[(y*sx)+x];\r
+}\r
+\r
+int GetPixelClip(int x, int y)\r
+{\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2) return 0;\r
+ return screen[(y*sx)+x];\r
+}\r
+\r
+void ColorField(int x, int y, char c)\r
+{\r
+ int i;\r
+\r
+ cpubyte=RENDER;\r
+ i=0;\r
+ do\r
+ {\r
+ SetPixelClip(x+0, y+i, 0);\r
+ SetPixelClip(x+2, y+i, 0);\r
+ SetPixelClip(x+4, y+i, 0);\r
+ SetPixelClip(x+6, y+i, 0);\r
+ SetPixelClip(x+8, y+i, 0);\r
+ SetPixelClip(x+10, y+i, 0);\r
+ SetPixelClip(x+12, y+i, 0);\r
+ SetPixelClip(x+14, y+i, 0);\r
+ i++;\r
+\r
+ SetPixelClip(x+0 +1, y+i, 0);\r
+ SetPixelClip(x+2 +1, y+i, 0);\r
+ SetPixelClip(x+4 +1, y+i, 0);\r
+ SetPixelClip(x+6 +1, y+i, 0);\r
+ SetPixelClip(x+8 +1, y+i, 0);\r
+ SetPixelClip(x+10 +1, y+i, 0);\r
+ SetPixelClip(x+12 +1, y+i, 0);\r
+ SetPixelClip(x+14 +1, y+i, 0);\r
+ i++;\r
+ } while (i<16);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLine(int x, int y, int x2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ memset(screen+(y*sx)+x,color,x2-x+1);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLineClip(int x, int y, int x2, int color)\r
+{\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return;\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+ memset(screen+(y*sx)+x,color,width);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLineLucent(int x, int y, int x2, int color)\r
+{\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (; x<=x2; x++,d++)\r
+ *d=translucency_table[c|*d];\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLineLucentClip(int x, int y, int x2, int color)\r
+{\r
+ byte *d;\r
+ int c,width;\r
+\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (x=0; x<width; x++,d++)\r
+ *d=translucency_table[c|*d];\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLine(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ d=screen+(y*sx)+x;\r
+ for (; y<=y2; y++)\r
+ {\r
+ *d=color;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLineClip(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLineLucent(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (; y<=y2; y++)\r
+ {\r
+ *d=translucency_table[c|*d];\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLineLucentClip(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int c,height;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=translucency_table[c|*d];\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// all the Line* routine were grabbed/modded from the Abuse source\r
+\r
+void Line(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// grabbed/modded from Abuse source\r
+void LineClip(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+ return;\r
+}\r
+\r
+void LineLucent(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ c=color<<8; // for translucency\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void LineLucentClip(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ c=color<<8; // for translucency\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// All the Circle* routines were grabbed/modded from Allegro source\r
+\r
+void Circle(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ SetPixel(x+cx,y+cy,color);\r
+ if (cx) SetPixel(x-cx,y+cy,color);\r
+ if (cy) SetPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixel(x+cy,y+cx,color);\r
+ if (cx) SetPixel(x+cy,y-cx,color);\r
+ if (cy) SetPixel(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do {\r
+ SetPixelClip(x+cx,y+cy,color);\r
+ if (cx) SetPixelClip(x-cx,y+cy,color);\r
+ if (cy) SetPixelClip(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixelClip(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixelClip(x+cy,y+cx,color);\r
+ if (cx) SetPixelClip(x+cy,y-cx,color);\r
+ if (cy) SetPixelClip(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixelClip(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleLucent(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do\r
+ {\r
+ SetPixelLucent(x+cx,y+cy,color);\r
+ if (cx) SetPixelLucent(x-cx,y+cy,color);\r
+ if (cy) SetPixelLucent(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixelLucent(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixelLucent(x+cy,y+cx,color);\r
+ if (cx) SetPixelLucent(x+cy,y-cx,color);\r
+ if (cy) SetPixelLucent(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixelLucent(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleLucentClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ SetPixelLucentClip(x+cx,y+cy,color);\r
+ if (cx) SetPixelLucentClip(x-cx,y+cy,color);\r
+ if (cy) SetPixelLucentClip(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixelLucentClip(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixelLucentClip(x+cy,y+cx,color);\r
+ if (cx) SetPixelLucentClip(x+cy,y-cx,color);\r
+ if (cy) SetPixelLucentClip(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixelLucentClip(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFill(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do\r
+ {\r
+ HLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFillClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ HLineClip(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLineClip(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLineClip(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLineClip(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFillLucent(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ HLineLucent(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLineLucent(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLineLucent(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLineLucent(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFillLucentClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ HLineLucentClip(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLineLucentClip(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLineLucentClip(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLineLucentClip(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void Rect(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLine(x,y,x2,color);\r
+ HLine(x,y2,x2,color);\r
+ VLine(x,y+1,y2-1,color);\r
+ VLine(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLineClip(x,y,x2,color);\r
+ HLineClip(x,y2,x2,color);\r
+ VLineClip(x,y+1,y2-1,color);\r
+ VLineClip(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectLucent(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLineLucent(x,y,x2,color);\r
+ HLineLucent(x,y2,x2,color);\r
+ VLineLucent(x,y+1,y2-1,color);\r
+ VLineLucent(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectLucentClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLineLucentClip(x,y,x2,color);\r
+ HLineLucentClip(x,y2,x2,color);\r
+ VLineLucentClip(x,y+1,y2-1,color);\r
+ VLineLucentClip(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLine(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void RectFillClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLineClip(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void RectFillLucent(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLineLucent(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void RectFillLucentClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLineLucentClip(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// ============================================================================\r
+// = aen's wrap blitters =\r
+// ============================================================================\r
+\r
+void WrapBlit(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ memcpy(dest, source, spanx);\r
+\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void WrapBlitMasked(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i,j,c;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ for (j=0; j<spanx; j++)\r
+ {\r
+ c=source[j];\r
+ if (c)\r
+ dest[j]=c;\r
+ }\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void WrapBlitLucent(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i,j;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ for (j=0; j<spanx; j++)\r
+ dest[j]=translucency_table[(source[j]<<8)|dest[j]];\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void WrapBlitLucentMasked(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i,j,c;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ for (j=0; j<spanx; j++)\r
+ {\r
+ c=source[j];\r
+ if (c)\r
+ dest[j]=translucency_table[(c<<8)|dest[j]];\r
+ }\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// ============================================================================\r
+// = alias.zip / zero / aen rotational scaler routines =\r
+// ============================================================================\r
+\r
+void RotScale(int posx, int posy, quad width, quad height, float angle, float scale, byte *src)\r
+{\r
+ // new! shamelessly ripped off from alias.zip\r
+ // except the atan2 stuff which i had to make up myself AEN so there :p\r
+\r
+ int xs,ys,xl,yl;\r
+ int sinas,cosas,xc,yc,srcx,srcy,x,y,tempx,tempy,T_WIDTH_CENTER,T_HEIGHT_CENTER,W_WIDTH_CENTER,W_HEIGHT_CENTER,W_HEIGHT,W_WIDTH;\r
+ byte *dest,pt;\r
+ float ft;\r
+\r
+ ft=atan2((float)width,(float)height);\r
+\r
+ T_WIDTH_CENTER=width>>1;\r
+ T_HEIGHT_CENTER=height>>1;\r
+ W_WIDTH=((float)width/scale*sin(ft) + (float)height/scale*cos(ft));\r
+ W_HEIGHT=W_WIDTH;\r
+ W_HEIGHT_CENTER=W_HEIGHT>>1;\r
+ W_WIDTH_CENTER=W_HEIGHT_CENTER; //W_WIDTH/2;\r
+\r
+ sinas=sin(-angle)*65536*scale;\r
+ cosas=cos(-angle)*65536*scale;\r
+\r
+ xc=T_WIDTH_CENTER*65536 - (W_HEIGHT_CENTER*(cosas+sinas));\r
+ yc=T_HEIGHT_CENTER*65536 - (W_WIDTH_CENTER*(cosas-sinas));\r
+ posx-=W_WIDTH_CENTER;\r
+ posy-=W_HEIGHT_CENTER;\r
+\r
+ // clipping\r
+ if (W_WIDTH<2 || W_HEIGHT<2) return;\r
+ xl=W_WIDTH;\r
+ yl=W_HEIGHT;\r
+ xs=ys=0;\r
+ if (posx>cx2 || posy>cy2 || posx+xl<cx1 || posy+yl<cy1)\r
+ return;\r
+ if (posx+xl > cx2) xl=cx2-posx+1;\r
+ if (posy+yl > cy2) yl=cy2-posy+1;\r
+ if (posx<cx1)\r
+ {\r
+ xs=cx1-posx;\r
+ xl-=xs;\r
+ posx=cx1;\r
+\r
+ xc+=cosas*xs; // woo!\r
+ yc-=sinas*xs;\r
+ }\r
+ if (posy<cy1)\r
+ {\r
+ ys=cy1-posy;\r
+ yl-=ys;\r
+ posy=cy1;\r
+\r
+ xc+=sinas*ys; // woo!\r
+ yc+=cosas*ys;\r
+ }\r
+\r
+ dest=screen+posx+posy*sx;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ srcx=xc;\r
+ srcy=yc;\r
+\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ tempx=(srcx>>16);\r
+ tempy=(srcy>>16);\r
+\r
+ if (tempx>=0 && tempx<width && tempy>=0 && tempy<height)\r
+ {\r
+ if ((pt=src[tempx+tempy*width]))\r
+ dest[x]=pt;\r
+ }\r
+\r
+ srcx+=cosas;\r
+ srcy-=sinas;\r
+ }\r
+\r
+ dest+=sx;\r
+\r
+ xc+=sinas;\r
+ yc+=cosas;\r
+ }\r
+}\r
+\r
+// ============================================================================\r
+// = zero's Mosiac effects =\r
+// ============================================================================\r
+\r
+//mosaic routines\r
+//TODO-need to asm optimize these badly! they are rather slow!\r
+\r
+byte FindPalMatchForMosaic(quad r, quad g, quad b)\r
+{\r
+ quad index;\r
+ quad diffrecord,diff,record;\r
+ diffrecord=100000;\r
+ record=100000;\r
+\r
+ for(index=0; index<256; index++)\r
+ {\r
+ diff=abs(r-pal[index*3])+abs(g-pal[index*3+1])+abs(b-pal[index*3+2])+1;\r
+ if(diff<diffrecord)\r
+ {\r
+ diffrecord=diff;\r
+ if(diff==1) return index;\r
+ record=index;\r
+ }\r
+ }\r
+ return record;\r
+}\r
+\r
+byte *InitMosaicTable(void)\r
+{\r
+ quad r,g,b;\r
+ byte *tmp;\r
+ tmp=(byte *)malloc(262144);\r
+\r
+ for(r=0; r<64; r++)\r
+ for(g=0; g<64; g++)\r
+ for(b=0; b<64; b++)\r
+ tmp[r*4096+g*64+b]=FindPalMatchForMosaic(r,g,b);\r
+ return tmp;\r
+}\r
+\r
+void Mosaic(quad xlevel, quad ylevel, byte *tbl, quad xmin, quad ymin, quad xmax, quad ymax)\r
+{\r
+ quad x,y,rtot,btot,gtot,xloop,yloop,xfier,txlevel;\r
+ byte *src;\r
+ byte pixel;\r
+\r
+ for(y=ymin; y<ymax; y+=ylevel)\r
+ {\r
+ for(x=xmin; x<xmax; x+=xlevel)\r
+ {\r
+ rtot=0; gtot=0; btot=0;\r
+ src=y*sx+x+screen;\r
+ if(ymax-y<ylevel) ylevel=ymax-y;\r
+ if(xmax-x<xlevel) txlevel=xmax-x; else txlevel=xlevel;\r
+ xfier=ylevel*txlevel;\r
+ for(yloop=0; yloop<ylevel; yloop++)\r
+ {\r
+ for(xloop=0; xloop<txlevel; xloop++)\r
+ {\r
+ rtot+=pal[*src*3];\r
+ gtot+=pal[*src*3+1];\r
+ btot+=pal[*src*3+2];\r
+ src++;\r
+ }\r
+ src+=sx-txlevel;\r
+ }\r
+ rtot/=xfier;\r
+ gtot/=xfier;\r
+ btot/=xfier;\r
+ pixel=tbl[rtot*4096+gtot*64+btot];\r
+ src=y*sx+x+screen;\r
+ for(yloop=0; yloop<ylevel; yloop++)\r
+ {\r
+ for(xloop=0; xloop<txlevel; xloop++)\r
+ {\r
+ *src=pixel;\r
+ src++;\r
+ }\r
+ src+=sx-txlevel;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+// ============================================================================\r
+// = Mord's trifillers =\r
+// ============================================================================\r
+\r
+void FlatPoly(int x1, int y1, int x2, int y2, int x3, int y3, char color)\r
+{\r
+ int xstep,xstep2;\r
+ int xval,xval2;\r
+ int yon;\r
+ int swaptemp;\r
+\r
+ if (y1 > y3)\r
+ {\r
+ swaptemp=x1; x1=x3; x3=swaptemp;\r
+ swaptemp=y1; y1=y3; y3=swaptemp;\r
+ }\r
+ if (y2 > y3)\r
+ {\r
+ swaptemp=x2; x2=x3; x3=swaptemp;\r
+ swaptemp=y2; y2=y3; y3=swaptemp;\r
+ }\r
+ if (y1 > y2)\r
+ {\r
+ swaptemp=x1; x1=x2; x2=swaptemp;\r
+ swaptemp=y1; y1=y2; y2=swaptemp;\r
+ }\r
+\r
+ xstep2=((x3-x1) << 16) / (y3-y1);\r
+ xval2=x1 << 16;\r
+\r
+ if (y1 != y2)\r
+ {\r
+ xstep = ((x2-x1) << 16) / (y2-y1);\r
+ xval = x1 << 16;\r
+ for (yon=y1;yon < y2; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ HLineClip(xval>>16,yon,xval2>>16,color);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ }\r
+ }\r
+ if (y2 != y3)\r
+ {\r
+ xstep = ((x3-x2) << 16) / (y3-y2);\r
+ xval = x2 << 16;\r
+ for (yon=y2;yon < y3; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ HLineClip(xval>>16,yon,xval2>>16,color);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ }\r
+ }\r
+}\r
+\r
+char *image;\r
+int texw,texh; // those damn bastards want EVERYTHING!\r
+\r
+void tmaphline(int x1, int x2, int y, int tx1, int tx2, int ty1, int ty2)\r
+{\r
+ int i;\r
+ int txstep,txval;\r
+ int tystep,tyval;\r
+\r
+ if (x1 != x2)\r
+ {\r
+ if (x2 < x1)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=tx1; tx1=tx2; tx2=i;\r
+ i=ty1; ty1=ty2; ty2=i;\r
+ }\r
+ if ((x1 > sx) || (x2 < 0)) return;\r
+ txstep=((tx2-tx1)<<16)/(x2-x1);\r
+ tystep=((ty2-ty1)<<16)/(x2-x1);\r
+ txval=tx1<<16;\r
+ tyval=ty1<<16;\r
+\r
+ for (i=x1;i<x2;i++)\r
+ {\r
+ screen[y*sx+i] = image[(tyval>>16)*texw+(txval>>16)];\r
+ txval+=txstep;\r
+ tyval+=tystep;\r
+ }\r
+ }\r
+}\r
+\r
+void TMapPoly(int x1, int y1, int x2, int y2, int x3, int y3,\r
+ int tx1, int ty1, int tx2, int ty2, int tx3, int ty3,\r
+ int tw, int th, char *img)\r
+{\r
+ int xstep,xstep2;\r
+ int xval,xval2;\r
+ int txstep,txstep2;\r
+ int tystep,tystep2;\r
+ int txval,txval2;\r
+ int tyval,tyval2;\r
+ int yon;\r
+ int swaptemp;\r
+\r
+ image=img; texw=tw; texh=th;\r
+ if (y1 > y3)\r
+ {\r
+ swaptemp=x1; x1=x3; x3=swaptemp;\r
+ swaptemp=y1; y1=y3; y3=swaptemp;\r
+ swaptemp=tx1; tx1=tx3; tx3=swaptemp;\r
+ swaptemp=ty1; ty1=ty3; ty3=swaptemp;\r
+ }\r
+ if (y2 > y3)\r
+ {\r
+ swaptemp=x2; x2=x3; x3=swaptemp;\r
+ swaptemp=y2; y2=y3; y3=swaptemp;\r
+ swaptemp=tx2; tx2=tx3; tx3=swaptemp;\r
+ swaptemp=ty2; ty2=ty3; ty3=swaptemp;\r
+ }\r
+ if (y1 > y2)\r
+ {\r
+ swaptemp=x1; x1=x2; x2=swaptemp;\r
+ swaptemp=y1; y1=y2; y2=swaptemp;\r
+ swaptemp=tx1; tx1=tx2; tx2=swaptemp;\r
+ swaptemp=ty1; ty1=ty2; ty2=swaptemp;\r
+ }\r
+ xstep2=((x3-x1) << 16) / (y3-y1);\r
+ xval2=x1 << 16;\r
+ txstep2=((tx3-tx1) << 16) / (y3-y1);\r
+ txval2=tx1 << 16;\r
+ tystep2=((ty3-ty1) << 16) / (y3-y1);\r
+ tyval2=ty1 << 16;\r
+\r
+ if (y1 != y2)\r
+ {\r
+ xstep = ((x2-x1) << 16) / (y2-y1);\r
+ xval = x1 << 16;\r
+ txstep = ((tx2-tx1) << 16) / (y2-y1);\r
+ txval = tx1 << 16;\r
+ tystep = ((ty2-ty1) << 16) / (y2-y1);\r
+ tyval = ty1 << 16;\r
+\r
+ for (yon=y1;yon < y2; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ tmaphline(xval>>16,xval2>>16,yon,txval>>16,txval2>>16,\r
+ tyval>>16,tyval2>>16);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ txval+=txstep;\r
+ txval2+=txstep2;\r
+ tyval+=tystep;\r
+ tyval2+=tystep2;\r
+ }\r
+ }\r
+ if (y2 != y3)\r
+ {\r
+ xstep = ((x3-x2) << 16) / (y3-y2);\r
+ xval = x2 << 16;\r
+ txstep = ((tx3-tx2) << 16) / (y3-y2);\r
+ txval = tx2 << 16;\r
+ tystep = ((ty3-ty2) << 16) / (y3-y2);\r
+ tyval = ty2 << 16;\r
+\r
+ for (yon=y2;yon < y3; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ tmaphline(xval>>16,xval2>>16,yon,txval>>16,txval2>>16,\r
+ tyval>>16,tyval2>>16);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ txval+=txstep;\r
+ txval2+=txstep2;\r
+ tyval+=tystep;\r
+ tyval2+=tystep2;\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+// ============================================================================\r
+// = aen's ripple-blitter =\r
+// ============================================================================\r
+\r
+int thresh;\r
+int dispx[64],dispy[64];\r
+\r
+void InitDisplaceStuff(float xmag, float ymag)\r
+{\r
+ int x, y, *d;\r
+\r
+ xmag=4.0,d=dispx;\r
+ for (y=0; y<32; y++)\r
+ *d++=sin(y * (360.0/32) * (3.14/180))*xmag;\r
+\r
+ ymag=3.9,d=dispy;\r
+ for (x=0; x<32; x++)\r
+ *d++=cos(x * (360.0/32) * (3.14/180))*ymag;\r
+\r
+ thresh=14;\r
+}\r
+\r
+void CopyTileDisplace(int x, int y, unsigned char *spr)\r
+{\r
+ int i, j;\r
+ int xx, yy, xt, yt;\r
+ int xin, yin;\r
+ byte *dest;\r
+\r
+ xin = ((x+xwin)&31)<16 ? 0 : 16;\r
+ yin = ((y+ywin)&31)<16 ? 0 : 16;\r
+ dest=screen+(y*sx)+x;\r
+\r
+ // in the yy and xx calcs, +y and +x keep the start position correct\r
+ // within the 32 element lookup tables (ie. so they flow continuously\r
+ // across the 16x16 images).\r
+\r
+ for (j=0; j<16; j++)\r
+ {\r
+ yy = (j+yin+thresh) & 31;\r
+ for (i=0; i<16; i++)\r
+ {\r
+ xx = (i+xin+thresh) & 31;\r
+ xt = (i+dispx[yy]) & 15;\r
+ yt = (j+dispy[xx]) & 15;\r
+\r
+ dest[i]=spr[(yt*16)+xt];\r
+ }\r
+ dest+=sx;\r
+ }\r
+}\r
+\r
+void CopyTileDisplaceClip(int x, int y, unsigned char *spr)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int i, j;\r
+ int xx, yy, xt, yt;\r
+ int xin, yin;\r
+\r
+ cpubyte=RENDER;\r
+ xl=16;\r
+ yl=16;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=spr;\r
+ //if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ //if (xs) s+=xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ xin = ((x+xwin)&31)<16 ? 0 : 16; xin += xs;\r
+ yin = ((y+ywin)&31)<16 ? 0 : 16; yin += ys;\r
+\r
+ //dest=screen+(y*sx)+x;\r
+\r
+ // in the yy and xx calcs, +y and +x keep the start position correct\r
+ // within the 32 element lookup tables (ie. so they flow continuously\r
+ // across the 16x16 images).\r
+\r
+ for (j=0; j<yl; j++)\r
+ {\r
+ yy = (j+yin+thresh) & 31;\r
+ for (i=0; i<xl; i++)\r
+ {\r
+ xx = (i+xin+thresh) & 31;\r
+ xt = (i+xs+dispx[yy]) & 15;\r
+ yt = (j+ys+dispy[xx]) & 15;\r
+\r
+ d[i]=s[(yt*16)+xt];\r
+ }\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+} */\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VDRIVER_H\r
+#define VDRIVER_H\r
+\r
+extern byte *screen,*video,*vscreen;\r
+extern byte pal[768], pal2[768];\r
+extern byte *translucency_table;\r
+\r
+extern int sx, sy;\r
+extern int tx, ty;\r
+extern int tsx, tsy;\r
+extern int cx1,cy1,cx2,cy2;\r
+\r
+extern char *DriverDesc;\r
+\r
+extern int InitVideo(int xres, int yres);\r
+extern void VidInfo(void);\r
+extern void SetPalette(byte *pall);\r
+extern void GetPalette(void);\r
+extern void set_intensity(unsigned int n);\r
+\r
+// driver interface\r
+\r
+extern int (*ShutdownVideo)(int i);\r
+extern int (*ShowPage)(void);\r
+\r
+// LFB routines for all driver functions\r
+\r
+extern int LFB_ShowPage(void);\r
+extern void ColorField(int x, int y, byte c);\r
+extern void ClearScreen(void);\r
+extern void MapLine(int x, int y, int yofs, word *map);\r
+extern void TMapLine(int x, int y, int yofs, word *map);\r
+\r
+extern void CopySprite(int x, int y, int width, int height, byte *src);\r
+extern void TCopySprite(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoom(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoom(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void CopySpriteLucent(int x, int y, int width, int height, byte *src);\r
+extern void TCopySpriteLucent(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoomLucent(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoomLucent(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void Silhouette(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void SilhouetteLucent(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void Tint(int x, int y, int width, int height, int color, byte *src);\r
+extern void TintZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+\r
+extern void CopySpriteClip(int x, int y, int width, int height, byte *src);\r
+extern void TCopySpriteClip(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoomClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoomClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void CopySpriteLucentClip(int x, int y, int width, int height, byte *src);\r
+extern void TCopySpriteLucentClip(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoomLucentClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoomLucentClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void SilhouetteClip(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void SilhouetteLucentClip(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void TintClip(int x, int y, int width, int height, int color, byte *src);\r
+extern void TintZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+\r
+extern void CopyTile(int x, int y, byte *src);\r
+extern void TCopyTile(int x, int y, byte *spr, byte *matte);\r
+extern void CopyTileLucent(int x, int y, byte *src);\r
+extern void TCopyTileLucent(int x, int y, byte *spr);\r
+\r
+extern void CopyTileClip(int x, int y, byte *src);\r
+extern void TCopyTileClip(int x, int y, byte *spr, byte *matte);\r
+extern void CopyTileLucentClip(int x, int y, byte *src);\r
+extern void TCopyTileLucentClip(int x, int y, byte *spr);\r
+\r
+extern int GetPixel(int x, int y);\r
+extern void SetPixel(int x, int y, int color);\r
+extern void SetPixelLucent(int x, int y, int color);\r
+extern void HLine(int x, int y, int x2, int color);\r
+extern void HLineLucent(int x, int y, int x2, int color);\r
+extern void RectFill(int x, int y, int x2, int y2, int color);\r
+extern void RectFillLucent(int x, int y, int x2, int y2, int color);\r
+extern void VLine(int x, int y, int y2, int color);\r
+extern void VLineLucent(int x, int y, int y2, int color);\r
+extern void Rect(int x, int y, int x2, int y2, int color);\r
+extern void RectLucent(int x, int y, int x2, int y2, int color);\r
+extern void Line(int x, int y, int x2, int y2, int color);\r
+extern void LineLucent(int x, int y, int x2, int y2, int color);\r
+extern void CircleFill(int x, int y, int radius, int color);\r
+extern void CircleFillLucent(int x, int y, int radius, int color);\r
+extern void Circle(int x, int y, int radius, int color);\r
+extern void CircleLucent(int x, int y, int radius, int color);\r
+\r
+extern int GetPixelClip(int x, int y);\r
+extern void SetPixelClip(int x, int y, int color);\r
+extern void SetPixelLucentClip(int x, int y, int color);\r
+extern void HLineClip(int x, int y, int x2, int color);\r
+extern void HLineLucentClip(int x, int y, int x2, int color);\r
+extern void RectFillClip(int x, int y, int x2, int y2, int color);\r
+extern void RectFillLucentClip(int x, int y, int x2, int y2, int color);\r
+extern void VLineClip(int x, int y, int y2, int color);\r
+extern void VLineLucentClip(int x, int y, int y2, int color);\r
+extern void RectClip(int x, int y, int x2, int y2, int color);\r
+extern void RectLucentClip(int x, int y, int x2, int y2, int color);\r
+extern void LineClip(int x, int y, int x2, int y2, int color);\r
+extern void LineLucentClip(int x, int y, int x2, int y2, int color);\r
+extern void CircleFillClip(int x, int y, int radius, int color);\r
+extern void CircleFillLucentClip(int x, int y, int radius, int color);\r
+extern void CircleClip(int x, int y, int radius, int color);\r
+extern void CircleLucentClip(int x, int y, int radius, int color);\r
+\r
+extern void WrapBlit(quad x, quad y, int wide, int high, byte *src);\r
+extern void WrapBlitMasked(quad x, quad y, int wide, int high, byte *src);\r
+extern void WrapBlitLucent(quad x, quad y, int wide, int high, byte *src);\r
+extern void WrapBlitLucentMasked(quad x, quad y, int wide, int high, byte *src);\r
+\r
+void RotScale(int posx, int posy, quad width, quad height, float angle, float scale, byte *src);\r
+byte *InitMosaicTable(void);\r
+void Mosaic(quad xlevel, quad ylevel, byte *tbl, quad xmin, quad ymin, quad xmax, quad ymax);\r
+\r
+void TMapPoly(int x1, int y1, int x2, int y2, int x3, int y3,\r
+ int tx1, int ty1, int tx2, int ty2, int tx3, int ty3,\r
+ int tw, int th, char *img);\r
+void FlatPoly(int x1, int y1, int x2, int y2, int x3, int y3, char color);\r
+\r
+#endif // VDRIVER_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdarg.h> // va_*\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// declared in VDRIVER.C\r
+extern byte* translucency_table;\r
+\r
+char *strbuf=0; // Universal temporary string buffer. :)\r
+char joyflag=0;\r
+int vidxres=0,vidyres=0; // Joystick on/off | Video mode to use\r
+char logoutput=0; // Verbose debugging startup mode\r
+char nocdaudio=0; // do not use CD audio\r
+char startmap[80]; // startup map\r
+FILE *logf=0; // logfile file handle\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitializeDefaults()\r
+{\r
+ kb1=28; kb2=56; kb3=1; kb4=57; // default keyboard controls\r
+ jb1=1; jb2=2; jb3=3; jb4=4; // default joystick controls\r
+ joyflag=0; // joystick defaults to disabled\r
+ vidxres=320; vidyres=200;\r
+ logoutput=0; // Don't be annoyingly verbose\r
+ strbuf=(char *) valloc(2000, "strbuf", OID_TEMP);\r
+ memcpy(startmap,"test.map\0",9);\r
+\r
+ md_mixfreq=44100;\r
+ md_dmabufsize=2000;\r
+ md_mode=DMODE_16BITS|DMODE_STEREO;\r
+ md_device=0;\r
+}\r
+\r
+static VFILE *user_cfg_file=0;\r
+static char parse_str[256];\r
+\r
+static char *parse_cfg_token()\r
+{\r
+ vscanf(user_cfg_file, "%s", parse_str);\r
+ return parse_str;\r
+}\r
+\r
+// compares string against parse_str (grabbed by parse_cfg_token)\r
+// 0=mismatch, 1=match\r
+static int parse_match(char *str)\r
+{\r
+ return !strcmp(parse_str, str);\r
+}\r
+\r
+void ParseStartupFiles()\r
+{\r
+ user_cfg_file = vopen("user.cfg");\r
+ if (!user_cfg_file)\r
+ {\r
+ printf("Could not open user.cfg. \n");\r
+ exit(-1);\r
+ }\r
+\r
+ while (1)\r
+ {\r
+ parse_cfg_token();\r
+\r
+ // mounts a pack file; up to 3? (perhaps gaurd against more?)\r
+ if (parse_match("mount"))\r
+ { MountVFile(parse_cfg_token()); continue; }\r
+ // set video resolution\r
+ else if (parse_match("vidmode"))\r
+ {\r
+ vidxres = atoi(parse_cfg_token());\r
+ vidyres = atoi(parse_cfg_token());\r
+\r
+ // check validity\r
+ if (vidxres != 256 && vidxres != 320\r
+ && vidxres != 360 && vidxres != 640)\r
+ {\r
+ Log("user.cfg: invalid resolution width %i passed to vidmode",\r
+ vidxres);\r
+ }\r
+ if (vidyres != 200 && vidyres != 240\r
+ && vidyres != 256 && vidyres != 480)\r
+ {\r
+ Log("user.cfg: invalid resolution height %i passed to vidmode",\r
+ vidyres);\r
+ }\r
+\r
+ continue;\r
+ }\r
+ // log to VERGE.LOG\r
+ else if (parse_match("log"))\r
+ {\r
+ logoutput=1;\r
+ continue;\r
+ }\r
+ // disable CD playing\r
+ else if (parse_match("nocdaudio"))\r
+ {\r
+ nocdaudio=1;\r
+ continue;\r
+ }\r
+ // map VERGE.EXE will run first when executed\r
+ else if (parse_match("startmap"))\r
+ {\r
+ strcpy(startmap, parse_cfg_token());\r
+ continue;\r
+ }\r
+ // 0=auto detect, 1=???, 2=???, 3=nosound\r
+ else if (parse_match("sound_device"))\r
+ {\r
+ md_device = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("mixrate"))\r
+ {\r
+ md_mixfreq = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("dmabufsize"))\r
+ {\r
+ md_dmabufsize = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("force8bit"))\r
+ {\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("forcemono"))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ // unknown command, assume end\r
+ break;\r
+ }\r
+\r
+ // done parsing config\r
+ vclose(user_cfg_file);\r
+}\r
+\r
+void ParseAutoCFG()\r
+{ VFILE *f;\r
+ int i;\r
+\r
+ if (!(f=vopen("auto.cfg"))) return;\r
+\r
+ while (1)\r
+ {\r
+ vgets((char *) cmd, 40, f);\r
+ for (i=0; i<(signed) strlen((char *) cmd); i++)\r
+ if (cmd[i]==10 || cmd[i]==13) cmd[i]=0;\r
+ if (strlen((char*) cmd)<2) break;\r
+ ProcessCommand();\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+void InitLog()\r
+{\r
+ if (logoutput)\r
+ {\r
+ remove("verge.log");\r
+ }\r
+}\r
+\r
+void Log(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ if (!logoutput) return;\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "%s \n", tempbuf);\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+// used in conjunction with LogDone()\r
+void Logp(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ if (!logoutput) return;\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "%s", tempbuf);\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+void LogDone()\r
+{\r
+ if (!logoutput) return;\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "... OK \n");\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+void InitSystems()\r
+{\r
+ InitLog();\r
+ Log("V2 startup. Logfile initialized.");\r
+ Logp("Sys: Initializing keyboard handler.");\r
+ InitKeyboard();\r
+ LogDone();\r
+#ifdef __DJGPP__\r
+ keyboard_chain(0);\r
+#endif\r
+ Logp("Sys: Initializing timer. Set 100hz.");\r
+ InitTimer();\r
+ LogDone();\r
+\r
+ /*\r
+ Logp("Sys: Initializing CD Audio.");\r
+ CD_Init();\r
+ LogDone();\r
+ */\r
+\r
+ Logp("Sys: Initializing music system.");\r
+ InitMusicSystem();\r
+ LogDone();\r
+\r
+ InitVideo(vidxres, vidyres);\r
+}\r
+\r
+void LoadTransTable()\r
+{\r
+ FILE *fp=0;\r
+\r
+ if (translucency_table)\r
+ { free(translucency_table); translucency_table=0; }\r
+ translucency_table=(byte *)valloc(65536, "translucency_table", OID_MISC);\r
+\r
+ fp = fopen("trans.tbl", "rb");\r
+ if (!fp) err("Could not open trans.tbl.");\r
+\r
+ fread(translucency_table, 65536, 1, fp);\r
+\r
+ fclose(fp);\r
+}\r
+\r
+void vmain(int argc, char *argv[])\r
+{\r
+ char temp[256];\r
+\r
+ InitializeDefaults();\r
+ ParseStartupFiles();\r
+ InitSystems();\r
+ if (argc==2)\r
+ {\r
+ memcpy(startmap, argv[1], strlen(argv[1]));\r
+ }\r
+\r
+ InitConsole();\r
+ sprintf(temp,"VERGE System Version %s", VERSION);\r
+ Con_Printf(temp);\r
+ Con_Printf("Copyright (C)1998 vecna");\r
+\r
+ ParseAutoCFG();\r
+ LoadTransTable();\r
+ LoadSystemVC();\r
+ LoadMAP(startmap);\r
+\r
+ while (1)\r
+ {\r
+ while (timer_count!=0)\r
+ {\r
+ timer_count--;\r
+ GameTick();\r
+ }\r
+ Render();\r
+\r
+ ShowPage();\r
+ if (kill)\r
+ {\r
+ FreeVSP();\r
+ FreeMAP();\r
+ FreeCHRList();\r
+ vcsp=vcstack;\r
+ kill=0;\r
+ LoadMAP(startmap);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Wee. A generic #include. I feel so warm and fuzzy inside. :)\r
+\r
+#define VERSION "2.01b"\r
+\r
+#include <dos.h>\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#define byte unsigned char\r
+#define word unsigned short int\r
+#define quad unsigned int\r
+\r
+#define TRUE 1\r
+#define FALSE 0\r
+\r
+#include "inter.h"\r
+#include "a_memory.h"\r
+#include "vfile.h"\r
+#include "conlib.h"\r
+#include "console.h"\r
+#include "controls.h"\r
+#include "engine.h"\r
+#include "entity.h"\r
+#include "fli.h"\r
+#include "font.h"\r
+#include "image.h"\r
+#include "keyboard.h"\r
+#include "main.h"\r
+#include "message.h"\r
+#include "mikmod.h"\r
+#include "render.h"\r
+#include "sound.h"\r
+#include "timer.h"\r
+#include "vc.h"\r
+#include "vdriver.h"\r
+\r
+extern char *strbuf;
\ No newline at end of file
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <pc.h>\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+byte *vesascreen, *vesascreenx; // virscr | realscr\r
+\r
+// ================================= Code ====================================\r
+\r
+void VESASetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int VESAShutdown(void)\r
+{\r
+ VESASetMode(0x3);\r
+ free(vesascreen);\r
+ return 0;\r
+}\r
+\r
+void VESASetBank(int bank)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, 0x4f05);\r
+ SET_BX(r, 0);\r
+ SET_DX(r, bank);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int VESAShowPage(void)\r
+{ byte *s,*d;\r
+ int y,bytes,bank;\r
+ int span;\r
+\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ s=vesascreen+(16*tsx)+16;\r
+ d=vesascreenx;\r
+\r
+ bank=0;\r
+ bytes=65536;\r
+ VESASetBank(bank++);\r
+\r
+ for (y=sy; y; y--)\r
+ {\r
+ if (bytes >= sx)\r
+ { memcpy(d,s,sx);\r
+ bytes-=sx;\r
+ s+=sx;\r
+ d+=sx;\r
+ }\r
+ else\r
+ { memcpy(d,s,bytes);\r
+ s+=bytes;\r
+ span=sx-bytes;\r
+\r
+ VESASetBank(bank++);\r
+ d=vesascreenx;\r
+ bytes=65536;\r
+\r
+ memcpy(d,s,span);\r
+ bytes-=span;\r
+ s+=span;\r
+ d+=span;\r
+ }\r
+ s+=32;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%edx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"csl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $672, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _vesascreen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%ecx \n\t"\r
+ "shrl $2, %%ecx \n\t"\r
+ "repz \n\t"\r
+ "movsl \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz csl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=vesascreen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=vesascreen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACopyTile(int x, int y, byte *spr)\r
+{\r
+ int h;\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ h=16;\r
+\r
+ d=vesascreen+(y*tsx)+x;\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d, spr, 16);\r
+ spr+=16;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%ecx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"tcsl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $672, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _vesascreen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%edx \n\t"\r
+"drawloop: \n\t"\r
+ "lodsb \n\t"\r
+ "orb %%al, %%al \n\t"\r
+ "jz nodraw \n\t"\r
+ "stosb \n\t"\r
+ "decl %%edx \n\t"\r
+ "jz endline \n\t"\r
+ "jmp drawloop \n\t"\r
+"nodraw: \n\t"\r
+ "incl %%edi \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz drawloop \n\t"\r
+"endline: \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tcsl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATCopyTile(int x, int y, byte *spr, byte *matte)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul $672, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _vesascreen, %%edi \n\t"\r
+ "movl %3, %%edx \n\t"\r
+"tctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl $672, %%edi \n\t"\r
+ "addl $16, %%edx \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr), "m" (matte)\r
+ : "eax","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAScaleSprite(int x, int y, int w, int h, int tw, int th, byte *s)\r
+{\r
+ int i,j,xm,ym,xd,yd,sx,sy=0,xs,ys,dys=0;\r
+ unsigned char *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (!tw || !th) return 0;\r
+ tw += sgn(tw); th += sgn(th);\r
+ xm = abs(tw); ym = abs(th);\r
+ xs = (w<<16)/xm; ys = (h<<16)/ym;\r
+ xd = sgn(tw); yd = sgn(th);\r
+\r
+ if (tw>0 && th>0) dys=tsx-xm;\r
+ else if (tw>0 && th<0) dys=(0-tsx)-xm;\r
+ else if (tw<0 && th>0) dys=tsx+xm;\r
+ else if (tw<0 && th<0) dys=(0-tsx)+xm;\r
+\r
+ d = vesascreen+(y*tsx)+x;\r
+ for (i=0;i<ym;++i) {\r
+ sx=0;\r
+ for (j=0;j<xm;++j) {\r
+ *d=s[(sx>>16)];\r
+ d+=xd;\r
+ sx+=xs;\r
+ }\r
+ d+=dys;\r
+ sy+=ys;\r
+ s+=(sy>>16)*w;\r
+ sy&=0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESARenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ // ...\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ // ...\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAColorField(int x, int y, byte c)\r
+{\r
+ cpubyte=RENDER;\r
+ // ...\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(vesascreen+(672*16)+16,0,(672*480));\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAPutPixel(int x, int y, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ vesascreen[(y*tsx)+x]=color;\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAGetPixel(int x, int y)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ cpubyte=ETC;\r
+ return vesascreen[(y*tsx)+x];\r
+ return 0;\r
+}\r
+\r
+int VESAHLine(int x, int y, int x2, int color)\r
+{\r
+ byte *d;\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (x2<x) { int t=x2; x=x2; x2=t; }\r
+\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ x2+=16;\r
+\r
+ d=vesascreen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAVLine(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (y2<y) { int t=y2; x=y2; y2=t; }\r
+\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ y2+=16;\r
+\r
+ d=vesascreen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESALine(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ x1+=16;y1+=16; // aen; adjust these here??\r
+ x2+=16;y2+=16;\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ vesascreen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ vesascreen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACircle(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ VESAPutPixel(x+cx,y+cy,color);\r
+ if (cx) VESAPutPixel(x-cx,y+cy,color);\r
+ if (cy) VESAPutPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) VESAPutPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ VESAPutPixel(x+cy,y+cx,color);\r
+ if (cx) VESAPutPixel(x+cy,y-cx,color);\r
+ if (cy) VESAPutPixel(x-cy,y+cx,color);\r
+ if (cx && cy) VESAPutPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACircleFill(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ VESAHLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) VESAHLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ VESAHLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) VESAHLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESARect(int x, int y, int x2, int y2, int color)\r
+{\r
+ VESAHLine(x,y,x2,color);\r
+ VESAHLine(x,y2,x2,color);\r
+ VESAVLine(x,y+1,y2-1,color);\r
+ VESAVLine(x2,y+1,y2-1,color);\r
+ return 0;\r
+}\r
+\r
+int VESARectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (y2<y) { int t=y2; y=y2; y2=t; }\r
+\r
+ for (; y<=y2; y++)\r
+ VESAHLine(x,y,x2,color);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void InitVESA(void)\r
+{\r
+ REGISTERS r;\r
+\r
+ SET_BX(r, 0x0101);\r
+ SET_AX(r, 0x4f02);\r
+ INTERRUPT(0x10, r);\r
+\r
+ vesascreenx = (byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vesascreen = (byte *) valloc(344064, "vesascreen", 0);\r
+ memset(vesascreen, 0, 344064);\r
+\r
+ sx=640; sy=480;\r
+ tsx=672; tsy=512;\r
+ tx=40; ty=30;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo = VESAShutdown;\r
+ ShowPage = VESAShowPage;\r
+ CopySprite = VESACopySprite;\r
+ TCopySprite = VESATCopySprite;\r
+ CCopySprite = VESACCopySprite;\r
+ TCCopySprite = VESATCCopySprite;\r
+ CopyTile = VESACopyTile;\r
+ TCopyTile = VESATCopyTile;\r
+ ScaleSprite = VESAScaleSprite;\r
+ RenderMAPLine = VESARenderMAPLine;\r
+ TRenderMAPLine = VESATRenderMAPLine;\r
+ ColorField = VESAColorField;\r
+ ClearScreen = VESAClearScreen;\r
+ PutPixel = VESAPutPixel;\r
+ GetPixel = VESAGetPixel;\r
+ HLine = VESAHLine;\r
+ VLine = VESAVLine;\r
+ Line = VESALine;\r
+ Circle = VESACircle;\r
+ CircleFill = VESACircleFill;\r
+ Rect = VESARect;\r
+ RectFill = VESARectFill;\r
+ DriverDesc = "640x480 (VESA, Banked)";\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define VFILE_H\r
+#define VC_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ FILE *fp; // real file pointer.\r
+ byte s; // 0=real file 1=vfile;\r
+ byte v; // if vfile, which vfile index\r
+ byte i; // which file index in vfile is it?\r
+ byte p; // data alignment pad. :)\r
+} VFILE;\r
+\r
+struct filestruct\r
+{\r
+ char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int curofs; // current file offset.\r
+ char extractable; // irrelevant to runtime, but...\r
+ char override; // should we override?\r
+};\r
+\r
+struct mountstruct\r
+{\r
+ char mountname[80]; // name of VRG packfile.\r
+ FILE *vhandle; // Real file-handle of packfile.\r
+ struct filestruct *files; // File record array.\r
+ int numfiles; // number of files in pack.\r
+ int curofs; // Current filepointer.\r
+};\r
+\r
+struct mountstruct pack[3]; // packfile structs\r
+byte filesmounted=0; // Number of VRG files to check.\r
+char headertag[]={ 'V','R','G','P','A','C','K',0 };\r
+\r
+// ================================= Code ====================================\r
+\r
+int Exist(char *fname)\r
+{ FILE *tempf;\r
+\r
+ tempf=fopen(fname,"rb");\r
+ if (tempf)\r
+ {\r
+ fclose(tempf);\r
+ return 1;\r
+ }\r
+ else return 0;\r
+}\r
+\r
+void DecryptHeader()\r
+{ byte lastvalue, precodebyte, *ptr;\r
+\r
+ ptr=(byte *) pack[filesmounted].files;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) pack[filesmounted].files + (int) pack[filesmounted].numfiles*100)\r
+ {\r
+ precodebyte=*ptr;\r
+ (*ptr)-=lastvalue;\r
+ lastvalue=precodebyte;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void MountVFile(char *fname)\r
+{ char buffer[10];\r
+\r
+ if (!(pack[filesmounted].vhandle = fopen(fname,"rb")))\r
+ {\r
+ printf("*error* Unable to mount %s; file not found. \n",fname);\r
+ exit(-1);\r
+ }\r
+\r
+ // Read pack header\r
+ memset(&buffer, 0, 10);\r
+ fread(&buffer, 1, 7, pack[filesmounted].vhandle);\r
+ if (strcmp(buffer,headertag))\r
+ {\r
+ printf("*error* %s is not a valid packfile. \n",fname);\r
+ exit(-1);\r
+ }\r
+\r
+ fread(&buffer, 1, 1, pack[filesmounted].vhandle);\r
+ if (buffer[0]!=1)\r
+ {\r
+ printf("*error* %s is an incompatible packfile version. (ver reported: %d) \n",fname,buffer[0]);\r
+ exit (-1);\r
+ }\r
+\r
+ fread(&pack[filesmounted].numfiles, 1, 4, pack[filesmounted].vhandle);\r
+ memcpy(pack[filesmounted].mountname,fname,strlen(fname)+1);\r
+\r
+ // Allocate memory for headers and read them in.\r
+\r
+ pack[filesmounted].files = (struct filestruct *) valloc(pack[filesmounted].numfiles*100, "pack[filesmounted].files", OID_VFILE);\r
+ fread(pack[filesmounted].files, pack[filesmounted].numfiles, 100, pack[filesmounted].vhandle);\r
+ DecryptHeader();\r
+ filesmounted++;\r
+}\r
+\r
+VFILE *vopen(char *fname)\r
+{ VFILE *tmp;\r
+ char rf=0,vf=0;\r
+ int i, j=0;\r
+\r
+ // All files using V* are read-only. To write a file, use regular i/o.\r
+ // First we'll see if a real file exists, then we'll check for one in VFiles,\r
+ // if we don't find one in VFile or it's overridable then a real file will\r
+ // be used. That's the general logic progression.\r
+\r
+ if (Exist(fname)) rf=1;\r
+\r
+ // Search the VFiles.\r
+ for (i=filesmounted-1; i>=0; i--)\r
+ {\r
+ for (j=0; j<pack[i].numfiles; j++)\r
+ if (!strcasecmp(fname,pack[i].files[j].fname)) { vf=1; break; }\r
+ if (vf) break;\r
+ }\r
+\r
+ if (!vf && !rf) return 0;\r
+\r
+ tmp=(VFILE *) valloc(sizeof(VFILE), "vopen:tmp", OID_VFILE);\r
+\r
+ if (vf && rf)\r
+ {\r
+ if (pack[i].files[j].override) vf=0;\r
+ else rf=0;\r
+ }\r
+\r
+ if (vf)\r
+ {\r
+ tmp->fp=pack[i].vhandle;\r
+ tmp->s=1;\r
+ tmp->v=i;\r
+ tmp->i=j;\r
+ pack[i].files[j].curofs=0;\r
+ fseek(tmp->fp, pack[i].files[j].packofs, 0);\r
+ pack[i].curofs=pack[i].files[j].packofs;\r
+ return tmp;\r
+ }\r
+\r
+ tmp->fp=fopen(fname,"rb");\r
+ tmp->s=0; tmp->v=0; tmp->i=0;\r
+ return tmp;\r
+}\r
+\r
+void vread(char *dest, int len, VFILE *f)\r
+{\r
+ // This is fairly simple.. Just make sure our filepointer is at the right\r
+ // place, then do a straight fread.\r
+\r
+ if (f->s)\r
+ {\r
+ if (pack[f->v].curofs != (pack[f->v].files[f->i].packofs + pack[f->v].files[f->i].curofs))\r
+ fseek(f->fp, pack[f->v].files[f->i].curofs+pack[f->v].files[f->i].packofs, 0);\r
+ pack[f->v].files[f->i].curofs+=len;\r
+ pack[f->v].curofs+=len;\r
+ }\r
+ fread(dest, 1, len, f->fp);\r
+}\r
+\r
+void vclose(VFILE *f)\r
+{\r
+ if (!f) return;\r
+ if (!f->s) fclose(f->fp);\r
+ f->fp=0;\r
+ vfree(f);\r
+}\r
+\r
+int filesize(VFILE *f)\r
+{\r
+ int oldpos, tmp;\r
+\r
+ // Filesize for Vfiles is real simple.\r
+ if (f->s) return pack[f->v].files[f->i].size;\r
+\r
+ // It's a bit more complex for external files.\r
+ oldpos=ftell(f->fp);\r
+ fseek(f->fp, 0, 2);\r
+ tmp=ftell(f->fp);\r
+ fseek(f->fp, oldpos, 0);\r
+ return tmp;\r
+}\r
+\r
+int vtell(VFILE *f)\r
+{\r
+ if (!f->s)\r
+ {\r
+ return ftell(f->fp);\r
+ }\r
+\r
+ return pack[f->v].files[f->i].curofs;\r
+}\r
+\r
+void vseek(VFILE *f, int offset, int origin)\r
+{\r
+ if (!f->s)\r
+ {\r
+ fseek(f->fp, offset, origin);\r
+ return;\r
+ }\r
+\r
+ switch(origin)\r
+ {\r
+ case 0: pack[f->v].files[f->i].curofs=offset;\r
+ fseek(f->fp, offset+pack[f->v].files[f->i].packofs, 0);\r
+ return;\r
+ case 1: pack[f->v].files[f->i].curofs+=offset;\r
+ fseek(f->fp, offset, 1);\r
+ return;\r
+ case 2: pack[f->v].files[f->i].curofs=pack[f->v].files[f->i].size-offset;\r
+ fseek(f->fp, pack[f->v].files[f->i].curofs+pack[f->v].files[f->i].packofs, 0);\r
+ return;\r
+ }\r
+}\r
+\r
+void _vscanf(VFILE *f, char *format, char *dest)\r
+{\r
+ fscanf(f->fp, format, dest);\r
+ if (f->s)\r
+ pack[f->v].files[f->i].curofs=ftell(f->fp)-pack[f->v].files[f->i].packofs;\r
+}\r
+\r
+char vgetc(VFILE *f)\r
+{ char c=0;\r
+\r
+ vread(&c, 1, f);\r
+ return c;\r
+}\r
+\r
+word vgetw(VFILE *f)\r
+{ word c=0;\r
+\r
+ vread((char *) &c, 2, f);\r
+ return c;\r
+}\r
+\r
+void vgets(char *str, int len, VFILE *f)\r
+{\r
+ if (f->s)\r
+ {\r
+ if (pack[f->v].curofs != (pack[f->v].files[f->i].packofs + pack[f->v].files[f->i].curofs))\r
+ fseek(f->fp, pack[f->v].files[f->i].curofs+pack[f->v].files[f->i].packofs, 0);\r
+ pack[f->v].files[f->i].curofs+=len;\r
+ pack[f->v].curofs+=len;\r
+ }\r
+ fgets(str, len, f->fp);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VFILE_H\r
+#define VFILE_H\r
+\r
+#define vscanf _vscanf\r
+\r
+typedef struct\r
+{\r
+ FILE *fp; // real file pointer.\r
+ byte s; // 0=real file 1=vfile;\r
+ byte v; // if vfile, which vfile index\r
+ byte i; // which file index in vfile is it?\r
+ byte p; // data alignment pad. :)\r
+} VFILE;\r
+\r
+struct filestruct\r
+{\r
+ unsigned char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int curofs; // current file offset.\r
+ char extractable; // irrelevant to runtime, but...\r
+ char override; // should we override?\r
+};\r
+\r
+struct mountstruct\r
+{\r
+ char mountname[80]; // name of VRG packfile.\r
+ FILE *vhandle; // Real file-handle of packfile.\r
+ struct filestruct *files; // File record array.\r
+ int numfiles; // number of files in pack.\r
+ int curofs; // Current filepointer.\r
+};\r
+\r
+extern struct mountstruct pack[3];\r
+extern char filesmounted;\r
+\r
+int Exist(char *fname);\r
+VFILE *vopen(char *fname);\r
+void MountVFile(char *fname);\r
+void vread(void *dest, int len, VFILE *f);\r
+void vclose(VFILE *f);\r
+int filesize(VFILE *f);\r
+int vtell(VFILE *f);\r
+void vseek(VFILE *f, int offset, int origin);\r
+void vscanf(VFILE *f, char *format, char *dest);\r
+char vgetc(VFILE *f);\r
+word vgetw(VFILE *f);\r
+void vgets(char *str, int len, VFILE *f);\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+void err(char *str, ...);\r
+void Log(char *str, ...);\r
+\r
+// *****\r
+// TODO: Move the chunk list from an array to a linked list?\r
+// Would eliminate hardcoded chunk limit, but would make\r
+// general operation slower. Probably not The Right Thing,\r
+// sides the chunk limit can be interesting sometimes. If\r
+// it becomes problematic, consider a Binary Tree.\r
+// *****\r
+\r
+// ***************************** Data *****************************\r
+\r
+#define MAXCHUNKS 200\r
+#define PARANOID 1\r
+#define PADFILLVALUE 254\r
+#define PADSIZE 256\r
+\r
+void MemReport(void);\r
+\r
+#define errm MemReport(), err\r
+\r
+typedef struct\r
+{\r
+ void *pointer;\r
+ int size;\r
+ int owner;\r
+ char desc[20];\r
+} memblockType;\r
+\r
+memblockType chunks[MAXCHUNKS+1];\r
+int numchunks=0;\r
+\r
+// ***************************** Code *****************************\r
+\r
+void *valloc(int amount, char *desc, int owner)\r
+{\r
+ if (numchunks == MAXCHUNKS)\r
+ err("Failed allocated %d bytes (%s), reason: Out of chunks.",\r
+ amount, desc);\r
+\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ chunks[numchunks].pointer = (void *) ((int) malloc(amount + (PADSIZE * 2)) + PADSIZE);\r
+ chunks[numchunks].size = amount;\r
+ memset((char *) chunks[numchunks].pointer - PADSIZE, PADFILLVALUE, PADSIZE);\r
+ memset((char *) chunks[numchunks].pointer +\r
+ chunks[numchunks].size, PADFILLVALUE, PADSIZE);\r
+#else\r
+ chunks[numchunks].pointer = malloc(amount);\r
+ chunks[numchunks].size = amount;\r
+#endif\r
+ chunks[numchunks].owner = owner;\r
+ strncpy(chunks[numchunks].desc, desc, 19);\r
+ memset(chunks[numchunks].pointer, 0, chunks[numchunks].size);\r
+ return chunks[numchunks++].pointer;\r
+}\r
+\r
+void *qvalloc(int amount)\r
+{\r
+ void *ptr;\r
+\r
+ // Quick and dirty memory allocation. Should be used ONLY\r
+ // for temporary blocks in speed-critical loops.\r
+\r
+ ptr = malloc(amount);\r
+ if (!ptr) errm("qvalloc: Failed allocating %d bytes.", amount);\r
+ return ptr;\r
+}\r
+\r
+void qvfree(void *ptr)\r
+{\r
+ free(ptr);\r
+}\r
+\r
+int TotalBytesAllocated(void)\r
+{\r
+ int i, tally=0;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ tally += chunks[i].size;\r
+\r
+ return tally;\r
+}\r
+\r
+int FindChunk(void *pointer)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].pointer == pointer) return i;\r
+ return -1;\r
+}\r
+\r
+void FreeChunk(int i)\r
+{\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ free((void *) ((int) chunks[i].pointer - PADSIZE));\r
+#else\r
+ free(chunks[i].pointer);\r
+#endif\r
+ for (; i<numchunks; i++)\r
+ chunks[i]=chunks[i+1];\r
+ numchunks--;\r
+}\r
+\r
+int vfree(void *pointer)\r
+{\r
+ int i;\r
+\r
+ i=FindChunk(pointer);\r
+ if (i == -1)\r
+ {\r
+ Log("vfree: Attempted to free ptr %u that was not allocated. [dumping mem report]", pointer);\r
+ MemReport();\r
+ return -1;\r
+ }\r
+ FreeChunk(i);\r
+\r
+ return 0;\r
+}\r
+\r
+void FreeByOwner(int owner)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].owner == owner)\r
+ FreeChunk(i--);\r
+}\r
+\r
+void MemReport(void)\r
+{\r
+ int i;\r
+\r
+ Log("");\r
+ Log("========================================");\r
+ Log("= Memory usage report for this session =");\r
+ Log("========================================");\r
+ Log("Chunks currently allocated: %d (MAXCHUNKS %d)", numchunks, MAXCHUNKS);\r
+ Log("%d total bytes allocated. ", TotalBytesAllocated());\r
+#ifdef PARANOID\r
+ Log("PARANOID is ON. (pad size: %d pad value: %d)", PADSIZE, PADFILLVALUE);\r
+#else\r
+ Log("PARANOID is OFF.");\r
+#endif\r
+ Log("");\r
+ Log("Per-chunk analysis: ");\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ Log("[%3d] Ptr at: %8u size: %8d owner: %3d desc: %s",\r
+ i, chunks[i].pointer, chunks[i].size, chunks[i].owner, chunks[i].desc);\r
+ }\r
+\r
+}\r
+\r
+#ifdef PARANOID\r
+int ChunkIntegrity(int i)\r
+{\r
+ char *tptr;\r
+\r
+ tptr=(char *) malloc(PADSIZE);\r
+ memset(tptr, PADFILLVALUE, PADSIZE);\r
+ if (memcmp((char *) chunks[i].pointer - PADSIZE, tptr, PADSIZE))\r
+ return -1; // Prefix corruption\r
+ if (memcmp((char *) chunks[i].pointer + chunks[i].size, tptr, PADSIZE))\r
+ return 1; // Suffix corruption\r
+ free(tptr);\r
+ return 0; // no corruption\r
+}\r
+\r
+void CheckCorruption(void)\r
+{\r
+ int i, j;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ j=ChunkIntegrity(i);\r
+ if (!j) continue;\r
+ if (j == -1) errm("Prefix corruption on chunk %d.", i);\r
+ if (j == 1) errm("Suffix corruption on chunk %d.", i);\r
+ }\r
+}\r
+#else\r
+void CheckCorruption(void)\r
+{\r
+ return;\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define BACKGROUND_LEN 64000\r
+\r
+ static unsigned char background_[]=\r
+ {\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,0x9a,0x9a,0x99,0x94,\r
+ 0x94,0x94,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9e,0x03,0x02,0x02,0x9e,\r
+ 0x94,0x94,0x94,0x97,0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,0x98,0x94,0x94,0x94,\r
+ 0x94,0x99,0x9f,0x9f,0x9a,0x99,0x97,0x94,0x97,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x99,0x98,0x99,0x9a,0x9b,0x9b,0x9a,0x98,0x94,0x94,\r
+ 0x94,0x98,0x99,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x98,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x98,0x98,0x98,0x97,0x98,0x98,0x9a,0x9b,0x9b,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x9c,\r
+ 0x9d,0x9c,0x99,0x87,0x97,0x87,0x87,0x87,0x87,0x99,0x9e,0x9d,0x99,\r
+ 0x87,0x97,0x99,0x99,0x98,0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x98,\r
+ 0x87,0x87,0x87,0x87,0x87,0x97,0x98,0x98,0x87,0x9c,0x03,0x9f,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9e,0x9c,0x9c,0x9c,0x9b,0x9a,\r
+ 0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x9d,0x9f,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9d,0x99,0x99,0x9a,0x9a,0x97,0x97,0x9a,0x98,0x97,\r
+ 0x94,0x94,0x97,0x9d,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9c,0x97,0x9e,0x94,0x99,\r
+ 0x9a,0x9a,0x98,0x9b,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9e,0x9c,0x9a,0x98,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x9a,0x9d,0x9f,0x9a,0x9a,0x99,0x94,0x94,0x94,0x97,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9d,0x03,0x02,0x02,0x9f,0x97,0x94,0x94,0x94,0x9a,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x03,0x9e,0x98,0x94,0x94,0x94,0x94,0x99,0x9f,0x9f,0x9a,\r
+ 0x99,0x97,0x94,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9a,0x99,\r
+ 0x99,0x9a,0x9b,0x9b,0x9a,0x98,0x94,0x94,0x97,0x99,0x9b,0x9c,0x9d,\r
+ 0x9d,0x9c,0x9c,0x9c,0x9b,0x9a,0x99,0x99,0x99,0x98,0x99,0x99,0x99,\r
+ 0x9a,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9b,0x9c,0x9d,0x9e,0x9c,0x9a,0x97,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x9a,0x9d,0x9d,0x9c,0x98,0x87,0x97,\r
+ 0x87,0x87,0x87,0x87,0x99,0x9f,0x9d,0x99,0x87,0x87,0x99,0x99,0x99,\r
+ 0x98,0x97,0x97,0x98,0x99,0x99,0x99,0x87,0x87,0x87,0x87,0x87,0x87,\r
+ 0x97,0x99,0x99,0x97,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x98,0x97,0x97,0x97,\r
+ 0x94,0x97,0x97,0x98,0x98,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x97,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9a,0x99,0x98,0x98,0x99,0x9c,\r
+ 0x9f,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9a,\r
+ 0x98,0x9a,0x9a,0x97,0x97,0x99,0x99,0x97,0x94,0x94,0x94,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x9c,0x98,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x99,0x99,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,0x9b,\r
+ 0x9b,0x99,0x94,0x94,0x94,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9f,\r
+ 0x02,0x02,0x02,0x9c,0x94,0x94,0x94,0x94,0x9c,0x9f,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x9f,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x98,0x9f,0x9f,0x9a,0x99,0x98,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9a,0x9a,0x9b,0x9c,0x9b,0x99,\r
+ 0x97,0x94,0x97,0x99,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,\r
+ 0x9e,0x9d,0x9a,0x98,0x97,0x94,0x94,0x97,0x97,0x98,0x98,0x99,0x9a,\r
+ 0x9b,0x9c,0x9d,0x9c,0x99,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x98,\r
+ 0x9f,0x9c,0x9b,0x87,0x87,0x97,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x97,0x87,0x87,0x87,0x87,0x87,0x87,0x98,0x99,0x9a,0x9a,0x98,0x9c,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9a,0x9a,0x9a,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,\r
+ 0x98,0x98,0x97,0x97,0x94,0x94,0x94,0x97,0x97,0x98,0x98,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x99,0x99,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9a,0x98,0x9a,0x9b,0x98,0x97,\r
+ 0x98,0x99,0x97,0x94,0x94,0x94,0x99,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9a,0x9a,\r
+ 0x9f,0x9a,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,0x98,0x98,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9a,0x9a,0x99,0x99,0x99,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,0x9c,0x9b,0x99,0x94,0x94,0x94,\r
+ 0x97,0x99,0x9a,0x9a,0x9a,0x99,0x9a,0x9d,0x9f,0x02,0x02,0x02,0x9d,\r
+ 0x97,0x94,0x94,0x94,0x97,0x9c,0x9f,0x03,0x02,0x01,0x01,0x01,0x01,\r
+ 0x01,0x02,0x03,0x9f,0x9e,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x9e,0x9f,0x9a,0x99,0x97,0x94,0x94,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x9a,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x98,0x9a,0x9c,0x9d,\r
+ 0x9d,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,0x9a,0x99,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9c,0x9c,0x9d,0x9d,0x9c,0x99,0x97,0x87,\r
+ 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x98,0x03,0x9c,0x9d,0x87,0x87,\r
+ 0x87,0x97,0x97,0x98,0x98,0x97,0x97,0x87,0x87,0x87,0x87,0x87,0x87,\r
+ 0x87,0x99,0x9b,0x9c,0x9b,0x9c,0x9d,0x9e,0x9f,0x03,0x03,0x9e,0x9c,\r
+ 0x99,0x99,0x99,0x9b,0x9e,0x9f,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x9a,\r
+ 0x99,0x97,0x97,0x98,0x97,0x97,0x97,0x98,0x99,0x99,0x99,0x99,0x97,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x99,0x99,0x9a,0x9b,0x9a,0x99,\r
+ 0x98,0x98,0x9a,0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x9f,0x9c,0x99,0x99,0x9b,0x99,0x97,0x94,0x9a,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x9a,0x99,0x9a,0x99,0x9e,0x97,0x99,0x9a,\r
+ 0x9a,0x98,0x9b,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x99,\r
+ 0x9d,0x9f,0x9d,0x9c,0x9a,0x94,0x94,0x94,0x97,0x99,0x9a,0x9a,0x99,\r
+ 0x99,0x99,0x99,0x9c,0x9f,0x03,0x02,0x02,0x9f,0x9b,0x97,0x94,0x94,\r
+ 0x94,0x94,0x97,0x9a,0x9b,0x9d,0x9e,0x9d,0x9d,0x9c,0x99,0x98,0x94,\r
+ 0x94,0x94,0x94,0x98,0x98,0x99,0x97,0x94,0x9a,0x9e,0x9a,0x98,0x97,\r
+ 0x94,0x94,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9c,\r
+ 0x9d,0x9c,0x9a,0x9b,0x9d,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9d,0x9d,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9b,0x9b,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x06,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x04,0x04,\r
+ 0x04,0x05,0x05,0x06,0x05,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x03,\r
+ 0x02,0x02,0xf7,0x02,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x9a,0x99,0x98,0x98,0x99,0x9c,0x9e,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x99,0x99,\r
+ 0x9a,0x9a,0x98,0x97,0x9a,0x98,0x98,0x98,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x94,0x94,0x94,\r
+ 0x98,0x99,0x9c,0x99,0x03,0x99,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9a,0x9a,0x9a,0x9a,\r
+ 0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9d,0x9e,0x9d,0x9c,0x9a,\r
+ 0x94,0x94,0x94,0x94,0x98,0x9a,0x9a,0x99,0x99,0x98,0x98,0x99,0x9a,\r
+ 0x9d,0x9f,0x03,0x02,0x02,0x03,0x9d,0x99,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x9b,0x9c,0x9c,\r
+ 0x9b,0x99,0x97,0x97,0x9e,0x9a,0x97,0x94,0x94,0x94,0x9f,0x97,0x97,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9b,0x9d,0x9d,0x9d,\r
+ 0x9b,0x9a,0x9a,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x04,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x05,0x05,0x04,0x04,\r
+ 0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0xf7,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x02,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x9a,0x9a,0x99,0x98,0x98,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9c,0x98,0x99,0x9b,0x99,0x97,0x94,\r
+ 0x9b,0x94,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x97,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x9a,0x94,0x94,0x97,0x9a,0x9a,0x9b,0x99,\r
+ 0x9e,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x99,0x98,0x98,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x98,0x9d,0x9e,0x9e,0x9b,0x9a,0x94,0x97,0x97,0x94,0x97,\r
+ 0x9a,0x9a,0x99,0x98,0x97,0x97,0x98,0x98,0x99,0x9a,0x9c,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x99,0x98,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x9a,0x98,0x94,0x9c,\r
+ 0x9a,0x97,0x94,0x94,0x98,0x02,0x9d,0x97,0x98,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x97,0x98,0x99,0x99,0x98,0x98,0x98,0x98,\r
+ 0x98,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x99,0x99,0x99,0x02,0x02,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x04,0x02,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x06,0x05,0x04,0x03,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x02,0x03,0x04,0x03,0x02,0x02,0x04,0x06,0x05,0x05,0x05,\r
+ 0x04,0x03,0x02,0xf7,0x02,0x03,0x03,0x03,0x03,0x9a,0x9a,0x9a,0x99,\r
+ 0x98,0x98,0x9b,0x9e,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9a,0x98,0x9a,0x9a,0x98,0x97,0x9a,0x9a,0x98,0x9b,0x97,\r
+ 0x98,0x94,0x94,0x94,0x97,0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x98,0x97,0x97,0x99,0x99,0x9c,0x9a,0x9f,0x9d,0x98,0x99,0x9b,\r
+ 0x99,0x99,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9e,0x9b,0x99,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9c,0x9e,\r
+ 0x9e,0x9b,0x9a,0x94,0x98,0x97,0x94,0x97,0x99,0x9b,0x99,0x98,0x97,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x97,0x9a,0x9a,0x97,0x94,0x94,0x9b,\r
+ 0x03,0x03,0x94,0x9a,0x97,0x97,0x98,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x97,0x98,0x99,0x98,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9a,0x99,0x98,0x97,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x06,\r
+ 0x05,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x03,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,\r
+ 0x02,0x03,0x03,0x03,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x99,0x9c,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9d,0x99,0x99,\r
+ 0x9b,0x99,0x98,0x94,0x9d,0x98,0x9a,0x9b,0x98,0x98,0x97,0x94,0x94,\r
+ 0x99,0x94,0x94,0x97,0x97,0x98,0x97,0x97,0x94,0x98,0x97,0x97,0x98,\r
+ 0x9a,0x9a,0x9c,0x98,0x9f,0x98,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,\r
+ 0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x9b,0x9d,0x9e,0x9a,0x99,0x97,0x99,\r
+ 0x97,0x94,0x97,0x99,0x9b,0x9a,0x98,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x99,0x9a,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,0x9e,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x99,\r
+ 0x99,0x97,0x97,0x9a,0x97,0x94,0x94,0x9b,0x03,0x02,0x94,0x9a,0x99,\r
+ 0x97,0x97,0x98,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x98,0x99,0x9a,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9a,0x98,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,\r
+ 0x05,0x05,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,\r
+ 0x04,0x05,0x04,0x02,0xf7,0xf7,0x02,0x06,0x05,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x05,\r
+ 0x06,0x06,0x06,0x06,0x07,0x06,0x05,0x02,0xf7,0x02,0x03,0x03,0x9b,\r
+ 0x9a,0x9a,0x9a,0x99,0x98,0x98,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9b,0x98,0x9a,0x9b,0x99,0x98,0x97,\r
+ 0x9e,0x97,0x9a,0x99,0x9a,0x98,0x97,0x97,0x98,0x97,0x97,0x99,0x9a,\r
+ 0x9a,0x9a,0x99,0x98,0x94,0x98,0x98,0x98,0x99,0x9a,0x9a,0x9b,0x99,\r
+ 0x9f,0x94,0x98,0x99,0x9a,0x99,0x9a,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x9a,0x9d,0x9e,0x9a,0x99,0x97,0x98,0x97,0x97,0x94,0x97,0x9a,\r
+ 0x9a,0x99,0x97,0x99,0x99,0x99,0x99,0x98,0x97,0x97,0x97,0x97,0x98,\r
+ 0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x94,0x9a,0x98,\r
+ 0x94,0x94,0x97,0x9c,0x9f,0x94,0x9a,0x99,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x98,0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9a,0x9c,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x05,0x05,0x05,0x04,0x03,0x03,0x04,0x04,0x05,0x05,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x06,0x06,0x04,0x02,\r
+ 0xf7,0xf7,0x06,0x04,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x02,0x03,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,\r
+ 0x98,0x98,0x9a,0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9a,0x99,0x9a,0x9a,0x98,0x97,0x9b,0x9f,0x98,0x9c,0x9a,\r
+ 0x9b,0x99,0x99,0x99,0x98,0x97,0x9a,0x9b,0x9c,0x9c,0x9b,0x9a,0x99,\r
+ 0x97,0x98,0x99,0x98,0x99,0x9a,0x9b,0x9b,0x9c,0x9e,0x97,0x98,0x9a,\r
+ 0x9a,0x98,0x9b,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9c,0x9d,0x9c,\r
+ 0x98,0x97,0x97,0x98,0x97,0x94,0x97,0x99,0x9b,0x99,0x98,0x99,0x9b,\r
+ 0x9d,0x9e,0x9e,0x9d,0x9a,0x99,0x98,0x97,0x97,0x97,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9b,0x9a,0x98,0x97,0x94,0x99,0x98,0x94,0x94,0x94,0x94,0x97,\r
+ 0x94,0x99,0x99,0x97,0x94,0x97,0x97,0x97,0x98,0x9a,0x9a,0x99,0x94,\r
+ 0x94,0x99,0x9a,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9a,0x9a,0x99,0x97,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0xf7,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,\r
+ 0xf7,0x02,0x04,0x06,0x07,0x06,0x05,0x03,0xf7,0xf7,0x05,0x04,0x02,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x05,0x05,0x06,0x05,0x05,0x04,0x03,0x04,0x05,0x07,0x07,0x05,0x03,\r
+ 0xf7,0x02,0x9b,0x9c,0x9b,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9d,0x99,0x99,\r
+ 0x9b,0x9a,0x98,0x97,0x9e,0x9f,0x9a,0x9d,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x97,0x98,0x9b,0x9d,0x9d,0x9d,0x9c,0x9b,0x98,0x97,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9c,0x9a,0x9f,0x9c,0x97,0x98,0x9b,0x9a,0x99,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,\r
+ 0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x9a,0x9b,0x9e,0x98,0x98,0x97,0x99,0x97,\r
+ 0x97,0x94,0x97,0x9b,0x9a,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9e,0x9c,0x9a,0x99,0x98,0x98,0x97,0x98,0x98,0x98,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9b,0x99,0x97,\r
+ 0x97,0x97,0x99,0x94,0x94,0x94,0x94,0x97,0x97,0x9a,0x99,0x97,0x94,\r
+ 0x94,0x97,0x97,0x98,0x9a,0x9a,0x99,0x94,0x97,0x9d,0x03,0x01,0xf7,\r
+ 0xf7,0x01,0x02,0x02,0x9f,0x9d,0x9a,0x97,0x94,0x94,0x94,0x94,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,\r
+ 0x9f,0x9b,0x97,0x94,0x02,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x05,\r
+ 0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x06,\r
+ 0x06,0x05,0x04,0x04,0x06,0x06,0x04,0x02,0xf7,0xf7,0x02,0x05,0x06,\r
+ 0x06,0x06,0x04,0xf7,0xf7,0x04,0x05,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x02,\r
+ 0x02,0x02,0x03,0x03,0x05,0x06,0x07,0x05,0x03,0xf7,0x98,0x9b,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9b,0x98,0x99,0x9b,0x99,0x99,0x94,\r
+ 0x9f,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9a,0x97,0x99,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x99,0x98,0x99,0x9a,0x9a,0x9c,0x99,\r
+ 0x9f,0x9a,0x97,0x98,0x9b,0x9a,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9a,0x9d,0x99,0x97,0x97,0x99,0x97,0x97,0x94,0x97,0x99,0x9b,\r
+ 0x99,0x99,0x9a,0x9e,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9d,0x9c,0x9b,0x9a,0x99,0x99,0x99,0x98,0x98,0x98,0x98,0x98,0x98,\r
+ 0x98,0x98,0x98,0x99,0x9a,0x9b,0x9b,0x98,0x97,0x94,0x98,0x94,0x94,\r
+ 0x97,0x99,0x9b,0x9d,0x9c,0x99,0x97,0x94,0x94,0x94,0x97,0x98,0x99,\r
+ 0x9a,0x99,0x97,0x94,0x94,0x97,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x03,\r
+ 0x9f,0x9e,0x9c,0x99,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9b,0x03,0xf7,0x02,0x9e,0x98,0x94,0x97,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x06,0x06,0x04,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x06,0x05,0xf7,0xf7,0xf7,0x03,0x05,0x06,0x06,0x04,0x02,0xf7,\r
+ 0x02,0x06,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x05,0x04,0x04,0x03,0x02,0xf7,0x02,0x02,0x02,0x03,0x04,\r
+ 0x05,0x07,0x07,0x06,0x02,0x94,0x98,0x9b,0x9c,0x9c,0x9b,0x9a,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9a,0x98,0x9a,0x9b,0x99,0x98,0x97,0x9f,0x9a,0x9c,0x9d,\r
+ 0x9c,0x9c,0x9c,0x9d,0x99,0x97,0x9a,0x9c,0x9d,0x9d,0x9c,0x9c,0x9a,\r
+ 0x97,0x97,0x99,0x98,0x98,0x9b,0x9a,0x9c,0x97,0x9e,0x98,0x97,0x98,\r
+ 0x9b,0x99,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,0x02,0x03,0x03,0x03,\r
+ 0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9b,0x9d,0x97,\r
+ 0x97,0x99,0x99,0x97,0x97,0x94,0x97,0x9a,0x9a,0x99,0x99,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9e,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x99,0x99,0x99,\r
+ 0x9a,0x9b,0x99,0x97,0x94,0x98,0x97,0x97,0x99,0x9a,0x9c,0x9e,0x9d,\r
+ 0x99,0x97,0x94,0x94,0x94,0x97,0x98,0x99,0x9b,0x9c,0x9d,0x9c,0x9a,\r
+ 0x9a,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9a,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9a,0x9d,0x9b,\r
+ 0x9a,0x99,0x97,0x94,0x94,0x97,0x98,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,\r
+ 0x05,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x05,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x04,0x03,0xf7,0xf7,0x06,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x06,\r
+ 0x9a,0x94,0x97,0x9b,0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x99,\r
+ 0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x99,0x99,\r
+ 0x9a,0x9a,0x99,0x98,0x9a,0x03,0x9a,0x9d,0x9d,0x9b,0x9c,0x9d,0x9d,\r
+ 0x98,0x97,0x9a,0x9c,0x9d,0x9d,0x9d,0x9b,0x99,0x97,0x98,0x98,0x98,\r
+ 0x98,0x9a,0x99,0x9b,0x97,0x9e,0x97,0x97,0x99,0x9b,0x99,0x99,0x9e,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,\r
+ 0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x9d,0x98,0x97,0x98,0x99,0x98,0x97,\r
+ 0x94,0x94,0x97,0x9b,0x9a,0x99,0x9a,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9e,0x9e,0x9d,0x9a,0x99,0x99,0x9b,0x9a,0x97,0x94,\r
+ 0x97,0x97,0x98,0x9a,0x9a,0x9b,0x9d,0x9c,0x99,0x97,0x94,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9a,0x9d,0x9e,0x9f,0x9e,0x9d,0x9c,0x9c,0x9a,0x9a,\r
+ 0x99,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x99,\r
+ 0x9a,0x9b,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x04,0x02,0xf7,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x04,0xf7,0xf7,0x03,0x04,0x05,\r
+ 0x05,0x03,0xf7,0xf7,0x05,0x03,0xf7,0x02,0x03,0x04,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x07,0x03,0x9b,0x94,0x97,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9a,0x9a,0x99,0x98,0x98,0x99,0x9c,0x9f,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x99,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x9d,0x03,0x9a,0x9d,0x9d,0x9b,0x9d,0x9d,0x9d,0x97,0x98,0x9a,0x9c,\r
+ 0x9d,0x9d,0x9c,0x9b,0x98,0x97,0x98,0x98,0x97,0x98,0x9a,0x99,0x9a,\r
+ 0x94,0x9d,0x97,0x97,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9a,0x9d,0x97,0x98,0x99,0x99,0x97,0x97,0x94,0x94,0x98,0x9c,\r
+ 0x9a,0x99,0x9a,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9d,0x9a,0x99,0x9a,0x9c,0x98,0x94,0x94,0x97,0x98,0x9a,0x9a,\r
+ 0x9a,0x9c,0x9b,0x98,0x97,0x94,0x94,0x94,0x94,0x97,0x98,0x9a,0x9c,\r
+ 0x9e,0x9f,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x99,0x98,\r
+ 0x97,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9b,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x05,0x06,0x05,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x05,0x06,0x06,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x06,0x04,0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x02,0x02,\r
+ 0xf7,0x02,0x06,0x02,0xf7,0x02,0x04,0x04,0x04,0x04,0x02,0xf7,0x03,\r
+ 0x05,0xf7,0x02,0x03,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x06,0x04,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x06,0x07,\r
+ 0x07,0x07,0x07,0xf7,0x02,0x9c,0x94,0x97,0x9a,0x9c,0x9c,0x9c,0x9a,\r
+ 0x9a,0x99,0x98,0x97,0x99,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9b,0x98,0x99,0x9b,0x9a,0x99,0x97,0x9e,0x9f,0x9b,0x9d,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9c,0x97,0x98,0x9b,0x9d,0x9d,0x9d,0x9c,0x9a,\r
+ 0x98,0x97,0x98,0x97,0x97,0x98,0x99,0x9a,0x9a,0x97,0x9d,0x94,0x97,\r
+ 0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x9c,0x99,0x98,\r
+ 0x98,0x99,0x99,0x97,0x98,0x94,0x97,0x99,0x9c,0x99,0x99,0x9c,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9c,0x99,0x99,\r
+ 0x9b,0x99,0x94,0x94,0x97,0x99,0x99,0x99,0x9a,0x9b,0x9c,0x98,0x97,\r
+ 0x94,0x94,0x94,0x94,0x97,0x98,0x9a,0x9c,0x9e,0x9f,0x9e,0x9d,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x97,0x97,0x97,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,\r
+ 0x98,0x99,0x99,0x99,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x05,0x06,0x06,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x05,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x03,0xf7,0xf7,0x02,0x02,\r
+ 0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x02,0x02,0xf7,0x04,0x05,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x04,0x03,0xf7,0xf7,0x06,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x04,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,\r
+ 0x02,0x9d,0x97,0x94,0x9a,0x9d,0x9c,0x9c,0x9a,0x9a,0x99,0x99,0x97,\r
+ 0x99,0x9c,0x9e,0x9f,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9a,0x98,\r
+ 0x99,0x9b,0x99,0x99,0x94,0x9f,0x9f,0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9c,0x9a,0x97,0x97,0x98,0x97,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x97,0x9d,0x94,0x97,0x9a,0x9a,0x99,0x9b,\r
+ 0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x9d,0x98,0x98,0x99,0x99,0x99,0x97,\r
+ 0x97,0x94,0x97,0x9a,0x9b,0x99,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9e,0x9a,0x99,0x9a,0x9a,0x94,0x94,0x97,\r
+ 0x97,0x99,0x9a,0x9a,0x9c,0x9d,0x99,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9a,0x9c,0x9d,0x9d,0x9c,0x9a,0x99,0x99,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0xf7,0x02,0x03,0x04,0x05,0x05,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x06,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x04,0x06,0x03,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x02,0x02,0x02,0x03,0x06,0xf7,0xf7,0x02,0x04,0x04,0x04,\r
+ 0x03,0xf7,0xf7,0x05,0x03,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x02,0xf7,0xf7,0x02,0x02,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x01,0x9f,0x97,0x94,\r
+ 0x99,0x9d,0x9d,0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x99,0x98,0x9a,0x9b,0x99,0x99,\r
+ 0x97,0x9f,0x9d,0x9d,0x9d,0x9c,0x9c,0x9d,0x9d,0x9a,0x97,0x9a,0x9c,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9a,0x97,0x97,0x97,0x97,0x97,0x98,0x98,0x9a,\r
+ 0x9a,0x97,0x9c,0x97,0x97,0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x9a,0x9c,0x98,0x98,0x99,0x99,0x97,0x97,0x94,0x94,0x97,0x9b,\r
+ 0x9a,0x99,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9b,0x99,0x9a,0x9b,0x97,0x94,0x98,0x97,0x99,0x9a,0x9b,0x9d,\r
+ 0x9e,0x9a,0x97,0x94,0x94,0x94,0x94,0x97,0x98,0x9a,0x9a,0x99,0x94,\r
+ 0x94,0x94,0x97,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9b,0x9d,\r
+ 0x9e,0x9d,0x9f,0x9f,0x03,0x02,0x02,0x01,0x07,0x07,0x07,0x06,0x05,\r
+ 0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x04,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x06,0x02,0xf7,0x02,0x04,0x05,0x05,0x04,0x02,0xf7,0x02,0x04,\r
+ 0xf7,0xf7,0x03,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x06,0x03,0xf7,0xf7,0x02,0x02,0x04,0x06,0x07,0x07,0x07,\r
+ 0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x99,0x94,0x99,0x9d,0x9d,0x9c,\r
+ 0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9c,0x99,0x99,0x9a,0x9a,0x99,0x99,0x99,0x9f,0x9c,0x9d,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9d,0x99,0x97,0x9a,0x9c,0x9d,0x9d,0x9c,0x9b,\r
+ 0x99,0x97,0x98,0x97,0x97,0x97,0x99,0x98,0x9b,0x9a,0x99,0x9c,0x97,\r
+ 0x98,0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9a,0x9a,0x98,\r
+ 0x99,0x99,0x99,0x97,0x98,0x94,0x97,0x99,0x9c,0x9a,0x98,0x9a,0x9e,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9b,0x98,0x9a,0x9b,\r
+ 0x97,0x94,0x99,0x97,0x94,0x97,0x98,0x9a,0x9b,0x9a,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x98,0x99,0x9a,0x97,0x94,0x9c,0x03,0xf7,0xf7,0xf7,\r
+ 0x02,0x03,0x9f,0x9e,0x9c,0x9b,0x99,0x98,0x97,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x9c,0x9f,0x03,\r
+ 0x9f,0x9f,0x9c,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,\r
+ 0x05,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x06,0x05,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x06,0x03,0xf7,0x02,\r
+ 0x04,0x04,0x05,0x04,0x03,0xf7,0xf7,0x05,0xf7,0xf7,0x03,0x05,0x05,\r
+ 0x05,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x9a,0x94,0x97,0x9c,0x9d,0x9d,0x9b,0x9a,0x9a,0x99,\r
+ 0x98,0x98,0x9a,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9a,0x98,\r
+ 0x99,0x9a,0x9a,0x99,0x98,0x9c,0x03,0x9b,0x9d,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9d,0x98,0x98,0x9b,0x9d,0x9d,0x9d,0x9c,0x9a,0x99,0x94,0x99,0x97,\r
+ 0x94,0x97,0x99,0x98,0x9c,0x99,0x9a,0x9b,0x97,0x98,0x9b,0x9a,0x99,\r
+ 0x9e,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x99,0x9c,0x99,0x99,0x99,0x99,0x99,0x97,\r
+ 0x97,0x94,0x97,0x9a,0x9a,0x99,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9a,0x98,0x9a,0x9b,0x98,0x97,0x99,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x9a,0x98,0x94,0x94,0x97,0x97,0x97,0x98,0x99,\r
+ 0x9a,0x97,0x94,0x9a,0x9d,0x9c,0x9b,0x9a,0x9a,0x99,0x99,0x97,0x98,\r
+ 0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,\r
+ 0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x06,0x04,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0x03,0x06,0x02,0xf7,0x02,0x03,0x05,0x05,0x05,0x04,\r
+ 0x02,0xf7,0x04,0x03,0xf7,0x02,0x04,0x05,0x05,0x05,0x04,0x04,0x04,\r
+ 0x04,0x03,0x03,0x03,0x03,0x02,0x05,0x05,0x02,0xf7,0xf7,0x02,0x04,\r
+ 0x06,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,\r
+ 0x94,0x97,0x9c,0x9d,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x99,0x9c,\r
+ 0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9d,0x99,0x98,0x99,0x9b,0x9a,0x99,\r
+ 0x97,0x9e,0x03,0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x97,0x98,0x9b,\r
+ 0x9d,0x9d,0x9d,0x9c,0x9a,0x98,0x94,0x99,0x94,0x94,0x97,0x99,0x98,\r
+ 0x9c,0x98,0x9d,0x9a,0x97,0x98,0x9b,0x99,0x99,0x9e,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x99,0x9c,0x98,0x99,0x99,0x99,0x97,0x98,0x94,0x97,0x99,0x9b,\r
+ 0x9a,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9c,0x99,\r
+ 0x98,0x9a,0x9a,0x99,0x97,0x9b,0x97,0x97,0x94,0x9e,0x02,0x99,0x9a,\r
+ 0x98,0x97,0x97,0x97,0x94,0x97,0x97,0x99,0x99,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x97,0x97,0x97,0x02,0x03,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x07,0x07,0x06,\r
+ 0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x06,0x06,0x03,0x03,0x03,0x04,0x04,0x04,0x03,\r
+ 0x03,0x02,0x03,0x03,0x04,0x04,0x04,0x03,0x03,0x02,0x03,0x05,0x06,\r
+ 0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x05,0x03,0xf7,0xf7,0x05,0xf7,\r
+ 0xf7,0x04,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x03,0x03,0x03,\r
+ 0x02,0x03,0x06,0x03,0xf7,0xf7,0x02,0x03,0x06,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x97,0x9c,0x9d,\r
+ 0x9d,0x9c,0x9a,0x9a,0x99,0x98,0x97,0x98,0x9b,0x9d,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9e,0x9c,0x99,0x98,0x9a,0x9b,0x99,0x99,0x97,0x9f,0x9f,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9b,\r
+ 0x9a,0x97,0x94,0x99,0x94,0x94,0x97,0x9a,0x99,0x9c,0x97,0x9e,0x98,\r
+ 0x97,0x98,0x9b,0x99,0x99,0x9e,0x03,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9c,0x99,0x99,\r
+ 0x99,0x99,0x98,0x97,0x94,0x94,0x97,0x9a,0x9a,0x99,0x98,0x9a,0x9b,\r
+ 0x9d,0x9e,0x9d,0x9e,0x9d,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x99,0x9a,0x9a,0x99,0x97,\r
+ 0x9e,0x97,0x99,0x94,0x94,0x9f,0x9c,0x99,0x99,0x97,0x97,0x99,0x99,\r
+ 0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x9d,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x06,\r
+ 0x04,0x04,0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x04,0x03,0x03,0x04,0x06,0x06,0x03,0xf7,0xf7,0x03,0x04,0x06,\r
+ 0x06,0x06,0x06,0x04,0xf7,0xf7,0x04,0x02,0xf7,0x02,0x05,0x05,0x05,\r
+ 0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x04,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9d,0x94,0x94,0x9c,0x9d,0x9d,0x9c,0x9a,0x9a,\r
+ 0x99,0x98,0x97,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x9e,0x9d,0x9a,0x98,\r
+ 0x99,0x9a,0x9a,0x99,0x99,0x97,0x9f,0x9e,0x9d,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9b,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x94,0x99,\r
+ 0x94,0x97,0x97,0x9a,0x99,0x9b,0x97,0x9e,0x97,0x97,0x99,0x9b,0x99,\r
+ 0x99,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x9c,0x99,0x99,0x99,0x99,0x97,0x97,\r
+ 0x94,0x97,0x9a,0x9b,0x99,0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9a,0x9a,\r
+ 0x99,0x98,0x98,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x9a,0x9b,0x9a,0x94,0x9f,0x9c,0x9b,0x98,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x9a,0x99,0x98,0x99,0x9a,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x07,\r
+ 0x06,0x06,0x06,0x05,0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0x02,0x03,0x05,0x05,0x04,0x04,0x04,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x04,0x04,0x05,0x06,\r
+ 0x05,0x03,0xf7,0xf7,0x02,0x04,0x05,0x06,0x07,0x07,0x06,0x05,0x03,\r
+ 0xf7,0x02,0x04,0xf7,0xf7,0x04,0x05,0x05,0x05,0x04,0x03,0x03,0x04,\r
+ 0x04,0x03,0x03,0x03,0x02,0x02,0x06,0x04,0xf7,0xf7,0x02,0x04,0x06,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x9e,0x94,0x94,0x9b,0x9d,0x9d,0x9c,0x9b,0x9a,0x99,0x99,0x98,0x98,\r
+ 0x99,0x9b,0x9d,0x9e,0x9e,0x9e,0x9c,0x99,0x98,0x99,0x9a,0x9a,0x99,\r
+ 0x99,0x99,0x9f,0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9a,0x97,0x9a,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x94,0x99,0x97,0x97,0x97,0x9a,\r
+ 0x99,0x9a,0x97,0x9e,0x97,0x97,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,\r
+ 0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9c,0x99,0x99,0x16,0x99,0x97,0x98,0x94,0x97,0x99,0x9b,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x99,0x98,0x98,0x97,0x97,0x97,0x98,0x98,0x98,\r
+ 0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9c,\r
+ 0x9d,0x9b,0x97,0x02,0x9f,0x9d,0x9c,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9a,0x9a,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x03,0x03,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x05,\r
+ 0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0x04,\r
+ 0x05,0x06,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,0x05,0xf7,0xf7,\r
+ 0x03,0x05,0x05,0x05,0x05,0x03,0x02,0x03,0x04,0x04,0x03,0x03,0x03,\r
+ 0x02,0x03,0x06,0x02,0xf7,0xf7,0x02,0x05,0x07,0x07,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9e,0x94,0x94,0x9a,\r
+ 0x9d,0x9d,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x99,0x9b,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9a,0x99,0x98,0x99,0x9b,0x9a,0x99,0x98,0x9b,0x9f,0x9c,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x99,0x97,0x9a,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9a,0x9a,0x97,0x97,0x99,0x97,0x97,0x98,0x9a,0x9a,0x9a,0x97,0x9d,\r
+ 0x94,0x98,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9c,0x99,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9b,0x99,0x99,0x12,\r
+ 0x99,0x97,0x97,0x94,0x97,0x99,0x9b,0x9a,0x99,0x98,0x98,0x98,0x97,\r
+ 0x97,0x97,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x15,0x9b,0x9e,0x9e,0x9e,0x97,0x9f,0x9e,0x9f,\r
+ 0x9f,0x9d,0x9c,0x9a,0x97,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x9a,0x9c,0x9d,0x9c,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x04,0x05,0x06,0x06,0x04,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x05,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x03,0xf7,0x02,0x03,0xf7,0xf7,0x05,0x05,0x05,0x05,\r
+ 0x03,0x02,0xf7,0x02,0x04,0x04,0x03,0x03,0x03,0x02,0x05,0x05,0xf7,\r
+ 0xf7,0xf7,0x03,0x06,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x97,0x94,0x99,0x9d,0x9d,0x9d,0x9c,\r
+ 0x9a,0x9a,0x99,0x98,0x97,0x98,0x9a,0x9c,0x9c,0x9d,0x9b,0x99,0x98,\r
+ 0x98,0x9a,0x9b,0x9a,0x99,0x97,0x9e,0x9f,0x9c,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9d,0x98,0x97,0x9a,0x9c,0x9d,0x9c,0x9c,0x9a,0x9a,0x97,0x97,\r
+ 0x98,0x97,0x97,0x98,0x99,0x9a,0x9a,0x97,0x9d,0x94,0x97,0x9a,0x9b,\r
+ 0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9f,0x9e,0x9c,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9a,0x9a,0x99,0x5c,0x16,0x98,0x97,0x94,0x94,\r
+ 0x98,0x9b,0x9a,0x99,0x98,0x98,0x97,0x97,0x98,0x98,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x0f,0x5a,\r
+ 0x9f,0x9f,0x9f,0x9a,0x94,0x01,0x9e,0x98,0x98,0x9f,0x9d,0x9d,0x9d,\r
+ 0x97,0x97,0x97,0x94,0x97,0x99,0x9c,0x9d,0x9c,0x9c,0x9d,0x9d,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x05,\r
+ 0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x06,0x07,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x05,0xf7,0xf7,0xf7,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,\r
+ 0xf7,0x05,0xf7,0xf7,0x03,0x05,0x05,0x05,0x04,0x02,0xf7,0xf7,0x03,\r
+ 0x04,0x03,0x03,0x03,0x03,0x03,0x06,0x02,0xf7,0xf7,0x02,0x05,0x07,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x98,0x94,0x98,0x9d,0x9e,0x9d,0x9c,0x9a,0x9a,0x99,0x98,\r
+ 0x97,0x98,0x99,0x9b,0x9b,0x9b,0x9a,0x99,0x98,0x99,0x9a,0x9a,0x99,\r
+ 0x99,0x94,0x9f,0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x97,0x98,\r
+ 0x9b,0x9d,0x9d,0x9d,0x9c,0x9b,0x9a,0x97,0x97,0x98,0x97,0x97,0x99,\r
+ 0x99,0x9a,0x9a,0x98,0x9d,0x94,0x97,0x9a,0x9a,0x99,0x9b,0x9f,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9c,\r
+ 0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,\r
+ 0x9b,0x16,0x5c,0x13,0x98,0x97,0x94,0x94,0x97,0x9a,0x9a,0x99,0x98,\r
+ 0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9c,0x9d,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x08,0x1a,0x58,0x03,0x0c,0x13,0x0e,0x15,\r
+ 0x19,0x11,0x19,0x97,0x98,0x9f,0x9b,0x9a,0x99,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9c,0x13,0x13,0x13,0x13,0x13,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x06,0x04,0x03,0x02,0x03,0x04,0x04,0x04,0xf7,0xf7,\r
+ 0x03,0x04,0x04,0x05,0x05,0xf7,0x02,0x03,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0x02,0x03,0xf7,0x02,\r
+ 0x05,0x05,0x05,0x04,0x02,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x03,0x03,\r
+ 0x03,0x04,0x05,0xf7,0xf7,0x02,0x03,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x94,\r
+ 0x97,0x9c,0x9e,0x9d,0x9c,0x9a,0x9a,0x99,0x98,0x97,0x98,0x99,0x9a,\r
+ 0x9a,0x9a,0x99,0x98,0x98,0x99,0x9a,0x9a,0x99,0x99,0x97,0x9f,0x9f,\r
+ 0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9c,0x99,0x97,0x97,0x98,0x97,0x97,0x99,0x99,0x9b,0x9a,0x98,\r
+ 0x9d,0x97,0x97,0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x94,0x94,0x94,0x19,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r
+ 0x0e,0x0f,0x1f,0x94,0x94,0x94,0x97,0x99,0x9c,0x13,0x5c,0x5c,0x98,\r
+ 0x97,0x97,0x94,0x16,0x13,0x13,0x12,0x11,0x11,0x11,0x11,0x12,0x12,\r
+ 0x13,0x13,0x15,0x16,0x17,0x18,0x18,0x18,0x17,0x09,0x03,0x03,0x09,\r
+ 0x19,0x59,0x5a,0x14,0x5d,0x5e,0x5d,0xff,0xff,0xff,0x1d,0x13,0x99,\r
+ 0x9f,0x9a,0x9a,0x99,0x9d,0x9a,0x9a,0x9c,0x12,0x5b,0x5b,0x5c,0x5d,\r
+ 0x5d,0x5d,0x14,0x10,0x9e,0x9e,0x9e,0x9e,0x9e,0x11,0x15,0x15,0x15,\r
+ 0x15,0x15,0x14,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x12,\r
+ 0x12,0x12,0x17,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x06,0x04,\r
+ 0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x05,0xf7,0xf7,0x04,0x05,0x05,0x05,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x06,0x02,0xf7,\r
+ 0x02,0x02,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9c,0x94,0x94,0x9c,0x9e,0x9d,\r
+ 0x9c,0x9a,0x9a,0x99,0x98,0x98,0x97,0x98,0x99,0x99,0x99,0x99,0x98,\r
+ 0x99,0x9a,0x9b,0x9a,0x99,0x99,0x99,0x9f,0x9e,0x9d,0x9d,0x9d,0x9c,\r
+ 0x9d,0x9d,0x9b,0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9c,0x9b,0x99,0x97,\r
+ 0x98,0x97,0x97,0x97,0x99,0x99,0x9c,0x9a,0x99,0x9c,0x97,0x98,0x9a,\r
+ 0x9a,0x99,0x9d,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,\r
+ 0x94,0x94,0x1b,0x0d,0x5e,0x5e,0x5e,0x5e,0x0d,0x1d,0x94,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9c,0x5c,0x5c,0x5c,0x19,0x97,0x97,0x94,0x97,0x15,\r
+ 0x14,0x5c,0x5c,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5a,0x59,0x59,0x59,\r
+ 0x59,0x5a,0x5b,0x14,0x97,0x97,0x17,0x5d,0x5d,0x5e,0x5e,0x5e,0x5e,\r
+ 0x5d,0x58,0xff,0xff,0xff,0xff,0x5d,0x12,0x9d,0x99,0x9a,0x9a,0x9d,\r
+ 0x97,0x9a,0x13,0x5b,0x5b,0x5b,0x5c,0x5d,0x5e,0x5d,0x5b,0x5a,0x16,\r
+ 0x10,0x9f,0x0e,0x9f,0x9e,0x10,0x17,0x5a,0x5b,0x5b,0x5b,0x5b,0x5b,\r
+ 0x5b,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x13,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9b,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0x04,0x05,0x06,0x04,0x03,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,\r
+ 0x03,0x03,0xf7,0x02,0x05,0x04,0x05,0x04,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x03,0x03,0x03,0x03,0x04,0x05,0xf7,0xf7,0x02,0x02,0x9f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x9c,0x94,0x94,0x9b,0x9e,0x9d,0x9c,0x9a,0x9a,0x99,\r
+ 0x99,0x98,0x97,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x9a,0x9a,0x9a,\r
+ 0x99,0x98,0x9c,0x9f,0x9d,0x9d,0x9d,0x9c,0x9c,0x9d,0x9d,0x99,0x97,\r
+ 0x9a,0x9c,0x9d,0x9d,0x9d,0x9c,0x9b,0x99,0x97,0x98,0x97,0x97,0x97,\r
+ 0x99,0x98,0x9c,0x99,0x9a,0x9c,0x97,0x98,0x9b,0x9a,0x99,0x9e,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x1f,0x7d,\r
+ 0x5e,0x5e,0x5e,0x16,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x12,0x5c,\r
+ 0x5c,0x5c,0x11,0x97,0x97,0x94,0x97,0x9a,0x14,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5c,0x5b,0x5a,0x59,0x59,0x59,0x5a,0x5d,0x5d,0x12,0x94,0x94,\r
+ 0x19,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0x5d,0x5a,0xff,0xff,0xff,0xff,\r
+ 0xff,0x5b,0x5d,0x13,0x99,0x9a,0x9b,0x9d,0x97,0x13,0x5b,0x5b,0x5b,\r
+ 0x5b,0x5c,0x5d,0x5e,0x5d,0x5b,0x5a,0x5a,0x59,0x5a,0x14,0x9e,0x9e,\r
+ 0x9d,0x12,0x5b,0x5b,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5c,0x5b,0x12,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x06,0x06,0x06,0x06,0x05,\r
+ 0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x05,0xf7,0xf7,0x04,\r
+ 0x04,0x04,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x03,0x03,\r
+ 0x03,0x06,0x02,0xf7,0xf7,0x02,0x9a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9d,\r
+ 0x94,0x94,0x9a,0x9e,0x9d,0x9d,0x9a,0x9a,0x9a,0x99,0x98,0x98,0x98,\r
+ 0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x99,0x97,0x9f,0x9f,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x98,0x97,0x9a,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9b,0x99,0x94,0x99,0x97,0x97,0x97,0x9a,0x98,0x9c,0x99,\r
+ 0x9b,0x9b,0x97,0x98,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x14,0x5e,0x5e,0x5e,0x10,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x12,0x5c,0x5c,0x5c,0x5d,0x14,0x97,\r
+ 0x94,0x97,0x9a,0x9b,0x12,0x5c,0x5c,0x5c,0x12,0x13,0x15,0x17,0x18,\r
+ 0x18,0x5b,0x5d,0x5e,0x0e,0x94,0x94,0x94,0x94,0x1c,0x5d,0x5d,0x5d,\r
+ 0x5d,0x5d,0x5b,0x0f,0x03,0xf7,0x0c,0x11,0xff,0x5a,0x5d,0x5b,0x19,\r
+ 0x9a,0x9b,0x9d,0x1a,0x5c,0x5b,0x5b,0x5b,0x5c,0x12,0x13,0x0f,0x5d,\r
+ 0x5b,0x5a,0x5a,0x5a,0x12,0x9d,0x9c,0x9b,0x9b,0x9b,0x13,0x5c,0x5c,\r
+ 0x5c,0x12,0x12,0x12,0x12,0x13,0x13,0x5c,0x5b,0x5b,0x13,0x9c,0x9c,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x99,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x06,0x07,0x07,\r
+ 0x07,0x06,0x04,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x05,0x06,0x05,0x04,0x04,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x02,0x03,0xf7,0x02,0x05,0x04,0x04,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x04,0x03,0x03,0x03,0x03,0x04,0x05,0xf7,0xf7,\r
+ 0x02,0x98,0x9d,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9e,0x94,0x94,0x9a,0x9e,\r
+ 0x9d,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x98,0x98,0x98,0x98,0x98,\r
+ 0x99,0x9a,0x9a,0x9a,0x99,0x99,0x97,0x9f,0x9f,0x9d,0x9d,0x9d,0x9b,\r
+ 0x9d,0x9d,0x9d,0x97,0x98,0x9b,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x99,\r
+ 0x94,0x99,0x97,0x97,0x97,0x9a,0x99,0x9c,0x98,0x9d,0x9a,0x97,0x98,\r
+ 0x9b,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x1d,0x5e,0x5e,0x5e,0x7d,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x99,0x16,0x5c,0x5c,0x5c,0x5d,0x5d,0x19,0x94,0x97,0x9a,0x9b,0x13,\r
+ 0x5c,0x5c,0x12,0x9a,0x9b,0x9e,0x9f,0x03,0x9f,0x19,0x5e,0x0d,0x1e,\r
+ 0x94,0x98,0x9a,0x9a,0x9a,0x13,0x5b,0x5c,0x5c,0x15,0x0c,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0x11,0x5a,0x5d,0x5a,0x13,0x9a,0x9a,0x9d,0x12,0x5d,\r
+ 0x5b,0x5b,0x15,0x15,0x99,0x97,0x97,0x14,0x5b,0x5b,0x5b,0x13,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x13,0x5c,0x5c,0x12,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9c,0x12,0x5b,0x16,0x11,0x9c,0x9b,0x9a,0x98,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0x06,0x04,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x05,\r
+ 0x05,0x05,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,\r
+ 0x05,0xf7,0xf7,0x04,0x04,0x04,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x03,0x03,0x03,0x03,0x06,0x02,0xf7,0xf7,0x98,0x99,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9e,0x97,0x94,0x9a,0x9e,0x9d,0x9d,0x9b,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x99,0x99,0x99,0x9f,0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,0x97,\r
+ 0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x98,0x94,0x99,0x97,0x97,\r
+ 0x97,0x9a,0x99,0x9c,0x97,0x9e,0x98,0x98,0x99,0x9b,0x99,0x9a,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x0e,0x5e,\r
+ 0x5e,0x5e,0x19,0x94,0x94,0x94,0x94,0x97,0x16,0x5a,0x5b,0x5b,0x5c,\r
+ 0x19,0x97,0x97,0x94,0x97,0x99,0x9b,0x13,0x5c,0x5c,0x12,0x9a,0x9c,\r
+ 0x9f,0x03,0x03,0x9d,0x1d,0x0f,0x1b,0x94,0x98,0x9b,0x9d,0x9e,0x9e,\r
+ 0x11,0x5b,0x5a,0x5b,0x10,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x59,\r
+ 0x5d,0x58,0x11,0x9a,0x9a,0x14,0x5b,0x5c,0x5c,0x5b,0x14,0x9a,0x99,\r
+ 0x99,0x9a,0x15,0x5b,0x14,0x16,0x9a,0x99,0x9a,0x9a,0x9a,0x99,0x99,\r
+ 0x13,0x5d,0x5d,0x11,0x99,0x9a,0x9c,0x9b,0x9b,0x9a,0x1a,0x11,0x19,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x02,0x03,\r
+ 0x05,0x06,0x07,0x07,0x07,0x07,0x06,0x04,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x05,0x05,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0xf7,0x03,0xf7,0x02,0x05,\r
+ 0x04,0x04,0x03,0xf7,0xf7,0x02,0xf7,0xf7,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0xf7,0xf7,0x97,0x99,0x9b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9f,0x97,0x94,0x9a,0x9e,0x9e,0x9d,0x9c,0x9a,0x9a,0x9a,0x99,0x99,\r
+ 0x99,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x9d,0x9f,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9b,0x97,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9a,0x98,0x94,0x99,0x97,0x97,0x97,0x9a,0x99,0x9b,\r
+ 0x97,0x9e,0x97,0x98,0x99,0x9b,0x99,0x9b,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x97,\r
+ 0x97,0x97,0x94,0x94,0x94,0x94,0x16,0x5e,0x5e,0x5e,0x12,0x94,0x94,\r
+ 0x94,0x94,0x97,0x13,0x5a,0x5b,0x5b,0x13,0x97,0x98,0x98,0x97,0x97,\r
+ 0x99,0x9b,0x13,0x5c,0x5c,0x12,0x9a,0x9c,0x9f,0x03,0x03,0x13,0x1c,\r
+ 0x94,0x94,0x94,0x98,0x9a,0x9d,0x9e,0x9e,0x0f,0x5a,0x5b,0x5b,0x9d,\r
+ 0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x5a,0x5d,0x1f,0x12,0x9a,0x9a,\r
+ 0x13,0x5b,0x5b,0x5b,0x13,0x9d,0x9d,0x9d,0x9d,0x11,0x5b,0x13,0x15,\r
+ 0x9a,0x99,0x99,0x1a,0x97,0x97,0x97,0x98,0x13,0x5c,0x5c,0x11,0x97,\r
+ 0x94,0x94,0x94,0x94,0x12,0x1e,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9c,0x9f,0x03,0x03,0x03,0x06,0x05,0x05,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x05,\r
+ 0x06,0x06,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x04,0xf7,0xf7,0x04,0x04,0x04,0x04,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x04,0x03,0x03,0x03,0x03,0x05,0x03,0xf7,0x94,\r
+ 0x98,0x99,0x9e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x94,0x99,\r
+ 0x9d,0x9e,0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x9f,0x9f,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9a,0x97,0x9a,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9a,\r
+ 0x97,0x94,0x99,0x97,0x97,0x97,0x9a,0x99,0x9b,0x97,0x9e,0x94,0x98,\r
+ 0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x97,0x97,\r
+ 0x94,0x1e,0x5e,0x5e,0x5e,0x0c,0x94,0x94,0x94,0x94,0x97,0x5c,0x5a,\r
+ 0x5b,0x5b,0x19,0x94,0x98,0x98,0x97,0x98,0x99,0x9b,0x13,0x5c,0x5c,\r
+ 0x12,0x9a,0x9c,0x9f,0x03,0x0f,0x5a,0x17,0x94,0x94,0x94,0x97,0x99,\r
+ 0x9b,0x9c,0x9d,0x13,0x5c,0x5c,0x5c,0x19,0x9b,0x9f,0xf7,0xf7,0xf7,\r
+ 0xf7,0x06,0x5c,0x5d,0x58,0x13,0x9b,0x99,0x11,0x5b,0x5c,0x5d,0x1a,\r
+ 0x97,0x98,0x99,0x9a,0x13,0x13,0x98,0x97,0x97,0x1b,0x12,0x17,0x98,\r
+ 0x98,0x97,0x94,0x13,0x5e,0x5e,0x0e,0x94,0x94,0x94,0x94,0x16,0x5e,\r
+ 0x19,0x94,0x97,0x9a,0x9e,0x9f,0x9f,0x9f,0x9e,0x9e,0x9b,0x99,0x97,\r
+ 0x94,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x07,0x06,0x03,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,\r
+ 0x04,0xf7,0x02,0x05,0x04,0x04,0x02,0xf7,0x02,0x02,0x02,0xf7,0x03,\r
+ 0x04,0x03,0x03,0x03,0x04,0x04,0x03,0x98,0x97,0x99,0x9a,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x94,0x98,0x9d,0x9e,0x9d,0x9d,\r
+ 0x9b,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x97,0x9f,0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x99,\r
+ 0x97,0x9b,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x9a,0x98,0x94,0x99,0x97,\r
+ 0x97,0x98,0x9a,0x9a,0x9b,0x99,0x9e,0x97,0x98,0x9a,0x9a,0x99,0x9d,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9b,0x9a,0x99,0x97,0x10,0x5e,0x5e,\r
+ 0x5e,0x1b,0x94,0x94,0x94,0x18,0x5b,0x5a,0x5b,0x13,0x99,0x94,0x98,\r
+ 0x98,0x97,0x98,0x99,0x9a,0x13,0x5c,0x5c,0x5c,0x13,0x13,0x16,0x18,\r
+ 0x58,0x59,0x15,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x17,0x5d,\r
+ 0x5d,0x5e,0x11,0x97,0x9a,0x03,0xf7,0xf7,0xf7,0x18,0x5d,0x5e,0x5a,\r
+ 0x12,0x9d,0x9d,0x5d,0x5d,0x5e,0x7d,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x98,0x99,0x16,0x5c,0x10,0x94,0x94,0x94,0x94,0x94,0x14,0x5e,\r
+ 0x5e,0x7d,0x0e,0x0e,0x10,0x11,0x5b,0x5b,0x11,0x9d,0x9d,0x9b,0x9a,\r
+ 0x98,0x97,0x94,0x94,0x94,0x97,0x99,0x9a,0x9c,0x04,0x04,0x05,0x05,\r
+ 0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,\r
+ 0x06,0x06,0x06,0x06,0x07,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x03,0xf7,0xf7,0x04,0x04,\r
+ 0x04,0x04,0xf7,0xf7,0x02,0x03,0x02,0xf7,0x04,0x03,0x03,0x03,0x03,\r
+ 0x05,0x04,0x9e,0x9a,0x99,0x99,0x9e,0x01,0x01,0x01,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x99,0x94,0x97,0x9c,0x9e,0x9d,0x9d,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x99,0x9f,\r
+ 0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x97,0x98,0x9b,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9b,0x9a,0x98,0x97,0x98,0x97,0x98,0x99,0x9a,0x9b,\r
+ 0x9b,0x9c,0x9d,0x97,0x98,0x9a,0x9a,0x99,0x9e,0x03,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x99,0x98,\r
+ 0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x98,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9b,0x9a,0x13,0x5d,0x5e,0x5e,0x14,0x94,0x94,0x94,\r
+ 0x12,0x5b,0x5a,0x5b,0x14,0x98,0x94,0x98,0x99,0x94,0x98,0x99,0x9a,\r
+ 0x13,0x5c,0x5c,0x5c,0x5c,0x5b,0x5a,0x59,0x58,0x58,0x10,0x99,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x19,0x5e,0x5e,0x5e,0x5e,0x0e,0x16,\r
+ 0x99,0x02,0x07,0x19,0x5c,0x5d,0x5b,0x5a,0x12,0x9c,0x97,0x5d,0x5d,\r
+ 0x5e,0x0e,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x18,0x7d,0x5e,\r
+ 0x16,0x94,0x94,0x94,0x94,0x94,0x13,0x5d,0x5d,0x5d,0x5d,0x5c,0x5c,\r
+ 0x5d,0x5d,0x5d,0x17,0x94,0x94,0x94,0x97,0x98,0x9a,0x9b,0x9d,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x05,0x05,0x06,0x06,0x06,0x05,0x05,0x06,0x07,0x07,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x05,0xf7,0x02,0x05,0x04,0x04,0x02,0xf7,0x02,\r
+ 0x03,0x03,0x02,0x02,0x04,0x03,0x03,0x03,0x04,0x04,0x9f,0x9f,0x9c,\r
+ 0x9a,0x9e,0x01,0x02,0x03,0x9f,0x03,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x94,\r
+ 0x94,0x9a,0x9d,0x9e,0x9d,0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x9e,0x9f,0x9e,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9d,0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,\r
+ 0x9a,0x98,0x97,0x98,0x98,0x98,0x9a,0x9a,0x9c,0x9a,0x9e,0x9c,0x97,\r
+ 0x98,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x99,0x98,0x98,0x99,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x98,0x97,0x97,0x98,\r
+ 0x17,0x5c,0x5d,0x5e,0x0d,0x94,0x94,0x94,0x5c,0x5b,0x5a,0x5b,0x9a,\r
+ 0x97,0x94,0x98,0x99,0x94,0x98,0x99,0x9a,0x13,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5b,0x59,0x58,0x58,0x0c,0x9f,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x19,0x5e,0x5e,0x5d,0x5d,0x5d,0x5e,0x5e,0x5b,0xff,0x59,0x5c,\r
+ 0x59,0x5a,0x12,0x9a,0x94,0x94,0x5e,0x5e,0x5e,0x0f,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x12,0x5d,0x5d,0x5d,0x19,0x94,0x94,0x94,0x97,\r
+ 0x97,0x13,0x5d,0x5d,0x5d,0x5d,0x5e,0x5e,0x5d,0x5d,0x5d,0x15,0x9a,\r
+ 0x9c,0x9d,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9c,0x9c,0x9a,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x04,0x05,0x05,0x06,0x06,\r
+ 0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0x02,\r
+ 0x02,0xf7,0x04,0x04,0x04,0x04,0xf7,0x02,0x03,0x03,0x03,0xf7,0x04,\r
+ 0x03,0x03,0x04,0x04,0x04,0x9f,0x9f,0x9f,0x9e,0x9d,0x02,0x02,0x9e,\r
+ 0x9b,0x9d,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9d,0x97,0x94,0x98,0x9c,0x9e,\r
+ 0x9d,0x9d,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x97,0x9f,0x9f,0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9a,\r
+ 0x97,0x99,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x98,\r
+ 0x98,0x99,0x9a,0x9a,0x9c,0x99,0x9f,0x9b,0x98,0x98,0x9b,0x99,0x99,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x94,0x94,0x97,0x97,0x98,0x99,0x99,0x97,0x94,0x11,0x5c,0x5d,0x5d,\r
+ 0x1c,0x94,0x16,0x5c,0x5b,0x5a,0x13,0x99,0x94,0x94,0x98,0x99,0x94,\r
+ 0x98,0x99,0x9a,0x13,0x5c,0x5c,0x5c,0x12,0x12,0x13,0x15,0x59,0x58,\r
+ 0x0c,0x02,0x02,0x9f,0x9e,0x9b,0x9a,0x9a,0x9a,0x12,0x5b,0x5a,0x5a,\r
+ 0x5a,0x5b,0x5d,0x5e,0x5d,0x1f,0x59,0x58,0x59,0x13,0x99,0x97,0x94,\r
+ 0x94,0x5e,0x5d,0x5c,0x5c,0x98,0x97,0x98,0x99,0x99,0x16,0x13,0x5c,\r
+ 0x5c,0x5d,0x5d,0x97,0x97,0x94,0x94,0x94,0x94,0x13,0x5d,0x5d,0x5d,\r
+ 0x12,0x13,0x13,0x15,0x5a,0x5a,0x10,0x9e,0x9e,0x9e,0x9d,0x9d,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0x03,0x04,0x05,0x06,0x06,0x05,0x04,0x04,0x04,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0x05,0xf7,0x02,0x04,0x04,\r
+ 0x04,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x04,0x03,0x03,0x04,0x04,\r
+ 0x9d,0x9f,0x9f,0x9f,0x9e,0x03,0x02,0x9d,0x98,0x97,0x99,0x9d,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x9f,0x98,0x94,0x94,0x9a,0x9d,0x9d,0x9d,0x9d,0x9c,\r
+ 0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x99,0x9f,\r
+ 0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x99,0x97,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x99,0x99,0x99,0x9b,0x9a,\r
+ 0x9c,0x98,0x9f,0x99,0x98,0x99,0x9b,0x99,0x99,0x9f,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x98,0x14,0x5d,0x5d,0x5d,0x15,0x94,0x12,0x5c,0x5b,\r
+ 0x5b,0x16,0x98,0x94,0x94,0x98,0x99,0x94,0x98,0x99,0x9a,0x13,0x5c,\r
+ 0x5c,0x11,0x99,0x99,0x99,0x9a,0x12,0x59,0x0e,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x0c,0x58,0x58,0x58,0x1a,0x59,0x5b,0x5d,0x5d,\r
+ 0x59,0x58,0x59,0x12,0x9c,0x94,0x94,0x9e,0x01,0x0f,0x5c,0x5c,0x5c,\r
+ 0x98,0x97,0x98,0x98,0x99,0x14,0x13,0x14,0x5c,0x5c,0x5c,0x99,0x99,\r
+ 0x99,0x99,0x9a,0x9b,0x12,0x5b,0x5b,0x15,0x9e,0x9e,0x9e,0x9d,0x12,\r
+ 0x5b,0x12,0x9c,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,\r
+ 0x9a,0x9a,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x05,0x05,0x06,0x05,0x03,0x03,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x03,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x02,0xf7,0x02,0xf7,0x04,0x04,0x04,0x04,0xf7,0x02,0x03,\r
+ 0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x9d,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x01,0x9e,0x97,0x94,0x94,0x97,0x9a,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x9a,0x94,0x94,0x98,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x94,0x9e,0x9f,0x9f,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9d,0x9d,0x97,0x98,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9a,0x97,0x97,0x99,0x99,0x99,0x9b,0x9a,0x9c,0x97,0x9f,0x98,\r
+ 0x98,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9a,0x99,0x98,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x1b,\r
+ 0x5d,0x5d,0x5d,0x10,0x94,0x5d,0x5c,0x5c,0x12,0x98,0x97,0x94,0x94,\r
+ 0x98,0x9a,0x97,0x98,0x99,0x9a,0x12,0x5c,0x5d,0x11,0x99,0x99,0x99,\r
+ 0x99,0x9a,0x12,0x11,0x0e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x0e,\r
+ 0x59,0x59,0x59,0x9f,0x10,0x12,0x12,0x5d,0x5a,0x59,0x5c,0x99,0x97,\r
+ 0x94,0x9e,0x9f,0x9a,0x11,0x5c,0x5c,0x5d,0x14,0x97,0x98,0x98,0x98,\r
+ 0x99,0x9a,0x13,0x5b,0x5b,0x5b,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x13,\r
+ 0x5b,0x5b,0x13,0x9b,0x9b,0x9b,0x9c,0x9b,0x13,0x12,0x13,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9d,0x9d,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x02,0x03,\r
+ 0x05,0x06,0x06,0x04,0x03,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x05,\r
+ 0xf7,0xf7,0x04,0x04,0x04,0xf7,0xf7,0x03,0x03,0x03,0x03,0x02,0x04,\r
+ 0x03,0x02,0x04,0x9d,0x9d,0x9e,0x9f,0x03,0x03,0x02,0x9f,0x97,0x94,\r
+ 0x94,0x94,0x94,0x98,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x98,0x94,0x94,\r
+ 0x99,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x98,0x97,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,\r
+ 0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x97,\r
+ 0x99,0x99,0x99,0x9b,0x9a,0x9c,0x97,0x9f,0x97,0x98,0x99,0x9b,0x99,\r
+ 0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9f,0x9e,0x9a,0x99,0x98,0x98,0x99,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x99,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x10,0x5d,0x5d,0x5d,0x13,\r
+ 0x5c,0x5c,0x5d,0x14,0x97,0x94,0x94,0x94,0x98,0x9a,0x97,0x98,0x99,\r
+ 0x9a,0x13,0x5c,0x5d,0x11,0x98,0x98,0x98,0x99,0x99,0x19,0x15,0x15,\r
+ 0x13,0x9d,0x9e,0x9e,0x9f,0x9f,0x9f,0x0f,0x5a,0x5a,0x5a,0x9d,0x9c,\r
+ 0x9b,0x99,0x13,0x5b,0x5b,0x5d,0x15,0x94,0x94,0x94,0x97,0x9a,0x13,\r
+ 0x5b,0x5c,0x5d,0x5c,0x97,0x97,0x98,0x98,0x99,0x99,0x14,0x5c,0x5b,\r
+ 0x5b,0x15,0x9a,0x9a,0x9a,0x9a,0x9a,0x12,0x5c,0x5c,0x12,0x9a,0x9a,\r
+ 0x9b,0x9c,0x9c,0x12,0x12,0x11,0x12,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9e,0x9e,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x03,0x03,0x05,0x06,0x06,0x04,0x02,0x03,0x05,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0xf7,0x02,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x02,0xf7,0xf7,0xf7,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x02,0xf7,0x03,0x04,0x04,\r
+ 0x03,0xf7,0x02,0x03,0x03,0x03,0x02,0x02,0x04,0x03,0x03,0x9c,0x9d,\r
+ 0x9d,0x9f,0x9f,0x03,0x02,0x02,0x98,0x94,0x97,0x97,0x94,0x94,0x97,\r
+ 0x9e,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x9d,0x94,0x94,0x97,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x97,0x9a,0x9f,\r
+ 0x9f,0x9d,0x9d,0x9d,0x9c,0x9c,0x9d,0x9d,0x9a,0x97,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x98,0x99,0x99,0x99,0x9a,\r
+ 0x9a,0x9b,0x98,0x9f,0x97,0x98,0x99,0x9b,0x99,0x9b,0x9f,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9f,0x9d,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x99,0x99,0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x94,\r
+ 0x94,0x94,0x94,0x13,0x5d,0x5d,0x5d,0x5d,0x5c,0x5c,0x5d,0x1d,0x94,\r
+ 0x94,0x94,0x94,0x98,0x9a,0x97,0x98,0x99,0x9a,0x13,0x5c,0x5d,0x11,\r
+ 0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x14,0x5c,0x16,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9c,0x12,0x5b,0x5b,0x5b,0x9c,0x9a,0x99,0x97,0x19,0x5b,0x5d,\r
+ 0x5d,0x0e,0x98,0x9a,0x9b,0x9c,0x9e,0x9e,0x5c,0x5c,0x5d,0x5d,0x12,\r
+ 0x97,0x97,0x98,0x98,0x98,0x11,0x5c,0x5c,0x5c,0x14,0x99,0x99,0x99,\r
+ 0x99,0x99,0x12,0x5c,0x5c,0x13,0x9b,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,\r
+ 0x11,0x5a,0x10,0x9d,0x9d,0x9c,0x9b,0x9a,0x99,0x99,0x98,0x97,0x98,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,0x04,\r
+ 0x06,0x06,0x03,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x03,0xf7,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x04,0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0xf7,0x05,0xf7,0xf7,0x04,0x04,0x04,0xf7,0xf7,0x03,0x03,\r
+ 0x03,0x03,0x02,0x04,0x03,0x02,0x9c,0x9c,0x9d,0x9e,0x9f,0x03,0x03,\r
+ 0x02,0x9c,0x94,0x97,0x99,0x98,0x94,0x94,0x94,0x9d,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x9f,0x9a,0x94,0x94,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9c,\r
+ 0x9c,0x9b,0x9b,0x9a,0x9a,0x98,0x97,0x9f,0x9f,0x9f,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9d,0x9d,0x99,0x98,0x9b,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9c,0x9a,0x97,0x98,0x99,0x99,0x99,0x9a,0x9b,0x9b,0x99,0x9e,\r
+ 0x94,0x98,0x9a,0x9a,0x98,0x9d,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9d,0x9c,0x98,0x94,0x94,0x1b,0x5e,\r
+ 0x5d,0x5d,0x5d,0x5c,0x5c,0x10,0x98,0x97,0x94,0x94,0x94,0x98,0x9a,\r
+ 0x94,0x98,0x99,0x9a,0x5c,0x5c,0x5d,0x5d,0x13,0x13,0x13,0x13,0x13,\r
+ 0x13,0x13,0x5c,0x5d,0x5c,0x19,0x99,0x99,0x9a,0x9a,0x13,0x5b,0x5b,\r
+ 0x5b,0x9a,0x99,0x97,0x97,0x9a,0x12,0x5d,0x5d,0x5c,0x14,0x99,0x98,\r
+ 0x99,0x9c,0x9a,0x16,0x5d,0x5d,0x5d,0x5d,0x5d,0x14,0x17,0x16,0x11,\r
+ 0x5d,0x5d,0x5d,0x5c,0x5c,0x16,0x99,0x9a,0x9a,0x9a,0x5c,0x5b,0x5b,\r
+ 0x5b,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x14,0x5d,0x5d,0x1d,0x94,\r
+ 0x97,0x99,0x9a,0x9b,0x9b,0x9a,0x98,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x04,0x02,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,\r
+ 0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,\r
+ 0x03,0xf7,0xf7,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x02,\r
+ 0xf7,0x03,0x04,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,0x03,0x02,0x04,\r
+ 0x03,0x99,0x9c,0x9d,0x9d,0x9e,0x9f,0x03,0x02,0x03,0x97,0x97,0x9a,\r
+ 0x9b,0x9a,0x97,0x94,0x94,0x9c,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,\r
+ 0x99,0x94,0x94,0x97,0x99,0x9b,0x9c,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,\r
+ 0x99,0x97,0x99,0x03,0x9f,0x2a,0x2a,0x2b,0x2a,0x2c,0x2b,0x2b,0x2b,\r
+ 0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x97,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9e,0x97,0x98,0x9a,0x9a,\r
+ 0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9f,0x9f,0x9c,0x99,0x98,0x98,0x98,0x98,0x98,0x98,0x97,0x98,\r
+ 0x99,0x9a,0x9c,0x9d,0x98,0x94,0x94,0x5e,0x5e,0x5d,0x5d,0x5c,0x5c,\r
+ 0x12,0x9e,0x9c,0x98,0x94,0x94,0x98,0x9a,0x94,0x98,0x99,0x16,0x5c,\r
+ 0x5c,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r
+ 0x12,0x98,0x99,0x99,0x9a,0x12,0x5b,0x5b,0x5c,0x18,0x97,0x94,0x99,\r
+ 0x98,0x1a,0x5c,0x5d,0x5d,0x5d,0x1a,0x98,0x9c,0x9d,0x9b,0x9a,0x12,\r
+ 0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5c,0x5c,0x13,\r
+ 0x14,0x9b,0x9c,0x9d,0x10,0x5a,0x5a,0x5a,0x5a,0x5a,0x5b,0x5c,0x5d,\r
+ 0x5d,0x5d,0x5d,0x5b,0x5a,0x59,0x15,0x03,0x02,0x01,0x01,0x01,0x02,\r
+ 0x9f,0x9d,0x9a,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x05,0x06,0x07,\r
+ 0x06,0x06,0x05,0x05,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x04,0x05,\r
+ 0x06,0x05,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x06,0x07,0x06,0x02,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x02,0xf7,0x02,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0x04,0xf7,0xf7,0x04,0x03,0x04,\r
+ 0xf7,0xf7,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x03,0x02,0x9a,0x94,0x9a,0x9c,0x9c,0x9b,0x99,0x94,\r
+ 0x94,0x9a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,0x99,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9a,0x9b,0x9b,0x9a,0x9a,0x99,0x97,0x27,0x2a,0x27,\r
+ 0x28,0x2a,0x2a,0x2b,0x2b,0x2c,0x2a,0x2b,0x2c,0xf6,0x2a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x99,0x99,0x99,0x9a,\r
+ 0x9a,0x9c,0x9b,0x9e,0x9e,0x97,0x99,0x9a,0x9a,0x99,0x9e,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9c,\r
+ 0x9a,0x99,0x98,0x98,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9b,0x9d,\r
+ 0x97,0x14,0x5e,0x5e,0x5d,0x5d,0x5c,0x5d,0x5d,0x09,0x9f,0x9a,0x94,\r
+ 0x97,0x98,0x9b,0x94,0x98,0x17,0x13,0x5c,0x5c,0x5d,0x5d,0x5d,0x5d,\r
+ 0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x99,0x99,0x16,\r
+ 0x5c,0x5c,0x5c,0x5d,0x0f,0x19,0x98,0x97,0x98,0x98,0x12,0x5d,0x5c,\r
+ 0x5b,0x13,0x9d,0x9e,0x9e,0x9d,0x9c,0x9b,0x13,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5c,0x5c,0x5b,0x5b,0x5b,0x12,0x9d,0x9e,0x9e,0x9e,0x0f,0x15,\r
+ 0x5b,0x5b,0x5d,0x5d,0x5d,0x5d,0x5b,0x59,0x59,0x5b,0x5d,0x5d,0x5e,\r
+ 0x5e,0x5e,0x13,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x06,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x04,0x04,0x05,0x06,0x03,0x02,0x02,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x02,0x05,\r
+ 0x06,0x06,0x05,0x02,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x05,0x06,0x05,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x03,0xf7,0x02,0xf7,0x04,0x03,0x03,0x03,0xf7,0x03,0x03,0x03,\r
+ 0x03,0x04,0x02,0x04,0x9b,0x98,0x9d,0x9d,0x9c,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x94,0x99,0x9c,0x9d,0x9d,0x9c,0x9a,0x94,0x94,0x9a,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9f,0x9a,0x97,0x94,0x94,0x94,0x98,\r
+ 0x99,0x99,0x99,0x2f,0x2f,0x05,0x2e,0x27,0x27,0x29,0x2a,0x2a,0x2b,\r
+ 0x2c,0x2b,0x2b,0x2b,0x2f,0x2f,0x2d,0x2a,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9b,0x99,0x97,0x99,0x99,0x99,0x9a,0x9b,0x9c,0x9a,0x9f,\r
+ 0x9d,0x97,0x99,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x99,0x99,0x94,\r
+ 0x94,0x94,0x94,0x97,0x97,0x98,0x99,0x13,0x13,0x5d,0x5e,0x5e,0x5e,\r
+ 0x5e,0x5d,0x5d,0x5d,0x1f,0x10,0x9a,0x94,0x97,0x97,0x9b,0x94,0x16,\r
+ 0x5c,0x5b,0x5c,0x5c,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r
+ 0x5d,0x5d,0x5d,0x5d,0x5d,0x14,0x14,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,\r
+ 0x5d,0x13,0x98,0x97,0x97,0x15,0x5b,0x5b,0x5b,0x5a,0x5a,0x13,0x9e,\r
+ 0x9e,0x9d,0x9d,0x9c,0x12,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x14,\r
+ 0x10,0x9d,0x9d,0x9c,0x9b,0x15,0x5d,0x5d,0x5d,0x5b,0x59,0x59,0x59,\r
+ 0x5c,0x5d,0x5e,0x5e,0x5e,0x5d,0x5d,0x5c,0x5c,0x5c,0x5c,0x14,0x97,\r
+ 0x97,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,\r
+ 0x05,0x05,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x02,0x02,0x03,0x06,0x05,0x05,0x05,0x04,0xf7,\r
+ 0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x06,\r
+ 0x03,0xf7,0x02,0x07,0x07,0x07,0x06,0x07,0x07,0x05,0xf7,0x04,0xf7,\r
+ 0x02,0x04,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,0x02,0x9d,\r
+ 0x9a,0x99,0x9d,0x9d,0x9d,0x9e,0x9f,0x03,0x02,0x9b,0x97,0x9b,0x9d,\r
+ 0x9d,0x9e,0x9e,0x9b,0x94,0x94,0x99,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x9c,0x99,0x94,0x94,0x94,0x94,0x05,0x2f,0x02,\r
+ 0x01,0x2f,0x28,0x27,0x27,0x29,0x2a,0x2b,0x2b,0x2c,0x2b,0x2b,0x2c,\r
+ 0xf6,0x2f,0x2c,0x2b,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x98,\r
+ 0x97,0x99,0x99,0x9a,0x9b,0x9b,0x9d,0x99,0x03,0x9b,0x98,0x99,0x9b,\r
+ 0x99,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9d,0x9b,0x9a,0x94,0x94,0x94,0x94,0x97,0x98,\r
+ 0x99,0x99,0x9a,0x9d,0x99,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x02,\r
+ 0x9e,0x98,0x94,0x97,0x97,0x9c,0x94,0x99,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,\r
+ 0x99,0x9a,0x9a,0x9a,0x99,0x97,0x94,0x99,0x97,0x99,0x98,0x97,0x99,\r
+ 0x9a,0x14,0x5b,0x5a,0x5a,0x5a,0x0f,0x9e,0x9e,0x9d,0x9d,0x9d,0x9d,\r
+ 0x12,0x12,0x13,0x14,0x14,0x13,0x12,0x9c,0x9a,0x98,0x94,0x97,0x9a,\r
+ 0x9e,0x9f,0x9e,0x9a,0x97,0x94,0x94,0x94,0x94,0x97,0x99,0x99,0x9a,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,0x9b,0x99,0x97,\r
+ 0x98,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x05,0x05,0x02,0x02,0x03,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x02,\r
+ 0x02,0x06,0x05,0x03,0x02,0x04,0x04,0x03,0xf7,0xf7,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x06,0x05,0xf7,0xf7,0x06,0x07,\r
+ 0x07,0x06,0x06,0x07,0x07,0x02,0x03,0xf7,0xf7,0x04,0x03,0x03,0x02,\r
+ 0xf7,0x03,0x03,0x04,0x03,0x03,0x03,0x9a,0x9c,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9f,0x9f,0x03,0x02,0x94,0x99,0x9c,0x9d,0x9d,0x9e,0x9e,0x9c,\r
+ 0x97,0x94,0x98,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x03,0x9d,0x99,0x97,0x27,0x05,0x01,0x01,0x01,0x2f,0x2a,0x26,0x27,\r
+ 0x27,0x2a,0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2e,0xf6,0x2e,0x2c,0x2a,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9b,0x98,0x97,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9b,0x9c,0x99,0x03,0x99,0x98,0x99,0x9b,0x99,0x99,0x9f,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9e,0x9d,0x94,0x94,0x97,0x97,0x98,0x99,0x9a,0x9a,0x9b,0x9c,0x9c,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x9c,0x9c,0x94,0x94,0x97,0x94,\r
+ 0x9c,0x97,0x99,0x99,0x9a,0x9a,0x99,0x98,0x98,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x94,0x99,0x97,0x98,0x99,0x97,0x99,0x9a,0x9b,0x12,0x5a,0x5a,0x5a,\r
+ 0x10,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x99,0x94,0x94,0x9a,0x9e,0x9e,0x99,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x99,0x9a,0x9a,0x9b,0x9c,0x9d,0x9d,0x9e,0x9e,0x9f,0x9e,0x9e,0x9e,\r
+ 0x9f,0x9f,0x9d,0x9c,0x9c,0x9c,0x9a,0x97,0x97,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,\r
+ 0x04,0x05,0x05,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x04,0x02,0xf7,0x05,0x05,0x04,0x04,0x03,\r
+ 0xf7,0xf7,0x03,0x03,0xf7,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x05,0x06,0x06,0xf7,0xf7,0x05,0x07,0x07,0x06,0x04,0x07,0x07,\r
+ 0x03,0xf7,0x02,0xf7,0x03,0x03,0x02,0x03,0xf7,0x03,0x03,0x04,0x03,\r
+ 0x03,0x04,0x9a,0x9c,0x9b,0x97,0x9d,0x9d,0x9c,0x9e,0x9f,0x9f,0x03,\r
+ 0x9c,0x97,0x9b,0x9c,0x9d,0x9d,0x9e,0x9e,0x9d,0x97,0x94,0x98,0x9f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x27,0x28,\r
+ 0x2f,0xf6,0x01,0xf6,0x2f,0x2a,0x25,0x26,0x27,0x28,0x2a,0x2a,0x2b,\r
+ 0x2c,0x2b,0x2b,0x2b,0xf6,0x2f,0x2c,0x2b,0x2a,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9b,0x97,0x97,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x98,\r
+ 0x9f,0x98,0x98,0x99,0x9b,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x97,0x97,0x98,\r
+ 0x99,0x9a,0x9a,0x9b,0x9c,0x9c,0x9d,0x9d,0x99,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x9a,0x94,0x94,0x98,0x94,0x9d,0x97,0x99,0x9a,0x9a,\r
+ 0x9a,0x99,0x98,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x99,0x98,0x97,0x99,0x98,0x97,0x99,0x97,\r
+ 0x98,0x99,0x9a,0x9c,0x0f,0x5a,0x5a,0x14,0x9e,0x9e,0x9e,0x9e,0x9d,\r
+ 0x9a,0x9a,0x9a,0x9c,0x9b,0x98,0x94,0x97,0x9d,0x9d,0x97,0x94,0x94,\r
+ 0x94,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9c,0x9c,0x9c,0x9d,0x9e,0x9f,\r
+ 0x9e,0x99,0x94,0x94,0x94,0x94,0x97,0x99,0x9f,0x03,0x9c,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x9a,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x05,0x05,0x02,0x02,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x02,0xf7,0xf7,0x05,0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0x03,0x02,\r
+ 0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x06,0x06,0xf7,\r
+ 0xf7,0x04,0x07,0x07,0x06,0x04,0x06,0x07,0x04,0xf7,0x04,0xf7,0x02,\r
+ 0x04,0x02,0x03,0xf7,0x02,0x03,0x04,0x04,0x03,0x03,0x9c,0x99,0x9d,\r
+ 0x9a,0x99,0x9d,0x9d,0x9d,0x9e,0x9f,0x03,0x02,0x97,0x9a,0x9c,0x9c,\r
+ 0x9d,0x9e,0x9e,0x9e,0x9d,0x98,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x23,0x26,0x28,0x2c,0x2c,0x2d,0x2b,\r
+ 0x27,0x25,0x26,0x27,0x27,0x29,0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2e,\r
+ 0xf6,0x2e,0x2c,0x2b,0x2a,0x9d,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,\r
+ 0x97,0x97,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x99,0x9f,0x97,0x98,0x99,\r
+ 0x9b,0x99,0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x97,0x97,0x99,0x99,0x9a,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9c,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x99,0x94,0x9e,0x98,0x99,0x9a,0x9a,0x9a,0x99,0x99,0x98,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x9a,0x9a,\r
+ 0x99,0x97,0x97,0x99,0x94,0x99,0x99,0x97,0x97,0x98,0x9d,0x9e,0x9e,\r
+ 0x13,0x5a,0x12,0x9d,0x9d,0x9d,0x9a,0x9a,0x9b,0x9c,0x99,0x94,0x97,\r
+ 0x9c,0x97,0x94,0x94,0x94,0x97,0x98,0x99,0x9b,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9e,0x9e,0x9f,0x9e,0x9c,0x98,0x94,0x94,0x94,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x97,0x9d,0x03,0x99,0x99,0x9a,0x9a,0x9a,0x99,0x9b,0x04,\r
+ 0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x03,0x04,0x04,0x05,0x03,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0xf7,0x02,0x05,0x04,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0xf7,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x06,0x06,0xf7,0xf7,0x04,0x07,0x07,0x05,\r
+ 0x04,0x04,0x07,0x05,0xf7,0x04,0xf7,0xf7,0x04,0x02,0x03,0xf7,0x02,\r
+ 0x03,0x04,0x04,0x04,0x03,0x9b,0x9c,0x9a,0x9d,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x03,0x9f,0x97,0x9b,0x9c,0x9c,0x9d,0x9d,0x9e,0x9e,\r
+ 0x9e,0x99,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x23,0x23,0x23,0x23,0x25,0x27,0x27,0x27,0x25,0x25,0x27,0x27,0x27,\r
+ 0x27,0x2a,0x2a,0x2c,0x2c,0x2a,0x2b,0x2c,0xf6,0x2f,0x2c,0x2b,0x2a,\r
+ 0x9d,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,0x97,0x98,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9c,0x9c,0x99,0x9f,0x97,0x98,0x99,0x9b,0x99,0x9a,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x98,0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9d,0x99,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9b,0x97,0x9f,0x9b,\r
+ 0x98,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x99,0x9a,0x9a,0x9a,0x98,0x94,0x9a,0x97,0x94,\r
+ 0x99,0x99,0x98,0x97,0x9c,0x9e,0x9c,0x9c,0x13,0x5b,0x9c,0x9c,0x9c,\r
+ 0x9a,0x9b,0x9b,0x98,0x94,0x9a,0x97,0x94,0x94,0x97,0x98,0x9a,0x9c,\r
+ 0x9d,0x9d,0x9e,0x9f,0x9f,0x9d,0x99,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x99,0x9a,0x9a,0x98,0x94,0x94,0x9d,0x9f,\r
+ 0x97,0x98,0x9a,0x9a,0x9a,0x9b,0x9d,0x04,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x05,0x04,0xf7,\r
+ 0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x03,0xf7,0xf7,0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x05,\r
+ 0x06,0x06,0xf7,0xf7,0x04,0x07,0x07,0x05,0x03,0x04,0x07,0x06,0xf7,\r
+ 0x04,0xf7,0xf7,0x04,0x03,0x03,0x02,0xf7,0x03,0x03,0x04,0x04,0x04,\r
+ 0x9a,0x9c,0x9a,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9e,0x9f,0x9f,0x03,\r
+ 0x99,0x99,0x9b,0x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,0x99,0x94,0x97,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x25,0x27,0x2c,0x2c,0x2a,0x27,0x29,0x2a,0x2b,0x2c,\r
+ 0x2b,0x2b,0x2b,0x2f,0x2f,0x2e,0x2c,0x2b,0x2a,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9a,0x97,0x99,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,\r
+ 0x99,0x9f,0x97,0x98,0x99,0x9b,0x99,0x9b,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x99,0x99,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9c,0x9b,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9c,0x99,0x9f,0x9e,0x97,0x9a,0x9a,0x9a,0x9a,\r
+ 0x99,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x99,\r
+ 0x9a,0x9a,0x99,0x98,0x99,0x99,0x94,0x94,0x9a,0x99,0x98,0x9a,0x9c,\r
+ 0x9a,0x99,0x99,0x99,0x13,0x9a,0x9d,0x9c,0x9c,0x98,0x94,0x9a,0x94,\r
+ 0x94,0x97,0x99,0x9b,0x9d,0x9d,0x9f,0x9f,0x9e,0x97,0x94,0x94,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x97,0x9a,0x9e,\r
+ 0x9f,0x9f,0x9e,0x9c,0x97,0x94,0x9e,0x9a,0x97,0x98,0x9c,0x9b,0x9b,\r
+ 0x9d,0x9d,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x05,0x02,0x02,0x02,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x02,0xf7,0x02,\r
+ 0x05,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x05,0x06,0x06,0xf7,0xf7,0x04,\r
+ 0x07,0x06,0x04,0x03,0x03,0x07,0x06,0xf7,0x04,0xf7,0xf7,0x04,0x03,\r
+ 0x02,0x02,0xf7,0x03,0x03,0x04,0x04,0x04,0x9c,0x9b,0x9c,0x99,0x9d,\r
+ 0x9a,0x98,0x9d,0x9d,0x9d,0x9e,0x9f,0x03,0x03,0x94,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9e,0x9e,0x9e,0x99,0x94,0x94,0x9f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,\r
+ 0x2e,0x2f,0x2f,0x29,0x28,0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2e,0xf6,\r
+ 0x2f,0x2c,0x2b,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9a,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9c,0x9c,0x9a,0x9e,0x94,0x98,\r
+ 0x9a,0x9a,0x98,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x99,0x99,0x9a,0x9b,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,\r
+ 0x99,0x9a,0x9c,0x9a,0x94,0x94,0x94,0x97,0x94,0x94,0x94,0x99,0x9a,\r
+ 0x9c,0x9e,0x9f,0x97,0x9a,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x99,0x9a,0x9a,0x9a,0x99,0x97,0x9b,\r
+ 0x98,0x94,0x97,0x9a,0x9a,0x9a,0x9c,0x99,0x98,0x97,0x97,0x98,0x16,\r
+ 0x9e,0x9d,0x9a,0x94,0x9b,0x94,0x94,0x98,0x9b,0x9d,0x9e,0x9f,0x9f,\r
+ 0x98,0x94,0x97,0x98,0x97,0x99,0x9c,0x9f,0x03,0x9f,0x9f,0x9d,0x9a,\r
+ 0x99,0x98,0x98,0x98,0x99,0x9a,0x9c,0x9e,0x9f,0x9f,0x9e,0x9a,0x94,\r
+ 0x94,0x9f,0x97,0x97,0x99,0x9c,0x9b,0x9c,0x9d,0x9d,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,\r
+ 0x04,0xf7,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0x05,0x05,0x04,0x04,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0x04,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x04,0x04,0x06,0x06,0x05,0xf7,0xf7,0x05,0x07,0x06,0x04,0x03,0x03,\r
+ 0x07,0x05,0xf7,0x04,0xf7,0xf7,0x04,0x03,0x02,0x03,0xf7,0x02,0x03,\r
+ 0x04,0x04,0x04,0x9d,0x9b,0x9b,0x9c,0x99,0x9d,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x03,0x9d,0x98,0x9b,0x9b,0x9b,0x9b,0x9c,0x9d,0x9e,\r
+ 0x9e,0x9e,0x99,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x26,0x2d,0x2f,0xf6,0x2c,0x28,\r
+ 0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2c,0xf6,0x2f,0x2c,0x2b,0x2a,0x2a,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9c,0x9c,0x9c,0x9e,0x97,0x98,0x9a,0x9a,0x98,0x9d,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x99,0x99,\r
+ 0x9a,0x9b,0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x99,0x99,0x9a,0x9c,0x99,\r
+ 0x94,0x94,0x97,0x97,0x94,0x97,0x9a,0x9a,0x9c,0x9c,0x9f,0x9b,0x99,\r
+ 0x9b,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x99,0x9a,0x9a,0x9a,0x99,0x97,0x9a,0x97,0x94,0x97,0x9a,0x9b,\r
+ 0x9d,0x99,0x97,0x97,0x97,0x97,0x9a,0x9e,0x9d,0x97,0x99,0x9a,0x94,\r
+ 0x98,0x9b,0x9d,0x9f,0x9f,0x97,0x97,0x98,0x99,0x9e,0x02,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9f,0x9c,0x99,0x98,0x97,0x97,\r
+ 0x99,0x99,0x9b,0x9d,0x9d,0x9b,0x97,0x94,0x98,0x9f,0x97,0x97,0x9a,\r
+ 0x9a,0x9a,0x9c,0x9d,0x9b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x04,0x05,0x02,0xf7,0x02,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x07,0x07,0x07,0x06,\r
+ 0xf7,0x02,0x06,0x04,0x03,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x02,0x05,0x03,0x02,0x03,0x04,0x04,0x04,0x05,0x06,0x07,0x04,\r
+ 0xf7,0xf7,0x06,0x07,0x05,0x03,0x02,0x03,0x07,0x04,0xf7,0x04,0xf7,\r
+ 0xf7,0x04,0x03,0x02,0x03,0xf7,0x02,0x03,0x04,0x04,0x05,0x9e,0x9c,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9c,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x03,\r
+ 0x97,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9d,0x9e,0x9e,0x9e,0x9a,0x94,\r
+ 0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x25,0x2c,0x2f,0xf6,0xf6,0x2a,0x29,0x2a,0x2c,0x2b,0x2a,\r
+ 0x2a,0x2c,0xf6,0x2f,0x2e,0x2c,0x2a,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x99,0x9a,0x9a,0x9a,0x9b,0x9c,\r
+ 0x9b,0x9d,0x9e,0x97,0x99,0x9a,0x9a,0x99,0x9e,0x9f,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9a,0x9a,0x9a,0x9b,0x9c,0x2f,0x2f,\r
+ 0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2e,0x2c,0x28,0x26,0xf7,0x2f,0x2f,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x01,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2c,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2e,0xf6,0xf7,0x2a,0xf7,0xf7,0xf7,0x2e,0x2a,0x29,0xf7,0xf7,\r
+ 0x01,0x23,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x23,0x2a,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2a,0x2f,0xf7,0xf7,0x01,0x9a,0x9a,0x9d,0x99,0x94,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,\r
+ 0x05,0x05,0x05,0x06,0x07,0x07,0x07,0x05,0xf7,0x03,0x06,0x03,0x03,\r
+ 0x04,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x05,0xf7,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x03,0xf7,0xf7,0x06,0x07,0x04,\r
+ 0x03,0x02,0x04,0x07,0x03,0xf7,0x02,0xf7,0x02,0x04,0x03,0x02,0x03,\r
+ 0xf7,0x02,0x03,0x03,0x04,0x05,0x9e,0x9d,0x9c,0x9a,0x9c,0x9a,0x9c,\r
+ 0x9b,0x97,0x9d,0x9d,0x9c,0x9e,0x9f,0x9f,0x9f,0x97,0x9a,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9b,0x9c,0x9e,0x9e,0x9f,0x9a,0x94,0x94,0x9f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,0x2f,\r
+ 0xf6,0x01,0x2e,0x2a,0x2a,0x2b,0x2b,0x2b,0x2a,0x2c,0xf6,0x2f,0x2e,\r
+ 0x2c,0x2b,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9c,0x99,0x97,0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9b,0x9f,0x9e,0x97,\r
+ 0x99,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x03,\r
+ 0x03,0x9d,0x9d,0x9d,0x9d,0x9d,0x2e,0x2e,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2e,0x2f,0x02,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2e,0x2b,\r
+ 0x28,0x25,0x02,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf6,0x2a,0x2e,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0x23,0xf7,\r
+ 0xf7,0x01,0x2d,0x27,0xf7,0xf7,0x2c,0x36,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x23,0x27,0x2b,0x2c,0x2a,0x25,0x36,0x35,0x23,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x26,0xf7,\r
+ 0xf7,0x01,0x01,0x99,0x99,0x97,0x94,0x94,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x02,0xf7,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x06,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x06,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x04,0x04,0x02,0x03,0x03,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x04,0x04,0x06,0x06,0xf7,0x04,0x05,0x05,0x06,\r
+ 0x06,0x06,0xf7,0xf7,0x02,0x07,0x06,0x04,0x03,0x02,0x05,0x07,0xf7,\r
+ 0x02,0xf7,0xf7,0x03,0x04,0x03,0x03,0x03,0xf7,0xf7,0x03,0x03,0x04,\r
+ 0x04,0x9e,0x9e,0x9d,0x9c,0x9a,0x9c,0x99,0x9d,0x9a,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x9f,0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,\r
+ 0x9e,0x9f,0x9f,0x9a,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x25,0x25,0x2b,0x2f,0xf6,0x01,0x2f,0x2a,0x2a,\r
+ 0x2b,0x2c,0x2b,0x2a,0x2d,0xf6,0x2f,0x2e,0x2c,0x2b,0x2a,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9d,0x9a,0x03,0x9c,0x98,0x99,0x9b,0x99,0x99,\r
+ 0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x99,0x99,0x9a,0x9a,\r
+ 0x9c,0x2e,0x2e,0x2e,0x2f,0x02,0x01,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,\r
+ 0x2f,0x01,0xf7,0x2e,0x2d,0x2e,0x2e,0x2b,0x28,0x25,0x23,0xf7,0x2f,\r
+ 0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf6,0x02,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0x35,0xf7,0xf7,0x01,0x2c,0x2a,0xf7,0xf7,\r
+ 0x36,0x35,0x35,0x35,0x35,0x35,0x23,0x29,0x2d,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0x28,0x35,0x27,0xf7,0xf7,0xf7,0x01,0x2e,0x2c,0x2b,0x2a,\r
+ 0x2f,0xf7,0xf7,0x01,0x2a,0x23,0x2d,0xf7,0x01,0x2f,0xf7,0x97,0x94,\r
+ 0x94,0x94,0x94,0xf7,0x02,0x02,0x02,0xf7,0x02,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x07,0x07,0x07,0x03,0xf7,0x06,\r
+ 0x02,0x02,0x03,0x03,0x02,0x02,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x06,0x06,0x04,0xf7,0x04,0x05,0x06,0x06,0x04,0xf7,0xf7,0x02,\r
+ 0x07,0x06,0x03,0x03,0x02,0x06,0x06,0xf7,0x04,0xf7,0xf7,0x04,0x03,\r
+ 0x03,0x03,0x03,0xf7,0xf7,0x02,0x03,0x03,0x04,0x9e,0x9e,0x9e,0x9d,\r
+ 0x9b,0x9b,0x9c,0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x03,\r
+ 0x97,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,0x9e,0x9e,0x9f,0x9b,\r
+ 0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x25,\r
+ 0x23,0x2a,0xf6,0xf6,0x02,0x2e,0x28,0x2a,0x2c,0x2c,0x2b,0x2b,0x2f,\r
+ 0xf6,0x2f,0x2e,0x2c,0x2b,0x2a,0x2b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x98,0x97,0x9a,0x9a,0x9a,0x9b,0x9c,\r
+ 0x9d,0x99,0x03,0x9a,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x94,0x94,0x94,0x97,0x99,0xf6,0x2e,0x2f,0x2e,\r
+ 0x2f,0x2f,0x01,0x01,0x01,0xf6,0x2f,0x2f,0x2f,0x2d,0xf7,0xf7,0x2e,\r
+ 0x2e,0x2f,0x2b,0x28,0x27,0x25,0x2e,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x02,0xf7,0xf7,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x02,0xf7,0xf7,0xf7,0x01,0xf7,0x27,\r
+ 0x2e,0xf7,0x01,0x2c,0x2c,0xf7,0x2f,0x36,0x35,0x35,0x35,0x36,0x27,\r
+ 0x2c,0x2f,0x02,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0x2a,0x35,0xf7,\r
+ 0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2d,0x27,0x23,0x23,0x25,\r
+ 0x2a,0x2f,0x2f,0x2f,0x2e,0xf7,0x98,0x94,0x94,0x97,0x99,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x03,0xf7,0x03,0xf7,0xf7,0x03,0x04,0x05,0x03,\r
+ 0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x04,\r
+ 0x04,0x06,0x07,0x07,0x06,0x03,0xf7,0x06,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x02,0xf7,0x02,0x03,0x04,0x04,0x04,0x05,0x05,0x03,0x07,0x02,\r
+ 0xf7,0x03,0x04,0x04,0x02,0xf7,0xf7,0x03,0x07,0x06,0x03,0x03,0x02,\r
+ 0x07,0x05,0xf7,0x03,0xf7,0xf7,0x04,0x03,0x03,0x04,0x03,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x9c,0x9e,0x9e,0x9e,0x9c,0x9b,0x9b,0x9b,0x9c,\r
+ 0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x9f,0x97,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9b,0x9d,0x9e,0x9f,0x9b,0x94,0x94,0x9f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x23,0x23,0x2a,0xf6,0xf6,0x2f,\r
+ 0x28,0x28,0x2c,0x2c,0x2c,0x2c,0x2c,0x2f,0xf6,0x2f,0x2e,0x2c,0x2b,\r
+ 0x2a,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9c,0x98,0x97,0x9a,0x9a,0x9b,0x9b,0x9c,0x9d,0x99,0x03,0x99,\r
+ 0x98,0x99,0x9b,0x9a,0x99,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,0x94,\r
+ 0x94,0x94,0x94,0x94,0xf7,0x2f,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0xf6,\r
+ 0xf6,0x2f,0x2f,0x02,0x2f,0x2f,0xf7,0x02,0x2f,0x2d,0x2c,0x28,0x28,\r
+ 0x2c,0x36,0xf7,0x2f,0x2e,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x02,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0x2c,0xf7,0xf6,0x2e,0x2a,0xf7,\r
+ 0x2f,0x36,0x35,0x35,0x35,0x27,0x2d,0x2f,0x02,0xf6,0x2f,0x2d,0x2d,\r
+ 0x2e,0x2f,0xf7,0xf7,0xf7,0x23,0x29,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2d,0x2e,0x2f,0x2f,0x2d,0xf7,0xf7,\r
+ 0xf7,0x94,0x94,0x98,0x98,0x98,0x02,0x02,0x03,0x02,0xf7,0x03,0x02,\r
+ 0x03,0x03,0xf7,0x02,0x03,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x06,\r
+ 0x02,0xf7,0x06,0xf7,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x02,0x02,\r
+ 0x04,0x04,0x04,0x05,0x02,0x02,0x07,0x07,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0x03,0x07,0x06,0x04,0x03,0x03,0x07,0x04,0xf7,0x02,0xf7,\r
+ 0x02,0x04,0x04,0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x9a,\r
+ 0x9c,0x9e,0x9e,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x9b,0x98,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9d,0x9f,0x9f,0x9c,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x2b,0x02,0xf6,0x2c,0x26,0x2b,0x2d,0x2c,0x2c,\r
+ 0x2c,0x2f,0x2f,0x2f,0x2e,0x2c,0x2c,0x2b,0x2a,0x2a,0x9d,0x9c,0x9c,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9b,0x98,0x97,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x99,0x03,0x98,0x98,0x99,0x9b,0x9a,\r
+ 0x99,0x9a,0x9e,0x9f,0x9f,0x03,0x03,0x97,0x97,0x98,0x99,0x97,0xf7,\r
+ 0x01,0x2e,0x2e,0xf7,0xf7,0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf7,\r
+ 0x2e,0xf6,0xf7,0x2f,0x2f,0x2c,0x2a,0x2a,0xf6,0x2d,0x2a,0xf7,0x2e,\r
+ 0x2e,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,\r
+ 0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,\r
+ 0xf7,0x2e,0xf7,0xf7,0x2f,0x2a,0xf7,0xf7,0x36,0x35,0x35,0x23,0x2c,\r
+ 0x2f,0x2f,0x2f,0x2a,0x2a,0x28,0x28,0x2a,0x2c,0x2f,0xf7,0xf7,0xf6,\r
+ 0x36,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,\r
+ 0x2f,0x2f,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x97,0x97,0x99,\r
+ 0x9b,0x03,0x03,0xf7,0xf7,0x02,0x03,0xf7,0x06,0x03,0xf7,0x03,0x04,\r
+ 0x05,0x04,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x05,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0x05,0xf7,0x02,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x03,0x02,0x03,0x04,0x04,0x04,0xf7,\r
+ 0x02,0x07,0x07,0x05,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x07,0x06,\r
+ 0x04,0x03,0x04,0x07,0x03,0xf7,0x02,0xf7,0x03,0x04,0x04,0x04,0x05,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x9a,0x9a,0x9c,0x9d,0x9e,0x9d,\r
+ 0x9c,0x9a,0x9c,0x9a,0x9d,0x99,0x9b,0x9d,0x9d,0x9d,0x9e,0x9e,0x9f,\r
+ 0x97,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x9a,0x9b,0x9d,0x9f,0x9f,\r
+ 0x9b,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,\r
+ 0x02,0xf6,0x27,0x28,0x2e,0x2e,0x2d,0x2c,0x2e,0x2f,0x2f,0x2e,0x2d,\r
+ 0x2c,0x2c,0x2b,0x2a,0x2b,0x9d,0x9c,0x9c,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9b,0x97,0x97,0x9b,0x9b,0x9a,0x9b,\r
+ 0x9c,0x9c,0x99,0x9f,0x97,0x98,0x98,0x9b,0x9a,0x99,0x99,0x9b,0x9e,\r
+ 0x9f,0x9f,0x94,0x94,0x94,0x94,0x97,0xf7,0xf7,0xf7,0x2f,0x2d,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0x2d,0x01,0x01,0x2f,\r
+ 0x2e,0x2c,0x2c,0xf7,0xf7,0x36,0xf7,0x2f,0x2c,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,0xf7,0x2d,0x02,0xf7,0xf7,\r
+ 0x2f,0x01,0xf7,0xf7,0x01,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x2f,0x2d,\r
+ 0xf7,0xf7,0x35,0x35,0x35,0x27,0x2e,0x2f,0x2e,0x2a,0x27,0x25,0x23,\r
+ 0x25,0x27,0x2a,0x2c,0x02,0xf7,0xf7,0x35,0x2f,0xf7,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0xf6,0x2f,0x2e,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x02,0x03,0x06,0xf7,0x02,0x03,0x04,0x05,0xf7,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x04,0x05,0x07,0x07,0x07,\r
+ 0x07,0x05,0x03,0xf7,0x03,0x04,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x03,0x03,0x03,0x03,0x05,0xf7,0x02,0x07,0x07,0x07,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x06,0x07,0x06,0x04,0x06,0x07,0x04,\r
+ 0xf7,0x02,0xf7,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0x97,0x99,0x9a,0x9c,0x9d,0x9e,0x9d,0x9b,0x9b,0x9c,0x9a,\r
+ 0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x9f,0x97,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9d,0x9e,0x9f,0x9c,0x94,0x94,0x9f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,0x01,0x2f,0x25,0x2c,0x2f,\r
+ 0x2f,0x2d,0x2e,0x2e,0x2e,0x2e,0x2d,0x2c,0x2c,0x2b,0x2b,0x2a,0x2b,\r
+ 0x9d,0x9c,0x9c,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9a,0x97,0x98,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x98,0x9f,\r
+ 0x98,0x97,0x98,0x9a,0x9b,0x9a,0x99,0x99,0x99,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0xf7,0xf6,0xf7,0xf7,0x01,0x2e,0x01,0xf7,0xf7,0x01,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf7,0x01,0x2f,0x01,0xf6,0x2f,0x2a,0x2f,0xf7,0xf7,\r
+ 0x01,0x27,0xf7,0x2c,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x2f,0x02,0xf7,0x2c,0x01,0xf7,0xf7,0x2f,0x2e,0xf7,0xf7,0x01,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0xf7,0x2d,0x36,0x35,0x27,\r
+ 0x2f,0xf6,0x2c,0x27,0x23,0x36,0x36,0x36,0x25,0x27,0x2a,0x2f,0xf7,\r
+ 0xf7,0x25,0x27,0xf7,0x2d,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0x94,\r
+ 0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x07,0x04,0xf7,\r
+ 0x02,0x04,0x05,0x03,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x02,\r
+ 0x02,0x02,0x03,0x05,0x07,0x07,0x07,0x06,0x05,0x03,0xf7,0xf7,0x04,\r
+ 0x03,0xf7,0xf7,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,\r
+ 0x03,0x06,0x02,0xf7,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0x03,0xf7,0x03,0x04,\r
+ 0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x94,0x94,0x99,\r
+ 0x9a,0x9c,0x9e,0x9e,0x9d,0x9b,0x9b,0x9b,0x9c,0x9c,0x97,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9c,0x99,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9d,0x9e,0x9f,0x9c,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x25,0x2b,0x01,0x2f,0x26,0x2f,0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,\r
+ 0x2e,0x2d,0x2c,0x2c,0x2b,0x2a,0x2b,0x2b,0x9c,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9c,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,0x97,\r
+ 0x99,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x98,0x9f,0x99,0x97,0x98,0x99,\r
+ 0x9b,0x9b,0x9a,0x99,0x99,0x94,0x94,0x94,0x94,0x97,0xf7,0x2d,0x2e,\r
+ 0x01,0x01,0x01,0x2f,0x2f,0xf7,0xf7,0x01,0xf6,0x2f,0x2f,0x01,0xf7,\r
+ 0x2f,0x02,0x01,0xf6,0x2f,0x2a,0xf7,0xf7,0xf7,0x25,0xf7,0x2f,0x2c,\r
+ 0x2e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0x02,0xf7,0x2a,\r
+ 0xf7,0xf7,0xf7,0x2e,0x2a,0xf7,0xf7,0x01,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2d,0xf7,0xf7,0x35,0x35,0x23,0x2d,0x02,0x2e,0x26,0x36,0x36,\r
+ 0x36,0x36,0x23,0x25,0x29,0x2d,0x01,0xf7,0x2c,0x36,0xf7,0xf7,0x2c,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,\r
+ 0xf7,0x02,0x03,0xf7,0x04,0x07,0xf7,0x02,0x03,0x04,0x05,0xf7,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x05,0x07,0x07,\r
+ 0x06,0x05,0x03,0x02,0xf7,0xf7,0x02,0x05,0x02,0xf7,0xf7,0x04,0x05,\r
+ 0x05,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x03,0x03,0xf7,0x07,\r
+ 0x07,0x07,0x07,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0xf7,0x04,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x05,\r
+ 0x05,0x05,0x05,0x04,0x04,0x9c,0x97,0x94,0x98,0x9a,0x9c,0x9e,0x9e,\r
+ 0x9c,0x9a,0x9c,0x9b,0x9d,0x9a,0x99,0x9d,0x9d,0x9d,0x9d,0x9e,0x9f,\r
+ 0x97,0x99,0x9a,0x9a,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9d,0x9e,\r
+ 0x9f,0x9b,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x02,0x2f,\r
+ 0x27,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2e,0x2c,0x2c,0x2b,0x2b,\r
+ 0x2b,0x2b,0x2c,0x9c,0x9b,0x9c,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,0x97,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9b,0x97,0x9f,0x9c,0x97,0x97,0x98,0x9a,0x9b,0x9c,0x9b,\r
+ 0x94,0x94,0x97,0x97,0x98,0x02,0x2d,0x2f,0x2f,0xf6,0x01,0x02,0x2f,\r
+ 0x2c,0xf7,0xf7,0xf7,0xf6,0x2f,0xf6,0xf7,0xf7,0x2d,0x01,0x01,0x02,\r
+ 0x29,0xf7,0xf7,0xf7,0x02,0x23,0xf7,0x2c,0x2c,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x2f,0x02,0xf7,0x2a,0xf7,0xf7,0xf7,0x2d,0x27,\r
+ 0xf7,0xf7,0x02,0x01,0x02,0xf7,0xf7,0xf7,0x2e,0x2c,0xf7,0xf7,0x35,\r
+ 0x35,0x27,0x2f,0x2f,0x2a,0x23,0x36,0x35,0x36,0x36,0x25,0x28,0x2d,\r
+ 0xf6,0xf7,0xf6,0x35,0x2a,0xf7,0x28,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,0x02,0x03,0x03,0xf7,0x07,\r
+ 0x02,0xf7,0x02,0x04,0x05,0x02,0x02,0x03,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x02,0xf7,0x03,0x07,0x07,0x05,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0xf7,0xf7,0xf7,0x04,0x05,0x05,0x05,0x03,0x02,0x02,\r
+ 0x04,0x04,0x03,0x03,0x02,0x06,0xf7,0x06,0x07,0x07,0x07,0x05,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x05,0xf7,0x06,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,\r
+ 0x9b,0x9c,0x99,0x94,0x98,0x9a,0x9d,0x9e,0x9d,0x9c,0x9a,0x9c,0x9a,\r
+ 0x9d,0x99,0x9c,0x9d,0x9c,0x9d,0x9e,0x9e,0x9f,0x97,0x99,0x9a,0x9a,\r
+ 0x99,0x99,0x98,0x98,0x99,0x99,0x9a,0x9d,0x9f,0x9f,0x9b,0x94,0x94,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x28,0xf6,0x01,0x27,0x2f,0x2f,0x2f,0x2e,\r
+ 0x2e,0x2d,0x2d,0x2c,0x2c,0x2b,0x2b,0x2c,0x2c,0x2c,0x2c,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9d,0x9d,0x9c,0x99,0x97,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,0x97,\r
+ 0x9e,0x9d,0x97,0x97,0x97,0x98,0x99,0x99,0x94,0x94,0x97,0x98,0x99,\r
+ 0x2f,0x2f,0x2d,0x2d,0xf6,0x01,0x01,0xf6,0x2d,0x2a,0xf7,0xf7,0x01,\r
+ 0xf6,0xf6,0x02,0xf7,0xf7,0x2f,0x01,0x02,0x02,0x28,0xf7,0xf7,0xf7,\r
+ 0x23,0xf7,0x02,0x2c,0x2d,0x02,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,\r
+ 0x02,0xf7,0x2a,0xf7,0xf7,0xf7,0x2f,0x23,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2e,0x2d,0xf7,0x2a,0x36,0x35,0x27,0x2f,0x2d,0x25,\r
+ 0x36,0x35,0x36,0x36,0x25,0x2a,0x2f,0x02,0x01,0x02,0x35,0x36,0xf7,\r
+ 0xf7,0x25,0xf7,0xf6,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x94,0x94,\r
+ 0x94,0x94,0x02,0x03,0x04,0xf7,0x04,0x04,0xf7,0x02,0x04,0x04,0x04,\r
+ 0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,\r
+ 0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0x06,\r
+ 0x07,0x05,0x02,0xf7,0xf7,0x02,0x03,0x04,0x05,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x05,0x05,0x05,0x04,0x02,0x02,0x03,0x04,0x04,0x03,0x02,\r
+ 0x05,0xf7,0x05,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x06,0x07,0x07,0x07,0x03,0xf7,0x06,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x9d,0x9b,0x9a,0x99,0x94,\r
+ 0x99,0x9b,0x9d,0x9e,0x9d,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9e,0x99,0x9a,0x9a,0x9a,0x99,0x98,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,0x94,0x97,0x9f,0xf7,0xf7,0xf7,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x26,0x2e,0x01,0x2a,0x2c,0x2f,0x2f,0x2e,0x2d,0x2c,0x2c,0x2c,0x2b,\r
+ 0x2b,0x2c,0x2c,0x2d,0x2d,0x2e,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x99,\r
+ 0x97,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9c,0x99,0x99,0x9e,0x9a,0x94,\r
+ 0x97,0x97,0x97,0x99,0x99,0x9a,0x9b,0x9b,0x2e,0x2d,0x2b,0x2c,0x27,\r
+ 0x2e,0xf7,0xf7,0x2f,0x2c,0x2a,0xf7,0xf7,0x01,0xf6,0xf6,0x01,0xf7,\r
+ 0x2f,0xf6,0x01,0x01,0x2a,0xf7,0xf7,0xf7,0x2f,0x36,0xf7,0x2c,0x2b,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x02,0xf7,0x2a,0xf7,0xf7,\r
+ 0xf7,0x2f,0x36,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,\r
+ 0xf7,0x36,0x35,0x35,0x23,0x2a,0x27,0x36,0x35,0x35,0x35,0x36,0x27,\r
+ 0x2e,0xf6,0xf6,0x2f,0x36,0x35,0x27,0xf7,0x2a,0x2c,0xf6,0x2e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x94,0x94,0x94,0x97,0x03,0x04,0x03,\r
+ 0xf7,0x06,0xf7,0xf7,0x03,0x04,0x05,0xf7,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x07,0x06,0x02,0xf7,0x02,0x04,\r
+ 0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,0x05,\r
+ 0x04,0x02,0x02,0x02,0x04,0x04,0x04,0x02,0x02,0x02,0x03,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0x02,0x04,0x03,0x02,0xf7,0x02,0x07,0x07,0x07,\r
+ 0x02,0xf7,0x03,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x9e,0x9d,0x9a,0x99,0x99,0x94,0x9a,0x9b,0x9e,0x9e,\r
+ 0x9d,0x9a,0x9b,0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,\r
+ 0x99,0x99,0x9a,0x9a,0x99,0x98,0x97,0x97,0x98,0x99,0x99,0x9a,0x9d,\r
+ 0x9e,0x9f,0x9b,0x94,0x97,0x9f,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2a,0x01,0x2f,0x27,\r
+ 0xf6,0x2f,0x2f,0x2c,0x2c,0x2c,0x2c,0x2b,0x2c,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x98,0x97,0x99,0x99,0x99,\r
+ 0x99,0x9a,0x99,0x9c,0x9a,0x97,0x9e,0x9e,0x9b,0x97,0x97,0x99,0x99,\r
+ 0x99,0x9a,0x9c,0x2d,0x2a,0x28,0x2f,0xf7,0x2d,0x27,0xf7,0xf7,0x2f,\r
+ 0x2a,0x2c,0xf7,0xf7,0x01,0xf6,0x02,0xf7,0xf7,0x2e,0x01,0x01,0x01,\r
+ 0x26,0xf7,0xf7,0xf7,0x36,0xf7,0x01,0x2a,0x2c,0xf6,0xf7,0xf7,0xf7,\r
+ 0x02,0x2f,0x2f,0xf6,0xf7,0x2a,0xf7,0xf7,0xf7,0x02,0x36,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0x36,0x35,0x35,0x35,\r
+ 0x23,0x35,0x36,0x25,0x23,0x36,0x36,0x23,0x28,0x2a,0x27,0x36,0x35,\r
+ 0x35,0xf7,0xf7,0x25,0x2f,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x94,0x94,0x97,0x97,0x99,0x04,0x04,0xf7,0x05,0xf7,0xf7,0x02,0x04,\r
+ 0x05,0x02,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x02,\r
+ 0x02,0x04,0x07,0x04,0xf7,0x02,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,0x05,0x05,0x03,0x02,0x02,0x04,\r
+ 0x05,0x05,0x03,0xf7,0x05,0xf7,0x07,0x07,0x07,0x07,0xf7,0xf7,0x03,\r
+ 0x06,0x06,0x05,0x02,0xf7,0x03,0x07,0x07,0x02,0xf7,0x02,0x05,0x04,\r
+ 0x03,0x04,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x99,0x9e,\r
+ 0x9d,0x9a,0x99,0x97,0x97,0x9a,0x9d,0x9e,0x9e,0x9c,0x9a,0x9c,0x9b,\r
+ 0x9d,0x9a,0x9a,0x9d,0x9d,0x9d,0x9d,0x9e,0x9f,0x94,0x99,0x9a,0x9a,\r
+ 0x99,0x98,0x97,0x97,0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,0x94,\r
+ 0x97,0x9f,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x27,0x2f,0x01,0x28,0x2f,0xf6,0x2f,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2b,0x2c,0x2f,0x2f,0x2f,0x2f,0x2f,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9d,0x9d,0x9d,0x9b,0x98,0x97,0x99,0x98,0x98,0x98,0x9b,0x99,0x9b,\r
+ 0x9b,0x99,0x99,0x9f,0x9f,0x9f,0x94,0x94,0x94,0x97,0x9a,0x2c,0x28,\r
+ 0x27,0xf7,0xf7,0xf7,0xf7,0x23,0xf7,0xf7,0x2f,0x2c,0x2f,0xf7,0xf7,\r
+ 0x02,0xf6,0x01,0xf7,0xf6,0x2f,0x01,0x01,0x2a,0xf7,0xf7,0xf7,0x2a,\r
+ 0x36,0xf7,0x2c,0x2a,0x2e,0x01,0x01,0x01,0x02,0x2f,0x2f,0xf6,0xf7,\r
+ 0x2a,0xf7,0xf7,0xf7,0x01,0x36,0x02,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2e,0xf7,0xf7,0x36,0x35,0x35,0x35,0x35,0x25,0x2d,0x02,0x2e,\r
+ 0x2a,0x23,0x35,0x36,0x35,0x35,0x35,0x36,0x2f,0xf7,0xf6,0x2c,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x98,0x99,0x9e,\r
+ 0x04,0xf7,0x04,0x02,0xf7,0x02,0x04,0x05,0x04,0xf7,0x02,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x04,0x03,0x03,0x03,0x02,0x02,0x06,0x07,0x02,0xf7,\r
+ 0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x05,0x05,0x05,0x04,0x02,0x02,0x04,0x05,0x05,0x04,0xf7,0x06,\r
+ 0xf7,0x07,0x07,0x07,0x07,0x02,0xf7,0x04,0x07,0x06,0x06,0x06,0x03,\r
+ 0xf7,0x05,0x06,0x02,0x02,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0xf7,0xf7,0x97,0x97,0x9d,0x9c,0x99,0x99,0x94,\r
+ 0x98,0x9a,0x9e,0x9e,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x98,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9f,0x98,0x99,0x9a,0x9a,0x98,0x98,0x98,0x97,\r
+ 0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,0x94,0x97,0x9f,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x2a,0x02,0x2f,0x28,0xf6,0x2f,0x2d,0x2a,0x2a,0x2b,0x2a,0x2c,0x2f,\r
+ 0xf6,0xf6,0x2f,0x2f,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9a,\r
+ 0x97,0x97,0x98,0x98,0x97,0x98,0x9a,0x9a,0x9a,0x9c,0x9b,0x9a,0x98,\r
+ 0x99,0x9a,0x9a,0x9c,0x9f,0x03,0x28,0x27,0x27,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x23,0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x2e,0x02,0x01,0xf7,0x25,0xf7,0xf7,0x01,0x35,0x2f,0xf7,0x2a,0x2a,\r
+ 0x2f,0x01,0x01,0xf6,0x2f,0x2f,0xf6,0xf7,0x29,0xf7,0xf7,0xf7,0xf7,\r
+ 0x35,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x01,0xf7,0x36,\r
+ 0x35,0x35,0x35,0x26,0x01,0xf7,0xf7,0xf7,0xf7,0x2e,0x23,0x35,0x35,\r
+ 0x35,0x35,0x23,0xf7,0xf7,0x2c,0x2e,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x97,0x98,0x9a,0x9e,0x9d,0xf7,0x03,0x02,0xf7,0x02,\r
+ 0x04,0x04,0x05,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,\r
+ 0x03,0x03,0x03,0x03,0x07,0x06,0xf7,0x02,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x05,0x04,\r
+ 0x02,0x02,0x03,0x05,0x05,0x05,0xf7,0x03,0xf7,0x06,0x07,0x07,0x07,\r
+ 0x03,0xf7,0x05,0x06,0x06,0x06,0x06,0x05,0x03,0xf7,0x07,0x03,0x06,\r
+ 0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x05,0x06,0x06,0x05,\r
+ 0x04,0x97,0x94,0x97,0x9c,0x9b,0x98,0x9a,0x94,0x9a,0x9c,0x9f,0x9f,\r
+ 0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,\r
+ 0x9b,0x99,0x99,0x9b,0x99,0x98,0x98,0x98,0x97,0x97,0x98,0x99,0x9a,\r
+ 0x9d,0x9e,0x9f,0x9b,0x94,0x97,0x27,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x26,0x2d,0x01,0x2a,0x2f,\r
+ 0xf6,0x2f,0x2b,0x2a,0x2a,0x2a,0x2b,0x2f,0x02,0xf6,0x2f,0x2f,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x98,0x98,\r
+ 0x98,0x99,0x9a,0x9a,0x9b,0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9d,0x2a,0x26,0x36,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0xf7,0xf7,\r
+ 0x2f,0x2c,0xf7,0xf7,0x01,0xf6,0x01,0xf7,0x01,0x2f,0x01,0x01,0x2c,\r
+ 0xf7,0xf7,0xf7,0x27,0x35,0xf7,0x2c,0x2a,0x2c,0x2f,0x02,0x2f,0x2e,\r
+ 0x2f,0x02,0xf7,0x29,0xf7,0x01,0xf7,0xf7,0x35,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x2e,0x2d,0xf7,0x35,0x35,0x35,0x25,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x36,0x35,0x35,0x35,0xf7,0xf7,0x2a,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x9a,\r
+ 0x9f,0x9d,0x94,0x03,0x03,0xf7,0x02,0x04,0x04,0x05,0xf7,0x02,0x05,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x07,\r
+ 0x06,0xf7,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x05,0x05,0x04,0x05,0x03,0x02,0x03,0x05,0x05,\r
+ 0x05,0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x04,0xf7,0x05,0x06,0x06,\r
+ 0x06,0x05,0x05,0x04,0x02,0x02,0x07,0x06,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x06,0x06,0x03,0x02,0x02,0x03,0x9f,0x99,0x94,0x97,\r
+ 0x9d,0x9a,0x98,0x97,0x97,0x9a,0x9d,0x9f,0x9e,0x9d,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9b,0x97,0x9d,0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x98,0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,\r
+ 0x94,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x28,0x2f,0x01,0x27,0xf6,0xf6,0x2e,0x2a,0x2a,\r
+ 0x2a,0x2a,0x2e,0x02,0x02,0x2f,0x2f,0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9a,0x98,0x97,0x98,0x99,0x99,0x9a,0x9a,0x9b,\r
+ 0x9c,0x9d,0x9d,0x9d,0x97,0x97,0x97,0x97,0x94,0xf7,0xf7,0xf7,0x27,\r
+ 0x36,0x2f,0xf7,0xf7,0xf7,0xf7,0x27,0xf7,0x01,0xf6,0x2e,0xf7,0xf7,\r
+ 0xf6,0xf6,0xf7,0xf7,0x2e,0xf6,0x01,0xf7,0x25,0xf7,0xf7,0x2f,0x35,\r
+ 0x2e,0xf7,0x2a,0x2a,0x2e,0x2f,0x2f,0x2e,0x2f,0x02,0xf7,0x29,0xf7,\r
+ 0x01,0xf7,0xf7,0x35,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2d,\r
+ 0x28,0xf7,0x36,0x35,0x36,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2a,0x35,0x35,0x2f,0xf7,0x28,0x2e,0xf6,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9a,0x9f,0x9c,0x94,0x9c,0x02,0xf7,\r
+ 0x02,0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0xf7,0x04,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,\r
+ 0x05,0x05,0x05,0x04,0x03,0x03,0x04,0x04,0x05,0x03,0xf7,0x04,0x03,\r
+ 0x07,0x07,0x07,0x06,0xf7,0x05,0x06,0x06,0x05,0x05,0x05,0x04,0x04,\r
+ 0xf7,0x05,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x94,0x9b,0x9a,0x94,0x97,0x9d,0x99,0x99,0x94,\r
+ 0x99,0x9b,0x9f,0x9f,0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,0x9a,0x9a,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9e,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x98,0x99,0x99,\r
+ 0x98,0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9a,0xf7,0x2f,0x27,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,\r
+ 0x2b,0x01,0x2f,0x2a,0xf6,0x2f,0x2b,0x2a,0x2a,0x2a,0x2c,0x2f,0x01,\r
+ 0xf6,0x2f,0x9a,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9b,0x98,0x97,0x98,0x9a,0x9b,0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x94,\r
+ 0x94,0x97,0x97,0x98,0xf7,0x01,0x01,0xf7,0xf7,0x23,0x27,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2f,0x01,0x01,0x2f,0xf6,0xf7,0x01,0x2f,0x01,0xf7,0x01,\r
+ 0x2f,0x01,0xf7,0x2c,0xf7,0xf7,0xf7,0x36,0x35,0xf7,0x2c,0x2a,0x2b,\r
+ 0x2d,0x2e,0x2d,0x2f,0x01,0xf7,0x28,0xf7,0x01,0xf7,0xf7,0x36,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0x2e,0x27,0xf7,0x23,0x35,0xf6,\r
+ 0xf7,0xf7,0x2f,0x27,0x25,0x28,0x2f,0xf7,0xf7,0xf7,0x36,0x36,0xf7,\r
+ 0x27,0x2d,0xf7,0xf7,0x2f,0x25,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x9f,0x9a,0x94,0x9e,0x97,0xf7,0x02,0x04,0x04,0x05,0xf7,0x02,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x02,0x03,0x02,0xf7,0x02,0x04,0x04,0x04,0x04,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x05,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0xf7,0x06,0x02,0x07,0x07,0x07,0x07,0xf7,\r
+ 0x04,0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x03,0xf7,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x05,0x04,0xf7,0xf7,0xf7,0xf7,0x04,0x05,0x04,0x99,\r
+ 0x94,0x9a,0x99,0x94,0x99,0x9c,0x98,0x9a,0x94,0x9a,0x9c,0x9f,0x9f,\r
+ 0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,\r
+ 0x9e,0x98,0x99,0x9b,0x99,0x98,0x99,0x9a,0x9a,0x98,0x97,0x98,0x99,\r
+ 0x9a,0x9d,0x9e,0x9f,0x2e,0xf7,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x2d,0x01,0x2a,0x2f,\r
+ 0xf6,0x2f,0x2a,0x2a,0x2a,0x2a,0x2f,0x01,0x02,0x2f,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9b,0x99,0x97,0x97,\r
+ 0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x97,0x97,0x97,0x98,0x99,0xf7,\r
+ 0x01,0xf6,0x2f,0xf6,0xf7,0x29,0x2a,0xf7,0xf7,0xf7,0x27,0x02,0x02,\r
+ 0x01,0x2f,0x01,0xf7,0xf6,0xf6,0xf7,0xf7,0x2e,0x02,0x01,0xf7,0x25,\r
+ 0xf7,0xf7,0x2b,0x35,0xf6,0xf7,0x2a,0x2a,0x2c,0x2c,0x2c,0x2f,0x01,\r
+ 0xf7,0x28,0xf7,0x02,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0xf7,0x2c,\r
+ 0xf7,0xf7,0x2f,0x29,0x01,0x27,0x27,0xf7,0xf7,0x28,0x23,0x36,0x36,\r
+ 0x23,0x25,0x28,0x01,0xf7,0x2a,0x26,0x26,0x2c,0x2f,0xf7,0xf7,0x36,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x99,0x97,0x9e,0x94,\r
+ 0x94,0x02,0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x05,0x04,0x02,0x02,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x02,\r
+ 0x02,0x03,0xf7,0x02,0x04,0x04,0x05,0x05,0x04,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0xf7,0x04,0xf7,0x07,0x07,0x07,0x07,0xf7,0x02,0x06,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x03,0x02,0x03,0x05,0x05,0x04,0x05,0x05,0x05,0x03,\r
+ 0xf7,0xf7,0x02,0x06,0x07,0x07,0x07,0x03,0x9b,0x94,0x9b,0x97,0x94,\r
+ 0x9d,0x9a,0x98,0x97,0x97,0x9a,0x9e,0x9f,0x9f,0x9e,0x9b,0x9a,0x9c,\r
+ 0x9b,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x99,0x99,0x99,0x9b,\r
+ 0x99,0x98,0x9a,0x9b,0x9a,0x99,0x97,0x98,0x99,0x9a,0x9d,0x9f,0x2a,\r
+ 0x2f,0xf7,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x28,0x2f,0x01,0x27,0xf6,0xf6,0x2d,0x29,0x29,\r
+ 0x2a,0x2a,0xf6,0x01,0x2f,0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x9a,0x98,0x97,0x9a,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9c,0x97,0x97,0x97,0x98,0x99,0xf7,0x01,0x02,0x2f,0x2f,0x2f,\r
+ 0xf7,0x2a,0x2f,0xf7,0xf7,0xf7,0x2a,0x2f,0x02,0x01,0x2e,0xf7,0x01,\r
+ 0x2f,0x01,0xf7,0x2f,0xf6,0x01,0x01,0x28,0xf7,0xf7,0xf7,0x36,0x36,\r
+ 0xf7,0x2a,0x2a,0x2a,0x2c,0x2c,0x2e,0xf7,0xf7,0x28,0xf7,0xf6,0xf7,\r
+ 0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0x01,0x28,0xf7,0xf7,0x2f,0x2a,0x2a,\r
+ 0x36,0xf7,0xf7,0x29,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x2a,0xf7,\r
+ 0xf7,0x23,0x29,0x01,0xf7,0xf7,0x2c,0xf7,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2e,0xf7,0x9a,0x9f,0x94,0x94,0x99,0x04,0x05,0x05,0xf7,\r
+ 0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x06,0x02,0x02,0x03,\r
+ 0x04,0x04,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xf7,0x03,0xf7,0x07,0x07,\r
+ 0x07,0x07,0x03,0xf7,0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x03,0x03,\r
+ 0xf7,0x05,0x05,0x05,0x05,0x06,0x04,0xf7,0x02,0x02,0x06,0x07,0x07,\r
+ 0x07,0x07,0xf7,0x02,0x9b,0x94,0x9e,0x94,0x97,0x9d,0x99,0x99,0x94,\r
+ 0x99,0x9c,0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9c,0x9b,0x97,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x99,0x9b,0x9c,\r
+ 0x9c,0x99,0x97,0x98,0x99,0x9a,0x9d,0x2a,0x2a,0x2f,0xf7,0x2f,0x26,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x2a,0x02,0x2f,0x29,0x02,0xf6,0x2c,0x29,0x29,0x29,0x2d,0x01,0xf6,\r
+ 0x99,0x9a,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9b,0x99,0x97,0x99,0x9c,0x9c,0x9c,0x9c,0x97,0x97,0x97,\r
+ 0x98,0x99,0x01,0x02,0x02,0x02,0x2f,0x2f,0x2f,0xf7,0x23,0x01,0xf7,\r
+ 0x2e,0x2c,0x2e,0x2f,0xf7,0x2f,0x2d,0x2f,0x2f,0x2f,0xf7,0x2f,0xf6,\r
+ 0x01,0x01,0x02,0x2d,0xf7,0xf7,0x26,0x35,0xf7,0x2f,0x2a,0x2a,0x2b,\r
+ 0x2c,0x2e,0xf7,0xf7,0x28,0xf7,0xf6,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,\r
+ 0xf7,0x01,0x25,0xf7,0xf7,0x2f,0x2a,0x25,0x36,0xf7,0x2f,0x28,0x27,\r
+ 0x2a,0x2f,0xf6,0x2f,0x2b,0x2a,0x2c,0x2f,0xf7,0x28,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0x2f,0x03,\r
+ 0x94,0x94,0x99,0x9d,0x05,0x04,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x07,0x07,\r
+ 0x07,0x07,0x05,0xf7,0x06,0x02,0x02,0x02,0x03,0x04,0x04,0x04,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0xf7,0x02,0xf7,0x06,0x07,0x07,0x07,0x05,0xf7,0x05,\r
+ 0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x06,0x06,0x06,\r
+ 0x04,0x02,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0x02,\r
+ 0x99,0x94,0x9c,0x94,0x9a,0x9b,0x98,0x99,0x94,0x9a,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,0x9a,0x9a,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9c,0x9d,0x9c,0x99,0x97,0x98,\r
+ 0x99,0x9a,0x2a,0x2a,0x2a,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,0x01,0x2e,0x2c,\r
+ 0x02,0x2f,0x2a,0x29,0x29,0x2a,0x2f,0x01,0x98,0x9a,0x9b,0x9c,0x9c,\r
+ 0x9c,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9b,0x9a,\r
+ 0x99,0x99,0x9b,0x9c,0x9c,0x97,0x97,0x97,0x99,0x9a,0xf6,0xf6,0xf6,\r
+ 0x02,0x02,0xf6,0x2f,0x2f,0xf7,0x36,0x2a,0x27,0x2a,0x2d,0x2e,0x2e,\r
+ 0xf7,0x2f,0x2e,0x2f,0x2e,0x2f,0x2f,0x2f,0xf7,0x02,0x01,0x25,0xf7,\r
+ 0xf7,0x2e,0x35,0xf6,0xf7,0x2a,0x2a,0x2a,0x2c,0x2e,0xf7,0xf6,0x27,\r
+ 0xf7,0x2f,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0x01,0x23,0xf7,0xf7,\r
+ 0x2f,0x2d,0x25,0x28,0xf7,0x2c,0x2a,0x2e,0x01,0xf7,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0xf6,0xf7,0x2d,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x36,0x94,0x97,0x99,0x9d,0x9f,0x04,\r
+ 0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x05,0xf7,0x02,\r
+ 0x05,0x02,0x02,0x03,0x03,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0xf7,0xf7,\r
+ 0xf7,0x05,0x07,0x07,0x07,0x07,0xf7,0x02,0x06,0x06,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x03,0xf7,0x05,0x07,0x05,0x03,0x02,0x03,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x03,0x94,0x99,0x97,0x94,\r
+ 0x9d,0x9a,0x99,0x94,0x98,0x9b,0x9f,0x9f,0x9f,0x9e,0x9c,0x9a,0x9c,\r
+ 0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x9e,0x98,0x99,0x9b,\r
+ 0x99,0x98,0x9b,0x9d,0x9e,0x9c,0x99,0x97,0x98,0x99,0x2e,0x2a,0x2a,\r
+ 0x2a,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x27,0x2e,0x01,0x2a,0x2f,0xf6,0x2f,0x2a,0x29,\r
+ 0x2a,0x2a,0x02,0x94,0x99,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x97,0x97,0x97,0x99,0x9a,0x2f,0xf6,0x02,0x01,0x01,0x01,0x02,0x2f,\r
+ 0x2f,0xf7,0x23,0x27,0x2a,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2d,0x2f,0x01,0x02,0x02,0x27,0xf7,0xf7,0xf7,0x36,0x25,0xf7,\r
+ 0x2c,0x2a,0x2a,0x2c,0x2e,0xf7,0x2f,0x27,0xf7,0x2f,0xf7,0xf7,0x36,\r
+ 0x2e,0xf7,0xf7,0xf7,0x01,0x23,0xf7,0xf7,0x2f,0xf6,0x27,0x02,0x01,\r
+ 0x2c,0x2d,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,\r
+ 0x36,0x2f,0x94,0x99,0x9d,0x9f,0x9b,0xf7,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x03,\r
+ 0xf7,0xf7,0x05,0x07,0x07,0x05,0xf7,0x02,0x06,0x03,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x04,\r
+ 0x04,0x04,0x03,0x03,0x03,0x04,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,\r
+ 0x07,0x02,0xf7,0x04,0x06,0x06,0x06,0x05,0x05,0x04,0x04,0x03,0xf7,\r
+ 0x03,0x07,0x06,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x02,0xf7,0xf7,0xf7,0x9e,0x94,0x9f,0x94,0x97,0x9d,0x99,0x9a,0x94,\r
+ 0x9a,0x9d,0x9f,0x03,0x9f,0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9f,0x9a,0x99,0x99,0x9a,0x99,0x99,0x9c,0x9e,\r
+ 0x9e,0x9c,0x99,0x97,0x98,0x2f,0x2e,0x2a,0x2a,0x2a,0x2f,0xf7,0x2f,\r
+ 0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x27,0x2f,0x01,0x28,0xf6,0xf6,0x2d,0x29,0x2a,0x29,0x2c,0x94,0x97,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9d,0x9c,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9d,0x9d,0x9a,0x99,0x99,0x9a,0x9a,0x9a,0x97,0x97,0x97,0x99,0x9a,\r
+ 0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0x01,0x02,0xf6,0xf7,0x27,0x27,0x2c,\r
+ 0x2e,0x2f,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,\r
+ 0x2f,0x2b,0xf7,0xf7,0xf7,0x27,0x36,0xf7,0x2f,0x2a,0x2a,0x2c,0x2e,\r
+ 0xf7,0x2f,0x27,0xf7,0x2f,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0x01,\r
+ 0x36,0xf7,0xf7,0x2f,0xf7,0x27,0xf7,0x2f,0x2e,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2d,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x27,0xf7,0x9a,0x9d,0x9e,\r
+ 0x9c,0x97,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,\r
+ 0xf7,0xf7,0xf7,0x02,0x05,0x06,0x06,0x06,0x04,0xf7,0xf7,0x07,0x07,\r
+ 0x06,0x02,0xf7,0x03,0x06,0x02,0x02,0x02,0x03,0x03,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x05,0x04,0x04,0x03,0x04,0x04,\r
+ 0x03,0xf7,0x02,0xf7,0x05,0x07,0x06,0x07,0x07,0x05,0xf7,0xf7,0x05,\r
+ 0x06,0x06,0x06,0x05,0x05,0x04,0x03,0xf7,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0xf7,0xf7,0x01,\r
+ 0x9a,0x94,0x9a,0x94,0x9b,0x9c,0x99,0x98,0x97,0x9a,0x9f,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x9a,0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9c,\r
+ 0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9e,0x9f,0x9e,0x9d,0x99,0x97,\r
+ 0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x29,0x2f,0x02,0x28,\r
+ 0x02,0xf6,0x2b,0x29,0x2a,0x2a,0x99,0x94,0x98,0x9a,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x9a,0x9a,0x9b,0x9d,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x97,0x97,0x97,0x99,0x9a,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x01,0xf7,0x28,0x02,0x2e,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2d,0x2e,0xf7,0xf7,\r
+ 0x2e,0x35,0xf7,0xf6,0x2a,0x2a,0x2c,0x2e,0xf7,0x2c,0x27,0xf7,0x2f,\r
+ 0xf7,0xf7,0x23,0x2e,0xf7,0xf7,0xf7,0x01,0x36,0xf7,0xf7,0x2f,0xf7,\r
+ 0x28,0xf7,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0x25,0xf7,0xf7,0x9b,0x9d,0x9e,0x94,0x97,0x05,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0x03,0x06,\r
+ 0x06,0x06,0x06,0x06,0x04,0xf7,0x03,0x07,0x07,0x02,0xf7,0xf7,0x06,\r
+ 0x04,0x02,0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0xf7,0xf7,0x02,0xf7,0x05,\r
+ 0x07,0x05,0x06,0x07,0x07,0x02,0xf7,0xf7,0x04,0x05,0x06,0x05,0x05,\r
+ 0x04,0x02,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0x03,0x03,0xf7,0xf7,0x03,0x94,0x9b,0x97,0x97,\r
+ 0x9e,0x9b,0x9a,0x94,0x99,0x9c,0x9f,0x03,0x9f,0x9f,0x9d,0x9a,0x9b,\r
+ 0x9b,0x9d,0x9a,0x9a,0x9d,0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,\r
+ 0x99,0x98,0x9b,0x9e,0x9f,0x9f,0x9e,0x99,0x2f,0x2f,0x2f,0x2d,0x2a,\r
+ 0x2a,0x2a,0x2f,0xf7,0x2e,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x2a,0x01,0x2f,0x2a,0x02,0xf6,0x2a,0x2a,\r
+ 0x2a,0x9e,0x97,0x94,0x99,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9c,\r
+ 0x9c,0x9b,0x99,0x9a,0x9d,0x9d,0x9b,0x9a,0x9a,0x9a,0x9a,0x97,0x97,\r
+ 0x98,0x99,0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,\r
+ 0xf7,0x2c,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2e,0x2e,0x2c,0xf7,0xf7,0x01,0x35,0xf7,0xf7,0x2a,\r
+ 0x2a,0x2c,0x2f,0xf7,0x2a,0x27,0x01,0x2f,0xf7,0xf7,0x23,0x2e,0xf7,\r
+ 0xf7,0xf7,0x01,0x36,0xf7,0xf7,0xf6,0xf7,0x29,0xf7,0xf6,0x2f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0x2c,0x2c,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0xf7,0xf7,\r
+ 0x9c,0x9f,0x94,0x97,0x9d,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0xf7,0xf7,0x04,0x06,0x06,0x06,0x06,0x06,0x05,\r
+ 0x04,0xf7,0x06,0x07,0x03,0x02,0xf7,0x02,0x06,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0x04,0xf7,0x06,0x07,0x04,0x04,0x07,0x07,\r
+ 0x05,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,0xf7,0xf7,0xf7,0x02,0x05,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x03,\r
+ 0x03,0x01,0xf7,0xf7,0x9d,0x94,0x9f,0x94,0x98,0x9e,0x9c,0x9b,0x94,\r
+ 0x9a,0x9d,0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x9c,0x9a,0x9d,0x99,0x9c,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9f,0x9f,0x98,0x99,0x9b,0x99,0x99,0x9d,0x9f,\r
+ 0x9f,0x9f,0x9e,0x2e,0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,0xf7,\r
+ 0x2e,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x25,0x2c,0x01,0x2c,0x2e,0x02,0x2f,0x2a,0x2a,0x9e,0x9d,0x94,0x97,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9b,0x99,0x99,0x9c,\r
+ 0x9d,0x9c,0x9a,0x9a,0x9a,0x9a,0x97,0x97,0x98,0x99,0x9b,0x2f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,\r
+ 0x2c,0x2a,0xf7,0xf7,0x35,0xf7,0xf7,0x2c,0x2a,0x2c,0x2f,0xf7,0x2a,\r
+ 0x27,0x01,0x2f,0xf7,0xf7,0x25,0x2f,0xf7,0xf7,0xf7,0xf7,0x36,0xf7,\r
+ 0xf7,0x02,0xf7,0x2a,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2a,0x2c,0x2d,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0x2f,0x9d,0x99,0x97,0x98,0xf7,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,\r
+ 0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,\r
+ 0xf7,0x04,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x02,0x02,0x07,0x05,\r
+ 0x02,0xf7,0xf7,0x04,0x06,0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0x07,0x06,0x03,0x03,0x05,0x07,0x07,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x01,0x02,0x01,0xf7,0xf7,0x01,\r
+ 0x9a,0x94,0x9c,0x97,0x9c,0x9e,0x9d,0x97,0x97,0x9b,0x9f,0x9f,0x03,\r
+ 0x9f,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9f,0x9a,0x99,0x99,0x9a,0x98,0x99,0x9e,0x9f,0x9f,0x9f,0x2a,0x2d,\r
+ 0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,0xf7,0x2c,0x25,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x2d,0x01,0x2a,\r
+ 0x2f,0x02,0x2f,0x2a,0x9e,0x9e,0x9b,0x94,0x99,0x9a,0x9b,0x9c,0x9c,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9b,0x99,0x99,0x9b,0x9d,0x9c,0x9a,0x9a,0x9a,\r
+ 0x9a,0x97,0x97,0x98,0x9a,0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf6,0x36,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x28,0x01,0xf7,0x36,\r
+ 0xf7,0x01,0x2b,0x2b,0x2c,0x2f,0xf7,0x28,0x27,0x02,0x2f,0xf7,0xf7,\r
+ 0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0x35,0xf7,0xf7,0x01,0xf7,0x2a,0xf7,\r
+ 0x01,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2e,0x2a,0x2c,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0x02,\r
+ 0xf7,0xf7,0x2f,0x9f,0x94,0x97,0x03,0x01,0x07,0x07,0x07,0x07,0x06,\r
+ 0x05,0x05,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,0x03,0x06,0x06,0x06,\r
+ 0x06,0x05,0x05,0x05,0x04,0xf7,0x06,0x07,0x03,0x02,0xf7,0x02,0x06,\r
+ 0x05,0x02,0x02,0x02,0x02,0xf7,0xf7,0x02,0x04,0x05,0x05,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0xf7,0x03,0x07,0x04,0x02,\r
+ 0x03,0x04,0x06,0x07,0x07,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x97,0x9b,0x98,0x97,\r
+ 0x9e,0x9f,0x9e,0x94,0x99,0x9c,0x9f,0x03,0x9f,0x9f,0x9e,0x9b,0x9a,\r
+ 0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x97,0x99,0x9a,\r
+ 0x9a,0x98,0x9a,0x9f,0x9f,0x9f,0x28,0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,\r
+ 0x2a,0x2a,0x2a,0x2f,0xf7,0x2d,0x25,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x27,0x2f,0x01,0x28,0x02,0xf6,0x2c,0x9f,\r
+ 0x9e,0x9e,0x98,0x94,0x99,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x99,0x99,0x9a,0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x97,0x97,0x98,0x9a,\r
+ 0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,0xf6,0xf7,0xf7,\r
+ 0x01,0xf7,0xf7,0xf7,0x2c,0x25,0xf7,0x01,0xf7,0xf7,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2d,0x2a,0x29,0x2f,0x23,0xf7,0x2f,0x2b,0x2b,0x2c,\r
+ 0x2f,0xf7,0x28,0x27,0xf6,0x2f,0xf7,0xf7,0x27,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0x35,0xf7,0xf7,0xf7,0xf7,0x2c,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0xf6,0x2b,\r
+ 0x2a,0x2c,0x2d,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x99,0x94,\r
+ 0x98,0xf7,0x01,0x07,0x07,0x07,0x06,0x05,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x04,0xf7,0xf7,0xf7,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x05,\r
+ 0x02,0x02,0x07,0x05,0x02,0x02,0xf7,0x02,0x06,0x05,0x02,0x02,0x02,\r
+ 0x02,0x03,0x04,0x06,0x05,0x04,0x04,0x05,0x05,0x03,0x02,0x02,0x02,\r
+ 0x03,0x03,0xf7,0xf7,0x06,0x07,0x02,0x02,0x03,0x03,0x04,0x06,0x07,\r
+ 0x07,0x05,0x03,0x03,0x02,0x03,0x04,0x04,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x9e,0x94,0x03,0x97,0x98,0x9e,0x9f,0x9e,0x94,\r
+ 0x9a,0x9d,0x9f,0x03,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9a,0x98,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x99,0x98,0x9d,0x9f,\r
+ 0x9f,0x27,0x28,0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,\r
+ 0xf7,0x2d,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x28,0x2f,0x01,0x28,0x02,0xf6,0x9e,0x9e,0x9e,0x9e,0x94,0x97,\r
+ 0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9a,0x98,0x9a,0x9d,0x9c,\r
+ 0x9b,0x9a,0x9a,0x9a,0x98,0x98,0x99,0x9a,0x9b,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0x01,0xf7,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2a,\r
+ 0x26,0x28,0x2c,0xf7,0x2e,0x2b,0x2b,0x2c,0x2f,0xf7,0x27,0x27,0x2f,\r
+ 0x2f,0xf7,0xf7,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0x36,0x02,0xf7,0xf7,\r
+ 0xf7,0x2c,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf6,0x2a,0x2a,0x2c,0x2d,0x2f,0x2f,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0x2e,0xf7,0xf7,0x2f,0x2c,0x94,0x97,0x03,0xf7,0xf7,0x07,0x07,\r
+ 0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x06,\r
+ 0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,\r
+ 0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0xf7,0x07,0x07,0x03,\r
+ 0x02,0xf7,0xf7,0x03,0x06,0x06,0x04,0x03,0x04,0x05,0x06,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0x04,0x07,\r
+ 0x05,0xf7,0x02,0x03,0x03,0x03,0x05,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0x97,0x97,0x02,0x98,0x99,0x9e,0x9e,0x9a,0x97,0x9a,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9d,0x9a,0x9c,0x9b,0x9d,0x99,0x9b,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9e,0x9f,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,0x27,0x27,0x27,0x2a,\r
+ 0x2d,0x2f,0x2f,0x2f,0x2e,0x2a,0x2a,0x2a,0x2f,0x01,0x2c,0x25,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x02,0xf6,\r
+ 0x2a,0x02,0x97,0x9e,0x9e,0x9e,0x9c,0x94,0x98,0x9a,0x9b,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9a,0x98,0x99,0x9d,0x9d,0x9b,0x9a,0x9a,0x9a,0x98,\r
+ 0x98,0x99,0x9a,0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,\r
+ 0x02,0xf7,0x2a,0x2a,0xf7,0xf7,0x2f,0x2c,0x26,0x36,0xf7,0xf7,0x2c,\r
+ 0x2b,0x2b,0x2c,0x2f,0xf7,0x27,0x26,0x2f,0x2f,0xf7,0xf7,0x2b,0xf6,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x2e,0xf7,0xf7,0xf7,0x2d,0xf7,0xf7,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x2e,0x2a,0x2b,0x2c,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0xf7,0xf7,0x01,0x2f,\r
+ 0x2e,0x94,0x97,0xf7,0x01,0xf7,0x07,0x06,0x05,0x04,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0x04,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x04,0xf7,0x04,0x07,0x06,0x02,0x02,0xf7,0x02,0x03,\r
+ 0x06,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x06,0x02,0xf7,0x02,0x03,0x03,\r
+ 0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x97,0x97,0x03,0x98,\r
+ 0x99,0x9d,0x9e,0x97,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9e,0x9c,0x9a,\r
+ 0x9c,0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x9b,0x99,0x99,\r
+ 0x9a,0x98,0x9b,0x9f,0x27,0x27,0x27,0x27,0x2a,0x2c,0x2f,0x2f,0x2f,\r
+ 0x2d,0x2a,0x2a,0x2a,0xf6,0xf7,0x2c,0x25,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x25,0x2a,0x01,0x2e,0x2d,0x97,0x99,0x9f,\r
+ 0x9e,0x9e,0x99,0x94,0x99,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x9c,\r
+ 0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9a,0x98,\r
+ 0x99,0x9c,0x9d,0x9b,0x9b,0x9a,0x9a,0x98,0x98,0x99,0x9a,0x9b,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2f,0x2c,0x2f,0x02,0x01,0x01,0xf7,0x25,0x2a,0xf7,\r
+ 0xf7,0x2f,0x2f,0x27,0x23,0xf7,0xf6,0x2c,0x2b,0x2b,0x2c,0x2f,0xf7,\r
+ 0x25,0x26,0x2f,0x2f,0xf7,0xf7,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0x27,\r
+ 0x28,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf6,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2a,0x2a,0x2b,0x2c,\r
+ 0x2c,0x2c,0x2d,0x2c,0x2c,0x2c,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0x27,0xf7,0xf7,0x2f,0x2d,0xf7,0x97,0x9e,0xf7,0xf7,\r
+ 0xf7,0x06,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x03,0xf7,0xf7,0xf7,0x03,0x05,0x06,0x06,0x06,0x05,0x04,0xf7,\r
+ 0x02,0x07,0x07,0x04,0x02,0x02,0xf7,0x02,0x03,0x04,0x05,0x05,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x07,0x07,0x03,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x99,0x9f,0x99,0x9a,0x9c,0x9e,0x94,\r
+ 0x9a,0x9c,0x9f,0x9f,0x9f,0x9f,0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9d,0x28,\r
+ 0x27,0x27,0x27,0x27,0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,0x2a,\r
+ 0x02,0x01,0x2a,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x25,0x2c,0x01,0x2a,0x97,0x97,0x9a,0x9f,0x9e,0x9e,0x97,0x97,\r
+ 0x9a,0x9b,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x9a,0x98,0x98,0x9b,0x9d,0x9c,0x9b,\r
+ 0x9b,0x9a,0x98,0x98,0x99,0x9a,0x9b,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2a,\r
+ 0x2e,0xf6,0xf6,0x01,0xf7,0x2d,0x2b,0xf7,0xf7,0x02,0x2f,0x27,0x2b,\r
+ 0xf7,0x2e,0x2c,0x2b,0x2b,0x2c,0x2f,0xf7,0x27,0x26,0x2d,0x2f,0xf7,\r
+ 0xf7,0x2e,0x02,0xf7,0x01,0x01,0xf7,0x2c,0x36,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0x2f,0x01,0x01,0xf6,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2a,0x2a,0x2b,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2f,0x02,0xf7,0xf7,0xf7,0x2f,0x02,0xf7,0x27,0x2f,0xf7,\r
+ 0xf7,0x2f,0x2b,0xf7,0x97,0xf7,0x01,0xf7,0x01,0x06,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x04,0x02,0xf7,0x02,0x07,0x07,0x07,0x03,\r
+ 0x02,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x04,0x05,\r
+ 0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,\r
+ 0x97,0x97,0x9a,0x9f,0x99,0x9a,0x9c,0x9e,0x94,0x9a,0x9c,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9b,0x98,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9f,0x97,0x99,0x9b,0x99,0x99,0x2a,0x27,0x27,0x27,0x27,0x27,\r
+ 0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,0x2a,0x02,0x01,0x2a,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x2f,0x01,\r
+ 0x9f,0x94,0x97,0x9d,0x9e,0x9e,0x9e,0x94,0x97,0x9a,0x9b,0x9d,0x9d,\r
+ 0x9e,0x9e,0x9d,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9c,0x9b,0x99,0x97,0x9a,0x9d,0x9c,0x9b,0x9b,0x9b,0x98,0x98,0x99,\r
+ 0x9a,0x9b,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2a,0x2e,0x2f,0x2f,0x01,0xf7,\r
+ 0xf6,0x2b,0xf7,0xf7,0xf7,0x28,0x26,0xf7,0xf7,0x2d,0x2c,0x2b,0x2b,\r
+ 0x2c,0x2f,0xf7,0x27,0x26,0x2d,0x2f,0xf7,0xf7,0x2e,0x02,0xf7,0x01,\r
+ 0x02,0xf7,0xf7,0x35,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2c,0x2a,\r
+ 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2b,0x2c,0x2c,0x2f,0xf6,\r
+ 0x2f,0x2b,0x2f,0xf7,0x29,0x23,0xf7,0xf7,0x2f,0x2d,0xf7,0xf7,0x99,\r
+ 0xf7,0xf7,0xf7,0x02,0x05,0x04,0x04,0x03,0x03,0x03,0x02,0x03,0x05,\r
+ 0x07,0x07,0x06,0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0x06,0x07,0x07,0x06,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x04,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x9b,0x98,0x97,0x94,0x9c,0x9e,\r
+ 0x99,0x9a,0x9b,0x9d,0x94,0x9b,0x9d,0x9f,0x9f,0x9f,0x9f,0x9d,0x9a,\r
+ 0x9b,0x9b,0x9d,0x9a,0x9b,0x9d,0x9c,0x9d,0x9d,0x9e,0x9f,0x98,0x99,\r
+ 0x9b,0x99,0x2e,0x28,0x27,0x27,0x27,0x27,0x27,0x2a,0x2d,0x2f,0x2f,\r
+ 0x2f,0x2d,0x2a,0x29,0x2a,0x01,0x01,0x2a,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x28,0xf6,0x97,0x9f,0x94,0x97,0x9e,\r
+ 0x9e,0x9d,0x9b,0x94,0x99,0x9a,0x9c,0x9d,0x9e,0x9e,0x9e,0x9e,0x9d,\r
+ 0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x99,0x97,0x99,\r
+ 0x9d,0x9d,0x9c,0x9b,0x9b,0x98,0x98,0x99,0x9a,0x9b,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2f,0x2c,0x2e,0x2f,0x2f,0xf7,0xf7,0x02,0x2d,0xf7,0xf7,0xf7,\r
+ 0x27,0x27,0xf7,0xf6,0x2c,0x2c,0x2a,0x2b,0x2c,0x2e,0xf7,0x27,0x26,\r
+ 0x2e,0x2f,0xf7,0xf7,0x2c,0xf6,0xf7,0x02,0x02,0x01,0xf7,0x36,0x2a,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf6,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x2f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2b,0x2c,0x2e,0x2f,0x02,0x01,0x02,0x2f,0x2c,0x2f,0xf7,0x2a,0x36,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2a,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0x03,0x05,\r
+ 0x04,0x03,0x03,0x03,0x02,0x02,0x03,0x06,0x07,0x06,0x04,0x03,0x02,\r
+ 0x02,0x03,0x05,0x07,0x07,0x07,0x06,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x05,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x06,\r
+ 0x07,0x07,0x07,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x01,0x02,0x02,0xf7,0x02,0x03,0x9f,0x03,\r
+ 0x02,0x01,0x9e,0x99,0x98,0x97,0x94,0x9d,0x9d,0x9a,0x9a,0x9b,0x9a,\r
+ 0x97,0x9b,0x9e,0x9f,0x9f,0x9f,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x98,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x9a,0x99,0x99,0x9a,0x2f,0x2c,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x2a,0x2e,0x2f,0x2f,0x2f,0x2c,0x2a,0x29,\r
+ 0x2a,0x01,0x01,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x2a,0x94,0x99,0x9a,0x97,0x99,0x9f,0x9e,0x9e,0x99,0x94,\r
+ 0x99,0x9b,0x9c,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9c,0x9c,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9c,0x9a,0x97,0x97,0x9c,0x9d,0x9c,0x9c,0x9c,\r
+ 0x98,0x98,0x98,0x99,0x9a,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0x2a,0xf7,0xf7,0xf7,0xf7,0x28,0x2c,0xf7,0x2f,0x2c,\r
+ 0x2c,0x2b,0x2b,0x2c,0x2e,0xf7,0x29,0x26,0x2f,0x2f,0xf7,0xf7,0x2a,\r
+ 0xf6,0xf7,0x02,0x01,0x02,0xf7,0x2a,0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0x2f,\r
+ 0x2e,0x2a,0x2a,0x2a,0x2a,0x2b,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x2f,0x01,0xf7,0x2d,0x2a,0xf7,0xf7,0x02,0x2f,0x2c,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x04,0x04,0x03,0x03,0x03,0x02,\r
+ 0x02,0x04,0x07,0x07,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x07,\r
+ 0x07,0x07,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x07,0x07,0x07,0x06,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x05,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x03,\r
+ 0x9c,0x9f,0x02,0x01,0x9f,0x9b,0x98,0x94,0x97,0x9b,0x02,0x03,0x99,\r
+ 0x98,0x94,0x94,0x9f,0x9b,0x9a,0x9a,0x9c,0x98,0x99,0x9b,0x9e,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9c,0x9f,0x97,0x99,0x9a,0x2e,0x2f,0x2a,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x2a,0x2d,0x2f,0x2f,0x2f,0x2c,0x2a,0x29,0x2a,0x01,0x02,0x27,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x9c,0x94,\r
+ 0x9d,0x98,0x97,0x9a,0x9f,0x9e,0x9d,0x97,0x94,0x9a,0x9b,0x9d,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9c,\r
+ 0x9a,0x97,0x97,0x9a,0x9d,0x9d,0x9c,0x9c,0x98,0x98,0x98,0x99,0x9a,\r
+ 0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x2b,0xf7,\r
+ 0xf7,0x01,0x02,0x27,0x2f,0xf7,0x2e,0x2c,0x2c,0x2c,0x2c,0x2c,0x2e,\r
+ 0xf7,0x2b,0x27,0x2f,0x2f,0xf7,0xf7,0x25,0xf6,0xf7,0x01,0xf7,0x01,\r
+ 0xf7,0xf7,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,0x2d,0x2b,0x2b,0x2c,0x2e,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0x2c,\r
+ 0xf7,0xf7,0xf7,0x01,0x2f,0x2c,0x2c,0xf7,0xf7,0x23,0x01,0xf7,0xf7,\r
+ 0x02,0x9f,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x04,0x07,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x06,0x04,0x04,\r
+ 0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x05,0x03,0x02,0x02,0x02,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x05,0x03,0x02,0x02,0x02,0x03,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x04,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x02,0x02,0x03,0x06,0x03,0x03,0x03,0x03,0x9e,\r
+ 0x98,0x94,0x97,0x98,0x97,0x94,0x9d,0x01,0x9a,0x98,0x94,0x94,0x9f,\r
+ 0x9a,0x9a,0x9a,0x9d,0x94,0x9a,0x9c,0x9f,0x9f,0x9f,0x9f,0x9d,0x9a,\r
+ 0x9a,0x9c,0x9d,0x9b,0x98,0x9d,0x9d,0x9d,0x9d,0x9c,0x9f,0x97,0x99,\r
+ 0x2d,0x2f,0x2f,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2c,0x2a,0x29,0x2c,0x01,0xf6,0x27,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x02,0x9a,0x94,0x9f,0x97,0x97,0x9c,\r
+ 0x9e,0x9e,0x9d,0x94,0x97,0x9a,0x9b,0x9d,0x9e,0x9f,0x9e,0x9e,0x9e,\r
+ 0x9e,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9b,0x9b,0x99,0x94,0x98,0x9c,\r
+ 0x9d,0x9d,0x9d,0x97,0x97,0x98,0x99,0x9a,0xf6,0xf6,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0x2b,0x27,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x35,0xf7,0xf7,0xf7,0xf6,0x2e,0x27,0x2f,\r
+ 0xf7,0x2e,0x2c,0x2c,0x2c,0x2c,0x2c,0x2e,0xf7,0x2e,0x27,0x02,0x2f,\r
+ 0xf7,0xf7,0x23,0xf6,0xf7,0x01,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2c,\r
+ 0x29,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0xf7,0x02,0x9f,0x04,0x04,0x03,\r
+ 0x03,0x03,0x02,0x02,0x05,0x07,0x04,0xf7,0xf7,0x04,0x04,0x04,0x05,\r
+ 0x02,0xf7,0x02,0x06,0x07,0x07,0x04,0x04,0x04,0x04,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x04,0x04,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,0x04,\r
+ 0x06,0x05,0x05,0x9e,0x9f,0x03,0x9f,0x9d,0x97,0x97,0x99,0x9a,0x9a,\r
+ 0x9a,0x98,0x97,0x01,0x9a,0x97,0x94,0x94,0x03,0x9a,0x9a,0x9a,0x9d,\r
+ 0x94,0x9b,0x9c,0x9f,0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9b,0x9d,0x99,\r
+ 0x9b,0x9d,0x9c,0x9d,0x9d,0x9e,0x9e,0x98,0x2c,0x2d,0x2f,0x2d,0x28,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2e,0x2f,0x2f,0x2f,0x2c,0x2a,\r
+ 0x29,0x2c,0x01,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0xf7,0x03,0x98,0x94,0x9f,0x94,0x97,0x9d,0x9e,0x9d,0x9d,0x94,\r
+ 0x97,0x9a,0x9c,0x9e,0x9e,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,\r
+ 0x9b,0x9b,0x9b,0x9c,0x99,0x97,0x97,0x9a,0x9d,0x9d,0x9d,0x97,0x97,\r
+ 0x98,0x98,0x99,0x02,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,\r
+ 0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0x35,0x2e,0xf7,0xf7,0xf7,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0x2f,0x2a,0x25,0x2a,0xf7,0x2e,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2e,0xf7,0x01,0x27,0x01,0x02,0xf7,0xf7,0x36,0xf6,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x2d,0x2c,0x29,0xf7,0xf7,0xf7,0x36,0x36,\r
+ 0xf7,0xf7,0xf7,0x02,0x9f,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x06,\r
+ 0x07,0x03,0xf7,0x03,0x04,0x02,0x02,0x03,0x05,0x02,0xf7,0x04,0x07,\r
+ 0x07,0x04,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,\r
+ 0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x02,0x02,0x04,0x06,0x05,0x04,0x03,0x02,0x97,0x94,\r
+ 0x98,0x9a,0x9b,0x97,0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9a,0x94,0x02,\r
+ 0x9b,0x97,0x94,0x98,0x9f,0x9a,0x9a,0x9a,0x9b,0x97,0x9b,0x9e,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9c,0x99,0x9c,0x9b,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9f,0x9a,0x2f,0x2c,0x2d,0x2f,0x2c,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x27,0x2a,0x2f,0x2f,0x2f,0x2f,0x2c,0x2a,0x29,0x2d,0xf7,0x2f,\r
+ 0x26,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0xf7,0xf7,0x9f,0x97,\r
+ 0x97,0x9e,0x94,0x97,0x9e,0x9e,0x9d,0x9c,0x94,0x98,0x9a,0x9c,0x9e,\r
+ 0x9e,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x9a,\r
+ 0x97,0x94,0x98,0x9c,0x9e,0x9e,0x97,0x97,0x97,0x98,0x99,0x01,0xf6,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2d,\r
+ 0x28,0x25,0x25,0xf7,0x2e,0x2c,0x2c,0x2d,0x2c,0x2c,0x2e,0x01,0xf7,\r
+ 0x28,0xf7,0x01,0xf7,0xf7,0x36,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2f,0x2e,0x2d,\r
+ 0x2a,0x2a,0xf7,0xf7,0xf7,0x27,0x36,0x35,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x05,0x04,0x04,0x03,0x03,0x03,0x02,0x06,0x07,0x03,0xf7,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0x04,0xf7,0x02,0x07,0x07,0x04,0x03,0x03,0x03,\r
+ 0x03,0x04,0x04,0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x02,0x06,\r
+ 0x05,0x04,0x03,0x03,0x02,0xf7,0x97,0x97,0x97,0x98,0x99,0x97,0x94,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9b,0x97,0x02,0x9b,0x98,0x97,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9b,0x97,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9e,0x9b,\r
+ 0x99,0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x2f,0x2f,\r
+ 0x2d,0x2f,0x2f,0x2a,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2c,0x2a,0x29,0x2e,0xf7,0x2f,0x26,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0xf7,0xf7,0xf7,0x9e,0x94,0x99,0x9b,0x94,0x97,\r
+ 0x9e,0x9e,0x9c,0x9b,0x94,0x99,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9e,0x9e,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x99,0x94,0x94,0x99,0x9c,\r
+ 0x9e,0x97,0x97,0x97,0x98,0x98,0xf7,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf6,0x01,0xf7,0xf7,0x29,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2c,0x27,0x28,0x36,0xf7,0x2f,\r
+ 0x2c,0x2c,0x2d,0x2e,0x2d,0x2f,0x01,0xf7,0x2a,0xf7,0xf7,0xf7,0x2f,\r
+ 0x26,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf6,0x2f,0x2e,0x2c,0x2a,0x2a,0x28,0x2f,0xf7,0xf7,0xf7,0x2c,\r
+ 0x36,0x36,0x35,0xf7,0xf7,0xf7,0x02,0x03,0x06,0x05,0x04,0x03,0x03,\r
+ 0x03,0x02,0x06,0x07,0x02,0xf7,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,\r
+ 0x02,0xf7,0x06,0x07,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,\r
+ 0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x02,0x02,0x05,0x05,0x04,0x04,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0x94,0x94,0x97,0x97,0x97,0x97,0x94,0x97,0x98,0x9a,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9b,0x97,0x02,0x9b,0x99,0x98,0x9d,0x9c,0x9a,0x9a,0x9d,\r
+ 0x94,0x9b,0x9c,0x9e,0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9a,\r
+ 0x98,0x9d,0x9d,0x9d,0x9d,0x9d,0x28,0x2f,0x2f,0x2c,0x2f,0x2e,0x29,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2f,0x2f,0x2f,0x2e,0x2c,\r
+ 0x29,0x29,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0xf7,\r
+ 0xf7,0xf7,0x01,0x9d,0x94,0x9a,0x9a,0x94,0x98,0x9f,0x9e,0x9d,0x9a,\r
+ 0x94,0x99,0x9b,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,\r
+ 0x9c,0x9b,0x9b,0x9a,0x97,0x94,0x97,0x99,0x9c,0x97,0x97,0x97,0x98,\r
+ 0x98,0xf7,0x01,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x01,0xf7,0xf7,\r
+ 0x2a,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2e,0x2f,0x2a,0x27,0x2f,0x29,0x2f,0xf7,0x2c,0x2c,0x2d,0x2e,0x2f,\r
+ 0x2f,0x02,0xf7,0x2a,0xf7,0xf7,0xf7,0x2e,0x01,0xf7,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x2f,0x2f,0x2f,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x2f,0x2a,0x29,0x27,0x27,\r
+ 0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,0x2a,0x36,0x36,0x35,0x35,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0x06,0x06,0x05,0x04,0x03,0x03,0x03,0x06,0x07,0x02,\r
+ 0xf7,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0xf7,0x05,0x07,0x04,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,\r
+ 0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x03,0x06,\r
+ 0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x9a,0x99,0x99,\r
+ 0x97,0x97,0x94,0x94,0x99,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9b,0x97,\r
+ 0x01,0x9a,0x99,0x99,0x9f,0x9a,0x9a,0x9a,0x9d,0x97,0x9b,0x9d,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,0x99,0x9c,0x9d,0x9c,0x9d,\r
+ 0x9d,0x2a,0x29,0x2f,0x2f,0x2c,0x2f,0x2c,0x28,0x27,0x27,0x27,0x27,\r
+ 0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,0x2e,0x2c,0x29,0x29,0x2f,0xf7,\r
+ 0x2f,0x25,0x23,0x23,0x23,0x23,0x23,0xf7,0xf7,0xf7,0xf7,0x02,0x9c,\r
+ 0x94,0x9c,0x99,0x97,0x98,0x9e,0x9d,0x9c,0x99,0x94,0x99,0x9b,0x9e,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9c,0x9b,0x9b,0x99,\r
+ 0x97,0x94,0x97,0x99,0x94,0x94,0x97,0x97,0x98,0xf7,0x01,0xf6,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0xf7,0x28,0x2a,0x2e,0x2f,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2e,0x2e,0x2a,0x2a,0xf7,\r
+ 0x01,0x23,0xf7,0x2d,0x2c,0x2e,0x2f,0x2f,0x2f,0x01,0xf7,0x2e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,\r
+ 0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,\r
+ 0x2f,0x2c,0x28,0x27,0x27,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x26,0x36,0x36,0x35,0x35,0x35,0xf7,0xf7,0xf7,0x01,0x01,0x07,0x07,\r
+ 0x06,0x05,0x04,0x03,0x03,0x06,0x07,0x03,0xf7,0x04,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x04,0xf7,0x04,0x07,0x04,0x02,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,\r
+ 0x05,0x05,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x02,0x02,0x06,0x05,0x04,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x03,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x9a,\r
+ 0x9c,0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9b,0x94,0x02,0x9a,0x9a,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9a,0x99,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9e,0x9c,\r
+ 0x99,0x9c,0x9b,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x2a,0x28,0x2c,0x2f,\r
+ 0x2f,0x2d,0x2f,0x2a,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,\r
+ 0x2f,0xf6,0x2f,0x2e,0x2b,0x29,0x29,0x2f,0xf7,0x2d,0x25,0x23,0x23,\r
+ 0x23,0x23,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x9d,0x98,0x97,\r
+ 0x99,0x9e,0x9d,0x9c,0x98,0x94,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9d,0x9c,0x9b,0x9b,0x9a,0x98,0x94,0x94,0x94,0x98,\r
+ 0x98,0x97,0x97,0x98,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0x02,0xf7,0x2a,0x27,0x2a,0x2e,0x2f,0x2e,0x2f,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2e,0x2f,0x2d,0x2c,0x2c,0xf7,0xf7,0x25,0xf7,0xf6,0x2e,\r
+ 0x2e,0x2f,0x2f,0x02,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2c,0x01,0xf7,0xf7,0x01,0x2f,0x2f,0x2c,0x28,0x26,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x27,0x36,0x36,0x36,0x36,0x35,0x35,\r
+ 0x35,0xf7,0xf7,0xf7,0x01,0x01,0x07,0x07,0x07,0x05,0x04,0x04,0x03,\r
+ 0x07,0x07,0x03,0xf7,0x05,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0xf7,\r
+ 0x04,0x07,0x04,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x02,0x06,\r
+ 0x04,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x03,0x02,0x02,0x98,\r
+ 0x99,0x98,0x94,0x94,0x94,0x94,0x94,0x9b,0x9b,0x99,0x99,0x99,0x98,\r
+ 0x98,0x9a,0x9a,0x9b,0x97,0x9f,0x9b,0x9a,0x9c,0x9e,0x9a,0x9a,0x9c,\r
+ 0x94,0x9b,0x9c,0x9f,0x9f,0x9f,0x9f,0x9e,0x9b,0x99,0x9c,0x9b,0x9c,\r
+ 0x97,0x9d,0x9d,0x9c,0x2b,0x2a,0x28,0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,0x2e,\r
+ 0x2a,0x29,0x29,0x2f,0xf7,0x2d,0x25,0x23,0x23,0x23,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x9e,0x97,0x97,0x9a,0x9e,0x9c,0x9d,\r
+ 0x94,0x97,0x9a,0x9c,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,\r
+ 0x9c,0x9b,0x9a,0x99,0x97,0x94,0x94,0x9a,0x9a,0x97,0x97,0x98,0xf7,\r
+ 0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0x02,0xf7,0x25,\r
+ 0x28,0x2a,0x2d,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0x2a,0x2c,0xf6,0xf7,0x2f,0x27,0xf7,0x2f,0x2f,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0x01,0x2f,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2a,0x2c,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x2e,0x2a,0x27,0x29,0xf7,0xf7,0xf7,0x2f,0x28,0x25,0x36,0x36,0x36,\r
+ 0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x07,0x07,0x04,0xf7,0x05,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0xf7,0x04,0x07,0x04,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0x02,0x04,0x05,0x04,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0x03,0x03,0x02,0x02,0x02,0x02,0x9a,0x9b,0x9a,0x97,0x94,0x94,\r
+ 0x94,0x94,0x9b,0x9b,0x99,0x9a,0x9d,0x9d,0x99,0x98,0x9a,0x9b,0x9a,\r
+ 0x9e,0x9e,0x9b,0x9b,0x9e,0x9b,0x9a,0x9a,0x9d,0x97,0x9b,0x9d,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9b,0x98,0x9d,0x9d,0x2b,\r
+ 0x2a,0x2a,0x28,0x02,0x2f,0x2d,0x2f,0x2f,0x28,0x27,0x27,0x27,0x26,\r
+ 0x27,0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,0x2e,0x2a,0x29,0x29,0x2f,\r
+ 0xf7,0x2c,0x25,0x23,0x23,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x9a,0x94,0x9e,0x97,0x97,0x9b,0x9e,0x9c,0x9c,0x94,0x98,0x9a,0x9d,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,\r
+ 0x97,0x94,0x9c,0x9c,0x9a,0x97,0x97,0xf7,0xf7,0x01,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0xf6,0xf6,0xf7,0x23,0x26,0x27,0x2a,0x2d,0x2f,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2c,0x2c,0x2c,0x2c,0x2e,\r
+ 0x36,0xf7,0x01,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2f,0x2a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2d,0x2a,0x27,\r
+ 0x27,0xf6,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2a,0x27,0x2e,0xf7,0xf7,\r
+ 0x2b,0x23,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x05,0x07,0x07,0x06,0xf7,0x04,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0xf7,0x04,0x07,0x04,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x05,0x04,0x03,0x03,0x04,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x06,\r
+ 0x04,0x04,0x03,0xf7,0xf7,0x02,0xf7,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x9c,0x9c,0x9c,0x98,0x94,0x94,0x94,0x94,0x9c,0x9a,0x99,\r
+ 0x9d,0x9f,0x9f,0x9e,0x99,0x98,0x9a,0x9b,0x98,0x02,0x9c,0x9a,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9a,0x99,0x99,0x9c,0x9f,0x9f,0x03,0x9f,0x9f,0x9d,\r
+ 0x9a,0x9b,0x9b,0x9d,0x99,0x9b,0x9d,0x2c,0x2b,0x2a,0x2a,0x29,0x2f,\r
+ 0x2f,0x2c,0x2f,0x2d,0x28,0x27,0x27,0x26,0x26,0x27,0x27,0x27,0x27,\r
+ 0x2a,0x2f,0xf6,0x2f,0x2e,0x2a,0x29,0x29,0x2f,0xf7,0x2c,0x25,0x23,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9f,0x97,\r
+ 0x97,0x9c,0x9e,0x9c,0x9c,0x94,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x9d,0x9d,0x9c,\r
+ 0x98,0x97,0xf7,0xf7,0x01,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,\r
+ 0x2f,0xf7,0x28,0x27,0x27,0x28,0x2c,0x2c,0x2f,0x2f,0x01,0x01,0x01,\r
+ 0x01,0x01,0x2f,0x2f,0x2a,0x2a,0x28,0x27,0x25,0x27,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf6,0x2a,0x27,\r
+ 0x27,0x27,0x25,0x25,0x23,0x23,0x25,0x28,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2e,0x2a,0x27,0x2f,0xf7,0xf7,0x27,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,\r
+ 0x07,0xf7,0x02,0x05,0x02,0xf7,0xf7,0xf7,0x04,0x02,0xf7,0x05,0x07,\r
+ 0x04,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x07,0x07,0x07,\r
+ 0x07,0x06,0x03,0x02,0x02,0x02,0x02,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x04,0x02,0x02,0x05,0x04,0x04,0x02,0xf7,0x02,0xf7,\r
+ 0x02,0x04,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x9c,0x9c,0x9c,\r
+ 0x98,0x94,0x94,0x94,0x94,0x9c,0x9a,0x9a,0x9f,0x9f,0x03,0x9f,0x9f,\r
+ 0x99,0x99,0x9a,0x9b,0x94,0x03,0x9a,0x99,0x9a,0x9e,0x9a,0x9a,0x9c,\r
+ 0x94,0x9b,0x9d,0x9f,0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,\r
+ 0x98,0x9d,0x2a,0x2c,0x2b,0x2a,0x28,0x2a,0x2f,0x2f,0x2d,0x2f,0x2c,\r
+ 0x27,0x27,0x27,0x26,0x26,0x27,0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,\r
+ 0x2e,0x2a,0x29,0x2a,0xf6,0xf7,0x2b,0x23,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9f,0x94,0x97,0x9e,0x9d,0x9b,\r
+ 0x9a,0x94,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9d,\r
+ 0x9c,0x9b,0x9a,0x9a,0x99,0x9d,0x9d,0x9d,0x9a,0x97,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0xf7,0x25,0x2f,\r
+ 0x2e,0x2c,0x2a,0x2f,0x2f,0x01,0x01,0xf7,0x01,0x01,0x2f,0x2f,0x2e,\r
+ 0x2d,0x2a,0x2a,0x27,0x27,0x2d,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0x2e,0x25,0x36,0x35,0x35,0x36,0x36,0x36,\r
+ 0x23,0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2b,0x27,0x2f,0xf7,\r
+ 0xf7,0x28,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x06,0x04,\r
+ 0x02,0x02,0x03,0x05,0xf7,0xf7,0x06,0x07,0x04,0x03,0x03,0x03,0x04,\r
+ 0x04,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,\r
+ 0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x05,0x04,0x9c,0x9c,0x9b,0x97,0x94,0x94,0x94,0x94,\r
+ 0x9c,0x9a,0x9a,0x9f,0x03,0x03,0x03,0x03,0x9e,0x98,0x9a,0x9b,0x9b,\r
+ 0x9c,0x9c,0x99,0x98,0x9f,0x9a,0x9a,0x9a,0x9c,0x97,0x9b,0x9e,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x9c,0x9b,0x9c,0x97,0x2b,0x2b,0x2c,\r
+ 0x2b,0x2a,0x27,0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,0x27,0x26,\r
+ 0x26,0x27,0x27,0x27,0x27,0x2b,0x2f,0x2f,0x2f,0x2e,0x2a,0x29,0x2a,\r
+ 0xf6,0x01,0x2b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x98,0x94,0x9f,0x94,0x97,0x9e,0x9d,0x9c,0x99,0x94,0x9a,0x9b,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9d,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9e,0x9e,0x9e,0x9d,0x97,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x2f,0xf7,0x23,0xf6,0xf7,0x01,0x2e,0x2c,0xf6,\r
+ 0xf6,0x01,0xf7,0x01,0x01,0xf7,0x2f,0x2f,0x2e,0x2e,0x2d,0x2c,0x2a,\r
+ 0x2a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,\r
+ 0xf6,0x27,0x23,0x36,0x36,0x23,0x25,0x27,0x2c,0x01,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0x2d,0x2c,0x28,0x2e,0xf7,0xf7,0x2a,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x04,0xf7,0x03,0x06,0x04,0x04,0x05,0x04,0xf7,\r
+ 0x03,0x07,0x07,0x05,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x02,0xf7,0x05,0x05,0x04,0x03,0xf7,0xf7,0x02,\r
+ 0xf7,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x05,0x05,0x04,\r
+ 0x9c,0x9c,0x9a,0x94,0x94,0x94,0x94,0x97,0x9c,0x9a,0x9a,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9b,0x98,0x9a,0x9c,0x97,0x01,0x99,0x97,0x97,\r
+ 0x9f,0x9a,0x9a,0x9c,0x97,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9a,0x9a,0x9c,0x9c,0x9c,0x2f,0x2b,0x2b,0x2c,0x2b,0x2b,0x28,0x02,\r
+ 0x2f,0x2d,0x2f,0x2f,0x29,0x27,0x27,0x26,0x26,0x26,0x27,0x27,0x27,\r
+ 0x27,0x2b,0x2f,0x2f,0x2f,0x2e,0x2a,0x29,0x2a,0x02,0x01,0x9e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x9e,\r
+ 0x94,0x97,0x9e,0x9c,0x9c,0x97,0x97,0x9a,0x9c,0x9f,0x9f,0x03,0x03,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x9c,0x9c,0x9f,0x9e,0x9c,\r
+ 0xf7,0xf7,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,\r
+ 0x2f,0xf7,0x27,0xf7,0xf7,0x01,0x28,0xf6,0xf6,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0x2f,0x2d,0x2d,0x2f,0x2f,0x2f,0xf7,0xf7,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0xf7,0x2e,0x2a,0x27,0x2a,\r
+ 0x2c,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2d,0x2a,0x2c,\r
+ 0xf7,0xf7,0xf6,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0xf7,0xf7,0x05,0x06,0x06,0x05,0xf7,0xf7,0x05,0x07,0x07,0x06,0x05,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,\r
+ 0x06,0x04,0x04,0x02,0xf7,0x02,0xf7,0x02,0x04,0x04,0x04,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x9c,0x9c,0x99,0x94,0x94,\r
+ 0x94,0x94,0x98,0x9c,0x9a,0x9a,0x9f,0x03,0x03,0x03,0x03,0x03,0x9e,\r
+ 0x98,0x99,0x9b,0x9c,0x99,0x9c,0x97,0x94,0x9c,0x9a,0x9a,0x9a,0x9d,\r
+ 0x97,0x9b,0x9e,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,\r
+ 0x2e,0x2e,0x2a,0x2c,0x2b,0x2a,0x2a,0x28,0x2f,0x2f,0x2c,0x2f,0x2e,\r
+ 0x28,0x27,0x27,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x2b,0x2f,0x2f,\r
+ 0x2f,0x2d,0x2a,0x29,0x2a,0x02,0x94,0x9e,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x98,0x9a,0x94,0x98,0x9e,0x9c,\r
+ 0x9c,0x94,0x97,0x9a,0x9d,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,\r
+ 0x9d,0x9c,0x9b,0x99,0x99,0x9d,0x9f,0x9e,0xf7,0xf7,0x01,0x01,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0xf7,0x23,0x01,0xf7,\r
+ 0xf7,0x2f,0x2a,0xf6,0x2f,0x01,0xf7,0xf7,0xf7,0x01,0x2f,0x01,0xf7,\r
+ 0x01,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2d,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2f,0x2e,0x2a,0x29,0xf7,0xf7,0xf7,0x27,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x06,0x05,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0xf7,0x02,0x04,0x04,\r
+ 0x02,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x04,0x02,0x03,0x05,0x04,0x03,0xf7,0xf7,0x04,\r
+ 0xf7,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x05,\r
+ 0x04,0x04,0x03,0x9c,0x99,0x94,0x94,0x94,0x94,0x94,0x98,0x9c,0x99,\r
+ 0x99,0x9f,0x03,0x03,0x03,0x03,0x03,0x9f,0x99,0x98,0x9a,0x9d,0x97,\r
+ 0x01,0x99,0x97,0x94,0x03,0x99,0x9a,0x9c,0x97,0x9a,0x9c,0x9f,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x9c,0x9a,0x2b,0x2f,0x2c,0x2a,0x2c,\r
+ 0x2b,0x2a,0x29,0x2a,0x2f,0x2f,0x2c,0x2f,0x2c,0x27,0x27,0x26,0x26,\r
+ 0x26,0x26,0x26,0x27,0x27,0x28,0x2b,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,\r
+ 0x2a,0x94,0x94,0x9e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x9e,0x94,0x9a,0x99,0x97,0x9a,0x9e,0x9c,0x9c,0x94,0x98,0x9a,\r
+ 0x9d,0x9f,0x9f,0x03,0x03,0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,0x97,0x97,\r
+ 0x99,0x03,0x9f,0x2b,0xf7,0xf7,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2f,0x2f,0xf7,0x25,0xf7,0xf7,0x2f,0x2a,0x2f,0x2f,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2c,\r
+ 0x28,0xf7,0xf7,0xf7,0x2f,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x06,0x05,0x05,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x03,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x04,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,\r
+ 0x05,0x05,0x04,0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x04,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x03,0x03,0x99,0x94,\r
+ 0x94,0x97,0x94,0x94,0x94,0x99,0x9c,0x99,0x99,0x9d,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x99,0x97,0x9a,0x9d,0x9c,0x9d,0x9c,0x98,0x94,0x9c,\r
+ 0x9a,0x99,0x9b,0x9d,0x97,0x9b,0x9e,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9a,0x9c,0x2d,0x2c,0x2f,0x2a,0x2b,0x2c,0x2b,0x2a,0x28,0x2d,\r
+ 0x2f,0x2f,0x2d,0x2f,0x2a,0x27,0x27,0x26,0x26,0x26,0x26,0x26,0x27,\r
+ 0x27,0x28,0x2c,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,0x9e,0x94,0x94,0x9f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x94,0x9e,\r
+ 0x97,0x97,0x9c,0x9d,0x9b,0x9c,0x94,0x99,0x9b,0x9d,0x9f,0x9f,0x03,\r
+ 0x03,0x9f,0x9f,0x9f,0x9e,0x9d,0x9a,0x9a,0x99,0x9c,0x9f,0x27,0xf7,\r
+ 0xf7,0x02,0xf6,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0xf7,0x28,0x2f,0xf7,0x2f,0x2c,0x2c,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2d,0x29,0x2f,0xf7,0xf7,0xf7,0x25,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x06,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x05,0x04,0x04,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,\r
+ 0x05,0x04,0x03,0x03,0x03,0x02,0x94,0x97,0x98,0x94,0x97,0x94,0x94,\r
+ 0x99,0x9c,0x9a,0x98,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,0x9e,0x99,0x97,\r
+ 0x99,0x9c,0x9e,0x94,0xf7,0x99,0x97,0x97,0x03,0x99,0x9a,0x9d,0x94,\r
+ 0x9a,0x9d,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9b,0x9a,0x2c,0x2c,\r
+ 0x2c,0x2f,0x2b,0x2b,0x2c,0x2b,0x2a,0x28,0x2f,0x2f,0x2e,0x2f,0x2f,\r
+ 0x29,0x27,0x27,0x26,0x26,0x26,0x26,0x26,0x27,0x27,0x28,0x2c,0x2f,\r
+ 0x2f,0x2f,0x2d,0x2a,0x9f,0x9d,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9b,0x94,0x9f,0x94,0x97,0x9d,0x9d,\r
+ 0x9b,0x9a,0x94,0x9a,0x9b,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9e,0x9c,0x9c,0x9d,0x9c,0x9f,0x27,0x26,0xf7,0x01,0x2f,0x2f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0xf7,0x23,0x2f,0x2a,\r
+ 0x29,0x2c,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,\r
+ 0x01,0x2f,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0xf6,0x02,0x2f,0xf6,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,\r
+ 0x2e,0x2a,0x2e,0xf7,0xf7,0xf7,0x2d,0x36,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x06,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,\r
+ 0x02,0x06,0x04,0x04,0x02,0xf7,0x03,0xf7,0x03,0x04,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0x99,0x98,0x97,0x98,0x94,0x94,0x97,0x99,0x9b,0x9a,0x99,0x98,\r
+ 0x99,0x9b,0x9d,0x9d,0x9b,0x99,0x97,0x97,0x99,0x9d,0x9e,0x94,0xf7,\r
+ 0x03,0x98,0x97,0x9f,0x99,0x99,0x9c,0x9c,0x97,0x9b,0x9e,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9d,0x9a,0x2d,0x2c,0x2b,0x2d,0x2f,0x2b,0x2b,\r
+ 0x2b,0x2a,0x2a,0x28,0xf6,0x2f,0x2c,0x2f,0x2e,0x28,0x27,0x27,0x26,\r
+ 0x26,0x26,0x26,0x26,0x27,0x27,0x28,0x2c,0x2f,0x2f,0x2f,0x2d,0x9e,\r
+ 0x9f,0x9d,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x9a,0x94,0x9f,0x94,0x97,0x9e,0x9d,0x9c,0x99,0x94,0x9a,\r
+ 0x9b,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9d,0x9e,\r
+ 0x9f,0x27,0x25,0x2a,0xf7,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2f,0xf7,0x2a,0x29,0x28,0x28,0x2c,0x2e,0x2d,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x36,0x2a,0xf7,0xf7,0xf7,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2c,0x2c,0x2c,0x2d,0x2f,\r
+ 0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2c,0x2a,0xf7,0xf7,0xf7,\r
+ 0xf7,0x23,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x03,0x05,0x04,0x03,0xf7,0xf7,\r
+ 0x04,0xf7,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x97,0x97,0x98,0x98,\r
+ 0x94,0x97,0x98,0x99,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x9e,0x9f,0x97,0x03,0xf7,0x9d,0x97,0x98,0x9e,\r
+ 0x99,0x9a,0x9d,0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x2e,0x2c,0x2d,0x2a,0x2f,0x2c,0x2b,0x2c,0x2b,0x2a,0x2a,0x29,\r
+ 0x2f,0x2f,0x2c,0x2f,0x2c,0x27,0x27,0x26,0x26,0x25,0x26,0x26,0x26,\r
+ 0x27,0x27,0x28,0x2c,0x2f,0x2f,0x2f,0x9b,0x9f,0x9f,0x9d,0x94,0x97,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x98,0x97,\r
+ 0x9e,0x94,0x97,0x9e,0x9d,0x9c,0x97,0x94,0x9a,0x9a,0x9c,0x9e,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9d,0x9e,0x9f,0x27,0x26,0x23,0xf6,\r
+ 0xf7,0x2e,0x2d,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2f,\r
+ 0xf7,0x36,0x26,0x28,0x2c,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x27,0x27,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2c,0x2a,0x2b,0x2d,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0x2f,0x2d,0x2a,0xf7,0xf7,0xf7,0xf7,0x29,0x36,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x23,0x02,0x02,0x01,0xf7,0xf7,0x07,0x07,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x03,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,\r
+ 0x02,0x05,0x05,0x04,0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0x97,0x99,0x9a,0x97,0x97,0x98,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x99,0x99,0x98,0x97,0x97,0x97,0x97,0x98,0x99,0x9b,0x9f,\r
+ 0x9f,0x97,0x9b,0xf7,0x01,0x98,0x97,0x02,0x99,0x9a,0x9c,0x9b,0x97,\r
+ 0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9e,0x2c,0x2f,0x2c,0x2e,\r
+ 0x2b,0x2f,0x2b,0x2b,0x2c,0x2b,0x2a,0x28,0x2c,0x2f,0x2f,0x2d,0x2f,\r
+ 0x2a,0x27,0x27,0x26,0x26,0x25,0x25,0x26,0x26,0x27,0x27,0x28,0x2c,\r
+ 0xf6,0x2f,0x99,0x9b,0x9f,0x9f,0x9d,0x94,0x97,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x98,0x9b,0x94,0x99,0x9e,\r
+ 0x9c,0x9c,0x97,0x94,0x99,0x9a,0x9b,0x9c,0x9d,0x9c,0x9c,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9e,0x9f,0x27,0x2e,0xf6,0x36,0xf7,0xf7,0x2c,0x2c,0x2f,\r
+ 0xf6,0x01,0x01,0x01,0x01,0xf6,0x2f,0x2f,0xf7,0x28,0x25,0x29,0x2c,\r
+ 0x2e,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf6,0xf6,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2a,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x03,0x02,0x02,0x02,0xf7,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x06,0x04,0x04,0x02,0xf7,\r
+ 0x02,0x02,0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x02,0x02,0x02,0x02,0x03,0xf7,0xf7,0xf7,0x02,0x9a,\r
+ 0x9b,0x99,0x97,0x97,0x99,0x9a,0x9a,0x9b,0x9c,0x9b,0x9a,0x9a,0x99,\r
+ 0x99,0x99,0x99,0x99,0x9a,0x9d,0x9f,0x03,0x03,0x94,0x9a,0xf7,0xf7,\r
+ 0x9e,0x97,0x9a,0x9a,0x99,0x9b,0x9d,0x94,0x9a,0x9c,0x9f,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x2a,0x2c,0x2e,0x2c,0x2c,0x2c,0xf6,0x2b,0x2b,\r
+ 0x2c,0x2b,0x2a,0x28,0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,0x26,\r
+ 0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x28,0x2c,0xf6,0x98,0x99,0x9b,\r
+ 0x9f,0x9f,0x9c,0x94,0x97,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x9e,0x94,0x9a,0x99,0x97,0x9a,0x9e,0x9c,0x9c,0x98,0x94,\r
+ 0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9d,0x9d,0x9d,0x9e,0x9f,0x2c,\r
+ 0xf7,0xf7,0x01,0x35,0xf7,0xf7,0x2c,0x2b,0x2c,0x2e,0x2f,0xf6,0xf6,\r
+ 0x2f,0x2f,0x2f,0x01,0xf7,0x26,0x2a,0x2e,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2f,0x2e,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0x23,0x36,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x27,0x9f,0x9f,0x03,0x02,\r
+ 0x01,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x04,0x06,0x07,0x07,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,\r
+ 0x02,0x02,0x06,0x04,0x04,0x02,0xf7,0x03,0xf7,0x03,0x04,0x04,0x03,\r
+ 0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x02,0x02,0x02,\r
+ 0x03,0x02,0xf7,0xf7,0x02,0x02,0x03,0x9c,0x9b,0x98,0x94,0x97,0x99,\r
+ 0x9a,0x9c,0x9d,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x03,\r
+ 0x02,0x02,0x02,0x9e,0x94,0x9a,0xf7,0xf7,0x02,0x97,0x97,0x03,0x99,\r
+ 0x9a,0x9c,0x9b,0x98,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x29,\r
+ 0x2a,0x2d,0x2d,0x2c,0x2c,0x2d,0x2f,0x2b,0x2b,0x2b,0x2a,0x2a,0x28,\r
+ 0x02,0x2f,0x2d,0x2f,0x2f,0x28,0x27,0x27,0x26,0x25,0x25,0x25,0x26,\r
+ 0x26,0x27,0x27,0x28,0x2c,0x97,0x98,0x99,0x9c,0x9f,0x9f,0x9c,0x94,\r
+ 0x98,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9c,0x94,\r
+ 0x9e,0x97,0x97,0x9a,0x9e,0x9c,0x9b,0x9a,0x94,0x94,0x97,0x97,0x98,\r
+ 0x98,0x98,0x9d,0x9d,0x9e,0x9e,0x9d,0xf7,0xf7,0xf7,0xf7,0x27,0x35,\r
+ 0xf6,0xf7,0xf6,0x2b,0x2a,0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x01,0xf7,\r
+ 0x27,0x2a,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2f,0x2c,\r
+ 0x2d,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2e,0x2c,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0x26,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x23,\r
+ 0x25,0x27,0x28,0x2a,0x9f,0x9f,0x9f,0x03,0x02,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x06,0x07,0x07,0x07,0x04,0x03,0x02,0x04,0x06,0x07,\r
+ 0x06,0x03,0x02,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,0x05,0x04,0x03,0xf7,\r
+ 0xf7,0x04,0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x02,0x02,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x04,0x04,0x9d,0x9a,0x97,0x94,0x97,0x99,0x9a,0x9c,0x9e,0x9e,0x9f,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x9f,0x97,0x94,\r
+ 0x9b,0xf7,0xf7,0x01,0x9a,0x97,0x9f,0x99,0x99,0x9a,0x9d,0x94,0x9a,\r
+ 0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x28,0x2a,0x2b,0x2e,0x2c,0x2d,\r
+ 0x2a,0x2f,0x2c,0x2b,0x2c,0x2b,0x2a,0x29,0x28,0x2f,0x2f,0x2c,0x2f,\r
+ 0x2c,0x27,0x27,0x26,0x26,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x28,\r
+ 0x9b,0x97,0x98,0x99,0x9c,0x9f,0x9f,0x9b,0x94,0x98,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x9f,0x97,0x97,0x9a,\r
+ 0x9e,0x9c,0x9a,0x9a,0x9a,0x97,0x94,0x94,0x94,0x94,0x9b,0x9b,0x9b,\r
+ 0x9d,0x9f,0x2f,0xf7,0xf7,0xf7,0x2e,0x35,0x35,0x23,0xf7,0xf7,0xf7,\r
+ 0x2d,0x2c,0x2c,0x2e,0x2f,0x2f,0xf7,0xf7,0x29,0x27,0xf7,0x2f,0xf7,\r
+ 0xf7,0x01,0xf6,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf6,0x2e,0x2c,0x2c,0x2c,0x2f,0xf6,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2e,0x2e,0x2d,0x2c,0xf7,0xf7,0xf7,0xf7,0x2a,0x36,\r
+ 0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x29,0x2a,0x2c,0x2c,0x9e,\r
+ 0x9e,0x9f,0x9f,0x03,0x06,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x03,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x02,0x04,0x06,0x07,0x06,0x04,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x02,0xf7,0x05,0x05,0x04,0x03,0xf7,0xf7,0x02,0xf7,0x04,0x04,0x03,\r
+ 0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x03,0x02,0x02,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x04,0x05,0x05,0x04,0x9b,0x99,0x97,\r
+ 0x94,0x94,0x97,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x03,0x03,0x9f,0x9d,0x9b,0x97,0x94,0x94,0x9e,0xf7,0xf7,0xf7,0x03,\r
+ 0x97,0x99,0x9e,0x99,0x9a,0x9b,0x9c,0x97,0x9b,0x9d,0x9f,0x9f,0x03,\r
+ 0x03,0x03,0x27,0x28,0x2a,0x2c,0x2f,0x2c,0x2e,0x2c,0x2f,0x2b,0x2b,\r
+ 0x2c,0x2a,0x2a,0x28,0x2c,0x2f,0x2f,0x2d,0x2f,0x2a,0x27,0x27,0x26,\r
+ 0x26,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x9f,0x9b,0x97,0x98,0x99,\r
+ 0x9c,0x9f,0x9f,0x9a,0x94,0x99,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x99,0x94,0x9f,0x97,0x97,0x99,0x9e,0x9c,0x9a,0x98,\r
+ 0x97,0x98,0x98,0x97,0x97,0x9b,0x9b,0x9a,0x9a,0x9a,0x26,0x2f,0xf7,\r
+ 0xf7,0xf7,0x27,0x35,0x35,0x35,0x36,0x2f,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0x2a,0x2c,0xf7,0xf7,0xf7,0xf7,0x25,0x27,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2e,0x2d,\r
+ 0x2c,0xf7,0xf7,0xf7,0xf7,0x2c,0x36,0x36,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x23,\r
+ 0x25,0x27,0x2a,0x2c,0x2c,0x2e,0x2e,0x9c,0x9d,0x9e,0x9e,0x9f,0x05,\r
+ 0x06,0x06,0x05,0x05,0x05,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x05,0x07,0x07,0x05,0x02,0x02,\r
+ 0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x06,0x04,0x04,0x02,\r
+ 0xf7,0x02,0xf7,0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x03,0x02,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x05,0x05,0x05,0x04,0x9a,0x98,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0x01,0x97,0x97,0x02,0x99,0x9a,\r
+ 0x9a,0x9c,0x97,0x9a,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x27,0x27,0x28,\r
+ 0x2a,0x2c,0x2e,0x2c,0x2c,0x2c,0xf6,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,\r
+ 0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,0x26,0x25,0x25,0x25,0x25,\r
+ 0x26,0x26,0x27,0x03,0x9f,0x9b,0x97,0x98,0x99,0x9c,0x9f,0x9f,0x99,\r
+ 0x94,0x9a,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x99,\r
+ 0x94,0x9f,0x97,0x97,0x97,0x9c,0x9d,0x9b,0x9a,0x98,0x97,0x97,0x97,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0xf7,0x28,0x2c,0xf7,0xf7,0xf7,0x26,0x36,\r
+ 0x35,0x35,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,0x02,0x2a,0x2a,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2e,0x23,0x27,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x2e,0x2e,0x2d,0x2c,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x27,0x2a,0x2c,0x2d,0x2f,\r
+ 0x2f,0x2f,0x9c,0x9d,0x9d,0x9d,0x9e,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x05,0x07,0x07,0x07,0x04,0xf7,0xf7,0x03,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0x03,0x06,0x07,0x06,0x03,0x02,0x02,0x03,0x04,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x04,0x02,0x02,0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,0x04,0x04,\r
+ 0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x02,\r
+ 0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x05,0x06,0x06,0x04,0x03,\r
+ 0x99,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x9b,0x03,0xf7,\r
+ 0xf7,0xf7,0x01,0x99,0x97,0x9b,0x9d,0x99,0x9a,0x9a,0x9d,0x94,0x9b,\r
+ 0x9c,0x9e,0x9f,0x03,0x03,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,0x2c,\r
+ 0x2b,0x2d,0x2f,0x2b,0x2b,0x2b,0x2a,0x2a,0x28,0x02,0x2f,0x2d,0x2f,\r
+ 0x2f,0x29,0x27,0x27,0x26,0x25,0x25,0x25,0x25,0x26,0x26,0x03,0x03,\r
+ 0x9f,0x9a,0x97,0x98,0x99,0x9d,0x9f,0x9f,0x99,0x94,0x9b,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9e,0x99,0x94,\r
+ 0x94,0x97,0x9a,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0xf7,0xf7,0x2f,0x27,0xf7,0xf7,0xf7,0x2d,0x27,0x26,0x25,0x27,0x2a,\r
+ 0x2e,0x27,0x36,0x25,0x27,0x29,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2e,\r
+ 0x2d,0x2c,0x02,0xf7,0xf7,0xf7,0xf7,0x23,0x36,0x36,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x27,0x29,0x2a,0x2c,0x2e,0x2f,0x2f,0x2f,0x2f,0x9c,0x9c,0x9c,\r
+ 0x9d,0x9d,0x04,0x04,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x02,\r
+ 0xf7,0x02,0x05,0x06,0x05,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x07,\r
+ 0x07,0x05,0x03,0x02,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,0x05,0x04,0x03,\r
+ 0xf7,0xf7,0x03,0xf7,0x04,0x04,0x04,0x03,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0xf7,0xf7,0x02,0xf7,\r
+ 0x04,0x05,0x06,0x06,0x06,0x05,0x04,0x03,0x99,0x99,0x99,0x98,0x98,\r
+ 0x98,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9a,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,\r
+ 0x97,0x02,0x99,0x9a,0x9a,0x9b,0x99,0x99,0x9b,0x9d,0x9f,0x9f,0x03,\r
+ 0x27,0x27,0x27,0x28,0x2a,0x2b,0x2e,0x2c,0x2e,0x2b,0x2f,0x2c,0x2b,\r
+ 0x2c,0x2a,0x2a,0x2a,0x27,0x2f,0x2f,0x2d,0x2f,0x2e,0x28,0x27,0x26,\r
+ 0x26,0x25,0x25,0x25,0x25,0x26,0x02,0x03,0x03,0x9f,0x9a,0x97,0x98,\r
+ 0x9a,0x9d,0x9f,0x9f,0x98,0x94,0x9b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x99,0x9f,0x98,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x97,0x9e,0x9e,0x9d,0x9d,0x9d,0x2e,0xf7,0xf7,0xf7,0x27,\r
+ 0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x26,0x27,0x28,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2e,0x2e,0x2c,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0x26,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x23,0x23,0x27,0x29,0x2a,0x2c,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x9c,0x9d,0x9d,0x9d,0x9d,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x06,0x07,0x07,0x04,0xf7,0x02,0x06,0x07,0x06,0x06,\r
+ 0x06,0x03,0xf7,0xf7,0xf7,0x02,0x03,0x06,0x07,0x07,0x05,0x04,0x04,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x02,0xf7,0x05,0x05,0x04,0x02,0xf7,0xf7,0x02,0x02,0x04,0x04,\r
+ 0x03,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0x02,0xf7,0x05,0x05,0x06,0x07,0x07,0x05,\r
+ 0x04,0x03,0x03,0x9a,0x9a,0x9c,0x9b,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9b,0x9c,0x9e,0x9f,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x97,0x97,0x9d,0x9e,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x9a,0x9b,0x9d,0x9f,0x03,0x27,0x27,0x27,0x27,0x28,\r
+ 0x2a,0x2c,0x2e,0x2c,0x2e,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,\r
+ 0x2a,0x2f,0x2f,0x2c,0x2f,0x2c,0x27,0x27,0x26,0x25,0x25,0x25,0x25,\r
+ 0x25,0x02,0x02,0x03,0x03,0x9f,0x9a,0x97,0x98,0x9a,0x9d,0x9f,0x9f,\r
+ 0x98,0x94,0x9c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x9e,0x97,0x94,0x98,0x9e,0x9d,0x99,0x97,0x94,0x94,0x94,0x97,0x97,\r
+ 0x99,0x9e,0x9f,0x2a,0x2a,0x2e,0xf7,0xf7,0xf7,0x27,0x29,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2b,0x28,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0xf6,0x2f,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,\r
+ 0x2e,0x2e,0x2c,0x2d,0xf7,0xf7,0xf7,0xf7,0x2a,0x36,0x36,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x27,0x2a,0x2a,0x2c,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x9d,0x9e,0x9d,0x9d,0x9c,0x04,0x03,0x03,0x03,0x03,0x04,0x07,0x07,\r
+ 0x06,0x02,0xf7,0x04,0x06,0x05,0x05,0x05,0x06,0x05,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0x06,0x07,0x07,0x07,0x06,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,0x06,0x04,0x04,\r
+ 0x02,0xf7,0x03,0xf7,0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x05,0x06,0x06,0x07,0x07,0x06,0x05,0x04,0x04,0x04,0x9c,0x9d,\r
+ 0x9e,0x9f,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x99,0x97,0x98,0x02,0x9a,0x9a,0x9a,0x9b,0x9c,0x97,0x9b,\r
+ 0x9c,0x9e,0x9f,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,\r
+ 0x2c,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x2e,0x2f,0x2e,0x2d,\r
+ 0x2f,0x2a,0x27,0x27,0x26,0x25,0x25,0x25,0x25,0x02,0x02,0x02,0x03,\r
+ 0x03,0x9f,0x99,0x97,0x99,0x9a,0x9d,0x9f,0x9f,0x97,0x94,0x9c,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9d,0x99,0x94,\r
+ 0x94,0x94,0x94,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x9c,0x2c,0x2c,\r
+ 0x2c,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0x2a,0x23,0x2a,0x01,0x2e,0x2a,\r
+ 0x2c,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,0x2f,0x2c,0x2c,\r
+ 0x2f,0xf6,0x01,0xf7,0xf7,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2c,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x23,0x25,0x27,0x29,0x2a,0x2c,0x2e,0x2f,\r
+ 0x2f,0xf6,0x2f,0xf6,0x2f,0x2f,0x2e,0x2d,0x9e,0x9e,0x9e,0x9d,0x9c,\r
+ 0x03,0x03,0x03,0x03,0x03,0x06,0x07,0x07,0x04,0xf7,0x03,0x06,0x04,\r
+ 0x03,0x03,0x03,0x05,0x06,0x04,0xf7,0xf7,0x02,0x02,0x06,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x03,0x02,0x02,0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,0x04,\r
+ 0x04,0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,\r
+ 0x03,0x03,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x05,0x06,0x06,0x06,0x07,\r
+ 0x06,0x06,0x05,0x04,0x04,0x04,0x9f,0x9f,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x02,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9c,0x97,0x94,\r
+ 0x9b,0x9f,0x9a,0x9a,0x9a,0x9c,0x99,0x99,0x9b,0x9d,0x9f,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,0x2d,0x2b,0x2d,0x2f,0x2b,\r
+ 0x2b,0x2b,0x2a,0x2a,0x28,0xf6,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,\r
+ 0x26,0x25,0x25,0x25,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x99,0x97,\r
+ 0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9d,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x9f,0x9d,0x9c,0x9b,0x9a,\r
+ 0x9a,0x99,0x99,0x98,0x94,0x94,0xf7,0xf6,0x01,0x2f,0x2c,0x2a,0x2c,\r
+ 0x01,0xf7,0xf7,0xf7,0xf6,0x2a,0x2c,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x02,0x01,0x02,0x2c,0x2a,0x2d,0x2f,0x02,0x01,0x01,\r
+ 0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2d,0x2e,0x2c,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0x36,0x36,0x36,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x27,0x2a,0x2a,0x2c,0x2f,0x2f,0xf6,0x2f,0xf6,0x2f,0x2f,0x2f,\r
+ 0x2d,0x2c,0x2c,0x9e,0x9e,0x9e,0x9d,0x9c,0x03,0x03,0x03,0x03,0x04,\r
+ 0x07,0x07,0x06,0xf7,0xf7,0x06,0x05,0x02,0x02,0x03,0x03,0x04,0x06,\r
+ 0x06,0x02,0xf7,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x02,0x04,0x05,0x04,\r
+ 0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x03,0x03,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0xf7,0xf7,0xf7,\r
+ 0x03,0x02,0x05,0x06,0x05,0x06,0x07,0x07,0x06,0x05,0x05,0x05,0x05,\r
+ 0x05,0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x97,0x03,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x9a,0x9b,0x9d,0x29,0x27,0x27,0x27,0x27,0x27,0x28,\r
+ 0x2a,0x2b,0x2e,0x2c,0x2f,0x2b,0x2e,0x2c,0x2b,0x2c,0x2b,0x2a,0x2a,\r
+ 0x27,0x02,0x2f,0x2d,0x2f,0x2f,0x2a,0x27,0x27,0x26,0x25,0x25,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,0x9f,\r
+ 0x9f,0x97,0x94,0x9d,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9a,0x9a,0x9a,0x99,\r
+ 0x97,0xf7,0xf7,0xf6,0x2f,0x2f,0x2c,0x2a,0x2a,0x2f,0x01,0x01,0xf6,\r
+ 0x2f,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x01,0x2e,0x2c,0x2d,0x2f,0xf6,0x02,0x02,0x02,0x02,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2d,0x2a,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0x25,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x27,0x2a,0x2c,0x2e,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf6,0x2f,0x2f,0x2e,0x2d,0x2c,0x2a,0x2a,0x9e,0x9e,\r
+ 0x9d,0x9c,0x9b,0x03,0x03,0x03,0x04,0x07,0x07,0x06,0x03,0xf7,0x04,\r
+ 0x06,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x06,0x03,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x02,0xf7,0x05,0x04,0x04,0x02,0xf7,0x02,0x02,0x02,0x04,\r
+ 0x04,0x03,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x03,0x03,0x02,0xf7,0xf7,0x02,0x03,0x03,0x05,0x06,0x04,0x06,\r
+ 0x07,0x07,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x02,0x02,0x02,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x98,0x97,0x94,0x99,0x03,0x9a,0x9a,0x9a,0x9a,0x9c,0x94,0x9b,\r
+ 0x9c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,\r
+ 0x2e,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x29,0x28,0x2f,0x2f,0x2d,\r
+ 0x2f,0x2f,0x28,0x27,0x27,0x26,0x25,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9c,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9b,0x9b,0x9a,0x9a,0x99,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2d,0x2a,0x2a,0x2d,0x2f,0x01,0x01,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf6,0x28,0xf7,0xf7,0x2f,0x01,0xf7,0xf7,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0xf6,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2d,0x2e,0x2e,0x2c,0x2a,0xf7,0xf7,0xf7,0xf7,0x2a,0x35,\r
+ 0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x23,\r
+ 0x23,0x27,0x29,0x2a,0x2d,0x2f,0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2d,0x2c,0x2a,0x2a,0x2a,0x2a,0x9e,0x9d,0x9c,0x9b,0x9a,0x03,0x03,\r
+ 0x03,0x07,0x07,0x07,0x04,0xf7,0x02,0x06,0x04,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x04,0x06,0x04,0x02,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,0x06,0x04,\r
+ 0x03,0x02,0xf7,0x04,0xf7,0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0x02,0x03,0x04,0x06,0x05,0x04,0x06,0x07,0x07,0x07,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x07,0x01,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x98,0x97,0x94,\r
+ 0x9e,0x9f,0x9a,0x9a,0x9a,0x9b,0x99,0x97,0x9b,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,0x2d,0x2c,0x2f,0x2b,\r
+ 0x2b,0x2c,0x2a,0x2a,0x28,0x2a,0x2f,0x2f,0x2c,0x2f,0x2d,0x27,0x27,\r
+ 0x26,0x26,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x99,\r
+ 0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9c,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x03,0x03,0x9f,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9a,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2f,\r
+ 0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x36,0x2a,0xf7,0x2f,0x2f,\r
+ 0x01,0xf7,0x2f,0x2f,0x2f,0x2f,0xf6,0x2f,0x2f,0x2f,0x2f,0x02,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2f,0x2c,\r
+ 0x29,0x2c,0xf7,0xf7,0xf7,0xf7,0x36,0x36,0x36,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x23,0x25,0x27,0x29,0x2a,0x2d,0x2f,\r
+ 0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,0x2e,0x2c,0x2c,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2b,0x9d,0x9c,0x9b,0x9a,0x9a,0x03,0x04,0x07,0x07,0x07,0x04,0xf7,\r
+ 0xf7,0x06,0x05,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,\r
+ 0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0x02,0x03,0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,\r
+ 0x04,0x04,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x03,0x04,0x02,0xf7,0xf7,0x03,0x03,0x04,0x06,0x04,0x03,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9c,0x98,0x97,0x94,0x97,0x03,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x99,0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,\r
+ 0x29,0x2a,0x2d,0x2d,0x2d,0x2c,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,\r
+ 0x28,0x2f,0x2f,0x2e,0x2d,0x2f,0x2c,0x27,0x27,0x26,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,\r
+ 0x9f,0x9f,0x97,0x94,0x9c,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x9c,0x9c,0x9c,0x9b,0x9b,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0x2c,0x2f,0x2f,0x2e,0x2f,0x2f,\r
+ 0x02,0x02,0x02,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2d,0x2e,0x2f,0x2f,0x2a,0x27,0x2f,0xf7,0xf7,0xf7,\r
+ 0x2c,0x35,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,\r
+ 0x23,0x25,0x27,0x2a,0x2c,0x2e,0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2d,0x2c,0x2a,0x2a,0x2a,0x2a,0x2a,0x2b,0x2d,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9a,0x04,0x07,0x07,0x07,0x05,0xf7,0xf7,0x04,0x06,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x06,0x02,0xf7,0xf7,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,0x05,\r
+ 0x04,0x02,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x03,0x02,0x02,0x02,0x03,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x04,0x06,0x03,0x04,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9e,\r
+ 0x99,0x98,0x97,0x94,0x9a,0x03,0x9a,0x9a,0x9a,0x9a,0x9d,0x94,0x2d,\r
+ 0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,0x2c,\r
+ 0x2e,0x2b,0x2e,0x2d,0x2b,0x2b,0x2b,0x2a,0x2a,0x27,0x02,0x2f,0x2e,\r
+ 0x2e,0x2f,0x2a,0x27,0x27,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,\r
+ 0x9b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x9c,0x9c,0x9c,0x9c,0x9c,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0x01,\r
+ 0x2f,0x2c,0x2d,0x2f,0x2f,0x2f,0x2f,0xf6,0x01,0xf7,0x01,0x2f,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2d,0x2e,0x2f,\r
+ 0x2f,0x2d,0x28,0x27,0x02,0xf7,0xf7,0xf7,0x25,0x35,0x36,0x36,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x25,0x27,0x2a,0x2c,0x2e,\r
+ 0x2f,0x2f,0xf6,0xf6,0x2f,0x2f,0x2f,0x2c,0x2a,0x2a,0x29,0x2a,0x2a,\r
+ 0x2a,0x2b,0x2d,0x2f,0x9a,0x9a,0x9a,0x9a,0x9e,0x07,0x07,0x07,0x05,\r
+ 0xf7,0xf7,0x03,0x06,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x05,0x06,0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0xf7,0x05,0x04,0x04,0x02,0xf7,0x03,0x02,0x02,\r
+ 0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x03,0x05,0x06,0x03,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x9a,0x98,0x97,0x94,0x94,\r
+ 0x9d,0x9f,0x9a,0x9a,0x9a,0x9b,0x9c,0x02,0x2c,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,0x2f,0x2b,0x2f,0x2c,\r
+ 0x2b,0x2c,0x2a,0x2a,0x29,0x27,0xf6,0x2f,0x2d,0x2f,0x2f,0x2a,0x27,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,\r
+ 0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9a,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0x2f,0x2f,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2d,0x2d,0x2f,0x2f,0x2f,0x2e,0x2a,0x26,0x26,0x01,\r
+ 0xf7,0xf7,0xf7,0x25,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,\r
+ 0x23,0x23,0x27,0x29,0x2a,0x2d,0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2e,0x2c,0x2a,0x2a,0x29,0x29,0x29,0x2a,0x2b,0x2d,0x2f,0x02,0x9a,\r
+ 0x9a,0x9a,0x9f,0xf7,0x07,0x07,0x06,0xf7,0xf7,0x02,0x06,0x06,0x04,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x06,0x02,0xf7,\r
+ 0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0x02,0x06,\r
+ 0x04,0x04,0x02,0xf7,0x04,0xf7,0x03,0x04,0x04,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0xf7,\r
+ 0xf7,0xf7,0x03,0x04,0x05,0x06,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x9d,0x99,0x98,0x97,0x94,0x97,0x9f,0x9d,0x9a,0x9a,\r
+ 0x9a,0x9c,0x2f,0x2f,0x2c,0x2c,0x29,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x28,0x2a,0x2c,0x2e,0x2c,0x2d,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,\r
+ 0x28,0x28,0x2f,0x2f,0x2c,0x2f,0x2f,0x28,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x98,0x97,0x99,0x9a,\r
+ 0x9e,0x9f,0x9f,0x97,0x94,0x99,0x03,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x27,0x23,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2d,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2e,0x2c,0x27,0x23,0x26,0x01,0xf7,0xf7,0xf7,0x27,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x25,0x27,0x2a,0x2c,0x2e,\r
+ 0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,0x2d,0x2c,0x2a,0x29,0x29,0x28,\r
+ 0x29,0x2a,0x2b,0x2e,0x2f,0x02,0x01,0x9a,0x9b,0x9f,0xf7,0xf7,0x07,\r
+ 0x05,0xf7,0xf7,0x02,0x05,0x06,0x05,0x04,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x06,0x06,0x02,0xf7,0xf7,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x06,0x02,0x03,0x05,0x04,0x04,0xf7,0xf7,0x04,0xf7,\r
+ 0x03,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x05,\r
+ 0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9f,0x9a,\r
+ 0x98,0x98,0x97,0x94,0x98,0x03,0x9b,0x9a,0x9a,0x9a,0x2b,0x02,0x2f,\r
+ 0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,\r
+ 0x2c,0x2c,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x2c,0x2f,0x2f,\r
+ 0x2d,0x2f,0x2d,0x9f,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x9e,0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x98,\r
+ 0x94,0x97,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,\r
+ 0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf6,0xf6,0xf6,0xf6,\r
+ 0x2f,0xf6,0x02,0xf7,0xf7,0xf7,0xf7,0x2c,0x36,0x23,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2e,0x2e,0x2d,0x2c,0x2b,0x2a,0x2a,0x2a,0x28,0x27,\r
+ 0x23,0x25,0x2e,0xf7,0xf7,0xf7,0x2f,0x25,0x35,0x35,0x35,0x35,0x36,\r
+ 0x23,0x25,0x27,0x29,0x2a,0x2c,0x2e,0x2f,0x2f,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2f,0x2c,0x2a,0x2a,0x29,0x28,0x28,0x29,0x2a,0x2c,0x2f,0xf6,0x01,\r
+ 0x01,0x02,0x9c,0x03,0xf7,0xf7,0xf7,0x05,0xf7,0xf7,0x02,0x05,0x06,\r
+ 0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x07,\r
+ 0x04,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x05,0x02,0x05,\r
+ 0x05,0x04,0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0x03,0x04,0x05,0x05,0x02,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x9d,0x99,0x98,0x98,0x97,0x94,\r
+ 0x9a,0x03,0x9a,0x9a,0x9a,0x2c,0x2c,0x01,0x2d,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,0x2c,0x2e,0x2b,0x2e,0x2f,\r
+ 0x2b,0x2b,0x2b,0x2a,0x2a,0x27,0x2f,0x2f,0x2e,0x2d,0x2f,0x9d,0x9f,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x9e,0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x98,0x94,0x97,0x9e,0x03,\r
+ 0x02,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x94,0x94,0x94,0x94,0x94,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0xf6,0x02,0xf7,0xf7,\r
+ 0xf7,0xf6,0x23,0x36,0x2a,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2d,0x2c,\r
+ 0x2a,0x27,0x25,0x23,0x25,0x25,0x25,0x26,0x25,0x23,0x26,0x2e,0xf7,\r
+ 0xf7,0xf7,0x2f,0x25,0x35,0x35,0x35,0x36,0x26,0x29,0x2a,0x2c,0x2d,\r
+ 0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,0x2e,0x2c,0x2a,0x29,0x28,0x28,\r
+ 0x28,0x29,0x2a,0x2c,0x2f,0xf6,0x01,0x01,0xf6,0x2e,0x02,0xf7,0xf7,\r
+ 0xf7,0x9c,0xf7,0xf7,0x02,0x04,0x06,0x05,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x06,0x07,0x06,0x02,0xf7,0xf7,0xf7,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,\r
+ 0x05,0x06,0x07,0x07,0x05,0x03,0x06,0x05,0x04,0x04,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x03,0x04,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,\r
+ 0x04,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0x9f,0x9c,0x99,0x98,0x97,0x97,0x94,0x9b,0x03,0x99,0x9a,\r
+ 0x2e,0x2c,0x2e,0xf6,0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x28,0x2a,0x2c,0x2e,0x2c,0x2f,0x2b,0x2f,0x2c,0x2b,0x2c,0x2a,0x2a,\r
+ 0x29,0x27,0x02,0x2f,0x2e,0x2e,0x98,0x9e,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x9f,0x9e,0x98,0x97,0x99,\r
+ 0x9a,0x9e,0x9f,0x9f,0x98,0x94,0x94,0x9a,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x94,0x94,0x94,0x94,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0x01,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0x27,0x35,0x2a,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2f,0x2e,0x2c,0x2e,0xf7,0xf7,0x01,0xf6,0x2c,0x27,\r
+ 0x25,0x23,0x27,0x28,0x2a,0x27,0x26,0x27,0x01,0xf7,0xf7,0xf6,0x26,\r
+ 0x35,0x35,0x35,0x27,0x2c,0x2d,0x2e,0x2f,0xf6,0x02,0xf6,0xf6,0x2f,\r
+ 0x2f,0x2d,0x2a,0x2a,0x29,0x28,0x28,0x28,0x29,0x2a,0x2c,0x2f,0x02,\r
+ 0x01,0x02,0x2f,0x2b,0x36,0xf7,0xf7,0xf7,0x99,0x97,0xf7,0x02,0x04,\r
+ 0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x07,0x06,0x03,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x05,\r
+ 0x06,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x06,0x03,0x02,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,0x9f,0x9d,\r
+ 0x99,0x98,0x97,0x97,0x97,0x9f,0x9e,0x9a,0x2e,0x2d,0x2c,0xf6,0x2f,\r
+ 0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,\r
+ 0x2c,0x2e,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x27,0x2f,0x2f,\r
+ 0x2d,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x9f,0x9e,0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,\r
+ 0x98,0x94,0x94,0x98,0x9c,0x9e,0x9f,0x9f,0x9e,0x9f,0x9e,0x99,0x99,\r
+ 0x98,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0x01,0xf7,0xf7,0x2c,0x35,0x27,0xf7,0xf7,0x01,0xf6,0x2e,0x2c,0x2a,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x27,0x27,0x2e,0xf7,\r
+ 0xf7,0xf7,0x02,0x2a,0x2a,0xf7,0xf7,0x02,0x26,0x35,0x35,0x27,0x2f,\r
+ 0x2f,0x2f,0xf6,0x02,0x02,0xf6,0x2f,0x2f,0x2c,0x2a,0x29,0x28,0x27,\r
+ 0x28,0x28,0x2a,0x2a,0x2c,0x2f,0x02,0x01,0x02,0x2f,0x28,0x35,0x35,\r
+ 0xf7,0x01,0x97,0x97,0x97,0x02,0x04,0x05,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x04,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x03,0x04,\r
+ 0x06,0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x03,0x9e,0x9a,0x98,0x97,0x97,\r
+ 0x98,0x02,0x9a,0x2f,0x2e,0x2c,0x2b,0x01,0x2d,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,0x2c,0x2c,0x2c,0x2f,\r
+ 0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x2a,0x2f,0x2e,0x9b,0x99,0x9a,0x9f,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x01,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x9f,0x9d,0x97,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x99,0x94,0x94,0x94,\r
+ 0x99,0x9a,0x9b,0x9c,0x9d,0x9c,0x99,0x99,0x99,0x98,0x98,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0x25,0x27,\r
+ 0xf7,0xf7,0x01,0xf6,0x2e,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2f,0x28,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x28,0xf7,0xf7,0x2f,0x36,0x35,0x23,0x2f,0x02,0x02,0x01,0x02,0xf6,\r
+ 0x2f,0x2d,0x2c,0x2a,0x29,0x27,0x27,0x28,0x29,0x2a,0x2a,0x2e,0x2f,\r
+ 0x02,0x01,0xf6,0x2f,0x27,0x35,0x35,0x35,0x03,0x97,0x97,0x94,0x99,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x06,\r
+ 0x06,0x05,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x05,0xf7,0x02,0xf7,0xf7,0x02,0x04,0x03,0x04,0x03,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x03,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x06,0x02,0x03,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0x9f,0x9a,0x98,0x97,0x94,0x99,0x02,0x2f,0x2e,\r
+ 0x2e,0x2c,0x2c,0xf6,0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x28,0x2a,0x2b,0x2d,0x2c,0x2e,0x2b,0x2d,0x2f,0x2c,0x2b,0x2b,0x2a,\r
+ 0x29,0x27,0x2f,0x2f,0x9a,0x9a,0x98,0x9a,0x9f,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x9f,0x9c,0x97,0x97,\r
+ 0x99,0x9a,0x9e,0x9f,0x9f,0x9a,0x94,0x94,0x94,0x94,0x98,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,0xf7,0xf6,0x2e,0x2a,\r
+ 0x01,0xf7,0xf7,0xf6,0x36,0x35,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,\r
+ 0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0xf7,0xf7,0x2a,\r
+ 0x35,0x23,0x02,0x01,0x01,0x01,0xf6,0x2f,0x2e,0x2c,0x29,0x28,0x27,\r
+ 0x27,0x27,0x29,0x2a,0x2c,0x2e,0x2f,0x01,0x01,0x2f,0x2c,0x23,0x35,\r
+ 0x35,0x35,0x2c,0x97,0x94,0x94,0x9b,0x9e,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x04,0x03,0x04,0x06,0x06,0x05,0x04,0xf7,0x02,0xf7,\r
+ 0xf7,0x03,0x03,0x03,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x02,0xf7,0xf7,0xf7,0x04,0x04,\r
+ 0x05,0x06,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x9f,0x9a,0x97,0x97,0x97,0x9d,0x29,0x2f,0x2e,0x2d,0x2c,0x2f,0x2f,\r
+ 0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,\r
+ 0x2c,0x2f,0x2b,0x2e,0x2c,0x2c,0x2b,0x2a,0x2a,0x28,0x27,0x02,0x9a,\r
+ 0x9a,0x9a,0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x9f,0x9c,0x97,0x97,0x99,0x9a,0x9e,0x9f,\r
+ 0x9f,0x9c,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x99,0x99,0x98,\r
+ 0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2a,0xf7,0xf7,0xf7,0x27,0x36,0x36,\r
+ 0x36,0x35,0x35,0x35,0x35,0x2a,0xf7,0xf7,0x2a,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2a,0xf7,0x01,0x36,0x36,0x01,0xf7,0x01,\r
+ 0x02,0x2f,0x2e,0x2a,0x29,0x27,0x27,0x27,0x27,0x29,0x2a,0x2c,0x2f,\r
+ 0x02,0x01,0x02,0x2f,0x2a,0x36,0x35,0x35,0x35,0x02,0xf7,0x94,0x94,\r
+ 0x9e,0x9d,0x9c,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x05,0x05,\r
+ 0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x03,\r
+ 0x06,0x06,0x05,0x03,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,0x03,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x02,0x02,0xf7,0xf7,0x04,0x04,0x05,0x05,0x02,0x04,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x9a,0x97,0x97,\r
+ 0x97,0x27,0x2c,0x2f,0x2e,0x2d,0x2b,0x01,0x2e,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,0x2e,0x2c,0x2f,\r
+ 0x2c,0x2c,0x2b,0x2a,0x29,0x27,0x27,0x97,0x9a,0x9a,0x9a,0x98,0x9e,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x9f,0x9c,0x97,0x97,0x99,0x9b,0x9e,0x9f,0x9f,0x9d,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0x2a,0x2f,0xf7,0xf7,0x23,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x36,0x2f,0xf7,0x2d,0xf7,0xf7,0xf7,0x02,0x2e,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0x01,0xf7,0x25,0x36,0xf7,0xf7,0x01,0xf6,0x2e,0x2c,0x2a,0x27,\r
+ 0x27,0x27,0x27,0x29,0x2a,0x2d,0x2f,0x02,0x01,0x02,0x2f,0x27,0x35,\r
+ 0x35,0x35,0x36,0xf7,0xf7,0xf7,0x99,0x9f,0x9d,0x9c,0x9c,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x04,0x06,0x07,0x07,0x07,0x06,0x06,0x05,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x05,0x04,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0x03,0x03,0x02,0x04,0x04,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x04,0x04,0x03,0xf7,0x02,0xf7,0xf7,0x04,\r
+ 0x04,0x05,0x05,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x99,0x97,0x97,0x2f,0x26,0x2f,0x2f,\r
+ 0x2e,0x2c,0x2c,0x02,0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x29,0x2a,0x2d,0x2d,0x2d,0x2c,0x2d,0x2f,0x2c,0x2b,0x2b,0x2a,\r
+ 0x28,0x27,0x9f,0x99,0x9a,0x9a,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x9f,0x9c,0x97,\r
+ 0x98,0x99,0x9a,0x9e,0x9f,0x9f,0x9e,0x99,0x94,0x94,0x94,0x94,0x98,\r
+ 0x98,0x98,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x2b,0xf7,0xf7,0x26,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x23,0x35,0x35,0x25,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0x2d,0x2a,0x2a,0x2c,0x01,0xf7,0xf7,0x2b,0xf7,0x28,0x35,\r
+ 0xf7,0xf7,0x01,0x2f,0x2c,0x2a,0x28,0x27,0x27,0x27,0x2a,0x2a,0x2d,\r
+ 0x2f,0x01,0x01,0xf6,0x2d,0x26,0x35,0x35,0x35,0x23,0xf7,0xf7,0xf7,\r
+ 0x2e,0x9e,0x9c,0x9c,0x9b,0x9a,0x02,0x02,0x02,0x03,0x03,0x03,0x04,\r
+ 0x04,0x04,0x05,0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x05,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,\r
+ 0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,0x02,0x03,0x04,\r
+ 0x04,0x03,0xf7,0x03,0xf7,0x02,0x04,0x04,0x05,0x04,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x9f,0x98,0x97,0x02,0x2c,0x28,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,\r
+ 0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,\r
+ 0x2c,0x2f,0x2b,0x2e,0x2f,0x2c,0x2b,0x2a,0x29,0x27,0x03,0x9a,0x9a,\r
+ 0x9a,0x9a,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9c,0x97,0x98,0x99,0x9a,0x9e,\r
+ 0x9f,0x9f,0x9f,0x9b,0x98,0x94,0x94,0x9b,0x9b,0x9b,0x9b,0x9a,0x02,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0x2a,0xf7,0xf7,0x2f,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x36,0x36,0x35,0x35,0x2f,0xf7,0x2f,0xf7,0xf7,0x2e,0x2a,0x2a,\r
+ 0x2a,0x2e,0xf7,0xf7,0x2e,0xf7,0x2b,0x35,0xf7,0xf7,0x02,0x2f,0x2b,\r
+ 0x2a,0x27,0x27,0x28,0x2a,0x2b,0x2e,0xf6,0x01,0x01,0x2f,0x2c,0x23,\r
+ 0x35,0x36,0x35,0x2a,0xf7,0xf7,0xf7,0x2a,0x2c,0x9c,0x9b,0x9b,0x99,\r
+ 0x97,0xf7,0xf7,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x04,0xf7,0xf7,\r
+ 0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,\r
+ 0x02,0xf7,0xf7,0x02,0x03,0x03,0x03,0x03,0x05,0x04,0x04,0x03,0x03,\r
+ 0xf7,0xf7,0xf7,0x03,0x03,0x02,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x04,0x03,0xf7,0x02,0xf7,0x02,\r
+ 0x04,0x04,0x06,0x03,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9d,0x94,0xf6,\r
+ 0xf6,0x27,0x2c,0x2f,0x2e,0x2d,0x2b,0x02,0x2e,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2d,0x2c,0x2f,0x2c,0x2e,\r
+ 0x2c,0x2c,0x2a,0x2a,0x28,0x03,0x03,0x97,0x9a,0x9a,0x9a,0x98,0x9a,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x9f,0x9b,0x97,0x98,0x99,0x9a,0x9e,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9b,0x99,0x9c,0x9c,0x9c,0x9c,0x9c,0x2f,0x2f,0xf6,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2d,0xf6,0xf7,0xf7,\r
+ 0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x2a,0xf7,0x25,0xf7,0xf7,0x02,0x2f,0x2d,0x2c,0x2d,0xf7,0xf7,0x2d,\r
+ 0xf7,0x2a,0x36,0xf7,0xf7,0xf6,0x2d,0x2a,0x28,0x27,0x29,0x2a,0x2c,\r
+ 0x2f,0x02,0x01,0x02,0x2f,0x2a,0x36,0x35,0x35,0x35,0x02,0xf7,0xf7,\r
+ 0xf7,0x2a,0x2d,0x2f,0x9b,0x9a,0x98,0x94,0x94,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x03,0x04,0x04,0x05,0x03,0xf7,0x02,0x02,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0xf7,0x02,0x04,0x06,\r
+ 0x06,0x06,0x05,0x04,0x04,0x03,0x02,0xf7,0xf7,0x02,0xf7,0x03,0x03,\r
+ 0x03,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x04,0xf7,0x02,0x02,0xf7,0x03,0x04,0x04,0x06,0x02,0x02,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x97,0xf6,0x2f,0x26,0x2f,0x2f,\r
+ 0x2e,0x2c,0x2c,0x01,0x2d,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x28,0x2a,0x2c,0x2d,0x2c,0x2e,0x2d,0x2f,0x2c,0x2c,0x2a,0x9f,\r
+ 0x9f,0x03,0x03,0x94,0x9a,0x9a,0x9a,0x98,0x9a,0x9f,0x03,0x02,0x02,\r
+ 0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9b,\r
+ 0x97,0x98,0x99,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,0x9f,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2d,0x2e,0x2c,0xf7,0xf7,0xf6,0x35,0x35,0x35,0x35,0x25,\r
+ 0x2c,0x2e,0x27,0x36,0x35,0x35,0x35,0x36,0x23,0xf7,0x2a,0x01,0xf7,\r
+ 0xf7,0x01,0x02,0xf6,0x02,0xf7,0xf7,0x2a,0xf7,0x2a,0x36,0xf7,0xf7,\r
+ 0x2f,0x2e,0x2a,0x2a,0x2a,0x2a,0x2d,0x2f,0x02,0x01,0xf6,0x2e,0x27,\r
+ 0x35,0x35,0x35,0x36,0xf7,0xf7,0xf7,0x2f,0x2a,0x2e,0x2f,0xf6,0x99,\r
+ 0x97,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,\r
+ 0x02,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x03,0x06,0x06,0x05,0x05,0x04,0x04,0x04,\r
+ 0x02,0xf7,0xf7,0x03,0x03,0x02,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x03,0xf7,0x03,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x06,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x9a,0x06,0xf6,0x2f,0x27,0x2f,0x2f,0x2d,0x2c,0x2e,0xf6,\r
+ 0x2c,0x2c,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2c,\r
+ 0x2c,0x2e,0x2c,0x2e,0x2f,0x2c,0x2b,0x9d,0x9f,0x9f,0x03,0x03,0x97,\r
+ 0x9a,0x9a,0x9a,0x98,0x9c,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,0x01,\r
+ 0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9b,0x97,0x98,0x99,0x9a,\r
+ 0x9d,0x9e,0x9f,0x9f,0x9f,0x99,0x99,0x99,0x99,0x99,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2e,0x2c,0x2f,\r
+ 0xf7,0xf7,0x27,0x35,0x35,0x35,0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0x35,0x35,0x35,0x27,0xf7,0xf7,0x27,0x01,0x01,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0xf7,0x29,0xf7,0x25,0x36,0xf7,0xf7,0x02,0x2f,0x2d,0x2c,0x2d,\r
+ 0x2f,0x2f,0x01,0x02,0x2f,0x2c,0x25,0x35,0x35,0x35,0x26,0xf7,0xf7,\r
+ 0xf7,0x2a,0x2c,0x2f,0x2f,0x02,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x02,0x02,0x03,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,\r
+ 0x04,0x06,0x03,0x03,0x03,0x03,0x04,0x03,0xf7,0xf7,0x03,0x07,0x04,\r
+ 0x02,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x02,0xf7,0x05,0xf7,0xf7,0x02,0x04,0x05,0x06,0x02,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x0b,0xf6,\r
+ 0xf6,0x2a,0x2a,0x2f,0x2f,0x2d,0x2b,0xf6,0x2f,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,0x2c,0x2f,0x2b,0x2e,\r
+ 0x2d,0x2c,0x9d,0x9e,0x9f,0x03,0x03,0x9e,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x9d,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x9f,0x9b,0x97,0x97,0x99,0x9a,0x9b,0x9d,0x9e,0x9e,\r
+ 0x98,0x98,0x98,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0xf6,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0xf7,0x2f,0x2d,0x2e,0x2b,0xf7,0xf7,0xf7,0x23,0x35,0x35,\r
+ 0x25,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x35,0x35,0x2f,0xf7,\r
+ 0xf7,0x28,0x2e,0x2f,0x2f,0xf6,0x02,0xf7,0xf7,0x2c,0xf7,0xf7,0x35,\r
+ 0x36,0x01,0x01,0x01,0xf6,0x2f,0x2f,0x2f,0xf6,0x02,0x2f,0x2e,0x29,\r
+ 0x36,0x35,0x36,0x35,0x2d,0xf7,0xf7,0xf7,0x2a,0x2d,0x2f,0xf6,0x01,\r
+ 0xf7,0xf7,0x94,0x94,0x97,0x97,0x94,0xf7,0xf7,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x05,0x06,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0x05,0x04,0x02,0x02,0x03,\r
+ 0x03,0x04,0x03,0xf7,0xf7,0xf7,0x04,0xf7,0x02,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x03,0x07,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xd7,0x2f,0xf6,0x2f,0x27,0x2e,0x2f,\r
+ 0x2e,0x2c,0x2a,0x01,0x2e,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x28,0x2a,0x2c,0x2d,0x2c,0x2f,0x2c,0x2e,0x3a,0x9c,0x9e,0x9e,\r
+ 0x9f,0x03,0x02,0x99,0x9a,0x9a,0x9a,0x99,0x99,0x9e,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,\r
+ 0x9c,0x97,0x97,0x98,0x99,0x9a,0x9a,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x01,0x01,0x02,0x02,0x02,0x02,0xf6,0xf6,0xf6,0xf6,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2d,0x2e,\r
+ 0x2d,0x2a,0xf7,0xf7,0xf7,0x36,0x35,0x35,0xf6,0xf7,0xf7,0x2d,0x27,\r
+ 0x29,0x2d,0xf7,0xf7,0x25,0x35,0xf7,0xf7,0x2f,0x2c,0x2c,0x2e,0x2f,\r
+ 0x2f,0xf6,0x01,0x2c,0x27,0xf7,0x29,0x35,0x36,0x2f,0x2f,0xf6,0x2f,\r
+ 0x2e,0x2c,0x2d,0x2e,0x2d,0x2a,0x25,0x35,0x35,0x36,0x35,0x01,0xf7,\r
+ 0xf7,0x01,0x2a,0x2e,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0x97,0x99,0x9a,\r
+ 0x9a,0x99,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x05,0x05,0x02,0x03,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x04,0xf7,0x04,0x04,0x02,0x02,0x03,0x03,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0xf7,0x07,0x03,0xf7,0x02,0x04,0x04,0x05,0xf7,\r
+ 0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2a,0xf6,0xf6,0x2f,0x25,0x2f,0x2f,0x2d,0x2c,0x2c,0x02,\r
+ 0x2c,0x2c,0x29,0x28,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,\r
+ 0x2c,0x2d,0x2e,0x2d,0x99,0x9c,0x9c,0x9e,0x9f,0x9f,0x03,0x02,0x97,\r
+ 0x9a,0x9a,0x9a,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x01,\r
+ 0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9c,0x98,0x97,0x98,\r
+ 0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x02,0x02,0x02,0xf6,0xf6,\r
+ 0xf6,0xf6,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2f,0x2c,0x2b,0xf7,0xf7,0xf7,\r
+ 0x35,0x35,0x36,0xf7,0xf7,0x2b,0x27,0x27,0x27,0x27,0x2a,0x02,0xf7,\r
+ 0x23,0x2f,0x2c,0x27,0x2c,0x2f,0x2f,0x2e,0x2e,0x2d,0x2a,0x27,0xf7,\r
+ 0xf7,0x35,0x35,0x35,0x23,0x27,0x27,0x26,0x25,0x25,0x26,0x25,0x23,\r
+ 0x35,0x35,0x35,0x36,0x35,0xf7,0xf7,0xf7,0x2c,0x2b,0x2f,0x2f,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9c,0x9e,0x9e,0x9e,0x9c,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x04,0x05,0x06,0x03,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x03,0x03,\r
+ 0x02,0x02,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x02,0x03,\r
+ 0xf7,0xf7,0x03,0x04,0x04,0x05,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x2b,0xf6,\r
+ 0xf6,0x2e,0x28,0x2f,0x2f,0x2d,0x2b,0x2f,0x2f,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2c,0x2c,0x2f,0x2c,0x9a,\r
+ 0x99,0x9c,0x9d,0x9d,0x9f,0x03,0x03,0x02,0x94,0x9a,0x9a,0x9a,0x98,\r
+ 0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x9f,0x9e,0x99,0x97,0x97,0x98,0x98,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x01,0x02,0x02,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,\r
+ 0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2e,0x2e,0x2f,0x2b,0x2f,0xf7,0xf7,0x01,0x35,0x35,0x23,0xf7,0xf7,\r
+ 0x27,0x27,0x27,0x29,0x2a,0x2a,0x2c,0x02,0xf7,0x36,0x26,0x2a,0x2d,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2e,0x2c,0xf7,0xf7,0xf7,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0xf7,\r
+ 0xf7,0xf7,0x2a,0x2c,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x2b,\r
+ 0x9f,0x03,0x9f,0x9e,0x9e,0x03,0xf7,0xf7,0xf7,0x03,0x03,0x03,0x05,\r
+ 0x06,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x02,0x02,0x04,0x02,0x02,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x02,0xf7,0x03,0xf7,0xf7,0xf7,0xf7,0x04,0x04,0x05,\r
+ 0xf7,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x2d,0xf6,0xf6,0x29,0x2c,0x2f,\r
+ 0x2e,0x2c,0x2a,0x01,0x2e,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x28,0x2a,0x2b,0x2d,0x2c,0x98,0x9d,0x9a,0x9a,0x9c,0x9e,0x9e,\r
+ 0x9f,0x03,0x03,0x03,0x98,0x9a,0x9a,0x9a,0x98,0x9b,0x9f,0x03,0x02,\r
+ 0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9e,0x9c,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x01,0x02,\r
+ 0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2d,0x2e,0x2f,0x2f,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2f,0x2f,0x2a,0xf6,\r
+ 0xf7,0xf7,0x02,0x35,0x35,0x27,0xf7,0xf6,0x28,0x28,0x2a,0x2d,0x2f,\r
+ 0x2e,0x2e,0x2f,0xf7,0x01,0x27,0x2c,0x2f,0x2f,0xf6,0x2f,0x2d,0x2d,\r
+ 0x2a,0x01,0xf7,0xf7,0x35,0x35,0x35,0x35,0x35,0x23,0x27,0x25,0x36,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0xf7,0xf7,0xf7,0x29,0x2c,0x2e,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0x27,0x27,0x9f,0x9f,0x9f,0x9e,0x9e,\r
+ 0x04,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x05,0x06,0x07,0x07,0x06,0x04,\r
+ 0x04,0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x03,0xf7,0x05,0xf7,0x02,0x03,0x03,0x03,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x04,0xf7,0xf7,0x02,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x02,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x25,0x26,0x2f,0xf6,0x2f,0x25,0x2f,0x2f,0x2d,0x2c,0x2c,0x01,\r
+ 0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,\r
+ 0x2d,0x9c,0x99,0x9c,0x9a,0x9b,0x9c,0x9e,0x9f,0x9f,0x03,0x02,0x9c,\r
+ 0x99,0x9a,0x9a,0x99,0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,\r
+ 0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9e,\r
+ 0x9c,0x99,0x99,0x99,0x9a,0x9a,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2d,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2e,0x2f,0x2f,0x28,0xf7,0xf7,0xf7,0x2f,0x35,0x35,\r
+ 0x27,0xf7,0x2f,0x28,0x29,0x2c,0x2f,0xf6,0xf6,0x2f,0x2f,0x02,0xf7,\r
+ 0x2d,0x27,0xf7,0x01,0x2f,0x2f,0x2f,0x2e,0x2a,0x2a,0xf7,0x2f,0x35,\r
+ 0x35,0x35,0x27,0xf7,0xf7,0xf7,0xf7,0x2f,0x25,0x35,0x35,0x35,0x35,\r
+ 0xf6,0xf7,0xf7,0x29,0x2c,0x2e,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x2a,\r
+ 0x27,0x27,0x27,0x9f,0x9e,0x9d,0x9d,0x9e,0x04,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x03,0x05,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x06,0xf7,0x02,\r
+ 0x03,0x03,0x03,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x04,\r
+ 0x04,0x04,0xf7,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x02,\r
+ 0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x27,0x2f,\r
+ 0xf6,0x2f,0x27,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x9c,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9c,0x9c,0x9e,0x9f,0x9f,0x03,0x02,0x97,0x9a,0x9a,0x9a,0x99,\r
+ 0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x98,0x98,0x98,0x99,\r
+ 0x99,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,\r
+ 0x2f,0x27,0xf7,0xf7,0xf7,0x2a,0x35,0x35,0x25,0xf7,0x01,0x29,0x2a,\r
+ 0x2c,0x2f,0xf6,0x02,0xf6,0xf6,0x01,0xf7,0xf7,0x2d,0x2e,0xf7,0xf7,\r
+ 0x01,0x2f,0x2e,0x2a,0x27,0xf7,0x2c,0x35,0x25,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x27,0xf7,0xf7,0x28,0x2c,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x28,0x27,0x27,0x27,0x2b,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9d,0x04,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x06,0x06,0x04,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0xf7,0x04,0xf7,0x02,0x03,0x03,0x03,0x04,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x04,0x04,0x06,0x02,0xf7,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x29,0xf6,0xf6,0x2a,0x2c,0x2f,\r
+ 0x2e,0x2c,0x2a,0x01,0x2e,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x27,0x9f,0x9d,0x9b,0x9b,0x99,0x9c,0x9a,0x9a,0x9c,0x9d,0x9e,\r
+ 0x9f,0x9f,0x03,0x02,0x94,0x9a,0x9a,0x9a,0x99,0x98,0x9e,0x9f,0x03,\r
+ 0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x94,0x94,0x94,0x97,0x97,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2e,0x2e,0x2c,0x2c,0x2a,0x2a,0x2c,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,0x2d,0x27,0xf7,0xf7,0xf7,\r
+ 0x27,0x35,0x35,0x23,0xf7,0xf7,0x2a,0x2a,0x2b,0x2f,0xf6,0xf6,0xf6,\r
+ 0xf6,0x01,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0x2a,0x26,\r
+ 0x26,0x36,0x2f,0xf7,0xf7,0x2f,0x2c,0x2a,0x2a,0x2f,0xf7,0xf7,0xf7,\r
+ 0x36,0x35,0xf7,0xf7,0x27,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x27,0x26,0x27,0x2a,0x2b,0x2d,0x9c,0x9a,0x9a,0x9b,0x9c,0x04,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0x03,0x05,0x05,0x02,0xf7,0x02,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,\r
+ 0xf7,0x02,0xf7,0x03,0x04,0x03,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x03,0x06,0x02,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x25,0x2c,0xf6,0x2f,0x26,0x2f,0x2f,0x2e,0x2c,0x2b,0x01,\r
+ 0x2d,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x03,0x9f,0x9f,0x9d,\r
+ 0x9a,0x9c,0x98,0x9d,0x99,0x9a,0x9b,0x9e,0x9e,0x9f,0x9f,0x03,0x02,\r
+ 0x97,0x9b,0x9a,0x9a,0x99,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x97,\r
+ 0x97,0x97,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2d,0x2c,0x2c,\r
+ 0x2a,0x2a,0x29,0x2b,0x2f,0x2f,0x2f,0x2e,0x2f,0x01,0xf7,0xf7,0xf6,\r
+ 0x2f,0x2f,0x2f,0x2a,0x28,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x35,0xf7,\r
+ 0xf7,0x2e,0x2a,0x2a,0x2c,0x2f,0x2f,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0x01,0xf7,0x2f,0x27,0x27,0x26,0x28,0xf7,0xf7,0x2f,0x2a,\r
+ 0x28,0x27,0x27,0x27,0x27,0x29,0x2f,0xf7,0xf6,0x36,0x2c,0x26,0x2a,\r
+ 0x2e,0x02,0xf7,0xf7,0xf7,0xf7,0x2f,0x27,0x27,0x27,0x2b,0x2d,0x2f,\r
+ 0x2f,0x9a,0x9a,0x9a,0x9a,0x9b,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x05,0x04,0xf7,0x02,0x03,0x04,0x04,0x05,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x05,0xf7,0x03,0x04,\r
+ 0x04,0x04,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x03,0x03,0x03,0x03,0x05,\r
+ 0x04,0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x25,0x2f,\r
+ 0xf6,0x2f,0x27,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,0x2c,0x2b,0x29,0x27,\r
+ 0x27,0x27,0x27,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9b,0x98,0x9c,\r
+ 0x9a,0x9b,0x9b,0x9f,0x9f,0x9f,0x9f,0x03,0x9f,0x98,0x9b,0x9a,0x9a,\r
+ 0x98,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x97,0x97,0x97,0x94,0x94,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2f,0x2f,0x2d,0x2c,0x2c,0x2d,0x2d,0x2b,0x2a,0x2c,\r
+ 0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf6,0x29,0x2c,\r
+ 0xf7,0xf7,0x2f,0x36,0x35,0x35,0x35,0x2a,0xf7,0xf7,0x2c,0x2a,0x2a,\r
+ 0x2c,0x2d,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0x2f,0x2e,0x2e,0x2e,0x2a,\r
+ 0x2a,0x2a,0x2f,0xf7,0xf7,0x2f,0x2c,0x2c,0x2c,0x2c,0x2d,0x2c,0x2a,\r
+ 0x2a,0x2a,0x2f,0xf7,0x2a,0x23,0x28,0xf6,0x2f,0xf6,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2a,0x27,0x2a,0x2b,0x2d,0x2f,0x01,0x01,0x9a,0x99,0x99,0x9a,\r
+ 0x9a,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x03,0xf7,0x03,0x04,\r
+ 0x04,0x04,0x05,0x05,0x05,0x04,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0xf7,0x05,0xf7,0x02,0x04,0x04,0x04,0x02,0x04,0x04,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x06,0xf7,0xf7,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x04,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x01,0x01,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x2f,0xf6,0x2c,0x2a,0x2f,\r
+ 0x2e,0x2c,0x2a,0x02,0x2f,0x2c,0x2a,0x28,0x27,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x9e,\r
+ 0x9f,0x9e,0x9f,0x03,0x9b,0x9a,0x9b,0x9a,0x9a,0x98,0x9a,0x9f,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x97,0x97,0x97,0x97,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,0x2e,\r
+ 0x2c,0x2a,0x2b,0x2e,0x2d,0x2c,0x2c,0x2c,0x2e,0x2f,0x2e,0x2d,0x2e,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x25,0xf6,0xf7,0xf7,0x25,0x36,0x35,\r
+ 0x35,0x35,0x36,0x2f,0xf7,0xf7,0x01,0x2c,0x2b,0x2c,0x2e,0x2f,0x02,\r
+ 0xf7,0xf7,0xf7,0x2e,0x2c,0x2b,0x2b,0x2a,0x2b,0x2d,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0x2f,0x02,0x01,0xf7,0x01,0x02,0x2f,0x2d,0x2e,0xf6,0xf7,\r
+ 0x28,0x27,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0x2b,0x2b,0x2b,0x2d,0x2f,\r
+ 0x2f,0x01,0x01,0x01,0x99,0x99,0x99,0x9a,0x99,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x04,0x02,0xf7,0x03,0x03,0x04,0x04,0x05,0x05,0x06,\r
+ 0x06,0x04,0xf7,0xf7,0xf7,0x06,0x07,0x07,0x07,0x07,0x07,0x03,0x02,\r
+ 0x02,0xf7,0x05,0x04,0x04,0xf7,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x03,0x03,0x04,0x03,\r
+ 0x03,0x02,0x02,0x05,0x02,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x04,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9f,0x97,0x97,0x27,0x2f,0x2f,0x2e,0x2c,0x2b,0x01,\r
+ 0x2d,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,\r
+ 0x9b,0x9c,0x98,0x9d,0x9a,0x9a,0x9b,0x9e,0x9e,0x9e,0x9e,0x9e,0x02,\r
+ 0x98,0x9a,0x9b,0x9a,0x99,0x98,0x9b,0x9f,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x97,0x97,0x97,\r
+ 0x97,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2b,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2a,0x2c,0x2c,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,0x2e,0x2f,0x2f,0xf6,\r
+ 0x2c,0x25,0xf7,0xf7,0xf6,0x35,0x36,0x35,0x35,0x35,0x35,0x36,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x28,0x29,0x28,\r
+ 0x27,0x27,0x29,0x2a,0x2e,0xf7,0xf7,0x01,0xf6,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0xf6,0xf7,0xf7,0x2a,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2c,0x2f,0x2f,0x02,0x02,0x01,0x01,0xf7,0xf7,0x99,\r
+ 0x99,0x99,0x99,0x99,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x02,\r
+ 0xf7,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x04,0xf7,0xf7,\r
+ 0x02,0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0x05,0xf7,0x04,0x05,0x04,\r
+ 0xf7,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x03,0x02,0x04,0x03,0x03,0x03,0x02,0x02,0x06,\r
+ 0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x05,0x03,0x03,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0x01,\r
+ 0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x9a,\r
+ 0x97,0x98,0x02,0x99,0x99,0x9a,0x9c,0x9a,0x97,0x9b,0x9c,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x97,0x9d,\r
+ 0x99,0x9a,0x9b,0x9e,0x9e,0x9e,0x9d,0x9e,0x01,0x94,0x9b,0x9b,0x9a,\r
+ 0x99,0x98,0x9b,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x98,0x98,0x97,0x97,0x97,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0x2e,0x2b,0x2a,0x29,0x29,0x29,0x2a,0x2c,0x2e,0x2e,0x2e,\r
+ 0x2d,0x2d,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,0x27,0x2a,0xf7,0xf7,0x23,\r
+ 0x35,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x26,0x2a,0x2e,0x2e,\r
+ 0x2c,0x27,0x36,0x36,0x23,0x25,0x27,0x28,0x28,0x27,0x27,0x29,0x2a,\r
+ 0xf7,0xf7,0x01,0x02,0xf6,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0x01,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x99,0x98,0x99,0x99,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x05,0xf7,0xf7,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x02,0x05,0xf7,0x03,0x05,0x05,0x02,0x02,0x04,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x02,0x02,0x04,0x03,0x03,0x02,0x02,0x05,0x02,0xf7,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x03,\r
+ 0x03,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0xf7,0x01,0x02,0x9f,0x9f,0x9f,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x98,0x97,0x9a,0x9e,0x99,\r
+ 0x9a,0x9b,0x9d,0x97,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x99,0x9c,0x9a,0x9b,0x9b,0x9f,\r
+ 0x9e,0x9d,0x9c,0x9e,0x02,0x94,0x9b,0x9b,0x9a,0x99,0x98,0x9d,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x98,0x98,0x98,0x98,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,0x2c,0x2a,\r
+ 0x2a,0x2a,0x2a,0x2a,0x2c,0x2f,0x2f,0x2e,0x2d,0x2d,0x2d,0x2e,0x2f,\r
+ 0x2f,0xf6,0x2c,0x23,0xf7,0xf7,0x2f,0x35,0x36,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x2e,0xf7,0xf6,\r
+ 0x27,0x27,0x28,0x2a,0x2c,0x2a,0x28,0x28,0x2a,0xf7,0xf7,0x01,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x99,0x99,0x98,0x99,0x98,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,\r
+ 0x06,0x06,0x05,0xf7,0xf7,0x06,0x07,0x07,0x07,0x07,0x04,0xf7,0x02,\r
+ 0x02,0x05,0x05,0x03,0xf7,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x03,0xf7,0x04,0x04,0x03,\r
+ 0x03,0x02,0x03,0x05,0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x03,0x02,0x03,0x04,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0xf7,0x02,0x03,0x9f,0x9e,0x9e,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9f,0x97,0x97,0x03,0x9a,0x99,0x9a,0x9c,0x9d,0x94,\r
+ 0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9b,0x99,0x9a,0x9a,0x9a,0x9b,0x9c,0x9f,0x9d,0x9c,0x9b,0x9f,\r
+ 0x9f,0x98,0x9b,0x9a,0x9a,0x99,0x98,0x9d,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x99,0x99,0x99,0x98,0x97,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2e,0x2f,0x2e,0x2c,0x2b,0x2a,0x2c,0x2c,0x2d,\r
+ 0x2f,0x2f,0x2f,0x2e,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,0x25,0x2c,0xf7,\r
+ 0xf7,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x25,0x01,0xf7,0xf7,0xf7,0x2a,0x27,0x29,0x2a,\r
+ 0x2a,0x2a,0x29,0x27,0x29,0xf7,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x99,0x98,\r
+ 0x99,0x98,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x02,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x06,0x06,0x04,0xf7,\r
+ 0xf7,0x07,0x07,0x07,0x07,0x06,0xf7,0x06,0xf7,0x04,0x05,0x05,0xf7,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x04,0x03,0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0x06,0xf7,\r
+ 0xf7,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x03,0x02,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x01,0x03,0x9f,0x9d,0x9c,\r
+ 0x9e,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x9b,\r
+ 0x97,0x97,0x02,0x99,0x99,0x9a,0x9c,0x9c,0x94,0x9b,0x9c,0x9f,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x98,0x9d,\r
+ 0x9a,0x9a,0x9b,0x9d,0x9e,0x9c,0x9a,0x9a,0x03,0x9b,0x99,0x9b,0x9a,\r
+ 0x9a,0x98,0x99,0x9e,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x99,0x99,0x99,0x99,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,\r
+ 0x2f,0x2f,0x2e,0x2c,0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x2f,0x2e,0x2d,\r
+ 0x2e,0x2f,0x2f,0x2d,0x27,0x27,0xf7,0xf7,0x2b,0x35,0x35,0x35,0x36,\r
+ 0x23,0x23,0x23,0x36,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x36,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2a,0x28,0x2a,0x2a,0x2a,0x2a,0x29,0x27,\r
+ 0x27,0xf7,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x98,0x98,0x99,0x98,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x02,0x02,0x03,0x03,0x05,0x06,0x06,0x03,0xf7,0x04,0x07,0x07,0x07,\r
+ 0x07,0x02,0x04,0xf7,0x03,0x05,0x05,0xf7,0x03,0x03,0x04,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x02,\r
+ 0x02,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0xf7,0x03,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x02,0x02,0x02,0x02,0x03,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0x03,0x9d,0x9b,0x9b,0x9e,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x98,0x97,0x99,0x9f,0x99,\r
+ 0x99,0x9b,0x9c,0x99,0x98,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x97,0x9d,0x9a,0x9a,0x9b,0x9f,\r
+ 0x9d,0x9b,0x99,0x9a,0x02,0x97,0x9b,0x9c,0x9a,0x9a,0x98,0x99,0x9e,\r
+ 0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x99,0x99,\r
+ 0x99,0x99,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,\r
+ 0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2b,0x27,0x27,\r
+ 0xf7,0xf7,0x01,0x35,0x35,0x35,0x36,0x28,0x2a,0x2b,0x2b,0x2a,0x29,\r
+ 0x25,0x35,0x35,0x35,0x35,0x35,0x27,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x28,0x27,0x27,0xf7,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x98,0x98,0x98,0x98,0x97,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x03,0x02,0xf7,0x02,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x04,0x06,0x06,0x02,0xf7,0x07,0x07,0x07,0x07,0x04,0xf7,0x02,0x02,\r
+ 0x05,0x05,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0xf7,0x04,0x03,0x03,0x03,\r
+ 0x02,0x02,0x06,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x9e,\r
+ 0x9b,0x9a,0x9c,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9e,0x97,0x97,0x9e,0x9c,0x99,0x9a,0x9b,0x9d,0x94,\r
+ 0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9b,0x9a,0x99,0x9c,0x99,0x9b,0x9b,0x9f,0x9b,0x99,0x98,0x9b,\r
+ 0x01,0x94,0x9c,0x9c,0x9a,0x99,0x98,0x99,0x9e,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x99,0x99,0x99,0x98,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2d,0x2e,0x2f,0x2f,0x2f,0x2f,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2e,0x2d,0x2a,0x27,0x29,0xf7,0xf7,0xf7,0x36,0x35,0x35,\r
+ 0x23,0x2c,0x2e,0x2f,0x2f,0xf6,0x2f,0x2f,0x2a,0x36,0x35,0x35,0x23,\r
+ 0x2e,0xf7,0xf7,0xf7,0x01,0x2a,0x26,0x25,0x27,0x29,0x2a,0x2c,0x2c,\r
+ 0x2a,0x2a,0x29,0x27,0x26,0x25,0xf7,0xf6,0xf6,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x98,0x98,0x98,0x97,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0x02,0x02,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x06,0x06,0xf7,\r
+ 0x02,0x07,0x07,0x07,0x07,0xf7,0x06,0xf7,0x04,0x05,0x04,0xf7,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x04,0x03,0x02,0x04,0x04,0x03,0x03,0x02,0x02,0x05,0x03,0xf7,\r
+ 0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x9f,0x9d,0x9a,0x9a,0x9d,0x9f,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,\r
+ 0x97,0x97,0x03,0x9a,0x99,0x9a,0x9b,0x9d,0x94,0x9a,0x9c,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9b,0x99,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9c,0x9f,0x99,0x97,0x98,0x9c,0x03,0x97,0x9c,0x9c,\r
+ 0x9a,0x99,0x98,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x99,0x99,0x99,0x98,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0x2e,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,\r
+ 0x2f,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x23,0x2e,0x2f,0x02,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0x2d,0x35,0x35,0x28,0xf7,0xf7,0xf7,0x27,0x27,0x2e,\r
+ 0x01,0xf7,0x01,0x01,0xf6,0x2f,0x2c,0x2b,0x2c,0x2a,0x2a,0x27,0x27,\r
+ 0x25,0x23,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x98,0x98,0x98,0x98,0x97,0x02,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x02,\r
+ 0xf7,0x02,0x02,0x02,0x03,0x05,0x06,0x05,0xf7,0x06,0x07,0x07,0x07,\r
+ 0x02,0x02,0x02,0x02,0x05,0x05,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x03,0x02,0x03,\r
+ 0x04,0x03,0x03,0x02,0x02,0x03,0x06,0xf7,0xf7,0x02,0x05,0x06,0x06,\r
+ 0x06,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x9e,0x9b,0x9a,0x9b,0x9e,0x02,0xf7,0xf7,0x01,0xf7,0x01,0x02,\r
+ 0x03,0x03,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x97,0x97,0x98,0x02,0x99,\r
+ 0x99,0x9a,0x9c,0x9c,0x94,0x9b,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x97,0x9d,0x9a,0x9a,0x9a,0x9e,\r
+ 0x9d,0x97,0x97,0x99,0x9f,0x9c,0x99,0x9c,0x9b,0x9a,0x99,0x98,0x99,\r
+ 0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x98,0x98,0x97,0x97,\r
+ 0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2d,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0x36,0x35,\r
+ 0x35,0x23,0x2f,0xf6,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0x2f,0x35,\r
+ 0x27,0xf7,0xf7,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x02,0xf6,0x2f,0x2c,0x2a,0x2c,0x29,0x29,0x2a,0x2b,0x23,0xf7,0x2f,\r
+ 0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x98,\r
+ 0x98,0x98,0x97,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0xf7,0x02,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,\r
+ 0x03,0x05,0x06,0x03,0xf7,0x07,0x07,0x07,0x05,0xf7,0x05,0x02,0x04,\r
+ 0x05,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x04,0x03,0x02,0x03,0x04,0x03,0x03,0x03,0x02,\r
+ 0x02,0x06,0x03,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x9d,0x9a,0x9a,0x9c,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,0x9a,0x9a,0x9a,0x9e,0x9f,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x9c,0x97,0x97,0x99,0x03,0x99,0x99,0x9a,0x9c,0x99,\r
+ 0x98,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9b,0x9b,0x97,0x9d,0x9a,0x9a,0x9a,0x9f,0x99,0x94,0x97,0x99,\r
+ 0x02,0x97,0x9a,0x9c,0x9b,0x9a,0x99,0x98,0x99,0x9b,0x9e,0x9f,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x2e,0x2c,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x35,0x35,0x35,0x23,0x2f,0x02,0x01,0x01,\r
+ 0x02,0x02,0xf6,0x01,0xf7,0xf7,0x2a,0x35,0x01,0xf7,0x2d,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2f,0xf6,0x01,0x01,0x01,0x02,0xf6,0xf6,0x2f,\r
+ 0x2a,0x2d,0x2f,0xf7,0xf7,0xf6,0x25,0xf7,0x2e,0x2d,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x98,0x98,0x98,0x97,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0xf7,0x02,0x02,0x03,0x05,0x06,0xf7,\r
+ 0x04,0x07,0x07,0x07,0xf7,0x05,0x02,0x03,0x04,0x04,0xf7,0x03,0x04,\r
+ 0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x04,0x06,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,0x02,0x02,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x9b,0x9a,0x9b,0x9d,0x01,0xf7,0xf7,0xf7,0x9f,\r
+ 0x98,0x97,0x97,0x97,0x98,0x99,0x9b,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,\r
+ 0x97,0x97,0x9c,0x9f,0x99,0x9a,0x9b,0x9d,0x94,0x99,0x9b,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x99,\r
+ 0x9b,0x9a,0x9a,0x9a,0x9f,0x94,0x94,0x98,0x99,0x01,0x94,0x9c,0x9d,\r
+ 0x9b,0x9a,0x99,0x98,0x98,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,0x94,\r
+ 0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2d,\r
+ 0x2d,0x2e,0x2e,0x2e,0x2d,0x2c,0x2e,0xf7,0xf7,0xf7,0xf7,0x2a,0x35,\r
+ 0x35,0x35,0x23,0x2f,0x02,0x01,0x01,0xf6,0x2f,0x2f,0x2f,0x01,0xf7,\r
+ 0xf7,0x25,0x25,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2c,0x2e,0x2f,0x02,0x01,0x01,0x02,0x02,0xf6,0x28,0xf6,0xf7,0xf7,\r
+ 0xf7,0x2c,0x27,0xf7,0x2c,0x2c,0x2f,0x01,0xf7,0x01,0x01,0xf6,0x01,\r
+ 0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x98,0x98,0x98,0x97,0x97,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x03,0x03,\r
+ 0x03,0x02,0xf7,0xf7,0x02,0x03,0x05,0x05,0xf7,0x07,0x07,0x07,0x02,\r
+ 0x02,0x03,0x02,0x04,0x04,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,0x04,0x04,0x03,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x9a,\r
+ 0x9a,0x9c,0x9f,0xf7,0xf7,0xf7,0x9c,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x99,0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9e,0x98,0x97,0x97,0x9f,0x9b,\r
+ 0x99,0x9a,0x9b,0x9d,0x94,0x9a,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x98,0x9c,0x9a,0x9a,0x9a,0x9d,\r
+ 0x9e,0x94,0x97,0x99,0x9c,0x02,0x94,0x9d,0x9d,0x9b,0x9a,0x99,0x98,\r
+ 0x98,0x99,0x9a,0x9b,0x9d,0x9e,0x9e,0x94,0x94,0x94,0x94,0x94,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,\r
+ 0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2e,0x2e,0x2c,0x2a,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x35,0x26,0x2f,0x02,0x01,\r
+ 0x01,0x2f,0x2f,0x2d,0x2e,0x2f,0x01,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2e,0x2f,0x2f,0x2f,0x2c,0x2a,0x2a,0x2a,0x2c,0x2f,0x2f,\r
+ 0xf6,0x01,0x01,0x01,0x01,0x26,0xf7,0xf7,0xf7,0x2f,0x36,0x27,0xf7,\r
+ 0x2c,0x2b,0x2e,0xf6,0x02,0x02,0x02,0x01,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x98,0x98,0x97,\r
+ 0x97,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0x03,0x03,0x02,0x02,0x03,0x04,0x04,0x03,0x02,0xf7,0x02,\r
+ 0x02,0x04,0x05,0x03,0x03,0x07,0x07,0x03,0xf7,0x07,0x02,0x03,0x04,\r
+ 0x03,0x02,0x03,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x06,0x06,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x03,0x02,\r
+ 0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x05,0x03,0x9a,0x9b,0x9d,0xf7,0xf7,0xf7,\r
+ 0x9d,0x94,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x98,0x9a,0x9f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x9c,0x97,0x97,0x97,0x02,0x99,0x99,0x9a,0x9c,0x9a,\r
+ 0x97,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9b,0x9b,0x97,0x9d,0x9a,0x9a,0x9a,0x9f,0x99,0x94,0x97,0x99,\r
+ 0x9f,0x9d,0x97,0x9d,0x9d,0x9b,0x9a,0x99,0x99,0x98,0x98,0x99,0x99,\r
+ 0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf6,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2f,0x2f,0x2a,0x29,0xf7,0xf7,0xf7,0xf7,0x35,\r
+ 0x35,0x35,0x35,0x28,0x2f,0x02,0x01,0x02,0x2f,0x2c,0x2c,0x2b,0x2c,\r
+ 0x2f,0x01,0xf7,0xf7,0x35,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,\r
+ 0xf6,0x2e,0x2e,0x2f,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,0x02,0x01,0xf7,\r
+ 0x01,0x25,0xf7,0xf7,0xf7,0x36,0x35,0x2a,0xf7,0x2c,0x2a,0x2c,0x2f,\r
+ 0x2f,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,0x03,\r
+ 0x02,0x03,0x04,0x04,0x04,0x04,0x02,0xf7,0x02,0x03,0x04,0x05,0xf7,\r
+ 0x07,0x07,0x04,0xf7,0x03,0x03,0x02,0x04,0x04,0xf7,0x03,0x04,0x04,\r
+ 0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x06,0x04,0x02,0xf7,\r
+ 0x02,0x03,0x04,0x05,0x05,0x05,0x04,0x02,0x02,0x03,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x03,0x9a,0x9c,0x9f,0xf7,0xf7,0x03,0x94,0x97,0x97,0x99,0x99,\r
+ 0x97,0x94,0x94,0x97,0x98,0x99,0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,\r
+ 0x97,0x97,0x99,0x02,0x99,0x99,0x9b,0x9d,0x98,0x99,0x9b,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x98,\r
+ 0x9c,0x9a,0x9a,0x9a,0x03,0x94,0x94,0x98,0x9a,0x01,0x99,0x99,0x9d,\r
+ 0x9d,0x9b,0x9a,0x99,0x99,0x98,0x98,0x98,0x98,0x98,0x94,0x94,0x94,\r
+ 0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x02,\r
+ 0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x02,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0x2f,0x27,0x2a,0xf7,0xf7,0xf7,0x35,0x35,0x35,0x36,0x2a,0x2f,0x02,\r
+ 0x01,0xf6,0x2f,0x2c,0x2a,0x2a,0x2a,0x2c,0x2f,0xf7,0xf7,0x2e,0x23,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2c,0x2e,0x2f,0xf6,0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,\r
+ 0x27,0x35,0x35,0x2a,0xf7,0x2e,0x2a,0x2c,0x2e,0x2f,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,\r
+ 0x97,0x97,0x97,0x97,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,0x02,0x04,0x04,0x05,\r
+ 0x05,0x04,0x03,0xf7,0x02,0x03,0x05,0x04,0x02,0x07,0x06,0x02,0xf7,\r
+ 0x06,0x02,0x03,0x04,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,\r
+ 0x03,0x03,0x03,0x04,0x05,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,\r
+ 0x06,0x04,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x03,0x9b,0x9d,0x02,\r
+ 0xf7,0xf7,0x99,0x94,0x98,0x9e,0x9f,0x9f,0x9c,0x98,0x94,0x97,0x97,\r
+ 0x98,0x9c,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x9f,0x9e,0x9e,0x9f,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x99,0x97,0x97,0x9a,0x9e,\r
+ 0x99,0x9a,0x9b,0x9d,0x94,0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9c,0x98,0x9b,0x9a,0x9a,0x9a,0x9c,\r
+ 0x9f,0x94,0x97,0x98,0x9f,0xf7,0x94,0x9a,0x9e,0x9d,0x9b,0x9a,0x9a,\r
+ 0x99,0x99,0x98,0x98,0x98,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0x01,\r
+ 0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xf6,0x2f,0x2f,\r
+ 0x2f,0x02,0x01,0x01,0x01,0x01,0xf6,0x02,0x01,0x26,0x2e,0xf7,0xf7,\r
+ 0x36,0x35,0x35,0x36,0x2c,0x2f,0x02,0x01,0xf6,0x2f,0x2c,0x2a,0x28,\r
+ 0x28,0x2a,0x2c,0x2f,0xf7,0xf7,0x23,0x2c,0xf7,0xf7,0xf7,0x01,0x2f,\r
+ 0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,\r
+ 0x2c,0x2e,0x2f,0xf7,0xf7,0x27,0xf7,0xf7,0x2d,0x36,0x35,0x35,0x2a,\r
+ 0xf7,0x02,0x2a,0x2c,0x2e,0x2f,0xf6,0x01,0xf7,0xf7,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x04,0x03,0xf7,\r
+ 0x02,0x03,0x05,0xf7,0x06,0x07,0x02,0xf7,0x04,0x03,0x03,0x03,0x04,\r
+ 0xf7,0x03,0x03,0x04,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x03,0x03,0x03,0x03,0x02,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x02,0x02,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x04,0x03,0x9c,0x9f,0xf7,0xf7,0x9f,0x94,0x97,0x9f,\r
+ 0x02,0x02,0x02,0x03,0x9d,0x97,0x94,0x97,0x98,0x99,0x9f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x9d,\r
+ 0x9a,0x99,0x99,0x99,0x9a,0x9c,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9e,0x98,0x97,0x97,0x03,0x9a,0x99,0x9a,0x9c,0x9c,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9b,0x9c,0x97,0x9d,0x9a,0x9a,0x9a,0x9f,0x99,0x94,0x98,0x9a,\r
+ 0x02,0x02,0x94,0x9c,0x9e,0x9d,0x9b,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x97,0x97,0x98,0x99,0x9b,0x2f,0x2f,0x2f,0xf6,0x02,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x02,0x02,0xf6,0xf6,0xf6,0xf6,0x02,0x01,0x01,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0x25,0xf7,0xf7,0x29,0x35,0x35,0x23,0x2e,0xf6,\r
+ 0x01,0x01,0x2f,0x2d,0x2a,0x28,0x27,0x27,0x28,0x2a,0x2e,0x02,0xf7,\r
+ 0xf7,0x35,0xf7,0xf7,0xf7,0xf7,0x2e,0x02,0x01,0x2e,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2b,0x2c,0x2d,0x2f,0xf7,\r
+ 0xf7,0x23,0xf7,0xf7,0x23,0x36,0x35,0x35,0x27,0xf7,0xf7,0x2e,0x2d,\r
+ 0x2f,0x2f,0x01,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x98,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,\r
+ 0x03,0x04,0x05,0x06,0x06,0x05,0x04,0x02,0x02,0x02,0x04,0x04,0xf7,\r
+ 0x07,0x03,0x02,0xf7,0x06,0x03,0x03,0x04,0xf7,0x03,0x03,0x04,0x04,\r
+ 0x04,0x03,0x03,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x05,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x03,0x03,\r
+ 0x9d,0x03,0xf7,0xf7,0x9b,0x94,0x9b,0x02,0x9f,0x9e,0x9f,0x03,0x03,\r
+ 0x9a,0x94,0x97,0x97,0x98,0x9e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0x03,0x9c,0x99,0x98,0x98,0x99,0x99,0x99,\r
+ 0x99,0x9b,0x9f,0x01,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0x01,0x9d,\r
+ 0x97,0x97,0x98,0x02,0x99,0x99,0x9b,0x9d,0x99,0x97,0x9b,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9a,0x97,\r
+ 0x9d,0x9a,0x9a,0x99,0x02,0x97,0x97,0x98,0x9f,0xf7,0x9f,0x94,0x9d,\r
+ 0x9e,0x9e,0x9c,0x9a,0x9a,0x99,0x99,0x99,0x9b,0x9b,0x9c,0x9d,0x9c,\r
+ 0x2f,0x2f,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0xf6,0x2f,0x2f,0xf6,0xf6,0xf6,0x02,0x01,0x01,0xf7,0xf7,0xf7,0x23,\r
+ 0xf7,0xf7,0x36,0x35,0x23,0x2f,0x01,0x01,0x02,0x2f,0x2c,0x2a,0x27,\r
+ 0x27,0x26,0x27,0x28,0x2a,0x2f,0xf7,0xf7,0x2c,0x36,0xf7,0x2f,0xf7,\r
+ 0xf7,0x2d,0x2f,0x2d,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2c,0x2c,0x2c,0x2d,0xf7,0xf7,0x2f,0x2f,0xf7,0x2f,\r
+ 0x36,0x36,0x35,0x35,0x25,0xf7,0xf7,0x01,0x2f,0xf6,0x01,0xf7,0xf7,\r
+ 0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,\r
+ 0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x04,0x05,0x06,0x06,\r
+ 0x06,0x05,0x04,0x02,0x02,0x03,0x04,0x03,0x05,0x04,0x02,0xf7,0x05,\r
+ 0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x04,0x04,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,\r
+ 0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x04,0x03,0x04,0x9e,0x01,0xf7,0x01,0x97,\r
+ 0x97,0x03,0x03,0x9d,0x9a,0x9b,0x9e,0x03,0x9f,0x98,0x94,0x97,0x97,\r
+ 0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x03,\r
+ 0x9c,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x9c,0x03,0xf7,\r
+ 0xf7,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x97,0x97,0x9a,0x9e,\r
+ 0x99,0x9a,0x9c,0x9e,0x94,0x9a,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x99,0x99,0x9b,0x9a,0x9a,0x9a,\r
+ 0x03,0x94,0x97,0x9a,0x01,0xf7,0x9b,0x94,0x9e,0x9f,0x9e,0x9d,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9d,0x9d,0x9d,0x9c,0x9c,0x2f,0x2f,0x2c,0x29,0x26,\r
+ 0x25,0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0x2a,0xf7,0x2c,0x35,0x36,0xf6,\r
+ 0x01,0x01,0xf6,0x2f,0x2b,0x28,0x27,0x26,0x25,0x27,0x27,0x2a,0x2d,\r
+ 0xf6,0xf7,0xf7,0x36,0x2d,0xf7,0x01,0xf7,0xf7,0x2a,0x2a,0x2a,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2d,0x2e,\r
+ 0x2e,0x2e,0x02,0xf7,0xf7,0x23,0xf7,0xf7,0x2c,0x36,0x35,0x35,0x35,\r
+ 0x23,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0x03,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,0x05,0x04,0xf7,\r
+ 0x02,0x03,0x04,0xf7,0x06,0x02,0xf7,0xf7,0x05,0x03,0x03,0x04,0xf7,\r
+ 0x03,0x03,0x04,0x04,0x03,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x04,0x04,0x9f,0xf7,0xf7,0x02,0x94,0x98,0x02,0x9e,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9f,0x03,0x9b,0x97,0x97,0x97,0x9a,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x9e,0x99,0x97,0x98,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x99,0x9a,0x9f,0x01,0xf7,0x01,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x9a,0x97,0x97,0x03,0x99,0x99,0x9b,0x9d,0x9d,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9e,0x9b,0x9c,0x97,0x9c,0x9b,0x9a,0x99,0x9e,0x9b,0x97,0x97,0x9f,\r
+ 0xf7,0xf7,0x97,0x97,0x9e,0x9f,0x9f,0x9e,0x9d,0x9b,0x9b,0x9d,0x9d,\r
+ 0x9c,0x9c,0x9c,0x2a,0x27,0x27,0x2d,0x01,0xf7,0xf7,0x2f,0x25,0x29,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2c,0x2c,0x2c,0x2c,0x2e,0xf7,0xf7,\r
+ 0xf7,0x2f,0xf7,0xf7,0x26,0x35,0x2f,0xf7,0x01,0x2f,0x2d,0x2a,0x28,\r
+ 0x27,0x26,0x26,0x26,0x27,0x29,0x2c,0x2f,0xf7,0xf7,0x2d,0x36,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2a,0x2a,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0x2f,0x2f,0x2f,0x02,0xf7,0xf7,\r
+ 0x2f,0x2a,0xf7,0xf7,0x2f,0x25,0x36,0x35,0x35,0x36,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,\r
+ 0x04,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,0x03,0x04,0x04,0x04,\r
+ 0x03,0x02,0xf7,0x05,0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x04,0x04,\r
+ 0x03,0x02,0x02,0xf7,0xf7,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x05,0x04,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x05,0x02,0xf7,\r
+ 0xf7,0x03,0x94,0x99,0x02,0x9c,0x99,0x9a,0x9a,0x9a,0x9c,0x03,0x9f,\r
+ 0x97,0x97,0x97,0x9a,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x01,0x02,0x9b,0x97,0x97,0x97,0x97,0x94,0x94,0x97,0x97,0x98,0x99,\r
+ 0x99,0x9d,0x02,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x99,0x97,0x97,0x02,0x98,0x99,0x9c,0x9e,0x99,0x97,0x9b,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9a,0x94,\r
+ 0x9d,0x9a,0x9a,0x99,0x03,0x98,0x97,0x99,0xf7,0xf7,0x02,0x94,0x98,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9d,0x9d,0x9d,0x9d,0x9e,0x2a,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0x27,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0x2a,0xf7,0x2f,0x35,\r
+ 0x28,0xf7,0xf7,0xf6,0x2d,0x2a,0x27,0x27,0x26,0x26,0x27,0x27,0x29,\r
+ 0x2c,0x2f,0x01,0xf7,0xf7,0x35,0x2a,0xf7,0x2b,0xf7,0xf7,0x2c,0x2a,\r
+ 0x2d,0x2d,0x02,0xf7,0xf7,0xf7,0x02,0x02,0xf6,0xf6,0x2f,0x2f,0x2e,\r
+ 0x2d,0x2f,0x02,0x01,0x01,0x01,0xf7,0xf7,0xf7,0x23,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x28,0x26,0x25,0x36,0x2a,0xf7,0xf7,0xf7,0xf7,0x2e,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,0x03,0x05,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x02,0x02,0x03,0x04,0xf7,0x07,0x02,0xf7,0x02,0x05,\r
+ 0x03,0x03,0x04,0xf7,0x03,0x03,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x04,0x04,0x05,0x02,0x02,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x05,0x06,0x01,0xf7,0xf7,0x9f,0x94,0x9a,0x02,\r
+ 0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9f,0x03,0x99,0x97,0x97,0x98,0x03,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0x03,0x99,0x97,0x97,\r
+ 0x97,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x99,0x9d,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x98,0x97,0x9b,0x9d,\r
+ 0x98,0x9a,0x9d,0x9e,0x94,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9e,0x9d,0x9b,0x99,0x98,0x9c,0x9a,0x99,0x99,\r
+ 0x03,0x97,0x97,0x03,0xf7,0xf7,0x9f,0x94,0x99,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x9d,0x9d,0x9d,0x9e,0x9e,0x2f,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,\r
+ 0x29,0x2d,0xf7,0xf7,0xf7,0x2f,0x28,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0x25,0x36,0xf7,0xf7,0x01,0x2f,0x2b,\r
+ 0x28,0x27,0x27,0x26,0x27,0x28,0x2a,0x2d,0x2f,0x01,0xf7,0xf7,0x23,\r
+ 0x36,0xf7,0xf7,0x2f,0xf7,0xf7,0x2e,0x2f,0x2f,0x2d,0x2f,0x02,0x2f,\r
+ 0x2f,0x2e,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2f,0xf6,0x01,0xf7,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0x2a,0x27,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2c,0x36,0x25,0x2a,0x2d,0x2d,0x2c,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0x02,0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,\r
+ 0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,0x05,0x03,0x03,0x03,0x03,0x02,\r
+ 0x03,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x03,0x04,0x04,0x06,0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x07,0xf7,0xf7,0xf7,0x9e,0x97,0x9a,0x02,0x9b,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9d,0x02,0x9c,0x97,0x97,0x98,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0xf7,0x9f,0x98,0x97,0x97,0x97,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x98,0x99,0x9e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x03,0x97,0x97,0x03,0x99,0x98,0x9c,0x9e,0x9e,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9e,0x9c,0x9b,0x97,0x9a,0x9b,0x9a,0x99,0x9c,0x9c,0x97,0x99,0x01,\r
+ 0xf7,0xf7,0x9d,0x94,0x99,0x9f,0x03,0x02,0x02,0x9c,0x9c,0x9c,0x9d,\r
+ 0x9e,0xf6,0xf7,0xf7,0xf7,0xf6,0x23,0x36,0x35,0x35,0x35,0x23,0x2f,\r
+ 0xf7,0xf7,0xf7,0x2a,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,\r
+ 0x2c,0x35,0x02,0xf7,0xf7,0x2f,0x2d,0x2a,0x28,0x27,0x27,0x28,0x2a,\r
+ 0x2c,0x2f,0xf6,0x01,0xf7,0x01,0x25,0x35,0x28,0xf7,0x2f,0xf7,0xf7,\r
+ 0xf7,0x2f,0xf6,0xf6,0x2e,0x2e,0x2e,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0x01,0xf6,0x01,0x01,0x2f,\r
+ 0x25,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x29,0x23,0x25,0x27,\r
+ 0x2a,0x2a,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,\r
+ 0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,0x03,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x02,0x03,0x04,0x02,0x07,\r
+ 0x02,0x02,0x02,0x05,0x03,0x03,0x04,0xf7,0x03,0x03,0x03,0x03,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x06,\r
+ 0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,\r
+ 0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x9e,\r
+ 0x97,0x9a,0x02,0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x03,0x9f,0x97,\r
+ 0x97,0x97,0x9f,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0xf7,0x9f,\r
+ 0x98,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x97,0x98,0x98,0x99,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0x03,0x97,0x97,0x02,0x98,0x99,0x9d,0x9e,0x9a,0x97,0x9b,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x9b,0x94,\r
+ 0x9d,0x9b,0x9a,0x99,0x03,0x98,0x97,0x03,0xf7,0xf7,0xf7,0x98,0x94,\r
+ 0x99,0x9f,0x03,0x02,0x9c,0x9c,0x9c,0x9d,0x9f,0x2d,0xf7,0xf7,0xf7,\r
+ 0x26,0x35,0x35,0x35,0x35,0x36,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2e,0x2f,0xf7,0xf7,0xf7,0x2f,0x35,0x27,0xf7,0xf7,0x01,\r
+ 0x2f,0x2d,0x2a,0x2a,0x2a,0x2b,0x2d,0x2f,0x02,0x01,0x01,0xf6,0x2f,\r
+ 0x25,0x35,0x35,0x2f,0xf7,0x26,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x2e,\r
+ 0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf6,0x2f,0x2f,0xf6,0xf6,0x2a,0x26,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x2a,0x25,0x26,0x27,0x28,0x27,0x2d,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x02,0x02,0x03,0x04,0x02,0x04,0x02,0x03,0x05,0x03,\r
+ 0x03,0x03,0x04,0x02,0x03,0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x9e,0x97,0x99,0x02,0x9d,0x99,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9f,0x03,0x98,0x97,0x97,0x9f,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0x9f,0x98,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x97,0x97,0x98,0x98,0x9b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x9f,0x94,0x99,0x9d,\r
+ 0x98,0x9a,0x9e,0x9e,0x97,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9a,0x97,0x9c,0x9a,0x99,0x99,\r
+ 0x02,0x97,0x99,0x01,0xf7,0xf7,0x01,0x97,0x94,0x97,0x9d,0x9f,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9f,0x2a,0xf7,0xf7,0x01,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2a,0x35,0x25,0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0x2d,0x2d,0x2f,\r
+ 0x2f,0x02,0x01,0xf6,0x2f,0x2c,0x28,0x36,0x35,0x35,0x25,0xf7,0xf7,\r
+ 0x25,0xf7,0xf7,0x01,0x01,0xf7,0xf6,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2d,0x29,0x29,0xf6,0xf7,0xf7,0xf7,0x01,0x2d,0x27,\r
+ 0x26,0x27,0x28,0x27,0x27,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x99,0x98,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,\r
+ 0x03,0x03,0x03,0x07,0x03,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x05,0x03,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x04,\r
+ 0x03,0x03,0x02,0x02,0xf7,0x02,0x02,0x04,0x06,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0x9f,0x97,0x97,0x03,0x9f,0x9a,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9f,0x02,0x99,0x97,0x97,0x9f,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0x03,0x99,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x99,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0x9a,0x94,0x9f,0x98,0x98,0x9d,0x9e,0x9e,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9e,0x9c,0x9b,0x98,0x9a,0x9c,0x9a,0x99,0x9a,0x9c,0x97,0x03,0x01,\r
+ 0xf7,0xf7,0x02,0x94,0x94,0x94,0x97,0x9c,0x9c,0x9d,0x9d,0x9f,0x27,\r
+ 0xf7,0xf7,0x2f,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x23,0x27,0x27,0x23,0x36,0x35,0x29,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0xf6,0xf6,0xf6,0x01,0x01,0x02,0x2f,0x2a,0x25,\r
+ 0x36,0x35,0x35,0x35,0x35,0x2f,0xf7,0xf7,0x25,0xf7,0x01,0x02,0x01,\r
+ 0x01,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0x2f,0x2e,0x2d,0x2e,0x2f,0x2f,0x2f,0x2c,\r
+ 0x2a,0x2b,0x2d,0x2d,0x2c,0x2a,0x28,0x27,0x27,0x28,0x2a,0x2c,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x99,0x98,0x97,0x97,\r
+ 0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,0x03,0x03,0xf7,0x06,\r
+ 0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x05,0x04,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x06,0x02,0x03,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,0xf7,0xf7,0x01,0x03,0x97,0x97,\r
+ 0x9f,0x03,0x9a,0x99,0x99,0x99,0x99,0x9a,0x9f,0x02,0x99,0x97,0x97,\r
+ 0x9f,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0x03,0x9a,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x9c,0x02,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x98,0x94,0x02,0x97,0x99,0x9d,0x9e,0x9a,0x94,0x9b,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9b,0x94,\r
+ 0x9d,0x9b,0x9a,0x99,0x9f,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0x03,0x94,\r
+ 0x94,0x94,0x9c,0x9c,0x9d,0x9d,0x9e,0x27,0x2e,0xf7,0xf6,0x35,0x35,\r
+ 0x36,0x25,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x36,0x23,0x28,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2f,0x2b,0x23,0x35,0x35,0x35,0x36,0x36,0x35,0x2d,\r
+ 0xf7,0xf7,0x01,0x25,0x02,0x02,0xf6,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf6,0x2e,0x2d,0x2e,0x2f,0x2f,0x2e,0x2c,0x2c,0x2c,0x2b,0x2a,\r
+ 0x29,0x28,0x28,0x29,0x2a,0x2a,0x2f,0x01,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x99,0x99,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0x02,0x04,0x03,0x02,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x02,0x03,0x03,0x03,0x06,0x05,0x04,0x04,0x05,0x03,\r
+ 0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x04,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x04,0x05,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x07,0x07,0xf7,0xf7,0x01,0x03,0x97,0x97,0x9a,0x02,0x9d,0x9a,0x99,\r
+ 0x99,0x99,0x9a,0x9f,0x02,0x99,0x97,0x97,0x9f,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x01,0xf7,0x03,0x9c,0x98,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x99,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x02,0x94,0x97,0x9f,\r
+ 0x98,0x9a,0x9d,0x9e,0x98,0x98,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x9a,0x97,0x9d,0x9b,0x99,0x98,\r
+ 0x02,0x97,0x9e,0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9b,0x9b,0x9d,\r
+ 0x9d,0x9e,0x28,0x28,0xf7,0x2f,0x35,0x27,0xf7,0xf7,0xf7,0xf7,0x2d,\r
+ 0x23,0x35,0x35,0x35,0x35,0x35,0x23,0x2a,0x2b,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2a,0x36,0x35,\r
+ 0x35,0x35,0x36,0x36,0x36,0x27,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x2e,\r
+ 0xf6,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2d,\r
+ 0x2e,0x2e,0x2e,0x2e,0x2d,0x2c,0x2d,0x2c,0x2a,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2b,0x2c,0x2e,0x2f,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0x01,0x2d,0x9c,\r
+ 0x9a,0x99,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x02,\r
+ 0x03,0x03,0xf7,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x04,0x02,0x03,\r
+ 0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x04,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x03,\r
+ 0x02,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0xf7,0xf7,0x01,\r
+ 0x02,0x98,0x97,0x98,0x9f,0x03,0x9c,0x9a,0x99,0x9a,0x9c,0x03,0x02,\r
+ 0x99,0x97,0x97,0x9f,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0xf7,\r
+ 0x03,0x9c,0x99,0x97,0x97,0x97,0x97,0x97,0x97,0x99,0x9d,0x02,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0x9e,0x94,0x9b,0x9b,0x98,0x9a,0x9d,0x9e,\r
+ 0x94,0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x98,0x99,0x9c,0x9b,0x99,0x99,0x9e,0x94,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0x01,0x9f,0x9a,0x9a,0x9c,0x9d,0x9d,0x2a,0x27,0x2f,\r
+ 0x2f,0x35,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x28,0x35,0x35,\r
+ 0x36,0x35,0x36,0x29,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2a,0x23,0x35,0x35,0x35,0x36,0x36,0x36,0x23,0x2c,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2a,0x2b,0x2f,0x2f,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2d,0x2d,0x2e,0x2e,0x2e,0x2e,\r
+ 0x2d,0x2d,0x2d,0x2c,0x2a,0x2a,0x2a,0x2b,0x2c,0x2c,0x2e,0x2e,0x2f,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf6,0x2b,0x9e,0x9c,0x9a,0x99,0x99,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x02,0x03,0x03,0x04,0x06,\r
+ 0x05,0x05,0x05,0x03,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x06,0x02,0x02,0x07,0x07,0x07,0x07,\r
+ 0x07,0x05,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x04,\r
+ 0x03,0xf7,0xf7,0xf7,0x06,0xf7,0xf7,0xf7,0x01,0x9a,0x97,0x97,0x9a,\r
+ 0x02,0x9f,0x9d,0x9b,0x9c,0x9f,0x02,0x03,0x98,0x97,0x97,0x9f,0xf7,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0x9f,0x9c,0x99,0x97,0x97,\r
+ 0x97,0x97,0x97,0x98,0x9a,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0x99,0x97,0x9f,0x99,0x99,0x9a,0x9c,0x9d,0x94,0x9b,0x9c,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x94,\r
+ 0x9c,0x9c,0x9a,0x98,0x9c,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9b,0x9b,0x9b,0x9d,0x9d,0x2a,0x27,0x29,0x2c,0x36,0xf7,0xf7,0x01,\r
+ 0x2c,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0x2e,0x36,0x35,0x35,0x35,0x25,\r
+ 0x2b,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf6,0x27,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x28,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2a,0x2a,\r
+ 0x29,0x2c,0x2c,0x2d,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0x2e,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2e,0x2d,0x2c,0x2d,0x2d,\r
+ 0x2c,0x2c,0x2c,0x2c,0x2d,0x2e,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x9e,0x9f,0x9e,0x9d,0x9b,0x03,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x04,0x02,0x03,0x03,0x02,0x07,0x06,0x05,0x04,0x04,0x03,\r
+ 0x03,0x04,0x02,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0xf7,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x06,0x02,0x05,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x05,0x06,0x07,0x07,0x06,0x06,0x05,0x03,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0x01,0x9e,0x97,0x97,0x97,0x9e,0x02,0x03,0x9f,0x9f,\r
+ 0x03,0x02,0x9d,0x97,0x97,0x97,0x03,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,\r
+ 0x01,0x02,0x9f,0x9c,0x9a,0x98,0x98,0x97,0x97,0x98,0x98,0x9a,0x9e,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x97,0x97,0x02,\r
+ 0x99,0x99,0x9a,0x9c,0x9b,0x97,0x9b,0x9c,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9a,0x94,0x9d,0x9c,0x9a,0x98,\r
+ 0x03,0x94,0x9e,0xf7,0xf7,0xf7,0xf7,0xf7,0x9a,0x9a,0x9b,0x9c,0x9d,\r
+ 0x2c,0x29,0x26,0x29,0x36,0xf7,0xf7,0x2d,0x2a,0x29,0x27,0x27,0x27,\r
+ 0x2b,0xf7,0xf7,0xf7,0xf7,0x26,0x35,0x35,0x36,0x27,0x2b,0x2f,0x2f,\r
+ 0x2f,0x2a,0x35,0x35,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x28,0x27,0x28,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2c,0x2e,0x2e,\r
+ 0x2e,0x2e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,0x2f,0x2e,0x2d,0x2d,0x2e,0x2e,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2e,0x2d,0x2c,0x2c,0x2c,0x2d,0x2c,0x2d,0x2d,\r
+ 0x2e,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9e,0x03,0x03,\r
+ 0x9f,0x9f,0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,\r
+ 0x03,0x03,0x03,0x06,0x06,0x05,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x04,0x02,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,\r
+ 0x07,0x06,0x06,0x06,0x06,0x06,0x03,0xf7,0x9f,0xf7,0xf7,0xf7,0x03,\r
+ 0x99,0x97,0x97,0x99,0x9f,0x02,0x02,0x02,0x02,0x9f,0x99,0x97,0x97,\r
+ 0x99,0x03,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0x01,0x01,0x02,0x03,0x9f,0x9d,0x9a,0x99,0x98,\r
+ 0x98,0x98,0x98,0x98,0x98,0x99,0x9b,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x99,0x97,0x98,0x02,0x99,0x99,0x9a,0x9c,\r
+ 0x98,0x98,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x99,0x97,0x9d,0x9c,0x99,0x98,0x03,0x94,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x99,0x99,0x9a,0x9c,0x9d,0x2d,0x2a,0x27,0x26,0x36,\r
+ 0xf7,0xf7,0x2d,0x2c,0x2a,0x2a,0x28,0x27,0x27,0x25,0x28,0xf7,0xf7,\r
+ 0xf7,0xf7,0x27,0x35,0x35,0x36,0x23,0x27,0x26,0x35,0x35,0x35,0x36,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x2e,0x29,0x2a,0x2c,0x2c,0x2d,0x2d,0x2e,\r
+ 0x2d,0x2c,0x2b,0x2b,0x2c,0x2c,0x2d,0x2e,0x2e,0x2e,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2f,0x2f,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2e,0x2c,0x2c,0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x2f,0xf6,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x03,0x02,0x01,0x02,0x06,0x05,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,0x03,0x02,0x06,0x06,\r
+ 0x05,0x04,0x04,0x04,0x03,0x04,0x02,0x03,0x02,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x05,0x02,0x02,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x05,0x05,\r
+ 0x05,0x05,0x02,0x94,0x01,0xf7,0xf7,0x02,0x9e,0x97,0x97,0x97,0x98,\r
+ 0x9c,0x9f,0x9f,0x9e,0x9a,0x97,0x97,0x94,0x9c,0x02,0xf7,0xf7,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0x02,\r
+ 0x9f,0x9b,0x99,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x99,\r
+ 0x9a,0x9d,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x9f,0x9f,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9c,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9e,0x97,0x97,0x99,0x03,0x99,0x9a,0x9a,0x9c,0x97,0x9a,0x9b,0x9e,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x97,\r
+ 0x9b,0x9d,0x9c,0x98,0x99,0x9b,0x97,0x01,0xf7,0xf7,0xf7,0x99,0x99,\r
+ 0x9a,0x9c,0x9b,0x2e,0x2c,0x29,0x26,0x25,0x28,0xf7,0x2f,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2c,0x2a,0x27,0x26,0x25,0x27,0x01,0xf7,0xf7,0x2f,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x23,0xf7,0xf7,0xf7,0xf7,0x2c,0x2c,\r
+ 0x2e,0x2d,0x2f,0xf6,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0x01,0x2e,0x2c,\r
+ 0x2c,0x2c,0x2d,0x2e,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2d,\r
+ 0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9c,0x03,0x02,0x01,0xf7,0x07,0x07,0x06,0x05,0x04,0x03,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x03,0x02,0x03,0x03,0xf7,0x06,0x06,0x05,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x06,0x02,\r
+ 0x04,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,\r
+ 0x07,0x06,0x04,0x03,0x02,0x02,0x03,0x04,0x05,0x05,0x05,0x94,0x9d,\r
+ 0xf7,0xf7,0xf7,0x03,0x9a,0x97,0x97,0x97,0x97,0x99,0x99,0x98,0x97,\r
+ 0x97,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0x01,0x01,0x01,0x03,0x9d,0x99,0x98,0x98,0x98,0x97,0x97,\r
+ 0x97,0x97,0x97,0x98,0x98,0x98,0x99,0x99,0x99,0x9b,0x9f,0x02,0xf7,\r
+ 0xf7,0x01,0x03,0x9e,0x9a,0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9c,0x02,0xf7,0xf7,0x03,0x99,0x97,0x94,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9a,0x9d,0x97,0x9a,0x9b,0x9e,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9b,0x94,0x9e,0x9d,0x9a,0x98,\r
+ 0x9d,0x97,0x97,0x02,0xf7,0xf7,0x99,0x99,0x9a,0x9c,0x9d,0x2f,0x2d,\r
+ 0x2a,0x27,0x25,0x36,0xf7,0x01,0x2e,0x2e,0x2f,0x2f,0xf6,0x2f,0x2f,\r
+ 0x2b,0x27,0x25,0x23,0x27,0xf7,0xf7,0xf7,0x35,0x35,0x35,0x35,0x36,\r
+ 0x23,0xf7,0xf7,0xf7,0x2f,0x2c,0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2d,0x2c,0x2e,0x2b,0x2a,0x2b,0x2c,0x2e,\r
+ 0x2e,0x2f,0x2f,0xf7,0xf7,0x2f,0x2f,0xf6,0x01,0x01,0x02,0xf6,0x2f,\r
+ 0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf6,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,\r
+ 0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x99,0x9e,0x03,0x01,\r
+ 0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,\r
+ 0x03,0x03,0x06,0x06,0x05,0x04,0x04,0x04,0x03,0x04,0x02,0x04,0x02,\r
+ 0x02,0x02,0x02,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x04,0x04,0x06,0x02,0x06,0x07,0x07,0x07,0x04,\r
+ 0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x06,0x05,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x04,0x05,0x9b,0x94,0x01,0xf7,0xf7,0x02,0x9f,\r
+ 0x99,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x9a,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0x02,0x9c,\r
+ 0x98,0x98,0x97,0x97,0x97,0x9b,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x9f,0x03,0x01,0x02,0x9f,0x9a,0x97,0x94,0x94,0x94,\r
+ 0x94,0x97,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x94,\r
+ 0x94,0x9d,0xf7,0x02,0x9a,0x98,0x97,0x94,0x9d,0x9e,0x9a,0x9a,0x9a,\r
+ 0x9d,0x94,0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x99,0x97,0x9e,0x9d,0x99,0x97,0x9f,0x97,0x94,0x9c,\r
+ 0x03,0x99,0x99,0x99,0x9b,0x9d,0x2e,0x2f,0x2c,0x2a,0x27,0x25,0x25,\r
+ 0xf7,0x2f,0x2f,0x2f,0xf6,0x01,0x01,0xf7,0x01,0xf6,0x2c,0x27,0x25,\r
+ 0x25,0xf7,0xf7,0x2e,0x35,0x35,0x35,0x36,0xf7,0xf7,0xf7,0x2c,0x2e,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2c,0x28,0x27,0x29,0x2a,0x2a,0x2a,0x2c,0x2d,0x2f,0x2f,0xf7,0xf7,\r
+ 0x2f,0x2e,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2e,0x2f,0xf6,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xf6,0xf6,0x2f,0x2f,0x2f,\r
+ 0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,0x2d,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x94,0x94,0x94,0x98,0x9d,0x06,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,0x03,0x03,0xf7,0x06,0x06,\r
+ 0x05,0x04,0x04,0x03,0x03,0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,\r
+ 0x05,0x05,0x02,0x06,0x07,0x07,0x06,0x02,0xf7,0xf7,0xf7,0x04,0x07,\r
+ 0x07,0x06,0x05,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,\r
+ 0x04,0x9e,0x94,0x9c,0xf7,0xf7,0xf7,0x02,0x9f,0x99,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x98,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0xf7,0x03,0x99,0x98,0x97,0x94,0x9a,0x9f,0x9f,\r
+ 0x9f,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x03,0x03,0x02,0x02,0x9f,\r
+ 0x9a,0x97,0x94,0x94,0x97,0x9a,0x9b,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9a,0x94,0x98,0x02,0x9f,\r
+ 0x99,0x97,0x94,0x94,0x9f,0x9d,0x9a,0x9a,0x9a,0x9d,0x97,0x9b,0x9c,\r
+ 0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x97,\r
+ 0x9a,0x9d,0x9c,0x99,0x97,0x9f,0x9a,0x94,0x94,0x98,0x98,0x99,0x9b,\r
+ 0x9d,0x2d,0x2e,0x2f,0x2c,0x29,0x27,0x23,0x2c,0xf7,0x2f,0x2f,0x2f,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2a,0x26,0x26,0xf7,0xf7,0x27,\r
+ 0x35,0x35,0x2e,0xf7,0xf7,0x2a,0x2f,0x2f,0xf7,0xf7,0xf7,0x2e,0x2a,\r
+ 0x2b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2c,0x29,0x28,\r
+ 0x27,0x28,0x2a,0x2b,0x2c,0x2f,0x2f,0xf7,0x01,0x2f,0x2e,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2e,0x2d,0x2f,0xf6,0x01,0x01,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xf6,0xf6,0xf6,0xf6,0xf6,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2e,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0x94,0x94,\r
+ 0x94,0x94,0x94,0x02,0x04,0x06,0x07,0x07,0x07,0x07,0x06,0x05,0x04,\r
+ 0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x05,0x02,0x03,0x03,0x03,0x06,0x06,0x05,0x04,0x04,0x04,0x02,\r
+ 0x04,0x02,0x04,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x02,0x07,0x07,\r
+ 0x06,0x03,0xf7,0xf7,0x02,0x04,0x06,0x07,0x06,0x05,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x9e,0x9c,0x94,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0x03,0x9c,0x99,0x97,0x97,0x97,0x97,0x99,0x9d,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,0x01,0x9e,\r
+ 0x98,0x97,0x94,0x99,0x9f,0x9f,0x9e,0x9d,0x9d,0x9c,0x9c,0x9a,0x9a,\r
+ 0x98,0x99,0x9f,0x03,0x9f,0x9f,0x9b,0x97,0x97,0x98,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x94,0x9f,0x03,0x99,0x98,0x98,0x99,\r
+ 0x9f,0x9d,0x9a,0x9a,0x9a,0x9c,0x97,0x9b,0x9c,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x94,0x9d,0x9d,0x9c,0x99,\r
+ 0x97,0x9a,0x02,0x9f,0x97,0x97,0x97,0x97,0x9c,0x2d,0x2d,0x2e,0x2e,\r
+ 0x2a,0x28,0x26,0x23,0xf7,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2c,0x27,0x27,0xf7,0xf7,0x35,0x36,0xf7,0xf7,0x28,\r
+ 0x2d,0x2f,0xf7,0xf7,0xf7,0x23,0x35,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x28,0x27,0x27,0x27,0x29,0x2c,\r
+ 0x2c,0x2f,0x2f,0xf7,0x01,0x2f,0x2e,0xf6,0xf7,0x01,0x02,0x2f,0x2e,\r
+ 0x2e,0x2f,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0x02,0x02,0xf6,0xf6,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2e,0x2d,0x2e,0x01,0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,\r
+ 0x02,0x04,0x06,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,0x03,\r
+ 0x03,0xf7,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x04,0x03,0x03,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x03,0x04,0x05,0x05,0x02,0x07,0x07,0x04,0xf7,0xf7,0x02,0x05,\r
+ 0x07,0x07,0x06,0x05,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x02,0xf7,0x02,0x03,0x9e,0x9e,0x94,0x9e,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x02,0x9f,0x9d,0x9b,0x9b,0x9c,0x9f,0x03,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0x01,0x9c,0x97,0x97,0x94,0x9e,0x9f,0x9d,\r
+ 0x9d,0x9a,0x99,0x99,0x99,0x99,0x99,0x98,0x98,0x94,0x97,0x9e,0x9e,\r
+ 0x9b,0x97,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,\r
+ 0x9c,0x9b,0x97,0x9b,0x02,0x9d,0x9b,0x9b,0x9c,0x9f,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9b,0x97,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x9a,0x94,0x9e,0x9d,0x9c,0x99,0x98,0x97,0x98,0x99,\r
+ 0x99,0x99,0x97,0x97,0xf6,0x2d,0x2e,0x2f,0x2d,0x2a,0x27,0x25,0x36,\r
+ 0xf7,0xf6,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x2a,0x2a,0xf7,0x2c,0x28,0xf7,0x27,0x2c,0x2e,0x02,0xf7,0xf7,0x25,\r
+ 0x2a,0xf7,0xf7,0xf7,0x02,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2e,0x25,0x26,0x27,0x28,0x2c,0x2c,0x2f,0xf6,0x01,\r
+ 0x01,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2e,0x2f,0x2f,0xf6,\r
+ 0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x02,0xf6,0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2f,\r
+ 0xf7,0x97,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,\r
+ 0x07,0x07,0x07,0x06,0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,0x03,0x03,0x04,0x06,0x05,\r
+ 0x04,0x04,0x04,0x02,0x04,0x03,0x04,0x02,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,\r
+ 0x03,0x07,0x06,0xf7,0xf7,0x03,0x05,0x06,0x06,0x06,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x04,0x03,0x02,0x02,0x03,0x9c,\r
+ 0x9e,0x9a,0x94,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x02,0x03,0x03,\r
+ 0x03,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x9c,0x97,0x97,0x94,0x9f,0x9e,0x9d,0x9a,0x98,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9b,0x98,0x97,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x99,0x97,\r
+ 0x02,0x9f,0x9e,0x9d,0x9d,0x9f,0x9c,0x9a,0x9a,0x9b,0x99,0x99,0x9b,\r
+ 0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,\r
+ 0x98,0x9e,0x9d,0x9c,0x9a,0x99,0x98,0x99,0x99,0x99,0x9a,0x99,0xf7,\r
+ 0x01,0x2d,0x2e,0x2e,0x2c,0x29,0x27,0x27,0x36,0xf7,0x2f,0x2e,0x2f,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x2e,0xf7,0x36,\r
+ 0x26,0x29,0x2e,0xf7,0xf7,0xf7,0x27,0x2a,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x23,0x26,0x27,0x29,0x2c,0x2e,0x2f,0x01,0xf7,0x2f,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2f,0x2f,0x2f,0x2f,0xf6,0xf6,0xf6,\r
+ 0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x99,0x98,0x98,0x94,\r
+ 0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x07,0x06,\r
+ 0x05,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x05,0x02,0x03,0x03,0x02,0x06,0x05,0x05,0x04,0x04,0x04,0x03,\r
+ 0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x06,0x03,0x07,0x03,0xf7,0x03,\r
+ 0x05,0x06,0x06,0x06,0x04,0x03,0x02,0xf7,0xf7,0x02,0x04,0x05,0x05,\r
+ 0x06,0x06,0x05,0x05,0x03,0xf7,0x02,0x9a,0x9e,0x9e,0x94,0x9f,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x97,0x97,0x94,0x9f,0x9e,\r
+ 0x9d,0x99,0x97,0x94,0x94,0x9c,0x99,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x98,0x99,0x97,0x94,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x02,0x03,0x9f,0x9e,\r
+ 0x9e,0x9f,0x9b,0x9a,0x9a,0x9c,0x97,0x99,0x9b,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9c,0x9b,0x97,0x99,0x9e,0x9d,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9b,0xf6,0xf7,0xf7,0x2e,0x2e,0x2d,\r
+ 0x2a,0x28,0x2a,0x2e,0x36,0xf7,0x2e,0x2d,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0xf7,0x2c,0x26,0x2d,0x2f,0xf7,0xf7,\r
+ 0xf7,0x36,0xf7,0xf7,0xf7,0x01,0x2f,0x2d,0x2f,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x23,0x27,0x28,0x2a,\r
+ 0x2a,0x2f,0x2f,0x01,0x01,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,\r
+ 0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf6,0xf6,0xf6,0xf6,\r
+ 0xf6,0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x99,0x9a,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x02,0x03,\r
+ 0x03,0x03,0x06,0x05,0x04,0x04,0x04,0x02,0x03,0x03,0x04,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0x03,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x05,0x06,0x04,0x07,0xf7,0x02,0x05,0x06,0x06,0x05,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x04,\r
+ 0x02,0x02,0x9a,0x9d,0x9e,0x9a,0x97,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x9f,0x97,0x97,0x94,0x9f,0x9e,0x9d,0x99,0x94,0x94,0x9d,0x9b,\r
+ 0x94,0x97,0x9a,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x97,0x97,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x02,0x03,0x9f,0x9e,0x9e,0x9f,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9e,0x9c,0x9b,0x97,0x97,0x9d,0x9d,0x9d,0x9c,0x9b,0x9b,0x9c,\r
+ 0x9c,0x9c,0x2e,0x2f,0xf7,0xf7,0x2f,0x2f,0x2c,0x2a,0x2f,0xf7,0x02,\r
+ 0x27,0xf7,0x2c,0x2c,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0xf7,0x27,0x2f,0xf6,0xf7,0xf7,0x2f,0x36,0xf7,0xf7,0x02,\r
+ 0x02,0xf6,0x2f,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0x2d,0x25,0x28,0x29,0x2a,0x2a,0x2f,0x2f,0x01,\r
+ 0x01,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2d,0x2e,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0xf7,0x01,0x01,0x9a,\r
+ 0x9a,0x99,0x97,0x94,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x06,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,0x03,0x02,0x06,0x05,0x05,\r
+ 0x04,0x04,0x04,0x02,0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x06,0x06,0x06,\r
+ 0xf7,0x04,0x05,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,0x02,0x04,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0xf7,0x99,0x9a,0x9e,\r
+ 0x9e,0x94,0x9f,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x94,0x9d,\r
+ 0x9e,0x9d,0x99,0x94,0x94,0x9f,0x98,0x97,0x9c,0x9c,0x9a,0x99,0x98,\r
+ 0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x98,0x9a,0x9c,0x9b,\r
+ 0x9a,0x9a,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9b,0x9a,0x9a,0x9a,\r
+ 0x97,0x03,0x03,0x9e,0x9e,0x9d,0x9f,0x9a,0x9a,0x9a,0x9d,0x94,0x9b,\r
+ 0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9c,0x9b,\r
+ 0x98,0x94,0x9a,0x9d,0x9d,0x97,0x97,0x98,0x99,0x9d,0x2e,0x2e,0x2e,\r
+ 0x01,0xf7,0x2f,0x2f,0x2a,0xf7,0xf7,0xf7,0x27,0x2c,0xf7,0x2a,0x2c,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0xf6,0xf7,0x2a,0x2c,\r
+ 0x01,0xf7,0xf7,0x01,0x36,0xf7,0xf7,0x01,0x01,0x02,0xf7,0xf6,0x2f,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x02,0x01,0x01,0xf7,\r
+ 0x27,0x25,0x27,0x2a,0x2c,0x2b,0xf6,0xf6,0x01,0x01,0x2f,0x2f,0x02,\r
+ 0x01,0x01,0x2f,0x2e,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0xf6,0xf6,0xf6,0x02,0x01,0x01,0x9a,0x9b,0x9c,0x9c,0x9a,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,\r
+ 0x06,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x04,0x02,0x03,0x03,0xf7,0x06,0x05,0x04,0x04,0x04,0x02,0x03,\r
+ 0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0x03,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x06,0x06,0x04,0x02,0x04,0x04,0x04,0x03,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x04,0x02,0x98,0x9a,0x9d,0x9e,0x99,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x98,0x97,0x94,0x98,0x9e,0x9d,0x9a,0x94,0x97,0x03,\r
+ 0x97,0x9a,0x9e,0x9e,0x9c,0x9a,0x98,0x98,0x99,0x99,0x98,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x97,0x03,0x03,0x9e,\r
+ 0x9d,0x9c,0x9f,0x9a,0x9a,0x9a,0x9d,0x97,0x9b,0x9d,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9c,0x9b,0x99,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x2f,0x2d,0x2f,0x2e,0x01,0x01,0x2f,0x2c,\r
+ 0x2f,0xf7,0xf7,0x2d,0x35,0xf7,0xf7,0x2a,0x2c,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0xf7,0x02,0x27,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0xf7,0xf7,0x01,0xf7,0x01,0x01,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2f,0x2f,0xf6,0x01,0x02,0xf7,0x23,0x27,0x28,0x2a,\r
+ 0x2c,0x2c,0xf6,0x02,0x01,0x02,0x2f,0x2e,0x2f,0x2f,0x2f,0x2d,0x2c,\r
+ 0x2c,0x2e,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,0x2c,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x9d,0x9d,0x9d,0x9d,0x9d,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x07,0x07,0x06,0x05,0x04,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,0x03,\r
+ 0x02,0x05,0x05,0x05,0x04,0x04,0x04,0x02,0x04,0x03,0x04,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0x03,0x02,0xf7,0xf7,0x02,0xf7,0x02,0x03,0x04,0x04,\r
+ 0x05,0x06,0x04,0x02,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0x03,0x04,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,\r
+ 0x97,0x99,0x9b,0x9e,0x9d,0x94,0x03,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x97,0x94,\r
+ 0x94,0x9f,0x9d,0x9a,0x94,0x97,0x02,0x97,0x9a,0x9f,0x9d,0x9a,0x9b,\r
+ 0x9d,0x9e,0x9b,0x9b,0x9b,0x9b,0x98,0x94,0x94,0x94,0x94,0x94,0x99,\r
+ 0x9c,0x9c,0x9a,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x98,0x03,0x9f,0x9c,0x9a,0x9c,0x9f,0x9a,\r
+ 0x9a,0x9b,0x9a,0x98,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9d,0x9c,0x9b,0x9b,0x9a,0x99,0x97,0x97,0x97,0x97,0x94,\r
+ 0xf7,0xf6,0x2f,0xf6,0x2f,0xf7,0x01,0x01,0x27,0xf7,0xf7,0xf7,0x35,\r
+ 0x35,0xf7,0x2f,0x28,0x2c,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x01,0xf7,0x28,0xf7,0xf6,0xf7,0xf7,0x2c,0xf7,0xf7,0x01,0xf7,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,\r
+ 0xf6,0xf6,0x01,0x02,0xf7,0x23,0x27,0x2a,0x2a,0x2a,0x2f,0xf6,0x01,\r
+ 0x01,0xf6,0x2f,0x2e,0x2e,0x2e,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2c,0x2c,0x2c,0x2e,0x9c,0x9a,0x9a,\r
+ 0x9b,0x9c,0x04,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x04,0x06,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x04,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x04,0x02,0x03,0x03,0xf7,0x06,0x05,0x04,\r
+ 0x04,0x04,0x03,0x03,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x04,0x05,0x06,0x03,0x03,0x04,\r
+ 0x03,0x03,0x02,0xf7,0x02,0x03,0x05,0x05,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x97,0x98,0x9a,0x9e,0x9e,\r
+ 0x97,0x99,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9c,0x97,0x97,0x94,0x9f,0x9d,0x9b,0x98,0x94,\r
+ 0x02,0x99,0x99,0x9e,0x9a,0x98,0x99,0x9a,0x9c,0x9e,0x9e,0x9c,0x9c,\r
+ 0x9c,0x99,0x94,0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,0x9a,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9c,0x9c,0x9d,0x9d,0x9c,0x9b,0x99,0x98,0x99,0x9a,0x9a,\r
+ 0x9a,0x97,0x02,0x9e,0x9b,0x99,0x9d,0x9e,0x9a,0x9a,0x9b,0x98,0x99,\r
+ 0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9c,\r
+ 0x9b,0x9b,0x9b,0x99,0x99,0x99,0x98,0x97,0x97,0x97,0x9a,0x9b,0x99,\r
+ 0x9c,0x9a,0x9a,0x99,0x02,0x97,0x97,0x02,0xf7,0x01,0x94,0x9e,0x9f,\r
+ 0x9d,0x9a,0x99,0x98,0x98,0x99,0x9a,0x9a,0x9a,0x94,0x9f,0x97,0x9b,\r
+ 0x97,0x94,0x97,0x97,0x99,0x9a,0x98,0x98,0x99,0x99,0x97,0x98,0x94,\r
+ 0x94,0x94,0x97,0x97,0x94,0x98,0x9c,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x98,0x02,0x9f,0x9e,0x9e,0x9f,0x9b,0x9a,0x9a,0x9a,0x9b,0x9c,0x9d,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9c,0x99,0x97,0x97,0x97,0x99,0x9a,0x9c,0x9d,\r
+ 0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x9d,0x02,0xf7,\r
+ 0xf7,0x02,0x9f,0x9c,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x87,0x87,\r
+ 0x98,0x99,0x87,0x87,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x99,0x99,0x9a,0x99,0x9e,0x9f,0x9e,0x9d,0x9d,0x9d,0x97,0x9d,\r
+ 0x9a,0x9c,0x99,0x97,0x97,0x87,0x87,0x9a,0x99,0x97,0x87,0x98,0x99,\r
+ 0x9a,0x9c,0x9d,0x9e,0x03,0x9d,0x99,0x9b,0x9a,0x99,0x97,0x98,0x9b,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x9e,0x99,0x97,0x99,0x9c,0x9e,0x9d,0x94,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9e,0x97,\r
+ 0x97,0x94,0x9a,0x9e,0x9b,0x99,0x94,0x03,0x9e,0x97,0x9d,0x9a,0x97,\r
+ 0x97,0x98,0x9a,0x9c,0x9e,0x9f,0x9d,0x9c,0x9b,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0x99,0x9c,0x9b,0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x9d,0x9e,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9c,0x99,0x98,0x9a,0x9a,0x9b,0x97,0x02,0x9d,\r
+ 0x9a,0x99,0x9e,0x9c,0x9a,0x9a,0x9c,0x94,0x9a,0x9c,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9d,0x9d,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9a,0x99,0x99,0x99,0x99,0x9b,0x99,0x9a,0x9b,0x9a,0x99,0x9a,\r
+ 0x9a,0x97,0x03,0xf7,0xf7,0x03,0x94,0x9f,0x03,0x9e,0x9a,0x99,0x99,\r
+ 0x99,0x9a,0x9b,0x9a,0x97,0x9f,0x9a,0x9a,0x97,0x94,0x94,0x94,0x97,\r
+ 0x99,0x98,0x97,0x98,0x9a,0x94,0x9f,0x9a,0x94,0x94,0x94,0x98,0x94,\r
+ 0x97,0x9b,0x9b,0x9a,0x99,0x9a,0x9a,0x9a,0x9a,0x9e,0x9f,0x9e,0x9b,\r
+ 0x9c,0x9f,0x9a,0x9a,0x9a,0x9a,0x9c,0x9d,0x9e,0x9e,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9a,\r
+ 0x97,0x94,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9a,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x9d,0x02,0xf7,0x01,0x02,0x9f,0x9c,\r
+ 0x9a,0x98,0x97,0x94,0x94,0x94,0x87,0x87,0x97,0x98,0x98,0x87,0x97,\r
+ 0x9a,0x9a,0x99,0x9d,0x9f,0x03,0x03,0x03,0x03,0x9e,0x98,0x9a,0x9a,\r
+ 0x97,0x03,0x9f,0x9e,0x9c,0x9d,0x9c,0x9a,0x9d,0x9c,0x9a,0x98,0x97,\r
+ 0x97,0x87,0x99,0x9b,0x98,0x97,0x98,0x99,0x9a,0x9b,0x9d,0x9e,0x9f,\r
+ 0x9f,0x99,0x9a,0x9a,0x99,0x97,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9b,0x97,\r
+ 0x99,0x9a,0x9e,0x9e,0x94,0x9b,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x98,0x97,0x94,0x97,0x9e,0x9c,0x9a,\r
+ 0x94,0x9e,0x02,0x94,0x9c,0x9a,0x97,0x94,0x97,0x97,0x9a,0x9c,0x9e,\r
+ 0x9e,0x9e,0x9c,0x9b,0x9a,0x97,0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,\r
+ 0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9e,0x9a,0x98,0x9a,0x9a,0x9b,0x94,0x02,0x9b,0x9a,0x99,0x9f,0x9a,\r
+ 0x9a,0x9a,0x9d,0x94,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x9f,0x9f,0x9f,0x9e,0x9e,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9c,0x97,0x9c,0x9c,0x9b,0x98,0x9f,0x97,0x9d,0x01,0xf7,\r
+ 0xf7,0x9d,0x94,0x9f,0x03,0x9e,0x9a,0x9a,0x9a,0x9b,0x9c,0x9b,0x97,\r
+ 0x9f,0x9e,0x9b,0x99,0x98,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x99,\r
+ 0x99,0x9a,0x01,0x9d,0x94,0x94,0x97,0x97,0x94,0x99,0x9c,0x9a,0x99,\r
+ 0x99,0x9a,0x9a,0x9b,0x98,0x02,0x9c,0x99,0x97,0x9a,0x9f,0x9a,0x9a,\r
+ 0x9a,0x9c,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9e,0x9d,0x9c,0x9c,0x9b,0x9a,0x9b,0x9c,0x9d,0x9d,\r
+ 0x9e,0x9d,0x9c,0x9c,0x9c,0x9d,0x9d,0x9a,0x94,0x94,0x97,0x9a,0x9a,\r
+ 0x9c,0x9c,0x9c,0x9d,0x9d,0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x97,0x9d,0x02,0xf7,0x01,0x02,0x9e,0x9c,0x99,0x97,0x97,0x94,\r
+ 0x87,0x87,0x87,0x87,0x97,0x99,0x87,0x87,0x97,0x9c,0x9a,0x99,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9b,0x99,0x9a,0x99,0x9a,0x9f,0x9e,0x9d,\r
+ 0x9d,0x9d,0x97,0x9c,0x9b,0x9d,0x99,0x97,0x97,0x87,0x97,0x9c,0x9a,\r
+ 0x99,0x97,0x99,0x9a,0x9c,0x9d,0x9d,0x9f,0x9f,0x98,0x9a,0x9a,0x99,\r
+ 0x97,0x9c,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9e,0x98,0x98,0x9a,0x9c,0x9e,0x9b,\r
+ 0x94,0x02,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x9a,0x97,0x97,0x94,0x9e,0x9d,0x9b,0x94,0x98,0xf7,0x97,0x9a,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x97,0x99,0x9c,0x9e,0x9e,0x9f,0x9c,0x9a,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,0x9a,0x99,0x99,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,0x9c,\r
+ 0x9d,0x9e,0x9f,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9a,0x98,0x9a,\r
+ 0x9a,0x9b,0x94,0x03,0x9a,0x99,0x9a,0x9f,0x9a,0x9a,0x9a,0x9b,0x97,\r
+ 0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9f,0x9f\r
+ };\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define SPRITES_LEN 3200\r
+\r
+ static unsigned char sprites_[]=\r
+ {\r
+ 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x73,0x70,0x73,0x78,0x00,\r
+ 0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,\r
+ 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x78,0x73,0x70,0x73,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,\r
+ 0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x1f,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,\r
+ 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,\r
+ 0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x73,0x70,0x73,\r
+ 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,\r
+ 0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x73,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x70,0x00,\r
+ 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x23,\r
+ 0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,\r
+ 0x25,0x26,0x26,0x25,0x23,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x24,0x28,0x27,0x27,0x25,0x23,0x23,0x23,0x23,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x24,0x28,0x28,0x26,0x25,0x23,0x23,0x22,0x23,0x23,\r
+ 0x23,0x00,0x00,0x00,0x00,0x00,0x24,0x28,0x27,0x27,0x25,0x23,0x22,\r
+ 0xe0,0x21,0x23,0x22,0x00,0x00,0x00,0x00,0x26,0x28,0x28,0x28,0x26,\r
+ 0x27,0x25,0x23,0x21,0x23,0x24,0x25,0x23,0x00,0x00,0x00,0x26,0x2a,\r
+ 0x28,0x28,0x27,0x27,0x26,0x25,0x23,0x24,0x25,0x26,0x22,0x00,0x00,\r
+ 0x00,0x26,0x2a,0x2a,0x28,0x27,0x27,0x26,0x26,0x25,0x25,0x27,0x27,\r
+ 0x23,0x00,0x00,0x00,0x00,0xeb,0x2a,0x2a,0x28,0x27,0x26,0x27,0x26,\r
+ 0x27,0x27,0xeb,0x00,0x00,0x00,0x00,0xeb,0xf2,0x2a,0x2a,0x28,0x28,\r
+ 0xf2,0x27,0x27,0x27,0x28,0xf2,0xeb,0x00,0x00,0x00,0xeb,0xf1,0xf2,\r
+ 0x2a,0x2a,0xf2,0xeb,0xf1,0x28,0x28,0xf2,0xf1,0xeb,0x00,0x00,0xeb,\r
+ 0xf2,0xf4,0xeb,0x27,0x26,0xf2,0xf1,0xee,0xeb,0x25,0xeb,0xf4,0xf2,\r
+ 0xeb,0x00,0xeb,0xf1,0xf2,0xa1,0xeb,0xf2,0xeb,0xee,0xeb,0xf2,0xeb,\r
+ 0xa1,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf2,0xeb,0xf2,0xf1,0xf2,\r
+ 0xf1,0xf3,0xf0,0xf2,0xf2,0xeb,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,\r
+ 0x00,0xeb,0x4e,0xeb,0x00,0x00,0xeb,0xeb,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x93,0x96,0x96,0x94,\r
+ 0x90,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x98,0x97,\r
+ 0x96,0x94,0x91,0x91,0x91,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x92,\r
+ 0x98,0x98,0x96,0x94,0x91,0x91,0x8c,0x92,0x91,0x90,0x00,0x00,0x00,\r
+ 0x00,0x00,0x92,0x98,0x97,0x96,0x94,0x91,0x8d,0x8b,0x8c,0x91,0x90,\r
+ 0x00,0x00,0x00,0x00,0x94,0x98,0x98,0x98,0x96,0x96,0x94,0x91,0x8d,\r
+ 0x92,0x91,0x94,0x90,0x00,0x00,0x00,0x94,0x9a,0x98,0x98,0x97,0x96,\r
+ 0x96,0x94,0x91,0x91,0x94,0x96,0x90,0x00,0x00,0x00,0x94,0x9a,0x9a,\r
+ 0x98,0x98,0x96,0x96,0x96,0x94,0x94,0x96,0x97,0x90,0x00,0x00,0x00,\r
+ 0x00,0xeb,0x9a,0x99,0x98,0x98,0x96,0x96,0x96,0x96,0x97,0xeb,0x00,\r
+ 0x00,0x00,0x00,0xeb,0xf2,0x9a,0x9a,0x98,0x98,0xf2,0x97,0x98,0x97,\r
+ 0x98,0xf2,0xeb,0x00,0x00,0x00,0xeb,0xf1,0xf2,0x9a,0x99,0xf2,0xeb,\r
+ 0xf1,0x98,0x98,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf4,0xeb,0x94,\r
+ 0x95,0xf2,0xf1,0xee,0xeb,0x92,0xeb,0xf4,0xf2,0xeb,0x00,0xeb,0xf1,\r
+ 0xf2,0xa1,0xeb,0xf2,0xeb,0xee,0xeb,0xf2,0xeb,0xa1,0xf2,0xf1,0xeb,\r
+ 0x00,0x00,0xeb,0xf2,0xf2,0xeb,0xf2,0xf1,0xf2,0xf1,0xf2,0xeb,0xf2,\r
+ 0xf2,0xeb,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x00,0xeb,0x4e,0xeb,\r
+ 0x00,0x00,0xeb,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x5a,0x5a,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x5c,0x5c,0x61,0x61,0x5d,0x5a,0x5a,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x63,0x61,0x61,0x5d,0x5b,0x5b,\r
+ 0x5b,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x63,0x61,0x61,0x5d,\r
+ 0x5b,0x5b,0x5a,0x5b,0x5b,0x5a,0x00,0x00,0x00,0x00,0x00,0x5c,0x63,\r
+ 0x61,0x61,0x5d,0x5b,0x59,0x58,0x59,0x5b,0x5a,0x00,0x00,0x00,0x00,\r
+ 0x5e,0x63,0x62,0x61,0x61,0x5f,0x5d,0x5b,0x59,0x5b,0x5b,0x5e,0x5a,\r
+ 0x00,0x00,0x00,0x5e,0x63,0x63,0x62,0x61,0x61,0x5f,0x5d,0x5b,0x5c,\r
+ 0x5d,0x61,0x5a,0x00,0x00,0x00,0x5e,0x65,0x63,0x63,0x61,0x61,0x61,\r
+ 0x5f,0x5d,0x5d,0x62,0x61,0x5a,0x00,0x00,0x00,0x00,0xeb,0x65,0x63,\r
+ 0x62,0x61,0x61,0x61,0x61,0x61,0x61,0xeb,0x00,0x00,0x00,0x00,0xeb,\r
+ 0xf2,0x65,0x63,0x62,0x63,0xf2,0x61,0x61,0x61,0x63,0xf2,0xeb,0x00,\r
+ 0x00,0x00,0xeb,0xf1,0xf2,0x65,0x63,0xf2,0xeb,0xf1,0x63,0x62,0xf2,\r
+ 0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf4,0xeb,0x5e,0x5e,0xf2,0xf1,0xed,\r
+ 0xf0,0x5c,0xeb,0xf4,0xf2,0xeb,0x00,0xeb,0xf1,0xf2,0xa1,0xeb,0xf2,\r
+ 0xeb,0xed,0xf0,0xf2,0xeb,0xa1,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,\r
+ 0xf2,0xeb,0xf2,0xf1,0xf2,0xf1,0xf2,0xeb,0xf2,0xf2,0xeb,0x00,0x00,\r
+ 0x00,0x00,0xeb,0xeb,0x00,0x00,0xeb,0x4e,0xeb,0x00,0x00,0xeb,0xeb,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,\r
+ 0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x44,0x44,0x48,0x48,0x45,0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x44,0x4a,0x49,0x48,0x45,0x43,0x43,0x43,0x42,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x44,0x4a,0x49,0x48,0x45,0x43,0x43,0xb6,0x43,\r
+ 0x43,0x42,0x00,0x00,0x00,0x00,0x00,0x44,0x4a,0x49,0x48,0x45,0x43,\r
+ 0xb6,0x40,0x42,0x43,0x42,0x00,0x00,0x00,0x00,0x46,0x4a,0x4a,0x49,\r
+ 0x48,0xee,0x45,0x43,0x41,0x43,0x43,0x45,0x42,0x00,0x00,0x00,0x46,\r
+ 0x4b,0x4a,0x4b,0x49,0x48,0xee,0x45,0x43,0x43,0x45,0x49,0x42,0x00,\r
+ 0x00,0x00,0x46,0x4c,0x4b,0x4a,0x49,0x48,0x48,0x47,0x45,0x45,0x49,\r
+ 0x49,0x42,0x00,0x00,0x00,0x00,0xeb,0x4c,0x4b,0x4a,0x49,0x48,0x48,\r
+ 0x48,0x48,0x49,0xeb,0x00,0x00,0x00,0x00,0xeb,0xf2,0x4c,0x4c,0x4a,\r
+ 0x4a,0xf2,0x49,0x49,0x49,0x4b,0xf2,0xeb,0x00,0x00,0x00,0xeb,0xf1,\r
+ 0xf2,0x4c,0x4b,0xf2,0xea,0xf1,0x4b,0x4a,0xf2,0xf1,0xeb,0x00,0x00,\r
+ 0xeb,0xf2,0x4e,0xeb,0x46,0x46,0xf2,0xf2,0xee,0xeb,0x44,0xeb,0xf4,\r
+ 0xf2,0xeb,0x00,0xeb,0xf1,0xf2,0xa1,0xeb,0xf2,0xeb,0xee,0xeb,0xf2,\r
+ 0xeb,0xf5,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf2,0xeb,0xf2,0xf1,\r
+ 0xf2,0xf1,0xf2,0xeb,0xf2,0xf2,0xea,0x00,0x00,0x00,0x00,0xeb,0xeb,\r
+ 0x00,0x00,0xeb,0x4e,0xeb,0x00,0x00,0xeb,0xeb,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x72,0x72,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x74,0x78,0x78,\r
+ 0x75,0x72,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x7a,\r
+ 0x79,0x78,0x75,0x73,0x73,0x73,0x72,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x74,0x7a,0x79,0x78,0x75,0x73,0x73,0x71,0x73,0x73,0x72,0x00,0x00,\r
+ 0x00,0x00,0x00,0x74,0x7a,0x79,0x78,0x75,0x73,0x71,0x70,0x71,0x73,\r
+ 0x72,0x00,0x00,0x00,0x00,0x76,0x7a,0x7a,0x79,0x78,0x78,0x75,0x73,\r
+ 0x71,0x73,0x73,0x75,0x72,0x00,0x00,0x00,0x76,0x7b,0x7a,0x7a,0x79,\r
+ 0x78,0x78,0x75,0x73,0x73,0x75,0x78,0x72,0x00,0x00,0x00,0x76,0x7c,\r
+ 0x7b,0x7a,0x79,0x78,0x78,0x78,0x75,0x75,0x78,0x79,0x72,0x00,0x00,\r
+ 0x00,0x00,0xf0,0x7c,0x7b,0x7a,0x79,0x78,0x78,0x78,0x78,0x79,0xf0,\r
+ 0x00,0x00,0x00,0x00,0xf0,0xf2,0x7c,0x7b,0x7a,0x7a,0xf2,0x79,0x79,\r
+ 0x79,0x7a,0xf2,0xf0,0x00,0x00,0x00,0xf0,0xf1,0xf2,0x7c,0x7b,0xf2,\r
+ 0xf0,0xf1,0x7a,0x7a,0xf2,0xf1,0xf0,0x00,0x00,0xf0,0xf2,0xf4,0xf0,\r
+ 0x76,0x76,0xf2,0xf1,0xee,0xf0,0x74,0xf0,0xf4,0xf2,0xf0,0x00,0xf0,\r
+ 0xf1,0xf2,0xf5,0xf0,0xf2,0xf0,0xee,0xf0,0xf2,0xf0,0xf5,0xf2,0xf1,\r
+ 0xf0,0x00,0x00,0xf0,0xf2,0xf2,0xf0,0xf2,0xf1,0xf2,0xf1,0xf2,0xf0,\r
+ 0xf2,0xf2,0xf0,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x00,0xf0,0xf4,\r
+ 0xf0,0x00,0x00,0xf0,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x09,0x09,0x06,0x03,0x03,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b,0x0a,0x09,0x06,0x04,\r
+ 0x04,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b,0x0a,0x09,\r
+ 0x06,0x04,0x04,0x02,0x04,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x05,\r
+ 0x0b,0x0a,0x09,0x06,0x04,0x02,0x02,0x02,0x04,0x03,0x00,0x00,0x00,\r
+ 0x00,0x07,0x0b,0x0b,0x0a,0x09,0x07,0x06,0x04,0x02,0x04,0x04,0x05,\r
+ 0x03,0x00,0x00,0x00,0x07,0x0c,0x0b,0x0a,0x09,0x09,0x06,0x06,0x04,\r
+ 0x04,0x06,0x09,0x03,0x00,0x00,0x00,0x07,0x0d,0x0c,0x0b,0x0a,0x09,\r
+ 0x09,0x06,0x06,0x06,0x09,0x0a,0x03,0x00,0x00,0x00,0x00,0xf0,0x0d,\r
+ 0x0c,0x0b,0x0a,0x09,0x0a,0x09,0x09,0x0a,0xf0,0x00,0x00,0x00,0x00,\r
+ 0xf0,0xf2,0x0d,0x0c,0x0b,0x0b,0xf2,0x0a,0x0a,0x0a,0x0b,0xf2,0xf0,\r
+ 0x00,0x00,0x00,0xf0,0xf1,0xf2,0x0d,0x0c,0xf2,0xf0,0xf1,0x0b,0x0b,\r
+ 0xf2,0xf1,0xf0,0x00,0x00,0xf0,0xf2,0xf4,0xf0,0x07,0x07,0xf2,0xf1,\r
+ 0xee,0xf0,0x05,0xf0,0xf4,0xf2,0xf0,0x00,0xf0,0xf1,0xf2,0xf5,0xf0,\r
+ 0xf2,0xf0,0xee,0xf0,0xf2,0xf0,0xf5,0xf2,0xf1,0xf0,0x00,0x00,0xf0,\r
+ 0xf2,0xf2,0xf0,0xf2,0xf1,0xf2,0xf1,0xf2,0xf0,0xf2,0xf2,0xf0,0x00,\r
+ 0x00,0x00,0x00,0xf0,0xf0,0x00,0x00,0xf0,0xf4,0xf0,0x00,0x00,0xf0,\r
+ 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff\r
+ };\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "maped.h"\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+#include <time.h>\r
+\r
+#include "config.h"\r
+#include "keyboard.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "colbak.h"\r
+#include "colstuff.h"\r
+\r
+#include "smalfont.h"\r
+#include "gui.h"\r
+\r
+#include "tilesel.h"\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+// ================================= Data ====================================\r
+\r
+char *field, *destruct;\r
+char *background, *sprites;\r
+int startofs=16;\r
+int turnlength, turnctr;\r
+int destructed, difficulty=4;\r
+int blocks, score, scoremultiplier;\r
+int level;\r
+\r
+// Current piece falling\r
+\r
+char piece[3], tempspot;\r
+int xpos, ypos, ypofs;\r
+char newpiece;\r
+char nextpiece[3];\r
+\r
+// ================================= Code ====================================\r
+\r
+void BlitPlayField()\r
+{\r
+ int i, j;\r
+ char c;\r
+\r
+ for (i=0; i<12; i++)\r
+ for (j=0; j<6; j++)\r
+ {\r
+ c=field[(i*6)+j];\r
+ if (c) TCopySprite(128+(j*16), startofs+4+(i*16), 16, 16, sprites+((c+1)*256));\r
+ }\r
+}\r
+\r
+void BlitPlayFieldwDestruct(char flash)\r
+{\r
+ int i, j;\r
+ char c;\r
+\r
+ for (i=0; i<12; i++)\r
+ for (j=0; j<6; j++)\r
+ {\r
+ c=field[(i*6)+j];\r
+ if (c && !destruct[(i*6)+j])\r
+ TCopySprite(128+(j*16), startofs+4+(i*16), 16, 16, sprites+((c+1)*256));\r
+ if (destruct[(i*6)+j])\r
+ TCopySprite(128+(j*16), startofs+4+(i*16), 16, 16, sprites+(flash*256));\r
+ }\r
+}\r
+\r
+void BlitPiece()\r
+{\r
+ ypofs=((100 * turnctr) / turnlength) * 16 / 100;\r
+\r
+ TCopySprite(128+(xpos*16), startofs+4+(ypos*16)+ypofs, 16, 16, sprites+((piece[0]+1)*256));\r
+ TCopySprite(128+(xpos*16), startofs+20+(ypos*16)+ypofs, 16, 16, sprites+((piece[1]+1)*256));\r
+ TCopySprite(128+(xpos*16), startofs+36+(ypos*16)+ypofs, 16, 16, sprites+((piece[2]+1)*256));\r
+\r
+ TCopySprite(276, startofs+70, 16, 16, sprites+((nextpiece[0]+1)*256));\r
+ TCopySprite(276, startofs+90, 16, 16, sprites+((nextpiece[1]+1)*256));\r
+ TCopySprite(276, startofs+110, 16, 16, sprites+((nextpiece[2]+1)*256));\r
+}\r
+\r
+void GenerateNewPiece()\r
+{\r
+ newpiece=0;\r
+ xpos=2;\r
+ ypos=0;\r
+ if (field[2]) key[SCAN_ESC]=1;\r
+ if (field[8]) key[SCAN_ESC]=1;\r
+ if (field[14]) key[SCAN_ESC]=1;\r
+ if (field[20]) key[SCAN_ESC]=1;\r
+\r
+ if (key[SCAN_ESC])\r
+ {\r
+ if (difficulty==4 && blocks<240) Message("You really suck at columns, man.",300);\r
+ if (difficulty==5 && blocks<80) Message("You really suck at columns, man.",300);\r
+ if (score>3200 && score<=6400) Message("Not bad.",300);\r
+ if (score>6400) Message("Behold, the Columns God walks among us.",500);\r
+ }\r
+\r
+ memcpy(&piece, &nextpiece, 3);\r
+ nextpiece[0]=random(1,difficulty);\r
+ nextpiece[1]=random(1,difficulty);\r
+ nextpiece[2]=random(1,difficulty);\r
+}\r
+\r
+void DestroyBlock(int x, int y)\r
+{\r
+ int i;\r
+\r
+ for (i=y; i>0; i--)\r
+ {\r
+ field[(i*6)+x]=field[((i-1)*6)+x];\r
+ }\r
+ blocks++;\r
+ score+=scoremultiplier;\r
+}\r
+\r
+void ClearConsecutiveColumns()\r
+{\r
+ int x, y;\r
+ char c;\r
+\r
+ // Scan for things to destroy, but don't destroy them, just mark\r
+ // them in the Destroy field.\r
+\r
+ destructed=0;\r
+ memset(destruct, 0, (6*13));\r
+\r
+ for (y=0; y<12; y++)\r
+ for (x=0; x<6; x++)\r
+ {\r
+ c=field[(y*6)+x];\r
+\r
+ // Test vertical match\r
+ if (y<10)\r
+ {\r
+ if ((field[((y+1)*6)+x]==c) && (field[((y+2)*6)+x]==c) && c)\r
+ {\r
+ // vertical match. Set destruct field.\r
+ destruct[((y+0)*6)+x]=1;\r
+ destruct[((y+1)*6)+x]=1;\r
+ destruct[((y+2)*6)+x]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ // Test horizontal match\r
+ if (x<4)\r
+ {\r
+ if ((field[(y*6)+x+1]==c) && (field[(y*6)+x+2]==c) && c)\r
+ {\r
+ // horizontal match. Set destruct field.\r
+ destruct[(y*6)+x+0]=1;\r
+ destruct[(y*6)+x+1]=1;\r
+ destruct[(y*6)+x+2]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ // Test negative diagonal match\r
+ if (x<4 && y<10)\r
+ {\r
+ if ((field[((y+1)*6)+x+1]==c) && (field[((y+2)*6)+x+2]==c) && c)\r
+ {\r
+ // negative diagonal match. set destruct field.\r
+ destruct[((y+0)*6)+x+0]=1;\r
+ destruct[((y+1)*6)+x+1]=1;\r
+ destruct[((y+2)*6)+x+2]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ // Test positive diagonal match\r
+ if (x>=2 && y<10)\r
+ {\r
+ if ((field[((y+1)*6)+x-1]==c) && (field[((y+2)*6)+x-2]==c) && c)\r
+ {\r
+ // positive diagonal match. set destruct field.\r
+ destruct[((y+0)*6)+x-0]=1;\r
+ destruct[((y+1)*6)+x-1]=1;\r
+ destruct[((y+2)*6)+x-2]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ }\r
+\r
+ // Show which tiles are being destroyed before clearing out for increase\r
+ // visual coolishness.\r
+\r
+ if (destructed)\r
+ {\r
+ timer_count=0;\r
+ while (timer_count<50)\r
+ {\r
+ if (timer_count<10 || (timer_count>20 && timer_count<30) ||\r
+ (timer_count>40 && timer_count<50)) c=1;\r
+ else c=0;\r
+\r
+ CopySprite(16,16,320,200,background);\r
+ BlitPlayFieldwDestruct(c);\r
+ TCopySprite(276, startofs+70, 16, 16, sprites+((nextpiece[0]+1)*256));\r
+ TCopySprite(276, startofs+90, 16, 16, sprites+((nextpiece[1]+1)*256));\r
+ TCopySprite(276, startofs+110, 16, 16, sprites+((nextpiece[2]+1)*256));\r
+\r
+GotoXY(55,130);\r
+sprintf(strbuf,"Blocks: %d", blocks);\r
+printstring(strbuf);\r
+GotoXY(55,140);\r
+sprintf(strbuf,"Score: %d", score);\r
+printstring(strbuf);\r
+GotoXY(55,150);\r
+sprintf(strbuf,"Level: %d", level);\r
+printstring(strbuf);\r
+\r
+ ShowPage();\r
+ }\r
+ }\r
+\r
+ // Apply destruct-o patch to the field.\r
+\r
+ for (y=0; y<12; y++)\r
+ for (x=0; x<6; x++)\r
+ if (destruct[(y*6)+x]) DestroyBlock(x,y);\r
+}\r
+\r
+void NextTurn()\r
+{\r
+ ypos++;\r
+ if (field[((ypos+3)*6)+xpos])\r
+ {\r
+ if (ypos<3) key[SCAN_ESC]=1;\r
+ // Hit something; set piece here.\r
+ field[(ypos*6)+xpos]=piece[0];\r
+ field[((ypos+1)*6)+xpos]=piece[1];\r
+ field[((ypos+2)*6)+xpos]=piece[2];\r
+ newpiece=1;\r
+\r
+ // Scan for consecutive things to delete.\r
+ do\r
+ {\r
+ ClearConsecutiveColumns();\r
+ scoremultiplier*=2;\r
+ } while (destructed);\r
+ }\r
+}\r
+\r
+int CanGoLeft()\r
+{\r
+ if (!xpos) return 0;\r
+ if (field[((ypos+1)*6)+xpos-1]) return 0;\r
+ if (field[((ypos+2)*6)+xpos-1]) return 0;\r
+ if (field[((ypos+3)*6)+xpos-1]) return 0;\r
+ return 1;\r
+}\r
+\r
+int CanGoRight()\r
+{\r
+ if (xpos==5) return 0;\r
+ if (field[((ypos+1)*6)+xpos+1]) return 0;\r
+ if (field[((ypos+2)*6)+xpos+1]) return 0;\r
+ if (field[((ypos+3)*6)+xpos+1]) return 0;\r
+ return 1;\r
+}\r
+\r
+void RotatePiece()\r
+{\r
+ tempspot=piece[0];\r
+ piece[0]=piece[1];\r
+ piece[1]=piece[2];\r
+ piece[2]=tempspot;\r
+}\r
+\r
+void ProcessLevels()\r
+{\r
+ if (blocks>80) { level=2; turnlength=90; }\r
+ if (blocks>160) { level=3; turnlength=80; }\r
+ if (blocks>240) { level=4; turnlength=70; }\r
+ if (blocks>320) { level=5; turnlength=60; }\r
+ if (blocks>400) { level=6; turnlength=50; }\r
+ if (blocks>480) { level=7; turnlength=40; }\r
+ if (blocks>560) { level=8; turnlength=30; }\r
+ if (blocks>640) { level=9; turnlength=20; }\r
+}\r
+\r
+extern FILE *pcxf;\r
+extern int width, depth;\r
+extern int bytes;\r
+extern int vidoffset;\r
+\r
+void LoadBackground()\r
+{\r
+ int i;\r
+\r
+ if (!(pcxf=fopen("colback.pcx","rb")))\r
+ {\r
+ background=background_;\r
+ }\r
+ else\r
+ {\r
+ fclose(pcxf);\r
+ background=(char *) valloc(64000,"col bakg",0);\r
+ LoadPCXHeaderNP("colback.pcx");\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=width*i;\r
+ ReadPCXLine(background);\r
+ }\r
+ fclose(pcxf);\r
+ }\r
+\r
+ if (!(pcxf=fopen("colspr.pcx","rb")))\r
+ {\r
+ sprites=sprites_;\r
+ }\r
+ else\r
+ {\r
+ fclose(pcxf);\r
+ LoadPCXHeaderNP("colspr.pcx");\r
+ sprites=(char *) valloc(width*depth,"col spr",0);\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=width*i;\r
+ ReadPCXLine(sprites);\r
+ }\r
+ fclose(pcxf);\r
+ }\r
+}\r
+\r
+void Columns()\r
+{\r
+ ClearScreen();\r
+ srand(time(NULL));\r
+ LoadBackground();\r
+ field=(char *) valloc(6*13,"col field",0);\r
+ destruct=(char *) valloc(6*13,"col dest",0);\r
+ memset(field, 0, 6*12);\r
+ memset(field+(6*12), 255, 6);\r
+ newpiece=1;\r
+ turnlength=100;\r
+ turnctr=0;\r
+ timer_count=0;\r
+ blocks=0;\r
+ score=0;\r
+ level=1;\r
+ GenerateNewPiece();\r
+ GenerateNewPiece();\r
+ while (!key[SCAN_ESC])\r
+ {\r
+ CopySprite(16,16,320,200,background);\r
+ if (key[SCAN_LEFT])\r
+ {\r
+ if (xpos && CanGoLeft()) xpos--;\r
+ key[SCAN_LEFT]=0;\r
+ }\r
+ if (key[SCAN_RIGHT])\r
+ {\r
+ if (xpos<5 && CanGoRight()) xpos++;\r
+ key[SCAN_RIGHT]=0;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ timer_count*=5;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ RotatePiece();\r
+ key[SCAN_UP]=0;\r
+ }\r
+ ProcessLevels();\r
+ turnctr+=timer_count;\r
+ timer_count=0;\r
+ switch (difficulty)\r
+ {\r
+ case 4: scoremultiplier=5;\r
+ case 5: scoremultiplier=10;\r
+ case 6: scoremultiplier=15;\r
+ }\r
+ if (turnctr>=turnlength)\r
+ {\r
+ NextTurn();\r
+ turnctr-=turnlength;\r
+ }\r
+ if (newpiece) GenerateNewPiece();\r
+ BlitPlayField();\r
+ BlitPiece();\r
+\r
+GotoXY(55,130);\r
+sprintf(strbuf,"Blocks: %d", blocks);\r
+printstring(strbuf);\r
+GotoXY(55,140);\r
+sprintf(strbuf,"Score: %d", score);\r
+printstring(strbuf);\r
+GotoXY(55,150);\r
+sprintf(strbuf,"Level: %d", level);\r
+printstring(strbuf);\r
+\r
+ ShowPage();\r
+ }\r
+ vfree(sprites);\r
+ vfree(background);\r
+ vfree(field);\r
+ vfree(destruct);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef COLUMNS_INC\r
+#define COLUMNS_INC\r
+\r
+extern void BlitPlayField();\r
+extern void BlitPlayFieldwDestruct(char flash);\r
+extern void BlitPiece();\r
+extern void GenerateNewPiece();\r
+extern void DestroyBlock(int x, int y);\r
+extern void ClearConsecutiveColumns();\r
+extern void NextTurn();\r
+extern int CanGoLeft();\r
+extern int CanGoRight();\r
+extern void RotatePiece();\r
+extern void ProcessLevels();\r
+extern void LoadBackground();\r
+extern void Columns();\r
+\r
+#endif // COLUMNS_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#include "gui.h"\r
+#include "mikmod.h"\r
+#include "maped.h"\r
+\r
+#include "smalfont.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+FILE *cfg;\r
+char *strbuf;\r
+\r
+char vm=0; // Video mode\r
+char white=0, black=0; // Color definitions\r
+char pad=0; // Padding mode in tile selector.\r
+char th=0, mh=0; // tile-highlight, map highlight\r
+\r
+// GUI default colors\r
+\r
+char winbg=23;\r
+char titlebg=125;\r
+char brightw=31;\r
+char darkw=13;\r
+char darkred=44;\r
+\r
+// ------------------\r
+\r
+extern char scrollmode, vcedprog[80];\r
+extern int difficulty;\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitializeDefaults()\r
+{\r
+ vm=0;\r
+ white=31;\r
+ black=1;\r
+ pad=1;\r
+ th=1;\r
+ mh=1;\r
+ mouse_scroll=1;\r
+ scrollmode=1;\r
+ memcpy(vcedprog,"edit",5);\r
+}\r
+\r
+void GetConfig(char *fname)\r
+{\r
+ strbuf=(char *) valloc(2000,"strbuf!",0);\r
+ InitializeDefaults();\r
+ if (!(cfg=fopen(fname,"r")))\r
+ {\r
+ printf("Unable to open config file. Using defaults... \n");\r
+ return;\r
+ }\r
+\r
+ while (1)\r
+ {\r
+ fscanf(cfg,"%s",strbuf);\r
+\r
+ if (!strcmp(strbuf,"difficulty"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ difficulty=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"nocdaudio"))\r
+ {\r
+ //nocdaudio=1;\r
+ continue;\r
+ }\r
+ if (!strcmp(strbuf,"vidmode"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ vm=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"white"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ white=atoi(strbuf); brightw=atoi(strbuf);\r
+ TextColor(atoi(strbuf)); continue; }\r
+ if (!strcmp(strbuf,"black"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ black=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"winbg"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ winbg=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"shadow"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ darkw=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"darkred"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ darkred=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"titlebg"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ titlebg=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"pad"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ pad=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "scrollmode"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ scrollmode=atoi(strbuf); continue; }\r
+ // aen\r
+ if (!strcmp(strbuf, "mouse_scroll"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mouse_scroll=atoi(strbuf)&1; continue; }\r
+ if (!strcmp(strbuf, "md_device"))\r
+ { fscanf(cfg, "%s", strbuf);\r
+ md_device=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "th"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ th=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mh"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mh=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "amxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ amxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "amyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ amyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mmxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mmxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mmyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mmyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "cnxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ cnxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "cnyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ cnyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lmxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lmyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lmyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lmyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lvxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lvxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lvyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lvyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mpxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mpxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mpyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mpyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "vaxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ vaxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "vayofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ vayofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "zexofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ zexofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "zeyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ zeyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "exofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ exofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "eyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ eyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "prxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ prxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "pryofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ pryofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "rsxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ rsxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "rsyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ rsyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"vcedprog"))\r
+ { fscanf(cfg,"%s",vcedprog);\r
+ continue; }\r
+ break;\r
+ }\r
+ fclose(cfg);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONFIG_INC\r
+#define CONFIG_INC\r
+\r
+extern char vm;\r
+extern char *strbuf;\r
+extern char white,black,darkred,pad,th,mh;\r
+extern char winbg,titlebg,brightw,darkw;\r
+\r
+extern void InitializeDefaults();\r
+extern void GetConfig(char *fname);\r
+\r
+#endif // CONFIG_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero 5.7.99>\r
+// + fixed ScreenShot() to properly save screenshots with\r
+// the sequential filenames.\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+// ================================= Data ====================================\r
+\r
+// ================================= Code ====================================\r
+\r
+int CheckMouseTabs()\r
+{ int i;\r
+\r
+ for (i=0; i<10; i++)\r
+ {\r
+ if (i<6 && i>=numlayers) continue;\r
+ if (mb==1 && mx>17+(i*10) && mx<26+(i*10) && my>(tsy-7) && my<tsy)\r
+ { layertoggle[i]=layertoggle[i] ^ 1; WaitRelease(); return 1; }\r
+ if (mb==2 && mx>17+(i*10) && mx<26+(i*10) && my>(tsy-7) && my<tsy)\r
+ { el=i; WaitRelease(); return 1; }\r
+ }\r
+ return 0;\r
+}\r
+\r
+HAL()\r
+{ int i;\r
+\r
+ Message("I'm sorry dave, I can't do that...",600);\r
+ i=systemtime+400;\r
+ while (systemtime<i)\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+ ShowPage();\r
+ }\r
+ Message("Just kidding! :)",200);\r
+}\r
+\r
+void WritePCXLine(unsigned char *p,int len,FILE *pcxf)\r
+{ int i;\r
+ unsigned char byt, samect, repcode;\r
+\r
+ i=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<(unsigned) 63 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1 || (byt & 0xC0) != 0)\r
+ {\r
+ repcode=0xC0 | samect;\r
+ fwrite(&repcode,1,1,pcxf);\r
+ }\r
+ fwrite(&byt,1,1,pcxf);\r
+ } while (i<len);\r
+}\r
+\r
+acopytile(int x, int y, char *src, char *pt)\r
+{\r
+ char *d;\r
+ int h;\r
+\r
+ h=16;\r
+\r
+ y<<=6;\r
+ d=pt+y+(y<<2)+x;\r
+\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d,src,16);\r
+ src+=16;\r
+ d+=320;\r
+ }\r
+}\r
+\r
+extern FILE *pcxf;\r
+\r
+void WritePalette(FILE *f)\r
+{ char b;\r
+ int i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] << 2;\r
+\r
+ b=12; fwrite(&b, 1, 1, f);\r
+ fwrite(pal, 1, 768, f);\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+}\r
+\r
+void OutputVSPpcx()\r
+{ int i,j,_x,_y;\r
+ unsigned char *ptr;\r
+ char b1;\r
+ short int w1,w2;\r
+\r
+ // First figure out the filename\r
+\r
+ i=0;\r
+ ptr=&vspname;\r
+ while (*ptr != '.')\r
+ {\r
+ strbuf[i]=*ptr;\r
+ ptr++;\r
+ i++;\r
+ }\r
+ strbuf[i++]='.';\r
+ strbuf[i++]='P';\r
+ strbuf[i++]='C';\r
+ strbuf[i++]='X';\r
+ strbuf[i++]=0;\r
+\r
+ pcxf=fopen(strbuf,"wb");\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=319; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+\r
+ // At this point we need to figure out how many vertical rows tall the\r
+ // PCX needs to be in order to accomidate the number of tiles in the VSP.\r
+\r
+ w2=numtiles/18; w2++;\r
+ w2=(w2*17); fwrite(&w2, 1, 2, pcxf); // ymax = ?;\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w2++; fwrite(&w2, 1, 2, pcxf); // vres = ?;\r
+\r
+ fwrite(screen, 1, 48, pcxf); // 16-color palette data. Who knows what's\r
+ // actually in here. It doesn't matter since\r
+ // the 256-color palette is stored elsewhere.\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(screen, 1, 59, pcxf); // filler\r
+\r
+ // The header is written. Now we need to generate a large buffer where we'll\r
+ // "draw" the PCX, and then encode the data and save the PCX.\r
+\r
+ ptr=(char *) malloc(320*w2);\r
+ memset(ptr,255,(320*w2)); // Give the PCX a white background\r
+\r
+ // Now we "draw" the tiles into the buffer.\r
+\r
+ for (i=0; i<numtiles; i++)\r
+ {\r
+ j=i/18;\r
+ _y=1+(j*17);\r
+ j=i-(j*18);\r
+ _x=1+(j*17);\r
+ acopytile(_x,_y,vsp+(i*256),ptr);\r
+ }\r
+\r
+ // And now we save the rest of the PCX.\r
+\r
+ for (w1=0; w1<w2; w1++)\r
+ WritePCXLine(ptr+(w1*320),320,pcxf);\r
+\r
+ WritePalette(pcxf);\r
+ fclose(pcxf);\r
+\r
+ vfree(ptr);\r
+}\r
+\r
+void ScreenShot()\r
+{\r
+ unsigned char b1;\r
+ unsigned short int w1;\r
+ int i,n; //zero 5.7.99\r
+ char fnamestr[13];\r
+ static int ss=0;\r
+ FILE *pcxf;\r
+\r
+//--- zero 5.7.99\r
+ n=0;\r
+ do\r
+ {\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+ pcxf=fopen(fnamestr,"r");\r
+ i=(int)pcxf;\r
+ if(pcxf) fclose(pcxf);\r
+ n++;\r
+ } while(i);\r
+ n--;\r
+\r
+ // Takes a snapshot of the current screen.\r
+\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+//---\r
+\r
+ pcxf=fopen(&fnamestr,"wb");\r
+ ss++;\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=sx-1; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+ w1=sy-1; fwrite(&w1, 1, 2, pcxf); // ymax = 199;\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w1=sy; fwrite(&w1, 1, 2, pcxf); // vres = 200;\r
+\r
+ fwrite(screen,1,48,pcxf);\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(screen, 1, 59, pcxf); // filler\r
+\r
+ for (w1=0; w1<sy; w1++)\r
+ WritePCXLine(screen+((w1+16)*tsx)+16, sx, pcxf);\r
+\r
+ WritePalette(pcxf);\r
+ fclose(pcxf);\r
+ timer_count=0;\r
+}\r
+\r
+// aen -- put this out here because the PollMovement() routine i added\r
+// needs access to them.\r
+\r
+int ms_right=0;\r
+int ms_down=0;\r
+int ms_left=0;\r
+int ms_up=0;\r
+\r
+void PollMovement() // aen\r
+{\r
+ int xmax, ymax;\r
+\r
+ // d'oh! :p\r
+ ms_right=0;\r
+ ms_down=0;\r
+ ms_left=0;\r
+ ms_up=0;\r
+\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+\r
+ // aen: made all scroll code apply movement first, correct afterwards. if\r
+ // not done this way, bugs crop up with the movement when holding page\r
+ // down, to scroll to the bottom of the map (in tile scroll), then holding\r
+ // the up arrow key to scroll back up to the top (will scroll into the\r
+ // negatives).\r
+\r
+ if (mouse_scroll)\r
+ {\r
+ if (my<18) ms_up=1;\r
+ if (my>(tsy-2)) ms_down=1;\r
+ if (mx>334) ms_right=1;\r
+ if (mx<18) ms_left=1;\r
+ }\r
+\r
+ if (key[SCAN_UP] || ms_up)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ ywin -= map_scroll_y;\r
+ if (ywin < 0) ywin = 0;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_UP] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_UP]=0;\r
+ ywin -= 16;\r
+ if (ywin < 0) ywin = 0;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_DOWN] || ms_down)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ ywin += map_scroll_y;\r
+ if (ywin > ymax)\r
+ ywin = ymax;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_DOWN] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_DOWN]=0;\r
+ ywin += 16;\r
+ if (ywin > ymax)\r
+ ywin = ymax;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_RIGHT] || ms_right)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ xwin += map_scroll_x;\r
+ if (xwin > xmax)\r
+ xwin = xmax;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_RIGHT] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_RIGHT]=0;\r
+ xwin += 16;\r
+ if (xwin > xmax)\r
+ xwin = xmax;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_LEFT] || ms_left)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ xwin -= map_scroll_x;\r
+ if (xwin < 0) xwin=0;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_LEFT] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_LEFT]=0;\r
+ xwin -= 16;\r
+ if (xwin < 0) xwin = 0;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+ProcessControls()\r
+{\r
+ int xmax, ymax;\r
+\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+\r
+ if (key[SCAN_F5]) { key[SCAN_F5]=0; ShellMAP(); }\r
+ if (key[SCAN_F6]) { key[SCAN_F6]=0; CompileAll(); }\r
+ if (key[SCAN_F8]) { key[SCAN_F8]=0; ShellVERGE(); }\r
+ if (key[SCAN_ALT] && key[SCAN_D]) { key[SCAN_D]=0; ShellToDOS(); }\r
+ if (key[SCAN_ALT] && key[SCAN_L]) LoadMAPDialog();\r
+ if (key[SCAN_ALT] && key[SCAN_V]) ShellEditMAP();\r
+ if (key[SCAN_ALT] && key[SCAN_S]) ShellEditSystem();\r
+ if (key[SCAN_ALT] && key[SCAN_N]) NewMAP();\r
+ if (key[SCAN_ALT] && key[SCAN_P]) MPDialog();\r
+ if (!key[SCAN_ALT] && key[SCAN_P]) { pasting^=1; key[SCAN_P]=0; } // aen\r
+\r
+ if (key[SCAN_A] && el<6)\r
+ {\r
+ lt++;\r
+ if (lt==numtiles) lt=0;\r
+ key[SCAN_A]=0;\r
+ }\r
+ if (key[SCAN_Z] && el<6)\r
+ {\r
+ if (lt) lt--;\r
+ else lt=numtiles-1;\r
+ key[SCAN_Z]=0;\r
+ }\r
+ if (key[SCAN_A] && el==7)\r
+ {\r
+ curzone++;\r
+ key[SCAN_A]=0;\r
+ }\r
+ if (key[SCAN_Z] && el==7)\r
+ {\r
+ curzone--;\r
+ key[SCAN_Z]=0;\r
+ }\r
+ if (key[SCAN_S])\r
+ {\r
+ rt++;\r
+ if (rt==numtiles) rt=0;\r
+ key[SCAN_S]=0;\r
+ }\r
+ if (key[SCAN_X])\r
+ {\r
+ if (rt) rt--;\r
+ else rt=numtiles-1;\r
+ key[SCAN_X]=0;\r
+ }\r
+ if (key[SCAN_F10])\r
+ {\r
+ key[SCAN_F10]=0;\r
+ if (random(0,255)<15) HAL();\r
+ SaveMAP(mapname);\r
+ SaveVSP(vspname);\r
+ CompileMAP();\r
+ Message("MAP/VSP saved.",100);\r
+ modified=0;\r
+ }\r
+ if (key[SCAN_C])\r
+ {\r
+ key[SCAN_C]=0;\r
+ sprintf(strbuf,"Left: %d Right: %d", lt, rt);\r
+ Message(strbuf, 300);\r
+ }\r
+ if (key[SCAN_M])\r
+ {\r
+ key[SCAN_M]=0;\r
+ GenerateMiniVSP();\r
+ MiniMAP();\r
+ }\r
+ if (key[SCAN_H])\r
+ {\r
+ key[SCAN_H]=0;\r
+ mh=mh^1;\r
+ if (mh) Message("MAP Tile Highlight enabled.",100);\r
+ else Message("MAP Tile Highlight disabled.",100);\r
+ }\r
+\r
+ // ***\r
+ // movement code moved to PollMovement()\r
+ // ***\r
+\r
+ if (key[SCAN_PGUP])\r
+ {\r
+ key[SCAN_PGUP]=0;\r
+ ywin -= sy;\r
+ if (ywin < 0)\r
+ ywin = 0;\r
+ }\r
+ if (key[SCAN_HOME])\r
+ {\r
+ key[SCAN_HOME]=0;\r
+ xwin -= sx;\r
+ if (xwin < 0)\r
+ xwin = 0;\r
+ }\r
+ if (key[SCAN_END])\r
+ {\r
+ key[SCAN_END]=0;\r
+ xwin += sx;\r
+ if (xwin > xmax)\r
+ xwin = xmax;\r
+ }\r
+ if (key[SCAN_PGDN])\r
+ {\r
+ key[SCAN_PGDN]=0;\r
+ ywin += sy;\r
+ if (ywin > ymax)\r
+ ywin = ymax;\r
+ }\r
+\r
+ if (key[SCAN_CTRL] && el<6)\r
+ {\r
+ key[SCAN_CTRL]=0;\r
+ TileSelector();\r
+ }\r
+ if (key[SCAN_CTRL] && el==7)\r
+ {\r
+ key[SCAN_CTRL]=0;\r
+ ZoneEdDialog();\r
+ }\r
+\r
+ if (key[SCAN_TAB])\r
+ {\r
+ key[SCAN_TAB]=0;\r
+ if (scrollmode)\r
+ {\r
+ scrollmode=0;\r
+ xwin=xwin/16; xwin=xwin*16;\r
+ ywin=ywin/16; ywin=ywin*16;\r
+ Message("Tile scroll.",150);\r
+ }\r
+ else\r
+ {\r
+ scrollmode=1;\r
+ Message("Pixel scroll.",150);\r
+ }\r
+ }\r
+\r
+ if (key[SCAN_1])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[0]=0;\r
+ return;\r
+ }\r
+ layertoggle[0]=1;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ el=0;\r
+ key[SCAN_1]=0;\r
+ }\r
+ if (key[SCAN_2])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[1]=0;\r
+ return;\r
+ }\r
+ key[SCAN_2]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>1)\r
+ { layertoggle[1]=1;\r
+ el=1; }\r
+ }\r
+ if (key[SCAN_3])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[2]=0;\r
+ return;\r
+ }\r
+ key[SCAN_3]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>2)\r
+ { layertoggle[2]=1;\r
+ el=2; }\r
+ }\r
+ if (key[SCAN_4])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[3]=0;\r
+ return;\r
+ }\r
+ key[SCAN_4]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>3)\r
+ { layertoggle[3]=1;\r
+ el=3; }\r
+ }\r
+ if (key[SCAN_5])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[4]=0;\r
+ return;\r
+ }\r
+ key[SCAN_5]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>4)\r
+ { layertoggle[4]=1;\r
+ el=4; }\r
+ }\r
+ if (key[SCAN_6])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[5]=0;\r
+ return;\r
+ }\r
+ key[SCAN_6]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>5)\r
+ { layertoggle[5]=1;\r
+ el=5; }\r
+ }\r
+ if (key[SCAN_O])\r
+ {\r
+ key[SCAN_O]=0;\r
+ layertoggle[6]=1; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ el=6;\r
+ }\r
+ if (key[SCAN_N])\r
+ {\r
+ key[SCAN_N]=0;\r
+ layertoggle[6]=0; layertoggle[7]=1;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ el=7;\r
+ }\r
+ if (key[SCAN_E])\r
+ {\r
+ key[SCAN_E]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=1; layertoggle[9]=0;\r
+ el=8;\r
+ }\r
+ if (key[SCAN_T])\r
+ {\r
+ key[SCAN_T]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=1;\r
+ el=9;\r
+ }\r
+ if (key[SCAN_F9])\r
+ { // aen\r
+ key[SCAN_F9]=0;\r
+ mouse_scroll^=1;\r
+ sprintf(strbuf,"Mouse scroll %sabled.", mouse_scroll ? "en" : "dis");\r
+ Message(strbuf, 100);\r
+ }\r
+ if (key[SCAN_F11])\r
+ {\r
+ key[SCAN_F11]=0;\r
+ ScreenShot();\r
+ Message("Screen capture saved.",300);\r
+ }\r
+ if (key[SCAN_F12])\r
+ {\r
+ key[SCAN_F12]=0;\r
+ OutputVSPpcx();\r
+ Message("PCX file exported.",300);\r
+ }\r
+ if (key[SCAN_LANGLE])\r
+ {\r
+ key[SCAN_LANGLE]=0;\r
+ ShutdownVideo();\r
+ vm=0;\r
+ InitVideo(0);\r
+ set_intensity(63);\r
+ InitMouse();\r
+\r
+ // aen -- gotta recalc this if you're in a lower res at the bottom of\r
+ // the map and jump to a higher res.\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+ if (xwin > xmax) xwin=xmax;\r
+ if (ywin > ymax) ywin=ymax;\r
+ }\r
+ if (key[SCAN_RANGLE])\r
+ {\r
+ key[SCAN_RANGLE]=0;\r
+ ShutdownVideo();\r
+ vm=1;\r
+ InitVideo(1);\r
+ set_intensity(63);\r
+ InitMouse();\r
+\r
+ // aen -- gotta recalc this if you're in a lower res at the bottom of\r
+ // the map and jump to a higher res.\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+ if (xwin > xmax) xwin=xmax;\r
+ if (ywin > ymax) ywin=ymax;\r
+ }\r
+\r
+ if (CheckMouseTabs()) return;\r
+\r
+ if (mb>=3) MainMenu(mx-4,my-5);\r
+ if (key[SCAN_ESC]) DoMainMenu();\r
+\r
+ if (mb==1 && key[SCAN_SLASH] && el<6)\r
+ {\r
+ lt=layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16)];\r
+\r
+ return;\r
+ }\r
+\r
+ if (mb==2 && key[SCAN_SLASH] && el<6)\r
+ {\r
+ rt=layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16)];\r
+ return;\r
+ }\r
+\r
+ // aen; these must come before the tile plotting code just below\r
+ // to work correctly.\r
+ if (mb && el<6 && key[SCAN_LSHIFT] && !shifted)\r
+ {\r
+ selx1=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
+ sely1=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
+ selx2=selx1;\r
+ sely2=sely1;\r
+ shifted=mb;\r
+ return;\r
+ }\r
+ if (mb && el<6 && shifted)\r
+ {\r
+ selx2=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
+ sely2=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
+ return;\r
+ }\r
+ if (!mb && el<6 && shifted)\r
+ { int i,j;\r
+ int x1,y1,x2,y2;\r
+\r
+ x1=selx1;\r
+ y1=sely1;\r
+ x2=selx2;\r
+ y2=sely2;\r
+\r
+ if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
+ if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
+\r
+ copybuf_wide=x2-x1+1;\r
+ copybuf_deep=y2-y1+1;\r
+\r
+ if (shifted==2)\r
+ {\r
+ // block fill\r
+ modified=1;\r
+ for (j=0; j<copybuf_deep; j++)\r
+ {\r
+ for (i=0; i<copybuf_wide; i++)\r
+ layers[el][((y1+j)*layer[el].sizex)+(x1+i)]=lt;\r
+ }\r
+ }\r
+\r
+ if (shifted==1)\r
+ {\r
+ modified=1;\r
+ if (copybuf) vfree(copybuf);\r
+ copybuf=(word *)valloc(copybuf_wide*copybuf_deep*2, "copybuf", 0);\r
+\r
+ // copy\r
+ for (j=0; j<copybuf_deep; j++)\r
+ {\r
+ for (i=0; i<copybuf_wide; i++)\r
+ copybuf[(j*copybuf_wide)+i]=layers[el][((y1+j)*layer[el].sizex)+(x1+i)];\r
+ }\r
+ pasting=1;\r
+ }\r
+ selx1=sely1=0;\r
+ selx2=sely2=0;\r
+ shifted=0;\r
+ }\r
+ if (mb==1 && el<6 && !shifted && pasting)\r
+ { int a,b,i,j;\r
+\r
+ a=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
+ b=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
+\r
+ // paste\r
+ for (j=0; j<copybuf_deep; j++)\r
+ {\r
+ for (i=0; i<copybuf_wide; i++)\r
+ {\r
+ if (b+j<layer[el].sizey && a+i<layer[el].sizex)\r
+ layers[el][((b+j)*layer[el].sizex)+(a+i)]=copybuf[(j*copybuf_wide)+i];\r
+ }\r
+ }\r
+ }\r
+\r
+ if (mb==1 && el<6 && !shifted && !pasting)\r
+ {\r
+ if (mx>335) mx=334;\r
+ modified=1;\r
+ layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)\r
+ /16)]=lt;\r
+ }\r
+ if (mb==2 && el<6 && !shifted)\r
+ {\r
+ if (mx>335) mx=334;\r
+ modified=1;\r
+ layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)\r
+ /16)]=rt;\r
+ }\r
+\r
+ if (mb==1 && el==6)\r
+ {\r
+ modified=1;\r
+ obstruct[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=1;\r
+ }\r
+ if (mb==2 && el==6)\r
+ {\r
+ modified=1;\r
+ obstruct[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=0;\r
+ }\r
+ if (mb==1 && el==7 && (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]))\r
+ {\r
+ curzone=zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)];\r
+ WaitRelease();\r
+ ZoneEdDialog();\r
+ return;\r
+ }\r
+ if (mb==1 && el==7)\r
+ {\r
+ modified=1;\r
+ zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=curzone;\r
+ }\r
+ if (mb==2 && el==7)\r
+ {\r
+ modified=1;\r
+ zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=0;\r
+ }\r
+ if (mb==1 && el==8)\r
+ {\r
+ WaitRelease();\r
+ ProcessEntity((xwin+(mx-16))/16,(ywin+(my-16))/16);\r
+ modified=1;\r
+ }\r
+ if (el==8 && EntityThere((mx-16+xwin)/16,(my+ywin-16)/16) &&\r
+ key[SCAN_DEL])\r
+ {\r
+ WaitRelease();\r
+ DeleteEntity((mx-16+xwin)/16,(my-16+ywin)/16);\r
+ modified=1;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+\r
+#include "config.h"\r
+#include "guicomp.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+#include "keyboard.h"\r
+\r
+#include "smalfont.h"\r
+#include "columns.h"\r
+#include "tilesel.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+struct message\r
+{\r
+ char text[44]; // message text\r
+ int exptime; // message expire time\r
+};\r
+\r
+struct message messages[6]; // 5-message buffer\r
+char num_msgs=0; // number of active messages\r
+char playingmod[80]; // currently playing mod.\r
+extern char scrollmode;\r
+\r
+// ================================= Code ====================================\r
+\r
+void CheckMessageExpirations()\r
+{ int i;\r
+\r
+ for (i=0; i<num_msgs; i++)\r
+ if (systemtime>messages[i].exptime)\r
+ {\r
+ memcpy(messages[i].text, messages[i+1].text, (48*(num_msgs-i+1)));\r
+ num_msgs--;\r
+ }\r
+}\r
+\r
+void Message(char *text, int duration)\r
+{\r
+ if (num_msgs<5)\r
+ {\r
+ memcpy(messages[num_msgs].text, text, strlen(text));\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+ num_msgs++;\r
+ return;\r
+ }\r
+\r
+ memcpy(&messages[0].text, &messages[1].text, 192);\r
+ memcpy(messages[4].text, text, strlen(text)+1);\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+}\r
+\r
+void DrawScreenControls()\r
+{ int i;\r
+ byte c;\r
+\r
+ if (el<6)\r
+ {\r
+ if (pasting)\r
+ {\r
+ GotoXY(298-5,tsy-19+13);\r
+ printstring("P");\r
+ }\r
+ }\r
+\r
+ // Put current-tile boxes if applicable.\r
+ if (el<6)\r
+ {\r
+ FilledBox(298,tsy-19,18,18,white);\r
+ FilledBox(317,tsy-19,18,18,white);\r
+ CopySprite(299,tsy-18,16,16,vsp+(256*lt));\r
+ CopySprite(318,tsy-18,16,16,vsp+(256*rt));\r
+ }\r
+\r
+ if (el==7)\r
+ {\r
+ sprintf(strbuf,"Zone %d",curzone);\r
+ GotoXY(280,tsy-16);\r
+ printstring(strbuf);\r
+ GotoXY(280,tsy-10);\r
+ printstring(zones[curzone].name);\r
+\r
+ c=zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)/16)];\r
+\r
+ if (c)\r
+ {\r
+ sprintf(strbuf,"zone %d",c);\r
+ GotoXY(280,17);\r
+ printstring(strbuf);\r
+ GotoXY(280,23);\r
+ printstring(zones[c].name);\r
+ }\r
+ }\r
+\r
+ if (el==8)\r
+ {\r
+ sprintf(strbuf,"%d entities",entities);\r
+ GotoXY(285,17); printstring(strbuf);\r
+\r
+ if (c=EntityThere((mx+xwin-16)/16,(my+ywin-16)/16))\r
+ {\r
+ c--;\r
+ GotoXY(285,tsy-10);\r
+ printstring(entity[c].desc);\r
+ }\r
+ }\r
+\r
+ // Put the current-tile mouse thingy.\r
+ GotoXY(17,17);\r
+ dec_to_asciiz((xwin+mx-16)/16,strbuf);\r
+ printstring(strbuf); printstring(", ");\r
+ dec_to_asciiz((ywin+my-16)/16,strbuf);\r
+ printstring(strbuf);\r
+\r
+ // Put the layer editor/selector.\r
+\r
+ for (i=0; i<6; i++)\r
+ {\r
+ if (el==i) c=white; else c=darkw;\r
+ FilledBox(17+(i*10),tsy-7,9,7,c);\r
+ if (layertoggle[i]) c=darkred; else c=0;\r
+ FilledBox(18+(i*10),tsy-6,7,6,c);\r
+ GotoXY(20+(i*10),tsy-5); dec_to_asciiz(i+1,strbuf);\r
+ if (i<numlayers) printstring(strbuf);\r
+ }\r
+\r
+ for (i=6; i<10; i++)\r
+ {\r
+ if (el==i) c=white; else c=darkw;\r
+ FilledBox(17+(i*10),tsy-7,9,7,c);\r
+ if (layertoggle[i]) c=darkred; else c=0;\r
+ FilledBox(18+(i*10),tsy-6,7,6,c);\r
+ GotoXY(20+(i*10),tsy-5);\r
+ switch (i)\r
+ {\r
+ case 6: printstring("O"); break;\r
+ case 7: printstring("N"); break;\r
+ case 8: printstring("E"); break;\r
+ case 9: printstring("T"); break;\r
+ }\r
+ }\r
+}\r
+\r
+void RenderMessages()\r
+{ int i;\r
+\r
+ CheckMessageExpirations();\r
+ for (i=0; i<num_msgs; i++)\r
+ {\r
+ GotoXY(17,23+(i*6));\r
+ printstring(messages[i].text);\r
+ }\r
+}\r
+\r
+void RenderGUI()\r
+{\r
+ RenderMessages();\r
+ DrawScreenControls();\r
+ DrawMouse();\r
+}\r
+\r
+// ============================= Dialog Code =================================\r
+\r
+int mmxofs=60, mmyofs=50;\r
+\r
+void DoMainMenu()\r
+{\r
+ key[SCAN_ESC]=0;\r
+ MainMenu(mmxofs, mmyofs);\r
+}\r
+\r
+void MainMenu(int dx, int dy)\r
+{ char done=0;\r
+ //int mxo, myo, cursorblink;\r
+\r
+ mmxofs=dx;\r
+ mmyofs=dy;\r
+ do\r
+ {\r
+ if (dx<16) dx=16;\r
+ if (dy<16) dy=16;\r
+ if (dx+80>335) dx=336-80;\r
+ if (dy+89>sy+16) dy=(sy+16)-89;\r
+\r
+ RenderMap();\r
+ RenderGUI();\r
+ stdwindow(dx, dy, dx+80, dy+89);\r
+\r
+ if (mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
+ if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
+ if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
+ if (my>dy+20 && my<dy+26) FilledBox(dx+2, dy+20, 76, 7, darkw);\r
+ if (my>dy+29 && my<dy+36) FilledBox(dx+2, dy+29, 76, 7, darkw);\r
+ if (my>dy+35 && my<dy+42) FilledBox(dx+2, dy+35, 76, 7, darkw);\r
+ if (my>dy+41 && my<dy+48) FilledBox(dx+2, dy+41, 76, 7, darkw);\r
+ if (my>dy+47 && my<dy+54) FilledBox(dx+2, dy+47, 76, 7, darkw);\r
+ if (my>dy+53 && my<dy+60) FilledBox(dx+2, dy+53, 76, 7, darkw);\r
+ if (my>dy+59 && my<dy+66) FilledBox(dx+2, dy+59, 76, 7, darkw);\r
+ if (my>dy+65 && my<dy+72) FilledBox(dx+2, dy+65, 76, 7, darkw);\r
+ if (my>dy+71 && my<dy+78) FilledBox(dx+2, dy+71, 76, 7, darkw);\r
+ if (my>dy+80 && my<dy+87) FilledBox(dx+2, dy+80, 76, 7, darkw);\r
+ }\r
+\r
+ GotoXY(dx+3, dy+3); printstring("New MAP");\r
+ GotoXY(dx+3, dy+9); printstring("Load MAP");\r
+ GotoXY(dx+3, dy+15); printstring("Save MAP");\r
+ GotoXY(dx+3, dy+21); printstring("Load VSP");\r
+ HLine(dx+2, dy+28, 76, white);\r
+ GotoXY(dx+3, dy+30); printstring("MAP Properties");\r
+ GotoXY(dx+3, dy+36); printstring("Layers"); GotoXY(dx+73, dy+36); printstring(">");\r
+ GotoXY(dx+3, dy+42); printstring("Options");\r
+ GotoXY(dx+3, dy+48); printstring("MOD Player");\r
+ GotoXY(dx+3, dy+54); printstring("CD Player");\r
+ GotoXY(dx+3, dy+60); printstring("Columns");\r
+ GotoXY(dx+3, dy+66); printstring("Execute"); GotoXY(dx+73, dy+66); printstring(">");\r
+ GotoXY(dx+3, dy+72); printstring("Exit to DOS");\r
+ HLine(dx+2, dy+79, 76, white);\r
+ GotoXY(dx+3, dy+81); printstring("About MapEd");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ if (mb==1 && mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) { NewMAP(); done=1; WaitRelease(); break; }\r
+ if (my>dy+8 && my<dy+15) { done=1; WaitRelease(); LoadMAPDialog(); break; }\r
+ if (my>dy+14 && my<dy+21) { done=1; WaitRelease(); key[SCAN_F10]=1; break; }\r
+ if (my>dy+20 && my<dy+26) { done=1; WaitRelease(); LoadVSPDialog(); break; }\r
+ if (my>dy+29 && my<dy+36) { done=1; WaitRelease(); MapPropertiesDialog(); break; }\r
+ if (my>dy+35 && my<dy+42) { done=1; WaitRelease(); LayersSubMenu(dx,dy); break; }\r
+ if (my>dy+41 && my<dy+48) { done=1; WaitRelease(); OptionsDialog(); break; }\r
+ if (my>dy+47 && my<dy+54) { done=1; WaitRelease(); MPDialog(); break; }\r
+ if (my>dy+53 && my<dy+60) { done=1; WaitRelease(); CDDialog(); break; }\r
+ if (my>dy+59 && my<dy+66) { done=1; WaitRelease(); Columns(); break; }\r
+ if (my>dy+65 && my<dy+72) { done=1; WaitRelease(); ExecuteSubMenu(); break; }\r
+ if (my>dy+71 && my<dy+78) { done=1; WaitRelease(); key[SCAN_X]=1; key[SCAN_ALT]=1; break; }\r
+ if (my>dy+80 && my<dy+87) { done=1; About(); break; }\r
+ }\r
+\r
+ if (mb==1)\r
+ {\r
+ WaitRelease();\r
+ done=1;\r
+ }\r
+ if (key[SCAN_ESC]==1) done=1;\r
+ } while (!done);\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+// tilesel.c\r
+extern FILE *pcxf;\r
+extern int width, depth;\r
+extern int vidoffset;\r
+extern char *ovsp;\r
+extern char *t;\r
+extern word ontiles;\r
+\r
+static int TileMatch(int a, int b)\r
+ { return !memcmp(ovsp+(a*256), ovsp+(b*256), 256); }\r
+\r
+int ilxsize=145, ilysize=122+10;\r
+int ilxofs=16, ilyofs=16;\r
+\r
+// make this configurable at some point\r
+#define MIN_TILE_X 50\r
+#define MIN_TILE_Y 50\r
+\r
+static int BitToNum(int num)\r
+{\r
+ int i;\r
+\r
+ if (!num)\r
+ return 0;\r
+\r
+ for (i=0; i<32; i++)\r
+ {\r
+ if (num & (1<<i))\r
+ break;\r
+ }\r
+\r
+ return i+1;\r
+}\r
+\r
+//zero\r
+byte TileCmp(byte *one, byte *two)\r
+ { return !memcmp(one,two, 256); }\r
+\r
+void ImageToLayer()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, tt, *str;\r
+ char nstr1[80], nstr2[80];\r
+\r
+ int i,j,k,m;\r
+ FILE *f=0;\r
+ int num_padx=0,num_pady=0; // in tiles\r
+ int minpadx=0,minpady=0; // in tiles\r
+ int tilesx=0,tilesy=0; // in tiles\r
+ int totalx=0,totaly=0; // in tiles\r
+ int excessx=0,excessy=0; // in pixels\r
+ //int chk_1=1,chk_2=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0; // radio control\r
+ int chk_layer=1;\r
+ int chk_grabexcess=0,chk_centerinpad=0,chk_nodup=1; //,chk_padisblank=1;\r
+ char txt_imagename[80];\r
+ // ...\r
+ int ly=0;\r
+ int wide=0,deep=0;\r
+ int lsz=0;\r
+ int matched=0,plot=0; //,mapat=0;\r
+ int tilesripped=0;\r
+ int startx=0,starty=0;\r
+ memset(txt_imagename,0,80);\r
+ bmode=0; // for browser; update map/gui\r
+ width=0; depth=0; // for pcx loading code\r
+\r
+ sprintf(nstr1, "%d", num_padx);\r
+ sprintf(nstr2, "%d", num_pady);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ ilxofs = (mx-mxo);\r
+ ilyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (ilxofs<16) ilxofs = 16;\r
+ if (ilyofs<16) ilyofs = 16;\r
+ if (ilxofs+ilxsize>335) ilxofs = 336-ilxsize;\r
+ if (ilyofs+ilysize>sy+16) ilyofs = (sy+16)-ilysize;\r
+ }\r
+\r
+ Window(ilxofs, ilyofs, ilxofs+ilxsize, ilyofs+ilysize, "Import Image As Layer");\r
+ Button(ilxofs+109, ilyofs+12, "Browse");\r
+ Button(ilxofs+109, ilyofs+30, "OK");\r
+ GotoXY(ilxofs+5, ilyofs+25); printstring("Layer:");\r
+ // layer select radio buttons\r
+ for (i=0; i<6; i++)\r
+ {\r
+ CheckBox(ilxofs+29+(i*10), ilyofs+33, chk_layer & (1<<i));\r
+ GotoXY(ilxofs+31+(i*10), ilyofs+25);\r
+ sprintf(strbuf, "%i", i+1); printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+14); printstring("Image:");\r
+ //TextField(ilxofs+29, ilyofs+12, 75, txt_imagename, ctf == 1 ? cb : 0);\r
+ GotoXY(ilxofs+29, ilyofs+14); printstring(txt_imagename);\r
+ HLine(ilxofs+1, ilyofs+44, 143, white);\r
+ GotoXY(ilxofs+5, ilyofs+49); printstring("Image Dimensions:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Image Dimensions:")+3, ilyofs+49);\r
+ sprintf(strbuf, "%dx%d", width, depth);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+60); printstring("Tiles X:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Tiles X:")+3, ilyofs+60);\r
+ sprintf(strbuf, "%d", tilesx);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+71); printstring("Tiles Y:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Tiles Y:")+3, ilyofs+71);\r
+ sprintf(strbuf, "%d", tilesy);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+51, ilyofs+60); printstring("Pad X:");\r
+ GotoXY(ilxofs+51, ilyofs+71); printstring("Pad Y:");\r
+ TextField(ilxofs+74, ilyofs+58, 12, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(ilxofs+74, ilyofs+69, 12, nstr2, ctf == 2 ? cb : 0);\r
+ GotoXY(ilxofs+95, ilyofs+60); printstring("Total X:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+95+pixels("Total X:")+3, ilyofs+60);\r
+ sprintf(strbuf, "%d", totalx);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+95, ilyofs+71); printstring("Total Y:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+95+pixels("Total Y:")+3, ilyofs+71);\r
+ sprintf(strbuf, "%d", totaly);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+81); printstring("Excess Pixels X:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Excess Pixels X:")+3, ilyofs+81);\r
+ sprintf(strbuf, "%d", excessx);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+91); printstring("Excess Pixels Y:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Excess Pixels Y:")+3, ilyofs+91);\r
+ sprintf(strbuf, "%d", excessy);\r
+ printstring(strbuf);\r
+ }\r
+ CheckBox(ilxofs+5, ilyofs+101, chk_grabexcess);\r
+ GotoXY(ilxofs+17, ilyofs+102); printstring("Grab Excess");\r
+ CheckBox(ilxofs+5, ilyofs+110, chk_centerinpad);\r
+ GotoXY(ilxofs+17, ilyofs+111); printstring("Center Within Padding");\r
+ CheckBox(ilxofs+5, ilyofs+119, chk_nodup);\r
+ GotoXY(ilxofs+17, ilyofs+120); printstring("Eliminate Duplicates");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>ilxofs+109 && mx<ilxofs+30+109 && my>ilyofs+12 && my<ilyofs+10+12 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(ilxofs+109, ilyofs+12, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1, "*.pcx", "", "", "", txt_imagename);\r
+ key[SCAN_ESC]=0; // just in case ESC exited\r
+ f=fopen(txt_imagename, "rb");\r
+ if (f)\r
+ {\r
+ LoadPCXHeaderNP(txt_imagename);\r
+ fclose(pcxf);\r
+\r
+ if (chk_grabexcess) i=15; else i=0;\r
+ tilesx=((width+i)&~15)/16;\r
+ tilesy=((depth+i)&~15)/16;\r
+ excessx=width & 15;\r
+ excessy=depth & 15;\r
+ if (tilesx<MIN_TILE_X) { minpadx=MIN_TILE_X-tilesx; num_padx=minpadx; }\r
+ if (tilesy<MIN_TILE_Y) { minpady=MIN_TILE_Y-tilesy; num_pady=minpady; }\r
+ sprintf(nstr1, "%d", minpadx);\r
+ sprintf(nstr2, "%d", minpady);\r
+ totalx=tilesx+minpadx;\r
+ totaly=tilesy+minpady;\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>ilxofs+109 && mx<ilxofs+30+109 && my>ilyofs+30 && my<ilyofs+10+30 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(ilxofs+109, ilyofs+30, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+\r
+ if (strlen(txt_imagename))\r
+ {\r
+ done=1;\r
+\r
+ ly=BitToNum(chk_layer) -1;\r
+\r
+ startx=0;\r
+ starty=0;\r
+ if (chk_centerinpad)\r
+ {\r
+ startx=(totalx-tilesx)/2;\r
+ starty=(totaly-tilesy)/2;\r
+ }\r
+\r
+ LoadPCXHeaderNP(txt_imagename);\r
+\r
+ wide=width;\r
+ deep=depth;\r
+ if (chk_grabexcess)\r
+ {\r
+ // round up to the nearest multiple of 16 if grabbing excess\r
+ wide=(width+15)&~15;\r
+ deep=(depth+15)&~15;\r
+ }\r
+ // allocate transit image bay, which may have padding ^\r
+ t=(char *) valloc(wide * deep,"img2layer",0);\r
+\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=wide*i;\r
+ ReadPCXLine(t);\r
+ }\r
+ fclose(pcxf);\r
+\r
+ deep=tilesy;\r
+ wide=tilesx;\r
+ ontiles=(wide*deep)+1; // +1 for our empty tile\r
+\r
+ ovsp=(char *) valloc(ontiles*256,"img2layer2",0);\r
+\r
+ layer[ly].pmultx=1; layer[ly].pmulty=1;\r
+ layer[ly].pdivx=1; layer[ly].pdivy=1;\r
+ // totalx & totaly are the sum of tilesx/tilesy & num_padx/num_pady\r
+ layer[ly].sizex=totalx; layer[ly].sizey=totaly;\r
+ layer[ly].trans=0; layer[ly].hline=0;\r
+\r
+ lsz = totalx * totaly;\r
+\r
+ if (layers[ly]) vfree(layers[ly]);\r
+ layers[ly]=(unsigned short *) valloc((lsz*2)+4,"layer data",ly);\r
+\r
+ tilesripped=0;\r
+ memset(ovsp,0,256);\r
+ tilesripped++;\r
+\r
+ for (i=0; i<deep; i++)\r
+ {\r
+ for (j=0; j<wide; j++)\r
+ {\r
+ GrabTileAt((j*16), (i*16), tilesripped, 0);\r
+ plot=tilesripped;\r
+\r
+ // eliminate duplicates?\r
+ if (chk_nodup)\r
+ {\r
+ matched=0;\r
+ for (k=0; k<tilesripped; k++)\r
+ {\r
+ if (TileMatch(tilesripped, k))\r
+ {\r
+ matched=1;\r
+ plot=k;\r
+ break;\r
+ }\r
+ }\r
+ //begin zero\r
+ for(m=0; m<numtiles; m++)\r
+ {\r
+ if(TileCmp(vsp+m*256,ovsp+tilesripped*256))\r
+ {\r
+ matched=1;\r
+ plot=m-numtiles;\r
+// plot=0;\r
+ break;\r
+ }\r
+ }\r
+ //end zero!\r
+ if (!matched) tilesripped++;\r
+ }\r
+ // grabbing all; keep it regardless\r
+ else tilesripped++;\r
+\r
+ layers[ly][((i+starty)*totalx)+j+startx]=plot;\r
+ }\r
+ }\r
+\r
+ // adjust indices past current tile amount\r
+ for (i=0; i<(totalx*totaly); i++)\r
+ layers[ly][i]+=numtiles;\r
+\r
+ if (!ly)\r
+ {\r
+ if (obstruct) vfree(obstruct);\r
+ obstruct=(char *) valloc(lsz+4,"obstruct",0);\r
+ if (zone) vfree(zone);\r
+ zone=(char *) valloc(lsz+4,"zone", 0);\r
+ }\r
+\r
+ // reallocate tilebay and patch in ovsp\r
+ str=(char *)valloc((numtiles+tilesripped)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp, (tilesripped*256));\r
+ numtiles+=tilesripped;\r
+\r
+ // did we make a new layer?\r
+ if (ly+1>numlayers)\r
+ {\r
+ numlayers++;\r
+ sprintf(rstring, "%s%i", rstring, ly+1); // update render-order\r
+ }\r
+\r
+ vfree(t);\r
+ vfree(ovsp);\r
+ }\r
+ // ...\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+29 && mx<ilxofs+8+29 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ chk_layer ^= 1;\r
+ chk_layer &= 1;\r
+ //chk_1 ^= 1;\r
+ //chk_2=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+39 && mx<ilxofs+8+39 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 2)\r
+ {\r
+ chk_layer ^= 2;\r
+ chk_layer &= 2;\r
+ //chk_2 ^= 1;\r
+ //chk_1=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+49 && mx<ilxofs+8+49 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 3)\r
+ {\r
+ chk_layer ^= 4;\r
+ chk_layer &= 4;\r
+ //chk_3 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_4=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+59 && mx<ilxofs+8+59 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 4)\r
+ {\r
+ chk_layer ^= 8;\r
+ chk_layer &= 8;\r
+ //chk_4 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_3=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+69 && mx<ilxofs+8+69 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 5)\r
+ {\r
+ chk_layer ^= 16;\r
+ chk_layer &= 16;\r
+ //chk_5 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_3=0,chk_4=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+79 && mx<ilxofs+8+79 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 6)\r
+ {\r
+ chk_layer ^= 32;\r
+ chk_layer &= 32;\r
+ //chk_6 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_3=0,chk_4=0,chk_5=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ // if no checkboxes are marked, mark the first.\r
+ //if (!(chk_1+chk_2+chk_3+chk_4+chk_5+chk_6)) chk_1=1;\r
+ if (!chk_layer) chk_layer=1;\r
+\r
+// if (mb==1 && mx>ilxofs+29 && mx<ilxofs+75+29 && my>ilyofs+12 && my<ilyofs+9+12 && !moving)\r
+// {\r
+// ctf=1; str=txt_imagename; cb=1;\r
+// cursorblink=systemtime+40; continue;\r
+// }\r
+\r
+ if (mb==1)\r
+ {\r
+ if (mx>ilxofs+74 && mx<ilxofs+12+74 && my>ilyofs+58 && my<ilyofs+9+58 && !moving)\r
+ {\r
+ if (ctf==2)\r
+ {\r
+ if (atoi(str)<minpady)\r
+ sprintf(str, "%d", minpady);\r
+ }\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mx>ilxofs+74 && mx<ilxofs+12+74 && my>ilyofs+69 && my<ilyofs+9+69 && !moving)\r
+ {\r
+ if (ctf==1)\r
+ {\r
+ if (atoi(str)<minpadx)\r
+ sprintf(str, "%d", minpadx);\r
+ }\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ switch (ctf)\r
+ {\r
+ case 1: if (atoi(str) < minpadx) sprintf(str, "%d", minpadx); break;\r
+ case 2: if (atoi(str) < minpady) sprintf(str, "%d", minpady); break;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+101 && my<ilyofs+7+101 && !moving)\r
+ {\r
+ chk_grabexcess ^= 1;\r
+ // <barf>\r
+ if (excessx+excessy)\r
+ {\r
+ if (chk_grabexcess)\r
+ {\r
+ if (excessx) tilesx++;\r
+ if (excessy) tilesy++;\r
+ }\r
+ else\r
+ {\r
+ if (excessx) tilesx--;\r
+ if (excessy) tilesy--;\r
+ }\r
+ if (tilesx<MIN_TILE_X) { minpadx=MIN_TILE_X-tilesx; num_padx=minpadx; }\r
+ if (tilesy<MIN_TILE_Y) { minpady=MIN_TILE_Y-tilesy; num_pady=minpady; }\r
+ sprintf(nstr1, "%d", minpadx);\r
+ sprintf(nstr2, "%d", minpady);\r
+ totalx=tilesx+minpadx;\r
+ totaly=tilesy+minpady;\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+110 && my<ilyofs+7+110 && !moving)\r
+ {\r
+ chk_centerinpad ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+119 && my<ilyofs+7+119 && !moving)\r
+ {\r
+ chk_nodup ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(ilxofs+ilxsize-9) && (mx<ilxofs+ilxsize-2)\r
+ && my>(ilyofs+1) && (my<ilyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs && mx<ilxofs+ilxsize && my>ilyofs && my<(ilyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-ilxofs;\r
+ myo=my-ilyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+\r
+ // keep minimally required padding\r
+ if (ctf==1)\r
+ {\r
+ if (atoi(str)<minpadx)\r
+ sprintf(str, "%d", minpadx);\r
+ }\r
+ if (ctf==2)\r
+ {\r
+ if (atoi(str)<minpady)\r
+ sprintf(str, "%d", minpady);\r
+ }\r
+\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=0; str=0; break;\r
+ //case 3: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=2; str=nstr2; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ //case 3: ctf=2; str=nstr1; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ tt=strlen(str);\r
+ str[tt]=c;\r
+ str[tt+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+\r
+ //num_padx=atoi(nstr1);\r
+ //num_pady=atoi(nstr2);\r
+}\r
+\r
+int dtxsize=102, dtysize=52;\r
+int dtxofs=100, dtyofs=70;\r
+// aen\r
+void Destroyer()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ int zn_check=0,zd_check=0,ob_check=0,ent_check=0;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ dtxofs = (mx-mxo);\r
+ dtyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (dtxofs<16) dtxofs = 16;\r
+ if (dtyofs<16) dtyofs = 16;\r
+ if (dtxofs+dtxsize>335) dtxofs = 336-dtxsize;\r
+ if (dtyofs+dtysize>sy+16) dtyofs = (sy+16)-dtysize;\r
+ }\r
+\r
+ Window(dtxofs, dtyofs, dtxofs+dtxsize, dtyofs+dtysize, "Destroyer");\r
+ CheckBox(dtxofs+4, dtyofs+11, zn_check);\r
+ CheckBox(dtxofs+4, dtyofs+31, ob_check);\r
+ CheckBox(dtxofs+4, dtyofs+21, zd_check);\r
+ GotoXY(dtxofs+15, dtyofs+12); printstring("Zones");\r
+ GotoXY(dtxofs+15, dtyofs+32); printstring("Obstructions");\r
+ GotoXY(dtxofs+15, dtyofs+22); printstring("Zone Data");\r
+ Button(dtxofs+68, dtyofs+11, "ok");\r
+ Button(dtxofs+68, dtyofs+24, "cancel");\r
+ CheckBox(dtxofs+4, dtyofs+41, ent_check);\r
+ GotoXY(dtxofs+15, dtyofs+42); printstring("Entities");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+11 && my<dtyofs+7+11 && !moving)\r
+ {\r
+ zn_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+21 && my<dtyofs+7+21 && !moving)\r
+ {\r
+ zd_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+31 && my<dtyofs+7+31 && !moving)\r
+ {\r
+ ob_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+41 && my<dtyofs+7+41 && !moving)\r
+ {\r
+ ent_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+68 && mx<dtxofs+30+68 && my>dtyofs+11 && my<dtyofs+10+11 && !moving)\r
+ {\r
+ // insert code for button "ok" here\r
+ ButtonPressed(dtxofs+68, dtyofs+11, "ok");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+\r
+ if (Confirm("Are you sure?"))\r
+ {\r
+ done=1;\r
+ if (ob_check) memset(obstruct, 0, (layer[0].sizex*layer[0].sizey)+4);\r
+ if (zn_check) memset(zone, 0, (layer[0].sizex*layer[0].sizey)+4);\r
+ if (zd_check)\r
+ {\r
+ numzones=0;\r
+ memset(&zones, 0, sizeof zones);\r
+ }\r
+ if (ent_check)\r
+ {\r
+ entities=0;\r
+ nmchr=0;\r
+ nms=0;\r
+ memset(&ms, 0, sizeof ms);\r
+ memset(&entity, 0, sizeof entities);\r
+ memset(&chrlist, 0, sizeof chrlist);\r
+ }\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+68 && mx<dtxofs+30+68 && my>dtyofs+24 && my<dtyofs+10+24 && !moving)\r
+ {\r
+ done=1;\r
+ // insert code for button "cancel" here\r
+ ButtonPressed(dtxofs+68, dtyofs+24, "cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(dtxofs+dtxsize-9) && (mx<dtxofs+dtxsize-2)\r
+ && my>(dtyofs+1) && (my<dtyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs && mx<dtxofs+dtxsize && my>dtyofs && my<(dtyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-dtxofs;\r
+ myo=my-dtyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+void LayersSubMenu(int dx, int dy)\r
+{ char done=0;\r
+ //int mxo, myo, cursorblink;\r
+\r
+ do\r
+ {\r
+ if (dx<16) dx=16;\r
+ if (dy<16) dy=16;\r
+ if (dx+80>335) dx=336-80;\r
+ if (dy+89>sy+16) dy=(sy+16)-89;\r
+\r
+ RenderMap();\r
+ RenderGUI();\r
+ stdwindow(dx, dy, dx+80, dy+29);\r
+\r
+ if (mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
+ if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
+ if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
+ if (my>dy+20 && my<dy+26) FilledBox(dx+2, dy+20, 76, 7, darkw);\r
+ }\r
+\r
+ GotoXY(dx+3, dy+3); printstring("Add Layer");\r
+ GotoXY(dx+3, dy+9); printstring("Edit Layer");\r
+ GotoXY(dx+3, dy+15); printstring("Import Image");\r
+ GotoXY(dx+3, dy+21); printstring("Destroyer");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ if (mb==1 && mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) { AddLayer(); NoticeDialog(); done=1; WaitRelease(); break; }\r
+ if (my>dy+8 && my<dy+15) { EditLayerProperties(); done=1; WaitRelease(); break; }\r
+ if (my>dy+14 && my<dy+21) { ImageToLayer(); done=1; WaitRelease(); break; }\r
+ if (my>dy+20 && my<dy+26) { Destroyer(); done=1; WaitRelease(); break; }\r
+ }\r
+\r
+ if (mb==1)\r
+ {\r
+ WaitRelease();\r
+ done=1;\r
+ }\r
+ if (key[SCAN_ESC]==1) done=1;\r
+ } while (!done);\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+void ExecuteSubMenu(int dx, int dy)\r
+{ char done=0;\r
+ //int mxo, myo, cursorblink;\r
+\r
+ do\r
+ {\r
+ if (dx<16) dx=16;\r
+ if (dy<16) dy=16;\r
+ if (dx+80>335) dx=336-80;\r
+ if (dy+89>sy+16) dy=(sy+16)-89;\r
+\r
+ RenderMap();\r
+ RenderGUI();\r
+ stdwindow(dx, dy, dx+80, dy+23);\r
+\r
+ if (mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
+ if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
+ if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
+ }\r
+\r
+ GotoXY(dx+3, dy+3); printstring("MAP");\r
+ GotoXY(dx+3, dy+9); printstring("VERGE");\r
+ GotoXY(dx+3, dy+15); printstring("DOS");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ if (mb==1 && mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) { ShellMAP(); done=1; WaitRelease(); break; }\r
+ if (my>dy+8 && my<dy+15) { ShellVERGE(); done=1; WaitRelease(); break; }\r
+ if (my>dy+14 && my<dy+21) { ShellToDOS(); done=1; WaitRelease(); break; }\r
+ }\r
+\r
+ if (mb==1)\r
+ {\r
+ WaitRelease();\r
+ done=1;\r
+ }\r
+ if (key[SCAN_ESC]==1) done=1;\r
+ } while (!done);\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+void AddLayer()\r
+{\r
+ layers[numlayers]=(word *) valloc(layer[0].sizex * layer[0].sizey * 2,"layer data",numlayers);\r
+ //memset(layers[numlayers], 0, layer[0].sizex * layer[0].sizey * 2);\r
+ layer[numlayers].pmultx=1; layer[numlayers].pmulty=1;\r
+ layer[numlayers].pdivx=1; layer[numlayers].pdivy=1;\r
+ layer[numlayers].sizex=layer[0].sizex;\r
+ layer[numlayers].sizey=layer[0].sizey;\r
+ layer[numlayers].trans=0;\r
+ layer[numlayers].hline=0;\r
+ numlayers++;\r
+}\r
+\r
+int lpxsize=190, lpysize=68;\r
+int lpxofs=40, lpyofs=60;\r
+\r
+void EditLayerProperties()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, i;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80], nstr5[80],nstr6[80];\r
+\r
+ i=el;\r
+ if (i>5) i=0;\r
+ if (i>=numlayers) i=0;\r
+\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ sprintf(nstr5, "%d", layer[i].trans);\r
+ sprintf(nstr6, "%d", layer[i].hline);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lpxofs = (mx-mxo);\r
+ lpyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lpxofs<16) lpxofs = 16;\r
+ if (lpyofs<16) lpyofs = 16;\r
+ if (lpxofs+lpxsize>335) lpxofs = 336-lpxsize;\r
+ if (lpyofs+lpysize>sy+16) lpyofs = (sy+16)-lpysize;\r
+ }\r
+\r
+ Window(lpxofs, lpyofs, lpxofs+lpxsize, lpyofs+lpysize, "Edit Layer Properties");\r
+ GotoXY(lpxofs+3, lpyofs+10); printstring("Parallax controls:");\r
+ GotoXY(lpxofs+4, lpyofs+21); printstring("MultX:");\r
+ GotoXY(lpxofs+12, lpyofs+31); printstring("DivX:");\r
+ GotoXY(lpxofs+93, lpyofs+21); printstring("MultY:");\r
+ GotoXY(lpxofs+101, lpyofs+31); printstring("DivY:");\r
+ TextField(lpxofs+29, lpyofs+19, 60, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(lpxofs+29, lpyofs+29, 60, nstr2, ctf == 2 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+19, 60, nstr3, ctf == 3 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+29, 60, nstr4, ctf == 4 ? cb : 0);\r
+ HLine(lpxofs+1, lpyofs+43, 188, white);\r
+ GotoXY(lpxofs+9, lpyofs+48); printstring("Transparent");\r
+ GotoXY(lpxofs+36, lpyofs+58); printstring("HLine");\r
+ TextField(lpxofs+56, lpyofs+46, 60, nstr5, ctf == 5 ? cb : 0);\r
+ TextField(lpxofs+56, lpyofs+56, 60, nstr6, ctf == 6 ? cb : 0);\r
+ Button(lpxofs+156, lpyofs+55, "OK");\r
+ GotoXY(lpxofs+144, lpyofs+47); printstring("Layer");\r
+ sprintf(strbuf,"%d",i); GotoXY(lpxofs+168, lpyofs+47); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+60+56 && my>lpyofs+46 && my<lpyofs+9+46 && !moving)\r
+ {\r
+ ctf=5; str=nstr5; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+60+56 && my>lpyofs+56 && my<lpyofs+9+56 && !moving)\r
+ {\r
+ ctf=6; str=nstr6; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lpxofs+156 && mx<lpxofs+30+156 && my>lpyofs+55 && my<lpyofs+10+55 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(lpxofs+156, lpyofs+55, "OK");\r
+ DrawMouse(); done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lpxofs+lpxsize-9) && (mx<lpxofs+lpxsize-2)\r
+ && my>(lpyofs+1) && (my<lpyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs && mx<lpxofs+lpxsize && my>lpyofs && my<(lpyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lpxofs;\r
+ myo=my-lpyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ layer[i].trans=atoi(nstr5);\r
+ layer[i].hline=atoi(nstr6);\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ if (i) i--; else i=numlayers-1;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ sprintf(nstr5, "%d", layer[i].trans);\r
+ sprintf(nstr6, "%d", layer[i].hline);\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ layer[i].trans=atoi(nstr5);\r
+ layer[i].hline=atoi(nstr6);\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ if (i<numlayers-1) i++; else i=0;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ sprintf(nstr5, "%d", layer[i].trans);\r
+ sprintf(nstr6, "%d", layer[i].hline);\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=5; str=nstr5; break;\r
+ case 5: ctf=6; str=nstr6; break;\r
+ case 6: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=6; str=nstr6; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ case 5: ctf=4; str=nstr4; break;\r
+ case 6: ctf=5; str=nstr5; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ layer[i].trans=atoi(nstr5);\r
+ layer[i].hline=atoi(nstr6);\r
+}\r
+/*\r
+int lpxsize=190, lpysize=68;\r
+int lpxofs=40, lpyofs=60;\r
+\r
+void EditLayerProperties()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, i;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ i=el;\r
+ if (i>5) i=0;\r
+ if (i>=numlayers) i=0;\r
+\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lpxofs = (mx-mxo);\r
+ lpyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lpxofs<16) lpxofs = 16;\r
+ if (lpyofs<16) lpyofs = 16;\r
+ if (lpxofs+lpxsize>335) lpxofs = 336-lpxsize;\r
+ if (lpyofs+lpysize>sy+16) lpyofs = (sy+16)-lpysize;\r
+ }\r
+\r
+ Window(lpxofs, lpyofs, lpxofs+lpxsize, lpyofs+lpysize, "Edit Layer Properties");\r
+ GotoXY(lpxofs+3, lpyofs+10); printstring("Parallax controls:");\r
+ GotoXY(lpxofs+4, lpyofs+21); printstring("MultX:");\r
+ GotoXY(lpxofs+12, lpyofs+31); printstring("DivX:");\r
+ GotoXY(lpxofs+93, lpyofs+21); printstring("MultY:");\r
+ GotoXY(lpxofs+101, lpyofs+31); printstring("DivY:");\r
+ TextField(lpxofs+29, lpyofs+19, 60, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(lpxofs+29, lpyofs+29, 60, nstr2, ctf == 2 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+19, 60, nstr3, ctf == 3 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+29, 60, nstr4, ctf == 4 ? cb : 0);\r
+ HLine(lpxofs+1, lpyofs+43, 188, white);\r
+ GotoXY(lpxofs+6, lpyofs+49); printstring("Transparent");\r
+ GotoXY(lpxofs+32, lpyofs+56); printstring("HLine");\r
+ CheckBox(lpxofs+56, lpyofs+48, layer[i].trans);\r
+ CheckBox(lpxofs+56, lpyofs+56, layer[i].hline);\r
+ Button(lpxofs+156, lpyofs+55, "OK");\r
+ GotoXY(lpxofs+144, lpyofs+47); printstring("Layer");\r
+ sprintf(strbuf,"%d",i); GotoXY(lpxofs+168, lpyofs+47); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+8+56 && my>lpyofs+48 && my<lpyofs+7+48 && !moving)\r
+ {\r
+ layer[i].trans ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+8+56 && my>lpyofs+56 && my<lpyofs+7+56 && !moving)\r
+ {\r
+ layer[i].hline ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lpxofs+156 && mx<lpxofs+30+156 && my>lpyofs+55 && my<lpyofs+10+55 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(lpxofs+156, lpyofs+55, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lpxofs+lpxsize-9) && (mx<lpxofs+lpxsize-2)\r
+ && my>(lpyofs+1) && (my<lpyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs && mx<lpxofs+lpxsize && my>lpyofs && my<(lpyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lpxofs;\r
+ myo=my-lpyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ if (i) i--; else i=numlayers-1;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ if (i<numlayers-1) i++; else i=0;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=4; str=nstr4; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+}\r
+ */\r
+void NewMAP()\r
+{ int cursorblink;\r
+\r
+ if (Confirm("Lose existing MAP?"))\r
+ {\r
+ for (cursorblink=0; cursorblink<numlayers; cursorblink++)\r
+ vfree(layers[cursorblink]);\r
+ memcpy(mapname,"UNTITLED.MAP",13);\r
+ memcpy(vspname,"UNTITLED.VSP",13);\r
+ memcpy(musname,"\0",1);\r
+ memcpy(rstring,"1E",2);\r
+ xstart=1; ystart=1;\r
+ numlayers=1;\r
+ wrap=0;\r
+\r
+ // aen: default newmap dimensions set to 100x100\r
+ layer[0].pmultx=1; layer[0].pmulty=1;\r
+ layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[0].sizex=100; layer[0].sizey=100;\r
+ layer[0].trans=0; layer[0].hline=0;\r
+\r
+ layers[0] = (unsigned short *)valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
+ vfree(obstruct);\r
+ obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct",0);\r
+ vfree(zone);\r
+ zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone",0);\r
+ entities=0; // Mordred\r
+\r
+ // aen: default number of tiles set to 100\r
+ numtiles=100;\r
+ vfree(vsp);\r
+ vsp=(char *) valloc(256 * numtiles,"vsp data",0);\r
+\r
+ // zero: was re-allocating same memory so gfx still visible in some places\r
+ memset(vsp,0,256*numtiles);\r
+ // zero: gotta clear that anim stuff man!\r
+ memset(vspanim,0,800);\r
+ InitTileIDX();\r
+\r
+\r
+\r
+ layertoggle[0]=1; layertoggle[1]=0; layertoggle[2]=0; layertoggle[3]=0;\r
+ layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
+ xwin=0; ywin=0;\r
+ }\r
+}\r
+\r
+int amxsize=150, amysize=88;\r
+int amxofs=60, amyofs=60;\r
+\r
+void About()\r
+{\r
+ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ amxofs = (mx-mxo);\r
+ amyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (amxofs<16) amxofs = 16;\r
+ if (amyofs<16) amyofs = 16;\r
+ if (amxofs+amxsize>335) amxofs = 336-amxsize;\r
+ if (amyofs+amysize>sy+16) amyofs = (sy+16)-amysize;\r
+ }\r
+\r
+ sprintf(strbuf, "About MapEd %s", ME2_VERSION);\r
+ Window(amxofs, amyofs, amxofs+amxsize, amyofs+amysize, strbuf);\r
+ sprintf(strbuf, "MapEd v.%s", ME2_VERSION);\r
+ GotoXY(amxofs+52, amyofs+16); printstring(strbuf);\r
+ GotoXY(amxofs+31, amyofs+22); printstring("Copyright (C) 1998 vecna");\r
+ GotoXY(amxofs+40, amyofs+28); printstring("All Rights Reserved");\r
+ GotoXY(amxofs+(75-pixels("Additional code by Ric")/2), amyofs+41);\r
+ printstring("Additional code by Ric");\r
+ GotoXY(amxofs+(75-pixels("Additional code by aen")/2), amyofs+47);\r
+ printstring("Additional code by aen");\r
+ GotoXY(amxofs+(75-pixels("Additional code by zeromus")/2), amyofs+53);\r
+ printstring("Additional code by zeromus");\r
+ Button(amxofs+60, amyofs+68, "OK");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>amxofs+66 && mx<amxofs+30+66 && my>amyofs+68 && my<amyofs+10+68 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(amxofs+60, amyofs+68, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(amxofs+amxsize-9) && (mx<amxofs+amxsize-2) &&\r
+ my>(amyofs+1) && (my<amyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>amxofs && mx<amxofs+amxsize && my>amyofs && my<(amyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-amxofs;\r
+ myo=my-amyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+}\r
+\r
+int cnxsize=125, cnysize=50;\r
+int cnxofs=114, cnyofs=70;\r
+\r
+int Confirm(char *message)\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ WaitRelease();\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ cnxofs = (mx-mxo);\r
+ cnyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (cnxofs<16) cnxofs = 16;\r
+ if (cnyofs<16) cnyofs = 16;\r
+ if (cnxofs+cnxsize>335) cnxofs = 336-cnxsize;\r
+ if (cnyofs+cnysize>sy+16) cnyofs = (sy+16)-cnysize;\r
+ }\r
+\r
+ Window(cnxofs, cnyofs, cnxofs+cnxsize, cnyofs+cnysize, "Confirm? (Y/N)");\r
+ GotoXY(cnxofs+125/2-(pixels(message)/2), cnyofs+15); printstring(message);\r
+\r
+ Button(cnxofs+24, cnyofs+30, "Yes");\r
+ Button(cnxofs+69, cnyofs+30, "No");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>cnxofs+24 && mx<cnxofs+30+24 && my>cnyofs+30 && my<cnyofs+10+30 && !moving)\r
+ {\r
+ // insert code for button "Yes" here\r
+ ButtonPressed(cnxofs+24, cnyofs+30, "Yes");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ return 1;\r
+ }\r
+\r
+ if (mb==1 && mx>cnxofs+69 && mx<cnxofs+30+69 && my>cnyofs+30 && my<cnyofs+10+30 && !moving)\r
+ {\r
+ ButtonPressed(cnxofs+69, cnyofs+30, "No");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ return 0;\r
+ }\r
+\r
+ if (mb==1 && mx>(cnxofs+cnxsize-9) && (mx<cnxofs+cnxsize-2)\r
+ && my>(cnyofs+1) && (my<cnyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>cnxofs && mx<cnxofs+cnxsize && my>cnyofs && my<(cnyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-cnxofs;\r
+ myo=my-cnyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (last_pressed==SCAN_N)\r
+ {\r
+ key[SCAN_N]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (last_pressed==SCAN_Y)\r
+ {\r
+ key[SCAN_Y]=0;\r
+ return 1;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+ return 0;\r
+}\r
+\r
+int lmxsize=145, lmysize=36;\r
+int lmxofs=80, lmyofs=50;\r
+\r
+void LoadMAPDialog()\r
+{ char lmapname[80];\r
+ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ memset(lmapname, 0, 80);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lmxofs = (mx-mxo);\r
+ lmyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lmxofs<16) lmxofs = 16;\r
+ if (lmyofs<16) lmyofs = 16;\r
+ if (lmxofs+lmxsize>335) lmxofs = 336-lmxsize;\r
+ if (lmyofs+lmysize>sy+16) lmyofs = (sy+16)-lmysize;\r
+ }\r
+\r
+ Window(lmxofs, lmyofs, lmxofs+lmxsize, lmyofs+lmysize, "Load MAP");\r
+ GotoXY(lmxofs+2, lmyofs+13); printstring("Load MAP:");\r
+ TextField(lmxofs+38, lmyofs+11, 70, lmapname, ctf == 1 ? cb : 0);\r
+ Button(lmxofs+79, lmyofs+22, "OK");\r
+ Button(lmxofs+111, lmyofs+22, "Cancel");\r
+ Button(lmxofs+111, lmyofs+11, "Browse");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lmxofs+38 && mx<lmxofs+70+38 && my>lmyofs+11 && my<lmyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=lmapname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lmxofs+79 && mx<lmxofs+30+79 && my>lmyofs+22 && my<lmyofs+10+22 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ if (modified)\r
+ if (!Confirm("Lose unsaved changes?")) { done=1; continue; }\r
+ for (cursorblink=0; cursorblink<numlayers; cursorblink++)\r
+ vfree(layers[cursorblink]);\r
+ vfree(obstruct);\r
+ vfree(zone);\r
+ vfree(vsp);\r
+\r
+ memcpy(mapname, lmapname, strlen(lmapname)+1);\r
+ LoadMAP(mapname);\r
+ InitTileIDX();\r
+ xwin=0; ywin=0; done=1;\r
+\r
+ ButtonPressed(lmxofs+79, lmyofs+22, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lmxofs+111 && mx<lmxofs+30+111 && my>lmyofs+22 && my<lmyofs+10+22 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ ButtonPressed(lmxofs+111, lmyofs+22, "Cancel");\r
+ DrawMouse(); done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lmxofs+111 && mx<lmxofs+30+111 && my>lmyofs+11 && my<lmyofs+10+11 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(lmxofs+111, lmyofs+11, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ Browse(1,"*.map","","","",lmapname);\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lmxofs+lmxsize-9) && (mx<lmxofs+lmxsize-2)\r
+ && my>(lmyofs+1) && (my<lmyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lmxofs && mx<lmxofs+lmxsize && my>lmyofs && my<(lmyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lmxofs;\r
+ myo=my-lmyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=lmapname; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+}\r
+\r
+int lvxsize=145, lvysize=35;\r
+int lvxofs=80, lvyofs=50;\r
+\r
+void LoadVSPDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char lvspname[80];\r
+\r
+ last_pressed=0;\r
+ memset(lvspname,0,80);\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lvxofs = (mx-mxo);\r
+ lvyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lvxofs<16) lvxofs = 16;\r
+ if (lvyofs<16) lvyofs = 16;\r
+ if (lvxofs+lvxsize>335) lvxofs = 336-lvxsize;\r
+ if (lvyofs+lvysize>sy+16) lvyofs = (sy+16)-lvysize;\r
+ }\r
+\r
+ Window(lvxofs, lvyofs, lvxofs+lvxsize, lvyofs+lvysize, "Load VSP");\r
+ GotoXY(lvxofs+2, lvyofs+13); printstring("Load VSP:");\r
+ TextField(lvxofs+38, lvyofs+11, 70, lvspname, ctf == 1 ? cb : 0);\r
+ Button(lvxofs+79, lvyofs+21, "OK");\r
+ Button(lvxofs+111, lvyofs+21, "Cancel");\r
+ Button(lvxofs+111, lvyofs+10, "Browse");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lvxofs+38 && mx<lvxofs+70+38 && my>lvyofs+11 && my<lvyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=lvspname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lvxofs+79 && mx<lvxofs+30+79 && my>lvyofs+21 && my<lvyofs+10+21 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ vfree(vsp);\r
+ memcpy(vspname, lvspname, strlen(lvspname)+1);\r
+ LoadVSP(vspname);\r
+ InitTileIDX();\r
+ ButtonPressed(lvxofs+79, lvyofs+21, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lvxofs+111 && mx<lvxofs+30+111 && my>lvyofs+21 && my<lvyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ ButtonPressed(lvxofs+111, lvyofs+21, "Cancel");\r
+ DrawMouse(); done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lvxofs+111 && mx<lvxofs+30+111 && my>lvyofs+10 && my<lvyofs+10+10 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(lvxofs+111, lvyofs+10, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.vsp","","","",lvspname);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lvxofs+lvxsize-9) && (mx<lvxofs+lvxsize-2)\r
+ && my>(lvyofs+1) && (my<lvyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lvxofs && mx<lvxofs+lvxsize && my>lvyofs && my<(lvyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lvxofs;\r
+ myo=my-lvyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=lvspname; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=lvspname; break;\r
+ case 1: ctf=0; str=lvspname; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+int mpxsize=175, mpysize=37;\r
+int mpxofs=60, mpyofs=60;\r
+\r
+void MPDialog()\r
+{ char done=0, moving=0, playmod[80];\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ memset(playmod, 0, 80);\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ mpxofs = (mx-mxo);\r
+ mpyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (mpxofs<16) mpxofs = 16;\r
+ if (mpyofs<16) mpyofs = 16;\r
+ if (mpxofs+mpxsize>335) mpxofs = 336-mpxsize;\r
+ if (mpyofs+mpysize>sy+16) mpyofs = (sy+16)-mpysize;\r
+ }\r
+\r
+ Window(mpxofs, mpyofs, mpxofs+mpxsize, mpyofs+mpysize, "MOD Player Controls");\r
+ GotoXY(mpxofs+2, mpyofs+15); printstring("MOD Playing:");\r
+ TextField(mpxofs+49, mpyofs+13, 90, playmod, ctf == 1 ? cb : 0);\r
+ Button(mpxofs+110, mpyofs+24, "Play");\r
+ Button(mpxofs+142, mpyofs+24, "Stop");\r
+ Button(mpxofs+78, mpyofs+24, "OK");\r
+ Button(mpxofs+142, mpyofs+12, "Browse");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>mpxofs+49 && mx<mpxofs+90+49 && my>mpyofs+13 && my<mpyofs+9+13 && !moving)\r
+ {\r
+ ctf=1; str=playmod; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>mpxofs+110 && mx<mpxofs+30+110 && my>mpyofs+24 && my<mpyofs+10+24 && !moving)\r
+ {\r
+ // insert code for button "Play" here\r
+ ButtonPressed(mpxofs+110, mpyofs+24, "Play");\r
+ PlayMusic(playmod);\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>mpxofs+142 && mx<mpxofs+30+142 && my>mpyofs+24 && my<mpyofs+10+24 && !moving)\r
+ {\r
+ // insert code for button "Stop" here\r
+ memset(playingmod, 0, 80);\r
+ memset(playmod, 0, 80);\r
+ StopMusic();\r
+ ButtonPressed(mpxofs+142, mpyofs+24, "Stop");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>mpxofs+78 && mx<mpxofs+30+78 && my>mpyofs+24 && my<mpyofs+10+24 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(mpxofs+78, mpyofs+24, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>mpxofs+142 && mx<mpxofs+30+142 && my>mpyofs+12 && my<mpyofs+10+12 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(mpxofs+142, mpyofs+12, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(4,"*.s3m","*.mod","*.xm",".it",playmod);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(mpxofs+mpxsize-9) && (mx<mpxofs+mpxsize-2)\r
+ && my>(mpyofs+1) && (my<mpyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>mpxofs && mx<mpxofs+mpxsize && my>mpyofs && my<(mpyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-mpxofs;\r
+ myo=my-mpyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=playmod; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=playmod; break;\r
+ case 1: ctf=0; str=playmod; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int zexsize=135, zeysize=86;\r
+int zexofs=80, zeyofs=40;\r
+\r
+void ZoneEdDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, i=0;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ i=curzone;\r
+ sprintf(nstr1, "%d", zones[i].script);\r
+ sprintf(nstr2, "%d", zones[i].percent);\r
+ sprintf(nstr3, "%d", zones[i].delay);\r
+ sprintf(nstr4, "%d", zones[i].entityscript);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ zexofs = (mx-mxo);\r
+ zeyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (zexofs<16) zexofs = 16;\r
+ if (zeyofs<16) zeyofs = 16;\r
+ if (zexofs+zexsize>335) zexofs = 336-zexsize;\r
+ if (zeyofs+zeysize>sy+16) zeyofs = (sy+16)-zeysize;\r
+ }\r
+\r
+ Window(zexofs, zeyofs, zexofs+zexsize, zeyofs+zeysize, "Zone Editor");\r
+ GotoXY(zexofs+8, zeyofs+12); printstring("Name:");\r
+ TextField(zexofs+30, zeyofs+10, 100, zones[i].name, ctf == 1 ? cb : 0);\r
+ GotoXY(zexofs+5, zeyofs+22); printstring("Script:");\r
+ TextField(zexofs+30, zeyofs+20, 100, nstr1, ctf == 2 ? cb : 0);\r
+ GotoXY(zexofs+2, zeyofs+32); printstring("Chance:");\r
+ TextField(zexofs+30, zeyofs+30, 100, nstr2, ctf == 3 ? cb : 0);\r
+ GotoXY(zexofs+7, zeyofs+42); printstring("Delay:");\r
+ TextField(zexofs+30, zeyofs+40, 100, nstr3, ctf == 4 ? cb : 0);\r
+ GotoXY(zexofs+4, zeyofs+52); printstring("Entity:");\r
+ TextField(zexofs+30, zeyofs+50, 100, nstr4, ctf == 5 ? cb : 0);\r
+ CheckBox(zexofs+20, zeyofs+61, zones[i].aaa);\r
+ GotoXY(zexofs+31, zeyofs+62); printstring("Allow Adjacent Activation");\r
+ Button(zexofs+99, zeyofs+71, "OK");\r
+ GotoXY(zexofs+12, zeyofs+73); printstring("Zone");\r
+ GotoXY(zexofs+30, zeyofs+73);\r
+ sprintf(strbuf,"%d",i); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+10 && my<zeyofs+9+10 && !moving)\r
+ {\r
+ ctf=1; str=zones[i].name; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+20 && my<zeyofs+9+20 && !moving)\r
+ {\r
+ ctf=2; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+30 && my<zeyofs+9+30 && !moving)\r
+ {\r
+ ctf=3; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+40 && my<zeyofs+9+40 && !moving)\r
+ {\r
+ ctf=4; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+50 && my<zeyofs+9+50 && !moving)\r
+ {\r
+ ctf=5; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+20 && mx<zexofs+8+20 && my>zeyofs+61 && my<zeyofs+7+61 && !moving)\r
+ {\r
+ zones[i].aaa ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>zexofs+99 && mx<zexofs+30+99 && my>zeyofs+71 && my<zeyofs+10+71 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(zexofs+99, zeyofs+71, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(zexofs+zexsize-9) && (mx<zexofs+zexsize-2)\r
+ && my>(zeyofs+1) && (my<zeyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs && mx<zexofs+zexsize && my>zeyofs && my<(zeyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-zexofs;\r
+ myo=my-zeyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ zones[i].script=atoi(nstr1);\r
+ zones[i].percent=atoi(nstr2);\r
+ zones[i].delay=atoi(nstr3);\r
+ zones[i].entityscript=atoi(nstr4);\r
+ if (i<255) i++; else i=0;\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ sprintf(nstr1, "%d", zones[i].script);\r
+ sprintf(nstr2, "%d", zones[i].percent);\r
+ sprintf(nstr3, "%d", zones[i].delay);\r
+ sprintf(nstr4, "%d", zones[i].entityscript);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ zones[i].script=atoi(nstr1);\r
+ zones[i].percent=atoi(nstr2);\r
+ zones[i].delay=atoi(nstr3);\r
+ zones[i].entityscript=atoi(nstr4);\r
+ if (i) i--; else i=255;\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ sprintf(nstr1, "%d", zones[i].script);\r
+ sprintf(nstr2, "%d", zones[i].percent);\r
+ sprintf(nstr3, "%d", zones[i].delay);\r
+ sprintf(nstr4, "%d", zones[i].entityscript);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=zones[i].name; break;\r
+ case 1: ctf=2; str=nstr1; break;\r
+ case 2: ctf=3; str=nstr2; break;\r
+ case 3: ctf=4; str=nstr3; break;\r
+ case 4: ctf=5; str=nstr4; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=nstr4; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=zones[i].name; break;\r
+ case 3: ctf=2; str=nstr1; break;\r
+ case 4: ctf=3; str=nstr2; break;\r
+ case 5: ctf=4; str=nstr3; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+ curzone=i;\r
+ zones[i].script=atoi(nstr1);\r
+ zones[i].percent=atoi(nstr2);\r
+ zones[i].delay=atoi(nstr3);\r
+ zones[i].entityscript=atoi(nstr4);\r
+}\r
+\r
+int exsize=180, eysize=175;\r
+int exofs=70, eyofs=30;\r
+\r
+void EntityEditor(int i)\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80], nstr5[80], nstr6[80], nstr7[80], nstr8[80], nstr9[80], nstr10[80], nstr11[80], nstr12[80], nstr13[80];\r
+\r
+ sprintf(nstr1, "%d", entity[i].x);\r
+ sprintf(nstr2, "%d", entity[i].y);\r
+ sprintf(nstr3, "%d", entity[i].chrindex);\r
+ sprintf(nstr4, "%d", entity[i].speed);\r
+ sprintf(nstr5, "%d", entity[i].actscript);\r
+ sprintf(nstr6, "%d", entity[i].movecode);\r
+ sprintf(nstr7, "%d", entity[i].step);\r
+ sprintf(nstr8, "%d", entity[i].data2);\r
+ sprintf(nstr9, "%d", entity[i].data3);\r
+ sprintf(nstr10, "%d", entity[i].delay);\r
+ sprintf(nstr11, "%d", entity[i].data5);\r
+ sprintf(nstr12, "%d", entity[i].data6);\r
+ sprintf(nstr13, "%d", entity[i].movescript);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ exofs = (mx-mxo);\r
+ eyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (exofs<16) exofs = 16;\r
+ if (eyofs<16) eyofs = 16;\r
+ if (exofs+exsize>335) exofs = 336-exsize;\r
+ if (eyofs+eysize>sy+16) eyofs = (sy+16)-eysize;\r
+ }\r
+\r
+ Window(exofs, eyofs, exofs+exsize, eyofs+eysize, "Entity Editor");\r
+ GotoXY(exofs+7, eyofs+13); printstring("Desc:");\r
+ TextField(exofs+26, eyofs+11, 80, entity[i].desc, ctf == 1 ? cb : 0);\r
+ GotoXY(exofs+19, eyofs+23); printstring("X:");\r
+ TextField(exofs+26, eyofs+21, 80, nstr1, ctf == 2 ? cb : 0);\r
+ GotoXY(exofs+19, eyofs+33); printstring("Y:");\r
+ TextField(exofs+26, eyofs+31, 80, nstr2, ctf == 3 ? cb : 0);\r
+ GotoXY(exofs+11, eyofs+43); printstring("CHR:");\r
+ TextField(exofs+26, eyofs+41, 80, nstr3, ctf == 4 ? cb : 0);\r
+\r
+ // ***\r
+ // entity image goes here (just above chr list button)\r
+ // ***\r
+\r
+ BigButton(exofs+116, eyofs+61, "CHR List");\r
+ BigButton(exofs+115, eyofs+153, "Scripts");\r
+ GotoXY(exofs+2, eyofs+155); printstring("Movescript:");\r
+ HLine(exofs+1, eyofs+73, 178, white);\r
+ GotoXY(exofs+3, eyofs+53); printstring("Speed:");\r
+ TextField(exofs+26, eyofs+51, 80, nstr4, ctf == 5 ? cb : 0);\r
+ TextField(exofs+26, eyofs+61, 80, nstr5, ctf == 6 ? cb : 0);\r
+ GotoXY(exofs+107, eyofs+79); printstring("Is Obstruction");\r
+ CheckBox(exofs+161, eyofs+87, entity[i].obsmode1);\r
+ GotoXY(exofs+102, eyofs+88); printstring("Is Obstructable");\r
+ CheckBox(exofs+161, eyofs+78, entity[i].obsmode2);\r
+ GotoXY(exofs+24, eyofs+79); printstring("Auto Face");\r
+ CheckBox(exofs+61, eyofs+78, entity[i].face);\r
+ GotoXY(exofs+10, eyofs+88); printstring("Activ. Method");\r
+ CheckBox(exofs+61, eyofs+87, entity[i].actm);\r
+ HLine(exofs+1, eyofs+98, 178, white);\r
+ GotoXY(exofs+126, eyofs+166); printstring("Entity");\r
+ GotoXY(exofs+6, eyofs+104); printstring("Move Code:");\r
+ TextField(exofs+47, eyofs+103, 80, nstr6, ctf == 7 ? cb : 0);\r
+ TextField(exofs+30, eyofs+115, 40, nstr7, ctf == 8 ? cb : 0);\r
+ TextField(exofs+30, eyofs+125, 40, nstr8, ctf == 9 ? cb : 0);\r
+ TextField(exofs+30, eyofs+135, 40, nstr9, ctf == 10 ? cb : 0);\r
+ TextField(exofs+113, eyofs+115, 40, nstr10, ctf == 11 ? cb : 0);\r
+ TextField(exofs+113, eyofs+125, 40, nstr11, ctf == 12 ? cb : 0);\r
+ TextField(exofs+113, eyofs+135, 40, nstr12, ctf == 13 ? cb : 0);\r
+ HLine(exofs+1, eyofs+148, 178, white);\r
+ TextField(exofs+46, eyofs+153, 60, nstr13, ctf == 14 ? cb : 0);\r
+ GotoXY(exofs+5, eyofs+63); printstring("Activ:");\r
+ GotoXY(exofs+152, eyofs+166);\r
+ sprintf(strbuf, "%d/%d", i, entities-1); printstring(strbuf);\r
+ entity[i].movecode=atoi(nstr6);\r
+ if (ctf!=4) entity[i].chrindex=atoi(nstr3);\r
+\r
+ switch (entity[i].movecode)\r
+ {\r
+ case 0: GotoXY(exofs+131, eyofs+104); printstring("Stopped"); break;\r
+ case 1: GotoXY(exofs+131, eyofs+104); printstring("Wander");\r
+ GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
+ GotoXY(exofs+90, eyofs+116); printstring("Delay:"); break;\r
+ case 2: GotoXY(exofs+131, eyofs+104); printstring("Wander Zone");\r
+ GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
+ GotoXY(exofs+90, eyofs+116); printstring("Delay:");\r
+ GotoXY(exofs+10, eyofs+126); printstring("Zone:"); break;\r
+ case 3: GotoXY(exofs+131, eyofs+104); printstring("Wander Box");\r
+ GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
+ GotoXY(exofs+90, eyofs+116); printstring("Delay:");\r
+ GotoXY(exofs+21, eyofs+126); printstring("X1:");\r
+ GotoXY(exofs+21, eyofs+136); printstring("Y1:");\r
+ GotoXY(exofs+102, eyofs+126); printstring("X2:");\r
+ GotoXY(exofs+102, eyofs+136); printstring("Y2:"); break;\r
+ case 4: GotoXY(exofs+131, eyofs+104); printstring("Scripted"); break;\r
+ }\r
+ switch (entity[i].actm)\r
+ {\r
+ case 0: GotoXY(exofs+72, eyofs+88); printstring("Actv"); break;\r
+ case 1: GotoXY(exofs+72, eyofs+88); printstring("Adjc"); break;\r
+ }\r
+\r
+ if (chrs[entity[i].chrindex].frame)\r
+ TCopySprite(exofs+143-(chrs[entity[i].chrindex].fx/2),\r
+ eyofs+31-(chrs[entity[i].chrindex].fy/2),\r
+ chrs[entity[i].chrindex].fx, chrs[entity[i].chrindex].fy,\r
+ chrs[entity[i].chrindex].frame);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+11 && my<eyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=entity[i].desc; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+21 && my<eyofs+9+21 && !moving)\r
+ {\r
+ ctf=2; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+31 && my<eyofs+9+31 && !moving)\r
+ {\r
+ ctf=3; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+41 && my<eyofs+9+41 && !moving)\r
+ {\r
+ ctf=4; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+116 && mx<exofs+50+116 && my>eyofs+61 && my<eyofs+10+61 && !moving)\r
+ {\r
+ // insert code for button "CHR List" here\r
+ BigButtonPressed(exofs+116, eyofs+61, "CHR List");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ CHRList();\r
+// DoCHRdealy();\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+51 && my<eyofs+9+51 && !moving)\r
+ {\r
+ ctf=5; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+61 && my<eyofs+9+61 && !moving)\r
+ {\r
+ ctf=6; str=nstr5; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+115 && mx<exofs+50+115 && my>eyofs+153 && my<eyofs+10+153 && !moving)\r
+ {\r
+ // insert code for button "Scripts..." here\r
+ BigButtonPressed(exofs+115, eyofs+153, "Scripts");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ MoveScriptDialog();\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+161 && mx<exofs+8+161 && my>eyofs+87 && my<eyofs+7+87 && !moving)\r
+ {\r
+ entity[i].obsmode1 ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+161 && mx<exofs+8+161 && my>eyofs+78 && my<eyofs+7+78 && !moving)\r
+ {\r
+ entity[i].obsmode2 ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+61 && mx<exofs+8+61 && my>eyofs+78 && my<eyofs+7+78 && !moving)\r
+ {\r
+ entity[i].face ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+61 && mx<exofs+8+61 && my>eyofs+87 && my<eyofs+7+87 && !moving)\r
+ {\r
+ entity[i].actm ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+47 && mx<exofs+80+47 && my>eyofs+103 && my<eyofs+9+103 && !moving)\r
+ {\r
+ ctf=7; str=nstr6; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+115 && my<eyofs+9+115 && !moving)\r
+ {\r
+ ctf=8; str=nstr7; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+125 && my<eyofs+9+125 && !moving)\r
+ {\r
+ ctf=9; str=nstr8; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+135 && my<eyofs+9+135 && !moving)\r
+ {\r
+ ctf=10; str=nstr9; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+115 && my<eyofs+9+115 && !moving)\r
+ {\r
+ ctf=11; str=nstr10; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+125 && my<eyofs+9+125 && !moving)\r
+ {\r
+ ctf=12; str=nstr11; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+135 && my<eyofs+9+135 && !moving)\r
+ {\r
+ ctf=13; str=nstr12; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+46 && mx<exofs+60+46 && my>eyofs+153 && my<eyofs+9+153 && !moving)\r
+ {\r
+ ctf=14; str=nstr13; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(exofs+exsize-9) && (mx<exofs+exsize-2)\r
+ && my>(eyofs+1) && (my<eyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs && mx<exofs+exsize && my>eyofs && my<(eyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-exofs;\r
+ myo=my-eyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ entity[i].x=atoi(nstr1);\r
+ entity[i].y=atoi(nstr2);\r
+ entity[i].chrindex=atoi(nstr3);\r
+ entity[i].speed=atoi(nstr4);\r
+ entity[i].actscript=atoi(nstr5);\r
+ entity[i].movecode=atoi(nstr6);\r
+ entity[i].step=atoi(nstr7);\r
+ entity[i].data2=atoi(nstr8);\r
+ entity[i].data3=atoi(nstr9);\r
+ entity[i].delay=atoi(nstr10);\r
+ entity[i].data5=atoi(nstr11);\r
+ entity[i].data6=atoi(nstr12);\r
+ entity[i].movescript=atoi(nstr13);\r
+\r
+ if (i<entities-1) i++; else i=0;\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+\r
+ sprintf(nstr1, "%d", entity[i].x);\r
+ sprintf(nstr2, "%d", entity[i].y);\r
+ sprintf(nstr3, "%d", entity[i].chrindex);\r
+ sprintf(nstr4, "%d", entity[i].speed);\r
+ sprintf(nstr5, "%d", entity[i].actscript);\r
+ sprintf(nstr6, "%d", entity[i].movecode);\r
+ sprintf(nstr7, "%d", entity[i].step);\r
+ sprintf(nstr8, "%d", entity[i].data2);\r
+ sprintf(nstr9, "%d", entity[i].data3);\r
+ sprintf(nstr10, "%d", entity[i].delay);\r
+ sprintf(nstr11, "%d", entity[i].data5);\r
+ sprintf(nstr12, "%d", entity[i].data6);\r
+ sprintf(nstr13, "%d", entity[i].movescript);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ entity[i].x=atoi(nstr1);\r
+ entity[i].y=atoi(nstr2);\r
+ entity[i].chrindex=atoi(nstr3);\r
+ entity[i].speed=atoi(nstr4);\r
+ entity[i].actscript=atoi(nstr5);\r
+ entity[i].movecode=atoi(nstr6);\r
+ entity[i].step=atoi(nstr7);\r
+ entity[i].data2=atoi(nstr8);\r
+ entity[i].data3=atoi(nstr9);\r
+ entity[i].delay=atoi(nstr10);\r
+ entity[i].data5=atoi(nstr11);\r
+ entity[i].data6=atoi(nstr12);\r
+ entity[i].movescript=atoi(nstr13);\r
+\r
+ if (i) i--; else i=entities-1;\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+\r
+ sprintf(nstr1, "%d", entity[i].x);\r
+ sprintf(nstr2, "%d", entity[i].y);\r
+ sprintf(nstr3, "%d", entity[i].chrindex);\r
+ sprintf(nstr4, "%d", entity[i].speed);\r
+ sprintf(nstr5, "%d", entity[i].actscript);\r
+ sprintf(nstr6, "%d", entity[i].movecode);\r
+ sprintf(nstr7, "%d", entity[i].step);\r
+ sprintf(nstr8, "%d", entity[i].data2);\r
+ sprintf(nstr9, "%d", entity[i].data3);\r
+ sprintf(nstr10, "%d", entity[i].delay);\r
+ sprintf(nstr11, "%d", entity[i].data5);\r
+ sprintf(nstr12, "%d", entity[i].data6);\r
+ sprintf(nstr13, "%d", entity[i].movescript);\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=entity[i].desc; break;\r
+ case 1: ctf=2; str=nstr1; break;\r
+ case 2: ctf=3; str=nstr2; break;\r
+ case 3: ctf=4; str=nstr3; break;\r
+ case 4: ctf=5; str=nstr4; break;\r
+ case 5: ctf=6; str=nstr5; break;\r
+ case 6: ctf=7; str=nstr6; break;\r
+ case 7: ctf=8; str=nstr7; break;\r
+ case 8: ctf=9; str=nstr8; break;\r
+ case 9: ctf=10; str=nstr9; break;\r
+ case 10: ctf=11; str=nstr10; break;\r
+ case 11: ctf=12; str=nstr11; break;\r
+ case 12: ctf=13; str=nstr12; break;\r
+ case 13: ctf=14; str=nstr13; break;\r
+ case 14: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=13; str=nstr12; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=entity[i].desc; break;\r
+ case 3: ctf=2; str=nstr1; break;\r
+ case 4: ctf=3; str=nstr2; break;\r
+ case 5: ctf=4; str=nstr3; break;\r
+ case 6: ctf=5; str=nstr4; break;\r
+ case 7: ctf=6; str=nstr5; break;\r
+ case 8: ctf=7; str=nstr6; break;\r
+ case 9: ctf=8; str=nstr7; break;\r
+ case 10: ctf=9; str=nstr8; break;\r
+ case 11: ctf=10; str=nstr9; break;\r
+ case 12: ctf=11; str=nstr10; break;\r
+ case 13: ctf=12; str=nstr11; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ entity[i].x=atoi(nstr1);\r
+ entity[i].y=atoi(nstr2);\r
+ entity[i].chrindex=atoi(nstr3);\r
+ entity[i].speed=atoi(nstr4);\r
+ entity[i].actscript=atoi(nstr5);\r
+ entity[i].movecode=atoi(nstr6);\r
+ entity[i].step=atoi(nstr7);\r
+ entity[i].data2=atoi(nstr8);\r
+ entity[i].data3=atoi(nstr9);\r
+ entity[i].delay=atoi(nstr10);\r
+ entity[i].data5=atoi(nstr11);\r
+ entity[i].data6=atoi(nstr12);\r
+ entity[i].movescript=atoi(nstr13);\r
+}\r
+\r
+int clxsize=170, clysize=78;\r
+int clxofs=105, clyofs=80;\r
+char base=0;\r
+\r
+void CHRList()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ clxofs = (mx-mxo);\r
+ clyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (clxofs<16) clxofs = 16;\r
+ if (clyofs<16) clyofs = 16;\r
+ if (clxofs+clxsize>335) clxofs = 336-clxsize;\r
+ if (clyofs+clysize>sy+16) clyofs = (sy+16)-clysize;\r
+ }\r
+\r
+ Window(clxofs, clyofs, clxofs+clxsize, clyofs+clysize, "Entity CHR Reference Index");\r
+ TextField(clxofs+14, clyofs+11, 120, chrlist[base].t, ctf == 1 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+22, 120, chrlist[base+1].t, ctf == 2 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+33, 120, chrlist[base+2].t, ctf == 3 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+44, 120, chrlist[base+3].t, ctf == 4 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+55, 120, chrlist[base+4].t, ctf == 5 ? cb : 0);\r
+ Button(clxofs+137, clyofs+65, "OK");\r
+ Button(clxofs+137, clyofs+10, "Browse");\r
+ Button(clxofs+137, clyofs+21, "Browse");\r
+ Button(clxofs+137, clyofs+32, "Browse");\r
+ Button(clxofs+137, clyofs+43, "Browse");\r
+ Button(clxofs+137, clyofs+54, "Browse");\r
+ GotoXY(clxofs+3, clyofs+11); sprintf(strbuf,"%d:", base); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+22); sprintf(strbuf,"%d:", base+1); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+33); sprintf(strbuf,"%d:", base+2); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+44); sprintf(strbuf,"%d:", base+3); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+55); sprintf(strbuf,"%d:", base+4); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+11 && my<clyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=chrlist[base].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+22 && my<clyofs+9+22 && !moving)\r
+ {\r
+ ctf=2; str=chrlist[base+1].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+33 && my<clyofs+9+33 && !moving)\r
+ {\r
+ ctf=3; str=chrlist[base+2].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+44 && my<clyofs+9+44 && !moving)\r
+ {\r
+ ctf=4; str=chrlist[base+3].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+55 && my<clyofs+9+55 && !moving)\r
+ {\r
+ ctf=5; str=chrlist[base+4].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+65 && my<clyofs+10+65 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(clxofs+137, clyofs+65, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+10 && my<clyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+10, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+21 && my<clyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+21, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+1].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+32 && my<clyofs+10+32 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+32, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+2].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+43 && my<clyofs+10+43 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+43, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+3].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+54 && my<clyofs+10+54 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+54, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+4].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(clxofs+clxsize-9) && (mx<clxofs+clxsize-2)\r
+ && my>(clyofs+1) && (my<clyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs && mx<clxofs+clxsize && my>clyofs && my<(clyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-clxofs;\r
+ myo=my-clyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ key[SCAN_UP]=0;\r
+ if (base) base--;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ key[SCAN_DOWN]=0;\r
+ if (base<95) base++;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=chrlist[base].t; break;\r
+ case 1: ctf=2; str=chrlist[base+1].t; break;\r
+ case 2: ctf=3; str=chrlist[base+2].t; break;\r
+ case 3: ctf=4; str=chrlist[base+3].t; break;\r
+ case 4: ctf=5; str=chrlist[base+4].t; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=chrlist[base].t; break;\r
+ case 1: ctf=0; str=chrlist[base].t; break;\r
+ case 2: ctf=1; str=chrlist[base+1].t; break;\r
+ case 3: ctf=2; str=chrlist[base+2].t; break;\r
+ case 4: ctf=3; str=chrlist[base+3].t; break;\r
+ case 5: ctf=4; str=chrlist[base+4].t; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int msxsize=181, msysize=77;\r
+int msxofs=70, msyofs=50;\r
+char base1=0;\r
+\r
+void MoveScriptDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ msxofs = (mx-mxo);\r
+ msyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (msxofs<16) msxofs = 16;\r
+ if (msyofs<16) msyofs = 16;\r
+ if (msxofs+msxsize>335) msxofs = 336-msxsize;\r
+ if (msyofs+msysize>sy+16) msyofs = (sy+16)-msysize;\r
+ }\r
+\r
+ Window(msxofs, msyofs, msxofs+msxsize, msyofs+msysize, "Movement Script Editor");\r
+ TextField(msxofs+15, msyofs+12, 160, ms[base1].t, ctf == 1 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+22, 160, ms[base1+1].t, ctf == 2 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+32, 160, ms[base1+2].t, ctf == 3 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+42, 160, ms[base1+3].t, ctf == 4 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+52, 160, ms[base1+4].t, ctf == 5 ? cb : 0);\r
+ Button(msxofs+146, msyofs+63, "OK");\r
+ GotoXY(msxofs+3, msyofs+11); sprintf(strbuf,"%d:", base1); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+22); sprintf(strbuf,"%d:", base1+1); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+33); sprintf(strbuf,"%d:", base1+2); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+44); sprintf(strbuf,"%d:", base1+3); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+55); sprintf(strbuf,"%d:", base1+4); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+12 && my<msyofs+10+12 && !moving)\r
+ {\r
+ ctf=1; str=ms[base1].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+22 && my<msyofs+9+22 && !moving)\r
+ {\r
+ ctf=2; str=ms[base1+1].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+32 && my<msyofs+9+32 && !moving)\r
+ {\r
+ ctf=3; str=ms[base1+2].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+42 && my<msyofs+9+42 && !moving)\r
+ {\r
+ ctf=4; str=ms[base1+3].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+52 && my<msyofs+9+52 && !moving)\r
+ {\r
+ ctf=5; str=ms[base1+4].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>msxofs+146 && mx<msxofs+30+146 && my>msyofs+63 && my<msyofs+10+63 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(msxofs+146, msyofs+63, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(msxofs+msxsize-9) && (mx<msxofs+msxsize-2)\r
+ && my>(msyofs+1) && (my<msyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs && mx<msxofs+msxsize && my>msyofs && my<(msyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-msxofs;\r
+ myo=my-msyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ key[SCAN_UP]=0;\r
+ if (base1) base1--;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ key[SCAN_DOWN]=0;\r
+ if (base1<95) base1++;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=ms[base1].t; break;\r
+ case 1: ctf=2; str=ms[base1+1].t; break;\r
+ case 2: ctf=3; str=ms[base1+2].t; break;\r
+ case 3: ctf=4; str=ms[base1+3].t; break;\r
+ case 4: ctf=5; str=ms[base1+4].t; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=ms[base1+4].t; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=ms[base1].t; break;\r
+ case 3: ctf=2; str=ms[base1+1].t; break;\r
+ case 4: ctf=3; str=ms[base1+2].t; break;\r
+ case 5: ctf=4; str=ms[base1+3].t; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int prxsize=150, prysize=80;\r
+int prxofs=50, pryofs=60;\r
+\r
+void MapPropertiesDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ prxofs = (mx-mxo);\r
+ pryofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (prxofs<16) prxofs = 16;\r
+ if (pryofs<16) pryofs = 16;\r
+ if (prxofs+prxsize>335) prxofs = 336-prxsize;\r
+ if (pryofs+prysize>sy+16) pryofs = (sy+16)-prysize;\r
+ }\r
+\r
+ Window(prxofs, pryofs, prxofs+prxsize, pryofs+prysize, "MAP Properties");\r
+ GotoXY(prxofs+10, pryofs+23); printstring("Music:");\r
+ TextField(prxofs+33, pryofs+11, 112, mapname, ctf == 1 ? cb : 0);\r
+ TextField(prxofs+33, pryofs+21, 112, musname, ctf == 2 ? cb : 0);\r
+ GotoXY(prxofs+18, pryofs+33); printstring("VSP:");\r
+ TextField(prxofs+33, pryofs+31, 112, vspname, ctf == 3 ? cb : 0);\r
+ GotoXY(prxofs+3, pryofs+43); printstring("rstring:");\r
+ TextField(prxofs+33, pryofs+41, 112, rstring, ctf == 4 ? cb : 0);\r
+ BigButton(prxofs+97, pryofs+56, "Resize MAP");\r
+ HLine(prxofs+1, pryofs+53, 148, white);\r
+ GotoXY(prxofs+3, pryofs+58); printstring("xsize:");\r
+ sprintf(strbuf,"%d",layer[0].sizex); printstring(strbuf);\r
+ GotoXY(prxofs+49, pryofs+58); printstring("ysize:");\r
+ sprintf(strbuf,"%d",layer[0].sizey); printstring(strbuf);\r
+ Button(prxofs+117, pryofs+67, "OK");\r
+ GotoXY(prxofs+16, pryofs+13); printstring("MAP:");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+11 && my<pryofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=mapname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+21 && my<pryofs+9+21 && !moving)\r
+ {\r
+ ctf=2; str=musname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+31 && my<pryofs+9+31 && !moving)\r
+ {\r
+ ctf=3; str=vspname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+41 && my<pryofs+9+41 && !moving)\r
+ {\r
+ ctf=4; str=rstring; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+97 && mx<prxofs+30+97 && my>pryofs+56 && my<pryofs+10+56 && !moving)\r
+ {\r
+ // insert code for button "Resize MAP" here\r
+ BigButtonPressed(prxofs+97, pryofs+56, "Resize MAP");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ ResizeMapDialog();\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>prxofs+117 && mx<prxofs+30+117 && my>pryofs+67 && my<pryofs+10+67 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(prxofs+117, pryofs+67, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(prxofs+prxsize-9) && (mx<prxofs+prxsize-2)\r
+ && my>(pryofs+1) && (my<pryofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs && mx<prxofs+prxsize && my>pryofs && my<(pryofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-prxofs;\r
+ myo=my-pryofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=mapname; break;\r
+ case 1: ctf=2; str=musname; break;\r
+ case 2: ctf=3; str=vspname; break;\r
+ case 3: ctf=4; str=rstring; break;\r
+ case 4: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=4; str=rstring; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=mapname; break;\r
+ case 3: ctf=2; str=musname; break;\r
+ case 4: ctf=3; str=vspname; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+\r
+}\r
+\r
+int rsxsize=134, rsysize=44;\r
+int rsxofs=20, rsyofs=20;\r
+\r
+static void PutByte(byte *to, byte v, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return;\r
+\r
+ to[(y*w)+x]=v;\r
+}\r
+\r
+static byte GetByte(byte *from, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return 0;\r
+\r
+ return from[(y*w)+x];\r
+}\r
+\r
+static void PutWord(word *to, word v, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return;\r
+\r
+ to[(y*w)+x]=v;\r
+}\r
+\r
+static word GetWord(word *from, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return 0;\r
+\r
+ return from[(y*w)+x];\r
+}\r
+\r
+void ResizeMapDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, basex, basey, i; //, xl, yl;\r
+ char ctf=0, cb=0, c, t;\r
+ char *str, *tb; //, *s1, *d1;\r
+ char nstr1[80], nstr2[80];\r
+ word *tbw; //, *s=NULL,*d=NULL;\r
+ //int temp_width;\r
+ int a,b;\r
+\r
+ basex=layer[0].sizex;\r
+ basey=layer[0].sizey;\r
+ sprintf(nstr1, "%d", basex);\r
+ sprintf(nstr2, "%d", basey);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ rsxofs = (mx-mxo);\r
+ rsyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (rsxofs<16) rsxofs = 16;\r
+ if (rsyofs<16) rsyofs = 16;\r
+ if (rsxofs+rsxsize>335) rsxofs = 336-rsxsize;\r
+ if (rsyofs+rsysize>sy+16) rsyofs = (sy+16)-rsysize;\r
+ }\r
+\r
+ Window(rsxofs, rsyofs, rsxofs+rsxsize, rsyofs+rsysize, "Resize MAP");\r
+ GotoXY(rsxofs+4, rsyofs+12); printstring("Base X:");\r
+ GotoXY(rsxofs+4, rsyofs+22); printstring("Base Y:");\r
+ TextField(rsxofs+30, rsyofs+10, 100, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(rsxofs+30, rsyofs+20, 100, nstr2, ctf == 2 ? cb : 0);\r
+ Button(rsxofs+69, rsyofs+31, "Resize");\r
+ Button(rsxofs+101, rsyofs+31, "Cancel");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>rsxofs+30 && mx<rsxofs+100+30 && my>rsyofs+10 && my<rsyofs+9+10 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs+30 && mx<rsxofs+100+30 && my>rsyofs+20 && my<rsyofs+9+20 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs+69 && mx<rsxofs+30+69 && my>rsyofs+31 && my<rsyofs+10+31 && !moving)\r
+ {\r
+ printf("&");\r
+ fflush(stdout);\r
+ // insert code for button "Resize" here\r
+ ButtonPressed(rsxofs+69, rsyofs+31, "Resize");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ basex=atoi(nstr1);\r
+ basey=atoi(nstr2);\r
+\r
+ tb = (char *)valloc(basex*basey,"tilebuf",0);\r
+ for (b=0; b<basey; ++b)\r
+ for (a=0; a<basex; ++a)\r
+ PutByte(tb,\r
+ GetByte(obstruct,a,b,layer[0].sizex,layer[0].sizey),\r
+ a,b,basex,basey);\r
+ vfree(obstruct);\r
+ obstruct=tb;\r
+\r
+ tb = (char *)valloc(basex*basey,"tilebuf",0);\r
+ for (b=0; b<basey; ++b)\r
+ for (a=0; a<basex; ++a)\r
+ PutByte(tb,\r
+ GetByte(zone,a,b,layer[0].sizex,layer[0].sizey),\r
+ a,b,basex,basey);\r
+ vfree(zone);\r
+ zone=tb;\r
+\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ tbw=(word *)valloc(basex*basey*2,"tilebuf",0);\r
+ //memset(tbw, 0, basex*basey*2);\r
+ for (b=0; b<basey; ++b)\r
+ for (a=0; a<basex; ++a)\r
+ PutWord(tbw,\r
+ GetWord(layers[i],a,b,layer[i].sizex,layer[i].sizey),\r
+ a,b,basex,basey);\r
+\r
+ vfree(layers[i]);\r
+ layers[i]=tbw;\r
+ }\r
+ for (i=0; i<numlayers; ++i)\r
+ {\r
+ layer[i].sizex=basex;\r
+ layer[i].sizey=basey;\r
+ }\r
+ xwin=0; ywin=0;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs+101 && mx<rsxofs+30+101 && my>rsyofs+31 && my<rsyofs+10+31 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ done=1;\r
+ ButtonPressed(rsxofs+101, rsyofs+31, "Cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(rsxofs+rsxsize-9) && (mx<rsxofs+rsxsize-2)\r
+ && my>(rsyofs+1) && (my<rsyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs && mx<rsxofs+rsxsize && my>rsyofs && my<(rsyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-rsxofs;\r
+ myo=my-rsyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=2; str=nstr2; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ basex=atoi(nstr1);\r
+ basey=atoi(nstr2);\r
+}\r
+\r
+int cdxsize=150, cdysize=45;\r
+int cdxofs=110, cdyofs=70;\r
+char curtrack=1;\r
+\r
+void CDDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ cdxofs = (mx-mxo);\r
+ cdyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (cdxofs<16) cdxofs = 16;\r
+ if (cdyofs<16) cdyofs = 16;\r
+ if (cdxofs+cdxsize>335) cdxofs = 336-cdxsize;\r
+ if (cdyofs+cdysize>sy+16) cdyofs = (sy+16)-cdysize;\r
+ }\r
+\r
+ Window(cdxofs, cdyofs, cdxofs+cdxsize, cdyofs+cdysize, "CD Player");\r
+ Button(cdxofs+53, cdyofs+10, "Play");\r
+ Button(cdxofs+53, cdyofs+21, "Stop");\r
+ Button(cdxofs+85, cdyofs+10, "Eject");\r
+ Button(cdxofs+85, cdyofs+21, "Close");\r
+ Button(cdxofs+117, cdyofs+10, "Next");\r
+ Button(cdxofs+117, cdyofs+21, "Prev");\r
+ Button(cdxofs+117, cdyofs+32, "OK");\r
+ GotoXY(cdxofs+4, cdyofs+18); printstring("Track ");\r
+ sprintf(strbuf,"%d",curtrack); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>cdxofs+53 && mx<cdxofs+30+53 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Play" here\r
+ ButtonPressed(cdxofs+53, cdyofs+10, "Play");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Play(curtrack);\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+53 && mx<cdxofs+30+53 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Stop" here\r
+ ButtonPressed(cdxofs+53, cdyofs+21, "Stop");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Stop();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+85 && mx<cdxofs+30+85 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Eject" here\r
+ ButtonPressed(cdxofs+85, cdyofs+10, "Eject");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Open_Door();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+85 && mx<cdxofs+30+85 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Close" here\r
+ ButtonPressed(cdxofs+85, cdyofs+21, "Close");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Close_Door();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Next" here\r
+ ButtonPressed(cdxofs+117, cdyofs+10, "Next");\r
+ curtrack++;\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Prev" here\r
+ ButtonPressed(cdxofs+117, cdyofs+21, "Prev");\r
+ DrawMouse();\r
+ if (curtrack>1) curtrack--;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+32 && my<cdyofs+10+32 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(cdxofs+117, cdyofs+32, "OK");\r
+ DrawMouse();\r
+ done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(cdxofs+cdxsize-9) && (mx<cdxofs+cdxsize-2)\r
+ && my>(cdyofs+1) && (my<cdyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs && mx<cdxofs+cdxsize && my>cdyofs && my<(cdyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-cdxofs;\r
+ myo=my-cdyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int ntxsize=130, nytsize=51;\r
+int ntxofs=110, ntyofs=70;\r
+\r
+void NoticeDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ ntxofs = (mx-mxo);\r
+ ntyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (ntxofs<16) ntxofs = 16;\r
+ if (ntyofs<16) ntyofs = 16;\r
+ if (ntxofs+ntxsize>335) ntxofs = 336-ntxsize;\r
+ if (ntyofs+nytsize>sy+16) ntyofs = (sy+16)-nytsize;\r
+ }\r
+\r
+ Window(ntxofs, ntyofs, ntxofs+ntxsize, ntyofs+nytsize, "Notice!");\r
+ GotoXY(ntxofs+20, ntyofs+20); printstring("Don't forget to add this");\r
+ GotoXY(ntxofs+14, ntyofs+26); printstring("layer to the Render String!");\r
+ Button(ntxofs+50, ntyofs+36, "OK");\r
+ GotoXY(ntxofs+25, ntyofs+14); printstring("Layer has been added.");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>ntxofs+50 && mx<ntxofs+30+50 && my>ntyofs+36 && my<ntyofs+10+36 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(ntxofs+50, ntyofs+36, "OK");\r
+ done=1;\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(ntxofs+ntxsize-9) && (mx<ntxofs+ntxsize-2)\r
+ && my>(ntyofs+1) && (my<ntyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>ntxofs && mx<ntxofs+ntxsize && my>ntyofs && my<(ntyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-ntxofs;\r
+ myo=my-ntyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int oxsize=150, oysize=98;\r
+int oxofs=120, oyofs=70;\r
+extern char vcedprog[80];\r
+\r
+void OptionsDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ sprintf(nstr1, "%d", winbg);\r
+ sprintf(nstr2, "%d", titlebg);\r
+ sprintf(nstr3, "%d", brightw);\r
+ sprintf(nstr4, "%d", darkw);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ oxofs = (mx-mxo);\r
+ oyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (oxofs<16) oxofs = 16;\r
+ if (oyofs<16) oyofs = 16;\r
+ if (oxofs+oxsize>335) oxofs = 336-oxsize;\r
+ if (oyofs+oysize>sy+16) oyofs = (sy+16)-oysize;\r
+ }\r
+\r
+ Window(oxofs, oyofs, oxofs+oxsize, oyofs+oysize, "MapEd Options");\r
+ GotoXY(oxofs+16, oyofs+12); printstring("Smooth Scroll");\r
+ CheckBox(oxofs+5, oyofs+11, scrollmode);\r
+ GotoXY(oxofs+16, oyofs+20); printstring("Tile Highlight");\r
+ CheckBox(oxofs+5, oyofs+19, mh);\r
+ GotoXY(oxofs+38, oyofs+31); printstring("Window Background");\r
+ TextField(oxofs+5, oyofs+29, 30, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(oxofs+5, oyofs+39, 30, nstr2, ctf == 2 ? cb : 0);\r
+ GotoXY(oxofs+38, oyofs+41); printstring("Titlebar Background");\r
+ CheckBox(oxofs+74, oyofs+11, vm);\r
+ GotoXY(oxofs+84, oyofs+12); printstring("320x240 driver");\r
+ CheckBox(oxofs+74, oyofs+19, mouse_scroll);\r
+ GotoXY(oxofs+84, oyofs+20); printstring("Mouse Scrolling");\r
+ TextField(oxofs+5, oyofs+49, 30, nstr3, ctf == 3 ? cb : 0);\r
+ TextField(oxofs+5, oyofs+59, 30, nstr4, ctf == 4 ? cb : 0);\r
+ GotoXY(oxofs+38, oyofs+51); printstring("White");\r
+ GotoXY(oxofs+38, oyofs+61); printstring("Shadow");\r
+ Button(oxofs+60, oyofs+85, "OK");\r
+ HLine(oxofs+1, oyofs+71, 148, white);\r
+ GotoXY(oxofs+3, oyofs+76); printstring("Editor:");\r
+ TextField(oxofs+28, oyofs+74, 118, vcedprog, ctf == 5 ? cb : 0);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+8+5 && my>oyofs+11 && my<oyofs+7+11 && !moving)\r
+ {\r
+ xwin=xwin>>4; xwin=xwin<<4;\r
+ ywin=ywin>>4; ywin=ywin<<4;\r
+ scrollmode ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+8+5 && my>oyofs+19 && my<oyofs+7+19 && !moving)\r
+ {\r
+ mh ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+29 && my<oyofs+9+29 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+39 && my<oyofs+9+39 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+74 && mx<oxofs+8+74 && my>oyofs+11 && my<oyofs+7+11 && !moving)\r
+ {\r
+ vm ^= 1; WaitRelease();\r
+ ShutdownVideo();\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+74 && mx<oxofs+8+74 && my>oyofs+19 && my<oyofs+7+19 && !moving)\r
+ {\r
+ mouse_scroll ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+49 && my<oyofs+9+49 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+59 && my<oyofs+9+59 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>oxofs+60 && mx<oxofs+30+60 && my>oyofs+85 && my<oyofs+10+85 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(oxofs+60, oyofs+85, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+28 && mx<oxofs+118+28 && my>oyofs+74 && my<oyofs+9+74 && !moving)\r
+ {\r
+ ctf=5; str=vcedprog; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(oxofs+oxsize-9) && (mx<oxofs+oxsize-2)\r
+ && my>(oyofs+1) && (my<oyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs && mx<oxofs+oxsize && my>oyofs && my<(oyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-oxofs;\r
+ myo=my-oyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=5; str=vcedprog; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=vcedprog; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ case 5: ctf=4; str=nstr4; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ winbg=atoi(nstr1);\r
+ titlebg=atoi(nstr2);\r
+ brightw=atoi(nstr3);\r
+ darkw=atoi(nstr4);\r
+}\r
+\r
+int vcexsize=200, vceysize=60;\r
+int vcexofs=76, vceyofs=70;\r
+\r
+void VCNotify(char *msg)\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ vcexofs = (mx-mxo);\r
+ vceyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (vcexofs<16) vcexofs = 16;\r
+ if (vceyofs<16) vceyofs = 16;\r
+ if (vcexofs+vcexsize>335) vcexofs = 336-vcexsize;\r
+ if (vceyofs+vceysize>sy+16) vceyofs = (sy+16)-vceysize;\r
+ }\r
+\r
+ Window(vcexofs, vceyofs, vcexofs+vcexsize, vceyofs+vceysize, "VergeC Error Report");\r
+ Button(vcexofs+85, vceyofs+41, "OK");\r
+ GotoXY(vcexofs+29, vceyofs+17); printstring("VCC has reported the following error:");\r
+ GotoXY(vcexofs+100-(pixels(msg)/2), vceyofs+23); printstring(msg);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>vcexofs+85 && mx<vcexofs+30+85 && my>vceyofs+41 && my<vceyofs+10+41 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(vcexofs+85, vceyofs+41, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(vcexofs+vcexsize-9) && (mx<vcexofs+vcexsize-2)\r
+ && my>(vceyofs+1) && (my<vceyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>vcexofs && mx<vcexofs+vcexsize && my>vceyofs && my<(vceyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-vcexofs;\r
+ myo=my-vceyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef GUI_INC\r
+#define GUI_INC\r
+\r
+extern int amxofs, amyofs;\r
+extern int mmxofs, mmyofs;\r
+extern int cnxofs, cnyofs;\r
+extern int lmxofs, lmyofs;\r
+extern int lvxofs, lvyofs;\r
+extern int vaxofs, vayofs;\r
+extern int mpxofs, mpyofs;\r
+extern int zexofs, zeyofs;\r
+extern int exofs, eyofs;\r
+extern int prxofs, pryofs;\r
+extern int rsxofs, rsyofs;\r
+\r
+extern void CheckMessageExpirations();\r
+extern void Message(char *text, int duration);\r
+extern void DrawScreenControls();\r
+extern void RenderMessages();\r
+extern void RenderGUI();\r
+extern void DoMainMenu();\r
+extern void MainMenu(int dx, int dy);\r
+#define byte unsigned char\r
+extern byte TileCmp(byte *one, byte *two);\r
+extern void ImageToLayer();\r
+extern void Destroyer();\r
+extern void LayersSubMenu(int dx, int dy);\r
+extern void ExecuteSubMenu(int dx, int dy);\r
+extern void AddLayer();\r
+extern void EditLayerProperties();\r
+extern void NewMAP();\r
+extern void About();\r
+extern int Confirm(char *message);\r
+extern void LoadMAPDialog();\r
+extern void LoadVSPDialog();\r
+extern void MPDialog();\r
+extern void ZoneEdDialog();\r
+extern void EntityEditor(int i);\r
+extern void CHRList();\r
+extern void MoveScriptDialog();\r
+extern void MapPropertiesDialog();\r
+extern void ResizeMapDialog();\r
+extern void CDDialog();\r
+extern void NoticeDialog();\r
+extern void OptionsDialog();\r
+extern void VCNotify(char *msg);\r
+\r
+#endif // GUI_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Additional code by Richard Lau (aka Ric)\r
+\r
+#include "config.h" // Colour definitions\r
+#include "vdriver.h" // Video driver functions\r
+#include "smalfont.h"\r
+\r
+// ================================= Code ====================================\r
+\r
+void stdwindow(int x1, int y1, int x2, int y2)\r
+{\r
+ FilledBox(x1, y1, x2-x1, y2-y1, winbg);\r
+ HLine(x1, y1, x2-x1, black); /* -- ric: 13/Jun/98 -- */\r
+ VLine(x1, y1, y2-y1, black); /* Outline window in black */\r
+ HLine(x1+1, y2-1, x2-x1-1, black);\r
+ VLine(x2-1, y1+1, y2-y1-1, black);\r
+\r
+ HLine(x1+1, y1+1, x2-x1-2, brightw);\r
+ VLine(x1+1, y1+1, y2-y1-2, brightw);\r
+ HLine(x1+2, y2-2, x2-x1-3, darkw);\r
+ VLine(x2-2, y1+2, y2-y1-3, darkw);\r
+}\r
+\r
+void Window(int x1, int y1, int x2, int y2, char *title)\r
+{\r
+ FilledBox(x1, y1, x2-x1, y2-y1, winbg);\r
+ FilledBox(x1, y1, x2-x1, 8, titlebg);\r
+ HLine(x1, y1, x2-x1, brightw);\r
+ VLine(x1, y1, y2-y1, brightw);\r
+ HLine(x1+1, y2-1, x2-x1-1, darkw);\r
+ VLine(x2-1, y1+1, y2-y1-1, darkw);\r
+ FilledBox(x2-8, y1+2, 5, 5, winbg);\r
+ HLine(x2-8, y1+2, 6, brightw);\r
+ VLine(x2-8, y1+2, 5, brightw);\r
+ HLine(x2-7, y1+6, 4, darkw);\r
+ VLine(x2-3, y1+3, 4, darkw);\r
+\r
+ GotoXY(x1+2, y1+2);\r
+ printstring(title);\r
+}\r
+\r
+void CheckBox(int x, int y, char checked)\r
+{\r
+ FilledBox(x, y, 7, 6, 0);\r
+ HLine(x, y, 8, darkw);\r
+ VLine(x, y, 7, darkw);\r
+ HLine(x+1, y+6, 7, brightw);\r
+ VLine(x+7, y+1, 5, brightw);\r
+ if (checked)\r
+ {\r
+ GotoXY(x+2, y+2);\r
+ printstring("*");\r
+ }\r
+}\r
+\r
+void Button(int x, int y, char *str)\r
+{\r
+ stdwindow(x,y,x+30,y+10);\r
+// HLine(x, y, 30, black); /* -- ric: 13/Jun/98 -- */\r
+// VLine(x, y, 10, black); /* Outline buttons in black */\r
+/* HLine(x+1, y+9, 29, black);\r
+ VLine(x+29, y+1, 9, black);\r
+\r
+ HLine(x+1, y+1, 28, white);\r
+ VLine(x+1, y+1, 8, white);\r
+ HLine(x+2, y+8, 27, darkw);\r
+ VLine(x+28, y+2, 7, darkw); */\r
+ GotoXY(x+(15-(pixels(str)/2)), y+2);\r
+ printstring(str);\r
+}\r
+\r
+void BigButton(int x, int y, char *str)\r
+{\r
+ stdwindow(x,y,x+50,y+10);\r
+// HLine(x, y, 50, black); /* -- ric: 13/Jun/98 -- */\r
+// VLine(x, y, 10, black); /* Outline buttons in black */\r
+/* HLine(x+1, y+9, 49, black);\r
+ VLine(x+49, y+1, 9, black);\r
+\r
+ HLine(x+1, y+1, 48, white);\r
+ VLine(x+1, y+1, 8, white);\r
+ HLine(x+2, y+8, 47, darkw);\r
+ VLine(x+48, y+2, 7, darkw); */\r
+ GotoXY(x+(25-(pixels(str)/2)), y+2);\r
+ printstring(str);\r
+}\r
+\r
+void ButtonPressed(int x, int y, char *str)\r
+/* -- ric: 13/Jun/98 -- */\r
+/* Draws a depressed button */\r
+{\r
+ stdwindow(x,y,x+30,y+10);\r
+ HLine(x+1, y+1, 28, darkw);\r
+ VLine(x+1, y+1, 8, darkw);\r
+ HLine(x+2, y+8, 27, winbg);\r
+ VLine(x+28, y+2, 7, winbg);\r
+ GotoXY(x+1+(15-(pixels(str)/2)), y+3);\r
+ printstring(str);\r
+}\r
+\r
+void BigButtonPressed(int x, int y, char *str)\r
+{\r
+ stdwindow(x,y,x+50,y+10);\r
+ HLine(x+1, y+1, 48, darkw);\r
+ VLine(x+1, y+1, 8, darkw);\r
+ HLine(x+2, y+8, 47, winbg);\r
+ VLine(x+48, y+2, 7, winbg);\r
+ GotoXY(x+1+(25-(pixels(str)/2)), y+3);\r
+ printstring(str);\r
+}\r
+\r
+void TextField(int x, int y, int width, char *str, char blink)\r
+{\r
+ FilledBox(x, y, width, 9, 0);\r
+ HLine(x, y, width+1, darkw);\r
+ VLine(x, y, 9, darkw);\r
+ HLine(x+1, y+8, width-1, brightw);\r
+ VLine(x+width, y+1, 8, brightw);\r
+ GotoXY(x+2, y+2);\r
+ printstring(str);\r
+ if (blink) printstring("_");\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef GUICOMP_INC\r
+#define GUICOMP_INC\r
+\r
+extern void stdwindow(int x1, int y1, int x2, int y2);\r
+extern void Window(int x1, int y1, int x2, int y2, char *title);\r
+extern void CheckBox(int x, int y, char checked);\r
+extern void Button(int x, int y, char *str);\r
+extern void BigButton(int x, int y, char *str);\r
+extern void ButtonPressed(int x, int y, char *str);\r
+extern void BigButtonPressed(int x, int y, char *str);\r
+extern void TextField(int x, int y, int width, char *str, char blink);\r
+\r
+#endif // GUICOMP_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(INTERINC)\r
+#define INTERINC\r
+\r
+#ifdef __WATCOMC__\r
+ #include <i86.h>\r
+ #define REGISTERS union REGS\r
+ #define SET_AX(r,v) (r).w.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).w.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).w.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).w.dx=(short)(v)\r
+ #define INTERRUPT(i,r) int386((i),&(r),&(r))\r
+#elif defined(__DJGPP__)\r
+ #include <dpmi.h>\r
+ #define REGISTERS __dpmi_regs\r
+ #define SET_AX(r,v) (r).x.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).x.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).x.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).x.dx=(short)(v)\r
+ #define INTERRUPT(i,r) __dpmi_int((i),&(r))\r
+#endif // watcom | djgpp\r
+\r
+#endif // INTERINC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <conio.h>\r
+#include <dos.h>\r
+#include "timer.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+char key[128];\r
+char keycode,last_pressed=0;\r
+char codeBuffer[16];\r
+void (__interrupt __far *biosKeyboardHandler)();\r
+char handlerinstalled=0;\r
+\r
+unsigned char key_ascii_tbl[128] =\r
+{\r
+ 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8, 9,\r
+ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 13, 0, 'a', 's',\r
+ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 39, 0, 0, 92, 'z', 'x', 'c', 'v',\r
+ 'b', 'n', 'm', ',', '.', '/', 0, '*', 0, ' ', 0, 3, 3, 3, 3, 8,\r
+ 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 0, 127, 0, 0, 92, 3, 3, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+unsigned char key_shift_tbl[128] =\r
+{\r
+ 0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 126, 126,\r
+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 126, 0, 'A', 'S',\r
+ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', 34, 0, 0, '|', 'Z', 'X', 'C', 'V',\r
+ 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, 1, 0, 1, 1, 1, 1, 1,\r
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 1, 127, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+// ================================= Data ====================================\r
+\r
+void __interrupt __far KeyboardHandler()\r
+{\r
+ keycode=inp(0x60);\r
+ if (keycode>128)\r
+ key[keycode-128]=0;\r
+ else\r
+ {\r
+ key[keycode]=1;\r
+ last_pressed=keycode;\r
+ }\r
+ idlect=0;\r
+ outp(0x20,0x20);\r
+}\r
+\r
+void InitKeyboard()\r
+{\r
+ if (handlerinstalled) return;\r
+\r
+ biosKeyboardHandler=_dos_getvect(0x09);\r
+ _dos_setvect(0x09, KeyboardHandler);\r
+ handlerinstalled=1;\r
+}\r
+\r
+void ShutdownKeyboard()\r
+{\r
+ if (handlerinstalled)\r
+ _dos_setvect(0x09, biosKeyboardHandler);\r
+ handlerinstalled=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef KEYBOARD_INC\r
+#define KEYBOARD_INC\r
+\r
+extern char key[128],last_pressed;\r
+extern unsigned char key_ascii_tbl[128];\r
+extern unsigned char key_shift_tbl[128];\r
+\r
+extern void InitKeyboard();\r
+extern void ShutdownKeyboard();\r
+\r
+/* Constants for keyboard scan-codes */\r
+\r
+#define SCAN_ESC 0x01\r
+#define SCAN_1 0x02\r
+#define SCAN_2 0x03\r
+#define SCAN_3 0x04\r
+#define SCAN_4 0x05\r
+#define SCAN_5 0x06\r
+#define SCAN_6 0x07\r
+#define SCAN_7 0x08\r
+#define SCAN_8 0x09\r
+#define SCAN_9 0x0a\r
+#define SCAN_0 0x0b\r
+#define SCAN_MINUS 0x0c\r
+#define SCAN_EQUALS 0x0d\r
+#define SCAN_BACKSP 0x0e\r
+#define SCAN_TAB 0x0f\r
+#define SCAN_Q 0x10\r
+#define SCAN_W 0x11\r
+#define SCAN_E 0x12\r
+#define SCAN_R 0x13\r
+#define SCAN_T 0x14\r
+#define SCAN_Y 0x15\r
+#define SCAN_U 0x16\r
+#define SCAN_I 0x17\r
+#define SCAN_O 0x18\r
+#define SCAN_P 0x19\r
+#define SCAN_LANGLE 0x1a\r
+#define SCAN_RANGLE 0x1b\r
+#define SCAN_ENTER 0x1c\r
+#define SCAN_CTRL 0x1d\r
+#define SCAN_A 0x1e\r
+#define SCAN_S 0x1f\r
+#define SCAN_D 0x20\r
+#define SCAN_F 0x21\r
+#define SCAN_G 0x22\r
+#define SCAN_H 0x23\r
+#define SCAN_J 0x24\r
+#define SCAN_K 0x25\r
+#define SCAN_L 0x26\r
+#define SCAN_SCOLON 0x27\r
+#define SCAN_QUOTA 0x28\r
+#define SCAN_RQUOTA 0x29\r
+#define SCAN_LSHIFT 0x2a\r
+#define SCAN_BSLASH 0x2b\r
+#define SCAN_Z 0x2c\r
+#define SCAN_X 0x2d\r
+#define SCAN_C 0x2e\r
+#define SCAN_V 0x2f\r
+#define SCAN_B 0x30\r
+#define SCAN_N 0x31\r
+#define SCAN_M 0x32\r
+#define SCAN_COMA 0x33\r
+#define SCAN_DOT 0x34\r
+#define SCAN_SLASH 0x35\r
+#define SCAN_RSHIFT 0x36\r
+#define SCAN_GREY_STAR 0x37\r
+#define SCAN_ALT 0x38\r
+#define SCAN_SPACE 0x39\r
+#define SCAN_CAPS 0x3a\r
+#define SCAN_F1 0x3b\r
+#define SCAN_F2 0x3c\r
+#define SCAN_F3 0x3d\r
+#define SCAN_F4 0x3e\r
+#define SCAN_F5 0x3f\r
+#define SCAN_F6 0x40\r
+#define SCAN_F7 0x41\r
+#define SCAN_F8 0x42\r
+#define SCAN_F9 0x43\r
+#define SCAN_F10 0x44\r
+#define SCAN_NUMLOCK 0x45\r
+#define SCAN_SCRLOCK 0x46\r
+#define SCAN_HOME 0x47\r
+#define SCAN_UP 0x48\r
+#define SCAN_PGUP 0x49\r
+#define SCAN_GREY_MINUS 0x4a\r
+#define SCAN_LEFT 0x4b\r
+#define SCAN_PAD_5 0x4c\r
+#define SCAN_RIGHT 0x4d\r
+#define SCAN_GREY_PLUS 0x4e\r
+#define SCAN_END 0x4f\r
+#define SCAN_DOWN 0x50\r
+#define SCAN_PGDN 0x51\r
+#define SCAN_INSERT 0x52\r
+#define SCAN_DEL 0x53\r
+#define SCAN_F11 0x57\r
+#define SCAN_F12 0x58\r
+\r
+#endif // KEYBOARD_INC\r
--- /dev/null
+# Use the C or C++ compiler\r
+Compiler = wcc386\r
+\r
+# compiler options\r
+#comp = /oneatx /zp4 /5 /d0\r
+comp = /bt=dos /oneatx /5 /fp5 /wx /d0\r
+\r
+Linker_options = option stack=60000\r
+\r
+# Compile using dos4g or pmodew\r
+#System = dos4g\r
+System = pmodew\r
+\r
+Exe_file = maped.exe\r
+\r
+Objs = maped.obj config.obj gui.obj guicomp.obj mode13h.obj modex.obj keyboard.obj &\r
+ minimap.obj mouse.obj render.obj smalfont.obj ssaver.obj tileed.obj &\r
+ tilesel.obj timer.obj vdriver.obj columns.obj a_memory.obj mikmod.lib\r
+\r
+####################\r
+\r
+maped.exe : $(Objs)\r
+\r
+ *wlink system $(System) $(Linker_Options) name maped.exe &\r
+ file {$<}\r
+# *pmwlite -c4 maped.exe\r
+\r
+.c.obj:\r
+ $(Compiler) $(comp) $<\r
+\r
+.asm.obj:\r
+ wasm -3pr $<\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+const char *const ME2_VERSION = "2.01a";\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <vecna, may 14>\r
+// + erased valloc(), replaced with a_memory.c\r
+// + added Log() -- output to MAPED.LOG\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+\r
+#include "config.h"\r
+#include "gui.h"\r
+#include "keyboard.h"\r
+#include "mikmod.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "ssaver.h"\r
+#include "smalfont.h"\r
+#include "tilesel.h"\r
+#include "minimap.h"\r
+#include "guicomp.h"\r
+#include "config.h"\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+// Includes for a_memory.c\r
+\r
+void *valloc(int amount, char *desc, int owner);\r
+void *qvalloc(int amount);\r
+int vfree(void *pointer);\r
+void qvfree(void *pointer);\r
+void FreeByOwner(int owner);\r
+void MemReport(void);\r
+void CheckCorruption(void);\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ unsigned short start; // strand start\r
+ unsigned short finish; // strand end\r
+ unsigned short delay; // tile-switch delay\r
+ unsigned short mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+typedef struct\r
+{\r
+ char zonename[16]; // zone description\r
+ unsigned short int callevent; // event number to call\r
+ unsigned char percent; // chance (in 255) of event occurance\r
+ unsigned char delay; // step-delay before last occurance\r
+ unsigned char aaa; // accept adjacent activation\r
+ char savedesc[31]; // savegame description\r
+} oldzone;\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *moveofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct\r
+{\r
+ char t[200];\r
+} movescript;\r
+\r
+typedef struct\r
+{\r
+ unsigned short x; // xwc position\r
+ unsigned short y; // ywc position\r
+ unsigned char facing; // direction entity is facing\r
+ unsigned char moving; // direction entity is moving\r
+ unsigned char movcnt; // how far left to move in this tile\r
+ unsigned char framectr; // frame sequence counter\r
+ unsigned char specframe; // special-frame set thingo\r
+ unsigned char chrindex, movecode; // CHR index / movement pattern code\r
+ unsigned char activmode, obsmode; // activation mode, obstruction mode\r
+ unsigned char v1,v2,v3; // packing stuff.\r
+ unsigned int actscript, movescript; // script references\r
+ unsigned char speed, speedct; // entity speed, speedcount :)\r
+ unsigned short step, delay, // Misc data entries\r
+ data1, data2, // More misc data\r
+ data3, data4, // yet more crappy misc data.\r
+ delayct,adjactv; // yet more internal crap\r
+ unsigned short x1,y1,x2,y2; // bounding box coordinates\r
+ unsigned char curcmd, cmdarg; // Script commands/arguments\r
+ unsigned char *scriptofs; // offset in script parsing\r
+ unsigned char face,chasing, // face player when activated | chasing\r
+ chasespeed, chasedist; // chasing variables\r
+ unsigned short cx,cy; // current-tile pos (moving adjusted)\r
+ int expand1; // always room for improvement\r
+ char entitydesc[20]; // Editing description\r
+} oldent_r;\r
+\r
+zoneinfo zones[256]; // zone stuff.\r
+layer_r layer[6]; // Array of layer data\r
+vspanim_r vspanim[100]; // tile animation data\r
+unsigned short vadelay[100]; // Tile animation delay ctr\r
+oldzone tzone; // zone for oldmap-to-v2 converting\r
+entity_r entity[256]; // Entity records.\r
+oldent_r oldent; // entity for oldmap-to-v2 converting\r
+byte entities=0; // number of allocated entities.\r
+chrlist_r chrlist[100]; // Max. 100 CHRs per map.\r
+movescript ms[100]; // move scripts arrays\r
+byte nmchr=0; // number of active/loaded CHRs.\r
+byte nms=0; // number of movement scripts\r
+\r
+char mapname[60]; // MAP filename\r
+char vspname[60]; // VSP filemap\r
+char rstring[20]; // render-order string\r
+char musname[60]; // MAP default music\r
+char numlayers; // number of layers in map\r
+short xstart, ystart; // MAP start locations\r
+char *obstruct, *zone; // obstruction and zone buffers\r
+int numzones=0; // Number of active zones.\r
+unsigned short *layers[6]; // Raw layer data\r
+char wrap, soundokay=0;\r
+\r
+// -- vsp related data --\r
+\r
+unsigned short numtiles; // number of allocated tiles in VSP\r
+unsigned char *vsp; // VSP ptr\r
+char vsp_locked=0;\r
+char vsp_pw[8];\r
+\r
+// -- map compression\r
+\r
+char *cb,*csrc; // compression workspace buffer\r
+int bufsize; // how many bytes need to be written\r
+\r
+// -- editing related data --\r
+\r
+int xwin=0, ywin=0; // Editing viewplane\r
+short lt=0, rt=0; // left-button tile, right-button tile\r
+char curzone=0; // current zone.\r
+char scrollmode=0; // tile or pixel scroll modes.\r
+char mouse_scroll=1;\r
+char layertoggle[10]; // layer visible toggles\r
+char el=0; // current editing layer.\r
+char modified=0; // Current buffer modified or not.\r
+\r
+// -- music stuff --\r
+\r
+char is_playing=0;\r
+char cmname[60];\r
+UNIMOD *mf=0;\r
+\r
+// -- copy/paste & block fill --\r
+\r
+word *copybuf=0;\r
+int copybuf_wide=0,copybuf_deep=0;\r
+int selx1=0, sely1=0, selx2=0, sely2=0;\r
+int shifted=0, pasting=0;\r
+extern char curtrack;\r
+\r
+char vcedprog[80];\r
+byte* translucency_table; //zero\r
+\r
+int moving_up=0,moving_down=0,moving_left=0,moving_right=0; // aen\r
+\r
+// ================================= Code ====================================\r
+\r
+//added by zero\r
+void LoadTransTable()\r
+{\r
+ FILE *fp;\r
+\r
+ if (!translucency_table)\r
+ translucency_table=(byte *) valloc(65536,"trans tbl",0);\r
+\r
+ fp=fopen("trans.tbl","rb");\r
+ if (!fp)\r
+ {\r
+ vfree(translucency_table);\r
+ translucency_table=0;\r
+ return;\r
+ }\r
+\r
+ fread(translucency_table, 65536, 1, fp);\r
+ fclose(fp);\r
+}\r
+\r
+int Exist(char *fname)\r
+{ FILE *tempf;\r
+\r
+ tempf=fopen(fname,"rb");\r
+ if (tempf)\r
+ {\r
+ fclose(tempf);\r
+ return 1;\r
+ }\r
+ else return 0;\r
+}\r
+\r
+void err(char *str, ...)\r
+{\r
+ va_list argptr;\r
+ char msg[256];\r
+\r
+ va_start(argptr, str);\r
+ vsprintf(msg, str, argptr);\r
+ va_end(argptr);\r
+\r
+ ShutdownVideo();\r
+ ShutdownTimer();\r
+ ShutdownKeyboard();\r
+ //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
+ // Actually, Wat is by default case insensitive, so nyeh.;) <vec>\r
+ //if (curtrack != 1) //CD_Stop();\r
+\r
+ printf("%s \n",msg);\r
+ exit(-1);\r
+}\r
+\r
+void errf(char *str, char *str1)\r
+{\r
+ sprintf(strbuf,str,str1);\r
+ err(strbuf);\r
+}\r
+\r
+void errn(char *str, int n)\r
+{\r
+ sprintf(strbuf,str,n);\r
+ err(strbuf);\r
+}\r
+\r
+int random(int lo, int hi)\r
+{\r
+ int range=hi-lo+1;\r
+ int i=rand() % range;\r
+ return i+lo;\r
+}\r
+\r
+void PlayMusic(char *fname)\r
+{\r
+ if (!soundokay) return;\r
+ if (is_playing)\r
+ {\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+ is_playing=0;\r
+ }\r
+ mf=ML_LoadFN(fname);\r
+ if (!mf)\r
+ {\r
+ Message("Could not load specified music.",500);\r
+ return;\r
+ }\r
+ MP_Init(mf);\r
+ md_numchn=mf->numchn; mp_loop=1;\r
+ MD_PlayStart();\r
+ is_playing=1;\r
+}\r
+\r
+void StopMusic()\r
+{\r
+ if (!soundokay) return;\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+ is_playing=0;\r
+}\r
+\r
+void LoadVSP(char *fname)\r
+{ FILE *f;\r
+ short ver;\r
+\r
+ if (!(f=fopen(fname,"rb")))\r
+ errf("VSP file %s not found.",fname);\r
+\r
+ fread(&ver, 1, 2, f);\r
+ if (ver!=2 && ver!=3)\r
+ errf("VSP file %s is not the correct VSP format.",fname);\r
+ if (ver==2)\r
+ {\r
+ fread(&pal, 1, 768, f);\r
+ set_intensity(63);\r
+ fread(&numtiles, 1, 2, f);\r
+ vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
+ fread(vsp, 256, numtiles, f);\r
+ fread(&vspanim, 8, 100, f);\r
+ fclose(f);\r
+ }\r
+ if (ver==3)\r
+ {\r
+ fread(&pal, 1, 768, f);\r
+ set_intensity(63);\r
+ fread(&numtiles, 1, 2, f);\r
+ vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
+ fread(&bufsize, 1, 4, f);\r
+ ReadCompressedLayer1(vsp, 256*numtiles, f);\r
+ fread(&vspanim, 8, 100, f);\r
+ fclose(f);\r
+ }\r
+}\r
+\r
+void SaveVSP(char *fname)\r
+{ FILE *f;\r
+ short ver;\r
+\r
+ f=fopen(fname,"wb");\r
+ ver=3;\r
+ fwrite(&ver, 1, 2, f);\r
+ fwrite(&pal, 1, 768, f);\r
+ fwrite(&numtiles, 1, 2, f);\r
+ cb=(char *) valloc(numtiles*256, "vsp tempbuf", 0);\r
+ bufsize=0;\r
+ WriteCompressedLayer1(vsp, numtiles*256);\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ //free(bufsize); // what the hell??? @_@\r
+ fwrite(&vspanim, 8, 100, f);\r
+ fclose(f);\r
+}\r
+\r
+void EmitC (char c)\r
+{\r
+ *csrc=c;\r
+ csrc++;\r
+ bufsize++;\r
+}\r
+\r
+void EmitW (short int w)\r
+{\r
+ char *ptr;\r
+\r
+ ptr=(char *)&w;\r
+ *csrc=*ptr;\r
+ csrc++;\r
+ ptr++;\r
+ *csrc=*ptr;\r
+ csrc++;\r
+ bufsize+=2;\r
+}\r
+\r
+void WriteCompressedLayer1(unsigned char *p, int len)\r
+{ int i;\r
+ unsigned char byt,samect;\r
+ unsigned char repcode;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<254 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect==2 && byt != 0xFF) { EmitC(byt); }\r
+ if (samect==3 && byt != 0xFF) { EmitC(byt); EmitC(byt); }\r
+ if (samect>3 || byt == 0xFF)\r
+ {\r
+ repcode=0xFF;\r
+ EmitC(repcode);\r
+ repcode=(char) samect;\r
+ EmitC(repcode);\r
+ }\r
+ EmitC(byt);\r
+ } while (i<len);\r
+}\r
+\r
+void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f)\r
+{ int j,n;\r
+ unsigned char run;\r
+ unsigned char w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ fread(&w, 1, 1, f);\r
+ if (w==0xFF)\r
+ {\r
+ fread(&run, 1, 1, f);\r
+ fread(&w, 1, 1, f);\r
+ for (j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while (n<len);\r
+}\r
+\r
+void WriteCompressedLayer2(unsigned short *p,int len)\r
+{ int i;\r
+ unsigned short byt,samect;\r
+ unsigned char repcode;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<255 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1)\r
+ {\r
+ repcode=(char) samect;\r
+ EmitC(repcode);\r
+ repcode=0xFF;\r
+ EmitC(repcode);\r
+ }\r
+ EmitW(byt);\r
+ } while (i<len);\r
+}\r
+\r
+void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f)\r
+{ int j,n;\r
+ unsigned char run;\r
+ unsigned short w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ fread(&w, 1, 2, f);\r
+ if ((w & 0xFF00)==0xFF00)\r
+ {\r
+ run=(char) (w & 0x00FF);\r
+ fread(&w, 1, 2, f);\r
+ for (j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while (n<len);\r
+}\r
+\r
+void CountUsedZones()\r
+{ int i;\r
+\r
+ i=255;\r
+ while (i)\r
+ {\r
+ if (zones[i].script) break;\r
+ if (zones[i].percent) break;\r
+ if (zones[i].delay) break;\r
+ if (zones[i].aaa) break;\r
+ if (zones[i].entityscript) break;\r
+ if (strlen(zones[i].name)) break;\r
+ i--;\r
+ }\r
+ numzones=i+1;\r
+}\r
+\r
+void CountMoveScripts()\r
+{ int i;\r
+\r
+ i=99;\r
+ while (i)\r
+ {\r
+ if (strlen(ms[i].t)) break;\r
+ i--;\r
+ }\r
+ nms=i+1;\r
+}\r
+\r
+void CountCHRs()\r
+{ int i;\r
+\r
+ i=99;\r
+ while (i)\r
+ {\r
+ if (strlen(chrlist[i].t)) break;\r
+ i--;\r
+ }\r
+ nmchr=i+1;\r
+}\r
+\r
+void SaveMAP(char *fname)\r
+{ FILE *f;\r
+ int i, ofstbl[100], ct, t;\r
+\r
+ memcpy(strbuf, "MAPù5", 6);\r
+ f=fopen(fname, "wb");\r
+ fwrite(strbuf, 1, 6, f);\r
+ fwrite(strbuf, 1, 4, f);\r
+ fwrite(vspname, 1, 60, f);\r
+ fwrite(musname, 1, 60, f);\r
+ fwrite(rstring, 1, 20, f);\r
+ fwrite(&xstart, 1, 2, f);\r
+ fwrite(&ystart, 1, 2, f);\r
+ fwrite(&wrap, 1, 1, f);\r
+ fwrite(strbuf, 1, 50, f);\r
+ fwrite(&numlayers, 1, 1, f);\r
+ for (i=0; i<numlayers; i++)\r
+ fwrite(&layer[i], 1, 12, f);\r
+\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ cb=(char *) valloc(layer[i].sizex*layer[i].sizey*2,"cmprs buf", 0);\r
+ WriteCompressedLayer2(layers[i],(layer[i].sizex*layer[i].sizey));\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ vfree(cb);\r
+ }\r
+ // Compress and write Obstruction data\r
+\r
+ cb=(char *) valloc(layer[0].sizex*layer[0].sizey*2, "cmprs buf", 0);\r
+ WriteCompressedLayer1(obstruct, (layer[0].sizex*layer[0].sizey));\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ WriteCompressedLayer1(zone, (layer[0].sizex*layer[0].sizey));\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ vfree(cb);\r
+\r
+ CountUsedZones();\r
+ fwrite(&numzones, 1, 4, f);\r
+ fwrite(&zones, numzones, 50, f);\r
+\r
+ CountCHRs();\r
+ fwrite(&nmchr, 1, 1, f);\r
+ fwrite(&chrlist, 60, nmchr, f);\r
+\r
+ fwrite(&entities, 1, 1, f);\r
+ fwrite(&entity, sizeof(entity)/256, entities, f);\r
+\r
+ CountMoveScripts();\r
+ fwrite(&nms, 1, 1, f); // Calc offset buffer\r
+ ct=0;\r
+ for (i=0; i<nms; i++)\r
+ {\r
+ ofstbl[i]=ct;\r
+ t=strlen(&ms[i].t)+1;\r
+ ct+=t;\r
+ }\r
+ fwrite(&ct, 1, 4, f); // string table length\r
+ fwrite(&ofstbl, nms, 4, f); // write offset buffer\r
+ for (i=0; i<nms; i++) // write string table\r
+ {\r
+ fwrite(&ms[i].t, 1, strlen(&ms[i].t)+1, f);\r
+ }\r
+\r
+ ct=0; // 0 Things\r
+ fwrite(&ct, 1, 4, f);\r
+ ct=ftell(f);\r
+\r
+ i=1; fwrite(&i, 1, 4, f);\r
+ i=0; fwrite(&i, 1, 4, f);\r
+ i=1; fwrite(&i, 1, 4, f);\r
+ i=9; fwrite(&i, 1, 1, f);\r
+\r
+ fseek(f,6,0);\r
+ fwrite(&ct, 1, 4, f);\r
+ fclose(f);\r
+}\r
+\r
+void LoadOldMAP(FILE *f)\r
+{ int i, j, ct, ofstbl[100];\r
+ char pm,pd,pc,c;\r
+\r
+ // Reads a VERGE 1 format version 4 MAP file.\r
+ fseek(f, 1, 0);\r
+ fread(&vspname, 1, 13, f);\r
+ fread(&musname, 1, 13, f);\r
+ fread(&pc, 1, 1, f); // }\r
+ fread(&pm, 1, 1, f); // } Parallax controls\r
+ fread(&pd, 1, 1, f); // }\r
+ fread(strbuf, 1, 32, f); // unused - misc\r
+ fread(&xstart, 1, 2, f);\r
+ fread(&ystart, 1, 2, f);\r
+ fread(strbuf, 1, 2, f); // unused - misc\r
+ fread(&layer[0].sizex, 1, 2, f);\r
+ fread(&layer[0].sizey, 1, 2, f);\r
+ layer[1].sizex=layer[0].sizex;\r
+ layer[1].sizey=layer[0].sizey;\r
+ fread(strbuf, 1, 28, f); // unused - header pad\r
+\r
+ layers[0]=(unsigned short *) valloc((layer[0].sizex*(layer[0].sizey+1)*2)+2, "layer data", 0);\r
+ layers[1]=(unsigned short *) valloc((layer[1].sizex*(layer[1].sizey+1)*2)+2, "layer data", 1);\r
+ obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "obstruct map", 0);\r
+ zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
+ cb=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "comprs buf", 0);\r
+\r
+ fread(layers[0], 2, layer[0].sizex * layer[0].sizey, f);\r
+ fread(layers[1], 2, layer[1].sizex * layer[1].sizey, f);\r
+ fread(cb, 1, layer[0].sizex * layer[0].sizey, f);\r
+\r
+ // Convert MAP Properties layer to respective Zone and Obstruction layers\r
+\r
+ for (j=0; j<layer[0].sizey; j++)\r
+ for (i=0; i<layer[0].sizex; i++)\r
+ {\r
+ if ((cb[(j*layer[0].sizex)+i] & 1)==1)\r
+ c=1; else c=0;\r
+ obstruct[(j*layer[0].sizex)+i]=c;\r
+ c=cb[(j*layer[0].sizex)+i] >> 1;\r
+ zone[(j*layer[0].sizex)+i]=c;\r
+ }\r
+ vfree(cb);\r
+\r
+ // Load and convert zone data records.\r
+\r
+ for (i=0; i<128; i++)\r
+ {\r
+ fread(&tzone, 1, sizeof tzone, f);\r
+ zones[i].script=tzone.callevent;\r
+ zones[i].percent=tzone.percent;\r
+ zones[i].delay=tzone.delay;\r
+ zones[i].aaa=tzone.aaa;\r
+ zones[i].entityscript=0;\r
+ memcpy(zones[i].name, tzone.zonename, 16);\r
+ }\r
+\r
+ for (i=0; i<100; i++) // Load and convert CHR list\r
+ fread(&chrlist[i].t, 1, 13, f);\r
+// DoCHRdealy();\r
+\r
+ fread(&entities, 1, 1, f); fseek(f, 3, 1);\r
+ memset(&entity, 0, sizeof entity);\r
+ for (i=0; i<entities; i++) // Load and convert entity records\r
+ {\r
+ fread(&oldent, 1, 88, f);\r
+ entity[i].x=oldent.x;\r
+ entity[i].y=oldent.y;\r
+ entity[i].chrindex=oldent.chrindex-5;\r
+ entity[i].obsmode1=oldent.obsmode^1;\r
+ entity[i].obsmode2=1;\r
+ entity[i].movecode=oldent.movecode;\r
+ if (entity[i].movecode==3) entity[i].movecode=2;\r
+ else if (entity[i].movecode==2) entity[i].movecode=3;\r
+ entity[i].speed=oldent.speed;\r
+ entity[i].face=oldent.face;\r
+ entity[i].actm=oldent.activmode;\r
+ entity[i].movescript=oldent.movescript;\r
+ entity[i].step=oldent.step;\r
+ entity[i].delay=oldent.delay;\r
+ entity[i].data2=0;\r
+ entity[i].data3=0;\r
+ entity[i].data5=0;\r
+ entity[i].data6=0;\r
+ entity[i].actscript=oldent.actscript;\r
+ if (entity[i].movecode==2) entity[i].data2=oldent.data3;\r
+ if (entity[i].movecode==3)\r
+ {\r
+ entity[i].data2=oldent.x1;\r
+ entity[i].data3=oldent.y1;\r
+ entity[i].data5=oldent.x2;\r
+ entity[i].data6=oldent.y2;\r
+ }\r
+ memcpy(entity[i].desc, oldent.entitydesc, 20);\r
+ }\r
+\r
+ fread(&nms, 1, 1, f);\r
+ fread(&ct, 1, 4, f);\r
+ fread(&ofstbl, nms, 4, f);\r
+ ofstbl[nms]=ct;\r
+ for (i=0; i<nms; i++)\r
+ fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
+ fclose(f);\r
+\r
+ numlayers=2;\r
+ layertoggle[0]=1; layertoggle[1]=1; layertoggle[2]=0; layertoggle[3]=0;\r
+ layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
+ memcpy(rstring,"1E2",3);\r
+ switch (pc)\r
+ {\r
+ case 0:\r
+ case 1: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
+ case 2: layer[0].pmultx=pm; layer[0].pmulty=pm; layer[0].pdivx=pd; layer[0].pdivy=pd;\r
+ layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
+ case 3: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[1].pmultx=pm; layer[1].pmulty=pm; layer[1].pdivx=pd; layer[1].pdivy=pd; break;\r
+ }\r
+\r
+ LoadVSP(vspname);\r
+ sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
+ Message(strbuf,700);\r
+ Message("Old VERGE format 4 MAP loaded.",300);\r
+ if (strlen(musname))\r
+ PlayMusic(musname);\r
+}\r
+\r
+void LoadMAP(char *fname)\r
+{ FILE *f;\r
+ int i, ct, ofstbl[100];\r
+\r
+ memcpy(strbuf, "MAPù5", 6);\r
+ if (!(f=fopen(fname, "rb"))) errf("Could not find %s.",fname);\r
+ fread(strbuf, 1, 6, f);\r
+ if (strcmp(strbuf,"MAPù5"))\r
+ {\r
+ if (strbuf[0]==4)\r
+ {\r
+ LoadOldMAP(f);\r
+ return;\r
+ }\r
+ errf("%s is not a recognized MAP file.",fname);\r
+ }\r
+\r
+ fread(&i, 1, 4, f);\r
+ fread(vspname, 1, 60, f);\r
+ fread(musname, 1, 60, f);\r
+ fread(rstring, 1, 20, f);\r
+ fread(&xstart, 1, 2, f);\r
+ fread(&ystart, 1, 2, f);\r
+ fread(&wrap, 1, 1, f);\r
+ fread(strbuf, 1, 50, f);\r
+ fread(&numlayers, 1, 1, f);\r
+ for (i=0; i<numlayers; i++)\r
+ fread(&layer[i], 1, 12, f);\r
+\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ fread(&bufsize, 1, 4, f);\r
+ layers[i]=(unsigned short *) valloc(layer[i].sizex*(layer[i].sizey+2)*2, "layer data", i);\r
+ ReadCompressedLayer2(layers[i],(layer[i].sizex * layer[i].sizey),f);\r
+ layertoggle[i]=1;\r
+ }\r
+ while (i<10)\r
+ {\r
+ layertoggle[i]=0;\r
+ i++;\r
+ }\r
+ obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2),"obstruct map", 0);\r
+ zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
+\r
+ fread(&bufsize, 1, 4, f);\r
+ ReadCompressedLayer1(obstruct,(layer[0].sizex * layer[0].sizey), f);\r
+ fread(&bufsize, 1, 4, f);\r
+ ReadCompressedLayer1(zone,(layer[0].sizex * layer[0].sizey), f);\r
+\r
+ memset(&zones, 0, sizeof zones);\r
+ fread(&numzones, 1, 4, f);\r
+ fread(&zones, numzones, 50, f);\r
+\r
+ memset(&chrlist, 0, sizeof chrlist);\r
+ fread(&nmchr, 1, 1, f);\r
+ fread(&chrlist, 60, nmchr, f);\r
+// DoCHRdealy();\r
+\r
+ fread(&entities, 1, 1, f);\r
+ fread(&entity, sizeof(entity)/256, entities, f);\r
+\r
+ fread(&nms, 1, 1, f);\r
+ fread(&ct, 1, 4, f);\r
+ fread(&ofstbl, nms, 4, f);\r
+ ofstbl[nms]=ct;\r
+ for (i=0; i<nms; i++)\r
+ fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
+ fclose(f);\r
+\r
+ LoadVSP(vspname);\r
+ sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
+ Message(strbuf,700);\r
+ Message("V2 MAP loaded.",300);\r
+ if (strlen(musname))\r
+ PlayMusic(musname);\r
+}\r
+\r
+void InitTileIDX()\r
+{ short i;\r
+\r
+ memset(vadelay, 0, 200);\r
+ for (i=0; i<MAXTILES; i++)\r
+ tileidx[i]=i;\r
+}\r
+\r
+void CheckTimerStuff()\r
+{ static inss=0;\r
+\r
+ if (backupct>30000)\r
+ {\r
+ Message("Generating Auto-backup",150);\r
+ SaveMAP("$$BACKUP.MAP");\r
+ SaveVSP("$$BACKUP.VSP");\r
+ backupct=0;\r
+ }\r
+ if (idlect>8000 && !inss)\r
+ {\r
+ inss=1;\r
+ ScreenSaver();\r
+ idlect=0;\r
+ inss=0;\r
+ }\r
+}\r
+\r
+extern int difficulty;\r
+\r
+void SaveNewCFG()\r
+{ FILE *f;\r
+\r
+ f=fopen("maped.cfg","w");\r
+ //if (nocdaudio) fprintf(f,"nocdaudio\n");\r
+ fprintf(f,"vidmode %d \n", vm);\r
+ fprintf(f,"pad %d \n", pad);\r
+ fprintf(f,"scrollmode %d \n",scrollmode);\r
+ fprintf(f,"mouse_scroll %d \n",mouse_scroll&1); // aen\r
+ fprintf(f,"black %d \n",black);\r
+ fprintf(f,"white %d \n",brightw);\r
+ fprintf(f,"winbg %d \n",winbg);\r
+ fprintf(f,"shadow %d \n",darkw);\r
+ fprintf(f,"darkred %d \n",darkred);\r
+ fprintf(f,"titlebg %d \n",titlebg);\r
+ fprintf(f,"th %d \n", th);\r
+ fprintf(f,"mh %d \n", mh);\r
+ fprintf(f,"md_device %d \n", md_device==3?3:0);\r
+ fprintf(f,"amxofs %d \n",amxofs);\r
+ fprintf(f,"amyofs %d \n",amyofs);\r
+ fprintf(f,"mmxofs %d \n",mmxofs);\r
+ fprintf(f,"mmyofs %d \n",mmyofs);\r
+ fprintf(f,"cnxofs %d \n",cnxofs);\r
+ fprintf(f,"cnyofs %d \n",cnyofs);\r
+ fprintf(f,"lmxofs %d \n",lmxofs);\r
+ fprintf(f,"lmyofs %d \n",lmyofs);\r
+ fprintf(f,"lvxofs %d \n",lvxofs);\r
+ fprintf(f,"lvyofs %d \n",lvyofs);\r
+ fprintf(f,"mpxofs %d \n",mpxofs);\r
+ fprintf(f,"mpyofs %d \n",mpyofs);\r
+ fprintf(f,"vaxofs %d \n",vaxofs);\r
+ fprintf(f,"vayofs %d \n",vayofs);\r
+ fprintf(f,"zexofs %d \n",zexofs);\r
+ fprintf(f,"zeyofs %d \n",zeyofs);\r
+ fprintf(f,"exofs %d \n",exofs);\r
+ fprintf(f,"eyofs %d \n",eyofs);\r
+ fprintf(f,"prxofs %d \n",prxofs);\r
+ fprintf(f,"pryofs %d \n",pryofs);\r
+ fprintf(f,"rsxofs %d \n",rsxofs);\r
+ fprintf(f,"rsyofs %d \n",rsyofs);\r
+ fprintf(f,"vced %s \n",vcedprog);\r
+ fprintf(f,"difficulty %d \n",difficulty);\r
+ fclose(f);\r
+}\r
+\r
+#include "controls.c"\r
+\r
+void ShellToDOS()\r
+{\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ system("COMMAND.COM");\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellVERGE()\r
+{\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ system("VERGE");\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellMAP()\r
+{\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"verge %s",mapname);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellEditMAP()\r
+{\r
+ char fn[80],*p;\r
+\r
+ key[SCAN_ALT]=0;\r
+ key[SCAN_V]=0;\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(fn,"%s",mapname);\r
+ p=fn;\r
+ while (*p)\r
+ {\r
+ if (*p=='.') *p=0;\r
+ p++;\r
+ }\r
+ sprintf(strbuf,"%s %s.vc", vcedprog, fn);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellEditSystem()\r
+{\r
+ key[SCAN_ALT]=0;\r
+ key[SCAN_S]=0;\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"%s system.vc", vcedprog);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+char s[256];\r
+\r
+void CompileAll()\r
+{\r
+ FILE *f;\r
+ char *p;\r
+\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"vcc all q",mapname);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+\r
+ if (!(f=fopen("error.txt","r")))\r
+ {\r
+ Message("All VC scripts sucessfully compiled.",300);\r
+ return;\r
+ }\r
+\r
+ fgets(s,99,f);\r
+ fclose(f);\r
+ p=s;\r
+ while (*p)\r
+ {\r
+ if (*p==13 || *p==10) *p=0;\r
+ p++;\r
+ }\r
+ VCNotify(s);\r
+}\r
+\r
+void CompileMAP()\r
+{\r
+ FILE *f;\r
+ char *p;\r
+\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"vcc %s q",mapname);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+\r
+ if (!(f=fopen("error.txt","r"))) return;\r
+\r
+ fgets(s,99,f);\r
+ fclose(f);\r
+ p=s;\r
+ while (*p)\r
+ {\r
+ if (*p==13 || *p==10) *p=0;\r
+ p++;\r
+ }\r
+ VCNotify(s);\r
+}\r
+\r
+void tickhandler(void)\r
+{\r
+ MP_HandleTick();\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+void RenderHighlight()\r
+{ int zx, zy;\r
+ int xw, yw;\r
+\r
+ if (mh)\r
+ {\r
+ xw=xwin&15;\r
+ yw=ywin&15;\r
+ zx=((mx+xw)&~15)-xw;\r
+ zy=((my+yw)&~15)-yw;\r
+\r
+ DrawHighlight(zx-1, zy-1);\r
+ }\r
+}\r
+\r
+int EntityThere(int xw, int yw)\r
+{ int i;\r
+\r
+ for (i=0; i<entities; i++)\r
+ {\r
+ if (entity[i].x==xw && entity[i].y==yw) return i+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void AllocateEntity(int xw, int yw)\r
+{\r
+ memset(&entity[entities], 0, sizeof(entity) / 256);\r
+ entity[entities].x=xw;\r
+ entity[entities].y=yw;\r
+ entities++;\r
+}\r
+\r
+void ProcessEntity(int xw, int yw)\r
+{ int a;\r
+\r
+ a=EntityThere(xw,yw);\r
+ if (!a)\r
+ {\r
+ AllocateEntity(xw,yw);\r
+ while (mb)\r
+ ReadMouse(); // har! this was readmouse() @_@ <aen, apr 21>\r
+ mb=0;\r
+ return;\r
+ }\r
+ EntityEditor(a-1);\r
+}\r
+\r
+void DeleteEntity(int xw, int yw)\r
+{ int i,a;\r
+ char t[60];\r
+\r
+ a=EntityThere(xw,yw)-1;\r
+ sprintf(t,"Delete entity %d?",a);\r
+ if (!Confirm(t)) return;\r
+ for (i=a; i<entities; i++)\r
+ {\r
+ entity[i]=entity[i+1];\r
+ }\r
+ entities--;\r
+}\r
+\r
+int bxsize=130, bysize=170;\r
+int bxofs=80, byofs=25;\r
+int bmode=0;\r
+\r
+void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest)\r
+{ struct find_t *f;\r
+ char i, *d, mode;\r
+ char *blah;\r
+ int fc=0, ofs=0, cfs=0, a, b;\r
+ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ //int zx,zy,zw;\r
+ char dragging=0;\r
+\r
+ f=(struct find_t *) valloc(sizeof *f, "browse() tmp",0);\r
+ blah=(char *) valloc(13*256,"browse()tmp2", 0);\r
+ //memset(blah, 0, 13*256);\r
+ n++;\r
+\r
+ for (i=0; i<n; i++)\r
+ {\r
+ switch (i)\r
+ {\r
+ case 0: d="AJDLMMZZ.GAH"; mode=0xFF; break;\r
+ case 1: d=m1; mode=0xFF; break;\r
+ case 2: d=m2; mode=0xFF; break;\r
+ case 3: d=m3; mode=0xFF; break;\r
+ case 4: d=m4; mode=0xFF; break;\r
+ default: err("uhh..."); break;\r
+ }\r
+ if (_dos_findfirst(d, mode, f)) continue;\r
+ memcpy(blah+(fc*13), f->name, 13); fc++;\r
+ while (!_dos_findnext(f))\r
+ {\r
+ memcpy(blah+(fc*13), f->name, 13); fc++;\r
+ }\r
+ }\r
+ vfree(f);\r
+ last_pressed=0;\r
+ a=fc<22?117:2574/fc;\r
+// errn("%d",fc);\r
+ do\r
+ {\r
+ if (!bmode)\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+ }\r
+ else\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+ }\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ bxofs = (mx-mxo);\r
+ byofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (bxofs<16) bxofs = 16;\r
+ if (byofs<16) byofs = 16;\r
+ if (bxofs+bxsize>335) bxofs = 336-bxsize;\r
+ if (byofs+bysize>sy+16) byofs = (sy+16)-bysize;\r
+ }\r
+\r
+ Window(bxofs, byofs, bxofs+bxsize, byofs+bysize, "Browse");\r
+ Button(bxofs+65, byofs+157, "OK");\r
+ Button(bxofs+96, byofs+157, "Cancel");\r
+ FilledBox(bxofs+20, byofs+15, 80, 135, black);\r
+ FilledBox(bxofs+100, byofs+15, 10, 135, 2);\r
+ HLine(bxofs+20, byofs+15, 90, darkw);\r
+ VLine(bxofs+20, byofs+15, 135, darkw);\r
+ VLine(bxofs+99, byofs+16, 134, white);\r
+ VLine(bxofs+109, byofs+16, 134, white);\r
+ HLine(bxofs+21, byofs+149, 89, white);\r
+ stdwindow(bxofs+100, byofs+16, bxofs+109, byofs+25);\r
+ stdwindow(bxofs+100, byofs+140, bxofs+109, byofs+149);\r
+ b=byofs+24+(fc != 22 ? ((117-a)*ofs)/(fc-22) : 0);\r
+\r
+ //draws the drag box\r
+ stdwindow(bxofs+100, b, bxofs+109, b+a);\r
+\r
+ FilledBox(bxofs+21, byofs+((cfs-ofs)*6)+16, 78, 6, darkw);\r
+\r
+ // Render actual filename thingies\r
+ i=0;\r
+ while (1)\r
+ {\r
+ if (i+ofs<fc && i<22)\r
+ {\r
+ GotoXY(bxofs+22, byofs+17+(i*6));\r
+ printstring(blah+((i+ofs)*13));\r
+ }\r
+ else break;\r
+ i++;\r
+ }\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+\r
+ if(dragging&&!mb)\r
+ {\r
+ dragging=0;\r
+ }\r
+\r
+ if((mb==1&&mx>bxofs+100&&mx<bxofs+110&&my>byofs+25&&my<byofs+135)||dragging)\r
+ {\r
+ if(my>b&&my<b+a)\r
+ {\r
+ dragging=1;\r
+ }\r
+ else\r
+ {\r
+ if(my<b)\r
+ {\r
+ if (ofs<22) ofs=0;\r
+ else ofs-=22;\r
+ cfs=ofs;\r
+ }\r
+ if(my>b+a)\r
+ {\r
+ if (ofs+45>fc) ofs=fc-22;\r
+ else ofs+=22;\r
+ cfs=ofs;\r
+ }\r
+ }\r
+ }\r
+ if(!dragging)\r
+ {\r
+ if (mb==1 && mx>bxofs+20 && mx<bxofs+100 && my>byofs+15 && my<byofs+149)\r
+ {\r
+ i=(my-byofs-16)/6;\r
+ i+=ofs;\r
+ memcpy(dest,blah+(i*13),13);\r
+ done=1;\r
+ break;\r
+ }\r
+ if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+15 && my<byofs+25)\r
+ {\r
+ WaitRelease();\r
+ key[SCAN_UP]=1;\r
+ last_pressed=SCAN_UP;\r
+ }\r
+ if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+139 && my<byofs+149)\r
+ {\r
+ WaitRelease();\r
+ key[SCAN_DOWN]=1;\r
+ last_pressed=SCAN_DOWN;\r
+ }\r
+ if (mb==1 && mx>bxofs+65 && mx<bxofs+30+65 && my>byofs+157 && my<byofs+10+157 && !moving)\r
+ {\r
+ memcpy(dest, blah, 13); done=1;\r
+ ButtonPressed(bxofs+65, byofs+157, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>bxofs+96 && mx<bxofs+30+96 && my>byofs+157 && my<byofs+10+157 && !moving)\r
+ {\r
+ *dest=0; done=1;\r
+ ButtonPressed(bxofs+96, byofs+157, "Cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(bxofs+bxsize-9) && (mx<bxofs+bxsize-2)\r
+ && my>(byofs+1) && (my<byofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>bxofs && mx<bxofs+bxsize && my>byofs && my<(byofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-bxofs;\r
+ myo=my-byofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (key[SCAN_PGUP])\r
+ {\r
+ if (ofs<22) ofs=0;\r
+ else ofs-=22;\r
+ cfs=ofs;\r
+ key[SCAN_PGUP]=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_PGDN])\r
+ {\r
+ if (ofs+45>fc) ofs=fc-22;\r
+ else ofs+=22;\r
+ if (fc<22) ofs=0;\r
+ cfs=ofs;\r
+ key[SCAN_PGDN]=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ if (cfs) cfs--;\r
+ if (ofs>cfs) ofs--;\r
+ key[SCAN_UP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ if (cfs<fc-1) cfs++;\r
+ if (cfs-ofs>21) ofs++;\r
+ key[SCAN_DOWN]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ memcpy(dest,blah+(cfs*13),13);\r
+ key[SCAN_ENTER]=0;\r
+ done=1;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ }\r
+ } while (!done);\r
+ vfree(blah);\r
+}\r
+\r
+#include "vergepal.h"\r
+#define LOGFILE "maped.log"\r
+\r
+void Log(char *text, ...)\r
+{\r
+ va_list argptr;\r
+ char msg[256];\r
+ FILE *logf;\r
+\r
+ va_start(argptr, text);\r
+ vsprintf(msg, text, argptr);\r
+ va_end(argptr);\r
+\r
+ logf=fopen(LOGFILE,"aw");\r
+ fprintf(logf,"%s\n",msg);\r
+ fflush(logf);\r
+ fclose(logf);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+\r
+ remove(LOGFILE);\r
+ md_mixfreq=44100;\r
+ md_dmabufsize=5000;\r
+ md_mode=DMODE_16BITS|DMODE_STEREO;\r
+ md_device=0;\r
+ memset(&chrs, 0, sizeof chrs);\r
+\r
+ Log("GetConfig");\r
+ GetConfig("maped.cfg");\r
+ Log("LoadTransTbl");\r
+ translucency_table=0; //zero\r
+ LoadTransTable(); //zero\r
+\r
+ Log("RegisterModLoaders");\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_xm);\r
+ ML_RegisterLoader(&load_uni);\r
+\r
+ Log("RegisterSndDrivers");\r
+ MD_RegisterDriver(&drv_nos);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+ MD_RegisterPlayer(tickhandler);\r
+ soundokay=1;\r
+ Log("Initialize snd lib");\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+\r
+ //Log("Initialize CD audio");\r
+ //CD_Init();\r
+\r
+ Log("Initialize timer");\r
+ InitTimer();\r
+ Log("Initialize video");\r
+ InitVideo(vm);\r
+ Log("Initialize mouse");\r
+ InitMouse();\r
+ Log("Initialize keyboard IRQ handler");\r
+ InitKeyboard();\r
+\r
+ Log("Initializing map data");\r
+ if (argc==1 && !Exist("untitled.map"))\r
+ {\r
+ SetPalette(vergepal);\r
+ memcpy(pal, vergepal, 768);\r
+ memcpy(mapname,"UNTITLED.MAP",13);\r
+ memcpy(vspname,"UNTITLED.VSP",13);\r
+ memcpy(rstring,"1E",2);\r
+ numlayers=1;\r
+\r
+ // aen: default newmap dimensions set to 100x100\r
+ layer[0].pmultx=1; layer[0].pmulty=1;\r
+ layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[0].sizex=100; layer[0].sizey=100;\r
+ layer[0].trans=0; layer[0].hline=0;\r
+\r
+ layers[0]=(unsigned short *) valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
+ //memset(layers[0],0,(layer[0].sizex*layer[0].sizey)*2);\r
+ obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct map",0);\r
+ zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone map", 0);\r
+\r
+ // aen: default number of tiles set to 100\r
+ numtiles=100;\r
+ vsp=(char *) valloc(256 * numtiles,"vsp data", 0);\r
+ wrap=0; el=0; layertoggle[0]=1;\r
+ InitTileIDX();\r
+ }\r
+ else\r
+ {\r
+ if (argc==1) memcpy(mapname, "untitled.map",13);\r
+ else memcpy(mapname, argv[1], strlen(argv[1]));\r
+ LoadMAP(mapname);\r
+ InitTileIDX();\r
+ }\r
+Log("Entering main loop");\r
+thingy:\r
+ while (!(key[SCAN_ALT] && key[SCAN_X]))\r
+ {\r
+ ProcessControls();\r
+ while (tick)\r
+ {\r
+ tick--;\r
+ PollMovement();\r
+ }\r
+ RenderMap();\r
+ RenderHighlight();\r
+ RenderGUI();\r
+ ShowPage();\r
+ }\r
+ if (modified)\r
+ if (!Confirm("Lose unsaved changes?"))\r
+ {\r
+ key[SCAN_ALT]=0;\r
+ key[SCAN_X]=0;\r
+ goto thingy;\r
+ }\r
+\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ SaveNewCFG();\r
+ remove("$$BACKUP.MAP");\r
+ remove("$$BACKUP.VSP");\r
+\r
+ //if (curtrack != 1) CD_Stop();\r
+ //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
+ MD_PlayStop(); // Mordred\r
+ ML_Free(mf);\r
+\r
+ MD_Exit();\r
+ if (translucency_table)\r
+ vfree(translucency_table); //zero\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MAPED_INC\r
+#define MAPED_INC\r
+\r
+extern const char *const ME2_VERSION;\r
+\r
+#include <stdio.h>\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+typedef struct\r
+{\r
+ unsigned short start; // strand start\r
+ unsigned short finish; // strand end\r
+ unsigned short delay; // tile-switch delay\r
+ unsigned short mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *moveofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct {\r
+ char t[200];\r
+} movescript;\r
+\r
+extern layer_r layer[4];\r
+extern vspanim_r vspanim[100];\r
+extern zoneinfo zones[256];\r
+extern unsigned short vadelay[100];\r
+extern entity_r entity[256]; // Entity records.\r
+extern byte entities; // number of allocated entities.\r
+extern chrlist_r chrlist[100];\r
+extern byte nmchr;\r
+extern movescript ms[100]; // move scripts arrays\r
+extern byte nms; // number of movement scripts\r
+\r
+extern char *obstruct, *zone, curzone;\r
+extern char numlayers, wrap;\r
+extern unsigned short *layers[6];\r
+extern char rstring[20];\r
+extern char mapname[60], vspname[60];\r
+extern char musname[60];\r
+extern short xstart, ystart;\r
+\r
+// -- vsp related data --\r
+\r
+extern unsigned short numtiles;\r
+extern unsigned char *vsp;\r
+\r
+// -- editing related data --\r
+\r
+extern int xwin, ywin, bmode;\r
+extern char mouse_scroll;\r
+extern short lt, rt;\r
+extern char layertoggle[10], el, modified;\r
+\r
+extern word *copybuf;\r
+extern int copybuf_wide,copybuf_deep;\r
+extern int selx1, sely1, selx2, sely2;\r
+extern int shifted, pasting;\r
+\r
+extern int numzones; // Number of active zones.\r
+\r
+extern int moving_up,moving_down,moving_left,moving_right;\r
+\r
+extern void LoadTransTable();\r
+extern int Exist(char *fname);\r
+extern void err(char *str, ...);\r
+extern void errf(char *str, char *str1);\r
+extern void errn(char *str, int n);\r
+extern int random(int min, int max);\r
+extern void PlayMusic(char *fname);\r
+extern void StopMusic();\r
+extern void LoadVSP(char *fname);\r
+extern void SaveVSP(char *fname);\r
+extern void EmitC (char c);\r
+extern void EmitW (short int w);\r
+extern void WriteCompressedLayer1(unsigned char *p, int len);\r
+extern void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f);\r
+extern void WriteCompressedLayer2(unsigned short *p,int len);\r
+extern void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f);\r
+extern void CountUsedZones();\r
+extern void CountMoveScripts();\r
+extern void CountCHRs();\r
+extern void SaveMAP(char *fname);\r
+extern void LoadOldMAP(FILE *f);\r
+extern void LoadMAP(char *fname);\r
+extern void InitTileIDX();\r
+extern void CheckTimerStuff();\r
+extern void SaveNewCFG();\r
+extern void ShellToDOS();\r
+extern void ShellVERGE();\r
+extern void ShellMAP();\r
+extern void ShellEditMAP();\r
+extern void ShellEditSystem();\r
+extern void CompileAll();\r
+extern void CompileMAP();\r
+extern void tickhandler(void);\r
+extern void RenderHighlight();\r
+extern int EntityThere(int xw, int yw);\r
+extern void AllocateEntity(int xw, int yw);\r
+extern void ProcessEntity(int xw, int yw);\r
+extern void DeleteEntity(int xw, int yw);\r
+extern void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest);\r
+\r
+// Includes for a_memory.c\r
+\r
+void *valloc(int amount, char *desc, int owner);\r
+void *qvalloc(int amount);\r
+int vfree(void *pointer);\r
+void qvfree(void *pointer);\r
+void FreeByOwner(int owner);\r
+void MemReport(void);\r
+void CheckCorruption(void);\r
+\r
+#define free ERROR_YEAH_REPLACE_THIS_WITH_VFREE\r
+\r
+#endif // MAPED_INC\r
--- /dev/null
+/*\r
+\r
+Name:\r
+MIKMOD.C\r
+\r
+Description:\r
+Modplaying example of mikmod.\r
+\r
+MSDOS: BC(y) Watcom(y) DJGPP(y)\r
+Win95: BC(y*)\r
+Os2: y\r
+Linux: n\r
+\r
+* console mode only\r
+(y) - yes\r
+(n) - no (not possible or not useful)\r
+(?) - may be possible, but not tested\r
+\r
+*/\r
+#ifdef __WIN32__\r
+#include <windows.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <conio.h>\r
+#include <string.h>\r
+\r
+#ifndef __OS2__\r
+#include <dos.h>\r
+#endif\r
+\r
+#include "wildfile.h"\r
+#include "mikmod.h"\r
+\r
+char helptext[]=\r
+\r
+"Available switches (CaSe SeNsItIvE!):\n"\r
+"\n"\r
+" /d x use device-driver #x for output (0 is autodetect). Default=0\n"\r
+" /ld List all available device-drivers\n"\r
+" /ll List all available loaders\n"\r
+" /x disables protracker extended speed\n"\r
+" /p disables panning effects (9fingers.mod)\n"\r
+" /v xx Sets volume from 0 (silence) to 100. Default=100\n"\r
+" /f xxxx Sets mixing frequency. Default=44100\n"\r
+" /m Force mono output (so sb-pro can mix at 44100)\n"\r
+" /8 Force 8 bit output\n"\r
+" /i Use interpolated mixing\n"\r
+" /r Restart a module when it's done playing";\r
+\r
+\r
+/*\r
+ declarations for boring old sys-v style getopt *yawn*:\r
+*/\r
+int getopt(int argc, char *argv[], char *optionS);\r
+extern char *optarg;\r
+extern int optind;\r
+extern int opterr;\r
+\r
+\r
+void tickhandler(void)\r
+{\r
+ MP_HandleTick(); /* play 1 tick of the module */\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+\r
+int main(int argc,char *argv[])\r
+{\r
+ UNIMOD *mf;\r
+ int cmderr=0; /* error in commandline flag */\r
+ int morehelp=0; /* set if user wants more help */\r
+ int quit;\r
+ int t;\r
+ static int nargc;\r
+ static char **nargv;\r
+\r
+ puts(mikbanner);\r
+\r
+ /* Expand wildcards on commandline */\r
+\r
+ nargc=argc; nargv=argv;\r
+#ifndef __DJGPP__\r
+ MyGlob(&nargc,&nargv,0);\r
+#else\r
+ setvbuf(stdout, NULL, _IONBF, 0);\r
+ __djgpp_set_ctrl_c(0);\r
+#endif\r
+\r
+ /*\r
+ Initialize soundcard parameters.. you _have_ to do this\r
+ before calling MD_Init(), and it's illegal to change them\r
+ after you've called MD_Init()\r
+ */\r
+\r
+ md_mixfreq =44100; /* standard mixing freq */\r
+ md_dmabufsize =20000; /* standard dma buf size */\r
+ md_mode =DMODE_16BITS|DMODE_STEREO; /* standard mixing mode */\r
+ md_device =0; /* standard device: autodetect */\r
+\r
+ /*\r
+ Register the loaders we want to use..\r
+ */\r
+\r
+ ML_RegisterLoader(&load_m15); /* if you use m15load, register it as first! */\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_mtm);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_stm);\r
+ ML_RegisterLoader(&load_ult);\r
+ ML_RegisterLoader(&load_uni);\r
+ ML_RegisterLoader(&load_xm);\r
+\r
+ /*\r
+ Register the drivers we want to use:\r
+ */\r
+\r
+ MD_RegisterDriver(&drv_nos);\r
+#ifdef __OS2__\r
+ MD_RegisterDriver(&drv_os2);\r
+#elif defined(__WIN32__)\r
+ MD_RegisterDriver(&drv_w95);\r
+#else\r
+ MD_RegisterDriver(&drv_ss);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+#endif\r
+\r
+ MD_RegisterPlayer(tickhandler);\r
+\r
+ /* Parse option switches using standard getopt function: */\r
+\r
+ opterr=0;\r
+\r
+ while( !cmderr &&\r
+ (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){\r
+\r
+ switch(t){\r
+\r
+ case 'd':\r
+ md_device=atoi(optarg);\r
+ break;\r
+\r
+ case 'l':\r
+ if(optarg[0]=='d') MD_InfoDriver();\r
+ else if(optarg[0]=='l') ML_InfoLoader();\r
+ else{\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ exit(0);\r
+\r
+ case 'r':\r
+ mp_loop=1;\r
+ break;\r
+\r
+ case 'm':\r
+ md_mode&=~DMODE_STEREO;\r
+ break;\r
+\r
+ case '8':\r
+ md_mode&=~DMODE_16BITS;\r
+ break;\r
+\r
+ case 'i':\r
+ md_mode|=DMODE_INTERP;\r
+ break;\r
+\r
+ case 'x':\r
+ mp_extspd=0;\r
+ break;\r
+\r
+ case 'p':\r
+ mp_panning=0;\r
+ break;\r
+\r
+ case 'v':\r
+ if((mp_volume=atoi(optarg))>100) mp_volume=100;\r
+ break;\r
+\r
+ case 'f':\r
+ md_mixfreq=atol(optarg);\r
+ break;\r
+\r
+ case 'h':\r
+ morehelp=1;\r
+ cmderr=1;\r
+ break;\r
+\r
+ case '?':\r
+ puts("\07Invalid switch or option needs an argument\n");\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(cmderr || optind>=nargc){\r
+\r
+ /*\r
+ there was an error in the commandline, or there were no true\r
+ arguments, so display a usage message\r
+ */\r
+\r
+ puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");\r
+\r
+ if(morehelp)\r
+ puts(helptext);\r
+ else\r
+ puts("Type MIKMOD /h for more help.");\r
+\r
+ exit(-1);\r
+ }\r
+\r
+ /* initialize soundcard */\r
+\r
+ if(!MD_Init()){\r
+ printf("Driver error: %s.\n",myerr);\r
+ return 0;\r
+ }\r
+\r
+ printf("Using %s for %d bit %s %s sound at %u Hz\n\n",\r
+ md_driver->Name,\r
+ (md_mode&DMODE_16BITS) ? 16:8,\r
+ (md_mode&DMODE_INTERP) ? "interpolated":"normal",\r
+ (md_mode&DMODE_STEREO) ? "stereo":"mono",\r
+ md_mixfreq);\r
+\r
+#ifdef __OS2__\r
+ DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );\r
+#endif\r
+\r
+ for(quit=0; !quit && optind<nargc; optind++){\r
+\r
+ printf("File : %s\n",nargv[optind]);\r
+\r
+ /* load the module */\r
+\r
+ mf=ML_LoadFN(nargv[optind]);\r
+\r
+ /* didn't work -> exit with errormsg. */\r
+\r
+ if(mf==NULL){\r
+ printf("MikMod Error: %s\n",myerr);\r
+ break;\r
+ }\r
+\r
+ /* initialize modplayer to play this module */\r
+\r
+ MP_Init(mf);\r
+\r
+ printf( "Songname: %s\n"\r
+ "Modtype : %s\n"\r
+ "Periods : %s,%s\n",\r
+ mf->songname,\r
+ mf->modtype,\r
+ (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",\r
+ (mf->flags&UF_LINEAR) ? "Linear" : "Log");\r
+\r
+ /*\r
+ set the number of voices to use.. you\r
+ could add extra channels here (e.g. md_numchn=mf->numchn+4; )\r
+ to use for your own soundeffects:\r
+ */\r
+\r
+ md_numchn=mf->numchn;\r
+\r
+ /* start playing the module: */\r
+\r
+ MD_PlayStart();\r
+\r
+ while(!MP_Ready()){\r
+\r
+ char c;\r
+\r
+ c=kbhit() ? getch() : 0;\r
+\r
+ if(c=='+')\r
+ MP_NextPosition();\r
+ else if(c=='-')\r
+ MP_PrevPosition();\r
+ else if(c==0x1b){\r
+ quit=1;\r
+ break;\r
+ }\r
+ else if(c==' ') break;\r
+\r
+ MD_Update();\r
+\r
+ /* wait a bit */\r
+\r
+#if defined(__OS2__)\r
+ DosSleep(40); /* hmmmm */\r
+#elif defined(__WIN32__)\r
+ Sleep(10);\r
+#elif defined(__DJGPP__)\r
+ /* no wait for djgpp ? */\r
+#else\r
+ delay(10);\r
+#endif\r
+ printf("\rsngpos:%d patpos:%d sngspd %d bpm %d ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);\r
+ }\r
+\r
+ MD_PlayStop(); /* stop playing */\r
+ ML_Free(mf); /* and free the module */\r
+ puts("\n");\r
+ }\r
+\r
+ MD_Exit();\r
+ return 0;\r
+}\r
--- /dev/null
+#ifndef MIKMOD_H\r
+#define MIKMOD_H\r
+\r
+#include <stdio.h>\r
+#include "mtypes.h" /* include atomic mikmod types */\r
+\r
+\r
+#define mikbanner \\r
+"=======================================================================\n" \\r
+"MIKMOD v2.10 - Portable version - Programmed by MikMak of HaRDCoDE '95\n" \\r
+"=======================================================================\n" \\r
+"This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \\r
+"E-Mail : mikmak@stack.urc.tue.nl\n"\r
+\r
+\r
+/*\r
+ error variables:\r
+ ===============\r
+*/\r
+\r
+extern char *ERROR_ALLOC_STRUCT;\r
+extern char *ERROR_LOADING_PATTERN;\r
+extern char *ERROR_LOADING_TRACK;\r
+extern char *ERROR_LOADING_HEADER;\r
+extern char *ERROR_NOT_A_MODULE;\r
+extern char *ERROR_LOADING_SAMPLEINFO;\r
+extern char *ERROR_OUT_OF_HANDLES;\r
+extern char *ERROR_SAMPLE_TOO_BIG;\r
+extern char *myerr;\r
+\r
+\r
+\r
+#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)\r
+int _mm_fseek(FILE *stream,long offset,int whence);\r
+void _mm_setiobase(long iobase);\r
+long _mm_ftell(FILE *stream);\r
+\r
+\r
+extern SBYTE _mm_read_SBYTE (FILE *fp);\r
+extern UBYTE _mm_read_UBYTE (FILE *fp);\r
+\r
+extern SWORD _mm_read_M_SWORD (FILE *fp);\r
+extern SWORD _mm_read_I_SWORD (FILE *fp);\r
+\r
+extern UWORD _mm_read_M_UWORD(FILE *fp);\r
+extern UWORD _mm_read_I_UWORD(FILE *fp);\r
+\r
+extern SLONG _mm_read_M_SLONG (FILE *fp);\r
+extern SLONG _mm_read_I_SLONG (FILE *fp);\r
+\r
+extern ULONG _mm_read_M_ULONG(FILE *fp);\r
+extern ULONG _mm_read_I_ULONG(FILE *fp);\r
+\r
+extern int _mm_read_str(char *str, int size, FILE *fp);\r
+\r
+extern int _mm_read_SBYTES (SBYTE *buffer, int number, FILE *fp);\r
+extern int _mm_read_UBYTES (UBYTE *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+\r
+\r
+extern void _mm_write_SBYTE (SBYTE data,FILE *fp);\r
+extern void _mm_write_UBYTE (UBYTE data,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORD (SWORD data,FILE *fp);\r
+extern void _mm_write_I_SWORD (SWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORD (UWORD data,FILE *fp);\r
+extern void _mm_write_I_UWORD (UWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONG (SLONG data,FILE *fp);\r
+extern void _mm_write_I_SLONG (SLONG data,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONG (ULONG data,FILE *fp);\r
+extern void _mm_write_I_ULONG (ULONG data,FILE *fp);\r
+\r
+extern void _mm_write_SBYTES (SBYTE *data, int number,FILE *fp);\r
+extern void _mm_write_UBYTES (UBYTE *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORDS (SWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_SWORDS (SWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONGS (SLONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_SLONGS (SLONG *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp);\r
+\r
+\r
+/**************************************************************************\r
+****** Unitrack stuff: ****************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ prototypes:\r
+*/\r
+\r
+void UniSetRow(UBYTE *t);\r
+UBYTE UniGetByte(void);\r
+UBYTE *UniFindRow(UBYTE *t,UWORD row);\r
+void UniReset(void);\r
+void UniWrite(UBYTE data);\r
+void UniNewline(void);\r
+void UniInstrument(UBYTE ins);\r
+void UniNote(UBYTE note);\r
+void UniPTEffect(UBYTE eff,UBYTE dat);\r
+UBYTE *UniDup(void);\r
+void UniSkipOpcode(UBYTE op);\r
+BOOL UniInit(void);\r
+void UniCleanup(void);\r
+UWORD TrkLen(UBYTE *t);\r
+BOOL MyCmp(UBYTE *a,UBYTE *b,UWORD l);\r
+\r
+/*\r
+ all known effects:\r
+*/\r
+\r
+enum {\r
+ UNI_NOTE=1,\r
+ UNI_INSTRUMENT,\r
+ UNI_PTEFFECT0,\r
+ UNI_PTEFFECT1,\r
+ UNI_PTEFFECT2,\r
+ UNI_PTEFFECT3,\r
+ UNI_PTEFFECT4,\r
+ UNI_PTEFFECT5,\r
+ UNI_PTEFFECT6,\r
+ UNI_PTEFFECT7,\r
+ UNI_PTEFFECT8,\r
+ UNI_PTEFFECT9,\r
+ UNI_PTEFFECTA,\r
+ UNI_PTEFFECTB,\r
+ UNI_PTEFFECTC,\r
+ UNI_PTEFFECTD,\r
+ UNI_PTEFFECTE,\r
+ UNI_PTEFFECTF,\r
+ UNI_S3MEFFECTA,\r
+ UNI_S3MEFFECTD,\r
+ UNI_S3MEFFECTE,\r
+ UNI_S3MEFFECTF,\r
+ UNI_S3MEFFECTI,\r
+ UNI_S3MEFFECTQ,\r
+ UNI_S3MEFFECTT,\r
+ UNI_XMEFFECTA,\r
+ UNI_XMEFFECTG,\r
+ UNI_XMEFFECTH,\r
+ UNI_XMEFFECTP\r
+};\r
+\r
+\r
+/**************************************************************************\r
+****** mikmod types: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+/*\r
+ Sample format flags:\r
+*/\r
+\r
+#define SF_16BITS 1\r
+#define SF_SIGNED 2\r
+#define SF_DELTA 4\r
+#define SF_BIG_ENDIAN 8\r
+#define SF_LOOP 16\r
+#define SF_BIDI 32\r
+#define SF_OWNPAN 64\r
+#define SF_REVERSE 128\r
+\r
+\r
+/*\r
+ Envelope flags:\r
+*/\r
+\r
+#define EF_ON 1\r
+#define EF_SUSTAIN 2\r
+#define EF_LOOP 4\r
+\r
+\r
+/*\r
+ Unimod flags\r
+*/\r
+\r
+#define UF_XMPERIODS 1 /* if set use XM periods/finetuning */\r
+#define UF_LINEAR 2 /* if set use LINEAR periods */\r
+\r
+\r
+typedef struct ENVPT{\r
+ SWORD pos;\r
+ SWORD val;\r
+} ENVPT;\r
+\r
+\r
+typedef struct SAMPLE{\r
+ UWORD c2spd; /* finetune frequency */\r
+ SBYTE transpose; /* transpose value */\r
+ UBYTE volume; /* volume 0-64 */\r
+ UBYTE panning; /* panning */\r
+ ULONG length; /* length of sample (in samples!) */\r
+ ULONG loopstart; /* repeat position (relative to start, in samples) */\r
+ ULONG loopend; /* repeat end */\r
+ UWORD flags; /* sample format */\r
+ ULONG seekpos; /* seek position in file */\r
+ char *samplename; /* name of the sample */\r
+ SWORD handle; /* sample handle */\r
+} SAMPLE;\r
+\r
+\r
+typedef struct INSTRUMENT{\r
+ UBYTE numsmp;\r
+ UBYTE samplenumber[96];\r
+\r
+ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE volpts;\r
+ UBYTE volsus;\r
+ UBYTE volbeg;\r
+ UBYTE volend;\r
+ ENVPT volenv[12];\r
+\r
+ UBYTE panflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE panpts;\r
+ UBYTE pansus;\r
+ UBYTE panbeg;\r
+ UBYTE panend;\r
+ ENVPT panenv[12];\r
+\r
+ UBYTE vibtype;\r
+ UBYTE vibsweep;\r
+ UBYTE vibdepth;\r
+ UBYTE vibrate;\r
+\r
+ UWORD volfade;\r
+ char *insname;\r
+ SAMPLE *samples;\r
+} INSTRUMENT;\r
+\r
+\r
+/*\r
+ MikMod UNImod types:\r
+ ====================\r
+*/\r
+\r
+typedef struct UNIMOD{\r
+ UBYTE numchn; /* number of channels */\r
+ UWORD numpos; /* number of positions in this song */\r
+ UWORD reppos; /* restart position */\r
+ UWORD numpat; /* number of patterns in this song */\r
+ UWORD numtrk; /* number of tracks */\r
+ UWORD numins; /* number of samples */\r
+ UBYTE initspeed; /* */\r
+ UBYTE inittempo; /* */\r
+ UBYTE positions[256]; /* all positions */\r
+ UBYTE panning[32]; /* 32 panning positions */\r
+ UBYTE flags; /* */\r
+ char *songname; /* name of the song */\r
+ char *modtype; /* string type of module */\r
+ char *comment; /* module comments */\r
+ INSTRUMENT *instruments; /* all samples */\r
+ UWORD *patterns; /* array of PATTERN */\r
+ UWORD *pattrows; /* array of number of rows for each pattern */\r
+ UBYTE **tracks; /* array of pointers to tracks */\r
+} UNIMOD;\r
+\r
+\r
+/**************************************************************************\r
+****** Loader stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ loader structure:\r
+*/\r
+\r
+typedef struct LOADER{\r
+ struct LOADER *next;\r
+ char *type;\r
+ char *version;\r
+ BOOL (*Init)(void);\r
+ BOOL (*Test)(void);\r
+ BOOL (*Load)(void);\r
+ void (*Cleanup)(void);\r
+} LOADER;\r
+\r
+\r
+/*\r
+ public loader variables:\r
+*/\r
+\r
+extern UNIMOD of;\r
+extern FILE *modfp;\r
+extern UWORD finetune[16];\r
+\r
+\r
+/*\r
+ main loader prototypes:\r
+*/\r
+\r
+void ML_InfoLoader(void);\r
+void ML_RegisterLoader(LOADER *ldr);\r
+UNIMOD *ML_LoadFP(FILE *fp);\r
+UNIMOD *ML_LoadFN(char *filename);\r
+void ML_Free(UNIMOD *mf);\r
+\r
+\r
+/*\r
+ other loader prototypes: (used by the loader modules)\r
+*/\r
+\r
+BOOL InitTracks(void);\r
+void AddTrack(UBYTE *tr);\r
+BOOL ReadComment(UWORD len);\r
+BOOL AllocPatterns(void);\r
+BOOL AllocTracks(void);\r
+BOOL AllocInstruments(void);\r
+BOOL AllocSamples(INSTRUMENT *i);\r
+char *DupStr(char *s,UWORD len);\r
+void *MyMalloc(size_t size);\r
+void *MyCalloc(size_t nitems,size_t size);\r
+\r
+\r
+/*\r
+ Declare external loaders:\r
+*/\r
+extern LOADER load_uni;\r
+extern LOADER load_mod;\r
+extern LOADER load_m15;\r
+extern LOADER load_mtm;\r
+extern LOADER load_s3m;\r
+extern LOADER load_stm;\r
+extern LOADER load_ult;\r
+extern LOADER load_xm;\r
+\r
+\r
+/**************************************************************************\r
+****** Wavload stuff: *****************************************************\r
+**************************************************************************/\r
+\r
+SAMPLE *MW_LoadWavFP(FILE *fp);\r
+SAMPLE *MW_LoadWavFN(char *filename);\r
+void MW_FreeWav(SAMPLE *si);\r
+\r
+\r
+/**************************************************************************\r
+****** Driver stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ max. number of handles a driver has to provide. (not strict)\r
+*/\r
+\r
+#define MAXSAMPLEHANDLES 128\r
+\r
+\r
+/*\r
+ possible mixing mode bits:\r
+*/\r
+\r
+#define DMODE_STEREO 1\r
+#define DMODE_16BITS 2\r
+#define DMODE_INTERP 4\r
+\r
+\r
+/*\r
+ driver structure:\r
+*/\r
+\r
+typedef struct DRIVER{\r
+ struct DRIVER *next;\r
+ char *Name;\r
+ char *Version;\r
+ BOOL (*IsPresent) (void);\r
+ SWORD (*SampleLoad) (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+ void (*SampleUnLoad) (SWORD handle);\r
+ BOOL (*Init) (void);\r
+ void (*Exit) (void);\r
+ void (*PlayStart) (void);\r
+ void (*PlayStop) (void);\r
+ void (*Update) (void);\r
+ void (*VoiceSetVolume) (UBYTE voice,UBYTE vol);\r
+ void (*VoiceSetFrequency) (UBYTE voice,ULONG frq);\r
+ void (*VoiceSetPanning) (UBYTE voice,UBYTE pan);\r
+ void (*VoicePlay) (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+} DRIVER;\r
+\r
+\r
+/*\r
+ public driver variables:\r
+*/\r
+\r
+extern DRIVER *md_driver;\r
+extern UWORD md_device;\r
+extern UWORD md_mixfreq;\r
+extern UWORD md_dmabufsize;\r
+extern UWORD md_mode;\r
+extern UBYTE md_numchn;\r
+extern UBYTE md_bpm;\r
+extern void (*md_player)(void);\r
+\r
+/*\r
+ main driver prototypes:\r
+*/\r
+\r
+void MD_InfoDriver(void);\r
+void MD_RegisterDriver(DRIVER *drv);\r
+void MD_RegisterPlayer(void (*plr)(void));\r
+SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void MD_SampleUnLoad(SWORD handle);\r
+BOOL MD_Init(void);\r
+void MD_Exit(void);\r
+void MD_PlayStart(void);\r
+void MD_PlayStop(void);\r
+void MD_SetBPM(UBYTE bpm);\r
+void MD_Update(void);\r
+void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);\r
+void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void MD_VoiceSetPanning(UBYTE voice,ULONG pan);\r
+void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);\r
+void SL_Load(void *buffer,ULONG length);\r
+\r
+/*\r
+ Declare external drivers:\r
+*/\r
+\r
+extern DRIVER drv_gus; /* gravis ultrasound driver */\r
+extern DRIVER drv_sb; /* soundblaster DSP driver */\r
+extern DRIVER drv_ss; /* ensoniq soundscape driver */\r
+extern DRIVER drv_nos; /* nosound driver */\r
+extern DRIVER drv_raw; /* file output driver */\r
+extern DRIVER drv_w95; /* win95 driver */\r
+extern DRIVER drv_awe; /* experimental SB-AWE driver */\r
+extern DRIVER drv_vox; /* linux voxware driver */\r
+extern DRIVER drv_af; /* Dec Alpha AudioFile driver */\r
+extern DRIVER drv_sun; /* Sun driver */\r
+extern DRIVER drv_os2; /* Os2 driver */\r
+extern DRIVER drv_tim; /* timing driver */\r
+\r
+/**************************************************************************\r
+****** Player stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+typedef struct ENVPR{\r
+ UBYTE flg; /* envelope flag */\r
+ UBYTE pts; /* number of envelope points */\r
+ UBYTE sus; /* envelope sustain index */\r
+ UBYTE beg; /* envelope loop begin */\r
+ UBYTE end; /* envelope loop end */\r
+ SWORD p; /* current envelope counter */\r
+ UWORD a; /* envelope index a */\r
+ UWORD b; /* envelope index b */\r
+ ENVPT *env; /* envelope points */\r
+} ENVPR;\r
+\r
+\r
+typedef struct AUDTMP{\r
+ INSTRUMENT *i;\r
+ SAMPLE *s;\r
+\r
+ UWORD fadevol; /* fading volume */\r
+\r
+ ENVPR venv;\r
+ ENVPR penv;\r
+\r
+ UBYTE keyon; /* if true=key is pressed. */\r
+ UBYTE kick; /* if true=sample has to be restarted */\r
+ UBYTE sample; /* which sample number (0-31) */\r
+ SWORD handle; /* which sample-handle */\r
+\r
+ ULONG start; /* The start byte index in the sample */\r
+\r
+ UBYTE panning; /* panning position */\r
+ UBYTE pansspd; /* panslide speed */\r
+\r
+ SBYTE volume; /* amiga volume (0 t/m 64) to play the sample at */\r
+ UWORD period; /* period to play the sample at */\r
+\r
+ /* You should not have to use the values\r
+ below in the player routine */\r
+\r
+ SBYTE transpose;\r
+\r
+ UBYTE note; /* */\r
+\r
+ SWORD ownper;\r
+ SWORD ownvol;\r
+\r
+ UBYTE *row; /* row currently playing on this channel */\r
+\r
+ SBYTE retrig; /* retrig value (0 means don't retrig) */\r
+ UWORD c2spd; /* what finetune to use */\r
+\r
+ SBYTE tmpvolume; /* tmp volume */\r
+\r
+ UWORD tmpperiod; /* tmp period */\r
+ UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */\r
+\r
+ UWORD slidespeed; /* */\r
+ UWORD portspeed; /* noteslide speed (toneportamento) */\r
+\r
+ UBYTE s3mtremor; /* s3m tremor (effect I) counter */\r
+ UBYTE s3mtronof; /* s3m tremor ontime/offtime */\r
+\r
+ UBYTE s3mvolslide; /* last used volslide */\r
+\r
+ UBYTE s3mrtgspeed; /* last used retrig speed */\r
+ UBYTE s3mrtgslide; /* last used retrig slide */\r
+\r
+ UBYTE glissando; /* glissando (0 means off) */\r
+ UBYTE wavecontrol; /* */\r
+\r
+ SBYTE vibpos; /* current vibrato position */\r
+ UBYTE vibspd; /* "" speed */\r
+ UBYTE vibdepth; /* "" depth */\r
+\r
+ SBYTE trmpos; /* current tremolo position */\r
+ UBYTE trmspd; /* "" speed */\r
+ UBYTE trmdepth; /* "" depth */\r
+\r
+ UWORD soffset; /* last used sample-offset (effect 9) */\r
+} AUDTMP;\r
+\r
+\r
+extern AUDTMP mp_audio[32]; /* max eight channels */\r
+extern UBYTE mp_bpm; /* beats-per-minute speed */\r
+extern UWORD mp_patpos; /* current row number (0-63) */\r
+extern SWORD mp_sngpos; /* current song position */\r
+extern UWORD mp_sngspd; /* current songspeed */\r
+\r
+extern BOOL mp_loop;\r
+extern BOOL mp_panning;\r
+extern BOOL mp_extspd;\r
+extern UBYTE mp_volume;\r
+\r
+/*\r
+ player prototypes:\r
+*/\r
+\r
+int MP_Ready(void);\r
+void MP_NextPosition(void);\r
+void MP_PrevPosition(void);\r
+void MP_SetPosition(UWORD pos);\r
+void MP_HandleTick(void);\r
+void MP_Init(UNIMOD *m);\r
+\r
+\r
+/**************************************************************************\r
+****** Virtual channel stuff: *********************************************\r
+**************************************************************************/\r
+\r
+BOOL VC_Init(void);\r
+void VC_Exit(void);\r
+\r
+void VC_PlayStart(void);\r
+void VC_PlayStop(void);\r
+\r
+SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void VC_SampleUnload(SWORD handle);\r
+\r
+void VC_WriteSamples(SBYTE *buf,UWORD todo);\r
+UWORD VC_WriteBytes(SBYTE *buf,UWORD todo);\r
+void VC_SilenceBytes(SBYTE *buf,UWORD todo);\r
+\r
+void VC_VoiceSetVolume(UBYTE voice,UBYTE vol);\r
+void VC_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void VC_VoiceSetPanning(UBYTE voice,UBYTE pan);\r
+void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "config.h"\r
+#include "keyboard.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "vdriver.h"\r
+\r
+// ============================ Data ============================\r
+\r
+unsigned char mvsp[2048]; // mini-VSP dominant color\r
+int xoff=0, yoff=0; // x-offset, y-offset\r
+\r
+// ============================ Code ============================\r
+/*\r
+FindDominantColor(int i)\r
+{ unsigned char *src;\r
+ int j,tally=0;\r
+\r
+ // This is a cheap-ass method. I have a more proper method in mind, but\r
+ // I'm going to do this for now b/c I'm lazy. Actually, the real reason is\r
+ // speed.\r
+\r
+ src=vsp+(i*256);\r
+\r
+ for (j=0; j<256; j++)\r
+ {\r
+ tally+=*src;\r
+ src++;\r
+ }\r
+ tally=tally/256;\r
+ mvsp[i]=(unsigned char) tally;\r
+}\r
+*/\r
+\r
+void FindDominantColor(int i)\r
+{ unsigned char *src, tally[256], tab;\r
+ int j;\r
+\r
+ src=vsp+(i*256);\r
+ memset(&tally, 0, 256);\r
+\r
+ for (j=0; j<256; j++)\r
+ {\r
+ tally[*src]++;\r
+ src++;\r
+ }\r
+ tab=0;\r
+ for (j=0; j<256; j++)\r
+ {\r
+ if (tally[j] > tab) tab=j;\r
+ }\r
+ mvsp[i]=(unsigned char) tab;\r
+}\r
+\r
+void GenerateMiniVSP()\r
+{ int i;\r
+\r
+ for (i=0; i<numtiles; i++)\r
+ FindDominantColor(i);\r
+}\r
+\r
+void MiniMAP()\r
+{ char *ptr,c;\r
+ int _x,_y,ct;\r
+ int i;\r
+\r
+ GenerateMiniVSP();\r
+ ptr=(char *) valloc(layer[0].sizex*layer[0].sizey,"minimap",0);\r
+ //memset(ptr,0,layer[0].sizex*layer[0].sizey);\r
+\r
+ // Now we "draw" the tiles into the buffer.\r
+\r
+ for (i=0; i<4; i++)\r
+ {\r
+ if (!layertoggle[i]) continue;\r
+ ct=0;\r
+ for (_y=0; _y<layer[i].sizey; _y++)\r
+ for (_x=0; _x<layer[i].sizex; _x++)\r
+ {\r
+ c=(unsigned char) mvsp[layers[i][(_y*layer[i].sizex)+_x]];\r
+ if (layers[i][(_y*layer[i].sizex)+_x]) ptr[ct]=c;\r
+ ct++;\r
+ }\r
+ }\r
+\r
+ while (!key[SCAN_ESC] && !mb)\r
+ {\r
+ ClearScreen();\r
+ CCopySprite(16-xoff, 16-yoff, layer[0].sizex, layer[0].sizey, ptr);\r
+ ReadMouse();\r
+ HLine(mx, my, 20, white);\r
+ VLine(mx, my, ty, white);\r
+ VLine(mx+19, my, ty, white);\r
+ HLine(mx, my+ty, 20, white);\r
+\r
+ ShowPage();\r
+\r
+ if (key[SCAN_LEFT] && xoff)\r
+ {\r
+ if (xoff > 0) xoff-=16;\r
+ key[SCAN_LEFT]=0;\r
+ }\r
+ if (key[SCAN_UP] && yoff)\r
+ {\r
+ if (yoff > 0) yoff-=16;\r
+ key[SCAN_UP]=0;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ if (yoff < layer[0].sizey)\r
+ yoff+=16;\r
+ key[SCAN_DOWN]=0;\r
+ }\r
+ if (key[SCAN_RIGHT])\r
+ {\r
+ if (xoff < layer[0].sizex)\r
+ xoff+=16;\r
+ key[SCAN_RIGHT]=0;\r
+ }\r
+ if (mb)\r
+ {\r
+ xwin=(xoff+mx-16)*16;\r
+ ywin=(yoff+my-16)*16;\r
+ if (xwin>=(layer[0].sizex*16)-320) xwin=(layer[0].sizex*16)-320;\r
+ if (ywin>=(layer[0].sizey*16)-tsy-15) ywin=(layer[0].sizey*16)-tsy-15;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+ }\r
+ key[SCAN_ESC]=0;\r
+ vfree(ptr);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MINIMAP_INC\r
+#define MINIMAP_INC\r
+\r
+extern void FindDominantColor(int i);\r
+extern void GenerateMiniVSP();\r
+extern void MiniMAP();\r
+\r
+#endif // MINIMAP_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "mode13h.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+char *screenr; // realscr\r
+char startline=16; // virtual scroll around 240 vert. pixels\r
+extern unsigned char* translucency_table; //zero\r
+\r
+extern void *valloc(int amount, char*, int);\r
+extern int vfree(void *);\r
+extern void CheckTimerStuff(); // in maped.c\r
+\r
+// ================================= Code ====================================\r
+\r
+\r
+void SetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int Mode13hShutdown()\r
+{\r
+ SetMode(0x3);\r
+ vfree(screen);\r
+ screen=0;\r
+ return 0;\r
+}\r
+\r
+int Mode13hShowPage()\r
+{ int rows;\r
+ char *s,*d;\r
+\r
+ CheckTimerStuff();\r
+\r
+ s=screen+(16*tsx)+16;\r
+ d=screenr;\r
+ rows=sy;\r
+\r
+ for (; rows; rows--)\r
+ {\r
+ memcpy(d,s,sx);\r
+ s+=tsx;\r
+ d+=sx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ memcpy(d,src,width);\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+ char c;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+ char c;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ c=src[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopyTile(int x, int y, char *src)\r
+{ int h;\r
+ char *d;\r
+\r
+ h=16;\r
+ d=screen+(y*tsx)+x;\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d, src, 16);\r
+ src+=16;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hVLine(int x, int y, int length, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)\r
+ return 0;\r
+\r
+ if (y+length > cy2) length=cy2-y+1;\r
+ if (y<cy1) { length-=(cy1-y); y=cy1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; length; length--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hHLine(int x, int y, int width, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hFilledBox(int x, int y, int width, int height, char c)\r
+{\r
+ for (; height; height--,y++)\r
+ Mode13hHLine(x, y, width, c);\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hColorGrid(int x, int y, char c)\r
+{ char *d;\r
+\r
+ if (x<0 || x>336 || y<0 || y>256) return 0;\r
+ d=screen+(y*tsx)+x;\r
+ for (y=0; y<8; y++)\r
+ {\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx+1);\r
+\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx-1);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hClearScreen()\r
+{\r
+ memset(screen,0,76032);\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)\r
+{\r
+ int cx1,cy1,cx2,cy2;\r
+ unsigned char *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 1;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+ return 1;\r
+}\r
+\r
+void InitMode13h()\r
+{\r
+ SetMode(0x13);\r
+\r
+ screenr=(char *) 0xA0000;\r
+ screen=(char *) valloc(352*(216+16),"Screen",0);\r
+ //memset(screen,0,95744);\r
+\r
+ sx=320; sy=200;\r
+ tsx=352; tsy=216;\r
+ tx=20; ty=13;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo=&Mode13hShutdown;\r
+ ShowPage=&Mode13hShowPage;\r
+ CopySprite=&Mode13hCopySprite;\r
+ CCopySprite=&Mode13hCCopySprite;\r
+ TCCopySprite=&Mode13hTCCopySprite;\r
+ TCopySprite=&Mode13hTCopySprite;\r
+ CopyTile=&Mode13hCopyTile;\r
+ FilledBox=&Mode13hFilledBox;\r
+ VLine=&Mode13hVLine;\r
+ HLine=&Mode13hHLine;\r
+ ColorGrid=&Mode13hColorGrid;\r
+ ClearScreen=&Mode13hClearScreen;\r
+ CopySpriteLucentClip=&Mode13hCopySpriteLucentClip;\r
+\r
+ map_scroll_x =\r
+ map_scroll_y = 2;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MODE13H_INC\r
+#define MODE13H_INC\r
+\r
+extern void SetMode(int mode);\r
+extern int Mode13hShutdown();\r
+extern int Mode13hShowPage();\r
+extern int Mode13hCopySprite(int x, int y, int width, int height, char *src);\r
+extern int Mode13hCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int Mode13hTCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int Mode13hTCopySprite(int x, int y, int width, int height, char *src);\r
+extern int Mode13hCopyTile(int x, int y, char *src);\r
+extern int Mode13hVLine(int x, int y, int length, char color);\r
+extern int Mode13hHLine(int x, int y, int width, char color);\r
+extern int Mode13hFilledBox(int x, int y, int width, int height, char c);\r
+extern int Mode13hColorGrid(int x, int y, char c);\r
+extern int Mode13hClearScreen();\r
+extern int Mode13hCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src);\r
+extern void InitMode13h();\r
+\r
+#endif // MODE13H_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <conio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "mode13h.h" // SetMode()\r
+#include "modex.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#define SEQU_ADDR 0x3c4\r
+#define CRTC_ADDR 0x3d4\r
+#define MISC_OUTPUT 0x3c2\r
+\r
+char *screen1, *screen2; // page banks;\r
+char *screenx, curscr; // ptr to active page | page flip ctr\r
+char *screenbase; // ptr to A000:0000\r
+\r
+extern unsigned char* translucency_table; //zero\r
+\r
+extern void CheckTimerStuff();\r
+extern void *valloc(int amount,char*,int);\r
+extern int vfree(void *);\r
+\r
+// ================================= Code ====================================\r
+\r
+static void plane(char p)\r
+{\r
+ int hi=1<<p;\r
+ outpw(0x03c4, (hi<<8)|0x02);\r
+}\r
+\r
+extern void SetModeX(void);\r
+\r
+int ModeXShutdown()\r
+{\r
+ SetMode(0x3);\r
+ vfree(screen);\r
+ return 0;\r
+}\r
+\r
+int ModeXShowPage()\r
+{ char *s,*se,*d,*de;\r
+ int k;\r
+\r
+ CheckTimerStuff();\r
+\r
+ s=screen+(16*tsx)+16;\r
+ se=s+(sy*tsx);\r
+ d=screenx;\r
+\r
+ while (s<se)\r
+ {\r
+ for (k=0; k<4; k++)\r
+ {\r
+ plane(k);\r
+ de=d+(sx>>2);\r
+\r
+ while (d<de)\r
+ {\r
+ d[0]=s[k];\r
+ d[1]=s[k+4];\r
+ s+=8;\r
+ d+=2;\r
+ }\r
+\r
+ s-=sx;\r
+ d-=(sx>>2);\r
+ }\r
+\r
+ s+=tsx;\r
+ d+=(sx>>2);\r
+ }\r
+ return 0;\r
+}\r
+\r
+int ModeXCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ memcpy(d,src,width);\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXTCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+ char c;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXTCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+ char c;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ c=src[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXCopyTile(int x, int y, char *src)\r
+{ int h;\r
+ char *d;\r
+\r
+ h=16;\r
+ d=screen+(y*tsx)+x;\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d, src, 16);\r
+ src+=16;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXVLine(int x, int y, int length, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)\r
+ return 0;\r
+\r
+ if (y+length > cy2) length=cy2-y+1;\r
+ if (y<cy1) { length-=(cy1-y); y=cy1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; length; length--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXHLine(int x, int y, int width, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXFilledBox(int x, int y, int width, int height, char c)\r
+{\r
+ for (; height; height--,y++)\r
+ ModeXHLine(x, y, width, c);\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXColorGrid(int x, int y, char c)\r
+{ char *d;\r
+\r
+ if (x<0 || x>336 || y<0 || y>256) return 0;\r
+ d=screen+(y*tsx)+x;\r
+ for (y=0; y<8; y++)\r
+ {\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx+1);\r
+\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx-1);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXClearScreen()\r
+{\r
+ memset(screen,0,90117);\r
+ return 0;\r
+}\r
+\r
+int ModeXCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)\r
+{\r
+ int cx1,cy1,cx2,cy2;\r
+ unsigned char *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 1;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+ return 1;\r
+}\r
+\r
+\r
+void InitModeX()\r
+{ char in_byte;\r
+\r
+ SetMode(0x13);\r
+\r
+ outpw(SEQU_ADDR, 0x0604);\r
+ memset((unsigned char *)0xA0000, 0, 0x10000);\r
+ outpw(SEQU_ADDR, 0x0110);\r
+ outp(MISC_OUTPUT, 0xe3);\r
+ outpw(SEQU_ADDR, 0x0300);\r
+ outp(CRTC_ADDR, 0x11);\r
+ in_byte = inp((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outp((CRTC_ADDR+1), in_byte);\r
+ outpw(CRTC_ADDR, 0x0d06);\r
+ outpw(CRTC_ADDR, 0x3e07);\r
+ outpw(CRTC_ADDR, 0x4109);\r
+ outpw(CRTC_ADDR, 0xea10);\r
+ outpw(CRTC_ADDR, 0xac11);\r
+ outpw(CRTC_ADDR, 0xdf12);\r
+ outpw(CRTC_ADDR, 0x0014);\r
+ outpw(CRTC_ADDR, 0xe715);\r
+ outpw(CRTC_ADDR, 0x0616);\r
+ outpw(CRTC_ADDR, 0xe317);\r
+\r
+ //sx=320; sy=240;\r
+ //tsx=352; tsy=272;\r
+ //tx=20; ty=15;\r
+ //endcol=336; nextl=80;\r
+ //winofs=5632;\r
+\r
+ screenx=(char *) 0xA0000;\r
+ screen=(char *) valloc(352*(256+16),"screen",0);\r
+ //memset(screen,0,95744);\r
+ curscr=0;\r
+\r
+ sx=320; sy=240;\r
+ tsx=352; tsy=256;\r
+ tx=20; ty=15;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo=&ModeXShutdown;\r
+ ShowPage=&ModeXShowPage;\r
+ CopySprite=&ModeXCopySprite;\r
+ CCopySprite=&ModeXCCopySprite;\r
+ TCCopySprite=&ModeXTCCopySprite;\r
+ TCopySprite=&ModeXTCopySprite;\r
+ CopyTile=&ModeXCopyTile;\r
+ FilledBox=&ModeXFilledBox;\r
+ HLine=&ModeXHLine;\r
+ VLine=&ModeXVLine;\r
+ ColorGrid=&ModeXColorGrid;\r
+ ClearScreen=&ModeXClearScreen;\r
+ CopySpriteLucentClip=&ModeXCopySpriteLucentClip;\r
+\r
+ map_scroll_x =\r
+ map_scroll_y = 2;\r
+}\r
+\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MODEX_INC\r
+#define MODEX_INC\r
+\r
+extern int ModeXShutdown();\r
+extern int ModeXShowPage();\r
+extern int ModeXCopySprite(int x, int y, int width, int height, char *src);\r
+extern int ModeXCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int ModeXTCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int ModeXTCopySprite(int x, int y, int width, int height, char *src);\r
+extern int ModeXCopyTile(int x, int y, char *src);\r
+extern int ModeXVLine(int x, int y, int length, char color);\r
+extern int ModeXHLine(int x, int y, int width, char color);\r
+extern int ModeXFilledBox(int x, int y, int width, int height, char c);\r
+extern int ModeXColorGrid(int x, int y, char c);\r
+extern int ModeXClearScreen();\r
+extern int ModeXCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src);\r
+extern void InitModeX();\r
+\r
+#endif // MODEX_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <i86.h>\r
+#include <string.h>\r
+\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+extern char mousepic[]; // blah\r
+\r
+static union REGS regs;\r
+\r
+int mx=0,my=0,mb=0;\r
+int rb=0,wb=0;\r
+int lmx=0,lmy=0,lmb=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void PutMouse(int x, int y)\r
+{\r
+ lmx=mx; lmy=my; lmb=mb;\r
+ memset(®s, 0, sizeof regs);\r
+ regs.w.ax=4;\r
+ regs.w.cx=x*2;\r
+ regs.w.dx=y*2;\r
+ int386(0x33,®s,®s);\r
+\r
+ mx=x; my=y;\r
+}\r
+\r
+void InitMouse()\r
+{\r
+ memset(®s, 0, sizeof regs);\r
+ int386(0x33,®s,®s);\r
+\r
+ regs.w.ax=7;\r
+ regs.w.cx=0;\r
+ regs.w.dx=640; /*320;*/ /* -- ric:13/Jun/98 - fix horizontal jumps -- */\r
+ int386(0x33,®s,®s);\r
+\r
+ regs.w.ax=8;\r
+ regs.w.cx=0;\r
+ regs.w.dx=sy; // aen\r
+ int386(0x33,®s,®s);\r
+\r
+ PutMouse(sx/2,(sy/2) /2); // aen\r
+}\r
+\r
+void ReadMouse()\r
+{\r
+ lmx=mx; lmy=my; lmb=mb;\r
+ memset(®s, 0, sizeof regs);\r
+ regs.w.ax=3;\r
+ int386(0x33,®s,®s);\r
+\r
+ mx=((regs.w.cx)>>1)+16; /* -- ric:13/Jun/98 - fix horizontal jumps -- */\r
+ my=(regs.w.dx)+16;\r
+ rb=regs.w.bx;\r
+\r
+ if (rb && wb) { mb=0; return; }\r
+ if (wb && !rb) wb=0;\r
+ mb=rb;\r
+\r
+ if ((lmx!=mx) || (lmy!=my) || (lmb!=mb)) idlect=0;\r
+}\r
+\r
+void DrawMouse()\r
+{\r
+ ReadMouse();\r
+ TCopySprite(mx,my,4,5,mousepic);\r
+}\r
+\r
+void WaitRelease()\r
+{\r
+ wb=1;\r
+ mb=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MOUSE_INC\r
+#define MOUSE_INC\r
+\r
+extern int mx,my,mb;\r
+extern int rb,wb;\r
+extern int lmx,lmy,lmb;\r
+\r
+extern void PutMouse(int x, int y);\r
+extern void InitMouse();\r
+extern void ReadMouse();\r
+extern void DrawMouse();\r
+extern void WaitRelease();\r
+\r
+#endif // MOUSE_INC\r
--- /dev/null
+#ifndef MTYPES_H\r
+#define MTYPES_H\r
+\r
+/*\r
+ MikMod atomic types:\r
+ ====================\r
+*/\r
+\r
+\r
+#ifdef __OS2__\r
+\r
+typedef signed char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+/* ULONG and BOOL are already defined in OS2.H */\r
+\r
+#elif defined(__alpha)\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+/* long is 8 bytes on dec alpha - RCA */\r
+typedef int SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned int ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#else\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned long ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#endif\r
+\r
+\r
+#ifdef __OS2__\r
+#define INCL_DOS\r
+#define INCL_MCIOS2\r
+#define INCL_MMIOOS2\r
+#include <os2.h>\r
+#include <os2me.h>\r
+#include <mmio.h>\r
+#endif\r
+\r
+\r
+#ifdef __WATCOMC__\r
+#define inportb(x) inp(x)\r
+#define outportb(x,y) outp(x,y)\r
+#define inport(x) inpw(x)\r
+#define outport(x,y) outpw(x,y)\r
+#define disable() _disable()\r
+#define enable() _enable()\r
+#endif\r
+\r
+\r
+#ifdef __DJGPP__\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+#include <pc.h>\r
+#define inp inportw\r
+#define outport outportw\r
+#define inport inportw\r
+#define interrupt \r
+#endif\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include "timer.h"\r
+#include "vga.h"\r
+\r
+char manufacturer; // pcx header\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+short int xmin,ymin;\r
+short int xmax,ymax;\r
+short int hres;\r
+short int vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+short int bytes_per_line;\r
+short int palette_type;\r
+char filler[58];\r
+\r
+unsigned short int width,depth;\r
+unsigned short int bytes, i;\r
+unsigned char c, run, ss=0;\r
+unsigned int vidoffset, n=0;\r
+FILE *pcxf;\r
+\r
+void ReadPCXLine(unsigned char *dest)\r
+{ int j;\r
+ n=0;\r
+\r
+ do {\r
+ c=fgetc(pcxf) & 0xff;\r
+ if ((c & 0xc0)==0xc0) {\r
+ run=c & 0x3f;\r
+ c=fgetc(pcxf);\r
+ for (j=0; j<run; j++)\r
+ dest[vidoffset+n+j]=c;\r
+ n+=run; }\r
+ else { dest[vidoffset+n]=c;\r
+ n++; }\r
+ } while (n<bytes);\r
+ fread(strbuf, 1, bytes_per_line-width, pcxf);\r
+}\r
+\r
+void LoadPCXHeader(char *fname)\r
+{\r
+ if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ fseek(pcxf,-768L,SEEK_END);\r
+ fread(pal,1,768,pcxf);\r
+ fseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+ set_intensity(63);\r
+}\r
+\r
+void LoadPCXHeaderNP(char *fname)\r
+{\r
+ if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+}\r
+\r
+void loadpcx(char *fname, char *dest)\r
+{\r
+ LoadPCXHeader(fname);\r
+\r
+ for (i=0; i<depth; i++)\r
+ { vidoffset=5648+(i*352);\r
+ ReadPCXLine(dest); }\r
+\r
+ fclose(pcxf);\r
+}\r
+\r
+void WritePCXLine(unsigned char *p)\r
+{ int i;\r
+ unsigned char byte,samect,repcode;\r
+\r
+ i=0;\r
+ do\r
+ { byte=p[i++];\r
+ samect=1;\r
+ while (samect<(unsigned) 63 && i<320 && byte==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1 || (byte & 0xC0) != 0)\r
+ {\r
+ repcode=0xC0 | samect;\r
+ fwrite(&repcode,1,1,pcxf);\r
+ }\r
+ fwrite(&byte,1,1,pcxf);\r
+ } while (i<320);\r
+}\r
+\r
+void WritePalette()\r
+{ char b;\r
+ int i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] << 2;\r
+\r
+ b=12; fwrite(&b, 1, 1, pcxf);\r
+ fwrite(pal, 1, 768, pcxf);\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+}\r
+\r
+void ScreenShot()\r
+{ unsigned char b1;\r
+ unsigned short int w1;\r
+ char fnamestr[13];\r
+\r
+ // Takes a snapshot of the current screen.\r
+\r
+ dec_to_asciiz(ss,&fnamestr);\r
+ b1=strlen(&fnamestr);\r
+ fnamestr[b1++]='.';\r
+ fnamestr[b1++]='P';\r
+ fnamestr[b1++]='C';\r
+ fnamestr[b1++]='X';\r
+ fnamestr[b1++]=0;\r
+\r
+ pcxf=fopen(&fnamestr,"wb");\r
+ ss++;\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=319; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+ w1=199; fwrite(&w1, 1, 2, pcxf); // ymax = 199;\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w1=200; fwrite(&w1, 1, 2, pcxf); // vres = 200;\r
+\r
+ fwrite(virscr,1,48,pcxf); // 16-color palette data. Who knows what's\r
+ // actually in here. It doesn't matter since\r
+ // the 256-color palette is stored elsewhere.\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(virscr, 1, 59, pcxf); // filler\r
+\r
+ for (w1=0; w1<200; w1++)\r
+ WritePCXLine(screen+(w1*320));\r
+\r
+ WritePalette();\r
+ fclose(pcxf);\r
+ timer_count=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "config.h"\r
+#include "maped.h"\r
+#include "vdriver.h"\r
+\r
+#include "render.h" // MAXTILES\r
+\r
+// ================================= Data ====================================\r
+\r
+extern char stipple[256];\r
+\r
+int oxw=0, oyw=0;\r
+int xofs=0, yofs=0;\r
+int xtc=0, ytc=0;\r
+\r
+char curlayer=0;\r
+short tileidx[MAXTILES];\r
+char flipped[MAXTILES];\r
+\r
+// ------\r
+\r
+chri chrs[100];\r
+\r
+// ================================= Code ====================================\r
+\r
+void DoCHR(int i) // hee hee!\r
+{\r
+ FILE *f;\r
+ char b;\r
+ int q;\r
+ short numframes;\r
+\r
+// free(chrs[i].frame);\r
+// chrs[i].frame=0;\r
+// return;\r
+\r
+ if (!strlen(chrlist[i].t))\r
+ {\r
+ if (chrs[i].frame) vfree(chrs[i].frame);\r
+ chrs[i].frame=0;\r
+ chrs[i].fx=chrs[i].fy=0;\r
+ chrs[i].hx=chrs[i].hy=0;\r
+ return;\r
+ }\r
+ if (!(f=fopen(chrlist[i].t,"rb")))\r
+ {\r
+ if (chrs[i].frame) vfree(chrs[i].frame);\r
+ chrs[i].frame=0;\r
+ chrs[i].fx=chrs[i].fy=0;\r
+ chrs[i].hx=chrs[i].hy=0;\r
+ return;\r
+ }\r
+ if (chrs[i].frame) vfree(chrs[i].frame);\r
+ fread(&b, 1, 1, f);\r
+ if (b!=2)\r
+ {\r
+ // This should really not work with V1 CHRs, but..\r
+ chrs[i].frame=(char *) malloc(512);\r
+ fseek(f, 0, 0);\r
+ fread(chrs[i].frame, 1, 512, f);\r
+ fclose(f);\r
+ chrs[i].fx=16; chrs[i].fy=32;\r
+ chrs[i].hx=0; chrs[i].hy=16;\r
+ return;\r
+ }\r
+ chrs[i].fx=0; fread(&chrs[i].fx, 1, 2, f);\r
+ chrs[i].fy=0; fread(&chrs[i].fy, 1, 2, f);\r
+ chrs[i].hx=0; fread(&chrs[i].hx, 1, 2, f);\r
+ chrs[i].hy=0; fread(&chrs[i].hy, 1, 2, f);\r
+ fread(strbuf, 2, 2, f);\r
+ fread(&numframes, 1, 2, f);\r
+ chrs[i].frame=(char *) valloc(chrs[i].fx*chrs[i].fy*numframes,"chr preview",i);\r
+ fread(&q, 1, 4, f);\r
+\r
+ ReadCompressedLayer1(chrs[i].frame, chrs[i].fx*chrs[i].fy*numframes,f);\r
+\r
+ fclose(f);\r
+}\r
+\r
+void DoCHRdealy()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<100; i++)\r
+ DoCHR(i);\r
+}\r
+\r
+void BlitBackLayer(char l)\r
+{\r
+ int i,j;\r
+ //int a;\r
+ char *img;\r
+ //char *d;\r
+ unsigned short *lay;\r
+ //int v;\r
+ int mapx,mapy;\r
+ int x,y;\r
+ unsigned int tile;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ mapx = layer[l].sizex;\r
+ mapy = layer[l].sizey;\r
+ lay = layers[l];\r
+\r
+ // Adjust view\r
+ oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
+ oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
+ xofs = 16 - (oxw & 15);\r
+ yofs = 16 - (oyw & 15);\r
+ xtc = oxw / 16;\r
+ ytc = oyw / 16;\r
+\r
+ // Draw it, bitch!\r
+ for (i=0; i <= ty; i++)\r
+ {\r
+ for (j=0; j <= tx; j++)\r
+ {\r
+ x = xtc+j;\r
+ y = ytc+i;\r
+\r
+ // write better clipping sometime\r
+ if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
+ {\r
+ // what the HELL @_@\r
+ tile = lay[(y * mapx) + x];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+ tile = tileidx[tile];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+\r
+ img = &vsp[tile * 256];\r
+\r
+ x = (j * 16) + xofs;\r
+ y = (i * 16) + yofs;\r
+\r
+ //CopyTile(x, y, img);\r
+ CCopySprite(x, y, 16, 16, img);\r
+ }\r
+ }\r
+ }\r
+\r
+ curlayer++;\r
+}\r
+\r
+//zero\r
+extern char* translucency_table;\r
+void LucentBlitLayer(char l)\r
+{\r
+ int i,j;\r
+ //int a,b;\r
+ char *img;\r
+ //char *d;\r
+ unsigned short *lay;\r
+ //int v;\r
+ int mapx,mapy;\r
+ int x,y;\r
+ unsigned int tile;\r
+\r
+ if (!layertoggle[l]) return;\r
+ if(!translucency_table)\r
+ {\r
+ TransBlitlayer(l);\r
+ return;\r
+ }\r
+\r
+ mapx = layer[l].sizex;\r
+ mapy = layer[l].sizey;\r
+ lay = layers[l];\r
+\r
+ // Adjust view\r
+ oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
+ oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
+ xofs = 16 - (oxw & 15);\r
+ yofs = 16 - (oyw & 15);\r
+ xtc = oxw / 16;\r
+ ytc = oyw / 16;\r
+\r
+ // Draw it, bitch!\r
+ for (i=0; i <= ty; i++)\r
+ {\r
+ for (j=0; j <= tx; j++)\r
+ {\r
+ x = xtc+j;\r
+ y = ytc+i;\r
+\r
+ // write better clipping sometime\r
+ if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
+ {\r
+ // what the HELL @_@\r
+ tile = lay[(y * mapx) + x];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+ tile = tileidx[tile];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+\r
+ img = &vsp[tile * 256];\r
+ if (img != vsp)\r
+ {\r
+ x = (j * 16) + xofs;\r
+ y = (i * 16) + yofs;\r
+ CopySpriteLucentClip(x, y, 16, 16, img);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+\r
+void TransBlitlayer(char l)\r
+{\r
+ int i,j;\r
+ //int a,b;\r
+ char *img;\r
+ //char *d;\r
+ unsigned short *lay;\r
+ //int v;\r
+ int mapx,mapy;\r
+ int x,y;\r
+ unsigned int tile;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ lay = layers[l];\r
+\r
+ mapx = layer[l].sizex;\r
+ mapy = layer[l].sizey;\r
+\r
+ // Adjust view\r
+ oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
+ oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
+ xofs = 16 - (oxw & 15);\r
+ yofs = 16 - (oyw & 15);\r
+ xtc = oxw / 16;\r
+ ytc = oyw / 16;\r
+\r
+ // Draw it, bitch!\r
+ for (i=0; i <= ty; i++)\r
+ {\r
+ for (j=0; j <= tx; j++)\r
+ {\r
+ x = xtc+j;\r
+ y = ytc+i;\r
+\r
+ // write better clipping sometime\r
+ if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
+ {\r
+ // what the HELL @_@\r
+ tile = lay[(y * mapx) + x];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+ tile = tileidx[tile];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+\r
+ img = &vsp[tile * 256];\r
+ if (img != vsp)\r
+ {\r
+ x = (j * 16) + xofs;\r
+ y = (i * 16) + yofs;\r
+ //TCopySprite(x, y, 16, 16, img);\r
+ TCCopySprite(x, y, 16, 16, img);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ curlayer++;\r
+}\r
+\r
+void BlitLayer(char c)\r
+{\r
+ if(layer[c].trans) { LucentBlitLayer(c); return; } //zero\r
+ if (curlayer) TransBlitLayer(c);\r
+ else BlitBackLayer(c);\r
+}\r
+\r
+void DrawObstructions()\r
+{ int i,j;\r
+ int mapx;\r
+\r
+ mapx = layer[0].sizex;\r
+\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=16-(oxw&15);\r
+ yofs=16-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ if (obstruct[((ytc+i)*mapx)+(xtc+j)])\r
+ {\r
+ TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
+ //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
+ }\r
+ }\r
+}\r
+\r
+void DrawZones()\r
+{ int i,j;\r
+ char z;\r
+ int mapx;\r
+\r
+ mapx = layer[0].sizex;\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=16-(oxw&15);\r
+ yofs=16-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ z=zone[((ytc+i)*mapx)+(xtc+j)];\r
+ if (z)\r
+ {\r
+ TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
+ //ColorGrid((j*16)+xofs,(i*16)+yofs,z);\r
+ }\r
+ }\r
+}\r
+\r
+void DrawEntities()\r
+{ int m;\r
+\r
+ for (m=0; m<entities; m++)\r
+ if ((entity[m].x>=(xwin/16)) && (entity[m].x<(xwin/16)+22) &&\r
+ (entity[m].y>=(ywin/16)) && (entity[m].y<(ywin/16)+ty+2))\r
+ {\r
+ if (chrs[entity[m].chrindex].frame)\r
+ TCCopySprite((entity[m].x*16)-xwin+16-chrs[entity[m].chrindex].hx,\r
+ (entity[m].y*16)-ywin+16-chrs[entity[m].chrindex].hy,\r
+ chrs[entity[m].chrindex].fx,\r
+ chrs[entity[m].chrindex].fy,\r
+ chrs[entity[m].chrindex].frame);\r
+ else\r
+ {\r
+ TCCopySprite(\r
+ (entity[m].x*16)-xwin+16,(entity[m].y*16)-ywin+16,16,16,stipple);\r
+ //ColorGrid((entity[m].x*16)-xwin+16,\r
+ // (entity[m].y*16)-ywin+16, 0);\r
+ }\r
+ }\r
+}\r
+\r
+// aen\r
+void DrawSelection()\r
+{ int i,j;\r
+ int x1,y1,x2,y2;\r
+\r
+ oxw=xwin*layer[el].pmultx/layer[el].pdivx;\r
+ oyw=ywin*layer[el].pmulty/layer[el].pdivy;\r
+ xofs=16-(oxw&15);\r
+ yofs=16-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ x1=selx1;\r
+ y1=sely1;\r
+ x2=selx2;\r
+ y2=sely2;\r
+\r
+ if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
+ if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ if (xtc+j >= x1 && xtc+j <= x2\r
+ && ytc+i >= y1 && ytc+i <= y2)\r
+ {\r
+ TCCopySprite((j*16)+xofs, (i*16)+yofs, 16,16, stipple);\r
+ //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
+ }\r
+ }\r
+}\r
+\r
+void RenderMap()\r
+{ char *src;\r
+ //char rs[2];\r
+\r
+ curlayer=0;\r
+ src=rstring;\r
+\r
+ /*\r
+ rs[1]=0; // aen\r
+ for (; *src; ++src)\r
+ {\r
+ rs[0]=*src;\r
+ BlitLayer(atoi(rs) -1);\r
+ }\r
+ */\r
+ while (*src)\r
+ {\r
+ switch (*src)\r
+ {\r
+ case '1': BlitLayer(0); break;\r
+ case '2': BlitLayer(1); break;\r
+ case '3': BlitLayer(2); break;\r
+ case '4': BlitLayer(3); break;\r
+ case '5': BlitLayer(4); break;\r
+ case '6': BlitLayer(5); break;\r
+ }\r
+ src++;\r
+ }\r
+\r
+ if (!curlayer) memset(screen+5648,0,84480);\r
+ if (layertoggle[6]) DrawObstructions();\r
+ if (layertoggle[7]) DrawZones();\r
+ if (layertoggle[8]) DrawEntities();\r
+ if (shifted) DrawSelection();\r
+}\r
+\r
+void AnimateTile(char i, int l)\r
+{\r
+ switch (vspanim[i].mode)\r
+ {\r
+ case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
+ else tileidx[l]=vspanim[i].start;\r
+ break;\r
+ case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
+ else tileidx[l]=vspanim[i].finish;\r
+ break;\r
+ case 2: tileidx[l]=random(vspanim[i].start,vspanim[i].finish);\r
+ break;\r
+ case 3: if (flipped[l])\r
+ {\r
+ if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
+ else { tileidx[l]++; flipped[l]=0; }\r
+ }\r
+ else\r
+ {\r
+ if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
+ else { tileidx[l]--; flipped[l]=1; }\r
+ }\r
+ }\r
+}\r
+\r
+void Animate(char i)\r
+{ static int l;\r
+\r
+ vadelay[i]=0;\r
+ for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
+ AnimateTile(i,l);\r
+}\r
+\r
+void CheckTileAnimation()\r
+{ static char i;\r
+\r
+ for (i=0; i<100; i++)\r
+ { if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
+ Animate(i);\r
+ vadelay[i]++; }\r
+}\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef RENDER_INC\r
+#define RENDER_INC\r
+\r
+#define MAXTILES 10240\r
+\r
+extern int oxw, oyw;\r
+extern int xofs, yofs;\r
+extern int xtc, ytc;\r
+\r
+extern char curlayer;\r
+extern short tileidx[MAXTILES];\r
+extern char flipped[MAXTILES];\r
+\r
+extern short tileidx[MAXTILES];\r
+\r
+typedef struct\r
+{\r
+ char *frame;\r
+ int fx, fy;\r
+ int hx, hy;\r
+} chri;\r
+\r
+extern chri chrs[100];\r
+\r
+extern void DoCHR(int i);\r
+extern void DoCHRdealy();\r
+extern void BlitBackLayer(char l);\r
+extern void LucentBlitLayer(char l);\r
+extern void TransBlitLayer(char l);\r
+extern void BlitLayer(char c);\r
+extern void DrawObstructions();\r
+extern void DrawZones();\r
+extern void DrawEntities();\r
+extern void DrawSelection();\r
+extern void RenderMap();\r
+extern void AnimateTile(char i, int l);\r
+extern void Animate(char i);\r
+extern void CheckTileAnimation();\r
+\r
+#endif // RENDER_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+\r
+#include "vdriver.h"\r
+\r
+#define xx 31\r
+\r
+int fontx=0;\r
+int fonty=0;\r
+\r
+char sbA[]={3,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssA[]={3,\r
+ 00,00,00,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx};\r
+\r
+char sbB[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00};\r
+\r
+char ssB[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char sbC[]={3,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ 00,xx,xx};\r
+\r
+char ssC[]={3,\r
+ 00,00,00,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ 00,xx,xx};\r
+\r
+char sbD[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,00};\r
+\r
+char ssD[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,00};\r
+\r
+char sbE[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char ssE[]={3,\r
+ 00,00,00,\r
+ xx,xx,xx,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char sbF[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,00,00};\r
+\r
+char ssF[]={3,\r
+ 00,00,00,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,00,00};\r
+\r
+char sbG[]={3,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,xx};\r
+\r
+char ssG[]={3,\r
+ 00,00,00,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,xx,\r
+ 00,xx,xx};\r
+\r
+char sbH[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssH[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx};\r
+\r
+char sbI[]={1,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx};\r
+\r
+char ssI[]={1,\r
+ 00,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx};\r
+\r
+char sbJ[]={3,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char ssJ[]={3,\r
+ 00,00,00,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char sbK[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssK[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char sbL[]={3,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char ssL[]={3,\r
+ 00,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char sbM[]={5,\r
+ xx,00,00,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,00,00,00,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char ssM[]={5,\r
+ 00,00,00,00,00,\r
+ xx,00,00,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char sbN[]={4,\r
+ xx,00,00,xx,\r
+ xx,xx,00,xx,\r
+ xx,00,xx,xx,\r
+ xx,00,00,xx,\r
+ xx,00,00,xx};\r
+\r
+char ssN[]={4,\r
+ 00,00,00,00,\r
+ xx,00,00,xx,\r
+ xx,xx,00,xx,\r
+ xx,00,xx,xx,\r
+ xx,00,00,xx};\r
+\r
+char sbO[]={3,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char ssO[]={3,\r
+ 00,00,00,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char sbP[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,00,00};\r
+\r
+char ssP[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,00};\r
+\r
+char sbQ[]={4,\r
+ 00,xx,xx,00,\r
+ xx,00,00,xx,\r
+ xx,00,00,xx,\r
+ xx,00,xx,00,\r
+ 00,xx,00,xx};\r
+\r
+char ssQ[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ 00,xx,xx};\r
+\r
+char sbR[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssR[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx};\r
+\r
+char sbS[]={3,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ 00,xx,00,\r
+ 00,00,xx,\r
+ xx,xx,00};\r
+\r
+char ssS[]={3,\r
+ 00,00,00,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ 00,xx,xx,\r
+ xx,xx,00};\r
+\r
+char sbT[]={3,\r
+ xx,xx,xx,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char ssT[]={3,\r
+ 00,00,00,\r
+ xx,xx,xx,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char sbU[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char ssU[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char sbV[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char ssV[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char sbW[]={5,\r
+ xx,00,00,00,xx,\r
+ xx,00,00,00,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char ssW[]={5,\r
+ 00,00,00,00,00,\r
+ xx,00,00,00,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char sbX[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssX[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char sbY[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char ssY[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char sbZ[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,xx,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char ssZ[]={2,\r
+ 00,00,\r
+ xx,xx,\r
+ 00,xx,\r
+ xx,00,\r
+ xx,xx};\r
+\r
+char s1[]={1,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx};\r
+\r
+char s2[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char s3[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s4[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,00,xx};\r
+\r
+char s5[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s6[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s7[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,00,xx};\r
+\r
+char s8[]={3,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s9[]={3,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s0[]={3,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char sQuote[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,00,00,\r
+ 00,00,00,\r
+ 00,00,00};\r
+\r
+char sYow[]={1,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ 00,\r
+ xx};\r
+\r
+char sQuotes[]={1,\r
+ xx,\r
+ xx,\r
+ 00,\r
+ 00,\r
+ 00};\r
+\r
+\r
+char sComma[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,xx,\r
+ xx,00};\r
+char sPeriod[]={1,\r
+ 00,\r
+ 00,\r
+ 00,\r
+ 00,\r
+ xx};\r
+\r
+char sMinus[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ xx,xx,\r
+ 00,00,\r
+ 00,00};\r
+\r
+char sQuest[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,xx,xx,\r
+ 00,00,00,\r
+ 00,xx,00};\r
+\r
+char sColon[]={1,\r
+ 00,\r
+ xx,\r
+ 00,\r
+ xx,\r
+ 00};\r
+\r
+char sch[]={3,\r
+ 00,xx,00,\r
+ xx,xx,xx,\r
+ xx,xx,xx,\r
+ xx,xx,xx,\r
+ 00,xx,00};\r
+\r
+char usc[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ xx,xx};\r
+\r
+char star[]={4,\r
+ 00,00,00,xx,\r
+ xx,00,xx,00,\r
+ 00,xx,00,00,\r
+ 00,00,00,00,\r
+ 00,00,00,00};\r
+\r
+char ss[]={2,\r
+ xx,xx,\r
+ xx,xx,\r
+ xx,xx,\r
+ xx,xx,\r
+ xx,xx};\r
+\r
+char sra[]={3,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,xx,xx,\r
+ xx,xx,00,\r
+ xx,00,00};\r
+\r
+char slParen[]={2,\r
+ 00,xx,\r
+ xx,00,\r
+ xx,00,\r
+ xx,00,\r
+ 00,xx};\r
+\r
+char srParen[]={2,\r
+ xx,00,\r
+ 00,xx,\r
+ 00,xx,\r
+ 00,xx,\r
+ xx,00};\r
+\r
+char ssemic[]={2,\r
+ xx,xx,\r
+ 00,00,\r
+ xx,xx,\r
+ 00,xx,\r
+ xx,00};\r
+\r
+char sSlash[]={3,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,xx,00,\r
+ xx,00,00,\r
+ xx,00,00};\r
+\r
+char sBlank[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00};\r
+\r
+// ...\r
+char mousepic[] = { xx,00,00,00,\r
+ xx,xx,00,00,\r
+ xx,xx,xx,00,\r
+ xx,xx,xx,xx,\r
+ 00,00,xx,00,\r
+ 00,00,xx,00};\r
+\r
+char *smal_tbl[]=\r
+{ sBlank,\r
+ sYow, sQuote, ss, ss, ss, ss, sQuotes, slParen, // 40\r
+ srParen, star, ss, sComma, sMinus,sPeriod, sSlash, s0, // 48\r
+ s1, s2, s3, s4, s5, s6, s7, s8, // 56\r
+ s9, sColon, ssemic, ss, ss, sra, sQuest, ss, // 64\r
+ sbA, sbB, sbC, sbD, sbE, sbF, sbG, sbH, // 72\r
+ sbI, sbJ, sbK, sbL, sbM, sbN, sbO, sbP, // 80\r
+ sbQ, sbR, sbS, sbT, sbU, sbV, sbW, sbX, // 88\r
+ sbY, sbZ, ss, ss, ss, ss, usc, sch, // 96\r
+ ssA, ssB, ssC, ssD, ssE, ssF, ssG, ssH, // 102\r
+ ssI, ssJ, ssK, ssL, ssM, ssN, ssO, ssP, // 110\r
+ ssQ, ssR, ssS, ssT, ssU, ssV, ssW, ssX, // 118\r
+ ssY, ssZ }; // 120\r
+\r
+unsigned char lastcol=31;\r
+\r
+void GotoXY(int x1, int y1)\r
+{\r
+ fontx=x1;\r
+ fonty=y1;\r
+}\r
+\r
+void print_char(char c)\r
+{ char* img;\r
+\r
+ c-=32;\r
+ if (c>90) c=2;\r
+ img=smal_tbl[c];\r
+ TCopySprite(fontx,fonty,img[0],5,img+1);\r
+ fontx+=img[0]+1;\r
+}\r
+\r
+void printstring(char *str)\r
+{\r
+ for (; *str; ++str)\r
+ print_char(*str);\r
+}\r
+\r
+int pixels(char *str)\r
+{ int pix;\r
+\r
+ for (pix=0; *str; ++str)\r
+ pix += *smal_tbl[*str-32]+1;\r
+ return pix;\r
+}\r
+\r
+void dec_to_asciiz(int num, char *buf)\r
+{\r
+ sprintf(buf,"%d",num);\r
+}\r
+\r
+void TextColor(unsigned char newc)\r
+{ char *src;\r
+\r
+ src=sbA;\r
+ while ((int)src < (int) smal_tbl)\r
+ {\r
+ if (*src==lastcol) *src=newc;\r
+ src++;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef SMALFONT_INC\r
+#define SMALFONT_INC\r
+\r
+extern int fontx;\r
+extern int fonty;\r
+\r
+extern void GotoXY(int x1, int y1);\r
+extern void print_char(char c);\r
+extern void printstring(char *str);\r
+extern int pixels(char *str);\r
+extern void dec_to_asciiz(int num, char *buf);\r
+extern void TextColor(unsigned char newc);\r
+\r
+#endif // SMALFONT_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <math.h>\r
+#include <malloc.h>\r
+#include <string.h>\r
+\r
+#include "maped.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "mouse.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+static int *dmapx = NULL;\r
+static int *dmapy = NULL;\r
+static unsigned char *dscr = NULL;\r
+static int recalc_distort = 1;\r
+static long build = 0;\r
+\r
+// ================================= Code ====================================\r
+\r
+// aen\r
+static void init_distort(void)\r
+ {\r
+ int x = 0;\r
+ int y = 0;\r
+ int *dx = NULL;\r
+ int *dy = NULL;\r
+\r
+ if (dmapx) vfree(dmapx); dmapx=NULL;\r
+ if (dmapy) vfree(dmapy); dmapy=NULL;\r
+ if (dscr) vfree(dscr); dscr=NULL;\r
+\r
+ // allocate distort lookups\r
+ dmapx = (int *) valloc(tsx*tsy*4,"ssaver X",0);\r
+ dmapy = (int *) valloc(tsx*tsy*4,"ssaver Y",0);\r
+\r
+ // allocate distort image buffer\r
+ dscr = (unsigned char *) valloc(tsx*tsy,"ssaver scrn",0);\r
+\r
+ // copy viewport into distort buffer\r
+ memcpy(dscr, screen, tsx*tsy);\r
+\r
+ dx = dmapx;\r
+ dy = dmapy;\r
+\r
+ // generate distort lookups\r
+ for (y=0; y<tsy; ++y) {\r
+ for (x=0; x<tsx; ++x) {\r
+ *dx++ = sin(y*5*(360.0/tsy)*(3.14/180))*10;\r
+ *dy++ = sin(x*5*(360.0/tsx)*(3.14/180))*10;\r
+ }\r
+ }\r
+ }\r
+\r
+// aen\r
+static void do_distort(void)\r
+ {\r
+ unsigned char *ds=NULL;\r
+ int x=0;\r
+ int y=0;\r
+ static int xt=0;\r
+ static int yt=0;\r
+ int xx=0;\r
+ int yy=0;\r
+ static int thresh=0;\r
+\r
+ if (recalc_distort) {\r
+ init_distort();\r
+ recalc_distort=0;\r
+ }\r
+\r
+ ds=screen; //+(tsx*16)+16;\r
+\r
+ do {\r
+ yy = (y+thresh);\r
+ if (yy >= tsy) yy -= tsy;\r
+ xt += (dmapx[(yy*tsx)+x] * build) >> 16;\r
+\r
+ xx = (x+((thresh*tsx)/tsy));\r
+ if (xx >= tsx) xx -= tsx;\r
+ yt += (dmapy[(yy*tsx)+xx] * build) >> 16;\r
+\r
+ if (xt < 0) xt += tsx;\r
+ if (yt < 0) yt += tsy;\r
+ if (xt >= tsx) xt -= tsx;\r
+ if (yt >= tsy) yt -= tsy;\r
+\r
+ *ds++ = dscr[(yt*tsx)+xt];\r
+\r
+ ++x;\r
+ if (x >= tsx) {\r
+ x = 0;\r
+ ++y;\r
+ //ds+=32;\r
+ }\r
+\r
+ xt = x;\r
+ yt = y;\r
+\r
+ } while (y < tsy);\r
+\r
+ thresh += 2;\r
+ if (thresh >= tsy)\r
+ thresh -= tsy;\r
+\r
+ if (build < 85196) //1.5\r
+ build += 3276;\r
+ }\r
+\r
+void ScreenSaver(void)\r
+ {\r
+ while (idlect > 750)\r
+ {\r
+ ReadMouse();\r
+ do_distort();\r
+ ShowPage();\r
+ }\r
+ recalc_distort=1;\r
+ build = 0;\r
+ }\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef SSAVER_INC\r
+#define SSAVER_INC\r
+\r
+extern void ScreenSaver(void);\r
+\r
+#endif // SSAVER_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// ================================= Code ====================================\r
+\r
+void ScreenSaver()\r
+{\r
+ while (idlect>750)\r
+ {\r
+ ReadMouse();\r
+ ClearScreen();\r
+ ShowPage();\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Additional code by Richard Lau (aka Ric)\r
+\r
+/* Date started: 08/Jul/98 */\r
+/* -- 29/Jul/98 --\r
+ * Heh, I've actually done quite a lot of work on this even though I intend\r
+ * to replace it. Oh well :)\r
+ *\r
+ * I've now made clicking on the mask indicator button (labelled with a small\r
+ * "m") drop back to draw mode if you're in select mode (since it makes no\r
+ * sense to select an area with the mask turned off). Holding down shift\r
+ * and dragging the mouse when you're in select mode will allow you to select\r
+ * a rectangle. The PgUp/PgDn colour shifters will now work in paste mode\r
+ * (affecting the image in the copy buffer).\r
+ *\r
+ * The fill routine is now in place and I've put a button in for the pick\r
+ * colour/eyedropper tool so that I don't get asked to put in a function for\r
+ * like I continuously did with ACE. Due to the extra buttons I've had to\r
+ * shift some of the other buttons around to make them all fit onto the\r
+ * screen. It's probably not the best arrangement but if anyone comes up with\r
+ * a better layout I'm open to suggestions.\r
+ *\r
+ * The wierd button labelling problem I had last time has been corrected - the\r
+ * problem was traced back to the pixels routine in SMALFONT.C. Aen pointed\r
+ * out that I wasn't allocating space for the NULL terminator for all the\r
+ * strings so that has now been fixed (by adding 1 to strlen).\r
+ *\r
+ * - Ric\r
+ */\r
+/*\r
+ * Keys:\r
+ * CTRL/S + mouse click - (over edit window) Pick up colour under mouse\r
+ * SHIFT+mb down+drag mouse - select rectangle (select mode only)\r
+ * SPACEBAR - toggle between draw mode and select mode\r
+ * CTRL+Z or U - one level undo\r
+ * CTRL+A - select all\r
+ * CTRL+U - unselect all\r
+ * CTRL+C - copy selected area\r
+ * CTRL+X - cut selected area\r
+ * CTRL+V - paste\r
+ * DEL - clears selected area\r
+ * CTRL+R - reverts the tile to the original (like undo in maped 1)\r
+ * (self note: modify to ask for confirmation)\r
+ * G - toggles grid on/off\r
+ * H - toggles hilight on/off\r
+ * M - toggles mask on/off\r
+ * I - inverts mask\r
+ * X - mirrors image\r
+ * Y - flips image\r
+ * L/R - Rotates tile 90 degrees anti-clockwise/clockwise\r
+ * Q/W - Steps through animation (in tile edit mode) if any\r
+ * A/Z and S/X - changes the left or right drawing colours\r
+ * PGUP/PGDN - Colour shift up/down\r
+ * [ and ] - toggle screen resolutions\r
+ * ALT+X - quits to DOS\r
+ */\r
+/* -- 26/Jul/98 --\r
+ * I've actually decided to start the editor over in a new file so that the\r
+ * code is a bit more elegant. As it stands some bits of this are messy but\r
+ * it currently works ;). Anyway I've decided that what I'll do is to in\r
+ * effect write two tile editors - continuing work on this one and working\r
+ * on the rewrite as a "side project". The eventual aim will be to replace\r
+ * this editor with the rewrite but if factors intervene preventing me from\r
+ * completing the rewrite then there'll always be this editor to fall back on.\r
+ *\r
+ * New in this release is a copy/cut/paste system. New buttons have been added.\r
+ * For some reason I haven't figured out yet I can't call the two rotate\r
+ * buttons "Rotate ACW" and "Rotate CW" (it causes MapEd to crash) so I've had\r
+ * to resort to calling them "Turn_L" and "Turn_R".\r
+ * - Ric\r
+ */\r
+\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "config.h"\r
+#include "guicomp.h"\r
+#include "keyboard.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "vdriver.h"\r
+\r
+#include "smalfont.h"\r
+\r
+#undef free\r
+\r
+#define TRUE 1\r
+#define FALSE 0\r
+// #define NULL ((void *)0)\r
+\r
+#define MOUSENONE 0 // No mouse buttons pressed\r
+#define MOUSERELEASE 1 // Mouse button released\r
+#define MOUSEPRESSED 2 // Mouse button held down\r
+#define MOUSECLICKED 4 // Mouse button pressed\r
+\r
+// Setup some defines for the regions/areas/windows where everything goes\r
+#define MAX_REGIONS 29 // Number of regions\r
+#define BASEREG 0 // Window coords + title\r
+#define HELPBAR 1 // Helpbar - put helpful messages here :)\r
+#define PALETTE 2 // The palette\r
+#define EDITREG 3 // Main edit window\r
+#define PREVIEW 4 // Preview of image being edited\r
+#define SCOLBOX 5 // Selected colour box\r
+#define SCTXTBX 6 // Text box to show info on the selected colours\r
+#define QUITBUT 7 // Quit button\r
+#define DRAWBUT 8 // Draw mode indicator\r
+#define FILLBUT 9 // Fill mode indicator\r
+#define PICKBUT 10 // Pick mode indicator\r
+#define MASKBUT 11 // Mask mode indicator\r
+#define PSTEBUT 12 // Paste mode indicator\r
+#define EDMDFRM 13 // Frame for edit mode radio buttons\r
+#define MASKIND 14 // Indicator showing if mask is shown\r
+#define GRIDIND 15 // Indicator showing if grid is shown\r
+#define ANIMIND 16 // Indicator showing if animations are shown\r
+#define PXHLIND 17 // Indicator showing if pixel highlight shown\r
+#define IND_FRM 18 // Frame for indicators (push buttons)\r
+#define BUT_FRM 19 // Frame for buttons\r
+#define UNDOBUT 20 // Undo button\r
+#define COPYBUT 21 // Copy button\r
+#define CUT_BUT 22 // Cut button\r
+#define CLR_BUT 23 // Clear button\r
+#define TOOLFRM 24 // Frame for tools\r
+#define FLIPBUT 25 // Flip image button\r
+#define MIRRBUT 26 // Mirror image button\r
+#define RIACBUT 27 // Rotate anticlockwise button\r
+#define RIC_BUT 28 // Rotate clockwise button\r
+\r
+// Define TEbitflags values\r
+#define TEQUITCUR 1\r
+#define TEANIMATE 2\r
+#define TEGRID 4\r
+#define TEHILIGHT 8\r
+#define TESHOWMSK 16\r
+\r
+// Define TEREGION->bitflags values\r
+#define REGVISIBLE 1\r
+#define REGACTIVE 2\r
+#define REGNOCLICK 4\r
+#define REGTWOCLICK 8 // wait for a second click\r
+\r
+// TEeditmode defs\r
+#define EDDRAW 1\r
+#define EDFILL 2\r
+#define EDPICK 4\r
+#define EDMASK 8\r
+#define EDPASTE 16\r
+\r
+// TEtype defs\r
+#define TEUNKNOWN 0\r
+#define TETILE 1\r
+\r
+// DATABUTTON buttontypes:\r
+#define CLICKBUTTON 1 // normal button\r
+#define PUSHBUTTON 2 // can be pushed in/out (toggle bit bitvalue)\r
+#define RADIOBUTTON 4 // for button banks (set *bitflag=bitvalue)\r
+\r
+// DATABASEREGION windowtypes:\r
+#define DBRSTDWINDOW 0 // window and title bar\r
+#define DBRPANEL 1 // no title bar\r
+\r
+// INFOTYPEs:\r
+#define DITREGION 1\r
+#define DITBASEREGION 2\r
+#define DITBUTTON 4\r
+#define DITEDITREG 8\r
+\r
+// Button flag action - has this button been clicked?\r
+#define BFANONE 0\r
+#define BFAUNDO 1\r
+#define BFACOPY 2\r
+#define BFACUT 4\r
+#define BFACLEAR 8\r
+#define BFARIAC 16\r
+#define BFARIC 32\r
+#define BFAMIRROR 64\r
+#define BFAFLIP 128\r
+\r
+// Variables\r
+typedef struct TEREGION\r
+ {\r
+ int infotype; // type of struct\r
+ unsigned int x1, x2, y1, y2; // bounding coordinates\r
+ char *caption; // helpbar text\r
+ int bitflags; // see defines above\r
+ void (*drawproc)(struct TEREGION *); // region's draw procedure\r
+ // - allows nice and short RenderTileEdit proc ;)\r
+ void *data; // extended information\r
+ } TEREGION;\r
+typedef struct DATABASEREGION\r
+ {\r
+ int infotype; // type of struct\r
+ int numofregs; // total number of regions (including base)\r
+ int windowtype; // type of window to draw\r
+ } DATABASEREGION;\r
+typedef struct DATABUTTON\r
+ {\r
+ int infotype; // type of struct\r
+ int *bitflag; // address of bitflag\r
+ char *text; // addition text (eg helptext)\r
+ int bitvalue; // 1st bit/value\r
+ int buttontype; // type\r
+ } DATABUTTON;\r
+typedef struct DATAEDITREG\r
+ {\r
+ int infotype; // type of struct\r
+ int firstx, firsty; // first coords for two-click operation\r
+ } DATAEDITREG;\r
+\r
+\r
+static TEREGION *TEregs=NULL; // pointer to the regions\r
+static unsigned char lcolor=255; // left mouse colour\r
+static unsigned char rcolor=0; // right mouse colour\r
+static TEREGION *TEOldReg=NULL;\r
+static unsigned int MBStatus[3]={MOUSENONE,MOUSENONE,MOUSENONE};\r
+static int TEanimstrand=0; // Animation strand\r
+static int TEbitflags=TEANIMATE; // Set default bitflags\r
+static int TEbfa=BFANONE; // Set default button action flags\r
+static int TEeditmode=EDDRAW; // Default edit region mode\r
+static int TExoffs=16; // X offset for region "windows"\r
+static int TEyoffs=16; // Y offset for region "windows"\r
+unsigned int TEtype=TEUNKNOWN; // type of graphic being edited\r
+unsigned int TEtile; // tile to edit - may possibly expand this to an array for simultaneous editing\r
+unsigned int TExsize=0; // width of graphic being edited\r
+unsigned int TEysize=0; // height of graphic being edited\r
+unsigned int TEcopyxsize=0; // width of copy buffer\r
+unsigned int TEcopyysize=0; // height of copy buffer\r
+unsigned char *TEsource=NULL; // pointer to original image being edited\r
+static unsigned char *TEimage=NULL; // pointer to image being edited\r
+static unsigned char *TEmask=NULL; // pointer to image mask\r
+static unsigned char *TEundo=NULL; // pointer to undo buffer\r
+static unsigned char *TEcopy=NULL; // pointer to copy buffer\r
+static unsigned char *TEcmsk=NULL; // pointer to copy mask\r
+static char TEtempstr[256]; // Temporary string buffer\r
+\r
+// Function prototypes\r
+static void *TEAlloc(unsigned long amount, char *whatfor);\r
+\r
+#define TEFree(ptr) if (ptr) free(ptr); ptr=NULL;\r
+#define TEFreeReg(ptr) DestroyRegions(&ptr); if (ptr) free(ptr); ptr=NULL;\r
+#define TENewText(text, whatfor) (char *) strcpy(TEAlloc(strlen(text)+1, whatfor), text);\r
+//static void TEFree(void *TETmpBuf);\r
+static void MBClickHandler(TEREGION *TEBaseReg);\r
+static void AboutTE(void);\r
+static void DestroyRegions(TEREGION **TEBaseReg);\r
+static void SetupRegions(void);\r
+static void InitTEImage(void);\r
+static void DeinitTEImage(void);\r
+static int MouseOverTEreg(TEREGION *TEr);\r
+static void RenderTileEdit(TEREGION *TEBaseReg);\r
+static void RestartTileEditor(void);\r
+static void SetCaption(TEREGION *TEr, char *helptext);\r
+static void TEDrawHilight(int x1, int y1, int width, int height, unsigned char colour);\r
+static void TEDrawCheckeredBox(int x1, int y1, int width, int height, unsigned char colour);\r
+static void TERegFill(TEREGION *TEr, int colour);\r
+static void TERegText(TEREGION *TEr, char *message);\r
+static void TEClearImage(void);\r
+static void TECopyImage(void);\r
+static void TEFlipImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TEMirrorImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TERotateImageAntiClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TERotateImageClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TEFillImage(char *TEFIimage, char *TEFImask, int TEFIxsize, int TEFIysize, int TEFIx, int TEFIy, char TEFIcolour);\r
+static void TERFillImage(char *TERFIimage, char *TERFImask, int TERFIxsize, int TERFIysize, int TERFIx, int TERFIy);\r
+static void TEShiftColours(char *TESCimage, char *TESCmask, int TESCxsize, int TESCysize, int amount);\r
+static void TEUndo(void);\r
+static void DrawButton(TEREGION *TEr);\r
+static void DrawEditReg(TEREGION *TEr);\r
+static void DrawHelpBar(TEREGION *TEr);\r
+static void DrawPalette(TEREGION *TEr);\r
+static void DrawPreview(TEREGION *TEr);\r
+static void DrawSColBox(TEREGION *TEr);\r
+static void DrawSCTxtBx(TEREGION *TEr);\r
+static void DrawSunkRegion(TEREGION *TEr);\r
+void TileEdit(void);\r
+\r
+\r
+static int MouseOverTEreg(TEREGION *TEr)\r
+ {\r
+ unsigned int testx=mx-TExoffs;\r
+ unsigned int testy=my-TEyoffs;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+ testx-=(TEr->x1);\r
+ testy-=(TEr->y1);\r
+\r
+ if (testx >= width || testy >= height) return FALSE;\r
+ return TRUE;\r
+ }\r
+\r
+static void DrawButton(TEREGION *TEr)\r
+// -- ric: 20/Jul/98 - generic button routine\r
+ {\r
+ unsigned int x=TEr->x1+TExoffs;\r
+ unsigned int y=TEr->y1+TEyoffs;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+\r
+ strcpy(TEtempstr,"Button data not declared.");\r
+ if (!TEr->data)\r
+ err(TEtempstr);\r
+ if (((struct DATABUTTON *)(TEr->data))->infotype!=DITBUTTON)\r
+ err(TEtempstr);\r
+\r
+ // draw raised button\r
+ stdwindow(x-1, y-1, x+width+1, y+height+1);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+(width-(pixels(TEr->caption)))/2, y+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ switch (((struct DATABUTTON *)(TEr->data))->buttontype)\r
+ {\r
+ case CLICKBUTTON:\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ if (((struct DATABUTTON *)(TEr->data))->text)\r
+ SetCaption(&TEregs[HELPBAR], (((struct DATABUTTON *)(TEr->data))->text));\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSEPRESSED)\r
+ {\r
+ // draw button down\r
+ FilledBox(x, y, width, height, winbg);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+1+(width-(pixels(TEr->caption)))/2, y+1+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ }\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSERELEASE)\r
+ {\r
+ *(((struct DATABUTTON *)(TEr->data))->bitflag)^=((struct DATABUTTON *)(TEr->data))->bitvalue;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ case PUSHBUTTON:\r
+ if (*(((struct DATABUTTON *)(TEr->data))->bitflag)&(((struct DATABUTTON *)(TEr->data))->bitvalue))\r
+ {\r
+ // draw button down\r
+ FilledBox(x, y, width, height, winbg);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+1+(width-(pixels(TEr->caption)))/2, y+1+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ }\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ if (((struct DATABUTTON *)(TEr->data))->text)\r
+ {\r
+ sprintf(TEtempstr, "Toggle %s on/off", ((struct DATABUTTON *)(TEr->data))->text);\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+ }\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED)\r
+ {\r
+ *(((struct DATABUTTON *)(TEr->data))->bitflag)^=((struct DATABUTTON *)(TEr->data))->bitvalue;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ case RADIOBUTTON:\r
+ if (*(((struct DATABUTTON *)(TEr->data))->bitflag)==((struct DATABUTTON *)(TEr->data))->bitvalue)\r
+ {\r
+ // draw button down\r
+ FilledBox(x, y, width, height, winbg);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+1+(width-(pixels(TEr->caption)))/2, y+1+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ }\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ if (((struct DATABUTTON *)(TEr->data))->text)\r
+ SetCaption(&TEregs[HELPBAR], (((struct DATABUTTON *)(TEr->data))->text));\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED)\r
+ {\r
+ *(((struct DATABUTTON *)(TEr->data))->bitflag)=((struct DATABUTTON *)(TEr->data))->bitvalue;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+static void DrawSunkRegion(TEREGION *TEr)\r
+ {\r
+ unsigned int x=TEr->x1+TExoffs;\r
+ unsigned int y=TEr->y1+TEyoffs;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+\r
+// FilledBox(x, y, width, height, black);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ HLine(x+1, y+height-1, width-1, brightw);\r
+ VLine(x+width-1, y+1, height-1, brightw);\r
+ }\r
+\r
+static void DrawEditReg(TEREGION *TEr)\r
+ {\r
+ int i,j,i2,j2,c;\r
+ int minx,miny,maxx,maxy;\r
+ int blocksize=8;\r
+ int visblocksize=blocksize;\r
+ char *img;\r
+ TEREGION tempr;\r
+ tempr.x1=TEr->x1+2;\r
+ tempr.x2=TEr->x2-2;\r
+ tempr.y1=TEr->y1+2;\r
+ tempr.y2=TEr->y2-2;\r
+\r
+ img=TEimage; //vsp+(256*TEtile);\r
+\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ FilledBox(TEr->x1+TExoffs+2, TEr->y1+TEyoffs+2, (blocksize<<4), (blocksize<<4), titlebg);\r
+\r
+ if (TEbitflags&TEGRID) visblocksize-=1;\r
+\r
+ for (j=0; j<TEysize; j++)\r
+ for (i=0; i<TExsize; i++)\r
+ {\r
+ FilledBox(TEr->x1+TExoffs+2+i*blocksize, TEr->y1+TEyoffs+2+j*blocksize, visblocksize, visblocksize, *img++);\r
+ if (TEbitflags&TESHOWMSK && !TEmask[j*TExsize+i])\r
+ TEDrawCheckeredBox(TEr->x1+TExoffs+2+i*blocksize, TEr->y1+TEyoffs+2+j*blocksize, visblocksize, visblocksize, titlebg);\r
+ }\r
+\r
+ img=TEimage;\r
+ if (TEr->bitflags®ACTIVE && !(MouseOverTEreg(&tempr)) && (MBStatus[0]|MBStatus[1])==MOUSERELEASE)\r
+ if (TEr->bitflags®TWOCLICK) TEr->bitflags^=REGTWOCLICK;\r
+ if (MouseOverTEreg(&tempr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ i=(mx-TExoffs-(tempr.x1))/blocksize;\r
+ j=(my-TEyoffs-(tempr.y1))/blocksize;\r
+ c=img[(j*TExsize)+i];\r
+ sprintf(TEtempstr, "Tile: %d, (%02d, %02d), Color: %03d (rgb: %03d/%03d/%03d)", TEtile, i, j, c, pal[(c*3)], pal[(c*3)+1], pal[(c*3)+2]);\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+ if (TEbitflags&TEHILIGHT)\r
+ TEDrawHilight(TExoffs+i*blocksize+tempr.x1, TEyoffs+j*blocksize+tempr.y1, visblocksize, visblocksize, white);\r
+\r
+ // if pasting draw the image being pasted\r
+ if (TEeditmode==EDPASTE)\r
+ {\r
+ for (j2=0; j2<TEcopyysize; j2++)\r
+ if ((j+j2)<TEysize)\r
+ for (i2=0; i2<TEcopyxsize; i2++)\r
+ if ((i+i2)<TExsize)\r
+ if (TEcmsk[j2*TEcopyxsize+i2])\r
+ if (!(TEbitflags&TESHOWMSK))\r
+ FilledBox(TEr->x1+TExoffs+2+(i+i2)*blocksize, TEr->y1+TEyoffs+2+(j+j2)*blocksize, visblocksize, visblocksize, TEcopy[j2*TEcopyxsize+i2]);\r
+ else\r
+ if (TEmask[(j+j2)*TExsize+i+i2])\r
+ FilledBox(TEr->x1+TExoffs+2+(i+i2)*blocksize, TEr->y1+TEyoffs+2+(j+j2)*blocksize, visblocksize, visblocksize, TEcopy[j2*TEcopyxsize+i2]);\r
+ }\r
+ if (TEeditmode==EDMASK)\r
+ {\r
+ // draw reg\r
+ if (TEr->bitflags®TWOCLICK)\r
+ for (j2=0; j2<TEysize; j2++)\r
+ for (i2=0; i2<TEysize; i2++)\r
+ if (((j2>=j && j2<=((struct DATAEDITREG *)(TEr->data))->firsty) ||\r
+ (j2>=((struct DATAEDITREG *)(TEr->data))->firsty && j2<=j)) &&\r
+ ((i2>=i && i2<=((struct DATAEDITREG *)(TEr->data))->firstx) ||\r
+ (i2>=((struct DATAEDITREG *)(TEr->data))->firstx && i2<=i)))\r
+ TEDrawCheckeredBox(TEr->x1+TExoffs+2+i2*blocksize, TEr->y1+TEyoffs+2+j2*blocksize, visblocksize, visblocksize, darkred);\r
+\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) && !(TEr->bitflags®TWOCLICK))\r
+ {\r
+ ((struct DATAEDITREG *)(TEr->data))->firstx=i;\r
+ ((struct DATAEDITREG *)(TEr->data))->firsty=j;\r
+ TEr->bitflags^=REGTWOCLICK;\r
+ }\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSERELEASE && TEr->bitflags®TWOCLICK)\r
+ {\r
+ if (MBStatus[1]==MOUSERELEASE) c=0x0;\r
+ else c=0xf;\r
+ miny=j;\r
+ maxy=((struct DATAEDITREG *)(TEr->data))->firsty;\r
+ minx=i;\r
+ maxx=((struct DATAEDITREG *)(TEr->data))->firstx;\r
+ if (j>((struct DATAEDITREG *)(TEr->data))->firsty)\r
+ {\r
+ maxy=j;\r
+ miny=((struct DATAEDITREG *)(TEr->data))->firsty;\r
+ }\r
+ if (i>((struct DATAEDITREG *)(TEr->data))->firstx)\r
+ {\r
+ maxx=i;\r
+ minx=((struct DATAEDITREG *)(TEr->data))->firstx;\r
+ }\r
+ for (j2=miny; j2<=maxy; j2++)\r
+ for (i2=minx; i2<=maxx; i2++)\r
+ TEmask[j2*TExsize+i2]=(char)c;\r
+ TEr->bitflags^=REGTWOCLICK;\r
+ }\r
+ }\r
+ // Handle mouse clicks\r
+\r
+#ifdef JUNK\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && (key[SCAN_CTRL]||key[SCAN_S]))\r
+ {\r
+ // put code to lock out draw mode here\r
+ }\r
+#endif\r
+ if (TEOldReg==TEr)\r
+ {\r
+ // Update undo buffer\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && TEeditmode!=EDMASK && TEeditmode!=EDPICK && !(key[SCAN_CTRL]||key[SCAN_S]))\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ if (MBStatus[0]==MOUSECLICKED && TEeditmode==EDFILL)\r
+ TEFillImage(TEimage, (TEbitflags&TESHOWMSK ? TEmask : NULL), TExsize, TEysize, i, j, lcolor);\r
+ if (MBStatus[1]==MOUSECLICKED && TEeditmode==EDFILL)\r
+ TEFillImage(TEimage, (TEbitflags&TESHOWMSK ? TEmask : NULL), TExsize, TEysize, i, j, rcolor);\r
+\r
+ // Draw\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSEPRESSED)\r
+ {\r
+ if (TEeditmode==EDPASTE)\r
+ {\r
+ for (j2=0; j2<TEcopyysize; j2++)\r
+ if ((j+j2)<TEysize)\r
+ for (i2=0; i2<TEcopyxsize; i2++)\r
+ if ((i+i2)<TExsize)\r
+ if (TEcmsk[j2*TEcopyxsize+i2])\r
+ if (!(TEbitflags&TESHOWMSK))\r
+ TEimage[(j+j2)*TExsize+i+i2]=TEcopy[j2*TEcopyxsize+i2];\r
+ else\r
+ if (TEmask[(j+j2)*TExsize+i+i2])\r
+ TEimage[(j+j2)*TExsize+i+i2]=TEcopy[j2*TEcopyxsize+i2];\r
+ }\r
+ }\r
+ if (MBStatus[0]==MOUSEPRESSED)\r
+ if (key[SCAN_CTRL]||key[SCAN_S]||(TEeditmode==EDPICK))\r
+ lcolor=TEimage[(j*TExsize)+i];\r
+ else\r
+ if ((TEeditmode==EDDRAW)&&!(TEbitflags&TESHOWMSK && !TEmask[j*TExsize+i]))\r
+ TEimage[(j*TExsize)+i]=lcolor;\r
+ else\r
+ if (TEeditmode==EDMASK && !(TEr->bitflags®TWOCLICK))\r
+ TEmask[(j*TExsize)+i]=0xf;\r
+ if (MBStatus[1]==MOUSEPRESSED)\r
+ if (key[SCAN_CTRL]||key[SCAN_S]||(TEeditmode==EDPICK))\r
+ rcolor=TEimage[(j*TExsize)+i];\r
+ else\r
+ if ((TEeditmode==EDDRAW)&&!(TEbitflags&TESHOWMSK && !TEmask[j*TExsize+i]))\r
+ TEimage[(j*TExsize)+i]=rcolor;\r
+ else\r
+ if (TEeditmode==EDMASK && !(TEr->bitflags®TWOCLICK))\r
+ TEmask[(j*TExsize)+i]=0x0;\r
+ }\r
+ }\r
+ }\r
+\r
+static void DrawHelpBar(TEREGION *TEr)\r
+ {\r
+ //int i, htext=0;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ if (TEr->caption) TERegText(TEr, TEr->caption);\r
+ TEFree(TEr->caption); // Blank caption\r
+ //TEr->caption=NULL; // why doesn't this work in TEFree?\r
+#ifdef JUNK\r
+ i=MAX_REGIONS;\r
+ do\r
+ {\r
+ i--;\r
+ if (MouseOverTEreg(&TEregs[i])) htext=i;\r
+ } while (i>0);\r
+ if (htext && TEregs[htext].helptext) TERegText(TEr, TEr->caption);\r
+#endif\r
+ }\r
+\r
+static void DrawPalette(TEREGION *TEr)\r
+ {\r
+ int i,j;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+ int xscale=(width-4)>>6;\r
+ int yscale=(height-4)>>2;\r
+ int x=(TEr->x1)+TExoffs;\r
+ int y=(TEr->y1)+TEyoffs;\r
+ TEREGION tempr;\r
+ tempr.x1=TEr->x1+2;\r
+ tempr.x2=TEr->x2-2;\r
+ tempr.y1=TEr->y1+2;\r
+ tempr.y2=TEr->y2-2;\r
+\r
+ x+=2;\r
+ y+=2;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ i=64;\r
+ do\r
+ {\r
+ i--;\r
+ FilledBox(x+(i*xscale), y, xscale, yscale, i);\r
+ FilledBox(x+(i*xscale), y+yscale, xscale, yscale, i+64);\r
+ FilledBox(x+(i*xscale), y+yscale*2, xscale, yscale, i+128);\r
+ FilledBox(x+(i*xscale), y+yscale*3, xscale, yscale, i+192);\r
+ } while (i>0);\r
+\r
+ i=lcolor&63;\r
+ j=lcolor>>6;\r
+ TEDrawHilight(x+i*xscale, y+j*yscale, xscale, yscale, titlebg);\r
+\r
+ i=rcolor&63;\r
+ j=rcolor>>6;\r
+ TEDrawHilight(x+i*xscale, y+j*yscale, xscale, yscale, titlebg);\r
+\r
+ if (MouseOverTEreg(&tempr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ i=(mx-TExoffs-(tempr.x1))/xscale;\r
+ j=(my-TExoffs-(tempr.y1))/yscale;\r
+ i+=(j<<6);\r
+ j=i*3;\r
+ sprintf(TEtempstr, "Color: %03d (rgb: %03d/%03d/%03d)", i, pal[j], pal[j+1], pal[j+2]);\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if (MBStatus[0]==MOUSEPRESSED) lcolor=i;\r
+ if (MBStatus[1]==MOUSEPRESSED) rcolor=i;\r
+ }\r
+ }\r
+ }\r
+\r
+static void DrawPreview(TEREGION *TEr)\r
+ {\r
+ char *img;\r
+ int i;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+// img=vsp+(256*TEtile);\r
+ img=TEimage;\r
+ i=tileidx[TEtile];\r
+ if ((TEbitflags&TEANIMATE) && i!=TEtile) img=vsp+(256*i);\r
+ CopyTile(TEr->x1+TExoffs+2, TEr->y1+TEyoffs+2, img);\r
+\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ strcpy(TEtempstr, (TEbitflags&TEANIMATE ? "Click to halt animation" : "Click to animate tile"));\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && MouseOverTEreg(TEr))\r
+ TEbitflags^=TEANIMATE;\r
+ }\r
+ }\r
+\r
+static void DrawSColBox(TEREGION *TEr)\r
+// -- ric: 15/Jul/98 - Draw selected colour box\r
+ {\r
+ int halfwidth=TEr->x2-TEr->x1-4;\r
+ int height=TEr->y2-TEr->y1-4;\r
+ char DSCBtempcolor;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ FilledBox(TExoffs+2+TEr->x1, TEyoffs+2+TEr->y1, halfwidth, height, titlebg);\r
+ height-=2;\r
+ halfwidth-=2;\r
+ halfwidth>>=1;\r
+ FilledBox(TExoffs+3+TEr->x1, TEyoffs+3+TEr->y1, halfwidth, height, lcolor);\r
+ FilledBox(TExoffs+3+TEr->x1+halfwidth, TEyoffs+3+TEr->y1, halfwidth, height, rcolor);\r
+\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ strcpy(TEtempstr, "Click to swap colors");\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && MouseOverTEreg(TEr))\r
+ {\r
+ DSCBtempcolor=lcolor;\r
+ lcolor=rcolor;\r
+ rcolor=DSCBtempcolor;\r
+ }\r
+ }\r
+ }\r
+\r
+static void DrawSCTxtBx(TEREGION *TEr)\r
+// -- ric: 15/Jul/98 - Draw selected colour text box\r
+ {\r
+// char DSCTBTextBuf[256];\r
+ int i;\r
+ int DSCTBx=TEr->x1+TExoffs+2;\r
+ int DSCTBy=TEr->y1+TEyoffs+2;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ i=lcolor*3;\r
+ sprintf(TEtempstr, "Left: %03d (rgb: %03d/%03d/%03d)", lcolor, pal[i], pal[i+1], pal[i+2]);\r
+ GotoXY(DSCTBx, DSCTBy);\r
+ printstring(TEtempstr);\r
+ i=rcolor*3;\r
+ sprintf(TEtempstr, "Right: %03d (rgb: %03d/%03d/%03d)", rcolor, pal[i], pal[i+1], pal[i+2]);\r
+ GotoXY(DSCTBx, DSCTBy+7);\r
+ printstring(TEtempstr);\r
+ }\r
+\r
+static void SetCaption(TEREGION *TEr, char *helptext)\r
+ {\r
+ TEFree(TEr->caption);\r
+ TEr->caption=(char *)strcpy((char *)TEAlloc(strlen(helptext)+1,helptext), helptext);\r
+ }\r
+\r
+static void TEDrawHilight(int x1, int y1, int width, int height, unsigned char colour)\r
+// -- ric: 15/Jul/98 - Draws hilight around given rectangle\r
+ {\r
+ VLine(x1-1, y1, height, colour);\r
+ VLine(x1+width, y1, height, colour);\r
+ HLine(x1-1, y1-1, width+2, colour);\r
+ HLine(x1-1, y1+height, width+2, colour);\r
+ }\r
+\r
+static void TEDrawCheckeredBox(int x1, int y1, int width, int height, unsigned char colour)\r
+// -- ric: 17/Jul/98 - Draws a checkered box\r
+ {\r
+ int i,j;\r
+ unsigned char c;\r
+ for (j=0; j<height; j++)\r
+ {\r
+ c=(y1+j+1)&1;\r
+ if (c) c=colour;\r
+ for (i=0; i<width; i++)\r
+ {\r
+ if (c) screen[(y1+j)*tsx+x1+i]=c;\r
+ c^=colour;\r
+ }\r
+ }\r
+ }\r
+\r
+static void TERegFill(TEREGION *TEr, int colour)\r
+// -- ric: 20/Jul/98 - Fills region with colour (colour==-1 for transparent)\r
+ {\r
+ if (colour>-1)\r
+ FilledBox(TEr->x1+TExoffs, TEr->y1+TEyoffs, (TEr->x2)-(TEr->x1), (TEr->y2)-(TEr->y1), colour);\r
+ }\r
+\r
+static void TERegText(TEREGION *TEr, char *message)\r
+// Prints given message in the specified region\r
+ {\r
+ int tempx, tempy;\r
+ tempx=(TEr->x1)+TExoffs+2;\r
+\r
+ tempy=(TEr->y2)-(TEr->y1);\r
+ tempy>>=1;\r
+ tempy+=(TEr->y1)-3;\r
+\r
+ GotoXY(tempx,tempy+TEyoffs);\r
+ printstring(message);\r
+\r
+ }\r
+\r
+static void TEClearImage(void)\r
+// -- ric: 26/Jul/98 - clear selected image\r
+ {\r
+ int j;\r
+ if (TEbitflags&TESHOWMSK)\r
+ {\r
+ j=TEysize*TExsize;\r
+ memcpy(TEundo, TEimage, j); // backup image to undo buffer\r
+ do\r
+ {\r
+ j--;\r
+ if (*(TEmask+j)) *(TEimage+j)=rcolor;\r
+ } while (j>0);\r
+ }\r
+ }\r
+\r
+static void TECopyImage(void)\r
+// -- ric: 26/Jul/98 - copy selected image to copy buffer\r
+ {\r
+ int i, j, TECIxstart, TECIystart, TECIxsize, TECIysize;\r
+ if (TEbitflags&TESHOWMSK) // only makes sense if selected region is shown\r
+ {\r
+ TECIxstart=TExsize;\r
+ TECIystart=TEysize;\r
+ TECIxsize=-1;\r
+ TECIysize=-1;\r
+ // loop through image to find the starting and ending x and y coords\r
+ // of the image to copy\r
+ for (j=0; j<TEysize; j++)\r
+ for (i=0; i<TExsize; i++)\r
+ {\r
+ if (TEmask[j*TExsize+i]) // selected\r
+ {\r
+ if (i<TECIxstart) TECIxstart=i;\r
+ if (i>TECIxsize) TECIxsize=i;\r
+ if (j<TECIystart) TECIystart=j;\r
+ if (j>TECIysize) TECIysize=j;\r
+ }\r
+ }\r
+\r
+ TECIxsize-=TECIxstart-1;\r
+ TECIysize-=TECIystart-1;\r
+\r
+ if (TECIxsize>0 && TECIysize>0)\r
+ {\r
+ // free and create TEcopy and TEcmsk buffers\r
+ TEFree(TEcopy);\r
+ TEFree(TEcmsk);\r
+\r
+ // make copy buffer square (allows for rotation)\r
+ TEcopyxsize=TECIysize;\r
+ TEcopyysize=TECIysize;\r
+ if (TECIxsize>TECIysize)\r
+ {\r
+ TEcopyxsize=TECIxsize;\r
+ TEcopyysize=TECIxsize;\r
+ }\r
+ TEcopy=(char *)TEAlloc(TEcopyxsize*TEcopyysize, "copy buffer");\r
+ TEcmsk=(char *)TEAlloc(TEcopyxsize*TEcopyysize, "copy mask");\r
+\r
+ // copy image into buffer\r
+ for (j=0; j<TECIysize; j++)\r
+ for (i=0; i<TECIxsize; i++)\r
+ {\r
+ if (TEmask[(j+TECIystart)*TExsize+(i+TECIxstart)])\r
+ {\r
+ TEcopy[j*TEcopyxsize+i]=TEimage[(j+TECIystart)*TExsize+(i+TECIxstart)];\r
+ TEcmsk[j*TEcopyxsize+i]=0xf;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+static void TERotateImageAntiClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 15/Jul/98 - rotates image (must be square) 90 degrees anti-clockwise\r
+ {\r
+// unsigned char *TERILsrc=TEimage;\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ if (TERILxsize==TERILysize)\r
+ {\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TERotateImageAntiClockwise");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[(i*TERILxsize)+(TERILysize-1-j)];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+ }\r
+\r
+static void TERotateImageClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 16/Jul/98 - rotates image (must be square) 90 degrees clockwise\r
+ {\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ if (TERILxsize==TERILysize)\r
+ {\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TERotateImageClockwise");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[((TERILxsize-1-i)*TERILxsize)+(j)];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+ }\r
+\r
+static void TEFlipImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 15/Jul/98 - flips image\r
+ {\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TEFlipImage");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[((TERILysize-1-j)*TERILxsize)+i];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+\r
+static void TEMirrorImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 15/Jul/98 - mirrors image\r
+ {\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TEMirrorImage");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[(j*TERILxsize)+(TERILxsize-1-i)];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+\r
+static void TEFillImage(char *TEFIimage, char *TEFImask, int TEFIxsize, int TEFIysize, int TEFIx, int TEFIy, char TEFIcolour)\r
+// -- ric: 29/Jul/98 - Fill procedure - sets up and calls recursive procedure below\r
+ {\r
+ int i,j;\r
+ unsigned char *TEFIfillmask=NULL; // will eventually contain 0 for ignore and 1 for fill\r
+ TEFIfillmask=(char *) TEAlloc(TEFIxsize*TEFIysize, "temporary fill buffer for TEFillImage");\r
+ TERFillImage(TEFIimage, TEFIfillmask, TEFIxsize, TEFIysize, TEFIx, TEFIy);\r
+\r
+ if (TEFImask)\r
+ for (j=0; j<TEFIysize; j++)\r
+ for (i=0; i<TEFIxsize; i++)\r
+ TEFIfillmask[j*TEFIxsize+i]&=TEFImask[j*TEFIxsize+i];\r
+\r
+ for (j=0; j<TEFIysize; j++)\r
+ for (i=0; i<TEFIxsize; i++)\r
+ if (TEFIfillmask[j*TEFIxsize+i]) TEFIimage[j*TEFIxsize+i]=TEFIcolour;\r
+ TEFree(TEFIfillmask);\r
+ }\r
+\r
+static void TERFillImage(char *TERFIimage, char *TERFImask, int TERFIxsize, int TERFIysize, int TERFIx, int TERFIy)\r
+// -- ric: 29/Jul/98 - Recursive fill procedure\r
+ {\r
+ int x,y;\r
+ char TERFIcc;\r
+ TERFImask[TERFIy*TERFIxsize+TERFIx]=0xf;\r
+ TERFIcc=TERFIimage[TERFIy*TERFIxsize+TERFIx];\r
+ x=TERFIx-1;\r
+ y=TERFIy;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ x=TERFIx;\r
+ y=TERFIy-1;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ x=TERFIx+1;\r
+ y=TERFIy;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ x=TERFIx;\r
+ y=TERFIy+1;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ }\r
+\r
+static void TEShiftColours(char *TESCimage, char *TESCmask, int TESCxsize, int TESCysize, int amount)\r
+// -- ric: 17/Jul/98 - Colour shift idea by McGrue and Tarkuss\r
+ {\r
+ int i,j;\r
+ j=TESCysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TESCxsize;\r
+ do\r
+ {\r
+ i--;\r
+ if (!(TESCmask))\r
+ TESCimage[j*TESCxsize+i]+=amount;\r
+ else\r
+ if (TESCmask[j*TESCxsize+i])\r
+ TESCimage[j*TESCxsize+i]+=amount;\r
+ } while (i>0);\r
+ } while (j>0);\r
+ }\r
+\r
+\r
+static void TEUndo (void)\r
+ {\r
+ unsigned char *tempimg=TEimage;\r
+ TEimage=TEundo;\r
+ TEundo=tempimg;\r
+ }\r
+\r
+static void *TEAlloc(unsigned long amount, char *whatfor)\r
+// -- ric: 14/Jul/98 - TE's custom, error-handling memory allocation routine\r
+ {\r
+ char *TETmpBuf=NULL;\r
+\r
+ amount += 3; // aen\r
+ amount &= ~3;\r
+\r
+// static char DebugBuf[256];\r
+ TETmpBuf=(char *) malloc(amount);\r
+ if (!TETmpBuf)\r
+ {\r
+ sprintf(TEtempstr, "Unable to allocate %ld bytes for %s.", amount, whatfor);\r
+ err(TEtempstr);\r
+ }\r
+ memset(TETmpBuf,0, amount); // Clear allocated mem\r
+ /*\r
+ __asm { // aen\r
+ mov edi,TETmpBuf\r
+ mov ecx,amount\r
+ shr ecx,2\r
+ xor eax,eax\r
+ cld\r
+ rep stosd\r
+ } ;\r
+ */\r
+ return TETmpBuf;\r
+ }\r
+\r
+#ifdef JUNK\r
+static void TEFree(void *TETmpBuf)\r
+// -- ric: 14/Jul/98 - TE's custom memory freeing routine\r
+ {\r
+ if (TETmpBuf) free(TETmpBuf); // Only free memory if previously allocated\r
+ TETmpBuf=NULL; // Set freed memory to point to NULL\r
+ }\r
+#endif\r
+\r
+static void MBClickHandler(TEREGION *TEBaseReg)\r
+// -- ric: 20/Jul/98 - Mouse button click handler\r
+ {\r
+ int i,j;\r
+ ReadMouse();\r
+ if (TEBaseReg)\r
+ {\r
+ if (!TEBaseReg->data) err("No region data defined.");\r
+ if (((struct DATABASEREGION *)TEBaseReg->data)->infotype!=DITBASEREGION)\r
+ err("MBClickHandler called with invalid base region.");\r
+ }\r
+\r
+ for (i=0; i<3; ++i)\r
+ {\r
+ if (mb & (i+1))\r
+ {\r
+ if (MBStatus[i] == MOUSECLICKED)\r
+ MBStatus[i]=MOUSEPRESSED;\r
+ else if (MBStatus[i] == MOUSENONE)\r
+ {\r
+ MBStatus[i] = MOUSECLICKED;\r
+ if (TEBaseReg)\r
+ {\r
+ TEOldReg = NULL;\r
+ for (j=0; j<((struct DATABASEREGION *)TEBaseReg->data)->numofregs; ++j)\r
+ if (MouseOverTEreg(TEBaseReg+j)&&!((TEBaseReg+j)->bitflags®NOCLICK))\r
+ TEOldReg = TEBaseReg+j;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (MBStatus[i] <= MOUSERELEASE)\r
+ MBStatus[i] = MOUSENONE;\r
+ else if (MBStatus[i]>MOUSERELEASE)\r
+ MBStatus[i] = MOUSERELEASE;\r
+ }\r
+ }\r
+ }\r
+\r
+static void AboutTE (void)\r
+// Just here to test the mouse input loop - remove this later\r
+ {\r
+ TEREGION *TEr=NULL;\r
+ TEREGION *TEaboutwin=NULL;\r
+// int amxsize=150, amysize=82;\r
+ int amxofs=60, amyofs=60;\r
+ int i,i2,j,j2;\r
+ int QuitAW=FALSE;\r
+ int moving=FALSE;\r
+\r
+ // Allocate memory\r
+ TEaboutwin=(struct TEREGION *) TEAlloc((sizeof (struct TEREGION))*4,"about window regions");\r
+ TEr=TEaboutwin;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=amxofs;\r
+ TEr->x2=TEr->x1+150;\r
+ TEr->y1=amyofs;\r
+ TEr->y2=TEr->y1+82;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+// TEr->drawproc=NULL;\r
+ sprintf(strbuf, "About MapEd %s Tile Editor", ME2_VERSION);\r
+ TEr->caption=TENewText(strbuf, "About window");\r
+ TEr->data=(struct DATABASEREGION *) TEAlloc(sizeof (struct DATABASEREGION), "base region data");\r
+ ((struct DATABASEREGION *)(TEr->data))->infotype=DITBASEREGION;\r
+ ((struct DATABASEREGION *)(TEr->data))->numofregs=4;\r
+ ((struct DATABASEREGION *)(TEr->data))->windowtype=DBRSTDWINDOW;\r
+\r
+ TEr+=1;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=0;\r
+ TEr->x2=TEaboutwin->x2-TEaboutwin->x1-9;\r
+ TEr->y1=0;\r
+ TEr->y2=8;\r
+ TEr->bitflags=REGACTIVE;\r
+// TEr->drawproc=NULL;\r
+// TEr->caption=NULL;\r
+\r
+ TEr+=1;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEaboutwin->x2-TEaboutwin->x1-9;\r
+ TEr->x2=TEaboutwin->x2-TEaboutwin->x1-3;\r
+ TEr->y1=3;\r
+ TEr->y2=6;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+// TEr->caption=NULL;\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "quit button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=NULL;\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&QuitAW;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TRUE;\r
+\r
+ TEr+=1;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=60;\r
+ TEr->x2=90;\r
+ TEr->y1=62;\r
+ TEr->y2=72;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=TENewText("ok","ok button caption");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "quit button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=NULL;\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&QuitAW;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TRUE;\r
+ TEr=TEaboutwin+1; // point to title bar area\r
+\r
+ while (!QuitAW)\r
+ {\r
+ // Mouse button click handler routines\r
+ MBClickHandler(TEaboutwin);\r
+\r
+ amxofs=TEaboutwin->x1;\r
+ amyofs=TEaboutwin->y1;\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSERELEASE)\r
+ moving=FALSE;\r
+\r
+ // Draw loop\r
+ RenderTileEdit(TEregs);\r
+ RenderTileEdit(TEaboutwin);\r
+\r
+ sprintf(strbuf, "MapEd v.%s", ME2_VERSION);\r
+ GotoXY(amxofs+52, amyofs+16); printstring(strbuf);\r
+ GotoXY(amxofs+31, amyofs+22); printstring("Copyright (C) 1998 vecna");\r
+ GotoXY(amxofs+40, amyofs+28); printstring("All Rights Reserved");\r
+ sprintf(strbuf, "MapEd v.%s Tile Editor", ME2_VERSION);\r
+ GotoXY(amxofs+29, amyofs+41); printstring(strbuf);\r
+ GotoXY(amxofs+20, amyofs+47); printstring("Additional code by Richard Lau");\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ // Move window?\r
+ if (MouseOverTEreg(TEr) && TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED)\r
+ {\r
+ i2=TEaboutwin->x2-TEaboutwin->x1;\r
+ j2=TEaboutwin->y2-TEaboutwin->y1;\r
+ i=mx-TEaboutwin->x1;\r
+ j=my-TEaboutwin->y1;\r
+ moving=TRUE;\r
+ }\r
+ }\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSEPRESSED && moving)\r
+ {\r
+ if (((mx-i)<16)) TEaboutwin->x1=16;\r
+ else if (((mx-i+i2)>=(16+sx))) TEaboutwin->x1=16+(sx-i2);\r
+ else TEaboutwin->x1=mx-i;\r
+ if (((my-j)<16)) TEaboutwin->y1=16;\r
+ else if (((my-j+j2)>=(16+sy))) TEaboutwin->y1=16+(sy-j2);\r
+ else TEaboutwin->y1=my-j;\r
+ TEaboutwin->x2=TEaboutwin->x1+i2;\r
+ TEaboutwin->y2=TEaboutwin->y1+j2;\r
+ }\r
+\r
+ if (key[SCAN_ESC])\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ QuitAW=TRUE;\r
+ }\r
+\r
+ }\r
+ // free TEaboutwin\r
+ TEFreeReg(TEaboutwin);\r
+ }\r
+\r
+static void RestartTileEditor(void)\r
+// -- ric: 17/Jul/98 - reinit the tile editor\r
+ {\r
+ int i,j, amount;\r
+ unsigned char *TERTEmask=NULL;\r
+\r
+ switch (TEtype)\r
+ {\r
+ case TETILE: // edit tile TEtile\r
+ i=TExsize;\r
+ j=TEysize;\r
+ amount=i*j;\r
+ TERTEmask=(unsigned char *) TEAlloc(amount, "tile editor mask backup buffer");\r
+\r
+ // backup mask\r
+ memcpy(TERTEmask, TEmask, amount);\r
+\r
+ // Restart editor\r
+ DeinitTEImage();\r
+ TEFreeReg(TEregs);\r
+ TEtype=TETILE;\r
+ TExsize=i;\r
+ TEysize=j;\r
+ TEsource=vsp+(256*TEtile);\r
+ InitTEImage();\r
+ SetupRegions();\r
+\r
+ // Restore mask\r
+ memcpy(TEmask, TERTEmask, amount);\r
+ TEFree(TERTEmask);\r
+ break;\r
+ }\r
+ }\r
+\r
+static void InitTEImage (void)\r
+// Copy the image data being edited and allocate memory for the image buffers\r
+ {\r
+ int i;\r
+ int amount=TExsize*TEysize;\r
+ if (TEtype==TEUNKNOWN) err("Unrecognised tile editor graphics type.");\r
+ if (!TEsource) err("Invalid input image.");\r
+ TEimage=(unsigned char *) TEAlloc(amount, "tile editor image buffer");\r
+ TEmask=(unsigned char *) TEAlloc(amount, "tile editor mask buffer");\r
+ TEundo=(unsigned char *) TEAlloc(amount, "tile editor undo buffer");\r
+// if (!TEimage || !TEundo) err("Cannot allocate memory for tile editor image buffers.");\r
+ memcpy(TEimage, TEsource, amount); // copy original image into edit buffer\r
+ memcpy(TEundo, TEimage, amount); // copy original image into undo buffer\r
+\r
+ // if editing tile find the animation strand (if any) tile belongs to\r
+ TEanimstrand=0; // Does not belong to an animation strand\r
+ if (TEtype==TETILE)\r
+ {\r
+ i=100;\r
+ do\r
+ {\r
+ i--;\r
+ if (vspanim[i].delay && TEtile<=vspanim[i].finish && TEtile>=vspanim[i].start)\r
+ TEanimstrand=i+1;\r
+ } while (i>0);\r
+ }\r
+ }\r
+\r
+static void DeinitTEImage(void)\r
+// Unallocate allocated image buffers - copy edited buffer into original\r
+ {\r
+ memcpy(TEsource, TEimage, (TExsize*TEysize));\r
+ TEFree(TEimage);\r
+ TEFree(TEmask);\r
+ TEFree(TEundo);\r
+ TEtype=TEUNKNOWN; // Clear type info for error checking purposes\r
+ TExsize=0;\r
+ TEysize=0;\r
+ }\r
+\r
+static void SetupRegions (void)\r
+ {\r
+ int temp;\r
+ TEREGION *TEr=NULL;\r
+\r
+ // Allocate memory\r
+ TEregs=(struct TEREGION *) TEAlloc((sizeof (struct TEREGION))*MAX_REGIONS,"tile edit regions");\r
+\r
+ TEr=TEregs+BASEREG;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=16;\r
+ TEr->x2=TEr->x1+sx;\r
+ TEr->y1=16;\r
+ TEr->y2=TEr->y1+sy;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=NULL;\r
+ TEr->caption=NULL;\r
+ switch (TEtype)\r
+ {\r
+ case TETILE:\r
+ sprintf(TEtempstr, "MapEd %s Tile Editor - Tile: %d", ME2_VERSION, TEtile);\r
+ if (TEanimstrand)\r
+ sprintf(TEtempstr, "MapEd %s Tile Editor - Tile: %d (anim strand: %d, frame: %d/%d)",\r
+ ME2_VERSION,\r
+ TEtile, TEanimstrand-1, TEtile-vspanim[TEanimstrand-1].start+1,\r
+ vspanim[TEanimstrand-1].finish-vspanim[TEanimstrand-1].start+1);\r
+ SetCaption(TEr, TEtempstr);\r
+ break;\r
+ }\r
+ TEr->data=(struct DATABASEREGION *) TEAlloc(sizeof (struct DATABASEREGION), "base region data");\r
+ ((struct DATABASEREGION *)(TEr->data))->infotype=DITBASEREGION;\r
+ ((struct DATABASEREGION *)(TEr->data))->numofregs=MAX_REGIONS;\r
+ ((struct DATABASEREGION *)(TEr->data))->windowtype=DBRSTDWINDOW;\r
+\r
+ TEr=TEregs+HELPBAR;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=3;\r
+ TEr->x2=TEregs->x2-TEregs->x1-3;\r
+ TEr->y1=TEregs->y2-TEregs->y1-13;\r
+ TEr->y2=TEregs->y2-TEregs->y1-3;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawHelpBar;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ temp=(((TEregs->x2-TEregs->x1-8)>>6)<<5)+2;\r
+ TEr=TEregs+PALETTE;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=((TEregs->x2-TEregs->x1)>>1)-temp;\r
+ TEr->x2=((TEregs->x2-TEregs->x1)>>1)+temp;\r
+ TEr->y1=TEregs->y2-TEregs->y1-36;\r
+ TEr->y2=TEregs->y2-TEregs->y1-16;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawPalette;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+EDITREG;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=3;\r
+ TEr->x2=3+128+4;\r
+ TEr->y1=10;\r
+ TEr->y2=10+128+4;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawEditReg;\r
+ TEr->caption=NULL;\r
+ TEr->data=(struct DATAEDITREG *) TEAlloc(sizeof (struct DATAEDITREG), "edit region data");\r
+ ((struct DATAEDITREG *)(TEr->data))->infotype=DITEDITREG;\r
+\r
+ TEr=TEregs+PREVIEW;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs->x2-TEregs->x1-23;\r
+ TEr->x2=TEregs->x2-TEregs->x1-3;\r
+ TEr->y1=10;\r
+ TEr->y2=10+20;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawPreview;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+SCOLBOX;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDITREG].x1;\r
+ TEr->x2=TEr->x1+20;\r
+ TEr->y1=TEregs[EDITREG].y2+2;\r
+ TEr->y2=TEr->y1+16;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawSColBox;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+SCTXTBX;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[SCOLBOX].x2+2;\r
+ TEr->x2=TEregs[EDITREG].x2;\r
+ TEr->y1=TEregs[SCOLBOX].y1;\r
+ TEr->y2=TEregs[SCOLBOX].y2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSCTxtBx;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+QUITBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs->x2-TEregs->x1-9;\r
+ TEr->x2=TEregs->x2-TEregs->x1-3;\r
+ TEr->y1=3;\r
+ TEr->y2=6;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "quit button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Exit", "quit button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEQUITCUR;\r
+\r
+ TEr=TEregs+EDMDFRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDITREG].x2+3;\r
+ TEr->x2=TEr->x1+34;\r
+ TEr->y1=TEregs[EDITREG].y1;\r
+ TEr->y2=TEr->y1+11*5+3; // 10*number of buttons\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+DRAWBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Draw");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "draw button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Draw mode", "draw button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDDRAW;\r
+\r
+ TEr=TEregs+FILLBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+11;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Fill");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "fill button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Fill mode", "fill button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDFILL;\r
+\r
+ TEr=TEregs+PICKBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+22;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Pick");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "pick button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Pick color mode", "pick button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDPICK;\r
+\r
+ TEr=TEregs+MASKBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+33;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Select");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "select button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Select mode", "select button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDMASK;\r
+\r
+ TEr=TEregs+PSTEBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+44;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Paste");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "paste button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Paste mode", "paste button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDPASTE;\r
+\r
+ TEr=TEregs+IND_FRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[SCTXTBX].x2+2;\r
+ TEr->x2=TEr->x1+12*4-1; // 10*number of buttons\r
+ TEr->y1=TEregs[SCTXTBX].y1;\r
+ TEr->y2=TEr->y1+13;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+MASKIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[IND_FRM].x1+2;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"m");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "mask indicator data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("mask", "mask indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TESHOWMSK;\r
+\r
+ TEr=TEregs+GRIDIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[MASKIND].x2+1;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"g");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "grid button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("grid", "grid indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEGRID;\r
+\r
+ TEr=TEregs+ANIMIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[GRIDIND].x2+1;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"a");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "animation button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("animation", "animation indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEANIMATE;\r
+\r
+ TEr=TEregs+PXHLIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[ANIMIND].x2+1;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"h");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "highlight button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("pixel highlight", "highlight indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEHILIGHT;\r
+\r
+ TEr=TEregs+BUT_FRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1;\r
+ TEr->x2=TEregs[EDMDFRM].x2;\r
+ TEr->y1=TEregs[EDMDFRM].y2+2;\r
+ TEr->y2=TEr->y1+11*4+3; // 10*number of buttons\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+UNDOBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Undo");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "undo button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Undo last action", "undo button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFAUNDO;\r
+\r
+ TEr=TEregs+COPYBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2+11;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Copy");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "copy button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Copy selected area", "copy button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFACOPY;\r
+\r
+ TEr=TEregs+CUT_BUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2+22;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Cut");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "cut button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Cut selected area", "cut button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFACUT;\r
+\r
+ TEr=TEregs+CLR_BUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2+33;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Clear");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "clear button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Clear selected area", "clear button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFACLEAR;\r
+\r
+ TEr=TEregs+TOOLFRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x2+2;\r
+ TEr->x2=TEr->x1+34;\r
+ TEr->y1=TEregs[BUT_FRM].y1;\r
+ TEr->y2=TEr->y1+11*4+3; // 10*number of buttons\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+RIACBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Turn L");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "rotate button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Rotate anticlockwise", "rotate button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFARIAC;\r
+\r
+ TEr=TEregs+RIC_BUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2+11;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Turn R");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "rotate button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Rotate clockwise", "rotate button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFARIC;\r
+\r
+ TEr=TEregs+FLIPBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2+22;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Flip");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "flip button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Flip", "flip button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFAFLIP;\r
+\r
+ TEr=TEregs+MIRRBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2+33;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Mirror");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "mirror button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Mirror", "mirror button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFAMIRROR;\r
+\r
+ }\r
+\r
+static void DestroyRegions (TEREGION **TEBaseReg)\r
+ {\r
+ TEREGION *TEr=NULL;\r
+ int i;\r
+ if (!(*TEBaseReg)->data) err("No region data defined.");\r
+ if (((struct DATABASEREGION *)(*TEBaseReg)->data)->infotype!=DITBASEREGION)\r
+ err("DestroyRegions called with invalid base region.");\r
+\r
+ i=((struct DATABASEREGION *)(*TEBaseReg)->data)->numofregs;\r
+ do\r
+ {\r
+ i--;\r
+ TEr=(*TEBaseReg)+i;\r
+ TEFree(TEr->caption);\r
+ if (TEr->data)\r
+ {\r
+ switch (((struct DATABASEREGION *)(TEr->data))->infotype)\r
+ {\r
+ case DITBASEREGION:\r
+ break;\r
+ case DITBUTTON:\r
+ TEFree(((struct DATABUTTON *)TEr->data)->text);\r
+ break;\r
+ }\r
+ }\r
+ TEFree(TEr->data);\r
+ } while (i>0);\r
+ TEFree(*TEBaseReg);\r
+// if (*TEBaseReg) err("Not freed");\r
+ }\r
+\r
+static void RenderTileEdit (TEREGION *TEBaseReg)\r
+// -- ric: 20/Jul/98 - updatedt to be a little more generic ;)\r
+ {\r
+ int i;\r
+ TExoffs=TEBaseReg->x1;\r
+ TEyoffs=TEBaseReg->y1;\r
+ if (!TEBaseReg->data) err("No region data defined.");\r
+ if (((struct DATABASEREGION *)TEBaseReg->data)->infotype!=DITBASEREGION)\r
+ err("RenderTileEdit called with invalid base region.");\r
+ switch (((struct DATABASEREGION *)TEBaseReg->data)->windowtype)\r
+ {\r
+ case DBRSTDWINDOW:\r
+ Window(TExoffs,TEyoffs,TEBaseReg->x2,TEBaseReg->y2, ((TEBaseReg->caption) ? TEBaseReg->caption : ""));\r
+ break;\r
+ case DBRPANEL:\r
+ stdwindow(TExoffs,TEyoffs,TEBaseReg->x2,TEBaseReg->y2);\r
+ break;\r
+ }\r
+\r
+ i=((struct DATABASEREGION *)TEBaseReg->data)->numofregs;\r
+ do\r
+ {\r
+ i--;\r
+ if ((TEBaseReg+i)->bitflags®VISIBLE) (TEBaseReg+i)->drawproc(TEBaseReg+i);\r
+ } while (i>1);\r
+ }\r
+\r
+void TileEdit (void)\r
+ {\r
+ int i,j;\r
+ int TEoldeditmode=EDDRAW;\r
+ if (TEbitflags&TEQUITCUR) TEbitflags^=TEQUITCUR;\r
+\r
+ InitTEImage();\r
+ SetupRegions();\r
+ TEeditmode=EDDRAW; // Default to drawing mode\r
+ if (TEbitflags&TESHOWMSK) TEbitflags^=TESHOWMSK;\r
+\r
+ while (!(TEbitflags&TEQUITCUR))\r
+ {\r
+ // Mouse button click handler routines\r
+ MBClickHandler(TEregs);\r
+\r
+ TEbfa=BFANONE; // Reset button action flag\r
+ if (TEeditmode==EDMASK && TEoldeditmode!=EDMASK) TEbitflags|=TESHOWMSK;\r
+ if (TEeditmode==EDMASK && TEoldeditmode==EDMASK && !(TEbitflags&TESHOWMSK))\r
+ TEeditmode=EDDRAW;\r
+ TEoldeditmode=TEeditmode;\r
+\r
+ // Draw loop\r
+ RenderTileEdit(TEregs);\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ if (key[SCAN_ESC])\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ TEbitflags|=TEQUITCUR;\r
+ }\r
+ if ((key[SCAN_CTRL] && key[SCAN_Z]) || (TEbfa&BFAUNDO) || (key[SCAN_U] && !(key[SCAN_CTRL])) && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_U]=0;\r
+ key[SCAN_Z]=0;\r
+ TEUndo();\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_R])\r
+ {\r
+ key[SCAN_R]=0;\r
+ memcpy(TEundo, TEimage, TExsize*TEysize); // copy image into undo buffer\r
+ memcpy(TEimage, TEsource, TExsize*TEysize); // copy original image into edit buffer\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_A])\r
+ {\r
+ key[SCAN_A]=0;\r
+ j=TEysize*TExsize;\r
+ memset(TEmask, 0xf, j);\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_U])\r
+ {\r
+ key[SCAN_U]=0;\r
+ j=TEysize*TExsize;\r
+ memset(TEmask, 0x0, j);\r
+ }\r
+ if ((TEbfa&BFACOPY) || (key[SCAN_CTRL] && key[SCAN_C]) && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_C]=0;\r
+ TECopyImage();\r
+ }\r
+ if ((TEbfa&BFACUT) || (key[SCAN_CTRL] && key[SCAN_X]) && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_X]=0;\r
+ TECopyImage();\r
+ TEClearImage();\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_V] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_V]=0;\r
+ TEeditmode=EDPASTE;\r
+ }\r
+ if ((TEbfa&BFACLEAR) || key[SCAN_DEL] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_DEL]=0;\r
+ TEClearImage();\r
+ }\r
+ if (key[SCAN_Q] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_Q]=0;\r
+ if (TEtype==TETILE && TEanimstrand)\r
+ {\r
+ if (TEtile>vspanim[TEanimstrand-1].start)\r
+ {\r
+ // Change tile index\r
+ TEtile-=1;\r
+ i=TExsize;\r
+ j=TEysize;\r
+\r
+ // Restart editor\r
+ RestartTileEditor();\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_W] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_W]=0;\r
+ if (TEtype==TETILE && TEanimstrand)\r
+ {\r
+ if (TEtile<vspanim[TEanimstrand-1].finish)\r
+ {\r
+ // Change tile index\r
+ TEtile+=1;\r
+ i=TExsize;\r
+ j=TEysize;\r
+\r
+ // Restart editor\r
+ RestartTileEditor();\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((TEbfa&BFARIAC) || key[SCAN_L] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_L]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TERotateImageAntiClockwise(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TERotateImageAntiClockwise(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TERotateImageAntiClockwise(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TERotateImageAntiClockwise(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if ((TEbfa&BFARIC) || key[SCAN_R] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_R]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TERotateImageClockwise(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TERotateImageClockwise(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TERotateImageClockwise(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TERotateImageClockwise(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if ((TEbfa&BFAMIRROR) || key[SCAN_X] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_X]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TEMirrorImage(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TEMirrorImage(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TEMirrorImage(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TEMirrorImage(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if ((TEbfa&BFAFLIP) || key[SCAN_Y] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_Y]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TEFlipImage(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TEFlipImage(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TEFlipImage(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TEFlipImage(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if (key[SCAN_F1])\r
+ {\r
+ key[SCAN_F1]=0;\r
+\r
+ // Deacitvate tile editor\r
+ for (i=0; i<MAX_REGIONS; i++)\r
+ if (TEregs[i].bitflags®ACTIVE) TEregs[i].bitflags^=REGACTIVE;\r
+\r
+ AboutTE();\r
+\r
+ // Reacitvate tile editor\r
+ for (i=0; i<MAX_REGIONS; i++)\r
+ TEregs[i].bitflags|=REGACTIVE;\r
+ }\r
+ if (key[SCAN_A])\r
+ {\r
+ key[SCAN_A]=0;\r
+ lcolor+=1;\r
+ lcolor&=255;\r
+ }\r
+ if (key[SCAN_D])\r
+ {\r
+ key[SCAN_D]=0;\r
+ rcolor+=1;\r
+ rcolor&=255;\r
+ }\r
+ if (key[SCAN_Z])\r
+ {\r
+ key[SCAN_Z]=0;\r
+ if (!lcolor) lcolor=255;\r
+ else lcolor-=1;\r
+ }\r
+ if (key[SCAN_C])\r
+ {\r
+ key[SCAN_C]=0;\r
+ if (!rcolor) rcolor=255;\r
+ else rcolor-=1;\r
+ }\r
+ if (key[SCAN_G])\r
+ {\r
+ key[SCAN_G]=0;\r
+ TEbitflags^=TEGRID;\r
+ }\r
+ if (key[SCAN_H])\r
+ {\r
+ key[SCAN_H]=0;\r
+ TEbitflags^=TEHILIGHT;\r
+ }\r
+ if (key[SCAN_I])\r
+ {\r
+ key[SCAN_I]=0;\r
+ j=TEysize*TExsize;\r
+ do\r
+ {\r
+ j--;\r
+ TEmask[j]^=0xf;\r
+ } while (j>0);\r
+ }\r
+ if (key[SCAN_M])\r
+ {\r
+ key[SCAN_M]=0;\r
+ if (TEeditmode==EDMASK)\r
+ TEeditmode=EDDRAW;\r
+ TEbitflags^=TESHOWMSK;\r
+ }\r
+ if (key[SCAN_SPACE])\r
+ {\r
+ key[SCAN_SPACE]=0;\r
+ if (TEeditmode==EDDRAW)\r
+ {\r
+ TEeditmode=EDMASK;\r
+ TEbitflags|=TESHOWMSK;\r
+ }\r
+ else\r
+ TEeditmode=EDDRAW;\r
+ }\r
+ if (key[SCAN_PGUP])\r
+ {\r
+ key[SCAN_PGUP]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ case EDMASK:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ if (TEbitflags&TESHOWMSK)\r
+ TEShiftColours(TEimage, TEmask, TExsize, TEysize, 1);\r
+ else\r
+ TEShiftColours(TEimage, NULL, TExsize, TEysize, 1);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ TEShiftColours(TEcopy, TEcmsk, TEcopyxsize, TEcopyysize, 1);\r
+ break;\r
+ }\r
+ }\r
+ if (key[SCAN_PGDN])\r
+ {\r
+ key[SCAN_PGDN]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ case EDMASK:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ if (TEbitflags&TESHOWMSK)\r
+ TEShiftColours(TEimage, TEmask, TExsize, TEysize, -1);\r
+ else\r
+ TEShiftColours(TEimage, NULL, TExsize, TEysize, -1);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ TEShiftColours(TEcopy, TEcmsk, TEcopyxsize, TEcopyysize, -1);\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (key[SCAN_LANGLE])\r
+ {\r
+ key[SCAN_LANGLE]=0;\r
+ ShutdownVideo();\r
+ TEFreeReg(TEregs);\r
+ vm=0;\r
+ InitVideo(0);\r
+ SetupRegions();\r
+ set_intensity(63);\r
+ InitMouse();\r
+ }\r
+ if (key[SCAN_RANGLE])\r
+ {\r
+ key[SCAN_RANGLE]=0;\r
+ ShutdownVideo();\r
+ TEFreeReg(TEregs);\r
+ vm=1;\r
+ InitVideo(1);\r
+ SetupRegions();\r
+ set_intensity(63);\r
+ InitMouse();\r
+ }\r
+ }\r
+ DeinitTEImage();\r
+ TEFreeReg(TEregs);\r
+ }\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TILEED_INC\r
+#define TILEED_INC\r
+\r
+// TEtype defs\r
+#define TEUNKNOWN 0\r
+#define TETILE 1\r
+\r
+// external functions\r
+extern void TileEdit(void);\r
+\r
+// external variables\r
+extern unsigned int TEtype; // type of graphic being edited\r
+extern unsigned int TEtile; // tile to edit - may possibly expand this to an array for simultaneous editing\r
+extern unsigned int TExsize; // width of graphic being edited\r
+extern unsigned int TEysize; // height of graphic being edited\r
+extern unsigned char *TEsource; // pointer to original image being edited\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+\r
+#include "config.h"\r
+#include "keyboard.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "tileed.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "smalfont.h"\r
+#include "guicomp.h"\r
+#include "gui.h"\r
+\r
+extern byte TileCmp(byte *one, byte *two); //zero\r
+\r
+// ================================= Data ====================================\r
+\r
+int selofs=0;\r
+char ttile[256], ttile2[256];\r
+char curastd=0;\r
+char curmode=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+int curtileptr(int row)\r
+{\r
+ int jumper,wide;\r
+ int x,y;\r
+\r
+ jumper=16+pad;\r
+ wide=320/jumper;\r
+\r
+ x=(mx-16)/jumper;\r
+ y=((my-16)/jumper)*wide;\r
+\r
+ return x+y+row;\r
+}\r
+\r
+void NormalButton(int x1, int y1, int x2, int y2, char *str)\r
+{\r
+ FilledBox(x1, y1, x2, y2, winbg);\r
+ HLine(x1, y1, x2, black);\r
+ VLine(x1, y1, y2, black);\r
+ HLine(x1+1, y1+y2-1, x2-1, black);\r
+ VLine(x1+x2-1, y1+1, y2-1, black);\r
+\r
+ HLine(x1+1, y1+1, x2-2, brightw);\r
+ VLine(x1+1, y1+1, y2-2, brightw);\r
+ HLine(x1+2, y1+y2-2, x2-3, darkw);\r
+ VLine(x1+x2-2, y1+2, y2-3, darkw);\r
+ GotoXY(x1+((x2-pixels(str))/2), y1+3);\r
+ printstring(str);\r
+}\r
+\r
+void PressdButton(int x1, int y1, int x2, int y2, char *str)\r
+{\r
+ FilledBox(x1, y1, x2, y2, winbg);\r
+ HLine(x1, y1, x2, black);\r
+ VLine(x1, y1, y2, black);\r
+ HLine(x1+1, y1+y2-1, x2-1, black);\r
+ VLine(x1+x2-1, y1+1, y2-1, black);\r
+\r
+ HLine(x1+1, y1+1, x2-2, darkw);\r
+ VLine(x1+1, y1+1, y2-2, darkw);\r
+ GotoXY(x1+((x2-pixels(str))/2)+1, y1+4);\r
+ printstring(str);\r
+}\r
+\r
+void RenderSelector()\r
+{ unsigned char *img,i,j;\r
+ int z;\r
+ int tskip=16+pad;\r
+ int twide=320/tskip;\r
+ int tdeep=((200+15)&~15)/tskip;\r
+\r
+ ClearScreen();\r
+\r
+ for (i=0; i<tdeep; ++i)\r
+ for (j=0; j<twide; ++j)\r
+ {\r
+ img=vsp+(256*((i*twide)+j+selofs));\r
+ if (((i*twide)+j+selofs)>=numtiles) img=vsp;\r
+ CopyTile((j*tskip)+16,(i*tskip)+16,img);\r
+ }\r
+ if (th)\r
+ {\r
+ if (my<(tsy-40))\r
+ DrawHighlight( ((mx/tskip)*tskip)-(1+pad),\r
+ ((my/tskip)*tskip)-(1+pad));\r
+ }\r
+ z=tsy-40;\r
+ sprintf(strbuf,"MapEd %s Tile Selector - Tile %d/%d",ME2_VERSION,curtileptr(selofs),numtiles);\r
+ Window(16,z,336,z+40,strbuf);\r
+ HLine(278, z+11, 53, darkw);\r
+ VLine(278, z+11, 25, darkw);\r
+ VLine(330, z+12, 24, brightw);\r
+ HLine(279, z+35, 51, brightw);\r
+ if (curmode==0) PressdButton(290, z+12, 40, 12, "Select");\r
+ else NormalButton(290, z+12, 40, 12, "Select");\r
+ if (curmode==1) PressdButton(290, z+23, 40, 12, "Edit");\r
+ else NormalButton(290, z+23, 40, 12, "Edit");\r
+ if (th) PressdButton(279, z+12, 12, 12, "H");\r
+ else NormalButton(279, z+12, 12, 12, "H");\r
+ if (pad) PressdButton(279, z+23, 12, 12, "P");\r
+ else NormalButton(279, z+23, 12, 12, "P");\r
+\r
+ HLine(219, z+11, 52, darkw);\r
+ VLine(219, z+11, 25, darkw);\r
+ VLine(270, z+12, 24, brightw);\r
+ HLine(220, z+35, 50, brightw);\r
+ NormalButton(220, z+12, 50, 12, "Import VSP");\r
+ NormalButton(220, z+23, 50, 12, "Import PCX");\r
+\r
+ HLine(160, z+11, 52, darkw);\r
+ VLine(160, z+11, 25, darkw);\r
+ VLine(211, z+12, 24, brightw);\r
+ HLine(161, z+35, 50, brightw);\r
+ NormalButton(161, z+12, 50, 12, "Add Tiles");\r
+ NormalButton(161, z+23, 50, 12, "Animation");\r
+\r
+ HLine(26, z+10, 20, darkw);\r
+ VLine(26, z+10, 20, darkw);\r
+ HLine(27, z+29, 19, brightw);\r
+ VLine(45, z+11, 19, brightw);\r
+ FilledBox(27, z+11, 18, 18, black);\r
+ CopyTile(28, z+12, ttile2);\r
+ GotoXY(20, z+32); printstring("Clipboard");\r
+}\r
+\r
+void FlipX(unsigned short edtile)\r
+{ int i,j;\r
+\r
+ key[SCAN_X]=0;\r
+ if (edtile>=numtiles) return;\r
+ memcpy(ttile,&vsp[edtile*256],256);\r
+ modified=1;\r
+\r
+ for (i=0;i<16;i++)\r
+ for (j=0;j<16;j++)\r
+ vsp[((edtile)*256)+(j*16)+i]=ttile[(j*16)+(15-i)];\r
+}\r
+\r
+void FlipY(unsigned short edtile)\r
+{ int i,j;\r
+\r
+ key[SCAN_Y]=0;\r
+ if (edtile>=numtiles) return;\r
+ memcpy(ttile,&vsp[edtile*256],256);\r
+ modified=1;\r
+\r
+ for (i=0;i<16;i++)\r
+ for (j=0;j<16;j++)\r
+ vsp[((edtile)*256)+(j*16)+i]=ttile[((15-j)*16)+i];\r
+}\r
+\r
+void FlipZ(unsigned short edtile)\r
+{ int i,j;\r
+\r
+ key[SCAN_Z]=0;\r
+ if (edtile>=numtiles) return;\r
+ memcpy(ttile,&vsp[edtile*256],256);\r
+ modified=1;\r
+\r
+ for (i=0;i<16;i++)\r
+ for (j=0;j<16;j++)\r
+ vsp[((edtile)*256)+(j*16)+i]=ttile[(i*16)+j];\r
+}\r
+\r
+void DrawHighlight(int x, int y)\r
+{\r
+ if (x<10 || y<10 || x>330 || y>sy+10) return;\r
+ HLine(x, y, 18, white);\r
+ HLine(x, y+17, 18, white);\r
+ VLine(x, y, 18, white);\r
+ VLine(x+17, y, 18, white);\r
+}\r
+\r
+void TileSelector()\r
+{ int z, ct, k,j,m;\r
+ char *s, *d;\r
+\r
+ int ms_down=0; // aen\r
+ int ms_up=0;\r
+\r
+ while (!key[SCAN_ESC])\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ ms_down=0;\r
+ ms_up=0;\r
+ if (mouse_scroll)\r
+ {\r
+ if (my>tsy-2) ms_down=1;\r
+ if (my<18) ms_up=1;\r
+ }\r
+\r
+ if ((key[SCAN_DOWN] || (ms_down && (!(systemtime%10)))) && selofs<65319)\r
+ {\r
+ if (!pad) selofs=selofs+20;\r
+ else selofs+=18;\r
+ key[SCAN_DOWN]=0;\r
+ systemtime++;\r
+ }\r
+ if ((key[SCAN_UP] || (ms_up && (!(systemtime%10)))) && selofs>17)\r
+ {\r
+ if (!pad) selofs-=20;\r
+ else selofs-=18;\r
+ key[SCAN_UP]=0;\r
+ systemtime++;\r
+ }\r
+ if (key[SCAN_P])\r
+ {\r
+ key[SCAN_P]=0;\r
+ pad=pad ^ 1;\r
+ selofs=0;\r
+ if (pad) Message("Tile padding enabled.",100);\r
+ else Message("Tile padding disabled.",100);\r
+ }\r
+ if (key[SCAN_H])\r
+ {\r
+ key[SCAN_H]=0;\r
+ th=th ^ 1;\r
+ if (th) Message("Tile Highlight enabled.",100);\r
+ else Message("Tile Highlight disabled.",100);\r
+ }\r
+\r
+ if (key[SCAN_X]) FlipX(curtileptr(selofs));\r
+ if (key[SCAN_Y]) FlipY(curtileptr(selofs));\r
+ if (key[SCAN_Z]) FlipZ(curtileptr(selofs));\r
+ if (key[SCAN_V]) VSPAnimDialog();\r
+ if (key[SCAN_CTRL] && key[SCAN_C])\r
+ {\r
+ memcpy(ttile2, (char *) (vsp+(256*curtileptr(selofs))), 256);\r
+ key[SCAN_C]=0;\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_S])\r
+ {\r
+ if (curtileptr(selofs) >= numtiles) return;\r
+ memcpy((char *) (vsp+(256*curtileptr(selofs))), ttile2, 256);\r
+ modified=1;\r
+ key[SCAN_S]=0;\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_T])\r
+ {\r
+ if (curtileptr(selofs) >= numtiles) return;\r
+ modified=1;\r
+ s=ttile2;\r
+ d=(char *) (vsp+(256*curtileptr(selofs)));\r
+ for (z=0; z<256; z++)\r
+ {\r
+ if (*s) *d=*s;\r
+ d++;\r
+ s++;\r
+ }\r
+ key[SCAN_T]=0;\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_D] && !key[SCAN_ALT])\r
+ {\r
+ key[SCAN_D]=0;\r
+ modified=1;\r
+ z=curtileptr(selofs);\r
+ if (z<numtiles)\r
+ {\r
+ memcpy(vsp+(z*256),vsp+((z+1)*256),((numtiles-z-1)*256));\r
+ numtiles--;\r
+ }\r
+ }\r
+// zero: Super Delete Mode!\r
+// wimpy delete irks me.\r
+ if (key[SCAN_CTRL] && key[SCAN_D] && key[SCAN_ALT])\r
+ {\r
+ key[SCAN_D]=0;\r
+ modified=1;\r
+ z=curtileptr(selofs);\r
+ if(ct<numtiles)\r
+ {\r
+ if(z<numtiles)\r
+ {\r
+ memcpy(vsp+(z*256),vsp+((z+1)*256),((numtiles-z-1)*256));\r
+ numtiles--;\r
+ for(k=0;k<numlayers;k++)\r
+ {\r
+ for(j=0; j<layer[k].sizey; j++)\r
+ {\r
+ for(m=0; m<layer[k].sizex; m++)\r
+ {\r
+ if(layers[k][j*layer[k].sizex+m]==z) layers[k][j*layer[k].sizex+m]=0;\r
+ if(layers[k][j*layer[k].sizex+m]>z) layers[k][j*layer[k].sizex+m]--;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+// zero: Super Insert Mode!\r
+// wimpy insert irks me.\r
+ if (key[SCAN_CTRL] && key[SCAN_I] && key[SCAN_ALT])\r
+ {\r
+ key[SCAN_I]=0;\r
+ ct=curtileptr(selofs);\r
+ if (ct <= numtiles)\r
+ {\r
+ modified=1;\r
+ s=(char *) valloc((numtiles+1)*256, "s_ins",0);\r
+ memcpy(s, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=s; s=0;\r
+ for (z=numtiles-1; z>=ct; z--)\r
+ memcpy(vsp+((z+1)*256),vsp+(z*256),256);\r
+ memset(vsp+(ct*256), 0, 256);\r
+ numtiles++;\r
+ }\r
+ for(k=0;k<numlayers;k++)\r
+ {\r
+ for(j=0; j<layer[k].sizey; j++)\r
+ {\r
+ for(m=0; m<layer[k].sizex; m++)\r
+ {\r
+ if(layers[k][j*layer[k].sizex+m]>=ct) layers[k][j*layer[k].sizex+m]++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (key[SCAN_CTRL] && key[SCAN_I] && !key[SCAN_ALT])\r
+ {\r
+ key[SCAN_I]=0;\r
+ ct=curtileptr(selofs);\r
+ if (ct <= numtiles)\r
+ {\r
+ modified=1;\r
+ s=(char *)valloc((numtiles+1)*256,"s_ins",0);\r
+ memcpy(s, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=s; s=0;\r
+ for (z=numtiles-1; z>=ct; z--)\r
+ memcpy(vsp+((z+1)*256),vsp+(z*256),256);\r
+ memset(vsp+(ct*256), 0, 256);\r
+ numtiles++;\r
+ }\r
+ }\r
+ if (key[SCAN_E])\r
+ {\r
+ modified=1;\r
+ TEtile=curtileptr(selofs); // middle tile initially\r
+ if (TEtile<numtiles)\r
+ {\r
+ TEtype=TETILE;\r
+ TEsource=vsp+(256*TEtile);\r
+ TExsize=16;\r
+ TEysize=16;\r
+ TileEdit();\r
+ }\r
+ }\r
+\r
+ if (mb==1 && my<(tsy-40) && !curmode)\r
+ {\r
+ if (curtileptr(selofs)<numtiles)\r
+ {\r
+ lt=curtileptr(selofs);\r
+ key[SCAN_ESC]=1;\r
+ }\r
+ WaitRelease();\r
+ }\r
+ if (mb==2 && my<(tsy-40) && !curmode)\r
+ {\r
+ if (curtileptr(selofs)<numtiles)\r
+ {\r
+ rt=curtileptr(selofs);\r
+ key[SCAN_ESC]=1;\r
+ }\r
+ WaitRelease();\r
+ }\r
+ if (mb && my<(tsy-40) && curmode)\r
+ {\r
+ WaitRelease();\r
+ TEtile=curtileptr(selofs); // middle tile initially\r
+ if (TEtile<numtiles)\r
+ {\r
+ modified=1;\r
+ TEtype=TETILE;\r
+ TEsource=vsp+(256*TEtile);\r
+ TExsize=16;\r
+ TEysize=16;\r
+ TileEdit();\r
+ }\r
+ }\r
+ z=tsy-40;\r
+ if (mb && mx>290 && mx<330 && my>z+12 && my<z+23)\r
+ {\r
+ curmode=0;\r
+ WaitRelease();\r
+ Message("Tile select mode.",100);\r
+ }\r
+ if (mb && mx>290 && mx<330 && my>z+23 && my<z+47)\r
+ {\r
+ curmode=1;\r
+ WaitRelease();\r
+ Message("Tile edit mode.",100);\r
+ }\r
+ if (mb && mx>278 && mx<289 && my>z+12 && my<z+23)\r
+ {\r
+ WaitRelease();\r
+ th=th ^ 1;\r
+ if (th) Message("Tile Highlight enabled.",100);\r
+ else Message("Tile Highlight disabled.",100);\r
+ mb=0;\r
+ }\r
+ if (mb && mx>278 && mx<289 && my>z+23 && my<z+47)\r
+ {\r
+ WaitRelease();\r
+ selofs=0;\r
+ pad=pad ^ 1;\r
+ if (pad) Message("Tile padding enabled.",100);\r
+ else Message("Tile padding disabled.",100);\r
+ mb=0;\r
+ }\r
+ if (mb && mx>161 && mx<210 && my>z+12 && my<z+23)\r
+ {\r
+ modified=1;\r
+ PressdButton(161, z+12, 50, 12, "Add Tiles");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ AddTilesDialog();\r
+ mb=0;\r
+ }\r
+ if (mb && mx>161 && mx<210 && my>z+23 && my<z+47)\r
+ {\r
+ PressdButton(161, z+23, 50, 12, "Animation");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ VSPAnimDialog();\r
+ mb=0;\r
+ }\r
+ if (mb && mx>220 && mx<270 && my>z+12 && my<z+24)\r
+ {\r
+ PressdButton(220, z+12, 50, 12, "Import VSP");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ ImportVSP();\r
+ modified=1;\r
+ mb=0;\r
+ }\r
+ if (mb && mx>220 && mx<270 && my>z+23 && my<z+47)\r
+ {\r
+ PressdButton(220, z+23, 50, 12, "Import PCX");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ ImportPCX();\r
+ modified=1;\r
+ mb=0;\r
+ }\r
+ if (key[SCAN_F10])\r
+ {\r
+ key[SCAN_F10]=0;\r
+ SaveMAP(mapname);\r
+ SaveVSP(vspname);\r
+ Message("MAP/VSP saved.",100);\r
+ modified=0;\r
+ }\r
+ }\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+int vaxsize=150, vaysize=66;\r
+int vaxofs=20, vayofs=20;\r
+\r
+void VSPAnimDialog()\r
+{ char done=0, moving=0, i=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str, bleh;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ bleh=th;\r
+ th=0;\r
+ i=curastd;\r
+ sprintf(nstr1, "%d", vspanim[i].start);\r
+ sprintf(nstr2, "%d", vspanim[i].finish);\r
+ sprintf(nstr3, "%d", vspanim[i].delay);\r
+ sprintf(nstr4, "%d", vspanim[i].mode);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ vaxofs = (mx-mxo);\r
+ vayofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (vaxofs<16) vaxofs = 16;\r
+ if (vayofs<16) vayofs = 16;\r
+ if (vaxofs+vaxsize>335) vaxofs = 336-vaxsize;\r
+ if (vayofs+vaysize>sy+16) vayofs = (sy+16)-vaysize;\r
+ }\r
+\r
+ Window(vaxofs, vayofs, vaxofs+vaxsize, vayofs+vaysize, "VSP Animation Editor");\r
+ CopyTile(vaxofs+110, vayofs+16, (char *) (vsp+(256*tileidx[vspanim[i].start])));\r
+ GotoXY(vaxofs+4, vayofs+12); printstring("Start");\r
+ TextField(vaxofs+25, vayofs+11, 60, nstr1, ctf == 1 ? cb : 0);\r
+ GotoXY(vaxofs+11, vayofs+22); printstring("End");\r
+ TextField(vaxofs+25, vayofs+21, 60, nstr2, ctf == 2 ? cb : 0);\r
+ GotoXY(vaxofs+4, vayofs+32); printstring("Delay");\r
+ TextField(vaxofs+25, vayofs+31, 60, nstr3, ctf == 3 ? cb : 0);\r
+ GotoXY(vaxofs+6, vayofs+42); printstring("Mode");\r
+ TextField(vaxofs+25, vayofs+41, 60, nstr4, ctf == 4 ? cb : 0);\r
+ GotoXY(vaxofs+2, vayofs+56); printstring("Strand");\r
+ GotoXY(vaxofs+104, vayofs+33); printstring("Preview");\r
+ HLine(vaxofs+1, vayofs+51, 148, white);\r
+ Button(vaxofs+85, vayofs+54, "OK");\r
+ Button(vaxofs+117, vayofs+54, "Update");\r
+ GotoXY(vaxofs+30, vayofs+56);\r
+ sprintf(strbuf, "%d", i); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+11 && my<vayofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+21 && my<vayofs+9+21 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+31 && my<vayofs+9+31 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+41 && my<vayofs+9+41 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>vaxofs+85 && mx<vaxofs+30+85 && my>vayofs+54 && my<vayofs+10+54 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(vaxofs+85, vayofs+54, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+117 && mx<vaxofs+30+117 && my>vayofs+54 && my<vayofs+10+54 && !moving)\r
+ {\r
+ // insert code for button "Update" here\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ InitTileIDX();\r
+ ButtonPressed(vaxofs+117, vayofs+54, "Update");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(vaxofs+vaxsize-9) && (mx<vaxofs+vaxsize-2)\r
+ && my>(vayofs+1) && (my<vayofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs && mx<vaxofs+vaxsize && my>vayofs && my<(vayofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-vaxofs;\r
+ myo=my-vayofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ if (i<99) i++; else i=0;\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ sprintf(nstr1, "%d", vspanim[i].start);\r
+ sprintf(nstr2, "%d", vspanim[i].finish);\r
+ sprintf(nstr3, "%d", vspanim[i].delay);\r
+ sprintf(nstr4, "%d", vspanim[i].mode);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ if (i) i--; else i=99;\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ sprintf(nstr1, "%d", vspanim[i].start);\r
+ sprintf(nstr2, "%d", vspanim[i].finish);\r
+ sprintf(nstr3, "%d", vspanim[i].delay);\r
+ sprintf(nstr4, "%d", vspanim[i].mode);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=4; str=nstr4; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+// memset(&vadelay, 0, 100);\r
+// for (i=0; i<numtiles; i++)\r
+// tileidx[i]=i;\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ curastd=i;\r
+ th=bleh;\r
+}\r
+\r
+int atxsize=150, atysize=39;\r
+int atxofs=80, atyofs=50;\r
+\r
+void AddTilesDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, at=0; //, i;\r
+ char ctf=0, cb=0, c, t, *str, bleh;\r
+ char nstr1[80];\r
+\r
+ bleh=th;\r
+ th=0;\r
+ sprintf(nstr1, "%d", at);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ atxofs = (mx-mxo);\r
+ atyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (atxofs<16) atxofs = 16;\r
+ if (atyofs<16) atyofs = 16;\r
+ if (atxofs+atxsize>335) atxofs = 336-atxsize;\r
+ if (atyofs+atysize>sy+16) atyofs = (sy+16)-atysize;\r
+ }\r
+\r
+ Window(atxofs, atyofs, atxofs+atxsize, atyofs+atysize, "Allocate Additional Tiles");\r
+ GotoXY(atxofs+12, atyofs+15); printstring("Alloc Tiles:");\r
+ TextField(atxofs+56, atyofs+13, 80, nstr1, ctf == 1 ? cb : 0);\r
+ Button(atxofs+85, atyofs+26, "OK");\r
+ Button(atxofs+117, atyofs+26, "Cancel");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>atxofs+56 && mx<atxofs+80+56 && my>atyofs+13 && my<atyofs+9+13 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>atxofs+85 && mx<atxofs+30+85 && my>atyofs+26 && my<atyofs+10+26 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ at=atoi(nstr1);\r
+ str=(char *) valloc((numtiles+at)*256,"vsp data",0);\r
+ memcpy(str,vsp,(numtiles*256));\r
+ vfree(vsp); vsp=str; str=0; ctf=0;\r
+ memset(vsp+(numtiles*256), 0, at*256);\r
+ numtiles+=at;\r
+ ButtonPressed(atxofs+85, atyofs+26, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>atxofs+117 && mx<atxofs+30+117 && my>atyofs+26 && my<atyofs+10+26 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ done=1;\r
+ ButtonPressed(atxofs+117, atyofs+26, "Cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(atxofs+atxsize-9) && (mx<atxofs+atxsize-2)\r
+ && my>(atyofs+1) && (my<atyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>atxofs && mx<atxofs+atxsize && my>atyofs && my<(atyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-atxofs;\r
+ myo=my-atyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ at=atoi(nstr1);\r
+ th=bleh;\r
+// memset(&vadelay, 0, 100);\r
+// for (i=0; i<numtiles; i++)\r
+// tileidx[i]=i;\r
+}\r
+\r
+// ========================= Import *** Data/Code ============================\r
+\r
+char *ovsp, op, oh, openas;\r
+word ontiles;\r
+word sofs=0;\r
+word tilesrippedthissession;\r
+byte *implist; //zero\r
+\r
+void RenderImport()\r
+{ unsigned char *img,i,j;\r
+ int z, jumper,wide,deep;\r
+ int at;\r
+\r
+ jumper=16+pad;\r
+ wide=320/jumper;\r
+ deep=((200+15)&~15)/jumper;\r
+\r
+ ClearScreen();\r
+\r
+ for (i=0; i<deep; i++)\r
+ for (j=0; j<wide; j++)\r
+ {\r
+ at=(i*wide)+j+sofs;\r
+ img=ovsp+(256*at);\r
+ if (at>=ontiles) img=ovsp;\r
+ CopyTile((j*jumper)+16,(i*jumper)+16,img);\r
+ if(at<ontiles) if(implist[at]) ColorGrid((j*jumper)+16,(i*jumper)+16,7); //zero\r
+ }\r
+ if (th)\r
+ {\r
+ if (my<(tsy-40))\r
+ DrawHighlight(((mx/jumper)*jumper)-(1+pad),\r
+ ((my/jumper)*jumper)-(1+pad));\r
+ }\r
+ z=tsy-40;\r
+ sprintf(strbuf,"Import Tiles %d/%d",curtileptr(sofs),ontiles);\r
+ Window(16,z,336,z+40,strbuf);\r
+ sprintf(strbuf,"Tiles imported this session: %d",tilesrippedthissession);\r
+ GotoXY(176-(pixels(strbuf)/2),z+20); printstring(strbuf);\r
+}\r
+\r
+void ImportTiles()\r
+{ //int tp;\r
+ char *str;\r
+ int bloop1,bloop2;\r
+\r
+ op=pad; oh=th;\r
+ pad=1; th=1;\r
+ tilesrippedthissession=0;\r
+ implist=(byte *)malloc(ontiles); //zero\r
+ memset(implist,0,ontiles); //zero\r
+ while (!key[SCAN_ESC])\r
+ {\r
+ RenderImport();\r
+ RenderMessages();\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ if (key[SCAN_DOWN] && sofs<65319)\r
+ {\r
+ if (!pad) sofs=sofs+20;\r
+ else sofs+=18;\r
+ key[SCAN_DOWN]=0;\r
+ }\r
+ if (key[SCAN_UP] && sofs>17)\r
+ {\r
+ if (!pad) sofs-=20;\r
+ else sofs-=18;\r
+ key[SCAN_UP]=0;\r
+ }\r
+/*all by zero here in this scan_b thing*/\r
+ if (key[SCAN_B])\r
+ {\r
+ key[SCAN_B]=0;\r
+ Message("Building duplicate import list",200);\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ for(bloop2=0; bloop2<numtiles; bloop2++)\r
+ {\r
+ if(TileCmp(vsp+bloop2*256,ovsp+bloop1*256))\r
+ {\r
+ implist[bloop1]=1;\r
+ bloop2=numtiles;\r
+ }\r
+ }\r
+ }\r
+ }\r
+//all by zero here in this scan_a thing\r
+ if (key[SCAN_A])\r
+ {\r
+ Message("Importing all tiles",200);\r
+ key[SCAN_A]=0;\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp+(bloop1*256), 256);\r
+ numtiles+=1;\r
+ }\r
+ goto DIE;\r
+ }\r
+\r
+//all by zero here in this scan_n thing\r
+ if (key[SCAN_N])\r
+ {\r
+ Message("Importing all new tiles",200);\r
+ key[SCAN_N]=0;\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ for(bloop2=0; bloop2<numtiles; bloop2++)\r
+ {\r
+ if(TileCmp(vsp+bloop2*256,ovsp+bloop1*256))\r
+ {\r
+ implist[bloop1]=1;\r
+ bloop2=numtiles;\r
+ }\r
+ }\r
+ }\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ if(!implist[bloop1])\r
+ {\r
+ str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp+(bloop1*256), 256);\r
+ numtiles+=1;\r
+ }\r
+ }\r
+ goto DIE;\r
+ }\r
+\r
+ if (mb==1 && my<(tsy-40) && curtileptr(sofs)<ontiles)\r
+ {\r
+ lt=curtileptr(sofs);\r
+ implist[lt]=1; //zero\r
+ str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp+(lt*256), 256);\r
+ numtiles+=1;\r
+ tilesrippedthissession++;\r
+ WaitRelease();\r
+ sprintf(strbuf,"Tile %d imported.",lt);\r
+ Message(strbuf, 200);\r
+ }\r
+ }\r
+ DIE: //zero\r
+ pad=op; th=oh;\r
+ vfree(implist); //zero\r
+}\r
+\r
+void ImportVSP()\r
+{ FILE *f;\r
+ word ver;\r
+ char fname[60];\r
+ int bsize;\r
+\r
+ memset(fname, 0, 60);\r
+ bmode=1; oh=th; th=0;\r
+ Browse(1,"*.vsp","","","",&fname);\r
+ if (strlen(fname)<3) return;\r
+ if (!(f=fopen(fname,"rb")))\r
+ errf("VSP file %s not found.",fname);\r
+ WaitRelease(); th=oh; bmode=0;\r
+\r
+ fread(&ver, 1, 2, f);\r
+ if (ver!=2 && ver!=3)\r
+ errf("VSP file %s is not the correct VSP format.",fname);\r
+ fread(strbuf, 1, 768, f);\r
+ fread(&ontiles, 1, 2, f);\r
+ ovsp=(char *) valloc(256*ontiles,"ovsp",0);\r
+\r
+ if (ver==2)\r
+ fread(ovsp, 256, ontiles, f);\r
+ if (ver==3)\r
+ {\r
+ fread(&bsize, 1, 4, f);\r
+ ReadCompressedLayer1(ovsp, 256*ontiles, f);\r
+ }\r
+\r
+ fclose(f);\r
+\r
+ ImportTiles();\r
+ vfree(ovsp);\r
+ key[SCAN_ESC]=0;\r
+\r
+}\r
+\r
+int OPxsize=100, OPysize=40;\r
+int OPxofs=100, OPyofs=70;\r
+\r
+void OpenPCXas()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ OPxofs = (mx-mxo);\r
+ OPyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (OPxofs<16) OPxofs = 16;\r
+ if (OPyofs<16) OPyofs = 16;\r
+ if (OPxofs+OPxsize>335) OPxofs = 336-OPxsize;\r
+ if (OPyofs+OPysize>sy+16) OPyofs = (sy+16)-OPysize;\r
+ }\r
+\r
+ Window(OPxofs, OPyofs, OPxofs+OPxsize, OPyofs+OPysize, "Open PCX As");\r
+ Button(OPxofs+21, OPyofs+18, "Tileset");\r
+ Button(OPxofs+50, OPyofs+18, "Image");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>OPxofs+21 && mx<OPxofs+30+21 && my>OPyofs+18 && my<OPyofs+10+18 && !moving)\r
+ {\r
+ // insert code for button "Tileset" here\r
+ ButtonPressed(OPxofs+21, OPyofs+18, "Tileset");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ openas=0; done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>OPxofs+50 && mx<OPxofs+30+50 && my>OPyofs+18 && my<OPyofs+10+18 && !moving)\r
+ {\r
+ // insert code for button "Image" here\r
+ ButtonPressed(OPxofs+50, OPyofs+18, "Image");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ openas=1; done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(OPxofs+OPxsize-9) && (mx<OPxofs+OPxsize-2)\r
+ && my>(OPyofs+1) && (my<OPyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>OPxofs && mx<OPxofs+OPxsize && my>OPyofs && my<(OPyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-OPxofs;\r
+ myo=my-OPyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+char manufacturer;\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+short xmin,ymin;\r
+short xmax,ymax;\r
+short hres;\r
+short vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+short bytes_per_line;\r
+short palette_type;\r
+char filler[58];\r
+char *t;\r
+\r
+int width,depth;\r
+int bytes;\r
+int vidoffset;\r
+FILE *pcxf;\r
+\r
+void ReadPCXLine(unsigned char *dest)\r
+{ int i, n;\r
+ char c, run;\r
+\r
+ n=0;\r
+ do {\r
+ c=fgetc(pcxf) & 0xff;\r
+\r
+ if ((c & 0xc0)==0xc0)\r
+ { run=c & 0x3f;\r
+ c=fgetc(pcxf);\r
+ for (i=0; i<run; i++)\r
+ dest[vidoffset+n+i]=c;\r
+ n+=run;\r
+ }\r
+ else {\r
+ dest[vidoffset+n]=c;\r
+ n++;\r
+ }\r
+ } while (n<bytes);\r
+}\r
+\r
+void LoadPCXHeader(char *fname)\r
+{\r
+ int i;\r
+\r
+ if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ fseek(pcxf,-768L,SEEK_END);\r
+ fread(pal,1,768,pcxf);\r
+ fseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+ set_intensity(63);\r
+}\r
+\r
+void LoadPCXHeaderNP(char *fname)\r
+{\r
+ pcxf=fopen(fname,"rb");\r
+ if (!pcxf) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+}\r
+\r
+// grabs a tile from the ovsp buffer (transit tile bay)\r
+int GrabTileAt(int x, int y, int z, int check_dup)\r
+{ int a;\r
+ char tvsp[256];\r
+ char *s;\r
+\r
+ s=t+(y*width)+x;\r
+\r
+ for (a=0; a<16; a++)\r
+ {\r
+ memcpy(tvsp+(a*16), s, 16);\r
+ s+=width;\r
+ }\r
+\r
+ if (check_dup)\r
+ {\r
+ for (a=0; a<z; a++)\r
+ if (!memcmp(tvsp, ovsp+(a*256), 256)) return 0;\r
+ }\r
+\r
+ memcpy(ovsp+(z*256), tvsp, 256);\r
+ return 1;\r
+}\r
+\r
+void ImportPCX()\r
+{ char fname[60];\r
+ int i,j,z;\r
+ int wide,deep; // grabbable x&y tiles\r
+ int add,jumper; // related to grab coords\r
+\r
+ bmode=1; oh=th; th=0;\r
+ Browse(1,"*.pcx","","","",fname);\r
+ WaitRelease();\r
+ if (strlen(fname)<3) return;\r
+ OpenPCXas();\r
+ th=oh; bmode=0;\r
+\r
+ add=!openas;\r
+ jumper=16+add;\r
+\r
+ LoadPCXHeader(fname);\r
+\r
+ // temp pcx buffer for grabs\r
+ t=(char *) valloc(width*depth,"pcx buf",0);\r
+\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=width*i;\r
+ ReadPCXLine(t);\r
+ }\r
+\r
+ fclose(pcxf);\r
+\r
+ deep=((depth&~15)+add)/jumper;\r
+ wide=(width+add)/jumper;\r
+\r
+ ontiles=wide*deep;\r
+ ovsp=(char *) valloc(ontiles*256,"ovsp",0); // temp tilebay\r
+\r
+ z=0;\r
+ for (i=0; i<deep; i++) // grab all tiles\r
+ for (j=0; j<wide; j++)\r
+ {\r
+ z+=GrabTileAt((j*jumper)+add, (i*jumper)+add, z, openas);\r
+ }\r
+\r
+ ontiles = z; // tiles successfully grabbed\r
+ vfree(t);\r
+\r
+ ImportTiles();\r
+ vfree(ovsp);\r
+ key[SCAN_ESC]=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TILESEL_INC\r
+#define TILESEL_INC\r
+\r
+extern int selofs;\r
+extern char ttile[256], ttile2[256];\r
+extern char curastd;\r
+extern char curmode;\r
+\r
+extern int curtileptr(int row);\r
+extern void NormalButton(int x1, int y1, int x2, int y2, char *str);\r
+extern void PressdButton(int x1, int y1, int x2, int y2, char *str);\r
+extern void RenderSelector();\r
+extern void FlipX(unsigned short edtile);\r
+extern void FlipY(unsigned short edtile);\r
+extern void FlipZ(unsigned short edtile);\r
+extern void DrawHighlight(int x, int y);\r
+extern void TileSelector();\r
+extern void VSPAnimDialog();\r
+extern void AddTilesDialog();\r
+extern void RenderImport();\r
+extern void ImportTiles();\r
+extern void ImportVSP();\r
+extern void OpenPCXas();\r
+\r
+extern void ReadPCXLine(unsigned char *dest);\r
+extern void LoadPCXHeader(char *fname);\r
+extern void LoadPCXHeaderNP(char *fname);\r
+extern int GrabTileAt(int x, int y, int z, int check_dup);\r
+extern void ImportPCX();\r
+\r
+#endif // TILESEL_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+#include <conio.h>\r
+\r
+#include "mikmod.h"\r
+\r
+#include "render.h"\r
+\r
+#define PIT0 0x40\r
+#define PIT1 0x41\r
+#define PIT2 0x42\r
+#define PITMODE 0x43\r
+#define PITCONST 1193180L\r
+\r
+#define OCR1 0x20\r
+#define IMR1 0x21\r
+\r
+#define OCR2 0xA0\r
+#define IMR2 0xA1\r
+\r
+// ================================= Data ====================================\r
+\r
+void (__interrupt __far *biosTimerHandler)();\r
+char timerinstalled=0;\r
+extern char soundokay;\r
+\r
+volatile unsigned int systemtime=0, timer_count=0, tick=0;\r
+volatile int backupct=0, idlect=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+#pragma aux disable =\\r
+ "cli";\r
+\r
+#pragma aux enable =\\r
+ "sti";\r
+\r
+static void SendEOI (unsigned char irqno)\r
+{\r
+ static unsigned char ocr;\r
+ static unsigned char eoi;\r
+\r
+ ocr=(irqno>7) ? OCR2 : OCR1;\r
+ eoi=0x60|(irqno&7);\r
+ outp(ocr,eoi);\r
+ if (irqno>7) outp(OCR1,0x20);\r
+}\r
+\r
+void __interrupt __far newhandler(void)\r
+{\r
+ systemtime++;\r
+ timer_count++;\r
+ tick++;\r
+ backupct++;\r
+ idlect++;\r
+ CheckTileAnimation();\r
+ if (soundokay) MD_Update();\r
+ SendEOI(0);\r
+}\r
+\r
+void SetHZ(unsigned int hz)\r
+{ unsigned int pit0_set, pit0_value;\r
+\r
+ disable();\r
+\r
+ outp(PITMODE, 0x34);\r
+ pit0_value=PITCONST / hz;\r
+ pit0_set=(pit0_value & 0x00ff);\r
+ outp(PIT0, pit0_set);\r
+ pit0_set=(pit0_value >> 8);\r
+ outp(PIT0, pit0_set);\r
+\r
+ enable();\r
+}\r
+\r
+void RestoreHZ()\r
+{\r
+ disable();\r
+ outp(PITMODE, 0x34);\r
+ outp(PIT0, 0x00);\r
+ outp(PIT0, 0x00);\r
+ enable();\r
+}\r
+\r
+void InitTimer()\r
+{\r
+ if (timerinstalled) return;\r
+\r
+ biosTimerHandler=_dos_getvect(0x08);\r
+ _dos_setvect(0x08, newhandler);\r
+ timerinstalled=1;\r
+ SetHZ(100);\r
+}\r
+\r
+void ShutdownTimer()\r
+{\r
+ if (!timerinstalled) return;\r
+\r
+ _dos_setvect(0x08, biosTimerHandler);\r
+ RestoreHZ();\r
+ timerinstalled=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TIMER_INC\r
+#define TIMER_INC\r
+\r
+extern unsigned int systemtime, timer_count, tick;\r
+extern int backupct, idlect;\r
+//extern int (*callback) (void); // ??? <aen, apr 21>\r
+\r
+extern void SetHZ(unsigned int hz);\r
+extern void RestoreHZ();\r
+extern void InitTimer();\r
+extern void ShutdownTimer();\r
+\r
+#endif // TIMER_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <conio.h>\r
+\r
+#include "mode13h.h"\r
+#include "modex.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// Driver function-pointers.\r
+int (*ShutdownVideo) (void);\r
+int (*ShowPage) (void);\r
+int (*CopySprite) (int x, int y, int width, int height, char *src);\r
+int (*CCopySprite) (int x, int y, int width, int height, char *src);\r
+int (*TCCopySprite) (int x, int y, int width, int height, char *src);\r
+int (*TCopySprite) (int x, int y, int width, int height, char *src);\r
+int (*CopyTile) (int x, int y, char *src);\r
+int (*FilledBox) (int x, int y, int width, int height, char c);\r
+int (*VLine) (int x, int y, int height, char color);\r
+int (*HLine) (int x, int y, int width, char color);\r
+int (*ColorGrid) (int x, int y, char c);\r
+int (*ClearScreen) (void);\r
+int (*CopySpriteLucentClip) (int x, int y, int width, int height, unsigned char *src);\r
+\r
+unsigned char pal[768], pal2[768];\r
+unsigned char *screen=0;\r
+\r
+int sx=0, sy=0;\r
+int tx=0, ty=0;\r
+int tsx=0, tsy=0;\r
+int map_scroll_x=1;\r
+int map_scroll_y=1;\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitVideo(int mode)\r
+{\r
+ switch (mode)\r
+ {\r
+ case 0: InitMode13h(); break;\r
+ case 1: InitModeX(); // 320x240\r
+ break;\r
+ }\r
+}\r
+\r
+void SetPalette(unsigned char *pall)\r
+{ unsigned int i;\r
+\r
+ outp(0x03c8,0);\r
+ for (i=0; i<768; i++)\r
+ outp(0x03c9,pall[i]);\r
+}\r
+\r
+void GetPalette(void)\r
+{ unsigned int i;\r
+\r
+ outp(0x03c7,0);\r
+ for (i=0; i<768; i++)\r
+ pal[i]=inp(0x03c9);\r
+}\r
+\r
+void set_intensity(unsigned int n)\r
+{ unsigned int i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal2[i]=(pal[i]*n)>>6;\r
+\r
+ SetPalette(pal2);\r
+}\r
+\r
+#define byte unsigned char\r
+int cx1=16, cy1=16, cx2=336, cy2=256;\r
+\r
+char stipple[256]={\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+};\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VDRIVER_INC\r
+#define VDRIVER_INC\r
+\r
+#include "inter.h"\r
+\r
+extern int (*ShutdownVideo) (void);\r
+extern int (*ShowPage) (void);\r
+extern int (*CopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*CCopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*TCCopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*TCopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*CopySpriteLucentClip) (int x, int y, int width, int height, unsigned char *src);\r
+extern int (*CopyTile) (int x, int y, char *src);\r
+extern int (*FilledBox) (int x, int y, int width, int height, char c);\r
+extern int (*VLine) (int x, int y, int height, char color);\r
+extern int (*HLine) (int x, int y, int width, char color);\r
+extern int (*ColorGrid) (int x, int y, char c);\r
+extern int (*ClearScreen) (void);\r
+\r
+extern unsigned char pal[768], pal2[768];\r
+extern unsigned char *screen;\r
+\r
+extern int sx, sy, tx, ty, tsx, tsy;\r
+extern int map_scroll_x, map_scroll_y;\r
+\r
+extern void InitVideo(int mode);\r
+extern void SetPalette(unsigned char *pall);\r
+extern void GetPalette(void);\r
+extern void set_intensity(unsigned int n);\r
+\r
+extern int cx1, cy1, cx2, cy2;\r
+\r
+#endif // VDRIVER_INC\r
--- /dev/null
+/*
+Copyright (C) 1998 BJ Eirich (aka vecna)
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public Lic
+See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#define VERGEPAL_LEN 768
+
+ static unsigned char vergepal[]=
+ {
+ 0x00,0x00,0x00,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x05,0x05,0x07,
+ 0x07,0x07,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0e,0x0e,
+ 0x0e,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x13,0x13,0x13,0x15,0x15,0x15,
+ 0x16,0x16,0x16,0x18,0x18,0x18,0x1a,0x1a,0x1a,0x1c,0x1c,0x1c,0x1d,
+ 0x1d,0x1d,0x1f,0x1f,0x1f,0x21,0x21,0x21,0x22,0x22,0x22,0x24,0x24,
+ 0x24,0x26,0x26,0x26,0x28,0x28,0x28,0x29,0x29,0x29,0x2b,0x2b,0x2b,
+ 0x2e,0x2e,0x2e,0x31,0x31,0x31,0x34,0x34,0x34,0x36,0x36,0x36,0x39,
+ 0x39,0x39,0x3c,0x3c,0x3c,0x3f,0x00,0x00,0x3b,0x00,0x00,0x38,0x00,
+ 0x00,0x35,0x00,0x00,0x32,0x00,0x00,0x2f,0x00,0x00,0x2c,0x00,0x00,
+ 0x29,0x00,0x00,0x26,0x00,0x00,0x22,0x00,0x00,0x1f,0x00,0x00,0x1c,
+ 0x00,0x00,0x19,0x00,0x00,0x16,0x00,0x00,0x13,0x00,0x00,0x10,0x00,
+ 0x00,0x3f,0x36,0x36,0x3f,0x2e,0x2e,0x3f,0x27,0x27,0x3f,0x1f,0x1f,
+ 0x3f,0x17,0x17,0x3f,0x10,0x10,0x3f,0x08,0x08,0x3f,0x00,0x00,0x11,
+ 0x0b,0x06,0x13,0x0d,0x07,0x15,0x0f,0x09,0x17,0x11,0x0a,0x18,0x13,
+ 0x0b,0x1a,0x15,0x0c,0x1c,0x17,0x0e,0x1e,0x19,0x0f,0x3f,0x3f,0x36,
+ 0x3f,0x3f,0x2e,0x3f,0x3f,0x27,0x3f,0x3f,0x1f,0x3f,0x3e,0x17,0x3f,
+ 0x3d,0x10,0x3f,0x3d,0x08,0x3f,0x3d,0x00,0x39,0x36,0x00,0x33,0x31,
+ 0x00,0x2d,0x2b,0x00,0x27,0x27,0x00,0x21,0x21,0x00,0x1c,0x1b,0x00,
+ 0x16,0x15,0x00,0x10,0x10,0x00,0x34,0x3f,0x17,0x31,0x3f,0x10,0x2d,
+ 0x3f,0x08,0x28,0x3f,0x00,0x24,0x39,0x00,0x20,0x33,0x00,0x1d,0x2d,
+ 0x00,0x18,0x27,0x00,0x36,0x3f,0x36,0x2e,0x3d,0x2e,0x27,0x3b,0x27,
+ 0x1f,0x39,0x1f,0x17,0x36,0x17,0x0f,0x34,0x0f,0x08,0x32,0x08,0x00,
+ 0x30,0x00,0x00,0x2d,0x00,0x00,0x2b,0x00,0x00,0x28,0x00,0x00,0x26,
+ 0x00,0x00,0x23,0x00,0x00,0x21,0x00,0x00,0x1e,0x00,0x00,0x1c,0x00,
+ 0x00,0x19,0x00,0x00,0x17,0x00,0x00,0x14,0x00,0x00,0x12,0x00,0x00,
+ 0x0f,0x00,0x02,0x0d,0x02,0x03,0x0a,0x03,0x05,0x08,0x05,0x36,0x3f,
+ 0x3f,0x2e,0x3f,0x3f,0x27,0x3f,0x3f,0x1f,0x3f,0x3f,0x17,0x3f,0x3f,
+ 0x0f,0x3f,0x3f,0x08,0x3f,0x3f,0x00,0x3f,0x3f,0x00,0x39,0x39,0x00,
+ 0x33,0x33,0x00,0x2d,0x2d,0x00,0x27,0x27,0x00,0x22,0x22,0x00,0x1c,
+ 0x1c,0x00,0x16,0x16,0x00,0x10,0x10,0x17,0x2f,0x3f,0x10,0x2c,0x3f,
+ 0x08,0x2a,0x3f,0x00,0x27,0x3f,0x00,0x23,0x39,0x00,0x1f,0x33,0x00,
+ 0x1b,0x2d,0x00,0x17,0x27,0x36,0x36,0x3f,0x2e,0x2f,0x3f,0x27,0x27,
+ 0x3f,0x1f,0x20,0x3f,0x17,0x18,0x3f,0x10,0x10,0x3f,0x08,0x09,0x3f,
+ 0x00,0x01,0x3f,0x00,0x00,0x3f,0x00,0x00,0x3b,0x00,0x00,0x38,0x00,
+ 0x00,0x35,0x00,0x00,0x32,0x00,0x00,0x2f,0x00,0x00,0x2c,0x00,0x00,
+ 0x29,0x00,0x00,0x26,0x00,0x00,0x22,0x00,0x00,0x1f,0x00,0x00,0x1c,
+ 0x00,0x00,0x19,0x00,0x00,0x16,0x00,0x00,0x13,0x00,0x00,0x10,0x0d,
+ 0x08,0x00,0x0f,0x09,0x00,0x12,0x0a,0x00,0x14,0x0b,0x00,0x16,0x0c,
+ 0x00,0x19,0x0d,0x00,0x1b,0x0e,0x00,0x1e,0x0f,0x00,0x20,0x10,0x00,
+ 0x22,0x11,0x00,0x25,0x12,0x00,0x28,0x15,0x03,0x2c,0x18,0x06,0x2f,
+ 0x1b,0x09,0x32,0x1e,0x0c,0x35,0x21,0x0e,0x39,0x24,0x11,0x3c,0x27,
+ 0x14,0x3f,0x2a,0x17,0x3f,0x2e,0x1c,0x3f,0x31,0x22,0x3f,0x35,0x27,
+ 0x3f,0x38,0x2c,0x22,0x1c,0x12,0x25,0x1f,0x14,0x29,0x22,0x17,0x2c,
+ 0x25,0x19,0x2f,0x28,0x1c,0x32,0x2a,0x1e,0x36,0x2d,0x20,0x39,0x30,
+ 0x23,0x3c,0x33,0x25,0x3f,0x3a,0x37,0x3f,0x38,0x34,0x3f,0x36,0x31,
+ 0x3f,0x35,0x2f,0x3f,0x33,0x2c,0x3f,0x31,0x29,0x3f,0x2f,0x27,0x3f,
+ 0x2e,0x24,0x3f,0x2c,0x20,0x3f,0x29,0x1c,0x3f,0x27,0x18,0x3c,0x25,
+ 0x17,0x3a,0x23,0x16,0x37,0x22,0x15,0x34,0x20,0x14,0x32,0x1f,0x13,
+ 0x2f,0x1e,0x12,0x2d,0x1c,0x11,0x2a,0x1a,0x10,0x28,0x19,0x0f,0x27,
+ 0x18,0x0e,0x24,0x17,0x0d,0x22,0x16,0x0c,0x20,0x14,0x0b,0x1d,0x13,
+ 0x0a,0x1b,0x12,0x09,0x17,0x10,0x08,0x15,0x0f,0x07,0x12,0x0e,0x06,
+ 0x10,0x0c,0x06,0x0e,0x0b,0x05,0x0a,0x08,0x03,0x3f,0x00,0x00,0x3f,
+ 0x04,0x00,0x3f,0x08,0x00,0x3f,0x0d,0x00,0x3f,0x11,0x00,0x3f,0x15,
+ 0x00,0x3f,0x19,0x00,0x3f,0x1d,0x00,0x3f,0x22,0x00,0x3f,0x26,0x00,
+ 0x3f,0x2a,0x00,0x3f,0x2e,0x00,0x3f,0x32,0x00,0x3f,0x37,0x00,0x3f,
+ 0x3b,0x00,0x3f,0x3f,0x00,0x3f,0x2f,0x00,0x36,0x28,0x00,0x2d,0x22,
+ 0x00,0x24,0x1b,0x00,0x1b,0x14,0x00,0x12,0x0d,0x00,0x09,0x07,0x00,
+ 0x00,0x00,0x00,0x29,0x00,0x28,0x23,0x00,0x2b,0x1d,0x00,0x2f,0x17,
+ 0x00,0x32,0x12,0x00,0x35,0x0c,0x00,0x38,0x06,0x00,0x3c,0x3f,0x3f,
+ 0x3f,0x3f
+ };
+
--- /dev/null
+\r
+VERGE version 2.01a, Copyright (C) 1998 BJ Eirich (aka vecna)\r
+VERGE comes with ABSOLUTELY NO WARRANTY. This is free software,\r
+and you are welcome to redistribute it under certain conditions.\r
+For details refer to GNU.TXT.\r
+\r
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+>Jan 1, 2000<\r
+\r
+Hey Guys,\r
+\r
+This is the old source for V2 (DJGPP), along with the sources for the utils (mostly DJGPP), the VCC compiler (DJGPP; though it should compiler under Watcom), and MapEd 2 (Watcom). Just getting this out the door. The new source will be released and updated regularly a week or so from now, so you can futz around with this until that time.\r
+\r
+I'm not sure the main engine even runs in this build, as all I got from compiling and running it was a fistful of page faults. Sorry, I don't feel like trying to make it work. It's old and stinky (enjoy! ^_^). It may be VC incompatibilities with newer stuff, it may be some minor oversight on my part from tweaking it at some point, it could by anything.\r
+\r
+The utils and MapEd 2 seemed to be in working order, however. Didn't include all the util sources, because they're hidden somewhere on my hard drive. I'll find them later (like when I clean this cluttered mess of a hard drive).\r
+\r
+I removed the CD audio code, because of GPL issues and it was a shoddy interface to begin with. I didn't take the FLI code out, though I can't remember where I got it from. It's likely I nabbed it up from X2FTP or some similar archive. If you can figure out where it's from and if I'm violating the GPL by including it (though I hacked it up a bit), just send me some proof of its origin and license and I'll remove it.\r
+\r
+Otherwise, wham. There ya go. If you have any questions about it, just drop me a line and I'll see what I can do. Happy New Year, and have fun with it... Or possibly heaping gobs of frustration. :-)\r
+\r
+- aen\r
+\r
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+Pertaining to MikMod:\r
+\r
+Parts of the library (in playercode/mdulaw.c) are derived from the files\r
+libst.h and raw.c from an old version of the sox (SOund eXchange) package\r
+written by Lance Norskog and Jef Poskanzer. The following copyright notice\r
+applies to these parts:\r
+\r
+Copyright (C) 1989 by Jef Poskanzer.\r
+Permission to use, copy, modify, and distribute this software and its\r
+documentation for any purpose and without fee is hereby granted, provided\r
+that the above copyright notice appear in all copies and that both that\r
+copyright notice and this permission notice appear in supporting\r
+documentation. This software is provided "as is" without express or\r
+implied warranty.\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <malloc.h>\r
+\r
+char c[100];\r
+FILE *f;\r
+char *jalblkasd;\r
+char byte, *t;\r
+short word;\r
+int quad;\r
+\r
+int bufsize=0;\r
+unsigned char *csrc, *cb;\r
+\r
+void EmitC (unsigned char c)\r
+{\r
+ *csrc++=c;\r
+ bufsize++;\r
+}\r
+\r
+void Compress(unsigned char *p, int len)\r
+{\r
+ int i;\r
+ unsigned char byt,samect;\r
+ unsigned char repcode;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<254 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect==2 && byt != 0xFF) { EmitC(byt); }\r
+ if (samect==3 && byt != 0xFF) { EmitC(byt); EmitC(byt); }\r
+ if (samect>3 || byt == 0xFF)\r
+ {\r
+ repcode=0xFF;\r
+ EmitC(repcode);\r
+ repcode=(char) samect;\r
+ EmitC(repcode);\r
+ }\r
+ EmitC(byt);\r
+ } while (i<len);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ int i;\r
+\r
+ printf("CHRCONV v.1.00 Copyright (C)1998 BJ Eirich \n");\r
+ if (argc==1)\r
+ {\r
+ printf("CHR filename: "); fflush(stdout);\r
+ scanf("%s",c);\r
+ f=fopen(c, "rb");\r
+ }\r
+ if (argc==2)\r
+ {\r
+ memcpy(c, argv[1], strlen(argv[1]));\r
+ printf("Converting %s.\n",c);\r
+ f=fopen(c, "rb");\r
+ }\r
+ if (!f)\r
+ {\r
+ printf("Invalid filename.\n");\r
+ exit(-1);\r
+ }\r
+ jalblkasd=(char *) malloc(15360);\r
+ fread(jalblkasd, 1, 15360, f);\r
+ fclose(f);\r
+\r
+ f=fopen(c,"wb");\r
+ byte=2; fwrite(&byte, 1, 1, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=32; fwrite(&word, 1, 2, f);\r
+ word=0; fwrite(&word, 1, 2, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=30; fwrite(&word, 1, 2, f);\r
+\r
+ cb=(char *) malloc(512*30);\r
+ Compress(jalblkasd, 512*30);\r
+ free(jalblkasd);\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ free(cb);\r
+\r
+ quad=15; fwrite(&quad, 1, 4, f);\r
+ quad=10; fwrite(&quad, 1, 4, f);\r
+ quad=5; fwrite(&quad, 1, 4, f);\r
+ quad=0; fwrite(&quad, 1, 4, f);\r
+\r
+ t="F16W10F17W10F16W10F15W10F18W10F19W10F18W10F15W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+ t="F11W10F12W10F11W10F10W10F13W10F14W10F13W10F10W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+ t="F6W10F7W10F6W10F5W10F8W10F9W10F8W10F5W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+ t="F1W10F2W10F1W10F0W10F3W10F4W10F3W10F0W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+\r
+ fclose(f);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+chrconv.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: converts v1 chr -> v2 chr\r
+---\r
+Chrconv is a remarkably simple utility, and that is a shame, because eventually you won't use it much at all. But initially it will be of great value to everyone, because it converts from old v1 chrs to new v2 chrs.\r
+\r
+The v2 chr it creates will emulate the animation behavior of a v1 exactly, so it should look and operate like you're used to. This is useful, because writing animation strings and handling odd-shaped chrs may not be something that appeals to you just yet. For example, the default animation string used by chrconv for walking north is:F16W10F17W10F16W10F15W10F18W10F19W10F18W10F15W10.\r
+\r
+To use chrconv, simply execute it. It will ask for the filename of the source v1 chr, and will convert it to v2 format. NOTE: it will overwrite the old chr, so you may want to back it up first.\r
+\r
+enjoy!
\ No newline at end of file
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 chrconv.c -o chrconv.exe\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// CHRMAK.CC\r
+// V2 PCX to CHR converter w/ makefiles\r
+//\r
+// coded by aen\r
+// aen@verge-rpg.com\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+#include <string.h>\r
+#include <sys/stat.h>\r
+\r
+#include <conio.h>\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+typedef unsigned char byte;\r
+typedef unsigned short word;\r
+typedef unsigned long quad;\r
+\r
+static void fputw(word w, FILE *fp) { fwrite(&w,1,2,fp); }\r
+static void fputd(quad d, FILE *fp) { fwrite(&d,1,4,fp); }\r
+static word fgetw(FILE *fp) { word w; fread(&w,1,2,fp); return w; }\r
+quad fgetd(FILE *fp) { quad d; fread(&d,1,4,fp); return d; }\r
+\r
+// skips the number of bytes in the file; just seeks past them\r
+static void fskip(int bytes, FILE *fp)\r
+ { fseek(fp,bytes,SEEK_CUR); }\r
+\r
+static void fputraw(char *raw, int bytes, FILE *fp)\r
+ { fwrite(raw, 1,bytes, fp); }\r
+\r
+// writes a null-terminated string to the file\r
+void fputstrz(char *str, FILE *fp)\r
+ { fputraw(str, strlen(str)+1, fp); }\r
+\r
+// writes a string to the file (without the null-terminator), preceeded by\r
+// a quad length marker\r
+static void fputstrn(char *str, FILE *fp)\r
+ { int n=strlen(str)+1; fputd(n,fp); fputraw(str,n,fp); }\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+#define CHRMAK_VER_MAJ 0\r
+#define CHRMAK_VER_MIN 1\r
+#define CHRMAK_VER_STR "0.1b"\r
+#define CHRMAK_AUTHORS "aen"\r
+\r
+// parsing vars\r
+static char *mak_base=0;\r
+static char *makp=0;\r
+static int mak_bytes=0;\r
+static char mak_tok_ident[256];\r
+static char mak_tok_val[256];\r
+static int mak_tok_valn=0; // numeric val of mak_tok\r
+static int mak_line=0;\r
+\r
+// makefile vars\r
+static char chrmak_makefile[256];\r
+\r
+static char pcx_name[256]; static int got_pcx_name=0;\r
+static char chr_name[256]; static int got_chr_name=0;\r
+static int frame_w=0; static int got_frame_w=0;\r
+static int frame_h=0; static int got_frame_h=0;\r
+static int hot_x=0; static int got_hot_x=0;\r
+static int hot_y=0; static int got_hot_y=0;\r
+static int hot_w=0; static int got_hot_w=0;\r
+static int hot_h=0; static int got_hot_h=0;\r
+static int per_row=0; static int got_per_row=0;\r
+static int total_frames=0; static int got_total_frames=0;\r
+static int lidle=0; static int got_lidle=0;\r
+static int ridle=0; static int got_ridle=0;\r
+static int uidle=0; static int got_uidle=0;\r
+static int didle=0; static int got_didle=0;\r
+static char lscript[256]; static int got_lscript=0;\r
+static char rscript[256]; static int got_rscript=0;\r
+static char uscript[256]; static int got_uscript=0;\r
+static char dscript[256]; static int got_dscript=0;\r
+\r
+void warning(char *message, ...)\r
+{\r
+ static char buffer[256];\r
+ va_list args;\r
+\r
+ va_start(args, message);\r
+ vsprintf(buffer, message, args);\r
+ va_end(args);\r
+\r
+ printf("%s \n", buffer);\r
+}\r
+\r
+static void fatal(char *message, ...)\r
+{\r
+ static char buffer[256];\r
+ va_list args;\r
+\r
+ va_start(args, message);\r
+ vsprintf(buffer, message, args);\r
+ va_end(args);\r
+\r
+ printf("%s \n", buffer);\r
+\r
+ exit(0);\r
+}\r
+\r
+//#ifdef __DJGPP__\r
+// Watcom has one of these\r
+static int filelength(int handle)\r
+{\r
+ struct stat fileinfo;\r
+ if (-1 == fstat(handle, &fileinfo))\r
+ fatal("error fstating");\r
+ return fileinfo.st_size;\r
+}\r
+//#endif\r
+\r
+static int streq(char *a, char *b)\r
+{\r
+ while (*a)\r
+ {\r
+ if (*a++ != *b++)\r
+ return 0;\r
+ }\r
+ return !*b;\r
+}\r
+\r
+static void usage()\r
+{\r
+ printf("usage: chrmak <makefile> \n");\r
+ exit(0);\r
+}\r
+\r
+static void banner()\r
+{\r
+ printf("chrmak v%s \1e by %s \n", CHRMAK_VER_STR, CHRMAK_AUTHORS);\r
+}\r
+\r
+static void parse_args(int argc, char *argv[])\r
+{\r
+ if (argc != 2)\r
+ usage();\r
+\r
+ strcpy(chrmak_makefile, argv[1]);\r
+}\r
+\r
+static void skip_cpp_comment()\r
+{\r
+ makp+=2;\r
+ while (*makp && '\n'!=*makp)\r
+ makp++;\r
+ if (*makp)\r
+ makp++;\r
+}\r
+\r
+static void skip_c_comment()\r
+{\r
+ makp+=2;\r
+ while (*makp && ('*'!=makp[0] || '/'!=makp[1]))\r
+ {\r
+ if ('\n'==*makp)\r
+ mak_line++;\r
+ if ('/'==makp[0] && '*'==makp[1])\r
+ skip_c_comment();\r
+ else makp++;\r
+ }\r
+ if (*makp)\r
+ makp+=2;\r
+}\r
+\r
+static void parse_whitespace()\r
+{\r
+ do {\r
+ if (!*makp)\r
+ return;\r
+ if (isspace(*makp))\r
+ {\r
+ while (*makp && isspace(*makp))\r
+ {\r
+ if ('\n'==*makp)\r
+ mak_line++;\r
+ makp++;\r
+ }\r
+ continue;\r
+ }\r
+ if ('/'==makp[0] && '/'==makp[1])\r
+ { skip_cpp_comment(); continue; }\r
+ if ('/'==makp[0] && '*'==makp[1])\r
+ { skip_c_comment(); continue; }\r
+ break;\r
+ } while (1);\r
+}\r
+\r
+static void grab_ident()\r
+{\r
+ char *t=mak_tok_ident;\r
+ while (isalnum(*makp) || '_'==*makp)\r
+ *t++=*makp++;\r
+ *t=0;\r
+ strlwr(mak_tok_ident);\r
+}\r
+\r
+static void grab_val()\r
+{\r
+ char *t=mak_tok_val;\r
+ while (isalnum(*makp) || '_'==*makp)\r
+ *t++=*makp++;\r
+ *t=0;\r
+ mak_tok_valn=atoi(mak_tok_val);\r
+}\r
+\r
+static int ident_is(char *id) { return streq(mak_tok_ident,id); }\r
+\r
+static void do_assign()\r
+{\r
+ if (ident_is("pcx_name"))\r
+ { strcpy(pcx_name, mak_tok_val); got_pcx_name=1; return; }\r
+ else if (ident_is("chr_name"))\r
+ { strcpy(chr_name, mak_tok_val); got_chr_name=1; return; }\r
+ else if (ident_is("frame_w"))\r
+ { frame_w=mak_tok_valn; got_frame_w=1; return; }\r
+ else if (ident_is("frame_h"))\r
+ { frame_h=mak_tok_valn; got_frame_h=1; return; }\r
+ else if (ident_is("hot_x"))\r
+ { hot_x=mak_tok_valn; got_hot_x=1; return; }\r
+ else if (ident_is("hot_y"))\r
+ { hot_y=mak_tok_valn; got_hot_y=1; return; }\r
+ else if (ident_is("hot_w"))\r
+ { hot_w=mak_tok_valn; got_hot_w=1; return; }\r
+ else if (ident_is("hot_h"))\r
+ { hot_h=mak_tok_valn; got_hot_h=1; return; }\r
+ else if (ident_is("per_row"))\r
+ { per_row=mak_tok_valn; got_per_row=1; return; }\r
+ else if (ident_is("total_frames"))\r
+ { total_frames=mak_tok_valn; got_total_frames=1; return; }\r
+ else if (ident_is("lidle"))\r
+ { lidle=mak_tok_valn; got_lidle=1; return; }\r
+ else if (ident_is("ridle"))\r
+ { ridle=mak_tok_valn; got_ridle=1; return; }\r
+ else if (ident_is("uidle"))\r
+ { uidle=mak_tok_valn; got_uidle=1; return; }\r
+ else if (ident_is("didle"))\r
+ { didle=mak_tok_valn; got_didle=1; return; }\r
+ else if (ident_is("lscript"))\r
+ { strcpy(lscript, mak_tok_val); got_lscript=1; return; }\r
+ else if (ident_is("rscript"))\r
+ { strcpy(rscript, mak_tok_val); got_rscript=1; return; }\r
+ else if (ident_is("uscript"))\r
+ { strcpy(uscript, mak_tok_val); got_uscript=1; return; }\r
+ else if (ident_is("dscript"))\r
+ { strcpy(dscript, mak_tok_val); got_dscript=1; return; }\r
+\r
+ fatal("%s: unknown ident '%s' on line %i",\r
+ chrmak_makefile, mak_tok_ident, mak_line);\r
+}\r
+\r
+static int parse_assign()\r
+{\r
+ int last_line=0; // helper for error detection\r
+\r
+ parse_whitespace();\r
+ if (!*makp)\r
+ return 1;\r
+ else if (isalpha(*makp))\r
+ {\r
+ grab_ident(); // get ident\r
+ last_line=mak_line;\r
+\r
+ parse_whitespace(); // expect\r
+ if ('=' != *makp++)\r
+ fatal("%s: expected = on line %i", chrmak_makefile, last_line);\r
+\r
+ parse_whitespace(); // get val\r
+ grab_val();\r
+ last_line=mak_line;\r
+\r
+ do_assign();\r
+\r
+ parse_whitespace(); // expect\r
+ if (';' != *makp++)\r
+ fatal("%s: expected ; on line %i", chrmak_makefile, last_line);\r
+ else while (';'==*makp) makp++;\r
+\r
+ return 0;\r
+ }\r
+ fatal("%s: expected ident, got '%c' on line %i",\r
+ chrmak_makefile, *makp, mak_line);\r
+ return 1;\r
+}\r
+\r
+static void check_needs()\r
+{\r
+ if (!got_pcx_name) fatal("%s: pcx_name missing", chrmak_makefile);\r
+ if (!got_chr_name) fatal("%s: chr_name missing", chrmak_makefile);\r
+ if (!got_frame_w) fatal("%s: frame_w missing", chrmak_makefile);\r
+ if (!got_frame_h) fatal("%s: frame_h missing", chrmak_makefile);\r
+ if (!got_hot_x) fatal("%s: hot_x missing", chrmak_makefile);\r
+ if (!got_hot_y) fatal("%s: hot_y missing", chrmak_makefile);\r
+ if (!got_hot_w) fatal("%s: hot_w missing", chrmak_makefile);\r
+ if (!got_hot_h) fatal("%s: hot_h missing", chrmak_makefile);\r
+ if (!got_per_row) fatal("%s: per_row missing", chrmak_makefile);\r
+ if (!got_total_frames) fatal("%s: total_frames missing", chrmak_makefile);\r
+ if (!got_lidle) fatal("%s: lidle missing", chrmak_makefile);\r
+ if (!got_ridle) fatal("%s: ridle missing", chrmak_makefile);\r
+ if (!got_uidle) fatal("%s: uidle missing", chrmak_makefile);\r
+ if (!got_didle) fatal("%s: didle missing", chrmak_makefile);\r
+ if (!got_lscript) fatal("%s: lscript missing", chrmak_makefile);\r
+ if (!got_rscript) fatal("%s: rscript missing", chrmak_makefile);\r
+ if (!got_uscript) fatal("%s: uscript missing", chrmak_makefile);\r
+ if (!got_dscript) fatal("%s: dscript missing", chrmak_makefile);\r
+}\r
+\r
+static void parse_makefile()\r
+{\r
+ FILE *fp=0;\r
+\r
+ printf("ú parsing %s \r", chrmak_makefile);\r
+ fflush(stdout);\r
+\r
+ fp=fopen(chrmak_makefile, "rb");\r
+ if (!fp) fatal("unable to open %s", chrmak_makefile);\r
+\r
+ mak_bytes=filelength(fileno(fp)); // calc bytes\r
+ mak_base=new char [mak_bytes+1]; // alloc room\r
+ fread(mak_base,1,mak_bytes,fp); // read bytes\r
+ mak_base[mak_bytes]=0; // null-term\r
+ makp=mak_base; // setup cur byte ptr\r
+ mak_line=1;\r
+\r
+ while (!parse_assign())\r
+ ;\r
+\r
+ // got everything we need?\r
+ check_needs();\r
+\r
+ delete[]mak_base; mak_base=0;\r
+ makp=0;\r
+\r
+ fclose(fp);\r
+\r
+ printf("û \n");\r
+ fflush(stdout);\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+// PCX & COMPRESS STUFF ////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+static FILE *chrfp=0;\r
+static FILE *pcxfp=0;\r
+static byte *virscr=0;\r
+\r
+int manufacturer=0; // pcx header\r
+int version=0;\r
+int encoding=0;\r
+int bpp=0;\r
+int xmin=0,ymin=0;\r
+int xmax=0,ymax=0;\r
+int hres=0,vres=0;\r
+char palette[48];\r
+int reserved=0;\r
+int color_planes=0;\r
+int bpl=0;\r
+int palette_type=0;\r
+char filler[58];\r
+byte pal[768];\r
+\r
+int image_width=0,image_depth=0;\r
+quad vidoffset=0;\r
+\r
+void LoadPCXHeader()\r
+{\r
+ manufacturer = fgetc(pcxfp); // always 10\r
+ version = fgetc(pcxfp); // should be 5?\r
+ encoding = fgetc(pcxfp); // always 1\r
+ bpp = fgetc(pcxfp); // bits per pixel\r
+\r
+ xmin = fgetw(pcxfp); // grab window\r
+ ymin = fgetw(pcxfp);\r
+ xmax = fgetw(pcxfp);\r
+ ymax = fgetw(pcxfp);\r
+ image_width = xmax-xmin+1; // calc dims\r
+ image_depth = ymax-ymin+1;\r
+\r
+ hres = fgetw(pcxfp);\r
+ vres = fgetw(pcxfp);\r
+\r
+ fread(palette,1,48,pcxfp); // ega color map\r
+\r
+ reserved = fgetc(pcxfp);\r
+ color_planes = fgetc(pcxfp); // should be 1\r
+\r
+ bpl = fgetw(pcxfp); // bytes per line\r
+ palette_type = fgetw(pcxfp);\r
+\r
+ fread(filler,1,58,pcxfp); // nothing important here\r
+}\r
+\r
+void ReadPCXLine(byte *dest)\r
+{\r
+ int i=0,c=0,n=0,run=0;\r
+\r
+ // decode a row\r
+ for (n=0; n<image_width; n+=run)\r
+ {\r
+ // assume single pixel\r
+ run=1;\r
+ c=fgetc(pcxfp);\r
+ // is this a run?\r
+ if ((c&192)==192)\r
+ {\r
+ // calc run and grab color\r
+ run=c&63;\r
+ c=fgetc(pcxfp);\r
+ }\r
+ // now replicate run bytes\r
+ for (i=0; i<run; i++)\r
+ dest[vidoffset+n+i]=(byte)c;\r
+ }\r
+ // skip row padding, if any\r
+ fskip(bpl-image_width,pcxfp);\r
+}\r
+\r
+void LoadPCX(char *filename)\r
+{\r
+ int i=0;\r
+\r
+ // open file\r
+ if (pcxfp) fclose(pcxfp);\r
+ pcxfp=fopen(filename,"rb");\r
+ if (!pcxfp)\r
+ { printf("unable to open %s", filename);\r
+ exit(0);\r
+ }\r
+\r
+ // get info\r
+ LoadPCXHeader();\r
+\r
+ // allocate image data\r
+ if (virscr) { free(virscr); virscr=0; }\r
+ virscr=(byte *)malloc(image_width*image_depth);\r
+\r
+ // decompress image data\r
+ for (i=0; i<image_depth; i++)\r
+ { vidoffset=i*image_width;\r
+ ReadPCXLine(virscr);\r
+ }\r
+\r
+ // pal exists?\r
+ if (fgetc(pcxfp) == 12)\r
+ fread(pal,1,768,pcxfp);\r
+\r
+ // done\r
+ fclose(pcxfp);\r
+}\r
+\r
+static int bufsize=0;\r
+static byte *csrc=0, *cb=0;\r
+\r
+static void emitc(byte b) { *csrc++=b, bufsize++; }\r
+\r
+static void Compress(byte *p, int len)\r
+{\r
+ int i=0;\r
+ byte byt=0,samect=0;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ {\r
+ byt=p[i++];\r
+ samect=1;\r
+ while (samect<254 && i<len && byt==p[i])\r
+ { samect++; i++; }\r
+\r
+ if (samect==2 && byt != 0xFF) { emitc(byt); }\r
+ if (samect==3 && byt != 0xFF) { emitc(byt); emitc(byt); }\r
+ if (samect>3 || byt == 0xFF)\r
+ {\r
+ emitc(0xFF);\r
+ emitc(samect);\r
+ }\r
+ emitc(byt);\r
+\r
+ } while (i<len);\r
+}\r
+\r
+static byte *raw=0,*r=0;\r
+\r
+static void dumpframe(int x, int y)\r
+{\r
+ byte *src=&virscr[(y*image_width)+x];\r
+\r
+ for (y=0; y<frame_h; y++)\r
+ {\r
+ for (x=0; x<frame_w; x++)\r
+ *r++=src[x];\r
+ src+=image_width;\r
+ }\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+static void WriteFrames(char *filename, FILE *dump)\r
+{\r
+ int i=0,j=0;\r
+ int raw_bytes=0;\r
+\r
+ printf(" ú reading image %s \r", pcx_name);\r
+ fflush(stdout);\r
+\r
+ LoadPCX(filename);\r
+\r
+ printf(" û \n");\r
+ fflush(stdout);\r
+\r
+ printf(" ú collecting frames \r");\r
+ fflush(stdout);\r
+\r
+ // setup bufs for raw data/compression\r
+ raw_bytes = total_frames * (frame_w*frame_h);\r
+ cb = (byte *)malloc(raw_bytes);\r
+ raw = (byte *)malloc(raw_bytes); r=raw;\r
+\r
+ // dump all frames in row major byte order into 'raw'\r
+ for (i=0; i<10; i++)\r
+ for (j=0; j<per_row; j++)\r
+ {\r
+ if ((i*per_row)+j<total_frames)\r
+ dumpframe(1+(j*(frame_w+1)), 1+(i*(frame_h+1)));\r
+ }\r
+\r
+ printf(" û \n");\r
+ fflush(stdout);\r
+\r
+ printf(" ú compressing \r");\r
+ fflush(stdout);\r
+\r
+ // smush the sucker\r
+ Compress(raw, raw_bytes);\r
+\r
+ fputd(bufsize,dump); // compressed data bytes\r
+ fputraw((char *)cb,bufsize,dump); // compressed data\r
+\r
+ printf(" û \n");\r
+ fflush(stdout);\r
+\r
+ // cleanup bufs\r
+ free(raw);\r
+ free(cb);\r
+}\r
+\r
+static void WriteInfo(FILE *dump)\r
+{\r
+ fputc(2, dump); // version\r
+ fputw((word)frame_w, dump); // frame dims\r
+ fputw((word)frame_h, dump);\r
+ fputw((word)hot_x, dump); // hotspot coords\r
+ fputw((word)hot_y, dump);\r
+ fputw((word)hot_w, dump); // hotspot dims\r
+ fputw((word)hot_h, dump);\r
+ fputw((word)total_frames, dump); // total frames\r
+}\r
+\r
+static void WriteScripts(FILE *fp)\r
+{\r
+ fputd(lidle,fp);\r
+ fputd(ridle,fp);\r
+ fputd(uidle,fp);\r
+ fputd(didle,fp);\r
+\r
+ fputstrn(lscript,fp);\r
+ fputstrn(rscript,fp);\r
+ fputstrn(uscript,fp);\r
+ fputstrn(dscript,fp);\r
+}\r
+\r
+static void write_chr()\r
+{\r
+ strcat(pcx_name, ".pcx");\r
+ strcat(chr_name, ".chr");\r
+\r
+ /*\r
+ // DEBUG\r
+ printf(" \n");\r
+ printf("pcx_name: %s \n", pcx_name);\r
+ printf("chr_name: %s \n", chr_name);\r
+ printf("frame_w: %i \n", frame_w);\r
+ printf("frame_h: %i \n", frame_h);\r
+ printf("hot_x: %i \n", hot_x);\r
+ printf("hot_y: %i \n", hot_y);\r
+ printf("hot_w: %i \n", hot_w);\r
+ printf("hot_h: %i \n", hot_h);\r
+ printf("per_row: %i \n", per_row);\r
+ printf("total_frames: %i \n", total_frames);\r
+ printf("lidle: %i \n", lidle);\r
+ printf("ridle: %i \n", ridle);\r
+ printf("uidle: %i \n", uidle);\r
+ printf("didle: %i \n", didle);\r
+ printf("lscript: %s \n", lscript);\r
+ printf("rscript: %s \n", rscript);\r
+ printf("uscript: %s \n", uscript);\r
+ printf("dscript: %s \n", dscript);\r
+ fflush(stdout);\r
+ getch();\r
+ */\r
+\r
+ printf("> dumping %s \n", chr_name);\r
+ fflush(stdout);\r
+\r
+ chrfp=fopen(chr_name, "wb");\r
+ if (!chrfp) fatal("unable to open %s", chr_name);\r
+\r
+ WriteInfo(chrfp);\r
+ WriteFrames(pcx_name,chrfp);\r
+ WriteScripts(chrfp);\r
+\r
+ fclose(chrfp);\r
+\r
+ printf("complete! \n");\r
+ fflush(stdout);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ banner();\r
+\r
+ parse_args(argc, argv);\r
+ parse_makefile();\r
+\r
+ write_chr();\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+chrmak.exe\r
+the utility with bloated code perpetrated by aen (aen@verge-rpg.com for hate mail)\r
+documentation\r
+by zeromus 5.8.99\r
+zermous@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 chr from pcx file\r
+---\r
+You'll use this bad boy a lot, unless you have one of those newfangled graphical chr editors. What we do here is have a character ready in the standard pcx-graphics format (that is, with a one-pixel buffer between frames), and give it to chrmak, along with a text file describing what characteristics the output v2 chr should have.\r
+\r
+to run chrmak, simply execute chrmak with the makefile, with extension (ex: vecna.mak) as the first and only argument. (ex: "chrmak vecna.mak")\r
+\r
+The characteristics file is technically called a make file, or .mak. it containst several variables, and what they should be. for example:\r
+\r
+/* comment */\r
+pcx_name=rath; //comment\r
+chr_name=rath;\r
+\r
+these variables can be scattered around anywhere in the mak file, so long as they have a semicolon after each command. you can stick comments anywhere like a c or vc file. here is a list of all the variables you need to set in the make file, what they are, and their typical values. In most cases, however, you should be able to just replace the values found in the samples rath.mak and vecna.mak with your own.\r
+\r
+---\r
+\r
+**pcx_name** the file name of the source pcx file, sans extension. note in the above examples or in the sampel .mak files it is not pcx_name = rath.pcx, only rath.\r
+**chr_name** the filename, sans extension, of the chr file to output. same as above in all other respects.\r
+\r
+**frame_w** the width of each frame of the chr (DEFAULT 16)\r
+**frame_h** the height of each frame (DEFAULT 32)\r
+\r
+**hot_x** the x-coord of the chr's hotspot. See appendix A for info on chr hotspots. (DEFAULT 0)\r
+**hot_y** the same, but y-coord (DEFAULT 16)\r
+**hot_w** the width of the obstructing region of the hotspot. (DEFAULT 16)\r
+**hot_h** the height of the obstructing region of the hotspot. (DEFAULT 16)\r
+\r
+**per_row** the number of frames per row in the pcx file. in old v1 chr/pcx files, this was 5. (DEFAULT 5)\r
+**total frames** total number of frames in the pcx file. (DEFAULT 20)\r
+\r
+**lidle** the frame to show when the chr is idling, facing the left (DEFAULT 10)\r
+**ridle** the frame to show when the chr is idling, facing the right (DEFAULT 15)\r
+**uidle** the frame to show when the chr is idling, facing up (DEFAULT 5)\r
+**didle** the frame to show when the chr is idling, facing down (DEFAULT 0)\r
+\r
+**lscript** the animation script for when the chr moves to the left. See appendix B for discussion of animation scripts. (DEFAULT F10W10F11W10F12W10F11W10F10W10F13W10F14W10F13W10)\r
+**rscript** the animation script for when the chr moves to the right. (DEFAULT F15W10F16W10F17W10F16W10F15W10F18W10F19W10F18W10)\r
+**uscript** the animation script for when the chr moves up (DEFAULT F5W10F6W10F7W10F6W10F5W10F8W10F9W10F8W10)\r
+**dscript** the animation script for when the chr moves down (DEFAULT F0W10F1W10F2W10F2W10F0W10F3W10F4W10F3W10)\r
+\r
+---\r
+\r
+APPENDIX A: Hotspots\r
+\r
+If a chr is located at coordinates (x,y) on the screen, then the pixel under the hotspot on the chr will be drawn at (x,y). \r
+\r
+You may think--"I tell a chr to go to (5,4) on the screen... but where exactly does it go? (4,4) from the middle, the left edge, or what?"\r
+Imagine three scenarios: a 4x4 sprite with the hotspot at top left, bottom left, and middle left, respectively:\r
+\r
+ Top Left Bottom Left Middle Left\r
+0123456789ABCDEF 0123456789ABCDEF 0123456789ABCEDEF\r
+1 1 **** 1\r
+2 +---hotspot 2 **** 2 ****\r
+3 \|/ 3 **** 3 \****\r
+4 @*** 4 @*** 4 +--@***\r
+5 **** 5 /|\ 5 | /****\r
+6 **** 6 +---hotspot 6 |\r
+7 **** 7 7 +---hotspot\r
+8 8 8\r
+\r
+So you can see how the hotspot determines how the sprite is oriented, relative to its current screen position.\r
+\r
+The default hotspot, (and its equivalent in v1) is at (0,16). That is, 0 to the right and 16 down from the upper-left corner of the sprite. Remember, default chr size is 16x32, and on computer, the (+,+) quadrant is quadrant IV. In other words\r
+\r
+ -32\r
+ -24\r
+ -16\r
+ -8\r
+-16 -12 -8 -4 0 4 8 12 16\r
+ 8 * * * *\r
+ 16 * * * * <--- sprite goes there. \r
+ 24 @ * * * @ is where hotspot would be\r
+ 32 * * * *\r
+\r
+Hotspots also have an obstruction width and height. This is the area of the chr that touches the ground, and cannot walk over things. In your game, you may want your head to be drawn on top of a wall, if your feet are against the bottom of the wall, right? But you don't want your feet drawn on top of the wall.\r
+\r
++----------------------+\r
+| |\r
+| |\r
+| |\r
+| |\r
+| +---+ |\r
+| |***| |\r
++------|@@@|-----------+\r
+ +---+\r
+\r
+The messy area is the chr; the @@@, and the --- beneath it, would be OBSTRUCTIVE. If the player tried to walk up, he couldnt--you would be walking into the wall. The *** and the --- above it would not be obstructive.\r
+\r
+Obstructive areas are defined by declaring their width and height, based from the chr's hotspot. the default values, a width and height of 16, would count over 16 and down 16 from the hotspot, effectively making the bottom 16x16 square of the 16x32 chr obstructive.\r
+\r
+Final example:\r
+A 32x64 giant might be defined like this:\r
+\r
+...\r
+hot_x=8;\r
+hot_y=48;\r
+hot_w=16;\r
+hot_h=16;\r
+...\r
+\r
+---\r
+\r
+APPENDIX B: Animation scripts\r
+\r
+Animation scripts are made of a string of no more than 255 characters. This string can contain any combination of COMMAND CODES, of which there are two.\r
+\r
+The two COMMAND CODES are F and W.\r
+\r
+**F** sets the current frame that should be shown. So, if you want your animation, when walking to go from frame 12 to 15, you would make the script: "F12F13F14F15F14F13F12". The F can have any number of digits after it, so you don't have to do F03F05, etc.. you can just do F3F5.\r
+\r
+**W** makes the animation string wait the specified number of milliseconds. If you peek at the default animation strings mentioned a ways up, you'll see that there is a Wxx between each frame. This pauses the frame so you can see it, effectively slowing the animation down. In fact, the animation we just maed an example of, "F12F13F14F15F14F13F12", would g oby *waaay* too fast. Now that we know the W command we can fix it: "F12W10F13W10F14W10F15W10F14W10F13W10F12W10".
\ No newline at end of file
--- /dev/null
+@echo off\r
+gxx -s -Wall -Werror -m486 -O3 chrmak.cc -o chrmak.exe\r
--- /dev/null
+@echo off\r
+wcl386 /bt=dos /l=pmodew /mf /os /5r /fp5 /wx /we chrmak.cc\r
--- /dev/null
+\r
+/* CHRMAK makefile\r
+ û aen */\r
+\r
+pcx_name=vecna; // image source\r
+chr_name=vecna; // output .CHR name\r
+\r
+frame_w=16; frame_h=32; // frame dims\r
+\r
+hot_x=0; hot_y=16; // hotspot coord\r
+hot_w=16; hot_h=16; // hotspot dims\r
+\r
+per_row=5; total_frames=20; // frames per row, total\r
+\r
+lidle=10; ridle=15;; // left/right idle frames\r
+uidle=5; didle=0; // up/down idle frames\r
+ \r
+lscript=F10W10F11W10F12W10F11W10F10W10F13W10F14W10F13W10; // movement scripts\r
+rscript=F15W10F16W10F17W10F16W10F15W10F18W10F19W10F18W10;\r
+uscript=F5W10F6W10F7W10F6W10F5W10F8W10F9W10F8W10;\r
+dscript=F0W10F1W10F2W10F2W10F0W10F3W10F4W10F3W10;\r
--- /dev/null
+\r
+ current version\r
+\r
+ chrmak.exe <aen, may 11; 12:01a> 0.1b\r
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 pack.c -o pack.exe\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#define byte unsigned char\r
+\r
+// ================================= Data ====================================\r
+\r
+FILE *pack;\r
+FILE *list;\r
+FILE *src;\r
+char *strbuf,*filebuf;\r
+int numfiles,curofs;\r
+char headertag[]="VRGPACK";\r
+\r
+typedef struct\r
+{\r
+ unsigned char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int count; // internal (engine-runtime) use\r
+ char extractable; // can UNPACK .. unpack it?\r
+ char override; // should the engine override it w/\r
+ // local files?\r
+} filestruct;\r
+\r
+filestruct filetbl[512];\r
+byte *ptr;\r
+\r
+// ================================= Code ====================================\r
+\r
+void CreatePackHeader()\r
+{ char a;\r
+\r
+ fwrite(&headertag, 1, 7, pack);\r
+ a=1; fwrite(&a, 1, 1, pack); // pack version 1\r
+ fwrite(&numfiles, 1, 4, pack); // number of files in archive\r
+\r
+ // Hmm.. that's it. What a boring header. :)\r
+}\r
+\r
+void EncryptHeader()\r
+{ byte lastvalue; //, precodebyte;\r
+\r
+ ptr=(byte *) filetbl;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) filetbl + (int) 5120)\r
+ {\r
+ (*ptr)+=lastvalue;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void DecryptHeader()\r
+{ byte lastvalue, precodebyte;\r
+\r
+ ptr=(byte *) filetbl;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) filetbl + (int) 5120)\r
+ {\r
+ precodebyte=*ptr;\r
+ (*ptr)-=lastvalue;\r
+ lastvalue=precodebyte;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void BuildFileTable()\r
+{ int i;\r
+\r
+ curofs=12+(numfiles*100);\r
+ memset(filetbl, 0, sizeof filetbl);\r
+\r
+ for (i=0; i<numfiles; i++)\r
+ {\r
+ fscanf(list,"%s",strbuf);\r
+ if (!(src=fopen(strbuf,"rb")))\r
+ {\r
+ printf("Could not open included file %s. \n",strbuf);\r
+ exit(-1);\r
+ }\r
+ memcpy(&filetbl[i].fname,strbuf,strlen(strbuf));\r
+ fseek(src,0,2);\r
+ filetbl[i].packofs=curofs;\r
+ filetbl[i].size=ftell(src);\r
+ curofs+=filetbl[i].size;\r
+ fscanf(list,"%s",strbuf); filetbl[i].extractable=atoi(strbuf);\r
+ fscanf(list,"%s",strbuf); filetbl[i].override=atoi(strbuf);\r
+ fclose(src);\r
+ }\r
+ EncryptHeader();\r
+ fwrite(&filetbl, numfiles, 100, pack);\r
+ DecryptHeader();\r
+}\r
+\r
+void DumpFiles()\r
+{ int i;\r
+\r
+ for (i=0; i<numfiles; i++)\r
+ {\r
+ filebuf=(char *) malloc(filetbl[i].size);\r
+ src=fopen(filetbl[i].fname, "rb");\r
+ printf("Packing file %s...\n", filetbl[i].fname);\r
+ fread(filebuf, 1, filetbl[i].size, src);\r
+ fwrite(filebuf, 1, filetbl[i].size, pack);\r
+ fclose(src);\r
+ free(filebuf);\r
+ }\r
+ printf("Done.\n");\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ printf("PACK v.0.1 Copyright (C)1997 BJ Eirich \n");\r
+ if (argc<2)\r
+ {\r
+ printf("USAGE: PACK <makefile> \n");\r
+ exit(-1);\r
+ }\r
+\r
+ if (!(list=fopen(argv[1],"r")))\r
+ {\r
+ printf("Unable to open file %s. \n",argv[1]);\r
+ exit(-1);\r
+ }\r
+\r
+ strbuf=(char *) malloc(100);\r
+ fscanf(list,"%s",strbuf);\r
+\r
+ if (!(pack=fopen(strbuf,"wb")))\r
+ {\r
+ printf("Unable to create file %s. \n",strbuf);\r
+ exit(0);\r
+ }\r
+ fscanf(list,"%d",&numfiles);\r
+\r
+ CreatePackHeader();\r
+ BuildFileTable();\r
+ DumpFiles();\r
+\r
+ fclose(list);\r
+ fclose(pack);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+pack.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 pakfile\r
+---\r
+v2 enjoys its own built-in pakfile system. v2 can use files in any number of pakfiles at the same time it can read files from your computer's regular directory structure. This allows for simplified distribution and management of v2 games, as well as adding a small measure of security to the data you worked so hard to create for your game--it will be a pain for losers to remove (read: rip) data from pakfiles, although we make no gurantees that your data is safe. This should help the situation some.\r
+\r
+To create a packfile, pack.exe takes a makefile of the following format:\r
+\r
+--- <--cut below this line :)\r
+pakfile_to_create.vrg\r
+number_of_files\r
+file_name_1 flag_extrractable flag_overrideable\r
+file_name_2 flag_extrractable flag_overrideable\r
+file_name_3 flag_extrractable flag_overrideable\r
+---\r
+\r
+Here it is with sample data.\r
+\r
+---\r
+test.vrg\r
+3\r
+pack.c 0 0\r
+test.mak 1 0\r
+test.obj 0 1\r
+---\r
+\r
+This would create test.vrg with three files: pack.c, neither overrideable nor extractable, test.mak, extractable, but not overrideable, and test.obj, only overrideable.\r
+\r
+Extractable means that the file will be extracted by unpack.exe. Files you want to keep secret should have a 0 for this. \r
+\r
+Overrideable files will be overridden by a file of the same name in the game directory. That means, if there is a file in the game directory, it will use that one instead of the one in the pakfile. Otherwise, the copy in the pakfile will always be used. You'll usually want this set to 1, as it facilitates patches, etc. For example, if battle.map had a bug in it, you could just distribute a copy of the corrected battle.map for users to chunk in the game directory, and v2 would use the corrected copy instead.\r
+\r
--- /dev/null
+test.vrg\r
+3\r
+pack.c 1 1\r
+pack.exe 1 1\r
+todo 1 1\r
--- /dev/null
+entity/entity, point makes contact w/entity, entity/bbox,b\r
+box/bbox,and a line intersect/entity and line intersect/bbox.\r
+sin,cos and tan() functions.\r
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 pcx2fnt.c -o pcx2fnt.exe\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <malloc.h>\r
+\r
+char fname1[100], fname2[100];\r
+int xs, ys, ns;\r
+FILE *fnt,*pcxf;\r
+char *virscr;\r
+\r
+char manufacturer; // pcx header\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+short int xmin,ymin;\r
+short int xmax,ymax;\r
+short int hres;\r
+short int vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+short int bytes_per_line;\r
+short int palette_type;\r
+char filler[58];\r
+unsigned char pal[768];\r
+\r
+unsigned short int width,depth;\r
+unsigned short int bytes;\r
+unsigned char c, run, ss=0;\r
+unsigned int vidoffset, n=0;\r
+\r
+void ReadPCXLine(unsigned char *dest)\r
+{\r
+ int j;\r
+ n=0;\r
+\r
+ do {\r
+ c=fgetc(pcxf) & 0xff;\r
+ if ((c & 0xc0)==0xc0) {\r
+ run=c & 0x3f;\r
+ c=fgetc(pcxf);\r
+ for (j=0; j<run; j++)\r
+ dest[vidoffset+n+j]=c;\r
+ n+=run; }\r
+ else { dest[vidoffset+n]=c;\r
+ n++; }\r
+ } while (n<bytes);\r
+}\r
+\r
+void LoadPCXHeader()\r
+{\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ fseek(pcxf,-768L,SEEK_END);\r
+ fread(&pal,1,768,pcxf);\r
+ fseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+}\r
+\r
+void dumpframe(int x, int y)\r
+{ int i,j;\r
+ unsigned char c;\r
+\r
+ for (i=y; i<y+ys; i++)\r
+ for (j=x; j<x+xs; j++)\r
+ {\r
+ c=virscr[(i*width)+j];\r
+ fwrite(&c, 1, 1, fnt);\r
+ }\r
+}\r
+\r
+int main()\r
+{\r
+ int i,j,z;\r
+\r
+ printf("PCX2FNT v.3.00 Copyright (C)1998 BJ Eirich \n");\r
+ printf("PCX filename: "); fflush(stdout);\r
+ scanf("%s",fname1);\r
+ pcxf=fopen(fname1,"rb");\r
+ printf("FNT filename: "); fflush(stdout);\r
+ scanf("%s",fname2);\r
+ fnt=fopen(fname2, "wb");\r
+ printf("Width of font: "); fflush(stdout);\r
+ scanf("%d", &xs);\r
+ printf("Height of font: "); fflush(stdout);\r
+ scanf("%d", &ys);\r
+ printf("Number of subsets: "); fflush(stdout);\r
+ scanf("%d", &ns);\r
+\r
+ version=1;\r
+ fwrite(&version, 1, 1, fnt);\r
+ fwrite(&xs, 1, 2, fnt);\r
+ fwrite(&ys, 1, 2, fnt);\r
+ fwrite(&ns, 1, 2, fnt);\r
+\r
+ LoadPCXHeader();\r
+ virscr=(char *) malloc(width*depth);\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=i*width;\r
+ ReadPCXLine(virscr);\r
+ }\r
+\r
+ for (z=0; z<ns; z++)\r
+ for (i=0; i<5; i++)\r
+ for (j=0; j<20; j++)\r
+ if ((i*20)+j<96) dumpframe((j*(xs+1))+1,(i*(ys+1))+(1+(ys+1)*(z*5)));\r
+\r
+// for (i=0; i<5; i++)\r
+// for (j=0; j<20; j++)\r
+// if ((i*20)+j<96) dumpframe((j*(xs+1))+1,(i*(ys+1))+(1+(ys+1)*5));\r
+\r
+ fclose(pcxf);\r
+ fclose(fnt);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+pcx2fnt.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 font file from pcx\r
+---\r
+If you need to make a custom font for your game, you're in luck: pcx2fnt is very easy to use. Simply run it. It will ask you for an input pcx file, which must be in the correct format (described below), the .fnt file to output, the height and width of the characters, and the number of subset fonts.\r
+\r
+The pcx format is simple: each font must be surrounded by a 1 pixel wide pad, with 20 characters per row. The characters of the font must be in the correct order for v2 to print strings correctly. The best thing you can do to figure out this format is look at the two examples. Everything will be perfectly clear then.\r
+\r
+Subsets are what you'll see if you look in font02b.pcx. Each font file can have many subsets potentially. These are most often used for different colors of letters, although they *could* be completely different fonts. The characters would have to be the same size, in that case. This explains why the subset system was designed for, and we have only used it to, make different colors of text.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 trans.c -o trans.exe\r
--- /dev/null
+gradients 16\r
+starts 0 ends 15 endspan\r
+starts 16 ends 31 endspan\r
+starts 32 ends 47 endspan\r
+starts 48 ends 63 endspan\r
+starts 64 ends 79 endspan\r
+starts 80 ends 95 endspan\r
+starts 96 ends 111 endspan\r
+starts 112 ends 127 endspan\r
+starts 128 ends 143 endspan\r
+starts 144 ends 159 endspan\r
+starts 160 ends 167 endspan\r
+starts 168 ends 175 endspan\r
+starts 176 ends 191 endspan\r
+starts 192 ends 207 endspan\r
+starts 208 ends 223 endspan\r
+starts 224 ends 239 endspan\r
+starts 240 ends 254 endspan\r
+end\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <strings.h>\r
+#include <stdlib.h>\r
+\r
+// ================================= Data ====================================\r
+\r
+struct span\r
+{\r
+ int begin, end; // begin & end location of span\r
+ int len, inverse; // lenth of span and inverse on/off\r
+};\r
+\r
+struct span spans[32]; // maximum of 32 spans.\r
+char numspans; // number of active spans in PDF\r
+\r
+unsigned char *transparencytbl; // full transparency table (64k)\r
+char outname[100]; // output filename\r
+char paldefname[100]; // palette definition filename\r
+char *strbuf; // generic string buffer\r
+\r
+char spanidx[256]; // Color -> Span xlat table\r
+\r
+// ================================= Code ====================================\r
+\r
+void ParsePaletteDefinition(FILE *f)\r
+{ int i;\r
+\r
+ fscanf(f,"%s",strbuf);\r
+ if (stricmp("gradients",strbuf))\r
+ {\r
+ printf("Not a valid PDF file. \n");\r
+ exit(-1);\r
+ }\r
+ fscanf(f,"%s",strbuf);\r
+ numspans=atoi(strbuf);\r
+\r
+ for (i=0; i<numspans; i++)\r
+ {\r
+ spans[i].inverse=0;\r
+\r
+ while (1)\r
+ {\r
+ fscanf(f,"%s",strbuf);\r
+ if (!stricmp("starts",strbuf))\r
+ { fscanf(f,"%s", strbuf);\r
+ spans[i].begin=atoi(strbuf);\r
+ continue; }\r
+ if (!stricmp("ends",strbuf))\r
+ { fscanf(f,"%s", strbuf);\r
+ spans[i].end=atoi(strbuf);\r
+ continue; }\r
+ if (!stricmp("inverse",strbuf))\r
+ { spans[i].inverse=1;\r
+ continue; }\r
+ if (!stricmp("endspan",strbuf))\r
+ { spans[i].len=abs(spans[i].end-spans[i].begin);\r
+ break; }\r
+ }\r
+ }\r
+ fclose(f);\r
+}\r
+\r
+void GenerateSpanIndex()\r
+{ int i,j;\r
+\r
+ for (i=0; i<numspans; i++)\r
+ {\r
+ for (j=spans[i].begin; j<=spans[i].end; j++)\r
+ spanidx[j]=i;\r
+ }\r
+}\r
+\r
+unsigned char MixColors(int i, int j)\r
+{ unsigned char in_i, in_j, in_m, f;\r
+\r
+ in_i=i-spans[(int)spanidx[i]].begin; // Get a intensity number from 0 to len\r
+ in_i=in_i*63/spans[(int)spanidx[i]].len; // Translate intensity to 0..63 range\r
+ if (spans[(int)spanidx[i]].inverse)\r
+ in_i=63-in_i; // If inverse, flip it.\r
+\r
+ // Now, repeat for j.\r
+\r
+ in_j=j-spans[(int)spanidx[j]].begin; // Get a intensity number from 0 to len\r
+ in_j=in_j*63/spans[(int)spanidx[j]].len; // Translate intensity to 0..63 range\r
+ if (spans[(int)spanidx[j]].inverse)\r
+ in_j=63-in_j; // If inverse, flip it.\r
+\r
+ in_m=(in_i+in_j)/2; // Average intensities.\r
+\r
+ // now find final color.\r
+\r
+ if (spans[(int)spanidx[i]].inverse) // If dest span is inverse,\r
+ in_m=63-in_m; // flip intensity_mixed\r
+ in_m=in_m*spans[(int)spanidx[i]].len/63; // Convert intensity to 0 .. len range\r
+\r
+ f=spans[(int)spanidx[i]].begin+in_m; // done!\r
+\r
+ return f;\r
+}\r
+\r
+void WriteTable(FILE *f)\r
+{ int i, j;\r
+\r
+ transparencytbl=(char *) malloc(65536);\r
+ memset(transparencytbl, 0, 65535);\r
+\r
+ for (i=0; i<256; i++)\r
+ for (j=0; j<256; j++)\r
+ transparencytbl[(i*256)+j]=MixColors(i, j);\r
+\r
+ fwrite(transparencytbl, 256, 256, f);\r
+ fclose(f);\r
+}\r
+\r
+int main ()\r
+{ FILE *f;\r
+\r
+ strbuf=(char *) malloc(2000);\r
+ printf("TRANS v.1.00 Transparency-table generator \n");\r
+ printf("Copyright (C)1998 vecna \n\n");\r
+\r
+ printf("Output table filename: ");\r
+ fflush(stdout); gets(outname);\r
+ printf("Palette definition filename: ");\r
+ fflush(stdout); gets(paldefname);\r
+\r
+ if (!(f=fopen(paldefname,"r")))\r
+ {\r
+ printf("Could not open palette definition file.\n");\r
+ exit(-1);\r
+ }\r
+\r
+ ParsePaletteDefinition(f);\r
+ GenerateSpanIndex();\r
+\r
+ f=fopen(outname,"wb");\r
+ WriteTable(f);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+trans.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates translucency table for use in v2\r
+---\r
+If you want to use translucency effects in v2, you'll need to have the appropriate trans.tbl file. This program will make it.\r
+\r
+Game palettes, unless you're elite like snes programmers, should be made up of a number of gradients. Trans.exe takes advantage of this by accepting a makefile (for amusement called Palette Definition File, conveniently extensioned .pdf. Our extension makes more sense than Adobe's, though.) consisting of a list of gradients found in the palette. This unique method of generating a translucency table does not need the actual palette--it only needs to know which indexes in the palette start and finish each gradient.\r
+\r
+The .pdf format looks like this (the x spots are where you'll fill in numbers):\r
+\r
+GRADIENTS x_num_times\r
+STARTS x ENDS x ENDSPAN\r
+STARTS x ENDS x ENDSPAN <--x_num_time entries\r
+STARTS x ENDS x ENDSPAN\r
+... etc\r
+\r
+With sample data:\r
+\r
+gradients 3\r
+starts 0 ends 128 endspan\r
+starts 129 ends 240 inverse endspan\r
+starts 141 ends 254 endspan\r
+\r
+Whats that inverse, stuck in there, you say? That just indicates that instead of gradient going from dark to light it goes from light to dark (that *is* what inverse means).\r
+\r
+Inspect the sample files for more info.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+gradients 16\r
+starts 0 ends 15 endspan\r
+starts 16 ends 32 endspan\r
+starts 33 ends 47 endspan\r
+starts 48 ends 63 endspan\r
+starts 64 ends 79 endspan\r
+starts 80 ends 95 endspan\r
+starts 96 ends 111 endspan\r
+starts 112 ends 127 endspan\r
+starts 128 ends 143 endspan\r
+starts 144 ends 159 endspan\r
+starts 160 ends 175 endspan\r
+starts 176 ends 191 endspan\r
+starts 192 ends 207 endspan\r
+starts 208 ends 223 endspan\r
+starts 224 ends 239 endspan\r
+starts 240 ends 255 endspan\r
--- /dev/null
+gradients 16\r
+starts 0 ends 31 endspan\r
+starts 32 ends 47 inverse endspan\r
+starts 48 ends 55 inverse endspan\r
+starts 56 ends 63 endspan\r
+starts 64 ends 79 inverse endspan\r
+starts 80 ends 87 inverse endspan\r
+starts 88 ends 111 inverse endspan\r
+starts 112 ends 127 inverse endspan\r
+starts 128 ends 135 inverse endspan\r
+starts 136 ends 159 inverse endspan\r
+starts 160 ends 182 endspan\r
+starts 183 ends 191 endspan\r
+starts 191 ends 223 inverse endspan\r
+starts 224 ends 239 endspan\r
+starts 240 ends 247 inverse endspan\r
+starts 248 ends 254 inverse endspan\r
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 unpack.c -o unpack.exe\r
--- /dev/null
+test.vrg\r
+3\r
+pack.c 1 1\r
+pack.exe 1 1\r
+todo 1 1\r
--- /dev/null
+entity/entity, point makes contact w/entity, entity/bbox,b\r
+box/bbox,and a line intersect/entity and line intersect/bbox.\r
+sin,cos and tan() functions.\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <malloc.h>\r
+\r
+#define byte unsigned char\r
+// ================================= Data ====================================\r
+\r
+FILE *pack;\r
+FILE *src;\r
+char strbuf[2048],*filebuf;\r
+int numfiles;\r
+char headertag[]={ 'V','R','G','P','A','C','K',0 };\r
+\r
+struct filestruct\r
+{\r
+ unsigned char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int count; // internal (engine-runtime) use\r
+ char extractable; // can UNPACK .. unpack it?\r
+ char override; // should the engine override it w/\r
+ // local files?\r
+};\r
+\r
+struct filestruct filetbl[512];\r
+\r
+// ================================= Code ====================================\r
+\r
+void DecryptHeader()\r
+{ byte lastvalue, precodebyte, *ptr;\r
+\r
+ ptr=(byte *) filetbl;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) filetbl + (int) 5120)\r
+ {\r
+ precodebyte=*ptr;\r
+ (*ptr)-=lastvalue;\r
+ lastvalue=precodebyte;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void CheckPackHeader()\r
+{ char a;\r
+\r
+ fread(strbuf, 1, 7, pack);\r
+ strbuf[8]=0;\r
+ if (strcmp(strbuf,headertag))\r
+ {\r
+ printf("*error* Not a valid VRG packfile. \n");\r
+ exit(-1);\r
+ }\r
+ fread(&a, 1, 1, pack);\r
+ if (a!=1)\r
+ {\r
+ printf("*error* Incorrect VRG packfile version. \n");\r
+ exit(-1);\r
+ }\r
+ fread(&numfiles, 1, 4, pack);\r
+ fread(&filetbl, 100, numfiles, pack);\r
+ DecryptHeader();\r
+}\r
+\r
+void DumpFiles()\r
+{ int i;\r
+\r
+ printf("UNPACK v.0.1 Copyright (C)1997 BJ Eirich\n");\r
+ for (i=0; i<numfiles; i++)\r
+ {\r
+ filebuf=(char *) malloc(filetbl[i].size);\r
+ fread(filebuf, 1, filetbl[i].size, pack);\r
+ if (filetbl[i].extractable)\r
+ {\r
+ src=fopen(filetbl[i].fname, "wb");\r
+ printf("File: %s \n",filetbl[i].fname);\r
+ fwrite(filebuf, 1, filetbl[i].size, src);\r
+ fclose(src);\r
+ }\r
+ else printf("File: %s unexctractable.\n",filetbl[i].fname);\r
+ free(filebuf);\r
+ }\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ if (argc<2)\r
+ {\r
+ printf("UNPACK v.0.1 Copyright (C)1997 BJ Eirich \n");\r
+ printf("USAGE: UNPACK <VRG packfile> \n");\r
+ exit(-1);\r
+ }\r
+\r
+ if (!(pack=fopen(argv[1],"rb")))\r
+ {\r
+ printf("Unable to open file %s. \n",argv[1]);\r
+ exit(-1);\r
+ }\r
+\r
+ CheckPackHeader();\r
+ DumpFiles();\r
+\r
+ fclose(pack);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+unpack.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: extracts files from v2 pakfile\r
+---\r
+It doesnt get any better than this. type unpack followed by the name of the packfile you want to unpack. if you can't get that right, unpack.exe will give you even more explicit instructions. unpack.exe will then dump all the files contained in the pakfile with their extractable flags set into the directory you ran unpack.exe from.\r
+\r
+Use this only if the author of a demo/game gives you permission to use his stuff, or else we'll hunt you down and break your legs.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+@echo off\r
+if exist *.obj del *.obj\r
+if exist *.o del *.o\r
+if exist *.err del *.err\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__CODE_INC)\r
+#define __CODE_INC\r
+\r
+// Single-byte opcode descriptors\r
+\r
+#define EXEC 1\r
+#define VAR0_ASSIGN 2\r
+#define VAR1_ASSIGN 3\r
+#define VAR2_ASSIGN 4\r
+#define GENERAL_IF 5\r
+#define ELSE 6\r
+#define GOTO 7\r
+#define FOR_LOOP0 8\r
+#define FOR_LOOP1 9\r
+#define SWITCH 10\r
+#define CASE 11\r
+#define ENDSCRIPT 255\r
+\r
+// Single-byte operand descriptors\r
+\r
+#define OP_IMMEDIATE 1\r
+#define OP_VAR0 2\r
+#define OP_VAR1 3\r
+#define OP_VAR2 4\r
+#define OP_GROUP 5\r
+\r
+// Single-byte IF handler parameters\r
+\r
+#define ZERO 0\r
+#define NONZERO 1\r
+#define EQUALTO 2\r
+#define NOTEQUAL 3\r
+#define GREATERTHAN 4\r
+#define GREATERTHANOREQUAL 5\r
+#define LESSTHAN 6\r
+#define LESSTHANOREQUAL 7\r
+\r
+// Single byte assignment descriptors\r
+\r
+#define SET 1\r
+#define INCREMENT 2\r
+#define DECREMENT 3\r
+#define INCSET 4\r
+#define DECSET 5\r
+\r
+// Operand combination descriptors\r
+#define ADD 1\r
+#define SUB 2\r
+#define MULT 3\r
+#define DIV 4\r
+#define MOD 5\r
+#define OP_END 255\r
+\r
+#endif // __CODE_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Code Generation module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "funclib.h"\r
+#include "vcc.h"\r
+#include "vccode.h"\r
+#include "lexical.h"\r
+#include "preproc.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#define LETTER 1\r
+#define SPECIAL 3\r
+\r
+// -- Function arguements type defs\r
+\r
+#define VOID 1\r
+#define INT 1\r
+#define CHARPTR 2\r
+#define STRING 3\r
+\r
+unsigned char *source, *src;\r
+unsigned char *outbuf, *code;\r
+unsigned char inevent=0;\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[20];\r
+ int numargs, numlocals;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+funcdecl funcs[700];\r
+int numfuncs=0;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+vardecl vars[500];\r
+int curstartofs=0;\r
+int numvars=0;\r
+int varidx;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int vsofs;\r
+ int arraylen;\r
+} strdecl;\r
+\r
+strdecl str[300];\r
+int sstartofs=0;\r
+int numstr=0;\r
+\r
+int vctype; // 0 / 1 :: map / system\r
+\r
+// -- local function parameters --\r
+\r
+char larg[20][40];\r
+\r
+// -- MAP vc stuff --\r
+\r
+char *functbl[512];\r
+int mfuncs=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void HandleString();\r
+void HandleFunction();\r
+void HandleUserFunction();\r
+void HandleFunctionType();\r
+void EmitOperand();\r
+\r
+void EmitC (char c)\r
+{\r
+ if (locate && locate == (int)(code - outbuf))\r
+ vcerr("Located.");\r
+\r
+ *code++ = c;\r
+}\r
+\r
+void EmitW (short w)\r
+{\r
+ short *c=(short *)code;\r
+\r
+ if (locate && locate == (int)(code - outbuf))\r
+ vcerr("Located.");\r
+\r
+ *c=w; code+=2;\r
+}\r
+\r
+void EmitD (int d)\r
+{\r
+ long *c=(long *)code;\r
+\r
+ if (locate && locate == (int)(code - outbuf))\r
+ vcerr("Located.");\r
+\r
+ *c=d; code+=4;\r
+}\r
+\r
+void EmitString(char *str)\r
+ { while ((*code++ = *str++)) ; }\r
+\r
+void HandleStringOperand()\r
+{\r
+ if (NextIs("\""))\r
+ {\r
+ EmitC(s_IMMEDIATE);\r
+ GetString();\r
+ EmitString(token);\r
+ return;\r
+ }\r
+ GetToken();\r
+ if (token_type==IDENTIFIER && varcategory==op_STRING)\r
+ {\r
+ EmitC(s_GLOBAL);\r
+ EmitW(str[varidx].vsofs);\r
+ return;\r
+ }\r
+ if (token_type==IDENTIFIER && varcategory==op_SARRAY)\r
+ {\r
+ EmitC(s_ARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ return;\r
+ }\r
+ if (token_type==IDENTIFIER && varcategory==op_SLOCAL)\r
+ {\r
+ EmitC(s_LOCAL);\r
+ EmitC((char) varidx);\r
+ return;\r
+ }\r
+ if (TokenIs("str"))\r
+ {\r
+ EmitC(s_NUMSTR);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("left"))\r
+ {\r
+ EmitC(s_LEFT);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("right"))\r
+ {\r
+ EmitC(s_RIGHT);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("mid"))\r
+ {\r
+ EmitC(s_MID);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("chr"))\r
+ {\r
+ EmitC(s_CHR);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ else vcerr("Unknown string operand. ");\r
+}\r
+\r
+void HandleString()\r
+{\r
+ while (1)\r
+ {\r
+ HandleStringOperand();\r
+ if (NextIs("+"))\r
+ {\r
+ EmitC(s_ADD);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ EmitC(s_END);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void EmitOperand();\r
+void DoSomething();\r
+\r
+void HandleOperand()\r
+{\r
+ GetToken();\r
+ if (token_type==DIGIT)\r
+ {\r
+ EmitC(op_IMMEDIATE);\r
+ EmitD(token_nvalue);\r
+ return;\r
+ }\r
+ if (token_type==IDENTIFIER)\r
+ {\r
+ if (varcategory==op_UVAR)\r
+ {\r
+ EmitC(op_UVAR);\r
+ EmitD(vars[varidx].varstartofs);\r
+ return;\r
+ }\r
+ if (varcategory==op_UVARRAY)\r
+ {\r
+ EmitC(op_UVARRAY);\r
+ EmitD(vars[varidx].varstartofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ return;\r
+ }\r
+ if (varcategory==op_LVAR)\r
+ {\r
+ EmitC(op_LVAR);\r
+ EmitC((char) varidx);\r
+ return;\r
+ }\r
+ if (varcategory==op_HVAR0)\r
+ {\r
+ EmitC(op_HVAR0);\r
+ EmitC((char) varidx);\r
+ return;\r
+ }\r
+ if (varcategory==op_HVAR1)\r
+ {\r
+ EmitC(op_HVAR1);\r
+ EmitC((char) varidx);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ return;\r
+ }\r
+ }\r
+ if (token_type==FUNCTION && token_subtype==op_BFUNC)\r
+ {\r
+ if (!returntypes[funcidx])\r
+ {\r
+ vcerr("%s() does not return a vlue.", token);\r
+ }\r
+ EmitC(op_BFUNC);\r
+ HandleFunction();\r
+ return;\r
+ }\r
+ if (token_type==FUNCTION && token_subtype==op_UFUNC)\r
+ {\r
+ if (!funcs[funcidx].returntype)\r
+ {\r
+ vcerr("%s() does not return a vlue.", token);\r
+ }\r
+ EmitC(op_UFUNC);\r
+ HandleUserFunction();\r
+ return;\r
+ }\r
+ vcerr("Unknown token.");\r
+}\r
+\r
+void EmitOperand()\r
+{\r
+ while (1) // Modifier-process loop.\r
+ {\r
+ if (NextIs("("))\r
+ {\r
+ EmitC(op_GROUP);\r
+ GetToken();\r
+ EmitOperand();\r
+ Expect(")");\r
+ }\r
+ else HandleOperand();\r
+\r
+ if (NextIs("+"))\r
+ {\r
+ EmitC(op_ADD);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("-"))\r
+ {\r
+ EmitC(op_SUB);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("/"))\r
+ {\r
+ EmitC(op_DIV);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("*"))\r
+ {\r
+ EmitC(op_MULT);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("%"))\r
+ {\r
+ EmitC(op_MOD);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs(">>"))\r
+ {\r
+ EmitC(op_SHR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("<<"))\r
+ {\r
+ EmitC(op_SHL);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("&"))\r
+ {\r
+ EmitC(op_AND);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("|"))\r
+ {\r
+ EmitC(op_OR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("^"))\r
+ {\r
+ EmitC(op_XOR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ EmitC(op_END);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void HandleFunction()\r
+{\r
+ switch (funcidx)\r
+ {\r
+ case 0: vcfunc_Exit(); break;\r
+ case 1: Message(); break;\r
+ case 2: GenericFunc(3,1); break;\r
+ case 3: GenericFunc(4,1); break;\r
+ case 4: GenericFunc(5,1); break;\r
+ case 5: vc_loadimage(); break;\r
+ case 6: GenericFunc(7,5); break;\r
+ case 7: GenericFunc(8,5); break;\r
+ case 8: GenericFunc(9,0); break;\r
+ case 9: GenericFunc(10,0); break;\r
+ case 10: vc_AllocateEntity(); break;\r
+ case 11: GenericFunc(12,1); break;\r
+ case 12: vc_Map(); break;\r
+ case 13: vc_LoadFont(); break;\r
+ case 14: vc_PlayFLI(); break;\r
+ case 15: GenericFunc(16,2); break;\r
+ case 16: vc_PrintString(); break;\r
+ case 17: vc_LoadRaw(); break;\r
+ case 18: GenericFunc(19,4); break;\r
+ case 19: GenericFunc(20,1); break;\r
+ case 20: GenericFunc(21,7); break;\r
+ case 21: GenericFunc(22,0); break;\r
+ case 22: GenericFunc(23,0); break;\r
+ case 23: GenericFunc(24,1); break;\r
+ case 24: vc_EntityMove(); break;\r
+ case 25: GenericFunc(26,4); break;\r
+ case 26: GenericFunc(27,4); break;\r
+ case 27: GenericFunc(28,5); break;\r
+ case 28: GenericFunc(29,4); break;\r
+ case 29: GenericFunc(30,4); break;\r
+ case 30: GenericFunc(31,5); break;\r
+ case 31: GenericFunc(32,5); break;\r
+ case 32: vc_strlen(); break;\r
+ case 33: vc_strcmp(); break;\r
+ case 34: GenericFunc(35,0); break;\r
+ case 35: GenericFunc(36,1); break;\r
+ case 36: GenericFunc(37,1); break;\r
+ case 37: GenericFunc(38,1); break;\r
+ case 38: GenericFunc(39,3); break;\r
+ case 39: GenericFunc(40,2); break;\r
+ case 40: GenericFunc(41,1); break;\r
+ case 41: GenericFunc(42,1); break;\r
+ case 42: GenericFunc(43,3); break;\r
+ case 43: vc_HookRetrace(); break;\r
+ case 44: vc_HookTimer(); break;\r
+ case 45: GenericFunc(46,2); break;\r
+ case 46: vc_SetRString(); break;\r
+ case 47: GenericFunc(48,4); break;\r
+ case 48: GenericFunc(49,3); break;\r
+ case 49: GenericFunc(50,0); break;\r
+ case 50: vc_PartyMove(); break;\r
+ case 51: GenericFunc(52,1); break;\r
+ case 52: GenericFunc(53,1); break;\r
+ case 53: GenericFunc(54,1); break;\r
+ case 54: GenericFunc(55,0); break;\r
+ case 55: GenericFunc(56,1); break;\r
+ case 56: GenericFunc(57,1); break;\r
+ case 57: GenericFunc(58,5); break;\r
+ case 58: GenericFunc(59,5); break;\r
+ case 59: GenericFunc(60,2); break;\r
+ case 60: vc_HookKey(); break;\r
+ case 61: vc_PlayMusic(); break;\r
+ case 62: GenericFunc(63,0); break;\r
+ case 63: GenericFunc(64,5); break;\r
+ case 64: vc_OpenFile(); break;\r
+ case 65: GenericFunc(66,1); break;\r
+ case 66: vc_QuickRead(); break;\r
+ case 67: GenericFunc(68,1); break;\r
+ case 68: GenericFunc(69,1); break;\r
+ case 69: GenericFunc(70,0); break;\r
+ case 70: GenericFunc(71,0); break;\r
+ case 71: GenericFunc(72,7); break;\r
+ case 72: GenericFunc(73,15); break;\r
+ case 73: vc_CacheSound(); break;\r
+ case 74: GenericFunc(75,0); break;\r
+ case 75: GenericFunc(76,3); break;\r
+ case 76: GenericFunc(77,7); break;\r
+ case 77: GenericFunc(78,4); break;\r
+ case 78: GenericFunc(79,4); break;\r
+ case 79: vc_val(); break;\r
+ case 80: GenericFunc(81,7); break;\r
+ case 81: GenericFunc(82,5); break;\r
+ case 82: vc_Log(); break;\r
+ case 83: GenericFunc(84,2); break;\r
+ case 84: GenericFunc(85,2); break;\r
+ case 85: GenericFunc(86,3); break;\r
+ case 86: GenericFunc(87,1); break;\r
+ case 87: GenericFunc(88,1); break;\r
+ case 88: GenericFunc(89,1); break;\r
+ case 89: vc_fgetline(); break;\r
+ case 90: vc_fgettoken(); break;\r
+ case 91: vc_fwritestring(); break;\r
+ case 92: GenericFunc(93, 3); break;\r
+ case 93: vc_frename(); break;\r
+ case 94: vc_fdelete(); break;\r
+ case 95: vc_fwopen(); break;\r
+ case 96: GenericFunc(97, 1); break;\r
+ case 97: GenericFunc(98, 3); break;\r
+ case 98: GenericFunc(99, 3); break;\r
+ case 99: GenericFunc(100, 6); break;\r
+ case 100: GenericFunc(101, 0); break;\r
+ case 101: GenericFunc(102, 7); break;\r
+ case 102: GenericFunc(103, 1); break;\r
+ case 103: GenericFunc(104, 1); break;\r
+ case 104: GenericFunc(105, 1); break;\r
+ case 105: vc_asc(); break;\r
+ case 106: GenericFunc(107, 1); break;\r
+ case 107: vc_NumForScript(); break;\r
+ case 108: vc_FileSize(); break;\r
+ case 109: GenericFunc(110, 1); break;\r
+ case 110: GenericFunc(111, 0); break;\r
+ default: vcerr("Internal error. Unknown standard function.");\r
+ }\r
+}\r
+\r
+void HandleUserFunction()\r
+{\r
+ int i, idx;\r
+\r
+ idx=funcidx;\r
+ EmitW((short) idx);\r
+ Expect("(");\r
+ for (i=0; i<funcs[idx].numargs; i++)\r
+ {\r
+ if (i) Expect(",");\r
+ if (funcs[idx].argtype[i]==INT) EmitOperand();\r
+ if (funcs[idx].argtype[i]==STRING) HandleString();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void HandleFunctionType()\r
+{\r
+ if (token_subtype==op_BFUNC)\r
+ {\r
+ EmitC(opEXEC_STDLIB);\r
+ HandleFunction();\r
+ }\r
+ else\r
+ if (token_subtype==op_UFUNC)\r
+ {\r
+ EmitC(opEXEC_EXTERNFUNC);\r
+ HandleUserFunction();\r
+ }\r
+}\r
+\r
+void HandleIfComponent()\r
+{ char ot=0;\r
+\r
+ if (NextIs("!"))\r
+ {\r
+ ot=i_ZERO;\r
+ GetToken();\r
+ }\r
+ EmitOperand();\r
+\r
+ if (NextIs("=")) { ot=i_EQUALTO; GetToken(); }\r
+ if (NextIs("!=")) { ot=i_NOTEQUAL; GetToken(); }\r
+ if (NextIs(">")) { ot=i_GREATERTHAN; GetToken(); }\r
+ if (NextIs(">=")) { ot=i_GREATERTHANOREQUAL; GetToken(); }\r
+ if (NextIs("<")) { ot=i_LESSTHAN; GetToken(); }\r
+ if (NextIs("<=")) { ot=i_LESSTHANOREQUAL; GetToken(); }\r
+\r
+ if (!ot) EmitC(i_NONZERO);\r
+ else if (ot==i_ZERO) EmitC(i_ZERO);\r
+ else\r
+ {\r
+ EmitC(ot);\r
+ EmitOperand();\r
+ }\r
+}\r
+\r
+void HandleIfGroup()\r
+{\r
+ while (1)\r
+ {\r
+ HandleIfComponent();\r
+\r
+ if (NextIs("&&"))\r
+ {\r
+ EmitC(i_AND);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("||"))\r
+ {\r
+ EmitC(i_OR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ GetToken();\r
+ if (!TokenIs(")") && !TokenIs(";"))\r
+ vcerr("Syntax error.");\r
+ EmitC(i_UNGROUP);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void ProcessIf()\r
+{\r
+ char *falseofs = 0;\r
+ char *elseofs = 0;\r
+ char *b = 0;\r
+\r
+ EmitC(opIF);\r
+ Expect("(");\r
+ HandleIfGroup();\r
+\r
+ falseofs=code;\r
+ EmitD(0); // We'll come back to this and fix it up.\r
+\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ if (NextIs("else"))\r
+ {\r
+ EmitC(opGOTO);\r
+ elseofs=code;\r
+ EmitD(0);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ if (NextIs("else"))\r
+ {\r
+ EmitC(opGOTO);\r
+ elseofs=code;\r
+ EmitD(0);\r
+ }\r
+ }\r
+\r
+ b=code; // Put correct false-execution offset thingy.\r
+ code=falseofs;\r
+ EmitD((int) b - (int) outbuf);\r
+ code=b;\r
+\r
+ if (NextIs("else"))\r
+ {\r
+ GetToken();\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ }\r
+ b=code; // Put correct else-execution offset thingy.\r
+ code=elseofs;\r
+ EmitD((int) b - (int) outbuf);\r
+ code=b;\r
+ }\r
+}\r
+\r
+void ProcessWhile()\r
+{ char *falseofs, *top, *b;\r
+\r
+ top=code;\r
+ EmitC(opIF);\r
+ Expect("(");\r
+ HandleIfGroup();\r
+\r
+ falseofs=code;\r
+ EmitD(0); // We'll come back to this and fix it up.\r
+\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ EmitC(opGOTO);\r
+ EmitD((int) top - (int) outbuf);\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ EmitC(opGOTO);\r
+ EmitD((int) top - (int) outbuf);\r
+ }\r
+\r
+ b=code; // Put correct false-execution offset thingy.\r
+ code=falseofs;\r
+ EmitD((int) b - (int) outbuf);\r
+ code=b;\r
+}\r
+\r
+void ProcessFor()\r
+{ char *src1, *src2, *loopstartpos, *srctmp;\r
+\r
+ Expect("(");\r
+ while (!TokenIs(";"))\r
+ DoSomething(); // Emit initialization code.\r
+\r
+ src1=src; // Store position of loop conditional\r
+ while (!NextIs(";")) GetToken(); GetToken();\r
+ src2=src; // Store position of end-of-loop code\r
+\r
+ while (!NextIs(")")) GetToken(); GetToken();\r
+ loopstartpos=(char *) (int) code - (int) outbuf;\r
+\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ }\r
+ srctmp=src;\r
+ src=src2;\r
+ while (!TokenIs(")"))\r
+ DoSomething();\r
+ src=src1;\r
+ EmitC(opIF);\r
+ HandleIfGroup();\r
+ EmitD((int) code - (int) outbuf +9);\r
+ EmitC(opGOTO);\r
+ EmitD((int) loopstartpos);\r
+\r
+ src=srctmp;\r
+}\r
+\r
+void HandleAssign()\r
+{\r
+ int vc;\r
+\r
+ vc=varcategory;\r
+ EmitC(opASSIGN);\r
+ if (vc==op_UVAR)\r
+ {\r
+ EmitC(op_UVAR);\r
+ EmitD(vars[varidx].varstartofs);\r
+ }\r
+ else if (vc==op_UVARRAY)\r
+ {\r
+ EmitC(op_UVARRAY);\r
+ EmitD(vars[varidx].varstartofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ }\r
+ else if (vc==op_LVAR)\r
+ {\r
+ EmitC(op_LVAR);\r
+ EmitC((char) varidx);\r
+ }\r
+ else if (vc==op_HVAR0)\r
+ {\r
+ EmitC(op_HVAR0);\r
+ EmitC((char) varidx);\r
+ }\r
+ else if (vc==op_HVAR1)\r
+ {\r
+ EmitC(op_HVAR1);\r
+ EmitC((char) varidx);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ }\r
+ else if (vc==op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW((short) str[varidx].vsofs);\r
+ }\r
+ else if (vc==op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW((short) str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ }\r
+ else if (vc==op_SLOCAL)\r
+ {\r
+ EmitC(op_SLOCAL);\r
+ EmitW((short) varidx);\r
+ }\r
+ GetToken();\r
+ if (TokenIs("++")) { EmitC(a_INC); GetToken(); return; } else\r
+ if (TokenIs("--")) { EmitC(a_DEC); GetToken(); return; } else\r
+ if (TokenIs("+=")) { EmitC(a_INCSET); } else\r
+ if (TokenIs("-=")) { EmitC(a_DECSET); } else\r
+ if (TokenIs("=")) { EmitC(a_SET); } else\r
+ vcerr("Invalid assignment operator.");\r
+ if (vc==op_STRING) HandleString();\r
+ else if (vc==op_SARRAY) HandleString();\r
+ else if (vc==op_SLOCAL) HandleString();\r
+ else EmitOperand();\r
+ GetToken();\r
+}\r
+\r
+int c=0;\r
+\r
+void HandleReturn()\r
+{\r
+ if (!vctype)\r
+ {\r
+ Expect(";");\r
+ EmitC(opRETURN);\r
+ return;\r
+ }\r
+ if (!funcs[c].returntype)\r
+ {\r
+ Expect(";");\r
+ EmitC(opRETURN);\r
+ return;\r
+ }\r
+ if (funcs[c].returntype==1)\r
+ {\r
+ EmitC(opSETRETVAL);\r
+ EmitOperand();\r
+ Expect(";");\r
+ EmitC(opRETURN);\r
+ return;\r
+ }\r
+}\r
+\r
+void ProcessSwitch()\r
+{ char *buf,*retrptr;\r
+\r
+ EmitC(opSWITCH);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ Expect("{");\r
+\r
+ // case .. option loop\r
+\r
+ while (!NextIs("}"))\r
+ {\r
+ Expect("case");\r
+ EmitC(opCASE);\r
+ EmitOperand();\r
+ Expect(":");\r
+ retrptr=code;\r
+ EmitD(0);\r
+ while (!NextIs("case") && !NextIs("}")) DoSomething();\r
+ EmitC(opRETURN);\r
+ buf=code;\r
+ code=retrptr;\r
+ EmitD((int) buf - (int) outbuf);\r
+ code=buf;\r
+ }\r
+ Expect("}");\r
+ EmitC(opRETURN);\r
+}\r
+\r
+void DoSomething(void)\r
+{\r
+ GetToken();\r
+ if (TokenIs("return")) { HandleReturn(); return; }\r
+ if (token_type==FUNCTION) { HandleFunctionType(); Expect(";"); return; }\r
+ if (token_type==IDENTIFIER) { HandleAssign(); return; }\r
+ if (TokenIs("if")) { ProcessIf(); return; }\r
+ if (TokenIs("while")) { ProcessWhile(); return; }\r
+ if (TokenIs("for")) { ProcessFor(); return; }\r
+ if (TokenIs("switch")) { ProcessSwitch(); return; }\r
+ vcerr("Unknown token.");\r
+}\r
+\r
+void DumpSystemIdx()\r
+{ FILE *f;\r
+\r
+ vprint("Dumping system.idx index file.");\r
+ f=fopen("system.idx","wb");\r
+\r
+ fwrite(&numvars, 1, 4, f);\r
+ fwrite(&vars, sizeof vars / 500, numvars, f);\r
+ fwrite(&numfuncs, 1, 4, f);\r
+ fwrite(&funcs, sizeof funcs / 700, numfuncs, f);\r
+ fwrite(&numstr, 1, 4, f);\r
+ fwrite(&str, sizeof str / 300, numstr, f);\r
+ fclose(f);\r
+}\r
+\r
+void ReadSystemIdx()\r
+{ FILE *f;\r
+\r
+ if (!(f=fopen("system.idx","rb")))\r
+ err("Could not access system.idx.");\r
+\r
+ fread(&numvars, 1, 4, f);\r
+ fread(&vars, sizeof vars / 500, numvars, f);\r
+ fread(&numfuncs, 1, 4, f);\r
+ fread(&funcs, sizeof funcs / 700, numfuncs, f);\r
+ fread(&numstr, 1, 4, f);\r
+ fread(&str, sizeof str / 300, numstr, f);\r
+ fclose(f);\r
+}\r
+\r
+void DoLocalVariables(int c)\r
+{\r
+ int na;\r
+\r
+ na=funcs[c].numargs;\r
+ while (NextIs("int") || NextIs("string"))\r
+ {\r
+ GetToken();\r
+ if (TokenIs("int"))\r
+ {\r
+ funcs[c].argtype[na]=INT;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ while (!NextIs(";"))\r
+ {\r
+ Expect(",");\r
+ funcs[c].argtype[na]=INT;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ }\r
+ Expect(";");\r
+ }\r
+ if (TokenIs("string"))\r
+ {\r
+ funcs[c].argtype[na]=STRING;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ while (!NextIs(";"))\r
+ {\r
+ Expect(",");\r
+ funcs[c].argtype[na]=STRING;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ }\r
+ Expect(";");\r
+ }\r
+ }\r
+ funcs[c].numlocals=na;\r
+}\r
+\r
+void CompileMAP(char *fname)\r
+{ FILE *f;\r
+ int i;\r
+\r
+ // Compiles a map-based VC.\r
+ i=strlen(fname);\r
+ memcpy(strbuf, fname, i);\r
+ strbuf[i]='.';\r
+ strbuf[i+1]='V';\r
+ strbuf[i+2]='C';\r
+ strbuf[i+3]=0;\r
+\r
+ PreProcess(strbuf);\r
+\r
+ source=(char *) malloc(1000000);\r
+ memset(source, 0, 1000000);\r
+ outbuf=(char *) malloc(1000000);\r
+ memset(outbuf, 0, 1000000);\r
+ if (!(f=fopen("vcctemp.$$$","rb")))\r
+ err("Could not open source file.");\r
+ fread(source, 1, 1000000, f);\r
+ fclose(f);\r
+\r
+ ReadSystemIdx();\r
+\r
+ src=source;\r
+ code=outbuf;\r
+ vctype=0;\r
+\r
+ while (*src)\r
+ {\r
+ functbl[mfuncs]=(char *) (int) code - (int) outbuf;\r
+ mfuncs++;\r
+ Expect("event");\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ EmitC(opRETURN);\r
+ ParseWhitespace();\r
+ }\r
+ dprint("%s.vc (%i lines)", fname, lines);\r
+}\r
+\r
+void SkipBrackets()\r
+{\r
+ while (!NextIs("}"))\r
+ {\r
+ if (!*src)\r
+ err("No matching bracket.");\r
+ GetToken();\r
+ if (TokenIs("{")) SkipBrackets();\r
+ }\r
+ GetToken();\r
+}\r
+\r
+void CheckDup()\r
+{\r
+ int i=0; // bitch!\r
+\r
+ while (i<numhardfuncs)\r
+ {\r
+ if (!strcmp(hardfuncs[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardfuncs)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numhardvar0)\r
+ {\r
+ if (!strcmp(hardvar0[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar0)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numhardvar1)\r
+ {\r
+ if (!strcmp(hardvar1[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar1)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numfuncs)\r
+ {\r
+ if (!strcmp(funcs[i].fname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numfuncs)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+\r
+ i=0;\r
+ while (i<numvars)\r
+ {\r
+ if (!strcmp(vars[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numvars)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numstr)\r
+ {\r
+ if (!strcmp(str[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numstr)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+}\r
+\r
+void CompileSystem()\r
+{\r
+ FILE *f = 0;\r
+ int na = 0;\r
+ int type = 0;\r
+ int i = 0;\r
+\r
+ // Compiles a map-based VC.\r
+\r
+ PreProcess("system.vc");\r
+\r
+ source = (char *) malloc(1000000);\r
+ memset(source, 0, 1000000);\r
+ outbuf = (char *) malloc(1000000);\r
+ memset(outbuf, 0, 1000000);\r
+\r
+ if (!(f=fopen("vcctemp.$$$","rb")))\r
+ err("Could not open source file.");\r
+\r
+ fread(source, 1, 1000000, f);\r
+\r
+ fclose(f);\r
+\r
+ src=source;\r
+ code=outbuf;\r
+\r
+ vprint("First pass...");\r
+ vctype=1; tlines=0;\r
+ while (*src)\r
+ {\r
+ // system.vc is compiled in a two-pass system. The first pass simply\r
+ // goes through the system.vc file and sets up declarations for all\r
+ // global variables and function declarations. So system.vc won't\r
+ // have to worry about forward declarations or anything.\r
+\r
+ na=(int) src;\r
+ GetToken();\r
+ if (TokenIs("string"))\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ CheckDup();\r
+ memcpy(str[numstr].vname, token, strlen(token));\r
+ str[numstr].vsofs=sstartofs;\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ str[numstr].arraylen=token_nvalue;\r
+ Expect("]");\r
+ }\r
+ else str[numstr].arraylen=1;\r
+ sstartofs+=str[numstr].arraylen;\r
+ vprint("Decl %s of type string, size %i. [%i]",\r
+ str[numstr].vname, str[numstr].arraylen, str[numstr].vsofs);\r
+ numstr++;\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ if (TokenIs("int"))\r
+ {\r
+ GetToken();\r
+ if (NextIs("(")) type=0; else type=1;\r
+ src=(char *) na;\r
+ GetToken();\r
+ }\r
+ if (TokenIs("void") || (TokenIs("int") && !type))\r
+ {\r
+ if (TokenIs("void")) funcs[numfuncs].returntype=0;\r
+ if (TokenIs("int")) funcs[numfuncs].returntype=1;\r
+ GetToken();\r
+ CheckDup();\r
+ memcpy(funcs[numfuncs].fname,token,strlen(token));\r
+ funcs[numfuncs].numargs=0;\r
+ Expect("(");\r
+ while (!NextIs(")"))\r
+ {\r
+ GetToken();\r
+ na=funcs[numfuncs].numargs;\r
+ if (TokenIs("int")) { funcs[numfuncs].argtype[na]=INT; } else\r
+ if (TokenIs("string")) { funcs[numfuncs].argtype[na]=STRING; }\r
+ else vcerr("Invalid arguement declaration.");\r
+ GetToken();\r
+ if (NextIs(",")) GetToken();\r
+ funcs[numfuncs].numargs++;\r
+ }\r
+ Expect(")");\r
+ Expect("{");\r
+ SkipBrackets();\r
+ vprint("Found %s declaration for %s, %i parameters.",\r
+ funcs[numfuncs].returntype ? "int" : "void",\r
+ funcs[numfuncs].fname, funcs[numfuncs].numargs);\r
+ numfuncs++;\r
+ }\r
+ if (TokenIs("int") && type)\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ CheckDup();\r
+ memcpy(vars[numvars].vname, token, strlen(token));\r
+ vars[numvars].varstartofs=curstartofs;\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ vars[numvars].arraylen=token_nvalue;\r
+ Expect("]");\r
+ }\r
+ else vars[numvars].arraylen=1;\r
+ curstartofs+=vars[numvars].arraylen;\r
+ vprint("Decl %s of type int, size %i. [%i]", vars[numvars].vname,\r
+ vars[numvars].arraylen, vars[numvars].varstartofs);\r
+ numvars++;\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ }\r
+ dprint("system.vc: %i ints, %i strings, %i functions",\r
+ numvars, numstr, numfuncs);\r
+\r
+ vprint("Second pass...");\r
+ src=source; tlines=0;\r
+ while (*src)\r
+ {\r
+ // Everything in system.vc will either be a global var decl or\r
+ // a function definition.\r
+\r
+ na=(int) src;\r
+ GetToken();\r
+ if (TokenIs("string"))\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ Expect("]");\r
+ }\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ if (TokenIs("int"))\r
+ {\r
+ GetToken();\r
+ if (NextIs("(")) type=0; else type=1;\r
+ src=(char *) na;\r
+ GetToken();\r
+ }\r
+ if (TokenIs("void") || (TokenIs("int") && !type))\r
+ {\r
+ funcs[c].syscodeofs=(int) code - (int) outbuf;\r
+ GetToken();\r
+ Expect("(");\r
+ i=0;\r
+ memset(&larg, 0, 480);\r
+ while (!NextIs(")"))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ memcpy(larg[i], token, 40);\r
+ if (NextIs(",")) GetToken();\r
+ i++;\r
+ }\r
+ Expect(")");\r
+ Expect("{");\r
+ DoLocalVariables(c);\r
+ while (!NextIs("}")) DoSomething();\r
+ EmitC(opRETURN);\r
+ Expect("}");\r
+ c++;\r
+ }\r
+ if (TokenIs("int") && type)\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ Expect("]");\r
+ }\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ }\r
+ dprint("system.vc (%i lines, %i total)", lines, tlines);\r
+\r
+ DumpSystemIdx();\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__COMPILE_INC)\r
+#define __COMPILE_INC\r
+\r
+#define VOID 1\r
+#define INT 1\r
+#define CHARPTR 2\r
+#define STRING 3\r
+\r
+extern unsigned char *source, *src;\r
+extern unsigned char *outbuf, *code;\r
+extern unsigned char inevent;\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[20];\r
+ int numargs, numlocals;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+extern funcdecl funcs[300];\r
+extern int numfuncs;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int vsofs;\r
+ int arraylen;\r
+} strdecl;\r
+\r
+extern strdecl str[300];\r
+extern int sstartofs;\r
+extern int numstr;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+extern vardecl vars[300];\r
+extern int curstartofs;\r
+extern int numvars;\r
+extern int varidx, startsyscript;\r
+extern char larg[12][40];\r
+extern int c;\r
+\r
+extern char *functbl[512];\r
+extern int mfuncs;\r
+\r
+extern void CompileMAP(char *fname);\r
+extern void CompileSystem();\r
+extern void Expect(char *str);\r
+\r
+extern void EmitC(char c);\r
+extern void EmitW(short int w);\r
+extern void EmitD(int w);\r
+extern void EmitOperand();\r
+extern void EmitString(char *str);\r
+extern void HandleString();\r
+\r
+#endif // __COMPILE_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Standard Function Library module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "compile.h"\r
+#include "funclib.h"\r
+#include "vcc.h"\r
+#include "vccode.h"\r
+#include "lexical.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// ================================= Code ====================================\r
+\r
+void vcfunc_Exit()\r
+{\r
+ EmitC(1);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void Message()\r
+{\r
+ EmitC(2);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+}\r
+\r
+void vc_loadimage()\r
+{\r
+ EmitC(6);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_AllocateEntity()\r
+{\r
+ EmitC(11);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_Map()\r
+{\r
+ EmitC(13);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_LoadFont()\r
+{\r
+ EmitC(14);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PlayFLI()\r
+{\r
+ EmitC(15);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PrintString()\r
+{\r
+ EmitC(17);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_LoadRaw()\r
+{\r
+ EmitC(18);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_EntityMove()\r
+{\r
+ EmitC(25);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_strlen()\r
+{\r
+ EmitC(33);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_strcmp()\r
+{\r
+ EmitC(34);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_SetRString()\r
+{\r
+ EmitC(47);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PartyMove()\r
+{\r
+ EmitC(51);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PlayMusic()\r
+{\r
+ EmitC(62);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_OpenFile()\r
+{\r
+ EmitC(65);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_HookRetrace()\r
+{\r
+ char *na;\r
+\r
+ EmitC(44);\r
+ Expect("(");\r
+ na=src;\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ {\r
+ EmitC(2);\r
+ EmitD(funcidx);\r
+ }\r
+ else\r
+ {\r
+ src=na;\r
+ EmitC(1);\r
+ EmitOperand();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void vc_HookTimer()\r
+{\r
+ char *na;\r
+\r
+ EmitC(45);\r
+ Expect("(");\r
+ na=src;\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ {\r
+ EmitC(2);\r
+ EmitD(funcidx);\r
+ }\r
+ else\r
+ {\r
+ src=na;\r
+ EmitC(1);\r
+ EmitOperand();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void vc_HookKey()\r
+{\r
+ char *na;\r
+\r
+ EmitC(61);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ na=src;\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ {\r
+ EmitC(2);\r
+ EmitD(funcidx);\r
+ }\r
+ else\r
+ {\r
+ src=na;\r
+ EmitC(1);\r
+ EmitOperand();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void vc_QuickRead()\r
+{\r
+ EmitC(67);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ GetToken();\r
+ if (varcategory == op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (varcategory == op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ vcerr("String variable expected.");\r
+}\r
+\r
+void vc_CacheSound()\r
+{\r
+ EmitC(74);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_val()\r
+{\r
+ EmitC(80);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_Log()\r
+{\r
+ EmitC(83);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_fgetline()\r
+{\r
+ EmitC(90);\r
+ Expect("(");\r
+ GetToken();\r
+ if (varcategory == op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (varcategory == op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ vcerr("String variable expected.");\r
+}\r
+\r
+void vc_fgettoken()\r
+{\r
+ EmitC(91);\r
+ Expect("(");\r
+ GetToken();\r
+ if (varcategory == op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (varcategory == op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ vcerr("String variable expected.");\r
+}\r
+\r
+void vc_fwritestring()\r
+{\r
+ EmitC(92);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+}\r
+\r
+void vc_frename()\r
+{\r
+ EmitC(94);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_fdelete()\r
+{\r
+ EmitC(95);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_fwopen()\r
+{\r
+ EmitC(96);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_asc()\r
+{\r
+ EmitC(106);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_NumForScript()\r
+{\r
+ EmitC(108);\r
+ Expect("(");\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ EmitD(funcidx);\r
+ else vcerr("system script expected.");\r
+ Expect(")");\r
+}\r
+\r
+void vc_FileSize()\r
+{\r
+ EmitC(109);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void GenericFunc(unsigned char idcode, int numargs)\r
+{ char i;\r
+\r
+ EmitC(idcode);\r
+ if (!numargs)\r
+ {\r
+ Expect("(");\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (numargs==1)\r
+ {\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ Expect("(");\r
+ for (i=1; i<numargs; i++)\r
+ {\r
+ EmitOperand();\r
+ Expect(",");\r
+ }\r
+ EmitOperand();\r
+ Expect(")");\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__FUNCLIB_INC)\r
+#define __FUNCLIB_INC\r
+\r
+extern void vcfunc_Exit();\r
+extern void Message();\r
+extern void vc_loadimage();\r
+extern void vc_AllocateEntity();\r
+extern void vc_Map();\r
+extern void vc_LoadFont();\r
+extern void vc_PlayFLI();\r
+extern void vc_PrintString();\r
+extern void vc_LoadRaw();\r
+extern void vc_EntityMove();\r
+extern void vc_strlen();\r
+extern void vc_strcmp();\r
+extern void vc_SetRString();\r
+extern void vc_PartyMove();\r
+extern void vc_PlayMusic();\r
+extern void vc_OpenFile();\r
+extern void vc_HookRetrace();\r
+extern void vc_HookTimer();\r
+extern void vc_HookKey();\r
+extern void vc_QuickRead();\r
+extern void vc_CacheSound();\r
+extern void vc_val();\r
+extern void vc_Log();\r
+extern void vc_fgetline();\r
+extern void vc_fgettoken();\r
+extern void vc_fwritestring();\r
+extern void vc_frename();\r
+extern void vc_fdelete();\r
+extern void vc_fwopen();\r
+extern void vc_asc();\r
+extern void vc_NumForScript();\r
+extern void vc_FileSize();\r
+extern void GenericFunc(unsigned char funcid, int numargs);\r
+\r
+#endif // __FUNCLIB_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Lexical Parser ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <aen, may 16>\r
+// + ConvHexToDec() was severely screwed (would not return correct values at\r
+// *all*; own fault)--fixed\r
+// <aen, may 14>\r
+// + fixed some problems with tick mark parsing. didn't like certain chars.\r
+// <aen, may 9>\r
+// + fixed floating point exception crash in ConvHexToDec(), which occured\r
+// when using very large hex numbers (i think; like $ffffffff). was due to\r
+// use of pow()\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <math.h>\r
+#include "compile.h"\r
+#include "vcc.h"\r
+#include "vccode.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// Character types\r
+\r
+#define LETTER 1\r
+#define DIGIT 2\r
+#define SPECIAL 3\r
+\r
+// ---------------\r
+\r
+char token[2000]; // Token buffer\r
+int token_nvalue; // int value of token if it's type DIGIT\r
+char token_type; // type of current token.\r
+char token_subtype; // This is just crap.\r
+unsigned char chr_table[256]; // Character type table.\r
+\r
+int lines, tlines; // current line number being processed in\r
+char *source_file; // the current source file\r
+\r
+// ----------------\r
+\r
+char *hardfuncs[]=\r
+{\r
+ // A\r
+ "exit", "message", "malloc",\r
+ "free", "pow", "loadimage",\r
+ "copysprite", "tcopysprite", "render",\r
+ "showpage", "entityspawn", "setplayer",\r
+ "map", "loadfont", "playfli",\r
+\r
+ // B\r
+ "gotoxy", "printstring", "loadraw",\r
+ "settile", "allowconsole", "scalesprite",\r
+ "processentities", "updatecontrols", "unpress",\r
+ "entitymove", "hline", "vline",\r
+ "line", "circle", "circlefill", // 30\r
+\r
+ // C\r
+ "rect", "rectfill", "strlen",\r
+ "strcmp", "cd_stop", "cd_play",\r
+ "fontwidth", "fontheight", "setpixel",\r
+ "getpixel", "entityonscreen", "random",\r
+ "gettile", "hookretrace", "hooktimer",\r
+\r
+ // D\r
+ "setresolution", "setrstring", "setcliprect",\r
+ "setrenderdest", "restorerendersettings","partymove",\r
+ "sin", "cos", "tan",\r
+ "readmouse", "setclip", "setlucent",\r
+ "wrapblit", "twrapblit", "setmousepos", // 60\r
+\r
+ // E\r
+ "hookkey", "playmusic", "stopmusic",\r
+ "palettemorph", "fopen", "fclose",\r
+ "quickread", "addfollower", "killfollower",\r
+ "killallfollowers", "resetfollowers", "flatpoly",\r
+ "tmappoly", "cachesound", "freeallsounds",\r
+\r
+ // F\r
+ "playsound", "rotscale", "mapline",\r
+ "tmapline", "val", "tscalesprite",\r
+ "grabregion", "log", "fseekline",\r
+ "fseekpos", "fread", "fgetbyte",\r
+ "fgetword", "fgetquad", "fgetline", // 90\r
+\r
+ // G\r
+ "fgettoken", "fwritestring", "fwrite",\r
+ "frename", "fdelete", "fwopen",\r
+ "fwclose", "memcpy", "memset",\r
+ "silhouette", "initmosaictable", "mosaic",\r
+ "writevars", "readvars", "callevent", // 105\r
+\r
+ // H\r
+ "asc", "callscript", "numforscript",\r
+ "filesize", "ftell", "checkcorrupt"\r
+ };\r
+\r
+char returntypes[]=\r
+{\r
+ // A\r
+ 0, 0, 1,\r
+ 0, 1, 1,\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 1, 0,\r
+\r
+ // B\r
+ 0, 0, 1,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+\r
+ // C\r
+ 0, 0, 1,\r
+ 1, 0, 0,\r
+ 1, 1, 0,\r
+ 1, 1, 1,\r
+ 1, 0, 0,\r
+\r
+ // D\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 1, 1, 1,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+\r
+ // E\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+\r
+ // F\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 1,\r
+ 1, 1, 0,\r
+\r
+ // G\r
+ 0, 0, 0,\r
+ 0, 0, 1,\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 0, 0,\r
+\r
+ // H\r
+ 1, 0, 1,\r
+ 1, 1, 0\r
+};\r
+\r
+char *hardvar0[]=\r
+{\r
+ "xwin", "ywin", "cameratracking",\r
+ "timer", "up", "down",\r
+ "left", "right", "b1",\r
+ "b2", "b3", "b4",\r
+ "screenx", "screeny", "player", // 15\r
+\r
+ "numentsonscreen", "tracker", "mx",\r
+ "my", "mb", "vctrace",\r
+ "image_width", "image_height", "music_volume", // 24\r
+ "vsp", "lastent", "last_pressed"\r
+};\r
+\r
+char *hardvar1[]=\r
+{\r
+ "screen", "entity.x", "entity.y",\r
+ "entity.tx", "entity.ty", "entity.facing",\r
+ "entity.moving", "entity.specframe", "entity.speed",\r
+ "entity.movecode", "entsonscreen", "key",\r
+ "layer.hline", "byte", "word", // 15\r
+\r
+ "quad", "pal", "sbyte",\r
+ "sword", "squad"\r
+};\r
+\r
+int funcidx = 0;\r
+int varcategory = 0;\r
+\r
+int numhardfuncs = 111;\r
+int numhardvar0 = 27;\r
+int numhardvar1 = 20;\r
+\r
+// ================================= Code ====================================\r
+\r
+int streq(char *a, char *b)\r
+{\r
+ while (*a)\r
+ {\r
+ if (*a++ != *b++)\r
+ return 0;\r
+ }\r
+ return (*b==0);\r
+}\r
+\r
+char TokenIs(char *str)\r
+ { return streq(str,token); }\r
+\r
+void ParseWhitespace(void)\r
+{\r
+ while (1)\r
+ {\r
+ while (*src<=' ' && *src>2)\r
+ if (!*src++)\r
+ return;\r
+\r
+ if (src[0]=='/' && src[1]=='/')\r
+ {\r
+ while (*src && (*src != '\n'))\r
+ src++;\r
+ continue;\r
+ }\r
+\r
+ if (src[0]=='/' && src[1]=='*')\r
+ {\r
+ while (!(src[0]=='*' && src[1]=='/'))\r
+ {\r
+ src++;\r
+ if (!*src)\r
+ return;\r
+ if (*src == 1)\r
+ {\r
+ src++;\r
+ source_file = src;\r
+ while (*src++);\r
+ tlines++;\r
+ continue;\r
+ }\r
+ if (*src==2)\r
+ {\r
+ src++;\r
+ lines = (int) *(int *)src;\r
+ src += 4;\r
+ continue;\r
+ }\r
+ }\r
+ src+=2;\r
+ continue;\r
+ }\r
+\r
+ if (*src == 1)\r
+ {\r
+ src++;\r
+ source_file = src;\r
+ while (*src++);\r
+ continue;\r
+ }\r
+ if (*src==2)\r
+ {\r
+ src++;\r
+ lines = (int) *(int *)src;\r
+ src += 4;\r
+ tlines++;\r
+ continue;\r
+ }\r
+ break;\r
+ }\r
+}\r
+\r
+int GetStringIdx(char i)\r
+{\r
+ int j, k=0;\r
+\r
+ for (j=0; j<i; j++)\r
+ {\r
+ if (funcs[c].argtype[j]==STRING) k++;\r
+ }\r
+ return k;\r
+}\r
+\r
+void CheckLibFunc()\r
+{ int i;\r
+\r
+ token_nvalue=0;\r
+ token_type=0;\r
+\r
+ if (TokenIs("if") || TokenIs("else") || TokenIs("for") ||\r
+ TokenIs("while") || TokenIs("switch") || TokenIs("case") ||\r
+ TokenIs("goto"))\r
+ {\r
+ token_type=RESERVED;\r
+ return;\r
+ }\r
+ if (TokenIs("and"))\r
+ {\r
+ token_type=CONTROL;\r
+ token[0]='&'; token[1]='&'; token[2]=0;\r
+ return;\r
+ }\r
+ if (TokenIs("or"))\r
+ {\r
+ token_type=CONTROL;\r
+ token[0]='|'; token[1]='|'; token[2]=0;\r
+ return;\r
+ }\r
+ i=0;\r
+ while (i<numhardfuncs)\r
+ {\r
+ if (!strcmp(hardfuncs[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardfuncs)\r
+ {\r
+ token_type=FUNCTION;\r
+ token_subtype=op_BFUNC;\r
+ funcidx=i;\r
+ }\r
+ i=0;\r
+ while (i<numhardvar0)\r
+ {\r
+ if (!strcmp(hardvar0[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar0)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varcategory=op_HVAR0;\r
+ varidx=i;\r
+ }\r
+ i=0;\r
+ while (i<numhardvar1)\r
+ {\r
+ if (!strcmp(hardvar1[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar1)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varcategory=op_HVAR1;\r
+ varidx=i;\r
+ }\r
+\r
+ i=0;\r
+ while (i<numfuncs)\r
+ {\r
+ if (!strcmp(funcs[i].fname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numfuncs)\r
+ {\r
+ token_type=FUNCTION;\r
+ token_subtype=op_UFUNC;\r
+ funcidx=i;\r
+ }\r
+\r
+ i=0;\r
+ while (i<numvars)\r
+ {\r
+ if (!strcmp(vars[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numvars)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varidx=i;\r
+ varcategory=op_UVAR;\r
+ if (vars[varidx].arraylen>1) varcategory=op_UVARRAY;\r
+ }\r
+ i=0;\r
+ while (i<funcs[c].numlocals)\r
+ {\r
+ if (!strcmp(larg[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<funcs[c].numlocals)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varidx=i;\r
+ switch (funcs[c].argtype[varidx])\r
+ {\r
+ case INT: varcategory=op_LVAR; break;\r
+ case STRING: varcategory=op_SLOCAL;\r
+ varidx=GetStringIdx(varidx);\r
+ break;\r
+ default: vcerr("um.");\r
+ }\r
+ }\r
+ i=0;\r
+ while (i<numstr)\r
+ {\r
+ if (!strcmp(str[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numstr)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varidx=i;\r
+ varcategory=op_STRING;\r
+ if (str[i].arraylen>1) varcategory=op_SARRAY;\r
+ }\r
+}\r
+\r
+void GetIdentifier(void)\r
+{\r
+ int i;\r
+\r
+ i=0;\r
+ while ((chr_table[*src] == LETTER) || (chr_table[*src] == DIGIT))\r
+ token[i++] = *src++;\r
+ token[i]=0;\r
+ strlwr(token);\r
+ CheckLibFunc();\r
+}\r
+\r
+void ConvHexToDec()\r
+{\r
+ static const char *const hextbl="0123456789abcdef\0";\r
+ static int pow_lut[]={1,16,256,4096,65536,1048576,16777216,268435456};\r
+ int i=0, pos=0, z=0;\r
+ unsigned int j=0;\r
+\r
+ if (strlen(token)>9)\r
+ vcerr("Hex number exceeds 8 digit maximum.");\r
+\r
+ strlwr(token);\r
+ i=strlen(token)-1;\r
+ token_nvalue=0;\r
+ for (pos=0; i>0; pos++,i--)\r
+ {\r
+ z=token[i];\r
+ for (j=0; j<16; j++)\r
+ if (hextbl[j]==z) break;\r
+ if (j>=16)\r
+ vcerr("Invalid hex number.");\r
+ token_nvalue += (j * pow_lut[pos]);\r
+ }\r
+}\r
+\r
+void DoTickMarks()\r
+{\r
+ token_nvalue=token[1];\r
+}\r
+\r
+void GetNumber()\r
+{\r
+ int i;\r
+\r
+ if ('\'' == *src)\r
+ {\r
+ token[0]=*src++;\r
+ token[1]=*src++;\r
+ token[2]=*src++;\r
+ token[3]=0;\r
+ }\r
+ else\r
+ {\r
+ i=0;\r
+ while (chr_table[*src] != SPECIAL)\r
+ token[i++]=*src++;\r
+ token[i]=0;\r
+ }\r
+ if (token[0]=='$') ConvHexToDec();\r
+ else if (token[0]=='\'') DoTickMarks();\r
+ else token_nvalue=atoi(token);\r
+}\r
+\r
+void GetPunctuation()\r
+{ char c;\r
+\r
+ c=*src;\r
+ switch (c)\r
+ {\r
+ case '(': token[0]='('; token[1]=0; src++; break;\r
+ case ')': token[0]=')'; token[1]=0; src++; break;\r
+ case '{': token[0]='{'; token[1]=0; src++; break;\r
+ case '}': token[0]='}'; token[1]=0; src++; break;\r
+ case '[': token[0]='['; token[1]=0; src++; break;\r
+ case ']': token[0]=']'; token[1]=0; src++; break;\r
+ case ',': token[0]=','; token[1]=0; src++; break;\r
+ case ':': token[0]=':'; token[1]=0; src++; break;\r
+ case ';': token[0]=';'; token[1]=0; src++; break;\r
+ case '/': token[0]='/'; token[1]=0; src++; break;\r
+ case '*': token[0]='*'; token[1]=0; src++; break;\r
+ case '^': token[0]='^'; token[1]=0; src++; break;\r
+ case '%': token[0]='%'; token[1]=0; src++; break;\r
+ case '\"': token[0]='\"'; token[1]=0; src++; break;\r
+ case '+' : token[0]='+';\r
+ src++;\r
+ if (*src=='+')\r
+ { token[1]='+';\r
+ src++; }\r
+ else if (*src=='=')\r
+ { token[1]='=';\r
+ src++; }\r
+ else token[1]=0;\r
+ token[2]=0;\r
+ break;\r
+ case '-' : token[0]='-';\r
+ src++;\r
+ if (*src=='-')\r
+ { token[1]='-';\r
+ src++; }\r
+ else if (*src=='=')\r
+ { token[1]='=';\r
+ src++; }\r
+ else token[1]=0;\r
+ token[2]=0;\r
+ break;\r
+ case '>' : token[0]='>';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]='=';\r
+ token[2]=0;\r
+ src++; break; }\r
+ if (*src=='>')\r
+ { token[1]='>';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '<': token[0]='<';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]='=';\r
+ token[2] = 0;\r
+ src++; break; }\r
+ if (*src=='<')\r
+ { token[1]='<';\r
+ token[2] = 0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '!': token[0]='!';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]='=';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '=': token[0]='=';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]=0;\r
+ src++; }\r
+ else token[1]=0;\r
+ break;\r
+ case '&': token[0]='&';\r
+ src++;\r
+ if (*src=='&')\r
+ { token[1]='&';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '|': token[0]='|';\r
+ src++;\r
+ if (*src=='|')\r
+ { token[1]='|';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ default: src++; // This should be an error.\r
+ }\r
+}\r
+\r
+void GetString(void)\r
+{\r
+ int i;\r
+\r
+ // Expects a "quoted" string. Places the contents of the string in\r
+ // token[] but does not include the quotes.\r
+\r
+ Expect("\"");\r
+ i=0;\r
+ while (*src!='\"')\r
+ {\r
+ token[i++]=*src++;\r
+ if (i>250)\r
+ vcerr("String exceeds 250 character maximum.");\r
+ }\r
+ src++;\r
+ token[i]=0;\r
+}\r
+\r
+void GetToken(void)\r
+{\r
+ int i;\r
+\r
+ // Simply reads in the next statement and places it in the\r
+ // token buffer.\r
+\r
+ ParseWhitespace();\r
+ i=0;\r
+\r
+ switch (chr_table[*src])\r
+ {\r
+ case LETTER: { token_type = IDENTIFIER; GetIdentifier(); break; }\r
+ case DIGIT: { token_type = DIGIT; GetNumber(); break; }\r
+ case SPECIAL: { token_type = CONTROL; GetPunctuation(); break; }\r
+ }\r
+\r
+ if (!*src && inevent)\r
+ err("Unexpected end of file");\r
+}\r
+\r
+void Expect(char *str)\r
+{\r
+ GetToken();\r
+ if (TokenIs(str)) return;\r
+ vcerr("error: %s expected, %s got", str, token);\r
+}\r
+\r
+int ExpectNumber()\r
+{\r
+ GetToken();\r
+ if (token_type!=DIGIT) err("error: Numerical value expected");\r
+ return token_nvalue;\r
+}\r
+\r
+void InitCompileSystem()\r
+{ int i;\r
+\r
+ vprint("Building chr_table[].");\r
+ for (i=0; i<256; i++) chr_table[i]=SPECIAL;\r
+ for (i='0'; i<='9'; i++) chr_table[i]=DIGIT;\r
+ for (i='A'; i<='Z'; i++) chr_table[i]=LETTER;\r
+ for (i='a'; i<='z'; i++) chr_table[i]=LETTER;\r
+\r
+ chr_table[10]=0;\r
+ chr_table[13]=0;\r
+ chr_table[' ']=0;\r
+ chr_table['_']=LETTER;\r
+ chr_table['.']=LETTER;\r
+ chr_table['$']=DIGIT;\r
+ chr_table[39]=DIGIT;\r
+}\r
+\r
+char lasttoken[2048];\r
+\r
+int NextIs(char *str)\r
+{ char *ptr,tt,tst;\r
+ int i,nv;\r
+\r
+ ptr=src;\r
+ tt=token_type;\r
+ tst=token_subtype;\r
+ nv=token_nvalue;\r
+ memcpy(lasttoken, token, 2048);\r
+ GetToken();\r
+ src=ptr;\r
+ token_nvalue=nv;\r
+ tst=token_subtype;\r
+ tt=token_type;\r
+ //if (!strcmp(str,token)) i=1; else i=0;\r
+ i=streq(str,token);\r
+ memcpy(token, lasttoken, 2048);\r
+ return i;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__LEXICAL_INC)\r
+#define __LEXICAL_INC\r
+\r
+extern void ParseWhitespace();\r
+extern void GetNumber();\r
+extern void GetToken();\r
+extern void InitCompileSystem();\r
+extern int NextIs(char *str);\r
+\r
+extern void GetString(void);\r
+\r
+extern char token[2000]; // Token buffer\r
+extern unsigned int token_nvalue; // int value of token if it's type DIGIT\r
+extern char token_type; // type of current token.\r
+extern char token_subtype; // This is just crap.\r
+extern unsigned char chr_table[256]; // Character type table.\r
+extern char returntypes[];\r
+extern int lines, tlines;\r
+extern char *source_file;\r
+\r
+extern char TokenIs(char *str);\r
+extern void Expect(char *str);\r
+\r
+extern int numhardfuncs, funcidx;\r
+extern int varcategory, numhardvar0;\r
+extern int numhardvar1;\r
+extern char *hardfuncs[];\r
+extern char *hardvar0[];\r
+extern char *hardvar1[];\r
+\r
+#endif // __LEXICAL_INC\r
--- /dev/null
+@echo off\r
+if exist vcc.exe del vcc.exe\r
+gcc -s -Wall -Werror -m486 -O3 vcc.c preproc.c lexical.c compile.c funclib.c -o dj\vcc.exe\r
+rem gcc -Wall -Werror -pg vcc.c preproc.c lexical.c compile.c funclib.c -o dj\vcc\r
+if not exist dj\vcc.exe goto end\r
+if exist ..\djp.exe djp dj\vcc.exe\r
+:end\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Pre Processor module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <aen, may 14>\r
+// + fixed incorrect file markers and last character omission.\r
+// + one more incorrect file marker fix; was not restoring correctly after\r
+// #included files.\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#ifdef __WATCOMC__\r
+#include <io.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+\r
+#include "vcc.h"\r
+#include "lexical.h"\r
+\r
+int pp_dump;\r
+int pp_nomark;\r
+static int pp_tempct = 0;\r
+\r
+typedef struct\r
+ {\r
+ char *sym;\r
+ int sym_len;\r
+\r
+ char *resolve;\r
+ int resolve_len;\r
+\r
+ } pp_def;\r
+\r
+typedef struct\r
+ {\r
+ char *filename;\r
+ char *data;\r
+\r
+ } pp_include;\r
+\r
+void Process(char *filename);\r
+char *pp_token(char *p);\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+// DATA ////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+pp_def *pp_defarr = NULL;\r
+\r
+int pp_num_defs = 0;\r
+int pp_defs_allocated = 0;\r
+int PP_DEFS_BLOCK = 25;\r
+\r
+pp_include pp_incarr[100];\r
+//pp_include *pp_icur = NULL; // get rid of this\r
+char *cur_filename=0;\r
+char *last_filename=0;\r
+\r
+int pp_num_includes = 0;\r
+\r
+int pp_line = 0;\r
+int pp_total_lines = 0;\r
+\r
+const int EOF_CHAR = 0x00;\r
+\r
+char pp_chr_table[256];\r
+\r
+enum\r
+ {\r
+ PP_ERROR,\r
+ PP_WHITE,\r
+ PP_PUNC,\r
+ PP_DIGIT,\r
+ PP_LETTER,\r
+ PP_QUOTE,\r
+ PP_DIRECTIVE,\r
+ PP_NEWLINE,\r
+ PP_EOF\r
+ };\r
+\r
+FILE *pp_out = NULL;\r
+\r
+char pp_tok[1024];\r
+int pp_toktype = 0;\r
+\r
+int pp_last_delim = 1;\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+// CODE ////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+int logging=1;\r
+void log(char *str)\r
+{\r
+ if (logging)\r
+ {\r
+ FILE *fp = fopen("error.log", "a");\r
+ fprintf(fp, str);\r
+ fflush(fp);\r
+ fclose(fp);\r
+ }\r
+}\r
+\r
+void init_pp_chr_table()\r
+{\r
+ int x;\r
+\r
+ memset(pp_chr_table, PP_ERROR, 256);\r
+\r
+ pp_chr_table[EOF_CHAR] = PP_EOF;\r
+\r
+ for (x='A'; x<='Z'; x++) pp_chr_table[x] = PP_LETTER;\r
+ for (x='a'; x<='z'; x++) pp_chr_table[x] = PP_LETTER;\r
+ pp_chr_table['_'] = PP_LETTER;\r
+ pp_chr_table['.'] = PP_LETTER;\r
+\r
+ for (x='0'; x<='9'; x++) pp_chr_table[x] = PP_DIGIT;\r
+ pp_chr_table['$'] = PP_DIGIT;\r
+ pp_chr_table['\''] = PP_DIGIT;\r
+\r
+ pp_chr_table['+'] = pp_chr_table['-'] = PP_PUNC;\r
+ pp_chr_table['*'] = pp_chr_table['/'] = PP_PUNC;\r
+ pp_chr_table['%'] = PP_PUNC;\r
+ pp_chr_table['|'] = pp_chr_table['&'] = PP_PUNC;\r
+ pp_chr_table['='] = pp_chr_table['^'] = PP_PUNC;\r
+ pp_chr_table[','] = PP_PUNC;\r
+ pp_chr_table['<'] = pp_chr_table['>'] = PP_PUNC;\r
+ pp_chr_table['('] = pp_chr_table[')'] = PP_PUNC;\r
+ pp_chr_table['['] = pp_chr_table[']'] = PP_PUNC;\r
+ pp_chr_table['{'] = pp_chr_table['}'] = PP_PUNC;\r
+ pp_chr_table[':'] = pp_chr_table[';'] = PP_PUNC;\r
+ pp_chr_table['\\'] = pp_chr_table['!'] = PP_PUNC;\r
+\r
+ pp_chr_table[' '] = pp_chr_table['\t'] = PP_WHITE;\r
+ pp_chr_table['\r'] = PP_WHITE;\r
+\r
+ pp_chr_table['\n'] = PP_NEWLINE;\r
+\r
+ pp_chr_table['\"'] = PP_QUOTE;\r
+\r
+ pp_chr_table['#'] = PP_DIRECTIVE;\r
+}\r
+\r
+void pp_line_marker()\r
+{\r
+ if (pp_nomark) return;\r
+\r
+ fputc(2, pp_out);\r
+ fwrite(&pp_line, 1, 4, pp_out);\r
+}\r
+\r
+void pp_file_marker()\r
+{\r
+ if (pp_nomark) return;\r
+\r
+ fputc(1, pp_out);\r
+ fwrite(cur_filename, 1, strlen(cur_filename)+1, pp_out);\r
+}\r
+\r
+void pp_error(const char *error, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ va_start (lst, error);\r
+ vsprintf (string, error, lst);\r
+ va_end (lst);\r
+\r
+ printf ("*preproc error* ");\r
+ err (string);\r
+}\r
+\r
+void pp_line_error(const char *error, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ va_start (lst, error);\r
+ vsprintf (string, error, lst);\r
+ va_end (lst);\r
+\r
+ printf ("%s(%d) ", cur_filename, pp_line);\r
+ pp_error (string);\r
+}\r
+\r
+int pp_is_punc(int c)\r
+ { return (PP_PUNC == pp_chr_table[c]); }\r
+\r
+int pp_is_letter(int c)\r
+ { return (PP_LETTER == pp_chr_table[c]); }\r
+\r
+int pp_is_digit(int c)\r
+ { return (PP_DIGIT == pp_chr_table[c]); }\r
+\r
+int pp_is_ident(int c)\r
+ { return (pp_is_letter(c) || pp_is_digit(c)); }\r
+\r
+int pp_is_white(int c)\r
+ { return (PP_WHITE == pp_chr_table[c]); }\r
+\r
+int pp_is_directive(int c)\r
+ { return (PP_DIRECTIVE == pp_chr_table[c]); }\r
+\r
+int pp_is_eof(int c)\r
+ { return (PP_EOF == pp_chr_table[c]); }\r
+\r
+pp_def *pp_def_add(char *sym, char *resolve)\r
+{\r
+ pp_def *pp = NULL;\r
+ pp_def *p = NULL;\r
+\r
+ if (!(pp_defs_allocated % PP_DEFS_BLOCK))\r
+ {\r
+ pp_defs_allocated += PP_DEFS_BLOCK;\r
+\r
+ p = (pp_def *)realloc(\r
+ pp_defarr, pp_defs_allocated * sizeof(pp_def));\r
+ if (!p) pp_error("unable to grow #define list");\r
+\r
+ pp_defarr = p;\r
+ }\r
+\r
+ pp = &pp_defarr[pp_num_defs];\r
+ ++pp_num_defs;\r
+\r
+ pp->sym = (char *)malloc(strlen(sym) +1);\r
+ if (!pp->sym)\r
+ pp_error("memory exhausted");\r
+ strcpy(pp->sym, sym);\r
+ pp->sym_len = strlen(sym);\r
+\r
+ pp->resolve = (char *)malloc(strlen(resolve) +1);\r
+ if (!pp->resolve)\r
+ pp_error("memory exhausted");\r
+ strcpy(pp->resolve, resolve);\r
+ pp->resolve_len = strlen(resolve);\r
+\r
+ return pp;\r
+}\r
+\r
+pp_include *pp_include_add(char *filename)\r
+{\r
+ FILE *in = NULL;\r
+ pp_include *pp = NULL;\r
+ int z = 0;\r
+\r
+ if (pp_num_includes)\r
+ {\r
+ int i;\r
+ for (i=0; i<pp_num_includes; i++)\r
+ {\r
+ if (!stricmp(pp_incarr[i].filename, pp_tok))\r
+ pp_error("circular dependencies");\r
+ }\r
+ }\r
+\r
+ // alias\r
+ pp = &pp_incarr[pp_num_includes++];\r
+\r
+ in = fopen(filename, "rb");\r
+ if (!in) pp_error("unable to open %s", filename);\r
+\r
+ // filelength\r
+ fseek(in, 0, SEEK_END);\r
+ z = ftell(in);\r
+ fseek(in, 0, SEEK_SET);\r
+\r
+ // cache file\r
+ pp->data = (char *)malloc((z +2) * sizeof(char));\r
+ if (!pp->data) pp_error("memory exhausted");\r
+ fread(pp->data, 1, z, in);\r
+ fclose(in);\r
+\r
+ pp->data[z++] = 32; // <aen, may 12>\r
+ pp->data[z] = EOF_CHAR;\r
+\r
+ pp->filename = (char *)malloc(strlen(filename) +1);\r
+ if (!pp->filename) pp_error("memory exhausted");\r
+ strcpy(pp->filename, filename);\r
+ cur_filename=pp->filename;\r
+\r
+ return pp;\r
+}\r
+\r
+char *pp_skip_c_comment(char *p)\r
+{\r
+ p += 2;\r
+ while (*p && ('*' != *p || '/' != p[1]))\r
+ {\r
+ if ('\n' == *p)\r
+ {\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ }\r
+ if ('/' == *p && '*' == p[1])\r
+ p = pp_skip_c_comment(p);\r
+ else ++p;\r
+ }\r
+ if (*p) p += 2;\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_skip_cpp_comment(char *p)\r
+{\r
+ p += 2;\r
+ while (*p && '\n' != *p)\r
+ ++p;\r
+ if (*p)\r
+ {\r
+ ++p;\r
+\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_skipwhite(char *p)\r
+{\r
+ for (;;)\r
+ {\r
+ while (*p && PP_WHITE == pp_chr_table[(int) *p])\r
+ ++p;\r
+\r
+ if ('\n' == *p)\r
+ {\r
+ ++p;\r
+\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ continue;\r
+ }\r
+\r
+ // skip comments\r
+ if ('/' == *p)\r
+ {\r
+ switch (p[1])\r
+ {\r
+ case '/': p = pp_skip_cpp_comment(p); continue;\r
+ case '*': p = pp_skip_c_comment(p); continue;\r
+ }\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_punc(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ do {\r
+ *s++ = *p++;\r
+ } while (*p && pp_is_punc(*p));\r
+ *s = 0;\r
+\r
+ return p;\r
+}\r
+\r
+/*\r
+int is_hex(int c)\r
+{\r
+ return (\r
+ (c >= '0' && c <= '9')\r
+ || (c >= 'A' && c <= 'F')\r
+ || (c >= 'a' && c <= 'f'));\r
+}\r
+*/\r
+\r
+char *pp_token_digit(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ if ('\'' == *p)\r
+ {\r
+ *s++ = *p++;\r
+ if (!*p) return NULL;\r
+ *s++ = *p++;\r
+ if (!*p) return NULL;\r
+ *s++ = *p++;\r
+ if (!*p) return NULL;\r
+ *s = 0;\r
+ }\r
+ else\r
+ {\r
+ do {\r
+ *s++ = *p++;\r
+ } while (*p && pp_is_digit(*p));\r
+ if (*p) *s = 0;\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_letter(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ do {\r
+ *s++ = *p++;\r
+ } while (*p && pp_is_ident(*p));\r
+ if (*p) *s = 0;\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_directive(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ ++p; // skip #\r
+\r
+ // directive name\r
+ do {\r
+ *s++ = *p++;\r
+ } while (pp_is_ident(*p));\r
+ *s = 0;\r
+\r
+ // #include\r
+ if (!strcmp(pp_tok, "include"))\r
+ {\r
+ // boogly boogly boogly!\r
+ int l = 0;\r
+ char *e = NULL;\r
+\r
+ //printf("#include detected \n");\r
+\r
+ // any whitespace after 'include'\r
+ p = pp_skipwhite(p);\r
+\r
+ // skip, but don't expect, a "\r
+ if ('\"' == *p) ++p;\r
+\r
+ // grab the filename\r
+ e = pp_tok;\r
+ while (*p && '\"' != *p)\r
+ *e++ = *p++;\r
+ // if we didn't hit eof...?\r
+ if (*p)\r
+ {\r
+ // zero term filename\r
+ *e = 0;\r
+ // skip closing "\r
+ ++p;\r
+\r
+ last_filename=cur_filename; // <aen, may 14>\r
+ l = pp_line; // save\r
+ Process(pp_tok);\r
+ pp_line = l; // restore\r
+ cur_filename=last_filename; // <aen, may 14>\r
+ // reset file marker\r
+ pp_file_marker();\r
+\r
+ // disregard rest of line\r
+ while (*p && '\n' != *p)\r
+ ++p;\r
+ // if we didn't hit eof...?\r
+ if (*p)\r
+ {\r
+ // skip newline char\r
+ ++p;\r
+\r
+ // update line\r
+ ++pp_line;\r
+ pp_line_marker();\r
+\r
+ // dump null token... writes nothing i think...\r
+ pp_tok[0]='\0';\r
+ }\r
+ //else pp_error("screw you!");\r
+ }\r
+ }\r
+ // #define\r
+ else if (!strcmp(pp_tok, "define"))\r
+ {\r
+ char *e = NULL;\r
+ char sym[256];\r
+ char resolve[1024];\r
+\r
+ // find start of symbol\r
+ while (' ' == *p || '\t' == *p)\r
+ ++p;\r
+\r
+ // parse symbol\r
+ e = sym;\r
+ while (pp_is_ident(*p))\r
+ { *e++ = *p++; }\r
+ *e = 0;\r
+\r
+ // check for duplicate #defines\r
+ if (pp_num_defs)\r
+ {\r
+ int i;\r
+ int z = strlen(sym);\r
+ for (i=0; i<pp_num_defs; i++)\r
+ {\r
+ if (z == pp_defarr[i].sym_len)\r
+ {\r
+ if (!stricmp(pp_defarr[i].sym, sym))\r
+ pp_error("duplicate #define symbol");\r
+ }\r
+ }\r
+ }\r
+\r
+ // find start of argument list (if any), or resolve\r
+ while (' ' == *p || '\t' == *p)\r
+ ++p;\r
+\r
+ // found argument list; discard for now\r
+ if ('(' == *p)\r
+ {\r
+ ++p;\r
+ while (')' != *p)\r
+ ++p;\r
+ ++p;\r
+\r
+ // find start of resolve\r
+ while (' ' == *p || '\t' == *p)\r
+ ++p;\r
+ }\r
+\r
+ pp_last_delim = 1;\r
+ e = resolve;\r
+ // parse resolve\r
+ while ('\n' != *p)\r
+ {\r
+ // whitespace\r
+ if (' ' == *p || '\t' == *p)\r
+ {\r
+ do {\r
+ ++p;\r
+ } while (' ' == *p || '\t' == *p);\r
+ }\r
+\r
+ // continuation? (multiple lines)\r
+ if ('\\' == *p)\r
+ {\r
+ ++p;\r
+ while (*p && '\n' != *p)\r
+ ++p;\r
+ // if not eof\r
+ if (*p)\r
+ {\r
+ ++p;\r
+\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ }\r
+ continue;\r
+ }\r
+\r
+ // special case for 'x' chars\r
+ if ('\'' == *p)\r
+ {\r
+ *e++ = *p++;\r
+ do {\r
+ *e++ = *p++;\r
+ } while (*p && '\'' != *p);\r
+ *e++ = *p++;\r
+\r
+ pp_last_delim = 1;\r
+ continue;\r
+ }\r
+\r
+ // special case for string literals\r
+ if ('\"' == *p)\r
+ {\r
+ do {\r
+ *e++ = *p++;\r
+ } while (*p && '\"' != *p);\r
+ if (*p)\r
+ *e++ = *p++;\r
+\r
+ pp_last_delim = 1;\r
+ continue;\r
+ }\r
+\r
+ // this is just the preprocessor, so i don't need\r
+ // to get punctuation or digits in their correct form, i just\r
+ // have to copy them over as i see them.\r
+ if (pp_is_punc(*p) || pp_is_digit(*p))\r
+ {\r
+ do {\r
+ // d'oh!\r
+ if ('\'' == *p || '\\' == *p)\r
+ break;\r
+\r
+ *e++ = *p++;\r
+ } while (pp_is_punc(*p) || pp_is_digit(*p));\r
+\r
+ pp_last_delim = 1;\r
+ continue;\r
+ }\r
+\r
+ if (pp_is_letter(*p))\r
+ {\r
+ if (!pp_last_delim)\r
+ *e++ = ' ';\r
+\r
+ do {\r
+ *e++ = *p++;\r
+ } while (pp_is_ident(*p));\r
+\r
+ pp_last_delim = 0;\r
+ continue;\r
+ }\r
+\r
+ ++p; // unknown?\r
+ }\r
+ *e = 0;\r
+\r
+ // update define list\r
+ pp_def_add(sym, resolve);\r
+\r
+ pp_tok[0]='\0';\r
+ }\r
+ // #???\r
+ else pp_error("unknown preprocessor directive");\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_quote(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ *s++ = *p++;\r
+\r
+ while (*p && '\"' != *p)\r
+ *s++ = *p++;\r
+ // if not eof\r
+ if (*p)\r
+ {\r
+ *s++ = *p++;\r
+ *s = 0;\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token(char *p)\r
+{\r
+ p = pp_skipwhite(p);\r
+ if (!*p)\r
+ {\r
+ pp_tok[0] = '\0'; // gotta have this! (fixes last sym replication bug)\r
+ return p;\r
+ }\r
+\r
+ pp_toktype = pp_chr_table[(int) *p];\r
+\r
+ switch (pp_toktype)\r
+ {\r
+ case PP_PUNC: p = pp_token_punc(p); break;\r
+ case PP_DIGIT: p = pp_token_digit(p); break;\r
+ case PP_LETTER: p = pp_token_letter(p); break;\r
+\r
+ case PP_QUOTE: p = pp_token_quote(p); break;\r
+\r
+ case PP_DIRECTIVE:\r
+ p = pp_token_directive(p);\r
+ break;\r
+\r
+ case PP_EOF:\r
+ break;\r
+\r
+ case PP_ERROR:\r
+ pp_line_error("unknown character <%c:%i>", *p, *p);\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+void Process(char *filename)\r
+{\r
+ char *s = NULL;\r
+ pp_include *ppi = NULL;\r
+\r
+ // starts fresh for each #include file\r
+ pp_line = 1;\r
+ //pp_line_marker(); // hmm... did this kill the wat ver? i forget..\r
+\r
+ // push file\r
+ ppi = pp_include_add(filename);\r
+ s = ppi->data;\r
+\r
+ pp_file_marker();\r
+\r
+ pp_last_delim = 1;\r
+ s = pp_token(s);\r
+\r
+ // loop until we hit an EOF token\r
+ while (*s && PP_EOF != pp_toktype)\r
+ {\r
+ // for compactor; this is absolutely required for the parsing to\r
+ // work correctly for hex numbers\r
+ if (PP_LETTER == pp_toktype || PP_DIGIT == pp_toktype)\r
+ {\r
+ if (!pp_last_delim)\r
+ fputc(' ', pp_out);\r
+ }\r
+\r
+ if (pp_num_defs)\r
+ {\r
+ // #define replacement\r
+ if (PP_LETTER == pp_toktype)\r
+ {\r
+ pp_def *ppd = NULL;\r
+ int pp_token_len = strlen(pp_tok);\r
+ int i = 0;\r
+\r
+ for (i=0; i<pp_num_defs; i++)\r
+ {\r
+ ppd = pp_defarr + i;\r
+ // first see if the lengths match, for possible quick discard\r
+ if (ppd->sym_len == pp_token_len)\r
+ {\r
+ // lengths match, compare bytes\r
+ if (!stricmp(pp_tok, ppd->sym))\r
+ {\r
+ // match! overwrite token with resolve\r
+ memcpy(pp_tok, ppd->resolve, strlen(ppd->resolve)+1);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // write whatever we got\r
+ fwrite(pp_tok, 1, strlen(pp_tok), pp_out);\r
+\r
+ pp_last_delim = (PP_LETTER != pp_toktype);\r
+ s = pp_token(s);\r
+ }\r
+\r
+ // pop file\r
+ free(ppi->data);\r
+ free(ppi->filename);\r
+ --pp_num_includes;\r
+ //pp_icur = &pp_incarr[pp_num_includes]; // oops! :-)\r
+\r
+ pp_total_lines += pp_line;\r
+}\r
+\r
+void pp_dump_output()\r
+{\r
+ char strx[1024];\r
+\r
+ sprintf(strx, "copy vcctemp.$$$ vcc%i.$$$", pp_tempct);\r
+ ++pp_tempct;\r
+\r
+ system(strx);\r
+}\r
+\r
+void PreProcess(char *filename)\r
+{\r
+ pp_num_includes = 0;\r
+ init_pp_chr_table();\r
+\r
+ pp_out = fopen("VCCTEMP.$$$", "wb");\r
+ if (!pp_out) pp_error("unable to open VCCTEMP.$$$");\r
+\r
+ Process(filename);\r
+\r
+ fclose(pp_out);\r
+\r
+ // dump preproc output?\r
+ if (0 != pp_dump)\r
+ pp_dump_output();\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__PREPROC_INC)\r
+#define __PREPROC_INC\r
+\r
+extern void PreProcess(char *fname);\r
+extern void Process(char *fname);\r
+\r
+#endif // __PREPROC_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Main module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+#define VERSION "2.01c"\r
+\r
+#ifdef __DJGPP__\r
+#define BUILD_TAG "DJGPP V2\0"\r
+#endif\r
+\r
+#ifdef __WATCOMC__\r
+#define BUILD_TAG "Watcom 11.0\0"\r
+#endif\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+\r
+#include "compile.h"\r
+#include "lexical.h"\r
+\r
+extern int pp_dump;\r
+extern int pp_nomark;\r
+\r
+// ================================= Data ====================================\r
+\r
+char outmode, cmode;\r
+char fname[80];\r
+char quiet, verbose;\r
+char *strbuf;\r
+int locate=0;\r
+\r
+// -- locals --\r
+\r
+//FILE *f;\r
+//int i;\r
+//struct find_t *ft;\r
+\r
+// ================================= Code ====================================\r
+\r
+void dprint(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ if (quiet) return;\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ printf ("%s \n", string);\r
+}\r
+\r
+void vprint(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ if (!verbose) return;\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ printf ("%s \n", string);\r
+}\r
+\r
+void err(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ if (quiet)\r
+ {\r
+ FILE *efile = fopen("ERROR.TXT", "w");\r
+\r
+ fprintf(efile, "%s \n", string);\r
+ fclose(efile);\r
+ }\r
+ else\r
+ {\r
+ printf("%s \n", string);\r
+ }\r
+\r
+ remove("vcctemp.$$$");\r
+ exit(-1);\r
+}\r
+\r
+void vcerr(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ err("%s(%d) %s", source_file, lines, string);\r
+}\r
+\r
+void vcc_compile_mode_map(char *filename)\r
+{\r
+ FILE *o=0;\r
+ FILE *f=0;\r
+ char *x=0;\r
+ int z=0;\r
+\r
+ x = filename;\r
+ while ('.' != *x) ++x;\r
+ *x = 0;\r
+\r
+ CompileMAP(filename);\r
+\r
+ sprintf(strbuf, "%s.map", filename);\r
+ f = fopen(strbuf, "rb+");\r
+ if (!f)\r
+ err("unable to open %s.", strbuf);\r
+\r
+ fread(strbuf, 1, 6, f);\r
+ fread(&z, 1, 4, f);\r
+ fseek(f, 0, 0);\r
+\r
+ o = fopen("outtemp.$$$", "wb");\r
+ if (!o)\r
+ err("unable to open outtemp.$$$");\r
+ x = (char *) malloc(z);\r
+ fread(x, 1, z, f);\r
+ fwrite(x, 1, z, o);\r
+ fclose(f);\r
+\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(&functbl, 4, mfuncs, o);\r
+ mfuncs = (int) code - (int) outbuf;\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(outbuf, 1, code-outbuf, o);\r
+ fclose(o);\r
+\r
+ // remove existing map file\r
+ sprintf(strbuf,"%s.map", filename); remove(strbuf);\r
+ // rename temp file to map file name\r
+ rename("outtemp.$$$", strbuf);\r
+}\r
+\r
+void vcc_compile_mode_system()\r
+{\r
+ FILE *dump=0;\r
+\r
+ CompileSystem();\r
+\r
+ dump = fopen("system.vcs", "wb");\r
+ if (!dump) err("unable to open system.vcs");\r
+\r
+ fwrite(&numfuncs, 1, 4, dump);\r
+ fwrite(&curstartofs, 1, 4, dump);\r
+ fwrite(&sstartofs, 1, 4, dump);\r
+ fwrite(outbuf, 1, code-outbuf, dump);\r
+ fputc(255, dump);\r
+\r
+ fclose(dump);\r
+}\r
+\r
+void vcc_compile_mode_all()\r
+{\r
+ FILE *o=0;\r
+ FILE *f=0;\r
+ char *x=0;\r
+ int z=0;\r
+ struct find_t fileinfo;\r
+\r
+ CompileSystem();\r
+ f=fopen("system.vcs","wb");\r
+ fwrite(&numfuncs, 1, 4, f);\r
+ fwrite(&curstartofs, 1, 4, f);\r
+ fwrite(&sstartofs, 1, 4, f);\r
+ fwrite(outbuf, 1, code-outbuf, f);\r
+ fputc(255, f);\r
+ fclose(f);\r
+ free(source);\r
+ free(outbuf);\r
+\r
+ if (_dos_findfirst("*.MAP", _A_NORMAL, &fileinfo))\r
+ err("No mapfiles found.");\r
+\r
+ while (1)\r
+ {\r
+ int i;\r
+ memcpy(fname, fileinfo.name, 13);\r
+\r
+ i=0;\r
+ while (fname[i]!='.') i++;\r
+ fname[i]=0;\r
+\r
+ strlwr(fname);\r
+ mfuncs=0;\r
+\r
+ CompileMAP(fname);\r
+\r
+ sprintf(strbuf,"%s.map", fname);\r
+ f=fopen(strbuf,"rb+");\r
+ fread(strbuf, 1, 6, f);\r
+ fread(&z, 1, 4, f);\r
+ fseek(f, 0, 0);\r
+\r
+ o=fopen("outtemp.$$$","wb");\r
+ x=(char *) malloc(z);\r
+ fread(x, 1, z, f);\r
+ fwrite(x, 1, z, o);\r
+ fclose(f);\r
+ free(x);\r
+\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(&functbl, 4, mfuncs, o);\r
+ mfuncs=(int) code - (int) outbuf;\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(outbuf, 1, code-outbuf, o);\r
+ fclose(o);\r
+\r
+ sprintf(strbuf,"%s.map", fname);\r
+ remove(strbuf);\r
+ rename("outtemp.$$$",strbuf);\r
+\r
+ free(source);\r
+ free(outbuf);\r
+\r
+ if (!_dos_findnext(&fileinfo))\r
+ continue;\r
+\r
+ break;\r
+ }\r
+\r
+ dprint("%i total VC lines compiled.", tlines);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ int loop = 0;\r
+ char c = 0;\r
+ char *argstr = 0;\r
+\r
+ strbuf= (char *) malloc(2000);\r
+\r
+ cmode = 0;\r
+ pp_dump = 0;\r
+ pp_nomark = 0;\r
+\r
+ for (loop = 1; loop < argc; loop++)\r
+ {\r
+ // point to argument string\r
+ argstr = &loop[argv][0];\r
+\r
+ c = *argstr;\r
+ // skip leading punctuators, if any\r
+ if ('-' == c || '+' == c || '/' == c)\r
+ ++argstr;\r
+\r
+ if (!stricmp(argstr, "v"))\r
+ { verbose = 1; continue; }\r
+\r
+ if (!stricmp(argstr, "q"))\r
+ { quiet = 1; continue; }\r
+\r
+ // compile SYSTEM.VC only\r
+ if (!stricmp(argstr, "system"))\r
+ { cmode = 2; continue; }\r
+\r
+ // compile all available .VC files\r
+ if (!stricmp(argstr, "all"))\r
+ { cmode = 3; continue; }\r
+\r
+ // disable line/#include markers\r
+ if (!stricmp(argstr, "ppnomark"))\r
+ { pp_nomark = 1; continue; }\r
+\r
+ // dump preprocessor output to temp files\r
+ if (!stricmp(argstr, "ppdump"))\r
+ { pp_dump = 1; continue; }\r
+\r
+ // debug locator option\r
+ if ('.' == *argstr)\r
+ { locate = atoi(argstr+1); continue; }\r
+\r
+ // at this point, the argument is assumed to be a file\r
+\r
+ if (strlen(argstr) > 79)\r
+ { printf("filename '%s' too long!", argstr); argstr[79] = 0; }\r
+ memcpy(fname, argstr, strlen(argstr)+1);\r
+\r
+ cmode = 1;\r
+ continue;\r
+ }\r
+\r
+ dprint("vcc v.%s Copyright (C)1998 Benjamin Eirich. All rights reserved.", VERSION);\r
+ vprint("%s build %s on %s %s", BUILD_TAG, __FILE__, __DATE__, __TIME__);\r
+\r
+ if (!cmode)\r
+ err("No input files.");\r
+\r
+ InitCompileSystem();\r
+\r
+ switch (cmode)\r
+ {\r
+ case 1: vcc_compile_mode_map(fname); break;\r
+ case 2: vcc_compile_mode_system(); break;\r
+ case 3: vcc_compile_mode_all(); break;\r
+\r
+ default: err("you have now entered the twilight zone.");\r
+ }\r
+\r
+ remove("vcctemp.$$$");\r
+ remove("ERROR.TXT");\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__VCC_INC)\r
+#define __VCC_INC\r
+\r
+#define QUIET 0\r
+#define DEFAULT 1\r
+#define VERBOSE 2\r
+\r
+#define CONTROL 1\r
+#define DIGIT 2\r
+#define IDENTIFIER 3\r
+#define RESERVED 4\r
+#define FUNCTION 5\r
+\r
+extern char *strbuf;\r
+extern int locate;\r
+\r
+extern void err(char *message, ...);\r
+extern void vcerr(char *message, ...);\r
+extern void dprint(char *message, ...);\r
+extern void vprint(char *message, ...);\r
+\r
+#endif // __VCC_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// We never use zero as a tag. This makes it easier to track down misbehaving\r
+// VC code, since zero is commonly come-by when going off into uncharted\r
+// depths of memory.\r
+\r
+#define ERROR 0\r
+\r
+// Opcode values.\r
+\r
+#define opEXEC_STDLIB 1\r
+#define opEXEC_LOCALFUNC 2\r
+#define opEXEC_EXTERNFUNC 3\r
+#define opIF 4\r
+#define opELSE 5\r
+#define opGOTO 6\r
+#define opSWITCH 7\r
+#define opCASE 8\r
+#define opRETURN 9\r
+#define opASSIGN 10\r
+#define opSETRETVAL 11\r
+#define opSETLOCALSTACK 12\r
+\r
+// Operand types.\r
+\r
+#define op_IMMEDIATE 1\r
+#define op_HVAR0 2\r
+#define op_HVAR1 3\r
+#define op_UVAR 4\r
+#define op_UVARRAY 5\r
+#define op_LVAR 6\r
+#define op_BFUNC 7\r
+#define op_UFUNC 8\r
+#define op_GROUP 9\r
+#define op_STRING 10\r
+#define op_SARRAY 11\r
+#define op_SLOCAL 12\r
+\r
+// Variable types.\r
+\r
+#define v_IMMEDIATE 1 // is this necessary?\r
+#define v_CHAR 2\r
+#define v_PTR 3\r
+#define v_INT 4\r
+\r
+// IF relational operators.\r
+\r
+#define i_ZERO 1\r
+#define i_NONZERO 2\r
+#define i_EQUALTO 3\r
+#define i_NOTEQUAL 4\r
+#define i_GREATERTHAN 5\r
+#define i_LESSTHAN 6\r
+#define i_GREATERTHANOREQUAL 7\r
+#define i_LESSTHANOREQUAL 8\r
+#define i_GROUP 9\r
+#define i_UNGROUP 10\r
+#define i_AND 11\r
+#define i_OR 12\r
+\r
+// Assignment operators.\r
+\r
+#define a_SET 1\r
+#define a_INC 2\r
+#define a_DEC 3\r
+#define a_INCSET 4\r
+#define a_DECSET 5\r
+#define a_MULTSET 6\r
+#define a_DIVSET 7\r
+\r
+// Operand combination operators.\r
+\r
+#define op_ADD 1\r
+#define op_SUB 2\r
+#define op_MULT 3\r
+#define op_DIV 4\r
+#define op_MOD 5\r
+#define op_SHL 6\r
+#define op_SHR 7\r
+#define op_AND 8\r
+#define op_OR 9\r
+#define op_XOR 10\r
+#define op_END 11\r
+\r
+// String components\r
+\r
+#define s_IMMEDIATE 1\r
+#define s_GLOBAL 2\r
+#define s_ARRAY 3\r
+#define s_NUMSTR 4\r
+#define s_LEFT 5\r
+#define s_RIGHT 6\r
+#define s_MID 7\r
+#define s_LOCAL 8\r
+#define s_ADD 9\r
+#define s_CHR 10\r
+#define s_END 11\r
--- /dev/null
+GNU GENERAL PUBLIC LICENSE\r
+Version 2, June 1991 \r
+\r
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. \r
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\r
+\r
+Everyone is permitted to copy and distribute verbatim copies\r
+of this license document, but changing it is not allowed.\r
+Preamble\r
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. \r
+\r
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. \r
+\r
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. \r
+\r
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. \r
+\r
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. \r
+\r
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. \r
+\r
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. \r
+\r
+The precise terms and conditions for copying, distribution and modification follow. \r
+\r
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". \r
+\r
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. \r
+\r
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. \r
+\r
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. \r
+\r
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: \r
+\r
+\r
+a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \r
+\r
+b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. \r
+\r
+c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) \r
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. \r
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. \r
+\r
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. \r
+\r
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: \r
+\r
+a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \r
+\r
+b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \r
+\r
+c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) \r
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. \r
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. \r
+\r
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \r
+\r
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. \r
+\r
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. \r
+\r
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. \r
+\r
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. \r
+\r
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. \r
+\r
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \r
+\r
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. \r
+\r
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. \r
+\r
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. \r
+\r
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. \r
+\r
+NO WARRANTY\r
+\r
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \r
+\r
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \r
+\r
+\r
+END OF TERMS AND CONDITIONS\r
--- /dev/null
+/*\r
+ * $Id: audio.h 1.17 1996/09/25 17:13:02 chasan released $\r
+ *\r
+ * SEAL Synthetic Audio Library API Interface\r
+ *\r
+ * Copyright (C) 1995, 1996 Carlos Hasan. All Rights Reserved.\r
+ *\r
+ */\r
+\r
+#ifndef __AUDIO_H\r
+#define __AUDIO_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifndef WIN32\r
+#define AIAPI\r
+#else\r
+#define AIAPI __stdcall\r
+#endif\r
+\r
+#ifndef WINAPI\r
+\r
+/* atomic data types definitions */\r
+typedef void VOID;\r
+typedef char CHAR;\r
+typedef int INT;\r
+typedef long LONG;\r
+typedef int BOOL;\r
+\r
+typedef unsigned char BYTE;\r
+typedef unsigned short WORD;\r
+typedef unsigned int UINT;\r
+typedef unsigned long DWORD;\r
+\r
+typedef VOID* LPVOID;\r
+typedef CHAR* LPCHAR;\r
+typedef INT* LPINT;\r
+typedef LONG* LPLONG;\r
+typedef BOOL* LPBOOL;\r
+typedef BYTE* LPBYTE;\r
+typedef WORD* LPWORD;\r
+typedef UINT* LPUINT;\r
+typedef DWORD* LPDWORD;\r
+typedef CHAR* LPSTR;\r
+typedef DWORD HANDLE;\r
+\r
+/* helper macros */\r
+#define LOBYTE(s) ((BYTE)(s))\r
+#define HIBYTE(s) ((BYTE)((WORD)(s)>>8))\r
+#define LOWORD(l) ((WORD)(l))\r
+#define HIWORD(l) ((WORD)((DWORD)(l)>>16))\r
+#define MAKEWORD(l,h) ((WORD)(((BYTE)(l))|(((WORD)((BYTE)(h)))<<8)))\r
+#define MAKELONG(l,h) ((DWORD)(((WORD)(l))|(((DWORD)((WORD)(h)))<<16)))\r
+\r
+#endif\r
+\r
+\r
+/* audio system version number */\r
+#define AUDIO_SYSTEM_VERSION 0x0101\r
+\r
+/* audio capabilities bit fields definitions */\r
+#define AUDIO_FORMAT_1M08 0x00000001\r
+#define AUDIO_FORMAT_1S08 0x00000002\r
+#define AUDIO_FORMAT_1M16 0x00000004\r
+#define AUDIO_FORMAT_1S16 0x00000008\r
+#define AUDIO_FORMAT_2M08 0x00000010\r
+#define AUDIO_FORMAT_2S08 0x00000020\r
+#define AUDIO_FORMAT_2M16 0x00000040\r
+#define AUDIO_FORMAT_2S16 0x00000080\r
+#define AUDIO_FORMAT_4M08 0x00000100\r
+#define AUDIO_FORMAT_4S08 0x00000200\r
+#define AUDIO_FORMAT_4M16 0x00000400\r
+#define AUDIO_FORMAT_4S16 0x00000800\r
+\r
+/* audio format bit fields defines for devices and waveforms */\r
+#define AUDIO_FORMAT_8BITS 0x0000\r
+#define AUDIO_FORMAT_16BITS 0x0001\r
+#define AUDIO_FORMAT_LOOP 0x0010\r
+#define AUDIO_FORMAT_BIDILOOP 0x0020\r
+#define AUDIO_FORMAT_REVERSE 0x0080\r
+#define AUDIO_FORMAT_MONO 0x0000\r
+#define AUDIO_FORMAT_STEREO 0x0100\r
+#define AUDIO_FORMAT_FILTER 0x8000\r
+\r
+/* audio resource limits defines */\r
+#define AUDIO_MAX_VOICES 32\r
+#define AUDIO_MAX_SAMPLES 16\r
+#define AUDIO_MAX_PATCHES 128\r
+#define AUDIO_MAX_PATTERNS 256\r
+#define AUDIO_MAX_ORDERS 256\r
+#define AUDIO_MAX_NOTES 96\r
+#define AUDIO_MAX_POINTS 12\r
+#define AUDIO_MIN_PERIOD 1\r
+#define AUDIO_MAX_PERIOD 31999\r
+#define AUDIO_MIN_VOLUME 0x00\r
+#define AUDIO_MAX_VOLUME 0x40\r
+#define AUDIO_MIN_PANNING 0x00\r
+#define AUDIO_MAX_PANNING 0xFF\r
+#define AUDIO_MIN_POSITION 0x00000000L\r
+#define AUDIO_MAX_POSITION 0x00100000L\r
+#define AUDIO_MIN_FREQUENCY 0x00000200L\r
+#define AUDIO_MAX_FREQUENCY 0x00080000L\r
+\r
+/* audio error code defines */\r
+#define AUDIO_ERROR_NONE 0x0000\r
+#define AUDIO_ERROR_INVALHANDLE 0x0001\r
+#define AUDIO_ERROR_INVALPARAM 0x0002\r
+#define AUDIO_ERROR_NOTSUPPORTED 0x0003\r
+#define AUDIO_ERROR_BADDEVICEID 0x0004\r
+#define AUDIO_ERROR_NODEVICE 0x0005\r
+#define AUDIO_ERROR_DEVICEBUSY 0x0006\r
+#define AUDIO_ERROR_BADFORMAT 0x0007\r
+#define AUDIO_ERROR_NOMEMORY 0x0008\r
+#define AUDIO_ERROR_NODRAMMEMORY 0x0009\r
+#define AUDIO_ERROR_FILENOTFOUND 0x000A\r
+#define AUDIO_ERROR_BADFILEFORMAT 0x000B\r
+#define AUDIO_LAST_ERROR 0x000B\r
+\r
+/* audio device identifiers */\r
+#define AUDIO_DEVICE_NONE 0x0000\r
+#define AUDIO_DEVICE_MAPPER 0xFFFF\r
+\r
+/* audio product identifiers */\r
+#define AUDIO_PRODUCT_NONE 0x0000\r
+#define AUDIO_PRODUCT_SB 0x0001\r
+#define AUDIO_PRODUCT_SB15 0x0002\r
+#define AUDIO_PRODUCT_SB20 0x0003\r
+#define AUDIO_PRODUCT_SBPRO 0x0004\r
+#define AUDIO_PRODUCT_SB16 0x0005\r
+#define AUDIO_PRODUCT_AWE32 0x0006\r
+#define AUDIO_PRODUCT_WSS 0x0007\r
+#define AUDIO_PRODUCT_ESS 0x0008\r
+#define AUDIO_PRODUCT_GUS 0x0009\r
+#define AUDIO_PRODUCT_GUSDB 0x000A\r
+#define AUDIO_PRODUCT_GUSMAX 0x000B\r
+#define AUDIO_PRODUCT_IWAVE 0x000C\r
+#define AUDIO_PRODUCT_PAS 0x000D\r
+#define AUDIO_PRODUCT_PAS16 0x000E\r
+#define AUDIO_PRODUCT_ARIA 0x000F\r
+#define AUDIO_PRODUCT_WINDOWS 0x0100\r
+#define AUDIO_PRODUCT_LINUX 0x0101\r
+#define AUDIO_PRODUCT_SPARC 0x0102\r
+#define AUDIO_PRODUCT_SGI 0x0103\r
+#define AUDIO_PRODUCT_DSOUND 0x0104\r
+\r
+/* audio envelope bit fields */\r
+#define AUDIO_ENVELOPE_ON 0x0001\r
+#define AUDIO_ENVELOPE_SUSTAIN 0x0002\r
+#define AUDIO_ENVELOPE_LOOP 0x0004\r
+\r
+/* audio pattern bit fields */\r
+#define AUDIO_PATTERN_PACKED 0x0080\r
+#define AUDIO_PATTERN_NOTE 0x0001\r
+#define AUDIO_PATTERN_SAMPLE 0x0002\r
+#define AUDIO_PATTERN_VOLUME 0x0004\r
+#define AUDIO_PATTERN_COMMAND 0x0008\r
+#define AUDIO_PATTERN_PARAMS 0x0010\r
+\r
+/* audio module bit fields */\r
+#define AUDIO_MODULE_AMIGA 0x0000\r
+#define AUDIO_MODULE_LINEAR 0x0001\r
+#define AUDIO_MODULE_PANNING 0x8000\r
+\r
+#pragma pack(1)\r
+\r
+/* audio capabilities structure */\r
+typedef struct {\r
+ WORD wProductId; /* product identifier */\r
+ CHAR szProductName[30]; /* product name */\r
+ DWORD dwFormats; /* formats supported */\r
+} AUDIOCAPS, *LPAUDIOCAPS;\r
+\r
+/* audio format structure */\r
+typedef struct {\r
+ UINT nDeviceId; /* device identifier */\r
+ WORD wFormat; /* playback format */\r
+ WORD nSampleRate; /* sampling frequency */\r
+} AUDIOINFO, *LPAUDIOINFO;\r
+\r
+/* audio waveform structure */\r
+typedef struct {\r
+ LPBYTE lpData; /* data pointer */\r
+ DWORD dwHandle; /* waveform handle */\r
+ DWORD dwLength; /* waveform length */\r
+ DWORD dwLoopStart; /* loop start point */\r
+ DWORD dwLoopEnd; /* loop end point */\r
+ WORD nSampleRate; /* sampling rate */\r
+ WORD wFormat; /* format bits */\r
+} AUDIOWAVE, *LPAUDIOWAVE;\r
+\r
+\r
+/* audio envelope point structure */\r
+typedef struct {\r
+ WORD nFrame; /* envelope frame */\r
+ WORD nValue; /* envelope value */\r
+} AUDIOPOINT, *LPAUDIOPOINT;\r
+\r
+/* audio envelope structure */\r
+typedef struct {\r
+ AUDIOPOINT aEnvelope[AUDIO_MAX_POINTS]; /* envelope points */\r
+ BYTE nPoints; /* number of points */\r
+ BYTE nSustain; /* sustain point */\r
+ BYTE nLoopStart; /* loop start point */\r
+ BYTE nLoopEnd; /* loop end point */\r
+ WORD wFlags; /* envelope flags */\r
+ WORD nSpeed; /* envelope speed */\r
+} AUDIOENVELOPE, *LPAUDIOENVELOPE;\r
+\r
+/* audio sample structure */\r
+typedef struct {\r
+ CHAR szSampleName[32]; /* sample name */\r
+ BYTE nVolume; /* default volume */\r
+ BYTE nPanning; /* default panning */\r
+ BYTE nRelativeNote; /* relative note */\r
+ BYTE nFinetune; /* finetune */\r
+ AUDIOWAVE Wave; /* waveform handle */\r
+} AUDIOSAMPLE, *LPAUDIOSAMPLE;\r
+\r
+/* audio patch structure */\r
+typedef struct {\r
+ CHAR szPatchName[32]; /* patch name */\r
+ BYTE aSampleNumber[AUDIO_MAX_NOTES]; /* multi-sample table */\r
+ WORD nSamples; /* number of samples */\r
+ BYTE nVibratoType; /* vibrato type */\r
+ BYTE nVibratoSweep; /* vibrato sweep */\r
+ BYTE nVibratoDepth; /* vibrato depth */\r
+ BYTE nVibratoRate; /* vibrato rate */\r
+ WORD nVolumeFadeout; /* volume fadeout */\r
+ AUDIOENVELOPE Volume; /* volume envelope */\r
+ AUDIOENVELOPE Panning; /* panning envelope */\r
+ LPAUDIOSAMPLE aSampleTable; /* sample table */\r
+} AUDIOPATCH, *LPAUDIOPATCH;\r
+\r
+/* audio pattern structure */\r
+typedef struct {\r
+ WORD nPacking; /* packing type */\r
+ WORD nTracks; /* number of tracks */\r
+ WORD nRows; /* number of rows */\r
+ WORD nSize; /* data size */\r
+ LPBYTE lpData; /* data pointer */\r
+} AUDIOPATTERN, *LPAUDIOPATTERN;\r
+\r
+/* audio module structure */\r
+typedef struct {\r
+ CHAR szModuleName[32]; /* module name */\r
+ WORD wFlags; /* module flags */\r
+ WORD nOrders; /* number of orders */\r
+ WORD nRestart; /* restart position */\r
+ WORD nTracks; /* number of tracks */\r
+ WORD nPatterns; /* number of patterns */\r
+ WORD nPatches; /* number of patches */\r
+ WORD nTempo; /* initial tempo */\r
+ WORD nBPM; /* initial BPM */\r
+ BYTE aOrderTable[AUDIO_MAX_ORDERS]; /* order table */\r
+ BYTE aPanningTable[AUDIO_MAX_VOICES]; /* panning table */\r
+ LPAUDIOPATTERN aPatternTable; /* pattern table */\r
+ LPAUDIOPATCH aPatchTable; /* patch table */\r
+} AUDIOMODULE, *LPAUDIOMODULE;\r
+\r
+/* audio callback function defines */\r
+typedef VOID (AIAPI* LPFNAUDIOWAVE)(LPBYTE, UINT);\r
+typedef VOID (AIAPI* LPFNAUDIOTIMER)(VOID);\r
+typedef VOID (AIAPI* LPFNAUDIOCALLBACK)(BYTE, UINT, UINT);\r
+\r
+/* audio handle defines */\r
+typedef HANDLE HAC;\r
+typedef HAC* LPHAC;\r
+\r
+#pragma pack()\r
+\r
+\r
+/* audio interface API prototypes */\r
+UINT AIAPI AInitialize(VOID);\r
+UINT AIAPI AGetVersion(VOID);\r
+UINT AIAPI AGetAudioNumDevs(VOID);\r
+UINT AIAPI AGetAudioDevCaps(UINT nDeviceId, LPAUDIOCAPS lpCaps);\r
+UINT AIAPI AGetErrorText(UINT nErrorCode, LPSTR lpText, UINT nSize);\r
+\r
+UINT AIAPI APingAudio(LPUINT lpnDeviceId);\r
+UINT AIAPI AOpenAudio(LPAUDIOINFO lpInfo);\r
+UINT AIAPI ACloseAudio(VOID);\r
+UINT AIAPI AUpdateAudio(VOID);\r
+\r
+UINT AIAPI AOpenVoices(UINT nVoices);\r
+UINT AIAPI ACloseVoices(VOID);\r
+\r
+UINT AIAPI ASetAudioCallback(LPFNAUDIOWAVE lpfnAudioWave);\r
+UINT AIAPI ASetAudioTimerProc(LPFNAUDIOTIMER lpfnAudioTimer);\r
+UINT AIAPI ASetAudioTimerRate(UINT nTimerRate);\r
+\r
+LONG AIAPI AGetAudioDataAvail(VOID);\r
+UINT AIAPI ACreateAudioData(LPAUDIOWAVE lpWave);\r
+UINT AIAPI ADestroyAudioData(LPAUDIOWAVE lpWave);\r
+UINT AIAPI AWriteAudioData(LPAUDIOWAVE lpWave, DWORD dwOffset, UINT nCount);\r
+\r
+UINT AIAPI ACreateAudioVoice(LPHAC lphVoice);\r
+UINT AIAPI ADestroyAudioVoice(HAC hVoice);\r
+\r
+UINT AIAPI APlayVoice(HAC hVoice, LPAUDIOWAVE lpWave);\r
+UINT AIAPI APrimeVoice(HAC hVoice, LPAUDIOWAVE lpWave);\r
+UINT AIAPI AStartVoice(HAC hVoice);\r
+UINT AIAPI AStopVoice(HAC hVoice);\r
+\r
+UINT AIAPI ASetVoicePosition(HAC hVoice, LONG dwPosition);\r
+UINT AIAPI ASetVoiceFrequency(HAC hVoice, LONG dwFrequency);\r
+UINT AIAPI ASetVoiceVolume(HAC hVoice, UINT nVolume);\r
+UINT AIAPI ASetVoicePanning(HAC hVoice, UINT nPanning);\r
+\r
+UINT AIAPI AGetVoicePosition(HAC hVoice, LPLONG lpdwPosition);\r
+UINT AIAPI AGetVoiceFrequency(HAC hVoice, LPLONG lpdwFrequency);\r
+UINT AIAPI AGetVoiceVolume(HAC hVoice, LPUINT lpnVolume);\r
+UINT AIAPI AGetVoicePanning(HAC hVoice, LPUINT lpnPanning);\r
+UINT AIAPI AGetVoiceStatus(HAC hVoice, LPBOOL lpnStatus);\r
+\r
+UINT AIAPI APlayModule(LPAUDIOMODULE lpModule);\r
+UINT AIAPI AStopModule(VOID);\r
+UINT AIAPI APauseModule(VOID);\r
+UINT AIAPI AResumeModule(VOID);\r
+UINT AIAPI ASetModuleVolume(UINT nVolume);\r
+UINT AIAPI ASetModulePosition(UINT nOrder, UINT nRow);\r
+UINT AIAPI AGetModuleVolume(LPUINT lpnVolume);\r
+UINT AIAPI AGetModulePosition(LPUINT pnOrder, LPUINT lpnRow);\r
+UINT AIAPI AGetModuleStatus(LPBOOL lpnStatus);\r
+UINT AIAPI ASetModuleCallback(LPFNAUDIOCALLBACK lpfnAudioCallback);\r
+\r
+UINT AIAPI ALoadModuleFile(LPSTR lpszFileName,\r
+ LPAUDIOMODULE* lplpModule, DWORD dwFileOffset);\r
+UINT AIAPI AFreeModuleFile(LPAUDIOMODULE lpModule);\r
+\r
+UINT AIAPI ALoadWaveFile(LPSTR lpszFileName,\r
+ LPAUDIOWAVE* lplpWave, DWORD dwFileOffset);\r
+UINT AIAPI AFreeWaveFile(LPAUDIOWAVE lpWave);\r
+\r
+#ifdef __cplusplus\r
+};\r
+#endif\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+#include "verge.h"\r
+\r
+// *****\r
+// TODO: Move the chunk list from an array to a linked list?\r
+// Would eliminate hardcoded chunk limit, but would make\r
+// general operation slower. Probably not The Right Thing,\r
+// sides the chunk limit can be interesting sometimes. If\r
+// it becomes problematic, consider a Binary Tree.\r
+// *****\r
+\r
+// ***************************** Data *****************************\r
+\r
+#define MAXCHUNKS 1000\r
+#define PARANOID\r
+#define PADFILLVALUE 254\r
+#define PADSIZE 256\r
+\r
+typedef struct\r
+{\r
+ void *pointer;\r
+ int size;\r
+ int owner;\r
+ char desc[40];\r
+} memblockType;\r
+\r
+memblockType chunks[MAXCHUNKS+1];\r
+int numchunks=0;\r
+\r
+// ***************************** Code *****************************\r
+\r
+void *valloc(int amount, char *desc, int owner)\r
+{\r
+ if (numchunks == MAXCHUNKS)\r
+ err("Failed allocated %d bytes (%s), reason: Out of chunks.",\r
+ amount, desc);\r
+\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ chunks[numchunks].pointer = (void *) ((int) malloc(amount + (PADSIZE * 2)) + PADSIZE);\r
+ chunks[numchunks].size = amount;\r
+ memset((char *) chunks[numchunks].pointer - PADSIZE, PADFILLVALUE, PADSIZE);\r
+ memset((char *) chunks[numchunks].pointer +\r
+ chunks[numchunks].size, PADFILLVALUE, PADSIZE);\r
+#else\r
+ chunks[numchunks].pointer = malloc(amount);\r
+ chunks[numchunks].size = amount;\r
+#endif\r
+ chunks[numchunks].owner = owner;\r
+ strncpy(chunks[numchunks].desc, desc, 39);\r
+ return chunks[numchunks++].pointer;\r
+}\r
+\r
+void *qvalloc(int amount)\r
+{\r
+ void *ptr;\r
+\r
+ // Quick and dirty memory allocation. Should be used ONLY\r
+ // for temporary blocks in speed-critical loops.\r
+\r
+ ptr = malloc(amount);\r
+ if (!ptr) err("qvalloc: Failed allocating %d bytes.", amount);\r
+ return ptr;\r
+}\r
+\r
+void qvfree(void *ptr)\r
+{\r
+ free(ptr);\r
+}\r
+\r
+int TotalBytesAllocated(void)\r
+{\r
+ int i, tally=0;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ tally += chunks[i].size;\r
+\r
+ return tally;\r
+}\r
+\r
+int FindChunk(void *pointer)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].pointer == pointer) return i;\r
+ return -1;\r
+}\r
+\r
+void FreeChunk(int i)\r
+{\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ free((void *) ((int) chunks[i].pointer - PADSIZE));\r
+#else\r
+ free(chunks[i].pointer);\r
+#endif\r
+ for (; i<numchunks; i++)\r
+ chunks[i]=chunks[i+1];\r
+ numchunks--;\r
+}\r
+\r
+int v_free(void *ptr)\r
+{\r
+ int i=FindChunk(ptr);\r
+ if (i == -1)\r
+ {\r
+ Log("vfree: Attempted to free ptr %u that was not allocated. [dumping mem report]", ptr);\r
+ MemReport();\r
+ return -1;\r
+ }\r
+ FreeChunk(i);\r
+\r
+ return 0;\r
+}\r
+\r
+void FreeByOwner(int owner)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].owner == owner)\r
+ FreeChunk(i--);\r
+}\r
+\r
+void MemReport(void)\r
+{\r
+ int i;\r
+\r
+ Log("");\r
+ Log("========================================");\r
+ Log("= Memory usage report for this session =");\r
+ Log("========================================");\r
+ Log("Chunks currently allocated: %d (MAXCHUNKS %d)", numchunks, MAXCHUNKS);\r
+ Log("%d total bytes allocated. ", TotalBytesAllocated());\r
+#ifdef PARANOID\r
+ Log("PARANOID is ON. (pad size: %d pad value: %d)", PADSIZE, PADFILLVALUE);\r
+#else\r
+ Log("PARANOID is OFF.");\r
+#endif\r
+ Log("");\r
+ Log("Per-chunk analysis: ");\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ Log("[%3d] Ptr at: %8u size: %8d owner: %3d desc: %s",\r
+ i, chunks[i].pointer, chunks[i].size, chunks[i].owner, chunks[i].desc);\r
+ }\r
+}\r
+\r
+#ifdef PARANOID\r
+int ChunkIntegrity(int i)\r
+{\r
+ char *tptr;\r
+\r
+ tptr=(char *) malloc(PADSIZE);\r
+ memset(tptr, PADFILLVALUE, PADSIZE);\r
+ if (memcmp((char *) chunks[i].pointer - PADSIZE, tptr, PADSIZE))\r
+ return -1; // Prefix corruption\r
+ if (memcmp((char *) chunks[i].pointer + chunks[i].size, tptr, PADSIZE))\r
+ return 1; // Suffix corruption\r
+ free(tptr);\r
+ return 0; // no corruption\r
+}\r
+\r
+void CheckCorruption(void)\r
+{\r
+ int i, j;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ j=ChunkIntegrity(i);\r
+ if (!j) continue;\r
+ if (j == -1) { MemReport(); err("Prefix corruption on chunk %d.", i); }\r
+ if (j == 1) { MemReport(); err("Suffix corruption on chunk %d.", i); }\r
+ }\r
+}\r
+#else\r
+void CheckCorruption(void)\r
+{\r
+ return;\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MEMORY_H\r
+#define MEMORY_H\r
+\r
+extern void *valloc(int amount, char *desc, int owner);\r
+extern void *qvalloc(int amount);\r
+extern void qvfree(void *ptr);\r
+extern int TotalBytesAllocated(void);\r
+extern int FindChunk(void *pointer);\r
+extern void FreeChunk(int i);\r
+extern int vfree(void *pointer);\r
+extern void FreeByOwner(int owner);\r
+extern void MemReport(void);\r
+extern int ChunkIntegrity(int i);\r
+extern void CheckCorruption(void);\r
+\r
+// Standardized OID (Owner ID) values\r
+\r
+#define OID_TEMP 0\r
+#define OID_VFILE 1\r
+#define OID_IMAGE 2\r
+#define OID_MISC 3\r
+#define OID_MAP 4\r
+#define OID_VC 5\r
+\r
+#endif // MEMORY_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+byte cpu_watch, cpubyte=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void ListMounts()\r
+{ int i;\r
+\r
+ Con_NextLine();\r
+ sprintf(strbuf,"There are \81%d~ files mounted.",filesmounted);\r
+ Con_Printf(strbuf);\r
+ for (i=0; i<filesmounted; i++)\r
+ {\r
+ sprintf(strbuf,"File \80%s~ contains \81%d~ files.",pack[i].mountname, pack[i].numfiles);\r
+ Con_Printf(strbuf);\r
+ }\r
+}\r
+\r
+void PackInfo()\r
+{ int i,j;\r
+\r
+ Con_NextLine();\r
+ i=atoi((char *) args[1]);\r
+ sprintf(strbuf,"Files in %s:",pack[i].mountname);\r
+ Con_Printf(strbuf);\r
+\r
+ for (j=0; j<pack[i].numfiles; j++)\r
+ {\r
+ sprintf(strbuf,"\80%s~ ",pack[i].files[j].fname);\r
+ sprintf(&strbuf[20],"\81%d~ bytes",pack[i].files[j].size);\r
+ Con_Printf(strbuf);\r
+ }\r
+}\r
+\r
+void FileInfo()\r
+{ VFILE *f;\r
+\r
+ Con_NextLine();\r
+ sprintf(strbuf,"File stats for \80%s~:",args[1]);\r
+ Con_Printf(strbuf);\r
+\r
+ f=vopen((char *) args[1]);\r
+ if (!f)\r
+ {\r
+ Con_Printf("File not found.");\r
+ return;\r
+ }\r
+\r
+ if (f->s)\r
+ {\r
+ sprintf(strbuf,"File is in \80%s~, index \81%d~",pack[f->v].mountname, f->i);\r
+ Con_Printf(strbuf);\r
+ sprintf(strbuf,"Packofs: \81%d~ current ofs: \81%d~",pack[f->v].files[f->i].packofs,pack[f->v].files[f->i].curofs);\r
+ Con_Printf(strbuf);\r
+ if (pack[f->v].files[f->i].extractable)\r
+ Con_Printf("File is extractable.");\r
+ else Con_Printf("File is not extractable.");\r
+ if (pack[f->v].files[f->i].override)\r
+ Con_Printf("Override allowed.");\r
+ else Con_Printf("Override not allowed.");\r
+ }\r
+ else Con_Printf("File is external.");\r
+ sprintf(strbuf,"File is \81%d~ bytes.",filesize(f));\r
+ Con_Printf(strbuf);\r
+ vclose(f);\r
+}\r
+\r
+void vid_mode()\r
+{ int xres,yres;\r
+\r
+ xres=atoi((char *)args[1]);\r
+ yres=atoi((char *)args[2]);\r
+ Con_NextLine();\r
+\r
+ ShutdownVideo(0);\r
+ if (InitVideo(xres, yres))\r
+ {\r
+ Con_Printf("{||||||||||||}");\r
+ Con_Printf("Loading new video driver...");\r
+ Con_Printf(DriverDesc);\r
+ Con_Printf("{||||||||||||}");\r
+ }\r
+ else Con_Printf("Unsupported/unknown video mode.");\r
+ set_intensity(63);\r
+}\r
+\r
+void CPU_Usage()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"cpu_usage is \81%d~", cpu_watch);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else cpu_watch=atoi((char *) args[1]);\r
+}\r
+\r
+void Mount()\r
+{\r
+ MountVFile((char *) args[1]);\r
+ sprintf(strbuf,"%s mounted.",args[1]);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void ZeroConWarp(char **args)\r
+{\r
+ player->x=atoi(args[1])*16;\r
+ player->y=atoi(args[2])*16;\r
+ player->tx=atoi(args[1]);\r
+ player->ty=atoi(args[2]);\r
+}\r
+\r
+void ZeroConBrowseTiles(void)\r
+{\r
+ int x,y,n,k=0,a=0;\r
+\r
+ while(last_pressed!=SCAN_Q)\r
+ {\r
+ ClearScreen();\r
+ UpdateControls();\r
+ CheckMessages();\r
+ if(last_pressed==SCAN_A) { if(a) a=0; else a=1; last_pressed=0; }\r
+ if(last_pressed==SCAN_DOWN&&(k+(ty-3)*(tx-3)-tx+4)<numtiles)\r
+ {\r
+ k+=tx-4;\r
+ last_pressed=0;\r
+ }\r
+ if(last_pressed==SCAN_UP&&k>0)\r
+ {\r
+ k-=tx-4;\r
+ last_pressed=0;\r
+ }\r
+ for(y=1; y<ty-2; y++)\r
+ {\r
+ for(x=1; x<tx-3; x++)\r
+ {\r
+ n=((y-1)*(tx-4)+x-1+k);\r
+ if (n<numtiles)\r
+ {\r
+ if (!a) CopyTileClip(x*16,y*16,(unsigned char*)((unsigned int)vsp+((y-1)*(tx-4)+x-1+k)*256));\r
+ else CopyTileClip(x*16,y*16,(unsigned char*)((unsigned int)vsp+tileidx[(y-1)*(tx-4)+x-1+k]*256));\r
+ }\r
+\r
+ }\r
+ GotoXY((tx-2)*16-8,y*16+5);\r
+ sprintf(strbuf,"%i",(y-1)*(tx-4)+k);\r
+ printstring(0,strbuf);\r
+ }\r
+ GotoXY(16,(ty-1)*16-8);\r
+ printstring(0,"Hit Q to quit, A to toggle anim,");\r
+ GotoXY(16,(ty-1)*16);\r
+ printstring(0,"up/down to change tiles");\r
+ ShowPage();\r
+ }\r
+}\r
+\r
+void CameraTracking()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"cameratracking is \81%d~", cameratracking);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else cameratracking=atoi((char *) args[1]);\r
+}\r
+\r
+void ZeroSetRString(char **args)\r
+{\r
+ memcpy(rstring,args[1],strlen(args[1])+1);\r
+}\r
+\r
+void ZeroGetRString(void)\r
+{\r
+ sprintf(strbuf,"Renderstring: \80%s~",rstring);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void Obstructions()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"showobs is \81%d~", showobs);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else showobs=atoi((char *) args[1]);\r
+}\r
+\r
+void MoveGranularity()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"movegranularity is \81%d~", movegranularity);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else movegranularity=atoi((char *) args[1]);\r
+}\r
+\r
+void Phantom()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"phantom is \81%d~", phantom);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else phantom=atoi((char *) args[1]);\r
+}\r
+\r
+void CurPos()\r
+{\r
+ Con_NextLine();\r
+ sprintf(strbuf,"xwc: \82%d~ ywc: \82%d~", player->x, player->y); Con_Printf(strbuf);\r
+ sprintf(strbuf,"xtc: \82%d~ ytc: \82%d~", player->x>>4, player->y>>4); Con_Printf(strbuf);\r
+}\r
+\r
+void PlayerSpeed()\r
+{\r
+ if (!player)\r
+ {\r
+ Con_Printf("No player.");\r
+ return;\r
+ }\r
+ if (numargs==1)\r
+ {\r
+ Con_NextLine();\r
+ sprintf(strbuf,"speed is is \81%d~", player->speed);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else\r
+ {\r
+ player->speed=atoi((char *) args[1]);\r
+ player->speedct=0;\r
+ }\r
+}\r
+\r
+void Player()\r
+{ int i;\r
+\r
+ i=atoi((char *) args[1]);\r
+ if (i<entities)\r
+ {\r
+ player=&entity[i];\r
+ playernum=i;\r
+// entity[i].movecode=0;\r
+ entity[i].moving=0;\r
+ SiftEntities();\r
+ Con_Printf("Player updated.");\r
+ }\r
+ else Con_Printf("No such entity.");\r
+}\r
+\r
+void SpawnEntity()\r
+{ int i;\r
+\r
+ i=AllocateEntity(atoi((char *) args[1]), atoi((char *) args[2]), (char *) args[3]);\r
+ sprintf(strbuf,"Entity %d allocated.",i);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void ShowZones()\r
+{\r
+ if (numargs==1)\r
+ {\r
+ sprintf(strbuf,"showzones is \81%d~", showzone);\r
+ Con_Printf(strbuf);\r
+ }\r
+ else showzone=atoi((char *) args[1]);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONLIB_H\r
+#define CONLIB_H\r
+\r
+#define ETC 0\r
+#define RENDER 1\r
+#define PFLIP 2\r
+\r
+extern byte cpu_watch, cpubyte;\r
+\r
+void ListMounts();\r
+void PackInfo();\r
+void FileInfo();\r
+void CD_Play();\r
+void vid_mode();\r
+void CPU_Usage();\r
+void Mount();\r
+void ZeroConWarp(char **args);\r
+void ZeroConBrowseTiles(void);\r
+void CameraTracking();\r
+void ZeroGetRString();\r
+void ZeroSetRString(char **args);\r
+void Obstructions();\r
+void MoveGranularity();\r
+void Phantom();\r
+void CurPos();\r
+void PlayerSpeed();\r
+void Player();\r
+void SpawnEntity();\r
+void ShowZones();\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define CONSOLE_H\r
+#include "verge.h"\r
+#define conwidth 40\r
+\r
+// ================================= Data ====================================\r
+\r
+byte *consolebg; // Console background image\r
+char *consoletext; // Console text buffer\r
+byte *cmd, *cmd2, cmdlen=0; // command line buffer\r
+char *lastcmds, numcmds=0, cmdpos=0; // last-command memory\r
+byte *args[10], numargs; // command argument pointers\r
+char cursor=1; // flag on/off cursor visible\r
+int cswtime=0; // cursor switch time.\r
+int conlines=1; // Number of visible lines\r
+int lines=0; // number of lines entered since last draw\r
+char startln=36; // Start display ofs (for scrollback)\r
+char allowconsole=1;\r
+char consoleoverride=0;\r
+\r
+byte key_ascii_tbl[128] =\r
+{\r
+ 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8, 9,\r
+ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 13, 0, 'a', 's',\r
+ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 39, 0, 0, 92, 'z', 'x', 'c', 'v',\r
+ 'b', 'n', 'm', ',', '.', '/', 0, '*', 0, ' ', 0, 3, 3, 3, 3, 8,\r
+ 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 0, 127, 0, 0, 92, 3, 3, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+byte key_shift_tbl[128] =\r
+{\r
+ 0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 126, 126,\r
+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 126, 0, 'A', 'S',\r
+ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', 34, 0, 0, '|', 'Z', 'X', 'C', 'V',\r
+ 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, 1, 0, 1, 1, 1, 1, 1,\r
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 1, 127, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+#define NUMCMDS 31\r
+char *concmds[] = {\r
+ "CONSOLEBG","LISTMOUNTS","PACKINFO","LISTCMDS","CD_PLAY","CD_STOP",\r
+ "CD_OPEN","CD_CLOSE","EXIT","VID_MODE","CPU_USAGE","MOUNT","MAP",\r
+ "VER","BROWSETILES","WARP","CAMERATRACKING","RSTRING","SHOWOBS",\r
+ "PHANTOM","ENTITYSTAT","ACTIVEENTS","ENTITY","CURPOS","PLAYERSPEED",\r
+ "SPEEDDEMON","RV","SV","PLAYER","SPAWNENTITY","SHOWZONES"\r
+ };\r
+byte sortedcmds[NUMCMDS];\r
+\r
+// ================================= Code ====================================\r
+\r
+void SortConCmds(void)\r
+/* -- ric: 03/Jun/98 --\r
+ * creates the sorted index into concmds\r
+ */\r
+{\r
+ int i,j;\r
+ int temp;\r
+\r
+ for (i=0; i<NUMCMDS; i++)\r
+ sortedcmds[i]=i;\r
+ for (i=1; i<NUMCMDS; i++)\r
+ {\r
+ for (j=NUMCMDS-1; j>=i; j--)\r
+ if (strcmp(concmds[sortedcmds[j-1]],concmds[sortedcmds[j]])>0)\r
+ {\r
+ // swap the indices\r
+ temp=sortedcmds[j-1];\r
+ sortedcmds[j-1]=sortedcmds[j];\r
+ sortedcmds[j]=temp;\r
+ }\r
+ }\r
+}\r
+\r
+void InitConsole(void)\r
+{\r
+ Logp("Initialize console.");\r
+ LoadFont("system.fnt");\r
+ consolebg=VLoadImageBuf("console.gif");\r
+\r
+ consoletext=(char *) valloc(45*50, "consoletext", OID_MISC);\r
+ cmd=(byte *) valloc(40, "InitConsole:cmd", OID_MISC);\r
+ cmd2=(byte *) valloc(40, "InitConsole:cmd2", OID_MISC);\r
+ memset(cmd, 0, 40);\r
+ memset(cmd2, 0, 40);\r
+ memset(consoletext, 0, 2250);\r
+\r
+ lastcmds=(char *) valloc(400, "InitConsole:lastcmds", OID_MISC);\r
+ memset(lastcmds, 0, 400);\r
+\r
+ SortConCmds();\r
+ LogDone();\r
+}\r
+\r
+void DrawConsole();\r
+\r
+void Con_Printf(char *str)\r
+{ char tbuf[2250];\r
+\r
+ // move buffer up a line\r
+ memcpy(tbuf, consoletext+50, 2200);\r
+ memcpy(consoletext, tbuf, 2200);\r
+\r
+ memcpy(consoletext+2200, str, strlen(str)+1);\r
+ lines++;\r
+}\r
+\r
+void Con_NextLine(void)\r
+{\r
+ Con_Printf("");\r
+ lines=0;\r
+}\r
+\r
+int ShowConsole(void)\r
+{\r
+ conlines+=2;\r
+ if (conlines > 120)\r
+ {\r
+ callback=0;\r
+ conlines=120;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int HideConsole(void)\r
+{\r
+ if (conlines > 3)\r
+ {\r
+ conlines-=2;\r
+ }\r
+ else\r
+ {\r
+ conlines=1;\r
+ callback=0;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void DrawConsole(void)\r
+{ int i;\r
+ int tagline=0;\r
+\r
+ lines=0;\r
+ tagline=conlines;\r
+\r
+ Render();\r
+ CopySpriteZoomClip(0,-120+tagline, 320,120, sx,120, consolebg);\r
+\r
+ // write console text\r
+\r
+ for (i=0; i<9; i++)\r
+ {\r
+ GotoXY(1, 1+(i*10)-(120-tagline));\r
+ printstring(0,consoletext+((startln+i)*50));\r
+ }\r
+\r
+ GotoXY(1,101-(120-tagline));\r
+ printstring(0,"]");\r
+ printstring(0,(char *) cmd);\r
+\r
+ if (systemtime>=cswtime)\r
+ {\r
+ cursor ^= 1;\r
+ cswtime = systemtime+40;\r
+ }\r
+\r
+ if (cursor) printstring(0, "&");\r
+\r
+ if (startln<36)\r
+ {\r
+ GotoXY(1, 91-(120-tagline));\r
+ printstring(0, "^ ^ ^ ^ ^ ^ ^ ^ ^ ^");\r
+ }\r
+}\r
+\r
+int Args(int num)\r
+{\r
+ if (numargs>=num) return 1;\r
+ sprintf(strbuf,"This function needs \81%d~ arguments.",num-1);\r
+ Con_Printf(strbuf);\r
+ return 0;\r
+}\r
+\r
+void ListCmds(void)\r
+{ int i;\r
+\r
+ Con_NextLine();\r
+ for (i=0; i<NUMCMDS; i++)\r
+ Con_Printf(concmds[sortedcmds[i]]);\r
+}\r
+\r
+void ConsoleBackground()\r
+{\r
+ vfree(consolebg);\r
+ consolebg=VLoadImageBuf((char *) args[1]);\r
+}\r
+\r
+void ExecuteCommand(int i)\r
+{\r
+ switch(i)\r
+ {\r
+ case 0: if (Args(2)) ConsoleBackground(); break;\r
+ case 1: ListMounts(); break;\r
+ case 2: if (Args(2)) PackInfo(); break;\r
+ case 3: ListCmds(); break;\r
+ case 4: break; //if (Args(2)) CD_Play(atoi((char *) args[1])); break;\r
+ case 5: break; //CD_Stop(); break;\r
+ case 6: break; //CD_Open_Door(); break;\r
+ case 7: break; //CD_Close_Door(); break;\r
+ case 8: err(""); break;\r
+ case 9: if (Args(3)) vid_mode(); break;\r
+ case 10: CPU_Usage(); break;\r
+ case 11: if (Args(2)) Mount(); break;\r
+ case 12: if (numargs<2) MAPstats(); else MAPswitch(); break;\r
+ case 13: ver(); break;\r
+ case 14: ZeroConBrowseTiles(); break;\r
+ case 15: if (numargs==3) ZeroConWarp((char**)args); else { Con_Printf("\82syntax:"); Con_Printf("Warp <x> <y>~"); } break;\r
+ case 16: CameraTracking(); break;\r
+ case 17: if (numargs==1) ZeroGetRString();\r
+ if (numargs==2) ZeroSetRString((char**)args); break;\r
+ case 18: Obstructions(); break;\r
+ case 19: Phantom(); break;\r
+ case 20: EntityStat(); break;\r
+ case 21: ListActiveEnts(); break;\r
+ case 22: if (Args(2)) EntityS(); break;\r
+ case 23: CurPos(); break;\r
+ case 24: PlayerSpeed(); break;\r
+ case 25: speeddemon=1; break;\r
+ case 26: ReadVCVar(); break;\r
+ case 27: WriteVCVar(); break;\r
+ case 28: if (Args(2)) Player(); break;\r
+ case 29: if (Args(4)) SpawnEntity(); break;\r
+ case 30: ShowZones(); break;\r
+ case NUMCMDS: Con_Printf((char *) cmd); break;\r
+ }\r
+}\r
+\r
+void ParseCommand(void)\r
+{ byte *src;\r
+ // breaks the command string into arguements and stuff. (in cmd2)\r
+\r
+ numargs=0;\r
+ src=(byte *) cmd2;\r
+ args[0]=src;\r
+\r
+ while (*src==' ') src++;\r
+\r
+ if (!*src) return;\r
+\r
+ while (1)\r
+ {\r
+ if (*src==' ')\r
+ {\r
+ while (*src== ' ')\r
+ {\r
+ *src=0;\r
+ src++;\r
+ }\r
+ if (*src)\r
+ {\r
+ numargs++;\r
+ args[numargs]=src;\r
+ }\r
+ src--;\r
+ }\r
+ src++;\r
+ if (!*src)\r
+ {\r
+ numargs++;\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void ProcessCommand(void)\r
+{ byte i;\r
+\r
+ memcpy(cmd2, cmd, 40);\r
+ strupr((char *) cmd2);\r
+ ParseCommand();\r
+\r
+ i=0;\r
+ while (i<NUMCMDS)\r
+ {\r
+ if (!strcmp(concmds[i], (char *) args[0])) break;\r
+ i++;\r
+ }\r
+ ExecuteCommand(i);\r
+ memcpy(lastcmds, lastcmds+40, 360);\r
+ memcpy(lastcmds+360, cmd, 40);\r
+ if (numcmds<10) numcmds++;\r
+ cmdpos=0;\r
+ memset(cmd, 0, 40);\r
+ cmdlen=0;\r
+}\r
+\r
+void CommandInput(void)\r
+{ byte c, len, cc;\r
+\r
+ UpdateControls();\r
+ if (!last_pressed) return;\r
+\r
+ // Handle the Shift key\r
+\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ c=key_shift_tbl[last_pressed];\r
+ }\r
+ else\r
+ {\r
+ c=key_ascii_tbl[last_pressed];\r
+ }\r
+\r
+ // Handle special cases first\r
+ if (last_pressed == SCAN_PGUP)\r
+ {\r
+ if (startln) startln--;\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_PGDN)\r
+ {\r
+ if (startln < 36) startln++;\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_UP)\r
+ {\r
+ if (cmdpos<numcmds)\r
+ {\r
+ cmdpos++;\r
+ memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);\r
+ cmdlen=strlen((char *) cmd);\r
+ }\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_DOWN)\r
+ {\r
+ if (cmdpos)\r
+ {\r
+ cmdpos--;\r
+ if (!cmdpos)\r
+ {\r
+ memset(cmd, 0, 40);\r
+ cmdlen=0;\r
+ }\r
+ else\r
+ {\r
+ memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);\r
+ cmdlen=strlen((char *) cmd);\r
+ }\r
+ }\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (!c)\r
+ {\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_BACKSP)\r
+ {\r
+ if (cmdlen)\r
+ {\r
+ cmdlen--;\r
+ cmd[cmdlen]=0;\r
+ }\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_TAB)\r
+ {\r
+ last_pressed=0;\r
+ len=strlen((char *) cmd);\r
+ if (!len) return;\r
+ for (cc=0; cc<NUMCMDS; cc++)\r
+ if (!strncasecmp((char *) cmd, concmds[sortedcmds[cc]], len))\r
+ {\r
+ memcpy((char *) cmd, concmds[sortedcmds[cc]], strlen(concmds[sortedcmds[cc]])+1);\r
+ strlwr((char *) cmd);\r
+ cmdlen=strlen((char *) cmd);\r
+ return;\r
+ }\r
+ return;\r
+ }\r
+\r
+ if (last_pressed == SCAN_ENTER)\r
+ {\r
+ ProcessCommand();\r
+ last_pressed=0;\r
+ return;\r
+ }\r
+\r
+ if (cmdlen<38)\r
+ {\r
+ cmd[cmdlen++]=c;\r
+ cmd[cmdlen]=0;\r
+ }\r
+\r
+ last_pressed=0;\r
+}\r
+\r
+void ActivateConsole(void)\r
+{\r
+ if (!allowconsole && !consoleoverride) return;\r
+ conlines=1;\r
+ callback=ShowConsole;\r
+ cswtime=systemtime+40;\r
+\r
+ while (!key[SCAN_RQUOTA])\r
+ {\r
+ DrawConsole();\r
+ ShowPage();\r
+ CheckMessages();\r
+ CommandInput();\r
+ }\r
+\r
+ callback=HideConsole;\r
+ while (conlines > 1)\r
+ {\r
+ CheckMessages();\r
+ DrawConsole();\r
+ ShowPage();\r
+ }\r
+ conlines=0;\r
+ key[SCAN_RQUOTA]=0;\r
+ timer_count=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONSOLE_H\r
+#define CONSOLE_H\r
+\r
+#include "main.h"\r
+\r
+// -- externs --\r
+\r
+extern byte *consolebg; // Console background image\r
+extern byte *consoletext; // Console text buffer\r
+extern byte *cmd, *cmd2, cmdlen; // command line buffer\r
+extern char *lastcmds, numcmds, cmdpos; // last-command memory\r
+extern byte *args[10], numargs; // command argument pointers\r
+extern char cursor, more; // flag on/off cursor visible\r
+extern int cswtime; // cursor switch time.\r
+extern int conlines; // Number of visible lines\r
+extern int lines; // number of lines entered since last draw\r
+extern char startln; // Start display ofs (for scrollback)\r
+extern char allowconsole;\r
+extern char consoleoverride;\r
+\r
+extern byte key_ascii_tbl[128];\r
+extern byte key_shift_tbl[128];\r
+\r
+extern char *concmds[];\r
+\r
+// -- prototypes --\r
+\r
+extern void InitConsole(void);\r
+extern void Con_Printf(char *str);\r
+extern void Con_NextLine(void);\r
+\r
+extern int ShowConsole(void);\r
+extern int HideConsole(void);\r
+\r
+extern void DrawConsole(void);\r
+extern int Args(int num);\r
+extern void ListCmds(void);\r
+extern void LastCmds(void);\r
+extern void ExecuteCommand(int i);\r
+extern void ParseCommand(void);\r
+extern void ProcessCommand(void);\r
+extern void CommandInput(void);\r
+extern void ActivateConsole(void);\r
+\r
+#endif // CONSOLE_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// -- Hardware Dependent -- //\r
+\r
+int kb1, kb2, kb3, kb4; // keyboard controls\r
+int jb1, jb2, jb3, jb4; // joystick controls\r
+\r
+// -- Unified Interface -- //\r
+\r
+char b1, b2, b3, b4;\r
+char up, down, left, right;\r
+\r
+// -- UnPress support variables -- //\r
+\r
+char wb1, wb2, wb3, wb4;\r
+char wup, wdown, wleft, wright;\r
+\r
+char rb1, rb2, rb3, rb4;\r
+char rup, rdown, rleft, rright;\r
+\r
+// ================================= Code ====================================\r
+\r
+void UpdateControls()\r
+{\r
+ rb1=0; rb2=0; rb3=0; rb4=0;\r
+ rup=0; rdown=0; rleft=0; rright=0;\r
+\r
+ if (key[SCAN_UP]) rup=1;\r
+ if (key[SCAN_DOWN]) rdown=1;\r
+ if (key[SCAN_RIGHT]) rright=1;\r
+ if (key[SCAN_LEFT]) rleft=1;\r
+\r
+ if (key[kb1]) rb1=1;\r
+ if (key[kb2]) rb2=1;\r
+ if (key[kb3]) rb3=1;\r
+ if (key[kb4]) rb4=1;\r
+\r
+ if (wb1 && rb1) rb1=0;\r
+ else if (wb1 && !rb1) wb1=0;\r
+ b1=rb1;\r
+\r
+ if (wb2 && rb2) rb2=0;\r
+ else if (wb2 && !rb2) wb2=0;\r
+ b2=rb2;\r
+\r
+ if (wb3 && rb3) rb3=0;\r
+ else if (wb3 && !rb3) wb3=0;\r
+ b3=rb3;\r
+\r
+ if (wb4 && rb4) rb4=0;\r
+ else if (wb4 && !rb4) wb4=0;\r
+ b4=rb4;\r
+\r
+ if (wup && rup) rup=0;\r
+ else if (wup && !rup) wup=0;\r
+ up=rup;\r
+\r
+ if (wdown && rdown) rdown=0;\r
+ else if (wdown && !rdown) wdown=0;\r
+ down=rdown;\r
+\r
+ if (wleft && rleft) rleft=0;\r
+ else if (wleft && !rleft) wleft=0;\r
+ left=rleft;\r
+\r
+ if (wright && rright) rright=0;\r
+ else if (wright && !rright) wright=0;\r
+ right=rright;\r
+}\r
+\r
+void UnPress(int control)\r
+{\r
+ switch (control)\r
+ {\r
+ case 0: wb1=1; wb2=1; wb3=1; wb4=1;\r
+ b1=0; b2=0; b3=0; b4=0;\r
+ key[kb1]=0; key[kb2]=0; key[kb3]=0; key[kb4]=0; break;\r
+ case 1: wb1=1; b1=0; key[kb1]=0; break;\r
+ case 2: wb2=1; b2=0; key[kb2]=0; break;\r
+ case 3: wb3=1; b3=0; key[kb3]=0; break;\r
+ case 4: wb4=1; b4=0; key[kb4]=0; break;\r
+ case 5: wup=1; up=0; key[SCAN_UP]=0; break;\r
+ case 6: wdown=1; down=0; key[SCAN_DOWN]=0; break;\r
+ case 7: wleft=1; left=0; key[SCAN_LEFT]=0; break;\r
+ case 8: wright=1; right=0; key[SCAN_RIGHT]=0; break;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONTROL_H\r
+#define CONTROL_H\r
+\r
+extern int kb1, kb2, kb3, kb4;\r
+extern int jb1, jb2, jb3, jb4;\r
+\r
+extern char b1, b2, b3, b4;\r
+extern char up, down, left, right;\r
+\r
+void UpdateControls();\r
+void UnPress(int);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero 5.7.99>\r
+// + added ScreenShot() on F11\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+\r
+#define ENGINE_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ word start; // strand start\r
+ word finish; // strand end\r
+ word delay; // tile-switch delay\r
+ word mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+zoneinfo zones[256]; // zone data records\r
+layer_r layer[6]; // Array of layer data\r
+vspanim_r vspanim[100]; // tile animation data\r
+unsigned short vadelay[100]; // Tile animation delay ctr\r
+\r
+char mapname[60]; // MAP filename\r
+char vspname[60]; // VSP filemap\r
+char musname[60]; // MAP bkgrd music default filename\r
+char rstring[20]; // render-order string\r
+char numlayers; // number of layers in map\r
+byte *obstruct, *zone; // obstruction and zone buffers\r
+char layertoggle[8]; // layer visible toggles\r
+word xstart, ystart; // MAP start x/y location\r
+int bufsize; // how many bytes need to be written\r
+int numzones; // number of active zones\r
+\r
+word *layers[6]; // Raw layer data\r
+int xwin=0, ywin=0; // camera offset\r
+\r
+// -- vsp data --\r
+\r
+byte *vsp=0,*vspmask; // VSP data buffer.\r
+unsigned short numtiles; // number of tiles in VSP.\r
+unsigned short *tileidx; // tile index thingamajig\r
+char *flipped; // bi-direction looping flag\r
+\r
+// entity stuffs\r
+\r
+char *msbuf[100]; // ptr-table to script offset\r
+char *ms; // script text buffer\r
+byte nms; // number of movescripts\r
+\r
+char numfollowers=0; // number of party followers\r
+byte follower[10]; // maximum of 10 followers.\r
+char laststeps[10]={ 0 }; // record of last movements\r
+int lastent;\r
+\r
+// -- stuff --\r
+\r
+byte movegranularity; // means nothing now, please remove\r
+byte movectr=0;\r
+\r
+byte phantom=0; // walk-through-walls\r
+byte speeddemon=0; // doublespeed cheat\r
+int bindarray[128]; // bind script offset\r
+\r
+// ================================= Code ====================================\r
+\r
+void ReadCompressedLayer1(byte *dest, int len, char *buf)\r
+{\r
+ int j,n;\r
+ byte run, w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ w=*buf; buf++;\r
+ if (w==0xFF)\r
+ {\r
+ run=*buf; buf++;\r
+ w=*buf; buf++;\r
+ for (j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while (n<len);\r
+}\r
+\r
+void ReadCompressedLayer2(word *dest, int len, word *buf)\r
+{\r
+ int j,n;\r
+ byte run;\r
+ word w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ w=*buf; buf++;\r
+ if ((w & 0xFF00)==0xFF00)\r
+ {\r
+ run=(w & 0x00FF);\r
+ w=*buf; buf++;\r
+ for(j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while(n<len);\r
+}\r
+\r
+void LoadVSP(char *fname)\r
+{\r
+ VFILE *f;\r
+ int i;\r
+ word ver;\r
+ char *cb;\r
+\r
+// Mwahaha! The Indefatigable Grue has snuck into the V2 source code! It is forever corrupted by his evil touch! Cower in fear, oh yes, FEAR! MwahahaHA..ha...hem...\r
+\r
+ if (!(f=vopen(fname))) err("*error* Could not open VSP file %s.",fname);\r
+ vread(&ver, 2, f);\r
+ vread(&pal, 768, f);\r
+ vread(&numtiles, 2, f);\r
+\r
+ vsp=(byte *) valloc(numtiles*256, "vsp", OID_IMAGE);\r
+ if (ver==2)\r
+ {\r
+ vread(vsp, (256*numtiles), f);\r
+ }\r
+ else\r
+ {\r
+ vread(&i, 4, f);\r
+ cb=(char *) valloc(i, "LoadVSP:cb", OID_TEMP);\r
+ vread(cb, i, f);\r
+ ReadCompressedLayer1(vsp, 256*numtiles, cb);\r
+ vfree(cb);\r
+ }\r
+ vread(&vspanim, sizeof vspanim, f);\r
+ vclose(f);\r
+\r
+ // Now calculate VSP transparency mask.\r
+\r
+ vspmask=(byte *) valloc(numtiles*256, "vspmask", OID_MISC);\r
+ for (i=0; i<(numtiles*256); i++)\r
+ {\r
+ if (vsp[i]) vspmask[i]=0;\r
+ else vspmask[i]=255;\r
+ }\r
+\r
+ // Allocate and build tileidx.\r
+\r
+ tileidx=(unsigned short *) valloc(numtiles*2, "tileidx", OID_MISC);\r
+ for (i=0; i<numtiles; i++)\r
+ tileidx[i]=i;\r
+\r
+ flipped=(char *) valloc(numtiles, "flipped", OID_MISC);\r
+ animate=TRUE;\r
+}\r
+\r
+void FreeVSP()\r
+{\r
+ animate=FALSE;\r
+ vfree(vsp);\r
+ vfree(vspmask);\r
+ vfree(tileidx);\r
+ vfree(flipped);\r
+ vfree(mapvc);\r
+}\r
+\r
+void LoadMAP(char *fname)\r
+{\r
+ VFILE *f;\r
+ char *cb;\r
+ int i;\r
+\r
+// No matter where you go, you're there.\r
+\r
+ Logp("Loading MAP %s.",fname);\r
+ memcpy(mapname, fname, strlen(fname)+1);\r
+ memcpy(strbuf, "MAPù5", 6);\r
+ if (!(f=vopen(fname))) err("Could not find %s.",fname);\r
+ vread(strbuf, 6, f);\r
+ if (strcmp(strbuf,"MAPù5"))\r
+ err("%s is not a recognized MAP file.",fname);\r
+\r
+// Lalala! Can you find Waldo hiding in the code? Here's a hint, he likes to dress like a candy-cane.\r
+\r
+ vread(&i, 4, f);\r
+ vread(vspname, 60, f);\r
+ vread(musname, 60, f);\r
+ vread(rstring, 20, f);\r
+ vread(&xstart, 2, f);\r
+ vread(&ystart, 2, f);\r
+ vread(strbuf, 51, f);\r
+ vread(&numlayers, 1, f);\r
+ for (i=0; i<numlayers; i++)\r
+ vread(&layer[i], 12, f);\r
+\r
+ memset(&layertoggle, 0, 8);\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ vread(&bufsize, 4, f);\r
+ layers[i]=(unsigned short *) valloc(layer[i].sizex*(layer[i].sizey+2)*2, "LoadMAP:layers[i]", OID_MAP);\r
+ cb=(char *) valloc(bufsize, "LoadMAP:cb", OID_TEMP);\r
+ vread(cb, bufsize, f);\r
+ ReadCompressedLayer2(layers[i],(layer[i].sizex * layer[i].sizey), (word *) cb);\r
+ vfree(cb);\r
+ layertoggle[i]=1;\r
+ }\r
+ obstruct=(byte *) valloc(layer[0].sizex*(layer[0].sizey+2), "obstruct", OID_MAP);\r
+ zone=(byte *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone", OID_MAP);\r
+\r
+ vread(&bufsize, 4, f);\r
+ cb=(char *) valloc(bufsize, "LoadMAP:cb (2)", OID_TEMP);\r
+ vread(cb, bufsize, f);\r
+ ReadCompressedLayer1(obstruct,(layer[0].sizex * layer[0].sizey), cb);\r
+ vfree(cb);\r
+ vread(&bufsize, 4, f);\r
+ cb=(char *) valloc(bufsize, "LoadMAP:cb (3)", OID_TEMP);\r
+ vread(cb, bufsize, f);\r
+ ReadCompressedLayer1(zone,(layer[0].sizex * layer[0].sizey), cb);\r
+ vfree(cb);\r
+ memset(&zones, 0, sizeof zones);\r
+ vread(&numzones, 4, f);\r
+ vread(&zones, numzones*50, f);\r
+\r
+ memset(&chrlist, 0, sizeof chrlist);\r
+ vread(&nmchr, 1, f);\r
+ vread(&chrlist, 60*nmchr, f);\r
+\r
+// Cheese is good, cheese is nice. Cheese is better, than body lice.\r
+\r
+ memset(&entity, 0, sizeof entity);\r
+ vread(&entities, 1, f);\r
+ vread(&entity, (sizeof(entity)/256*entities), f);\r
+ for (i=0; i<entities; i++)\r
+ {\r
+ entity[i].tx=entity[i].x;\r
+ entity[i].ty=entity[i].y;\r
+ entity[i].x*=16;\r
+ entity[i].y*=16;\r
+ }\r
+\r
+ vread(&nms, 1, f);\r
+ vread(&i, 4, f);\r
+ vread(&msbuf, nms*4, f);\r
+ if (nms)\r
+ {\r
+ ms=(char *) valloc(i, "LoadMAP:ms", OID_MAP);\r
+ vread(ms, i, f);\r
+ }\r
+ else\r
+ {\r
+ vseek(f, i, 0);\r
+ ms=(char *) malloc(16);\r
+ }\r
+ vread(&i, 4, f); // # of things\r
+ LoadMapVC(f);\r
+ vclose(f);\r
+\r
+ memset(&chr, 0, sizeof chr);\r
+ LoadVSP(vspname);\r
+ LoadCHRList();\r
+ Logp(" [%d] ",mapevents);\r
+ if (strlen(musname))\r
+ PlayMusic(musname);\r
+ LogDone();\r
+ ExecuteEvent(0);\r
+}\r
+\r
+void FreeMAP()\r
+{\r
+ int i;\r
+\r
+ vfree(obstruct);\r
+ vfree(zone);\r
+ for (i=0; i<numlayers; i++)\r
+ vfree(layers[i]);\r
+ vfree(ms);\r
+ player=0;\r
+ memset(&entity, 0, sizeof entity);\r
+ entities=0; nmchr=0; numchrs=0;\r
+ xwin=0; ywin=0;\r
+ vfree(mapvc);\r
+}\r
+\r
+void MAPswitch()\r
+{\r
+ hookretrace=0;\r
+ hooktimer=0;\r
+ kill=1;\r
+ memcpy(startmap, (char *) args[1], strlen((char *) args[1]));\r
+ key[SCAN_RQUOTA]=1;\r
+ conlines=2;\r
+}\r
+\r
+// The_Edge rules. Really. I mean it. Wyrdwad too. They're as cool as Omniphile!\r
+\r
+void MAPstats()\r
+{ int a;\r
+\r
+ Con_NextLine();\r
+ Con_Printf("{||||||||||||||||||||}");\r
+ sprintf(strbuf,"MAP stats for \80%s~ - \81%d~ layers",mapname,numlayers); Con_Printf(strbuf);\r
+ sprintf(strbuf,"Base dimensions \81%d~ x \81%d~", layer[0].sizex, layer[0].sizey);\r
+ Con_Printf(strbuf); a=layer[0].sizex*layer[0].sizey;\r
+ sprintf(strbuf,"MAP using \81%d~ bytes of memory",\r
+ a*(2+(numlayers*2))); Con_Printf(strbuf);\r
+ sprintf(strbuf,"\81%d~ active zones.",numzones); Con_Printf(strbuf);\r
+ Con_Printf("{||||||||||||||||||||}");\r
+ sprintf(strbuf,"VSP file: \80%s~",vspname); Con_Printf(strbuf);\r
+ sprintf(strbuf,"VSP has \81%d~ tiles using \81%d~ bytes",numtiles,\r
+ (numtiles*256)+800+(numtiles*3)); Con_Printf(strbuf);\r
+ Con_Printf("{||||||||||||||||||||}");\r
+}\r
+\r
+int PlayerObstructed(char dir)\r
+{\r
+ if (phantom) return 0;\r
+ switch (dir)\r
+ {\r
+ case 0: if (ObstructionAt(player->tx, player->ty+1)) return 1; break;\r
+ case 1: if (ObstructionAt(player->tx, player->ty-1)) return 1; break;\r
+ case 2: if (ObstructionAt(player->tx-1, player->ty)) return 1; break;\r
+ case 3: if (ObstructionAt(player->tx+1, player->ty)) return 1; break;\r
+ }\r
+ switch (dir)\r
+ {\r
+ case 0: if (EntityObsAt(player->tx, player->ty+1)) return 1; break;\r
+ case 1: if (EntityObsAt(player->tx, player->ty-1)) return 1; break;\r
+ case 2: if (EntityObsAt(player->tx-1, player->ty)) return 1; break;\r
+ case 3: if (EntityObsAt(player->tx+1, player->ty)) return 1; break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void CheckZone()\r
+{\r
+ int curzone;\r
+ static int lz=0, zonedelay=0;\r
+\r
+ curzone=zone[(player->ty * layer[0].sizex) + player->tx];\r
+ if (lz!=curzone)\r
+ {\r
+ zonedelay=0;\r
+ lz=curzone;\r
+ }\r
+ if (!zones[curzone].percent) return;\r
+ if (zonedelay < zones[curzone].delay)\r
+ {\r
+ zonedelay++;\r
+ return;\r
+ }\r
+ if (curzone)\r
+ if (zones[curzone].script &&\r
+ zones[curzone].percent >= rnd(0,255))\r
+ {\r
+ ExecuteEvent(zones[curzone].script);\r
+ zonedelay=0;\r
+ }\r
+}\r
+\r
+int InvFace()\r
+{\r
+ switch(player -> facing)\r
+ {\r
+ case 0: return 1;\r
+ case 1: return 0;\r
+ case 2: return 3;\r
+ case 3: return 2;\r
+ }\r
+ return -1;\r
+}\r
+\r
+void Activate()\r
+{\r
+ byte tz;\r
+ int ax=0, ay=0;\r
+\r
+ switch(player->facing)\r
+ {\r
+ case 0: ax=player->tx; ay=player->ty+1; break;\r
+ case 1: ax=player->tx; ay=player->ty-1; break;\r
+ case 2: ax=player->tx-1; ay=player->ty; break;\r
+ case 3: ax=player->tx+1; ay=player->ty; break;\r
+ }\r
+ tz=zone[(ay*layer[0].sizex)+ax];\r
+ if (zones[tz].aaa)\r
+ {\r
+ ExecuteEvent(zones[tz].script);\r
+ return;\r
+ }\r
+ if ((tz=EntityAt(ax, ay)))\r
+ {\r
+ tz--;\r
+ if (entity[tz].face)\r
+ {\r
+ entity[tz].facing=InvFace();\r
+ AnimateEntity(&entity[tz]);\r
+ }\r
+ if (entity[tz].actscript)\r
+ {\r
+ lastent=tz;\r
+ ExecuteEvent(entity[tz].actscript);\r
+ }\r
+ }\r
+}\r
+\r
+void ResetFollowers()\r
+{\r
+ int i;\r
+\r
+ player->x=player->tx<<4;\r
+ player->y=player->ty<<4;\r
+ player->moving=0;\r
+ player->movecnt=0;\r
+ player->reset=1;\r
+ for (i=0; i<numfollowers; i++)\r
+ {\r
+ entity[follower[i]].x=player->x;\r
+ entity[follower[i]].y=player->y;\r
+ entity[follower[i]].tx=player->tx;\r
+ entity[follower[i]].ty=player->ty;\r
+ entity[follower[i]].facing=player->facing;\r
+ entity[follower[i]].reset=1;\r
+ }\r
+ memset(laststeps, 0, 10);\r
+}\r
+\r
+void MoveFollowers()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numfollowers; i++)\r
+ {\r
+ entity[follower[i]].moving=laststeps[i+1];\r
+ entity[follower[i]].movecnt=15;\r
+ if (entity[follower[i]].reset ||\r
+ entity[follower[i]].facing != laststeps[i+1]-1)\r
+ {\r
+ //player->animofs=chr[player->chrindex].uanim;\r
+ entity[follower[i]].delayct=0;\r
+ entity[follower[i]].reset=0;\r
+ }\r
+ entity[follower[i]].facing=laststeps[i+1]-1;\r
+ }\r
+}\r
+\r
+//--- zero 5.7.99\r
+\r
+void WritePalette(FILE *f)\r
+{ char b;\r
+ int i;\r
+ byte pal3[768];\r
+\r
+ for (i=0; i<768; i++)\r
+ pal3[i]=pal2[i] << 2;\r
+\r
+ b=12; fwrite(&b, 1, 1, f);\r
+ fwrite(pal3, 1, 768, f);\r
+}\r
+\r
+void WritePCXLine(unsigned char *p,int len,FILE *pcxf)\r
+{ int i;\r
+ unsigned char byt, samect, repcode;\r
+\r
+ i=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<(unsigned) 63 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1 || (byt & 0xC0) != 0)\r
+ {\r
+ repcode=0xC0 | samect;\r
+ fwrite(&repcode,1,1,pcxf);\r
+ }\r
+ fwrite(&byt,1,1,pcxf);\r
+ } while (i<len);\r
+}\r
+\r
+\r
+void ScreenShot()\r
+{\r
+ unsigned char b1;\r
+ unsigned short int w1;\r
+ int i,n;\r
+ char fnamestr[13];\r
+ static int ss=0;\r
+ FILE *pcxf;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+ pcxf=fopen(fnamestr,"r");\r
+ i=(int)pcxf;\r
+ if(pcxf) fclose(pcxf);\r
+ n++;\r
+ } while(i);\r
+ n--;\r
+\r
+ // Takes a snapshot of the current screen.\r
+\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+\r
+ pcxf=fopen(fnamestr,"wb");\r
+ ss++;\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=sx-1; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+ w1=sy-1; fwrite(&w1, 1, 2, pcxf); // ymax = 199;\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w1=sy; fwrite(&w1, 1, 2, pcxf); // vres = 200;\r
+\r
+ fwrite(screen,1,48,pcxf);\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(screen, 1, 59, pcxf); // filler\r
+\r
+ for (w1=0; w1<sy; w1++)\r
+ WritePCXLine(screen+w1*tsx, sx, pcxf);\r
+\r
+ WritePalette(pcxf);\r
+ fclose(pcxf);\r
+// timer_count=0;\r
+}\r
+//---\r
+\r
+\r
+void LastMove(char dir)\r
+{\r
+ laststeps[9]=laststeps[8];\r
+ laststeps[8]=laststeps[7];\r
+ laststeps[7]=laststeps[6];\r
+ laststeps[6]=laststeps[5];\r
+ laststeps[5]=laststeps[4];\r
+ laststeps[4]=laststeps[3];\r
+ laststeps[3]=laststeps[2];\r
+ laststeps[2]=laststeps[1];\r
+ laststeps[1]=laststeps[0];\r
+ laststeps[0]=dir;\r
+\r
+ MoveFollowers();\r
+}\r
+\r
+void ProcessControls1()\r
+{\r
+ if (!player->moving)\r
+ {\r
+ if (down && !PlayerObstructed(0))\r
+ {\r
+ player->ty++;\r
+ player->moving=1;\r
+ player->movecnt=15;\r
+ player->y++;\r
+ if (player->reset || player->facing != 0)\r
+ {\r
+ player->animofs=chr[player->chrindex].danim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=0;\r
+ LastMove(1);\r
+ return;\r
+ }\r
+ if (up && !PlayerObstructed(1))\r
+ {\r
+ player->ty--;\r
+ player->moving=2;\r
+ player->movecnt=15;\r
+ player->y--;\r
+ if (player->reset || player->facing != 1)\r
+ {\r
+ player->animofs=chr[player->chrindex].uanim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=1;\r
+ LastMove(2);\r
+ return;\r
+ }\r
+ if (left && !PlayerObstructed(2))\r
+ {\r
+ player->tx--;\r
+ player->moving=3;\r
+ player->movecnt=15;\r
+ player->x--;\r
+ if (player->reset || player->facing != 2)\r
+ {\r
+ player->animofs=chr[player->chrindex].lanim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=2;\r
+ LastMove(3);\r
+ return;\r
+ }\r
+ if (right && !PlayerObstructed(3))\r
+ {\r
+ player->tx++;\r
+ player->moving=4;\r
+ player->movecnt=15;\r
+ player->x++;\r
+ if (player->reset || player->facing != 3)\r
+ {\r
+ player->animofs=chr[player->chrindex].ranim;\r
+ player->delayct=0;\r
+ player->reset=0;\r
+ }\r
+ player->facing=3;\r
+ LastMove(4);\r
+ return;\r
+ }\r
+ if (down) player->facing=0;\r
+ if (up) player->facing=1;\r
+ if (left) player->facing=2;\r
+ if (right) player->facing=3;\r
+ }\r
+\r
+ switch (player->moving)\r
+ {\r
+ case 0: player->reset=1; player->animofs=0; player->delayct=0; break;\r
+ case 1: player->y++; player->movecnt--; break;\r
+ case 2: player->y--; player->movecnt--; break;\r
+ case 3: player->x--; player->movecnt--; break;\r
+ case 4: player->x++; player->movecnt--; break;\r
+ }\r
+ if (!player->movecnt && player->moving)\r
+ {\r
+ player->moving=0;\r
+ CheckZone();\r
+ }\r
+ if (!player->movecnt && b1) Activate();\r
+}\r
+\r
+void ProcessControls()\r
+{ int i;\r
+\r
+ if (key[SCAN_RQUOTA])\r
+ {\r
+ key[SCAN_RQUOTA]=0; last_pressed=0;\r
+ ActivateConsole();\r
+ }\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+//--- zero 5.7.99\r
+ if (key[SCAN_F11])\r
+ {\r
+ Message("ss",50);\r
+ ScreenShot();\r
+ key[SCAN_F11]=0;\r
+ }\r
+//---\r
+ if (!player) return;\r
+\r
+ if (player->speed<4)\r
+ {\r
+ switch (player->speed)\r
+ {\r
+ case 1: if (player->speedct<3) { player->speedct++; return; } break;\r
+ case 2: if (player->speedct<2) { player->speedct++; return; } break;\r
+ case 3: if (player->speedct<1) { player->speedct++; return; } break;\r
+ }\r
+ }\r
+ if (player->speed<5)\r
+ {\r
+ ProcessControls1();\r
+ player->speedct=0;\r
+ AnimateEntity(player);\r
+ }\r
+ switch (player->speed)\r
+ {\r
+ case 5: for (i=0; i<2; i++) { ProcessControls1(); AnimateEntity(player); } return;\r
+ case 6: for (i=0; i<3; i++) { ProcessControls1(); AnimateEntity(player); } return;\r
+ case 7: for (i=0; i<4; i++) { ProcessControls1(); AnimateEntity(player); } return;\r
+ }\r
+}\r
+\r
+void GameTick()\r
+{\r
+ UpdateControls();\r
+ CheckMessages();\r
+ if (bindarray[last_pressed])\r
+ HookKey(bindarray[last_pressed]);\r
+ ProcessControls();\r
+ if (speeddemon && key[SCAN_CTRL]) ProcessControls();\r
+ ProcessEntities();\r
+}\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero 5.7.99>\r
+// + added ScreenShot() headers\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+\r
+#ifndef ENGINE_H\r
+#define ENGINE_H\r
+\r
+typedef struct\r
+{\r
+ word start; // strand start\r
+ word finish; // strand end\r
+ word delay; // tile-switch delay\r
+ word mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+extern layer_r layer[4]; // Array of layer data\r
+extern vspanim_r vspanim[100]; // tile animation data\r
+extern unsigned short vadelay[100]; // Tile animation delay ctr\r
+\r
+extern char mapname[60]; // MAP filename\r
+extern char vspname[60]; // VSP filemap\r
+extern char rstring[20]; // render-order string\r
+extern char numlayers; // number of layers in map\r
+extern byte *obstruct, *zone; // obstruction and zone buffers\r
+extern int bufsize; // how many bytes need to be written\r
+extern char layertoggle[4]; // layer visible toggles\r
+\r
+extern word *layers[4]; // Raw layer data\r
+extern int xwin, ywin;\r
+\r
+// -- entity things --\r
+\r
+extern char *msbuf[100]; // ptr-table to script offset\r
+extern char *ms; // script text buffer\r
+extern byte nms; // number of movescripts\r
+\r
+extern char numfollowers; // number of party followers\r
+extern byte follower[10]; // maximum of 10 followers.\r
+extern char laststeps[10]; // record of last movements\r
+extern int lastent;\r
+\r
+// -- vsp data --\r
+\r
+extern byte *vsp,*vspmask; // VSP data buffer.\r
+extern unsigned short numtiles; // number of tiles in VSP.\r
+extern unsigned short *tileidx; // tile index thingamajig\r
+extern char *flipped; // bi-direction looping flag\r
+extern byte movegranularity, phantom, speeddemon, movectr;\r
+extern int bindarray[128];\r
+\r
+// -- prototypes --\r
+\r
+extern void LoadVSP(char *fname);\r
+extern void FreeVSP(void);\r
+extern void LoadMAP(char *fname);\r
+extern void FreeMAP(void);\r
+extern void MAPswitch(void);\r
+extern void MAPstats(void);\r
+extern void ProcessControls(void);\r
+extern void GameTick(void);\r
+\r
+extern void ReadCompressedLayer1(byte*, int, char*);\r
+\r
+//--- zero 5.7.99\r
+void WritePalette(FILE *f);\r
+void WritePCXLine(unsigned char *p,int len,FILE *pcxf);\r
+void ScreenShot();\r
+//\r
+#endif // ENGINE_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero, 5.6.98>\r
+// + corrected oversight in movement script management by sticking a hack in\r
+// MoveScript(). Bug caused Fx commands to not work sometimes.\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#define ENTITY_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *scriptofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ byte *imagedata; // CHR frame data\r
+ int fxsize, fysize; // frame x/y dimensions\r
+ int hx, hy; // x/y obstruction hotspot\r
+ int totalframes; // total # of frames.\r
+ int lidle, ridle;\r
+ int uidle, didle;\r
+ char lanim[100];\r
+ char ranim[100];\r
+ char uanim[100];\r
+ char danim[100];\r
+} chrdata;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+chrlist_r chrlist[100];\r
+byte nmchr,playernum;\r
+entity_r *player=0;\r
+entity_r entity[256];\r
+byte entities=0;\r
+chrdata chr[100];\r
+byte numchrs=0;\r
+byte entidx[256], cc;\r
+byte movesuccess;\r
+\r
+// ================================= Code ====================================\r
+\r
+int ObstructionAt(int tx, int ty)\r
+{\r
+ if (obstruct[(ty*layer[0].sizex)+tx]) return 1;\r
+ if (tx==-1 || ty==-1) return 1;\r
+ if (tx==layer[0].sizex || ty==layer[0].sizey) return 1;\r
+ return 0;\r
+}\r
+\r
+int Zone(int tx, int ty)\r
+{\r
+ return zone[(ty*layer[0].sizex)+tx];\r
+}\r
+\r
+void LoadCHR(char *fname, chrdata *c)\r
+{\r
+ VFILE *f;\r
+ char b, *ptr=0;\r
+ int i;\r
+\r
+ f=vopen(fname);\r
+ if (!f) err("Could not open CHR file %s.",fname);\r
+ vread(&b, 1, f);\r
+ if (b!=2) err("CHR %s incorrect CHR format version.",fname);\r
+ vread(&c->fxsize, 2, f);\r
+ vread(&c->fysize, 2, f);\r
+ vread(&c->hx, 2, f);\r
+ vread(&c->hy, 2, f);\r
+ vread(strbuf, 4, f); // skip the hotspot size.\r
+ vread(&c->totalframes, 2, f);\r
+\r
+ vread(&i, 4, f);\r
+ ptr=(char *) valloc(i, "LoadCHR:ptr", OID_TEMP);\r
+ vread(ptr, i, f);\r
+ c->imagedata=(byte *) valloc(c->fxsize * c->fysize * c->totalframes, "LoadCHR:c->imagedata", OID_IMAGE);\r
+ ReadCompressedLayer1(c->imagedata, c->fxsize * c->fysize * c->totalframes, ptr);\r
+ vfree(ptr);\r
+\r
+\r
+ vread(&c->lidle, 4, f);\r
+ vread(&c->ridle, 4, f);\r
+ vread(&c->uidle, 4, f);\r
+ vread(&c->didle, 4, f);\r
+\r
+ for (b=0; b<4; b++)\r
+ {\r
+ switch (b)\r
+ {\r
+ case 0: ptr=c->lanim; break;\r
+ case 1: ptr=c->ranim; break;\r
+ case 2: ptr=c->uanim; break;\r
+ case 3: ptr=c->danim; break;\r
+ }\r
+ vread(&i, 4, f);\r
+ if (i>100) err("Animation strand too long. %d",i);\r
+ vread(ptr, i, f);\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+int CacheCHR(char *fname)\r
+{\r
+ LoadCHR(fname, &chr[numchrs]);\r
+ numchrs++;\r
+ return (numchrs-1);\r
+}\r
+\r
+void FreeCHRList()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchrs; i++)\r
+ vfree(chr[i].imagedata);\r
+ memset(chr, i, sizeof chr);\r
+}\r
+\r
+void LoadCHRList()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<nmchr; i++)\r
+ if (strlen(chrlist[i].t)) CacheCHR(chrlist[i].t);\r
+}\r
+\r
+void DrawEntity(int i)\r
+{\r
+ int a, b, dx, dy;\r
+\r
+ dx=entity[i].x-xwin;\r
+ dy=entity[i].y-ywin;\r
+ a=entity[i].chrindex;\r
+ if (a>=numchrs) return;\r
+ b=entity[i].specframe ? entity[i].specframe : entity[i].frame;\r
+ TCopySpriteClip(dx-chr[a].hx, dy-chr[a].hy, chr[a].fxsize, chr[a].fysize,\r
+ (byte *) (chr[a].imagedata+(b*chr[a].fxsize*\r
+ chr[a].fysize)));\r
+}\r
+\r
+static int cmpent(const void* a, const void* b)\r
+{\r
+ return entity[*(byte*)a].y - entity[*(byte*)b].y;\r
+}\r
+\r
+void RenderEntities()\r
+{\r
+ int i;\r
+\r
+ qsort(entidx, cc, 1, cmpent);\r
+ for (i=0; i<cc; i++) DrawEntity(entidx[i]);\r
+}\r
+\r
+int GetArg(entity_r *p)\r
+{\r
+ int j;\r
+ static char token[10];\r
+\r
+ j=0;\r
+ while (*p->animofs==' ') p->animofs++;\r
+ while (*p->animofs>=48 && *p->animofs<=57)\r
+ {\r
+ token[j]=*p->animofs;\r
+ p->animofs++;\r
+ j++;\r
+ }\r
+ token[j]=0;\r
+ return atoi(token);\r
+}\r
+\r
+void GetNextCommand(entity_r *p)\r
+{\r
+ byte s;\r
+\r
+ while (*p->animofs==' ') p->animofs++;\r
+ s=*p->animofs;\r
+ p->animofs++;\r
+ switch (s)\r
+ {\r
+ case 'F': p->frame=GetArg(p); break;\r
+ case 'W': p->delayct=GetArg(p); break;\r
+ case 0: if (p->moving)\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=chr[p->chrindex].danim; break;\r
+ case 1: p->animofs=chr[p->chrindex].uanim; break;\r
+ case 2: p->animofs=chr[p->chrindex].lanim; break;\r
+ case 3: p->animofs=chr[p->chrindex].ranim; break;\r
+ }\r
+ else\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=0; p->frame=chr[p->chrindex].didle; break;\r
+ case 1: p->animofs=0; p->frame=chr[p->chrindex].uidle; break;\r
+ case 2: p->animofs=0; p->frame=chr[p->chrindex].lidle; break;\r
+ case 3: p->animofs=0; p->frame=chr[p->chrindex].ridle; break;\r
+ }\r
+ p->delayct=0; break;\r
+ }\r
+}\r
+\r
+void AnimateEntity(entity_r *p)\r
+{\r
+ if (!p->animofs && p->moving)\r
+ {\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=chr[p->chrindex].danim; break;\r
+ case 1: p->animofs=chr[p->chrindex].uanim; break;\r
+ case 2: p->animofs=chr[p->chrindex].lanim; break;\r
+ case 3: p->animofs=chr[p->chrindex].ranim; break;\r
+ }\r
+ p->delayct=0;\r
+ }\r
+ if (!p->animofs && !p->moving)\r
+ {\r
+ switch (p->facing)\r
+ {\r
+ case 0: p->animofs=0; p->frame=chr[p->chrindex].didle; break;\r
+ case 1: p->animofs=0; p->frame=chr[p->chrindex].uidle; break;\r
+ case 2: p->animofs=0; p->frame=chr[p->chrindex].lidle; break;\r
+ case 3: p->animofs=0; p->frame=chr[p->chrindex].ridle; break;\r
+ }\r
+ p->delayct=0;\r
+ }\r
+ if (p->delayct)\r
+ {\r
+ p->delayct--;\r
+ }\r
+ else GetNextCommand(p);\r
+}\r
+\r
+int EntityAt(int ex, int ey)\r
+{ int i;\r
+\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ if (&entity[entidx[i]]==player) continue;\r
+ if (ex==entity[entidx[i]].tx && ey==entity[entidx[i]].ty)\r
+ return entidx[i]+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int EntityObsAt(int ex, int ey)\r
+{ int i;\r
+\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ if (&entity[entidx[i]]==player) continue;\r
+ if (ex==entity[entidx[i]].tx && ey==entity[entidx[i]].ty &&\r
+ entity[entidx[i]].obsmode2)\r
+ return entidx[i]+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int AEntityObsAt(int ex, int ey)\r
+{ int i;\r
+\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ if (ex==entity[entidx[i]].tx && ey==entity[entidx[i]].ty &&\r
+ entity[entidx[i]].obsmode2)\r
+ return entidx[i]+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void SiftEntities()\r
+{ int i, dx, dy;\r
+\r
+ memset(&entidx, 0, 256); cc=0;\r
+ for (i=0; i<entities; i++)\r
+ {\r
+ dx=entity[i].x-xwin+16;\r
+ dy=entity[i].y-ywin+16;\r
+\r
+ if (dx<0 || dx>sx+chr[entity[i].chrindex].fxsize) continue;\r
+ if (dy<0 || dy>sy+chr[entity[i].chrindex].fysize) continue;\r
+ entidx[cc]=i; cc++;\r
+ }\r
+}\r
+\r
+void MoveRight(int i)\r
+{\r
+ int tx,ty;\r
+\r
+ tx=entity[i].tx+1; ty=entity[i].ty;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+ if (entity[i].facing!=3)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].x++; entity[i].facing=3; entity[i].moving=4; entity[i].ctr=15;\r
+ entity[i].tx++; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void MoveLeft(int i)\r
+{\r
+ int tx, ty;\r
+\r
+ tx=entity[i].tx-1; ty=entity[i].ty;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+\r
+ if (entity[i].facing!=2)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].x--; entity[i].facing=2; entity[i].moving=3; entity[i].ctr=15;\r
+ entity[i].tx--; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void MoveUp(int i)\r
+{\r
+ int tx, ty;\r
+\r
+ tx=entity[i].tx; ty=entity[i].ty-1;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+ if (entity[i].facing!=1)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].y--; entity[i].facing=1; entity[i].moving=2; entity[i].ctr=15;\r
+ entity[i].ty--; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void MoveDown(int i)\r
+{\r
+ int tx, ty;\r
+\r
+ tx=entity[i].tx; ty=entity[i].ty+1;\r
+ if (entity[i].obsmode1 && (ObstructionAt(tx,ty) || AEntityObsAt(tx,ty)))\r
+ { movesuccess=0; return; }\r
+ if (entity[i].facing!=0)\r
+ {\r
+ entity[i].delayct=0;\r
+ entity[i].animofs=0;\r
+ }\r
+ entity[i].y++; entity[i].facing=0; entity[i].moving=1; entity[i].ctr=15;\r
+ entity[i].ty++; movesuccess=1; entity[i].reset=0;\r
+}\r
+\r
+void Wander1(int i)\r
+{\r
+ if (!entity[i].data1)\r
+ {\r
+ entity[i].data2=rnd(0,3);\r
+ entity[i].data1=entity[i].step+1;\r
+ }\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr++;\r
+ if (entity[i].delayctr>=entity[i].delay)\r
+ entity[i].data1=0;\r
+ return;\r
+ }\r
+ if (entity[i].data1>1)\r
+ {\r
+ switch(entity[i].data2)\r
+ {\r
+ case 0: MoveUp(i); break;\r
+ case 1: MoveDown(i); break;\r
+ case 2: MoveLeft(i); break;\r
+ case 3: MoveRight(i); break;\r
+ }\r
+ entity[i].data1--;\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr=0;\r
+ entity[i].animofs=0;\r
+ entity[i].delayct=0;\r
+ }\r
+ }\r
+}\r
+\r
+void Wander2(int i)\r
+{\r
+ if (!entity[i].data1)\r
+ {\r
+ entity[i].data3=rnd(0,3);\r
+ entity[i].data1=entity[i].step+1;\r
+ }\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr++;\r
+ if (entity[i].delayctr>=entity[i].delay)\r
+ entity[i].data1=0;\r
+ return;\r
+ }\r
+ if (entity[i].data1>1)\r
+ {\r
+ switch(entity[i].data3)\r
+ {\r
+ case 0: if (Zone(entity[i].tx,entity[i].ty-1)==entity[i].data2) MoveUp(i); break;\r
+ case 1: if (Zone(entity[i].tx,entity[i].ty+1)==entity[i].data2) MoveDown(i); break;\r
+ case 2: if (Zone(entity[i].tx-1,entity[i].ty)==entity[i].data2) MoveLeft(i); break;\r
+ case 3: if (Zone(entity[i].tx+1,entity[i].ty)==entity[i].data2) MoveRight(i); break;\r
+ }\r
+ entity[i].data1--;\r
+ if (entity[i].data1==1) entity[i].delayctr=0;\r
+ }\r
+}\r
+\r
+void Wander3(int i)\r
+{\r
+ if (!entity[i].data1)\r
+ {\r
+ entity[i].data2=rnd(0,3);\r
+ entity[i].data1=entity[i].step+1;\r
+ }\r
+ if (entity[i].data1==1)\r
+ {\r
+ entity[i].delayctr++;\r
+ if (entity[i].delayctr>=entity[i].delay)\r
+ entity[i].data1=0;\r
+ return;\r
+ }\r
+ if (entity[i].data1>1)\r
+ {\r
+ switch(entity[i].data2)\r
+ {\r
+ case 0: if (entity[i].ty>entity[i].data3) MoveUp(i); break;\r
+ case 1: if (entity[i].ty<entity[i].data6) MoveDown(i); break;\r
+ case 2: if (entity[i].tx>entity[i].data2) MoveLeft(i); break;\r
+ case 3: if (entity[i].tx<entity[i].data5) MoveRight(i); break;\r
+ }\r
+ entity[i].data1--;\r
+ if (entity[i].data1==1) entity[i].delayct=0;\r
+ }\r
+}\r
+\r
+void Whitespace(int i)\r
+{\r
+ while (*entity[i].scriptofs==' ')\r
+ entity[i].scriptofs++;\r
+}\r
+\r
+void GetArgMS(int i)\r
+{ int j;\r
+ char token[10];\r
+\r
+ j=0;\r
+ Whitespace(i);\r
+ while (*entity[i].scriptofs>=48 && *entity[i].scriptofs<=57)\r
+ {\r
+ token[j]=*entity[i].scriptofs;\r
+ entity[i].scriptofs++;\r
+ j++;\r
+ }\r
+ token[j]=0;\r
+ entity[i].data1=atoi(token);\r
+}\r
+\r
+void GetNextCommandMS(int i)\r
+{ unsigned char s;\r
+\r
+ Whitespace(i);\r
+ s=*entity[i].scriptofs;\r
+ entity[i].scriptofs++;\r
+ switch (s)\r
+ {\r
+ case 'U': entity[i].mode=1; GetArgMS(i); break;\r
+ case 'D': entity[i].mode=2; GetArgMS(i); break;\r
+ case 'L': entity[i].mode=3; GetArgMS(i); break;\r
+ case 'R': entity[i].mode=4; GetArgMS(i); break;\r
+ case 'S': entity[i].mode=5; GetArgMS(i); break;\r
+ case 'W': entity[i].mode=6; GetArgMS(i); entity[i].animofs=0;\r
+ entity[i].delayct=0; break;\r
+ case 0: switch (entity[i].facing)\r
+ {\r
+ case 0: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].didle; break;\r
+ case 1: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].uidle; break;\r
+ case 2: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].lidle; break;\r
+ case 3: entity[i].animofs=0; entity[i].frame=chr[entity[i].chrindex].ridle; break;\r
+ }\r
+ entity[i].movecode=0; entity[i].mode=7; entity[i].data1=0;\r
+ entity[i].scriptofs=0; entity[i].delayct=0; break;\r
+ case 'C': entity[i].mode=8; GetArgMS(i); break;\r
+ case 'B': entity[i].mode=9; break;\r
+ case 'X': entity[i].mode=10; GetArgMS(i); break;\r
+ case 'Y': entity[i].mode=11; GetArgMS(i); break;\r
+ case 'F': entity[i].mode=12; GetArgMS(i); break;\r
+ case 'Z': entity[i].mode=13; GetArgMS(i); break;\r
+ default: err("Invalid entity movement script.");\r
+ }\r
+}\r
+\r
+void MoveScript(int i)\r
+{\r
+ if (!entity[i].scriptofs) entity[i].scriptofs=(char *) (int) ms+(int) msbuf[entity[i].movescript];\r
+ if (!entity[i].mode) GetNextCommandMS(i);\r
+\r
+ switch(entity[i].mode)\r
+ {\r
+ case 1: MoveUp(i); if (movesuccess) entity[i].data1--; break;\r
+ case 2: MoveDown(i); if (movesuccess) entity[i].data1--; break;\r
+ case 3: MoveLeft(i); if (movesuccess) entity[i].data1--; break;\r
+ case 4: MoveRight(i); if (movesuccess) entity[i].data1--; break;\r
+ case 5: entity[i].speed=entity[i].data1; entity[i].data1=0; break;\r
+ case 6: entity[i].data1--; break;\r
+ case 7: return;\r
+ case 8: ExecuteEvent(entity[i].data1); entity[i].data1=0; break;\r
+ case 9: entity[i].scriptofs=(char *) (int) ms+(int) msbuf[entity[i].movescript];\r
+ entity[i].data1=0; break;\r
+ case 10: if (entity[i].tx<entity[i].data1) MoveRight(i);\r
+ if (entity[i].tx>entity[i].data1) MoveLeft(i);\r
+ if (entity[i].tx==entity[i].data1) entity[i].data1=0; break;\r
+ break;\r
+ case 11: if (entity[i].ty<entity[i].data1) MoveDown(i);\r
+ if (entity[i].ty>entity[i].data1) MoveUp(i);\r
+ if (entity[i].ty==entity[i].data1) entity[i].data1=0; break;\r
+ break;\r
+ case 12: entity[i].facing=entity[i].data1;\r
+ entity[i].data1=0;\r
+ //--- zero 5.6.99\r
+ switch(entity[i].facing)\r
+ {\r
+ case 0: entity[i].frame=chr[entity[i].chrindex].didle; break;\r
+ case 1: entity[i].frame=chr[entity[i].chrindex].uidle; break;\r
+ case 2: entity[i].frame=chr[entity[i].chrindex].lidle; break;\r
+ case 3: entity[i].frame=chr[entity[i].chrindex].ridle; break;\r
+ }\r
+ //---\r
+ break;\r
+ case 13: entity[i].specframe=entity[i].data1;\r
+ entity[i].data1=0; break;\r
+ }\r
+ if (!entity[i].data1) entity[i].mode=0;\r
+}\r
+\r
+void TestActive(int i)\r
+{\r
+ int dx, dy;\r
+\r
+ dx=abs(entity[i].x - player->x);\r
+ dy=abs(entity[i].y - player->y);\r
+ if ((dx<=16 && dy<=3) || (dx<=3 && dy<=16))\r
+ {\r
+ if (!entity[i].expand4 && !invc)\r
+ {\r
+ entity[i].expand4=1;\r
+ ExecuteEvent(entity[i].actscript);\r
+ }\r
+ }\r
+ else\r
+ entity[i].expand4=0;\r
+}\r
+\r
+void ProcessEntity1(int i)\r
+{\r
+ entity[i].speedct=0;\r
+ if (entity[i].actm) TestActive(i);\r
+\r
+ if (!entity[i].moving)\r
+ {\r
+ switch(entity[i].movecode)\r
+ {\r
+ case 0: return;\r
+ case 1: Wander1(i); break;\r
+ case 2: Wander2(i); break;\r
+ case 3: Wander3(i); break;\r
+ case 4: MoveScript(i); break;\r
+ default: err("unknown entity movement pattern.");\r
+ }\r
+ if (!entity[i].reset) return;\r
+ }\r
+\r
+ if (entity[i].reset)\r
+ {\r
+ entity[i].animofs=0;\r
+ entity[i].delayct=0;\r
+ entity[i].reset=0;\r
+ }\r
+\r
+ if (entity[i].moving)\r
+ {\r
+ if (entity[i].moving==1)\r
+ { entity[i].y++; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (entity[i].moving==2)\r
+ { entity[i].y--; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (entity[i].moving==4)\r
+ { entity[i].x++; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (entity[i].moving==3)\r
+ { entity[i].x--; entity[i].ctr--; AnimateEntity(&entity[i]); }\r
+ if (!entity[i].ctr) { entity[i].reset=1; entity[i].moving=0; }\r
+ }\r
+}\r
+\r
+void ProcessEntity(int i)\r
+{ int j;\r
+\r
+ if (player==&entity[i]) return;\r
+ if (entity[i].speed<4)\r
+ {\r
+ switch (entity[i].speed)\r
+ {\r
+ case 1: if (entity[i].speedct<3) { entity[i].speedct++; return; }\r
+ case 2: if (entity[i].speedct<2) { entity[i].speedct++; return; }\r
+ case 3: if (entity[i].speedct<1) { entity[i].speedct++; return; }\r
+ }\r
+ }\r
+ if (entity[i].speed<5)\r
+ {\r
+ ProcessEntity1(i);\r
+ entity[i].speedct=0;\r
+ }\r
+ switch (entity[i].speed)\r
+ {\r
+ case 5: for (j=0; j<2; j++) { ProcessEntity1(i); } return;\r
+ case 6: for (j=0; j<3; j++) { ProcessEntity1(i); } return;\r
+ case 7: for (j=0; j<4; j++) { ProcessEntity1(i); } return;\r
+ }\r
+}\r
+\r
+void ProcessEntities()\r
+{\r
+ int i;\r
+\r
+ SiftEntities();\r
+ for (i=0; i<entities; i++) ProcessEntity(i);\r
+}\r
+\r
+void EntityStat()\r
+{\r
+ Con_NextLine();\r
+ sprintf(strbuf,"There are \82%d~ entities on this map.",entities);\r
+ Con_Printf(strbuf);\r
+ sprintf(strbuf,"\82%d~ of those are onscreen / active.",cc);\r
+ Con_Printf(strbuf);\r
+}\r
+\r
+void ListActiveEnts()\r
+{ int i;\r
+\r
+ Con_NextLine();\r
+ Con_Printf("Active entities:");\r
+ for (i=0; i<cc; i++)\r
+ {\r
+ sprintf(strbuf,"\82%d~",entidx[i]);\r
+ Con_Printf(strbuf);\r
+ }\r
+}\r
+\r
+void EntityS()\r
+{ int i;\r
+\r
+ i=atoi((char *) args[1]);\r
+ Con_NextLine();\r
+\r
+ sprintf(strbuf,"Desc: \82%s~", entity[i].desc); Con_Printf(strbuf);\r
+ sprintf(strbuf,"tx: \82%d~ ty: \82%d~", entity[i].tx, entity[i].ty); Con_Printf(strbuf);\r
+ sprintf(strbuf,"CHR index: %d", entity[i].chrindex); Con_Printf(strbuf);\r
+}\r
+\r
+int AllocateEntity(int x1, int y1, char *fname)\r
+{\r
+ entity[entities].chrindex=CacheCHR(fname);\r
+ entity[entities].x=x1*16;\r
+ entity[entities].y=y1*16;\r
+ entity[entities].tx=x1;\r
+ entity[entities].ty=y1;\r
+ entity[entities].speed=4;\r
+ entity[entities].obsmode1=1;\r
+ entity[entities].obsmode2=1;\r
+ entities++;\r
+ return (entities-1);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef ENTITY_H\r
+#define ENTITY_H\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *scriptofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct\r
+{\r
+ byte *imagedata; // CHR frame data\r
+ int fxsize, fysize; // frame x/y dimensions\r
+ int hx, hy; // x/y obstruction hotspot\r
+ int totalframes; // total # of frames.\r
+ int lidle, ridle;\r
+ int uidle, didle;\r
+ char lanim[100];\r
+ char ranim[100];\r
+ char uanim[100];\r
+ char danim[100];\r
+} chrdata;\r
+\r
+extern chrlist_r chrlist[100];\r
+extern byte nmchr, playernum;\r
+extern entity_r *player;\r
+extern entity_r entity[256];\r
+extern chrdata chr[100];\r
+extern byte entities, numchrs;\r
+extern byte entidx[256], cc;\r
+\r
+void RenderEntities();\r
+void AnimateEntity(entity_r *p);\r
+void ProcessEntities();\r
+void SiftEntities();\r
+void LoadCHRList();\r
+void FreeCHRList();\r
+void EntityStat();\r
+void ListActiveEnts();\r
+void EntityS();\r
+int EntityAt(int ex, int ey);\r
+int EntityObsAt(int ex, int ey);\r
+int ObstructionAt(int ex, int ey);\r
+int CacheCHR(char *fname);\r
+int AllocateEntity(int x1, int y1, char *fname);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ported by aen\r
+\r
+#define FLI_H\r
+#include <sys/stat.h>\r
+#include <fcntl.h>\r
+#include <unistd.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#ifndef __WATCOMC__\r
+#define INT_MAX 0xFFFFFFFF\r
+#define INT_MIN 0\r
+#endif\r
+\r
+#ifndef MIN\r
+#define MIN(x,y) (((x) < (y)) ? (x) : (y))\r
+#define MAX(x,y) (((x) > (y)) ? (x) : (y))\r
+#define MID(x,y,z) MAX((x), MIN((y), (z)))\r
+#endif\r
+\r
+#ifndef ABS\r
+#define ABS(x) (((x) >= 0) ? (x) : (-(x)))\r
+#endif\r
+\r
+#ifndef SGN\r
+#define SGN(x) (((x) >= 0) ? 1 : -1)\r
+#endif\r
+\r
+#define FLI_MAGIC 0xAF11 // file header magic number\r
+#define FLC_MAGIC 0xAF12 // file magic number (Pro)\r
+#define FLI_FRAME_MAGIC 0xF1FA // frame header magic number\r
+#define FLI_FRAME_PREFIX 0xF100 // FLC's prefix info\r
+#define FLI_FRAME_USELESS 0x00A1 // FLC's garbage frame\r
+\r
+typedef struct\r
+{\r
+ int w,h;\r
+ byte *data;\r
+} BITMAP;\r
+\r
+#define FLI_OK 0 /* FLI player return values */\r
+#define FLI_EOF -1\r
+#define FLI_ERROR -2\r
+#define FLI_NOT_OPEN -3\r
+\r
+#ifdef __WATCOMC__\r
+#define PACKED\r
+#pragma pack(1);\r
+#endif\r
+\r
+#ifdef __DJGPP__\r
+#define PACKED __attribute__ ((packed))\r
+#endif\r
+\r
+typedef struct\r
+{\r
+ long size PACKED;\r
+ word type PACKED;\r
+ word frame_count PACKED;\r
+ word width PACKED;\r
+ word height PACKED;\r
+ word bpp PACKED;\r
+ word flags PACKED;\r
+ word speed PACKED;\r
+ long next_head PACKED;\r
+ long frames_in_table PACKED;\r
+ char reserved[102] PACKED;\r
+} FLI_HEADER;\r
+\r
+typedef struct\r
+{\r
+ quad size PACKED;\r
+ word type PACKED;\r
+ word chunks PACKED;\r
+ char pad[8] PACKED;\r
+} FLI_FRAME;\r
+\r
+typedef struct\r
+{\r
+ quad size PACKED;\r
+ word type PACKED;\r
+} FLI_CHUNK;\r
+\r
+#ifdef __WATCOMC__\r
+#pragma pack();\r
+#endif\r
+\r
+static int fli_status = FLI_NOT_OPEN; // current state of the FLI player\r
+\r
+int fli_bitmap_width = 0;\r
+int fli_bitmap_height = 0;\r
+byte *fli_bitmap_data = NULL; // current frame of the FLI\r
+byte fli_palette[768]; // current palette the FLI is using\r
+\r
+int fli_bmp_dirty_from = INT_MAX; // what part of fli_bitmap is dirty\r
+int fli_bmp_dirty_to = INT_MIN;\r
+int fli_pal_dirty_from = INT_MAX; // what part of fli_palette is dirty\r
+int fli_pal_dirty_to = INT_MIN;\r
+\r
+int fli_frame = 0; // current frame number in the FLI\r
+long speed;\r
+\r
+static int fli_file = 0; // the file we are reading\r
+\r
+static byte *fli_mem_data = NULL; // the memory FLI we are playing\r
+static int fli_mem_pos = 0; // position in the memory FLI\r
+\r
+static FLI_HEADER fli_header; // header structure\r
+static FLI_FRAME frame_header; // frame header structure\r
+\r
+// a block of temporary working memory\r
+byte *_scratch_mem = NULL;\r
+int _scratch_mem_size = 0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void reset_fli_variables(void);\r
+void close_fli(void);\r
+int next_fli_frame(int);\r
+int open_fli(char *);\r
+int open_memory_fli(byte *);\r
+\r
+void _grow_scratch_mem(int size)\r
+{\r
+ if (size > _scratch_mem_size) {\r
+ size = (size+1023) & 0xFFFFFC00;\r
+ _scratch_mem = realloc(_scratch_mem, size);\r
+ _scratch_mem_size = size;\r
+ }\r
+}\r
+\r
+void vsync()\r
+{\r
+ while (!(inp(986) & 8));\r
+}\r
+\r
+void set_palette_range(byte *pal, int from, int to, int sync)\r
+{\r
+ int i;\r
+\r
+ // swap?\r
+ if (to<from) { int t=from; from=to; to=t; }\r
+\r
+ // keep valid\r
+ if (from<0) from=0;\r
+ if (to>=256) to=255;\r
+\r
+ if (sync) vsync();\r
+\r
+ outp(968, from);\r
+ for (i=from; i<=to; i++)\r
+ {\r
+ outp(969, pal[(i*3)+0]);\r
+ outp(969, pal[(i*3)+1]);\r
+ outp(969, pal[(i*3)+2]);\r
+ }\r
+}\r
+\r
+static byte *fli_read(byte *buf, int size)\r
+{\r
+ int result;\r
+\r
+ if (fli_mem_data)\r
+ {\r
+ if (buf)\r
+ memcpy(buf, fli_mem_data+fli_mem_pos, size);\r
+ else\r
+ buf = fli_mem_data+fli_mem_pos;\r
+\r
+ fli_mem_pos += size;\r
+ }\r
+ else\r
+ {\r
+ if (!buf)\r
+ {\r
+ _grow_scratch_mem(size);\r
+ buf = _scratch_mem;\r
+ }\r
+\r
+ result = read(fli_file, buf, size);\r
+ if (result != size)\r
+ return NULL;\r
+ }\r
+ return buf;\r
+}\r
+\r
+static void fli_seek(int offset, int mode)\r
+{\r
+ if (fli_mem_data)\r
+ {\r
+ if (mode == SEEK_CUR)\r
+ fli_mem_pos += offset;\r
+ else\r
+ fli_mem_pos = offset;\r
+ }\r
+ else\r
+ lseek(fli_file, offset, mode);\r
+}\r
+\r
+// helpers for reading FLI chunk data\r
+#define READ_BYTE() ((sz-- > 0) ? *(((byte *)p)++) : 0)\r
+#define READ_CHAR() ((sz-- > 0) ? *(((signed char *)p)++) : 0)\r
+#define READ_SHORT() (((sz-=2) > 0) ? *(((signed short *)p)++) : 0)\r
+\r
+#define READ_BLOCK(pos, size) \\r
+ { \\r
+ if (sz >= (size)) \\r
+ { \\r
+ memcpy(pos, p, size); \\r
+ p += (size); \\r
+ sz -= (size); \\r
+ } \\r
+ else \\r
+ { \\r
+ char *_p = (char *)(pos); \\r
+ int _c; \\r
+ \\r
+ for (_c=0; _c < (size); _c++) \\r
+ *(_p++) = READ_BYTE(); \\r
+ } \\r
+ }\r
+\r
+#define READ_RLE_BYTE(pos, size) \\r
+ { \\r
+ memset(pos, READ_BYTE(), size); \\r
+ }\r
+\r
+#define READ_RLE_WORD(pos, size) \\r
+ { \\r
+ short *_p = (short *)(pos); \\r
+ short _v = READ_SHORT(); \\r
+ int _c; \\r
+ \\r
+ for (_c=0; _c < (size); _c++) \\r
+ *(_p++) = _v; \\r
+ }\r
+\r
+static void do_fli_256_color(byte *p, int sz)\r
+{\r
+ int packets;\r
+ int c, c2;\r
+ int offset;\r
+ int length;\r
+\r
+ offset = 0;\r
+ packets = READ_SHORT();\r
+ for (c=0; c<packets; c++)\r
+ {\r
+ offset += READ_BYTE();\r
+ length = READ_BYTE();\r
+ if (length == 0) length = 256;\r
+ for (c2=0; c2<length; c2++)\r
+ {\r
+ fli_palette[((offset+c2)*3)+0] = READ_BYTE() / 4;\r
+ fli_palette[((offset+c2)*3)+1] = READ_BYTE() / 4;\r
+ fli_palette[((offset+c2)*3)+2] = READ_BYTE() / 4;\r
+ }\r
+ fli_pal_dirty_from = MIN(fli_pal_dirty_from, offset);\r
+ fli_pal_dirty_to = MAX(fli_pal_dirty_to, offset+length-1);\r
+ offset += length;\r
+ }\r
+}\r
+\r
+static void do_fli_delta(byte *p, int sz)\r
+{\r
+ int lines;\r
+ int packets;\r
+ int size;\r
+ int x, y;\r
+\r
+ y = 0;\r
+ lines = READ_SHORT();\r
+\r
+ // for each line...\r
+ while (lines-- > 0)\r
+ {\r
+ packets = READ_SHORT();\r
+\r
+ while (packets < 0)\r
+ {\r
+ if (packets & 0x4000)\r
+ y -= packets;\r
+ else\r
+ fli_bitmap_data[(y*fli_bitmap_width)+fli_bitmap_width-1]=packets&0xff;\r
+ //fli_bitmap->line[y][fli_bitmap->w-1] = packets & 0xFF;\r
+\r
+ packets = READ_SHORT();\r
+ }\r
+ x=0;\r
+ while (packets-- > 0)\r
+ {\r
+ // skip bytes\r
+ x += READ_BYTE();\r
+\r
+ size = READ_CHAR();\r
+\r
+ // copy size words\r
+ if (size > 0)\r
+ {\r
+ READ_BLOCK(fli_bitmap_data+(y*fli_bitmap_width)+x, size*2);\r
+ //READ_BLOCK(fli_bitmap->line[y]+x, size*2);\r
+ x += size*2;\r
+ }\r
+ // repeat word -size times\r
+ else if (size < 0)\r
+ {\r
+ READ_RLE_WORD(fli_bitmap_data+(y*fli_bitmap_width)+x, -size);\r
+ //READ_RLE_WORD(fli_bitmap->line[y]+x, -size);\r
+ x -= size*2;\r
+ }\r
+ }\r
+ fli_bmp_dirty_from = MIN(fli_bmp_dirty_from, y);\r
+ fli_bmp_dirty_to = MAX(fli_bmp_dirty_to, y);\r
+ y++;\r
+ }\r
+}\r
+\r
+static void do_fli_color(byte *p, int sz)\r
+{\r
+ int packets;\r
+ int c, c2;\r
+ int offset;\r
+ int length;\r
+\r
+ offset = 0;\r
+ packets = READ_SHORT();\r
+\r
+ for (c=0; c<packets; c++)\r
+ {\r
+ offset += READ_BYTE();\r
+ length = READ_BYTE();\r
+ if (length == 0) length = 256;\r
+\r
+ for (c2=0; c2<length; c2++)\r
+ {\r
+ fli_palette[((offset+c2)*3)+0] = READ_BYTE();\r
+ fli_palette[((offset+c2)*3)+1] = READ_BYTE();\r
+ fli_palette[((offset+c2)*3)+2] = READ_BYTE();\r
+ }\r
+\r
+ fli_pal_dirty_from = MIN(fli_pal_dirty_from, offset);\r
+ fli_pal_dirty_to = MAX(fli_pal_dirty_to, offset+length-1);\r
+ offset += length;\r
+ }\r
+}\r
+\r
+static void do_fli_lc(byte *p, int sz)\r
+{\r
+ int lines;\r
+ int packets;\r
+ int size;\r
+ int x, y;\r
+\r
+ y = READ_SHORT();\r
+ lines = READ_SHORT();\r
+ fli_bmp_dirty_from = MIN(fli_bmp_dirty_from, y);\r
+ fli_bmp_dirty_to = MAX(fli_bmp_dirty_to, y+lines-1);\r
+\r
+ // for each line...\r
+ while (lines-- > 0)\r
+ {\r
+ packets = READ_BYTE();\r
+ x = 0;\r
+ while (packets-- > 0)\r
+ {\r
+ x += READ_BYTE();\r
+ size = READ_CHAR();\r
+\r
+ // copy size bytes\r
+ if (size > 0)\r
+ {\r
+ READ_BLOCK(fli_bitmap_data+(y*fli_bitmap_width)+x, size);\r
+ //READ_BLOCK(fli_bitmap->line[y]+x, size);\r
+ x += size;\r
+ }\r
+ else if (size < 0)\r
+ {\r
+ READ_RLE_BYTE(fli_bitmap_data+(y*fli_bitmap_width)+x, -size);\r
+ //READ_RLE_BYTE(fli_bitmap->line[y]+x, -size);\r
+ x -= size;\r
+ }\r
+ }\r
+ y++;\r
+ }\r
+}\r
+\r
+static void do_fli_black(byte *p, int sz)\r
+{\r
+ memset(fli_bitmap_data, 0, fli_bitmap_width*fli_bitmap_height);\r
+ //clear(fli_bitmap);\r
+\r
+ fli_bmp_dirty_from = 0;\r
+ fli_bmp_dirty_to = fli_bitmap_height-1;\r
+}\r
+\r
+static void do_fli_brun(byte *p, int sz)\r
+{\r
+ int packets;\r
+ int size;\r
+ int x, y;\r
+\r
+ // for each line...\r
+ for (y=0; y<fli_bitmap_height; y++)\r
+ {\r
+ packets = READ_BYTE();\r
+ x = 0;\r
+ while (packets-- > 0)\r
+ {\r
+ size = READ_CHAR();\r
+ if (size < 0)\r
+ {\r
+ READ_BLOCK(fli_bitmap_data+(y*fli_bitmap_width)+x, -size);\r
+ //READ_BLOCK(fli_bitmap->line[y]+x, -size);\r
+ x -= size;\r
+ }\r
+ // repeat byte size times\r
+ else if (size > 0)\r
+ {\r
+ READ_RLE_BYTE(fli_bitmap_data+(y*fli_bitmap_width)+x, size);\r
+ //READ_RLE_BYTE(fli_bitmap->line[y]+x, size);\r
+ x += size;\r
+ }\r
+ }\r
+ }\r
+ fli_bmp_dirty_from = 0;\r
+ fli_bmp_dirty_to = fli_bitmap_height-1;\r
+}\r
+\r
+static void do_fli_copy(byte *p, int sz)\r
+{\r
+ READ_BLOCK(fli_bitmap_data, fli_bitmap_width * fli_bitmap_height);\r
+ //READ_BLOCK(fli_bitmap->dat, fli_bitmap->w * fli_bitmap->h);\r
+\r
+ fli_bmp_dirty_from = 0;\r
+ fli_bmp_dirty_to = fli_bitmap_height-1;\r
+}\r
+\r
+static void read_frame()\r
+{\r
+ byte *p;\r
+ FLI_CHUNK *chunk;\r
+ int c, sz;\r
+\r
+ if (fli_status != FLI_OK)\r
+ return;\r
+\r
+get_another_frame:\r
+ if (!fli_read((byte *)&frame_header, sizeof(FLI_FRAME)))\r
+ {\r
+ fli_status = FLI_ERROR;\r
+ return;\r
+ }\r
+\r
+ if ((frame_header.type == FLI_FRAME_PREFIX)\r
+ || (frame_header.type == FLI_FRAME_USELESS))\r
+ {\r
+ fli_seek(frame_header.size-sizeof(FLI_FRAME), SEEK_CUR);\r
+ fli_frame++;\r
+\r
+ goto get_another_frame;\r
+ }\r
+\r
+ if (frame_header.type != FLI_FRAME_MAGIC)\r
+ {\r
+ fli_status = FLI_ERROR;\r
+ return;\r
+ }\r
+\r
+ if (frame_header.size == sizeof(FLI_FRAME))\r
+ {\r
+ fli_frame++;\r
+ return;\r
+ }\r
+ p = fli_read(NULL, frame_header.size-sizeof(FLI_FRAME));\r
+ if (!p)\r
+ {\r
+ fli_status = FLI_ERROR;\r
+ return;\r
+ }\r
+ for (c=0; c<frame_header.chunks; c++)\r
+ {\r
+ chunk = (FLI_CHUNK *)p;\r
+ sz = chunk->size - sizeof(FLI_CHUNK);\r
+ p += sizeof(FLI_CHUNK);\r
+ switch (chunk->type)\r
+ {\r
+ case 4: do_fli_256_color(p, sz); break;\r
+ case 7: do_fli_delta(p, sz); break;\r
+ case 11: do_fli_color(p, sz); break;\r
+ case 12: do_fli_lc(p, sz); break;\r
+ case 13: do_fli_black(p, sz); break;\r
+ case 15: do_fli_brun(p, sz); break;\r
+ case 16: do_fli_copy(p, sz); break;\r
+ default: err("Corrupt FLI chunk.");\r
+ }\r
+ p = ((byte *)chunk) + chunk->size;\r
+ }\r
+ fli_frame++;\r
+}\r
+\r
+static int do_play_fli(BITMAP *bmp, int loop, int (*callback)())\r
+{\r
+ int ret;\r
+\r
+ ret = next_fli_frame(loop);\r
+ while (ret == FLI_OK)\r
+ {\r
+ if (fli_pal_dirty_from <= fli_pal_dirty_to)\r
+ set_palette_range(fli_palette, fli_pal_dirty_from, fli_pal_dirty_to, 1);\r
+\r
+ if (fli_bmp_dirty_from <= fli_bmp_dirty_to)\r
+ {\r
+ int i,to=fli_bmp_dirty_to;\r
+ if (to>=bmp->h) to=bmp->h-1;\r
+\r
+// vsync();\r
+ for (i=fli_bmp_dirty_from; i<=to; i++)\r
+ {\r
+ memcpy(bmp->data+(i*bmp->w), fli_bitmap_data+(i*fli_bitmap_width),\r
+ (fli_bitmap_width>bmp->w) ? bmp->w : fli_bitmap_width);\r
+ }\r
+\r
+ //blit(\r
+ // fli_bitmap, bmp, 0, fli_bmp_dirty_from, 0, fli_bmp_dirty_from,\r
+ // fli_bitmap->w, 1+fli_bmp_dirty_to-fli_bmp_dirty_from);\r
+ }\r
+\r
+ reset_fli_variables();\r
+\r
+ if (callback)\r
+ {\r
+ ret = (*callback)();\r
+ if (ret != FLI_OK)\r
+ break;\r
+ }\r
+ ret = next_fli_frame(loop);\r
+ while (timer_count<speed) ShowPage();\r
+ timer_count=0;\r
+ }\r
+\r
+ close_fli();\r
+\r
+ return (ret == FLI_EOF) ? FLI_OK : ret;\r
+}\r
+\r
+int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)())\r
+{\r
+ if (open_fli(filename) != FLI_OK)\r
+ return FLI_ERROR;\r
+\r
+ return do_play_fli(bmp, loop, callback);\r
+}\r
+\r
+int play_memory_fli(byte *fli_data, BITMAP *bmp, int loop, int (*callback)())\r
+{\r
+ if (open_memory_fli(fli_data) != FLI_OK)\r
+ return FLI_ERROR;\r
+\r
+ return do_play_fli(bmp, loop, callback);\r
+}\r
+\r
+static int do_open_fli()\r
+{\r
+ // read the header\r
+ if (!fli_read((byte *)&fli_header, sizeof(FLI_HEADER)))\r
+ {\r
+ close_fli();\r
+ return FLI_ERROR;\r
+ }\r
+\r
+ // check magic numbers\r
+ if (((fli_header.bpp != 8) && (fli_header.bpp != 0))\r
+ || ((fli_header.type != FLI_MAGIC) && (fli_header.type != FLC_MAGIC)))\r
+ {\r
+ close_fli();\r
+ return FLI_ERROR;\r
+ }\r
+\r
+ if (fli_header.width == 0)\r
+ fli_header.width = 320;\r
+\r
+ if (fli_header.height == 0)\r
+ fli_header.height = 200;\r
+\r
+ // create the frame bitmap\r
+ fli_bitmap_width=fli_header.width;\r
+ fli_bitmap_height=fli_header.height;\r
+ fli_bitmap_data=(byte *)malloc(fli_bitmap_width*fli_bitmap_height);\r
+ if (!fli_bitmap_data)\r
+ {\r
+ close_fli();\r
+ return FLI_ERROR;\r
+ }\r
+\r
+ reset_fli_variables();\r
+ fli_frame = 0;\r
+ fli_status = FLI_OK;\r
+\r
+ if (fli_header.type == FLI_MAGIC)\r
+ speed = (long)fli_header.speed * 100 / 70;\r
+ else\r
+ speed = (long)fli_header.speed / 10;\r
+\r
+ if (speed == 0)\r
+ speed = 100;\r
+\r
+ return fli_status;\r
+}\r
+\r
+int open_fli(char *filename)\r
+{\r
+ if (fli_status != FLI_NOT_OPEN)\r
+ return FLI_ERROR;\r
+ fli_file = open(filename, O_RDONLY | O_BINARY, S_IRUSR | S_IWUSR);\r
+ if (fli_file < 0)\r
+ {\r
+ fli_file = 0;\r
+ return FLI_ERROR;\r
+ }\r
+ return do_open_fli();\r
+}\r
+\r
+int open_memory_fli(byte *fli_data)\r
+{\r
+ if (fli_status != FLI_NOT_OPEN)\r
+ return FLI_ERROR;\r
+ fli_mem_data = fli_data;\r
+ fli_mem_pos = 0;\r
+ return do_open_fli();\r
+}\r
+\r
+void close_fli()\r
+{\r
+ //remove_int(fli_timer_callback);\r
+\r
+ if (fli_file)\r
+ {\r
+ close(fli_file);\r
+ fli_file = 0;\r
+ }\r
+\r
+ if (fli_bitmap_data)\r
+ {\r
+ free(fli_bitmap_data);\r
+ fli_bitmap_data = NULL;\r
+ }\r
+\r
+ fli_mem_data = NULL;\r
+ fli_mem_pos = 0;\r
+ reset_fli_variables();\r
+ fli_status = FLI_NOT_OPEN;\r
+}\r
+\r
+int next_fli_frame(int loop)\r
+{\r
+ if (fli_status != FLI_OK)\r
+ return fli_status;\r
+\r
+ //fli_timer--;\r
+\r
+ // end of file? should we loop?\r
+ if (fli_frame >= fli_header.frame_count)\r
+ {\r
+ if (loop)\r
+ {\r
+ fli_seek(sizeof(FLI_HEADER), SEEK_SET);\r
+ fli_frame = 0;\r
+ }\r
+ else\r
+ {\r
+ fli_status = FLI_EOF;\r
+ return fli_status;\r
+ }\r
+ }\r
+ read_frame();\r
+ return fli_status;\r
+}\r
+\r
+void reset_fli_variables()\r
+{\r
+ fli_bmp_dirty_from = INT_MAX;\r
+ fli_bmp_dirty_to = INT_MIN;\r
+ fli_pal_dirty_from = INT_MAX;\r
+ fli_pal_dirty_to = INT_MIN;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef FLI_H\r
+#define FLI_H\r
+\r
+typedef struct\r
+{\r
+ int w,h;\r
+ byte *data;\r
+} BITMAP;\r
+\r
+int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)());\r
+int play_memory_fli(byte *fli_data, BITMAP *bmp, int loop, int (*callback)());\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define FONT_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+struct fontstruct\r
+{\r
+ byte width, height; // Font character dimensions\r
+ byte *data; // Font bitmap data\r
+};\r
+\r
+struct fontstruct font[10]; // Font stuff;\r
+int numfonts=0; // number of loaded fonts.\r
+int curx, cury; // x/y font location\r
+char tc=0; // text color\r
+\r
+// ================================= Code ====================================\r
+\r
+int LoadFont(char *fname)\r
+{ VFILE *f=0;\r
+ struct fontstruct *cfont=0;\r
+ int z=0;\r
+\r
+ if (!(f=vopen(fname)))\r
+ err("Could not open font %s. \n",fname);\r
+\r
+ // alias current font struct\r
+ cfont=font+numfonts;\r
+\r
+ if (vgetc(f) != 1)\r
+ err("Font file incorrect version number. \n");\r
+\r
+ // font dims\r
+ cfont->width=vgetw(f);\r
+ cfont->height=vgetw(f);\r
+\r
+ // get num of sub-set; calc total bytes as well\r
+ z=vgetw(f) * 96 * cfont->width*cfont->height;\r
+\r
+ // nab room for font and read it in\r
+ cfont->data=(byte *)valloc(z, "LoadFont:cfont->data", OID_IMAGE);\r
+ vread(cfont->data, z, f);\r
+\r
+ vclose(f);\r
+\r
+ return numfonts++;\r
+}\r
+\r
+void TextColor(int c)\r
+{\r
+ tc=c;\r
+}\r
+\r
+void GotoXY(int x, int y)\r
+{\r
+ curx=x;\r
+ cury=y;\r
+}\r
+\r
+static void pchar(int fnt, int x, int y, unsigned char c)\r
+{\r
+ int w;\r
+ if (c>31 && c<127)\r
+ {\r
+ w=font[fnt].width,h=font[fnt].height;\r
+ TCopySpriteClip(x,y, w,h, font[fnt].data+((c-32)*w*h)+((tc&3)*96*w*h));\r
+ }\r
+}\r
+\r
+void printstring(int fnt, char *str)\r
+{\r
+ if (fnt<0 || fnt >= numfonts)\r
+ return;\r
+ for (; *str; str++)\r
+ {\r
+ unsigned char c=*str;\r
+ switch (c)\r
+ {\r
+ case 126: tc=0; str++; continue;\r
+ case 128: tc=1; str++; continue;\r
+ case 129: tc=2; str++; continue;\r
+ case 130: tc=3; str++; continue;\r
+ }\r
+ pchar(fnt,curx,cury,c);\r
+ curx+=font[fnt].width;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef FONT_H\r
+#define FONT_H\r
+\r
+struct fontstruct\r
+{\r
+ byte width, height; // Font character dimensions\r
+ byte *data; // Font bitmap data\r
+};\r
+\r
+extern struct fontstruct font[10]; // Font stuff;\r
+extern int numfonts; // number of loaded fonts.\r
+extern int curx, cury;\r
+\r
+extern int LoadFont(char *fname);\r
+extern void TextColor(int c);\r
+extern void NumColor(int c);\r
+extern void GotoXY(int x, int y);\r
+extern void printstring(int fnt, char *str);\r
+extern void dec_to_asciiz(int num, char *buf);\r
+\r
+#endif // FONT_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Mega kudos to aen for porting that GIF code.\r
+\r
+#include <conio.h>\r
+#include "verge.h"\r
+\r
+// ========================= PCX Imaging routines ============================\r
+\r
+char manufacturer; // pcx header\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+word xmin, ymin;\r
+word xmax, ymax;\r
+word hres, vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+word bytes_per_line;\r
+word palette_type;\r
+char filler[58];\r
+\r
+word width, depth;\r
+word bytes;\r
+byte c, run, ss=0;\r
+quad vidoffset, n=0;\r
+VFILE *pcxf;\r
+char *cb,*src;\r
+int i;\r
+\r
+// ================================= Code ====================================\r
+\r
+void ReadPCXLine(byte *dest)\r
+{ n=0;\r
+ while (n<width)\r
+ {\r
+ run=1;\r
+ c=vgetc(pcxf); //*src++;\r
+ if (c>=0xc0) //(c & 0xc0)==0xc0)\r
+ {\r
+ run=c & 0x3f;\r
+ c=vgetc(pcxf); //*src++;\r
+ }\r
+ while (run--)\r
+ dest[vidoffset+n++]=c;\r
+ }\r
+ vseek(pcxf, bytes_per_line-width, 1);\r
+}\r
+\r
+void LoadPCXHeader(char *fname)\r
+{\r
+ if (!(pcxf=vopen(fname))) err("Could not open PCX file %s.",fname);\r
+ vread(&manufacturer,1,pcxf);\r
+ vread(&version,1,pcxf);\r
+ vread(&encoding,1,pcxf);\r
+ vread(&bits_per_pixel,1,pcxf);\r
+ vread(&xmin,2,pcxf);\r
+ vread(&ymin,2,pcxf);\r
+ vread(&xmax,2,pcxf);\r
+ vread(&ymax,2,pcxf);\r
+ vread(&hres,2,pcxf);\r
+ vread(&vres,2,pcxf);\r
+ vread(&palette,48,pcxf);\r
+ vread(&reserved,1,pcxf);\r
+ vread(&color_planes,1,pcxf);\r
+ vread(&bytes_per_line,2,pcxf);\r
+ vread(&palette_type,2,pcxf);\r
+ vread(&filler,58,pcxf);\r
+ //vseek(pcxf,filesize(pcxf)-768,SEEK_SET);\r
+ //vread(&pal,768,pcxf);\r
+ vseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+\r
+ bytes=bytes_per_line;\r
+\r
+ //for (i=0; i<768; i++)\r
+ // pal[i]=pal[i] >> 2;\r
+// SetPalette((byte *) &pal);\r
+\r
+ //i=filesize(pcxf);\r
+ //cb=(char *) valloc(i-896, "LoadPCXHeader:cb", OID_TEMP);\r
+ //vread(cb, i-(128+768+1), pcxf);\r
+}\r
+\r
+void LoadPCXHeaderNP(char *fname)\r
+{\r
+ if (!(pcxf=vopen(fname))) err("Could not open PCX file %s.",fname);\r
+ vread(&manufacturer,1,pcxf);\r
+ vread(&version,1,pcxf);\r
+ vread(&encoding,1,pcxf);\r
+ vread(&bits_per_pixel,1,pcxf);\r
+ vread(&xmin,2,pcxf);\r
+ vread(&ymin,2,pcxf);\r
+ vread(&xmax,2,pcxf);\r
+ vread(&ymax,2,pcxf);\r
+ vread(&hres,2,pcxf);\r
+ vread(&vres,2,pcxf);\r
+ vread(&palette,48,pcxf);\r
+ vread(&reserved,1,pcxf);\r
+ vread(&color_planes,1,pcxf);\r
+ vread(&bytes_per_line,2,pcxf);\r
+ vread(&palette_type,2,pcxf);\r
+ vread(&filler,58,pcxf);\r
+ vseek(pcxf,filesize(pcxf)-768,SEEK_SET);\r
+ vread(&pal,768,pcxf);\r
+ vseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+\r
+ i=filesize(pcxf);\r
+ cb=(char *) valloc(i-896, "LoadPCXHeaderNP:cb", OID_TEMP);\r
+ vread(cb, i-896, pcxf);\r
+}\r
+\r
+void LoadPCX(char *fname, byte *dest)\r
+{\r
+ LoadPCXHeader(fname);\r
+\r
+ src=cb;\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=(i*width);\r
+ ReadPCXLine(dest);\r
+ }\r
+ vfree(cb);\r
+ vclose(pcxf);\r
+}\r
+\r
+byte *LoadPCXBuf(char *fname)\r
+{ byte *buf=0;\r
+\r
+// LoadPCXHeaderNP(fname);\r
+ LoadPCXHeader(fname);\r
+ buf=(byte *) valloc(width*(depth+1), "LoadPCXBuf:buf", OID_IMAGE);\r
+ //src=cb;\r
+ for (vidoffset=0,i=0; i<depth; i++,vidoffset+=width)\r
+ ReadPCXLine(buf);\r
+ // palette avail?\r
+ if (12==vgetc(pcxf))\r
+ {\r
+ vread(pal,768,pcxf);\r
+ for (i=0; i<768; i++)\r
+ pal[i]>>=2;\r
+ }\r
+ //vfree(cb);\r
+ vclose(pcxf);\r
+ return buf;\r
+}\r
+\r
+// ========================= BMP Imaging routines ============================\r
+\r
+struct RGBQUAD\r
+{\r
+ unsigned char r,g,b,a;\r
+};\r
+\r
+struct RGBQUAD bmppalette[256];\r
+\r
+// ================================= Code ====================================\r
+\r
+byte *LoadBMPBuf(char *fname)\r
+{ byte pad[4], *buf;\r
+ VFILE* bmpfile;\r
+ int bwidth, bheight, y;\r
+\r
+ if (!(bmpfile=vopen(fname))) err("Could not open BMP file %s.",fname);\r
+ vseek(bmpfile, 18, SEEK_SET);\r
+ vread(&bwidth, 4, bmpfile); width=bwidth;\r
+ vread(&bheight, 4, bmpfile); depth=bheight;\r
+ vseek(bmpfile, 54, SEEK_SET);\r
+ vread(bmppalette, 1024, bmpfile);\r
+ buf=(byte*) valloc(bwidth*bheight, "LoadBMPBuf:buf", OID_IMAGE);\r
+\r
+ for (y=bheight-1; y>=0; y--)\r
+ {\r
+ vread((char *)((int)buf+y*width),width,bmpfile);\r
+ vread(pad,width%4,bmpfile);\r
+ }\r
+ for (y=0; y<256; y++)\r
+ {\r
+ pal[y*3]=bmppalette[y].b >> 2;\r
+ pal[y*3+1]=bmppalette[y].g >> 2;\r
+ pal[y*3+2]=bmppalette[y].r >> 2;\r
+ }\r
+ SetPalette((byte*)pal);\r
+ vclose(bmpfile);\r
+ return buf;\r
+}\r
+\r
+// ========================== GIF Imaging routines ===========================\r
+\r
+typedef unsigned char u8;\r
+typedef unsigned short u16;\r
+typedef unsigned long u32;\r
+\r
+typedef signed char s8;\r
+typedef signed short s16;\r
+typedef signed long s32;\r
+\r
+typedef struct\r
+{\r
+ u8 bits;\r
+ u8 background;\r
+ u8 * palette;\r
+ u8 * image;\r
+ s16 wide, deep;\r
+} gif_image_info;\r
+\r
+typedef struct\r
+{\r
+ char sig[7];\r
+ s16 screenwide, screendeep;\r
+ u8 hflags;\r
+ u8 background;\r
+ u8 aspect;\r
+} gif_header;\r
+\r
+typedef struct\r
+{\r
+ s16 top, left;\r
+ s16 wide, deep;\r
+ u8 iflags;\r
+} gif_image_descriptor;\r
+\r
+int NO_CODE = -1,// TRUE = 1,\r
+ ERROR_EOF = 0, ERROR_BAD_CODE = 1,\r
+ ERROR_BAD_HEADER = 2, ERROR_BAD_STARTCODE = 3,\r
+ ERROR_BAD_FIRST_CODE = 4, ERROR_BAD_FILE = 5,\r
+ ERROR_NO_IMAGE = 6;\r
+\r
+char* gif_error_messages[] =\r
+{\r
+ "Unexpected end of file\n",\r
+ "Bad code\n",\r
+ "Bad gif header\n",\r
+ "Bad symbol size\n",\r
+ "Bad first code\n",\r
+ "Error opening file\n",\r
+ "This file doesn't contain an image\n"\r
+};\r
+\r
+// read colour palette, vga palette values are 6 bit numbers\r
+// while gif allows for 8 bit so shift right to get correct colours\r
+\r
+u8* gif_read_palette(FILE* fp, s32 bytes)\r
+{\r
+ s32 i = 0;\r
+ u8* block = 0L;\r
+ s32 components = (bytes / 3) * 3;\r
+\r
+ block = (unsigned char *)valloc(components, "gif_read_palette:block", OID_IMAGE);\r
+\r
+ for (i = 0; i < components; ++i)\r
+ block[i] = fgetc(fp) >> 2;\r
+\r
+ return block;\r
+}\r
+\r
+// read a block of bytes into memory\r
+s32 block_mem_read(FILE* fp, u8* buffer, s32 bytes)\r
+{\r
+ s32 status = 0;\r
+\r
+ status = fread(buffer, 1, bytes, fp);\r
+ if (status != bytes) return EOF;\r
+\r
+ return TRUE;\r
+}\r
+\r
+// read a unsigned 16 bit value from file, low byte first; note that this\r
+// is reverse endian-ness (ie. fwrite(&s,1,2,fp); writes high byte first).\r
+\r
+s16 read_word_lbf(FILE* fp)\r
+{\r
+ s32 a, b;\r
+\r
+ a = fgetc(fp);\r
+ b = fgetc(fp);\r
+\r
+ return (b << 8) | a;\r
+}\r
+\r
+// read the GIF file header structure into a sequence\r
+gif_header* get_gif_header(FILE* fp)\r
+{\r
+ gif_header* h = 0L;\r
+\r
+ h = (gif_header *)valloc(sizeof(gif_header), "get_gif_header:h", OID_IMAGE);\r
+\r
+ fread(h->sig, 1, 6, fp);\r
+ h->sig[6] = 0;\r
+\r
+ if (strncmp(h->sig, "GIF", 3) != 0)\r
+ return NULL;\r
+\r
+ h->screenwide = read_word_lbf(fp); width=h->screenwide;\r
+ h->screendeep = read_word_lbf(fp); depth=h->screendeep;\r
+ h->hflags = fgetc(fp);\r
+ h->background = fgetc(fp);\r
+ h->aspect = fgetc(fp);\r
+\r
+ return h;\r
+}\r
+\r
+// gif file can contain more than one image,\r
+// each image is preceeded by a header structure\r
+gif_image_descriptor* get_image_descriptor(FILE* fp)\r
+{\r
+ gif_image_descriptor* id = 0L;\r
+\r
+ id = (gif_image_descriptor *)valloc(sizeof(gif_image_descriptor), "get_image_descriptor:id", OID_IMAGE);\r
+\r
+ id->left = read_word_lbf(fp);\r
+ id->top = read_word_lbf(fp);\r
+ id->wide = read_word_lbf(fp);\r
+ id->deep = read_word_lbf(fp);\r
+ id->iflags = fgetc(fp);\r
+\r
+ return id;\r
+}\r
+\r
+static u16 word_mask_table[] =\r
+{\r
+ 0x0000, 0x0001, 0x0003, 0x0007,\r
+ 0x000F, 0x001F, 0x003F, 0x007F,\r
+ 0x00FF, 0x01FF, 0x03FF, 0x07FF,\r
+ 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF\r
+};\r
+\r
+static u8 inc_table[] = { 8,8,4,2,0 };\r
+static u8 start_table[] = { 0,4,2,1,0 };\r
+\r
+// enables me to use indices as per EUPHORiA (ie. converts to C's 0 base)\r
+#define eui(i) ((i)-1)\r
+\r
+// unpack an LZW compressed image\r
+// returns a sequence containing screen display lines of the image\r
+u8* unpack_image(FILE* fp, s32 start_code_size, u32 width, u32 depth, u32 flags)\r
+{\r
+ u8* buffer;\r
+ u8* line_buffer;\r
+\r
+ u16 first_code_stack[4096];\r
+ u16 last_code_stack[4096];\r
+ u16 code_stack[4096];\r
+\r
+ s32 bits_left;\r
+ s32 clear_code;\r
+ s32 code_size;\r
+ s32 code_size2;\r
+ s32 next_code;\r
+ s32 this_code;\r
+ s32 old_token;\r
+ s32 current_code;\r
+ s32 old_code;\r
+ s32 block_size=0;\r
+ s32 line;\r
+ s32 a_byte;\r
+ s32 pass;\r
+ s32 u;\r
+\r
+ u8 b[256]; // read buffer; for block reads\r
+ u8* p; // current byte in read buffer\r
+ u8* q; // last byte in read buffer + 1\r
+\r
+ line_buffer = (u8 *)valloc(width, "unpack_image:line_buffer", OID_TEMP);\r
+ buffer = (u8 *)valloc(width * depth, "unpack_image:buffer", OID_IMAGE);\r
+\r
+ a_byte = 0;\r
+ line = 0;\r
+ pass = 0;\r
+ bits_left = 8;\r
+\r
+ if (start_code_size < 2 || start_code_size > 8)\r
+ err("\nERROR_BAD_STARTCODE"); // bad symbol size\r
+\r
+ p = b;\r
+ q = b;\r
+\r
+ clear_code = 1 << start_code_size; //pow(2, start_code_size);\r
+ next_code = clear_code + 2;\r
+ code_size = start_code_size + 1;\r
+ code_size2 = 1 << code_size; //pow(2, code_size);\r
+ old_code = NO_CODE;\r
+ old_token = NO_CODE;\r
+\r
+ while (1)\r
+ {\r
+ if (bits_left == 8)\r
+ {\r
+ ++p;\r
+ if (p >= q)\r
+ {\r
+ block_size = fgetc(fp);\r
+ if (block_mem_read(fp, b, block_size) == EOF)\r
+ err("\nERROR_EOF");\r
+ p = b;\r
+ q = b + block_size;\r
+ }\r
+ bits_left = 0;\r
+ }\r
+\r
+ this_code = *p;\r
+ current_code = code_size + bits_left;\r
+\r
+ if (current_code <= 8)\r
+ {\r
+ *p = *p >> code_size;\r
+ bits_left = current_code;\r
+ }\r
+ else\r
+ {\r
+ ++p;\r
+ if (p >= q)\r
+ {\r
+ block_size = fgetc(fp);\r
+ if (block_mem_read(fp, b, block_size) == EOF)\r
+ err("\nERROR_EOF");\r
+ p = b;\r
+ q = b + block_size;\r
+ }\r
+\r
+ this_code |= (*p << (8 - bits_left));\r
+\r
+ if (current_code <= 16)\r
+ {\r
+ bits_left = current_code - 8;\r
+ *p = *p >> bits_left;\r
+ }\r
+ else\r
+ {\r
+ if (++p >= q)\r
+ {\r
+ block_size = fgetc(fp);\r
+ if (block_mem_read(fp, b, block_size) == EOF)\r
+ err("\nERROR_EOF");\r
+ p = b;\r
+ q = b + block_size;\r
+ }\r
+\r
+ this_code |= (*p << (16 - bits_left));\r
+\r
+ bits_left = current_code - 16;\r
+ *p = *p >> bits_left;\r
+ }\r
+ }\r
+\r
+ this_code &= word_mask_table[code_size];\r
+ current_code = this_code;\r
+\r
+ if (this_code == (clear_code+1) || block_size == 0)\r
+ break;\r
+ if (this_code > next_code)\r
+ err("\nERROR_BAD_CODE");\r
+\r
+ if (this_code == clear_code)\r
+ {\r
+ next_code = clear_code + 2;\r
+ code_size = start_code_size + 1;\r
+ code_size2 = 1 << code_size; //pow(2, code_size);\r
+ old_code = NO_CODE;\r
+ old_token = NO_CODE;\r
+ }\r
+ else\r
+ {\r
+ u = 1;\r
+ if (this_code == next_code)\r
+ {\r
+ if (old_code == NO_CODE)\r
+ err("\nERROR_BAD_FIRST_CODE");\r
+\r
+ first_code_stack[eui(u)] = old_token;\r
+ u++;\r
+ this_code = old_code;\r
+ }\r
+\r
+ while (this_code >= clear_code)\r
+ {\r
+ first_code_stack[eui(u)] = last_code_stack[eui(this_code)];\r
+ u++;\r
+ this_code = code_stack[eui(this_code)];\r
+ }\r
+\r
+ old_token = this_code;\r
+ while (1)\r
+ {\r
+ line_buffer[a_byte] = this_code;\r
+ a_byte++;\r
+ if (a_byte >= width)\r
+ {\r
+ // full image line so add it into screen image\r
+ memcpy(buffer + (line * width), line_buffer, width);\r
+\r
+ a_byte = 0;\r
+ if (flags & 0x40)\r
+ {\r
+ line += inc_table[pass];\r
+ if (line >= depth)\r
+ {\r
+ pass++;\r
+ line = start_table[pass];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ line++;\r
+ }\r
+ }\r
+\r
+ // no more bytes on stack\r
+ if (u == 1) break;\r
+\r
+ u--;\r
+ this_code = first_code_stack[eui(u)];\r
+ }\r
+\r
+ if (next_code < 4096 && old_code != NO_CODE)\r
+ {\r
+ code_stack[eui(next_code)] = old_code;\r
+ last_code_stack[eui(next_code)] = old_token;\r
+ next_code++;\r
+ if (next_code >= code_size2 && code_size < 12)\r
+ {\r
+ code_size++;\r
+ code_size2 = 1 << code_size; //pow(2, code_size);\r
+ }\r
+ }\r
+\r
+ old_code = current_code;\r
+ }\r
+ }\r
+\r
+ // completed reading the image so return it\r
+ free(b);\r
+ return buffer;\r
+}\r
+\r
+// skip the extension blocks as we are only after the image\r
+void skip_extension(FILE* fp)\r
+{\r
+ s32 n;\r
+ char temp[256];\r
+\r
+ n = fgetc(fp); // throwaway extension function code\r
+ n = fgetc(fp); // get length of block\r
+\r
+ while (n > 0 && n != EOF)\r
+ {\r
+ // throwaway block\r
+ fread(temp, 1, n, fp);\r
+\r
+ n = fgetc(fp); // get length of next block\r
+ }\r
+}\r
+\r
+// unpack the GIF file\r
+// returns ImageInfo sequence containing image and image data\r
+gif_image_info* unpack_gif(char* filename)\r
+{\r
+ VFILE *f;\r
+ FILE* fp;\r
+ s32 c, b;\r
+ gif_header* h = 0L;\r
+ gif_image_info* ii = 0L;\r
+ gif_image_descriptor* id = 0L;\r
+ u8* local_palette = 0L;\r
+\r
+ ii = (gif_image_info *)valloc(sizeof(gif_image_info), "unpack_gif:ii", OID_IMAGE);\r
+\r
+ f = vopen(filename);\r
+ if (!f) err("Could not open GIF file %s.",filename);\r
+ fp = f->fp;\r
+ if (!fp) err("\nBad filename");\r
+\r
+ // file starts with the Logical Screen Descriptor structure\r
+ h = get_gif_header(fp);\r
+\r
+ // Size of Global Color Table\r
+ ii->bits = (h->hflags & 7) + 1;\r
+ ii->background = h->background;\r
+\r
+ // get Global colour palette if there is one\r
+ if (h->hflags & 0x80) // is flags bit 8 set?\r
+ {\r
+ c = 3 << ii->bits; // size of global colour map\r
+ ii->palette = gif_read_palette(fp, c);\r
+\r
+/* outp(968, 0);\r
+ // enforce global color map\r
+ for (s32 i=0; i < 768; ++i)\r
+ outp(969, ii->palette[i]); */\r
+ memcpy(pal, ii->palette, 768);\r
+ }\r
+\r
+ c = fgetc(fp);\r
+\r
+ while (c == 0x2c || c == 0x21 || c == 0)\r
+ {\r
+ // image separator so unpack the image\r
+ if (c == 0x2c)\r
+ {\r
+ id = get_image_descriptor(fp); // get the Image Descriptor\r
+ // if there is a local Color Table then overwrite the global table\r
+ if (id->iflags & 0x80)\r
+ {\r
+ ii->bits = (id->iflags & 7) + 1;\r
+ b = 3 << ii->bits;\r
+ if (local_palette)\r
+ free(local_palette);\r
+ local_palette = gif_read_palette(fp, b);\r
+ }\r
+\r
+ c = fgetc(fp); // get the LZW Minimum Code Size\r
+ ii->image = unpack_image(fp, c, id->wide, id->deep, id->iflags);\r
+ vclose(f);\r
+\r
+ // error reading image\r
+ if (!ii->image)\r
+ err("\nerror reading image data");\r
+\r
+ ii->wide = id->wide;\r
+ ii->deep = id->deep;\r
+\r
+ // return imagedata\r
+ return ii;\r
+ }\r
+ // extension introducer\r
+ else if (c == 0x21)\r
+ {\r
+ skip_extension(fp); // throw the extension away\r
+ }\r
+\r
+ c = fgetc(fp);\r
+ }\r
+\r
+ // no image?\r
+ return NULL;\r
+}\r
+\r
+byte *LoadGIFBuf(char *fname)\r
+{\r
+ gif_image_info *ii=0;\r
+ byte *t;\r
+\r
+ ii=unpack_gif(fname);\r
+ width=ii->wide;\r
+ depth=ii->deep;\r
+ t=ii->image;\r
+ free(ii);\r
+ return t;\r
+}\r
+\r
+// ====================== Universal Imaging Interface ========================\r
+\r
+byte imagetype;\r
+\r
+// ================================= Code ====================================\r
+\r
+void DetermineFileType(char *fname)\r
+{\r
+ strlwr(fname);\r
+ if (!strcmp(fname+(strlen(fname)-3),"pcx")) imagetype=0;\r
+ if (!strcmp(fname+(strlen(fname)-3),"gif")) imagetype=1;\r
+ if (!strcmp(fname+(strlen(fname)-3),"bmp")) imagetype=2;\r
+}\r
+\r
+void VLoadImage(char *fname, byte *dest)\r
+{\r
+ imagetype=255;\r
+ DetermineFileType(fname);\r
+ switch (imagetype)\r
+ {\r
+ case 0: LoadPCX(fname, dest); break;\r
+ case 1: err("VLoadImage() for GIF not supported; use VLoadImageBuf()"); break;\r
+ case 2: err("VLoadImage() for BMP not supported; use VLoadImageBuf()"); break;\r
+ default: err("%s: Unrecognized image type.",fname);\r
+ }\r
+}\r
+\r
+byte *VLoadImageBuf(char *fname)\r
+{\r
+ imagetype=255;\r
+ DetermineFileType(fname);\r
+ switch (imagetype)\r
+ {\r
+ case 0: return LoadPCXBuf(fname); break;\r
+ case 1: return LoadGIFBuf(fname); break;\r
+ case 2: return LoadBMPBuf(fname); break;\r
+ default: err("%s: Unrecognized image type.",fname);\r
+ }\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef IMAGE_H\r
+#define IMAGE_H\r
+\r
+word width, depth;\r
+\r
+void VLoadImage(char *fname, byte *dest);\r
+byte *VLoadImageBuf(char *fname);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(INTERINC)\r
+#define INTERINC\r
+\r
+#ifdef __WATCOMC__\r
+ #include <i86.h>\r
+ #define REGISTERS union REGS\r
+ #define SET_AX(r,v) (r).w.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).w.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).w.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).w.dx=(short)(v)\r
+ #define INTERRUPT(i,r) int386((i),&(r),&(r))\r
+#elif defined(__DJGPP__)\r
+ #include <dpmi.h>\r
+ #define REGISTERS __dpmi_regs\r
+ #define SET_AX(r,v) (r).x.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).x.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).x.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).x.dx=(short)(v)\r
+ #define INTERRUPT(i,r) __dpmi_int((i),&(r))\r
+// #define inp inportb\r
+ #define outp outportb\r
+ #define outpw outportw\r
+#endif // watcom | djgpp\r
+\r
+#endif // INTERINC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef KEYBOARD_H\r
+#define KEYBOARD_H\r
+\r
+extern volatile byte key[128];\r
+extern volatile byte last_pressed;\r
+extern int InitKeyboard(void);\r
+extern void ShutdownKeyboard(void);\r
+#ifdef DJGPP\r
+extern void keyboard_chain(int toggle);\r
+#endif\r
+\r
+/* Constants for keyboard scan-codes */\r
+\r
+#define SCAN_ESC 0x01\r
+#define SCAN_1 0x02\r
+#define SCAN_2 0x03\r
+#define SCAN_3 0x04\r
+#define SCAN_4 0x05\r
+#define SCAN_5 0x06\r
+#define SCAN_6 0x07\r
+#define SCAN_7 0x08\r
+#define SCAN_8 0x09\r
+#define SCAN_9 0x0a\r
+#define SCAN_0 0x0b\r
+#define SCAN_MINUS 0x0c\r
+#define SCAN_EQUALS 0x0d\r
+#define SCAN_BACKSP 0x0e\r
+#define SCAN_TAB 0x0f\r
+#define SCAN_Q 0x10\r
+#define SCAN_W 0x11\r
+#define SCAN_E 0x12\r
+#define SCAN_R 0x13\r
+#define SCAN_T 0x14\r
+#define SCAN_Y 0x15\r
+#define SCAN_U 0x16\r
+#define SCAN_I 0x17\r
+#define SCAN_O 0x18\r
+#define SCAN_P 0x19\r
+#define SCAN_LANGLE 0x1a\r
+#define SCAN_RANGLE 0x1b\r
+#define SCAN_ENTER 0x1c\r
+#define SCAN_CTRL 0x1d\r
+#define SCAN_A 0x1e\r
+#define SCAN_S 0x1f\r
+#define SCAN_D 0x20\r
+#define SCAN_F 0x21\r
+#define SCAN_G 0x22\r
+#define SCAN_H 0x23\r
+#define SCAN_J 0x24\r
+#define SCAN_K 0x25\r
+#define SCAN_L 0x26\r
+#define SCAN_SCOLON 0x27\r
+#define SCAN_QUOTA 0x28\r
+#define SCAN_RQUOTA 0x29\r
+#define SCAN_LSHIFT 0x2a\r
+#define SCAN_BSLASH 0x2b\r
+#define SCAN_Z 0x2c\r
+#define SCAN_X 0x2d\r
+#define SCAN_C 0x2e\r
+#define SCAN_V 0x2f\r
+#define SCAN_B 0x30\r
+#define SCAN_N 0x31\r
+#define SCAN_M 0x32\r
+#define SCAN_COMA 0x33\r
+#define SCAN_DOT 0x34\r
+#define SCAN_SLASH 0x35\r
+#define SCAN_RSHIFT 0x36\r
+#define SCAN_GREY_STAR 0x37\r
+#define SCAN_ALT 0x38\r
+#define SCAN_SPACE 0x39\r
+#define SCAN_CAPS 0x3a\r
+#define SCAN_F1 0x3b\r
+#define SCAN_F2 0x3c\r
+#define SCAN_F3 0x3d\r
+#define SCAN_F4 0x3e\r
+#define SCAN_F5 0x3f\r
+#define SCAN_F6 0x40\r
+#define SCAN_F7 0x41\r
+#define SCAN_F8 0x42\r
+#define SCAN_F9 0x43\r
+#define SCAN_F10 0x44\r
+#define SCAN_NUMLOCK 0x45\r
+#define SCAN_SCRLOCK 0x46\r
+#define SCAN_HOME 0x47\r
+#define SCAN_UP 0x48\r
+#define SCAN_PGUP 0x49\r
+#define SCAN_GREY_MINUS 0x4a\r
+#define SCAN_LEFT 0x4b\r
+#define SCAN_PAD_5 0x4c\r
+#define SCAN_RIGHT 0x4d\r
+#define SCAN_GREY_PLUS 0x4e\r
+#define SCAN_END 0x4f\r
+#define SCAN_DOWN 0x50\r
+#define SCAN_PGDN 0x51\r
+#define SCAN_INSERT 0x52\r
+#define SCAN_DEL 0x53\r
+#define SCAN_F11 0x57\r
+#define SCAN_F12 0x58\r
+#endif\r
--- /dev/null
+#\r
+# Copyright (C) 1998 BJ Eirich (aka vecna)\r
+# This program is free software; you can redistribute it and/or\r
+# modify it under the terms of the GNU General Public License\r
+# as published by the Free Software Foundation; either version 2\r
+# of the License, or (at your option) any later version.\r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. \r
+# See the GNU General Public Lic\r
+# See the GNU General Public License for more details.\r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+#\r
+\r
+ .file "keyboard.s"\r
+\r
+ .extern ___djgpp_base_address\r
+ .extern ___djgpp_ds_alias\r
+ .extern ___djgpp_dos_sel\r
+\r
+ # public functions and variables:\r
+\r
+ .global _key\r
+ .global _InitKeyboard\r
+ .global _ShutdownKeyboard\r
+ .global _keyboard_chain\r
+ .global _last_pressed\r
+\r
+ .text\r
+\r
+ .align 4\r
+\r
+locking_region_start:\r
+\r
+_key: .space 0x80, 0\r
+_last_pressed: .byte 0\r
+old_vector:\r
+old_vector_ofs: .long 0\r
+old_vector_sel: .word 0\r
+chain_flag: .long 1\r
+\r
+\r
+ .align 4\r
+\r
+handler_procedure:\r
+\r
+ #\r
+ # .. will be called every time a key is pressed/released\r
+ #\r
+ pushl %eax\r
+ pushl %edx\r
+ pushw %ds\r
+ #\r
+ # Load DS with our data selector\r
+ #\r
+ movw %cs:___djgpp_ds_alias, %ds\r
+ #\r
+ # Read the scancode from keyboard port and update key[]\r
+ #\r
+ inb $0x60, %al\r
+ movb %al, %dl\r
+ andl $0x7f, %edx\r
+ testb $0x80, %al\r
+ setz _key(%edx)\r
+ cmp $127, %al\r
+ ja nolastpressed\r
+ movb %edx, _last_pressed\r
+nolastpressed:\r
+\r
+ #\r
+ # Chain if flag is set, otherwise do what's necessary and return\r
+ #\r
+ cmpl $0, chain_flag\r
+ jne handler_chain\r
+ #\r
+ # Acknowledge keyboard and interrupt contollers\r
+ #\r
+ inb $0x61, %al\r
+ orb $0x80, %al\r
+ outb %al, $0x61\r
+ andb $0x7f, %al\r
+ outb %al, $0x61\r
+ movb $0x20, %al\r
+ outb %al, $0x20\r
+\r
+ popw %ds\r
+ popl %edx\r
+ popl %eax\r
+ sti\r
+ iret\r
+\r
+ .align 4\r
+\r
+handler_chain: popw %ds\r
+ popl %edx\r
+ popl %eax\r
+ ljmp %cs:(old_vector)\r
+\r
+locking_region_end:\r
+\r
+\r
+ .align 4\r
+_InitKeyboard:\r
+\r
+ #\r
+ # int keyboard_init(void);\r
+ #\r
+ # Initializes the keyboard handler and hooks the keyboard interrupt.\r
+ # Returns -1 on failure, zero on success\r
+ #\r
+ pushl %esi\r
+ pushl %edi\r
+ pushl %ebx\r
+ #\r
+ # First, we need to lock the handler and memory it touches, so\r
+ # it doesn't get swapped out to disk.\r
+ #\r
+ leal locking_region_start, %ecx\r
+ leal locking_region_end, %edi\r
+ subl %ecx, %edi\r
+ addl ___djgpp_base_address, %ecx\r
+ shldl $16, %ecx, %ebx # ecx -> bx:cx\r
+ shldl $16, %edi, %esi # edi -> si:di\r
+ movw $0x0600, %ax # lock linear region\r
+ int $0x31\r
+ jc init_error\r
+ #\r
+ # Now we need to save the old interrupt vector, so we can restore\r
+ # it later and also to know where to jump if chaining.\r
+ #\r
+ movw $0x0204, %ax # get pm int vector\r
+ movb $0x09, %bl\r
+ int $0x31\r
+ movw %cx, old_vector_sel\r
+ movl %edx, old_vector_ofs\r
+ #\r
+ # Make sure we chain after initialization.\r
+ #\r
+ movl $1, chain_flag\r
+ #\r
+ # Set the interrupt vector to point to our handler.\r
+ #\r
+ movw %cs, %cx\r
+ leal handler_procedure, %edx\r
+ movb $0x09, %bl\r
+ movw $0x0205, %ax # set pm int vector\r
+ int $0x31\r
+ #*\r
+ #* Actually we would have to unlock the locked region on failure\r
+ #* here. But since most programs would exit with an error message\r
+ #* in such case, there's no need to worry.\r
+ #*\r
+\r
+init_error:\r
+\r
+ #\r
+ # This sets EAX to -1 if CF is set and to 0 atherwise\r
+ #\r
+ movl $0, %eax\r
+ sbbl $0, %eax\r
+\r
+ popl %ebx\r
+ popl %edi\r
+ popl %esi\r
+ ret\r
+\r
+\r
+ .align 4\r
+_ShutdownKeyboard:\r
+\r
+ #\r
+ # void keyboard_close(void);\r
+ #\r
+ # Shuts the keyboard handler down.\r
+ #\r
+ pushl %esi\r
+ pushl %edi\r
+ pushl %ebx\r
+ #\r
+ # Unlock the region we locked at initialization\r
+ #\r
+ leal locking_region_start, %ecx\r
+ leal locking_region_end, %edi\r
+ subl %ecx, %edi\r
+ addl ___djgpp_base_address, %ecx\r
+ shldl $16, %ecx, %ebx\r
+ shldl $16, %edi, %esi\r
+ movw $0x0601, %ax # unlock linear region\r
+ int $0x31\r
+ #\r
+ # Restore the interrupt vector to its previous value\r
+ #\r
+ movw old_vector_sel, %cx\r
+ movl old_vector_ofs, %edx\r
+ movb $0x09, %bl\r
+ movw $0x0205, %ax # set pm int vector\r
+ int $0x31\r
+\r
+ popl %ebx\r
+ popl %edi\r
+ popl %esi\r
+ ret\r
+ #\r
+ # void keyboard_chain(int toggle);\r
+ #\r
+ .align 4\r
+_keyboard_chain:\r
+ cmpl $0, 4(%esp)\r
+ je chain_off\r
+chain_on:\r
+\r
+ #\r
+ # Set the chain_flag and clear BIOS shift/ctrl/alt status bits:\r
+ #\r
+ movl $1, chain_flag\r
+\r
+ push %es\r
+ movw ___djgpp_dos_sel, %es\r
+ andb $0xf0, %es:0x417\r
+ pop %es\r
+ jmp chain_done\r
+chain_off:\r
+ movl $0, chain_flag\r
+chain_done: ret\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MAIN_H\r
+#define MAIN_H\r
+\r
+//void *valloc(int amount);\r
+void err(char *message, ...);\r
+int sgn(int x);\r
+void ver();\r
+void CheckMessages();\r
+void Log(char *message, ...);\r
+void Logp(char *message, ...);\r
+void LogDone();\r
+void InitMouse(int, int);\r
+void ReadMouse();\r
+void SetMouse(int, int);\r
+\r
+extern char startmap[80], nocdaudio;\r
+extern int mx, my, mb;\r
+\r
+#define vfree(x) if (x) { free(x); x=0; }\r
+\r
+#ifndef DJGPP\r
+#define strncasecmp strnicmp\r
+#define strcasecmp strcmpi\r
+#endif\r
+\r
+#endif\r
--- /dev/null
+CC = gcc\r
+CFLAGS = -s -Wall -Werror\r
+\r
+OBJ = a_memory.o conlib.o console.o controls.o engine.o entity.o font.o image.o keyboard.o message.o modeinit.o render.o startup.o timer.o verge.o vc.o vdriver.o vfile.o fli.o sound.o mikmod.a\r
+\r
+verge: $(OBJ)\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+struct message\r
+{\r
+ char text[44]; // message text\r
+ int exptime; // message expire time\r
+};\r
+\r
+struct message messages[6]; // 5-message buffer\r
+byte num_msgs=0; // number of active messages\r
+\r
+// -- cpu usage --\r
+\r
+int cputimer=0, frames=0;\r
+char runprf[3];\r
+// -- final numbers --\r
+int fps=0;\r
+char profile[3];\r
+\r
+// ================================= Code ====================================\r
+\r
+void CheckMessageExpirations()\r
+{ int i;\r
+\r
+ for (i=0; i<num_msgs; i++)\r
+ if (systemtime>messages[i].exptime)\r
+ {\r
+ memcpy(messages[i].text, messages[i+1].text, (48*(num_msgs-i+1)));\r
+ num_msgs--;\r
+ }\r
+}\r
+\r
+void RenderGUI()\r
+{ int i;\r
+\r
+ CheckMessageExpirations();\r
+ for (i=0; i<num_msgs; i++)\r
+ {\r
+ GotoXY(1,1+(i*10));\r
+ printstring(0,messages[i].text);\r
+ }\r
+\r
+ if (!cpu_watch) return;\r
+ frames++;\r
+\r
+ i=sx-76;\r
+ GotoXY(i,sy-39);\r
+ sprintf(strbuf,"etc:%d",profile[0]);\r
+ printstring(0,strbuf);\r
+ GotoXY(i,sy-29);\r
+ sprintf(strbuf,"Render:%d",profile[1]);\r
+ printstring(0,strbuf);\r
+ GotoXY(i,sy-19);\r
+ sprintf(strbuf,"PFlip:%d",profile[2]);\r
+ printstring(0,strbuf);\r
+ GotoXY(i,sy-9);\r
+ sprintf(strbuf,"FPS:%d",fps);\r
+ printstring(0,strbuf);\r
+}\r
+\r
+void CPUTick()\r
+{\r
+ cputimer++;\r
+ runprf[cpubyte]++;\r
+ if (cputimer==100)\r
+ {\r
+ fps=frames;\r
+ frames=0;\r
+ cputimer=0;\r
+\r
+ profile[0]=runprf[0]; runprf[0]=0;\r
+ profile[1]=runprf[1]; runprf[1]=0;\r
+ profile[2]=runprf[2]; runprf[2]=0;\r
+ }\r
+}\r
+\r
+void Message(char *text, int duration)\r
+{\r
+ Log("Message: %s", text);\r
+\r
+ if (num_msgs<5)\r
+ {\r
+ memcpy(messages[num_msgs].text, text, strlen(text));\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+ num_msgs++;\r
+ return;\r
+ }\r
+\r
+ memcpy(&messages[0].text, &messages[1].text, 192);\r
+ memcpy(messages[4].text, text, strlen(text));\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MESSAGE_H\r
+#define MESSAGE_H\r
+\r
+void RenderGUI();\r
+void CPUTick();\r
+void Message(char *text, int duration);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+\r
+Name:\r
+MIKMOD.C\r
+\r
+Description:\r
+Modplaying example of mikmod.\r
+\r
+MSDOS: BC(y) Watcom(y) DJGPP(y)\r
+Win95: BC(y*)\r
+Os2: y\r
+Linux: n\r
+\r
+* console mode only\r
+(y) - yes\r
+(n) - no (not possible or not useful)\r
+(?) - may be possible, but not tested\r
+\r
+*/\r
+#ifdef __WIN32__\r
+#include <windows.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <conio.h>\r
+#include <string.h>\r
+\r
+#ifndef __OS2__\r
+#include <dos.h>\r
+#endif\r
+\r
+#include "wildfile.h"\r
+#include "mikmod.h"\r
+\r
+char helptext[]=\r
+\r
+"Available switches (CaSe SeNsItIvE!):\n"\r
+"\n"\r
+" /d x use device-driver #x for output (0 is autodetect). Default=0\n"\r
+" /ld List all available device-drivers\n"\r
+" /ll List all available loaders\n"\r
+" /x disables protracker extended speed\n"\r
+" /p disables panning effects (9fingers.mod)\n"\r
+" /v xx Sets volume from 0 (silence) to 100. Default=100\n"\r
+" /f xxxx Sets mixing frequency. Default=44100\n"\r
+" /m Force mono output (so sb-pro can mix at 44100)\n"\r
+" /8 Force 8 bit output\n"\r
+" /i Use interpolated mixing\n"\r
+" /r Restart a module when it's done playing";\r
+\r
+\r
+/*\r
+ declarations for boring old sys-v style getopt *yawn*:\r
+*/\r
+int getopt(int argc, char *argv[], char *optionS);\r
+extern char *optarg;\r
+extern int optind;\r
+extern int opterr;\r
+\r
+\r
+void tickhandler(void)\r
+{\r
+ MP_HandleTick(); /* play 1 tick of the module */\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+\r
+int main(int argc,char *argv[])\r
+{\r
+ UNIMOD *mf;\r
+ int cmderr=0; /* error in commandline flag */\r
+ int morehelp=0; /* set if user wants more help */\r
+ int quit;\r
+ int t;\r
+ static int nargc;\r
+ static char **nargv;\r
+\r
+ puts(mikbanner);\r
+\r
+ /* Expand wildcards on commandline */\r
+\r
+ nargc=argc; nargv=argv;\r
+#ifndef __DJGPP__\r
+ MyGlob(&nargc,&nargv,0);\r
+#else\r
+ setvbuf(stdout, NULL, _IONBF, 0);\r
+ __djgpp_set_ctrl_c(0);\r
+#endif\r
+\r
+ /*\r
+ Initialize soundcard parameters.. you _have_ to do this\r
+ before calling MD_Init(), and it's illegal to change them\r
+ after you've called MD_Init()\r
+ */\r
+\r
+ md_mixfreq =44100; /* standard mixing freq */\r
+ md_dmabufsize =20000; /* standard dma buf size */\r
+ md_mode =DMODE_16BITS|DMODE_STEREO; /* standard mixing mode */\r
+ md_device =0; /* standard device: autodetect */\r
+\r
+ /*\r
+ Register the loaders we want to use..\r
+ */\r
+\r
+ ML_RegisterLoader(&load_m15); /* if you use m15load, register it as first! */\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_mtm);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_stm);\r
+ ML_RegisterLoader(&load_ult);\r
+ ML_RegisterLoader(&load_uni);\r
+ ML_RegisterLoader(&load_xm);\r
+\r
+ /*\r
+ Register the drivers we want to use:\r
+ */\r
+\r
+ MD_RegisterDriver(&drv_nos);\r
+#ifdef __OS2__\r
+ MD_RegisterDriver(&drv_os2);\r
+#elif defined(__WIN32__)\r
+ MD_RegisterDriver(&drv_w95);\r
+#else\r
+ MD_RegisterDriver(&drv_ss);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+#endif\r
+\r
+ MD_RegisterPlayer(tickhandler);\r
+\r
+ /* Parse option switches using standard getopt function: */\r
+\r
+ opterr=0;\r
+\r
+ while( !cmderr &&\r
+ (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){\r
+\r
+ switch(t){\r
+\r
+ case 'd':\r
+ md_device=atoi(optarg);\r
+ break;\r
+\r
+ case 'l':\r
+ if(optarg[0]=='d') MD_InfoDriver();\r
+ else if(optarg[0]=='l') ML_InfoLoader();\r
+ else{\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ exit(0);\r
+\r
+ case 'r':\r
+ mp_loop=1;\r
+ break;\r
+\r
+ case 'm':\r
+ md_mode&=~DMODE_STEREO;\r
+ break;\r
+\r
+ case '8':\r
+ md_mode&=~DMODE_16BITS;\r
+ break;\r
+\r
+ case 'i':\r
+ md_mode|=DMODE_INTERP;\r
+ break;\r
+\r
+ case 'x':\r
+ mp_extspd=0;\r
+ break;\r
+\r
+ case 'p':\r
+ mp_panning=0;\r
+ break;\r
+\r
+ case 'v':\r
+ if((mp_volume=atoi(optarg))>100) mp_volume=100;\r
+ break;\r
+\r
+ case 'f':\r
+ md_mixfreq=atol(optarg);\r
+ break;\r
+\r
+ case 'h':\r
+ morehelp=1;\r
+ cmderr=1;\r
+ break;\r
+\r
+ case '?':\r
+ puts("\07Invalid switch or option needs an argument\n");\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(cmderr || optind>=nargc){\r
+\r
+ /*\r
+ there was an error in the commandline, or there were no true\r
+ arguments, so display a usage message\r
+ */\r
+\r
+ puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");\r
+\r
+ if(morehelp)\r
+ puts(helptext);\r
+ else\r
+ puts("Type MIKMOD /h for more help.");\r
+\r
+ exit(-1);\r
+ }\r
+\r
+ /* initialize soundcard */\r
+\r
+ if(!MD_Init()){\r
+ printf("Driver error: %s.\n",myerr);\r
+ return 0;\r
+ }\r
+\r
+ printf("Using %s for %d bit %s %s sound at %u Hz\n\n",\r
+ md_driver->Name,\r
+ (md_mode&DMODE_16BITS) ? 16:8,\r
+ (md_mode&DMODE_INTERP) ? "interpolated":"normal",\r
+ (md_mode&DMODE_STEREO) ? "stereo":"mono",\r
+ md_mixfreq);\r
+\r
+#ifdef __OS2__\r
+ DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );\r
+#endif\r
+\r
+ for(quit=0; !quit && optind<nargc; optind++){\r
+\r
+ printf("File : %s\n",nargv[optind]);\r
+\r
+ /* load the module */\r
+\r
+ mf=ML_LoadFN(nargv[optind]);\r
+\r
+ /* didn't work -> exit with errormsg. */\r
+\r
+ if(mf==NULL){\r
+ printf("MikMod Error: %s\n",myerr);\r
+ break;\r
+ }\r
+\r
+ /* initialize modplayer to play this module */\r
+\r
+ MP_Init(mf);\r
+\r
+ printf( "Songname: %s\n"\r
+ "Modtype : %s\n"\r
+ "Periods : %s,%s\n",\r
+ mf->songname,\r
+ mf->modtype,\r
+ (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",\r
+ (mf->flags&UF_LINEAR) ? "Linear" : "Log");\r
+\r
+ /*\r
+ set the number of voices to use.. you\r
+ could add extra channels here (e.g. md_numchn=mf->numchn+4; )\r
+ to use for your own soundeffects:\r
+ */\r
+\r
+ md_numchn=mf->numchn;\r
+\r
+ /* start playing the module: */\r
+\r
+ MD_PlayStart();\r
+\r
+ while(!MP_Ready()){\r
+\r
+ char c;\r
+\r
+ c=kbhit() ? getch() : 0;\r
+\r
+ if(c=='+')\r
+ MP_NextPosition();\r
+ else if(c=='-')\r
+ MP_PrevPosition();\r
+ else if(c==0x1b){\r
+ quit=1;\r
+ break;\r
+ }\r
+ else if(c==' ') break;\r
+\r
+ MD_Update();\r
+\r
+ /* wait a bit */\r
+\r
+#if defined(__OS2__)\r
+ DosSleep(40); /* hmmmm */\r
+#elif defined(__WIN32__)\r
+ Sleep(10);\r
+#elif defined(__DJGPP__)\r
+ /* no wait for djgpp ? */\r
+#else\r
+ delay(10);\r
+#endif\r
+ printf("\rsngpos:%d patpos:%d sngspd %d bpm %d ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);\r
+ }\r
+\r
+ MD_PlayStop(); /* stop playing */\r
+ ML_Free(mf); /* and free the module */\r
+ puts("\n");\r
+ }\r
+ MD_Exit();\r
+ return 0;\r
+}\r
--- /dev/null
+#ifndef MIKMOD_H\r
+#define MIKMOD_H\r
+\r
+#include <stdio.h>\r
+#include "mtypes.h" /* include atomic mikmod types */\r
+\r
+\r
+#define mikbanner \\r
+"=======================================================================\n" \\r
+"MIKMOD v2.10 - Portable version - Programmed by MikMak of HaRDCoDE '95\n" \\r
+"=======================================================================\n" \\r
+"This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \\r
+"E-Mail : mikmak@stack.urc.tue.nl\n"\r
+\r
+\r
+/*\r
+ error variables:\r
+ ===============\r
+*/\r
+\r
+extern char *ERROR_ALLOC_STRUCT;\r
+extern char *ERROR_LOADING_PATTERN;\r
+extern char *ERROR_LOADING_TRACK;\r
+extern char *ERROR_LOADING_HEADER;\r
+extern char *ERROR_NOT_A_MODULE;\r
+extern char *ERROR_LOADING_SAMPLEINFO;\r
+extern char *ERROR_OUT_OF_HANDLES;\r
+extern char *ERROR_SAMPLE_TOO_BIG;\r
+extern char *myerr;\r
+\r
+\r
+\r
+#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)\r
+int _mm_fseek(FILE *stream,long offset,int whence);\r
+void _mm_setiobase(long iobase);\r
+long _mm_ftell(FILE *stream);\r
+\r
+\r
+extern SBYTE _mm_read_SBYTE (FILE *fp);\r
+extern UBYTE _mm_read_UBYTE (FILE *fp);\r
+\r
+extern SWORD _mm_read_M_SWORD (FILE *fp);\r
+extern SWORD _mm_read_I_SWORD (FILE *fp);\r
+\r
+extern UWORD _mm_read_M_UWORD(FILE *fp);\r
+extern UWORD _mm_read_I_UWORD(FILE *fp);\r
+\r
+extern SLONG _mm_read_M_SLONG (FILE *fp);\r
+extern SLONG _mm_read_I_SLONG (FILE *fp);\r
+\r
+extern ULONG _mm_read_M_ULONG(FILE *fp);\r
+extern ULONG _mm_read_I_ULONG(FILE *fp);\r
+\r
+extern int _mm_read_str(char *str, int size, FILE *fp);\r
+\r
+extern int _mm_read_SBYTES (SBYTE *buffer, int number, FILE *fp);\r
+extern int _mm_read_UBYTES (UBYTE *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+\r
+\r
+extern void _mm_write_SBYTE (SBYTE data,FILE *fp);\r
+extern void _mm_write_UBYTE (UBYTE data,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORD (SWORD data,FILE *fp);\r
+extern void _mm_write_I_SWORD (SWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORD (UWORD data,FILE *fp);\r
+extern void _mm_write_I_UWORD (UWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONG (SLONG data,FILE *fp);\r
+extern void _mm_write_I_SLONG (SLONG data,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONG (ULONG data,FILE *fp);\r
+extern void _mm_write_I_ULONG (ULONG data,FILE *fp);\r
+\r
+extern void _mm_write_SBYTES (SBYTE *data, int number,FILE *fp);\r
+extern void _mm_write_UBYTES (UBYTE *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORDS (SWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_SWORDS (SWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONGS (SLONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_SLONGS (SLONG *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp);\r
+\r
+\r
+/**************************************************************************\r
+****** Unitrack stuff: ****************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ prototypes:\r
+*/\r
+\r
+void UniSetRow(UBYTE *t);\r
+UBYTE UniGetByte(void);\r
+UBYTE *UniFindRow(UBYTE *t,UWORD row);\r
+void UniReset(void);\r
+void UniWrite(UBYTE data);\r
+void UniNewline(void);\r
+void UniInstrument(UBYTE ins);\r
+void UniNote(UBYTE note);\r
+void UniPTEffect(UBYTE eff,UBYTE dat);\r
+UBYTE *UniDup(void);\r
+void UniSkipOpcode(UBYTE op);\r
+BOOL UniInit(void);\r
+void UniCleanup(void);\r
+UWORD TrkLen(UBYTE *t);\r
+BOOL MyCmp(UBYTE *a,UBYTE *b,UWORD l);\r
+\r
+/*\r
+ all known effects:\r
+*/\r
+\r
+enum {\r
+ UNI_NOTE=1,\r
+ UNI_INSTRUMENT,\r
+ UNI_PTEFFECT0,\r
+ UNI_PTEFFECT1,\r
+ UNI_PTEFFECT2,\r
+ UNI_PTEFFECT3,\r
+ UNI_PTEFFECT4,\r
+ UNI_PTEFFECT5,\r
+ UNI_PTEFFECT6,\r
+ UNI_PTEFFECT7,\r
+ UNI_PTEFFECT8,\r
+ UNI_PTEFFECT9,\r
+ UNI_PTEFFECTA,\r
+ UNI_PTEFFECTB,\r
+ UNI_PTEFFECTC,\r
+ UNI_PTEFFECTD,\r
+ UNI_PTEFFECTE,\r
+ UNI_PTEFFECTF,\r
+ UNI_S3MEFFECTA,\r
+ UNI_S3MEFFECTD,\r
+ UNI_S3MEFFECTE,\r
+ UNI_S3MEFFECTF,\r
+ UNI_S3MEFFECTI,\r
+ UNI_S3MEFFECTQ,\r
+ UNI_S3MEFFECTT,\r
+ UNI_XMEFFECTA,\r
+ UNI_XMEFFECTG,\r
+ UNI_XMEFFECTH,\r
+ UNI_XMEFFECTP\r
+};\r
+\r
+\r
+/**************************************************************************\r
+****** mikmod types: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+/*\r
+ Sample format flags:\r
+*/\r
+\r
+#define SF_16BITS 1\r
+#define SF_SIGNED 2\r
+#define SF_DELTA 4\r
+#define SF_BIG_ENDIAN 8\r
+#define SF_LOOP 16\r
+#define SF_BIDI 32\r
+#define SF_OWNPAN 64\r
+#define SF_REVERSE 128\r
+\r
+\r
+/*\r
+ Envelope flags:\r
+*/\r
+\r
+#define EF_ON 1\r
+#define EF_SUSTAIN 2\r
+#define EF_LOOP 4\r
+\r
+\r
+/*\r
+ Unimod flags\r
+*/\r
+\r
+#define UF_XMPERIODS 1 /* if set use XM periods/finetuning */\r
+#define UF_LINEAR 2 /* if set use LINEAR periods */\r
+\r
+\r
+typedef struct ENVPT{\r
+ SWORD pos;\r
+ SWORD val;\r
+} ENVPT;\r
+\r
+\r
+typedef struct SAMPLE{\r
+ UWORD c2spd; /* finetune frequency */\r
+ SBYTE transpose; /* transpose value */\r
+ UBYTE volume; /* volume 0-64 */\r
+ UBYTE panning; /* panning */\r
+ ULONG length; /* length of sample (in samples!) */\r
+ ULONG loopstart; /* repeat position (relative to start, in samples) */\r
+ ULONG loopend; /* repeat end */\r
+ UWORD flags; /* sample format */\r
+ ULONG seekpos; /* seek position in file */\r
+ char *samplename; /* name of the sample */\r
+ SWORD handle; /* sample handle */\r
+} SAMPLE;\r
+\r
+\r
+typedef struct INSTRUMENT{\r
+ UBYTE numsmp;\r
+ UBYTE samplenumber[96];\r
+\r
+ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE volpts;\r
+ UBYTE volsus;\r
+ UBYTE volbeg;\r
+ UBYTE volend;\r
+ ENVPT volenv[12];\r
+\r
+ UBYTE panflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE panpts;\r
+ UBYTE pansus;\r
+ UBYTE panbeg;\r
+ UBYTE panend;\r
+ ENVPT panenv[12];\r
+\r
+ UBYTE vibtype;\r
+ UBYTE vibsweep;\r
+ UBYTE vibdepth;\r
+ UBYTE vibrate;\r
+\r
+ UWORD volfade;\r
+ char *insname;\r
+ SAMPLE *samples;\r
+} INSTRUMENT;\r
+\r
+\r
+/*\r
+ MikMod UNImod types:\r
+ ====================\r
+*/\r
+\r
+typedef struct UNIMOD{\r
+ UBYTE numchn; /* number of channels */\r
+ UWORD numpos; /* number of positions in this song */\r
+ UWORD reppos; /* restart position */\r
+ UWORD numpat; /* number of patterns in this song */\r
+ UWORD numtrk; /* number of tracks */\r
+ UWORD numins; /* number of samples */\r
+ UBYTE initspeed; /* */\r
+ UBYTE inittempo; /* */\r
+ UBYTE positions[256]; /* all positions */\r
+ UBYTE panning[32]; /* 32 panning positions */\r
+ UBYTE flags; /* */\r
+ char *songname; /* name of the song */\r
+ char *modtype; /* string type of module */\r
+ char *comment; /* module comments */\r
+ INSTRUMENT *instruments; /* all samples */\r
+ UWORD *patterns; /* array of PATTERN */\r
+ UWORD *pattrows; /* array of number of rows for each pattern */\r
+ UBYTE **tracks; /* array of pointers to tracks */\r
+} UNIMOD;\r
+\r
+\r
+/**************************************************************************\r
+****** Loader stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ loader structure:\r
+*/\r
+\r
+typedef struct LOADER{\r
+ struct LOADER *next;\r
+ char *type;\r
+ char *version;\r
+ BOOL (*Init)(void);\r
+ BOOL (*Test)(void);\r
+ BOOL (*Load)(void);\r
+ void (*Cleanup)(void);\r
+} LOADER;\r
+\r
+\r
+/*\r
+ public loader variables:\r
+*/\r
+\r
+extern UNIMOD of;\r
+extern FILE *modfp;\r
+extern UWORD finetune[16];\r
+\r
+\r
+/*\r
+ main loader prototypes:\r
+*/\r
+\r
+void ML_InfoLoader(void);\r
+void ML_RegisterLoader(LOADER *ldr);\r
+UNIMOD *ML_LoadFP(FILE *fp);\r
+UNIMOD *ML_LoadFN(char *filename);\r
+void ML_Free(UNIMOD *mf);\r
+\r
+\r
+/*\r
+ other loader prototypes: (used by the loader modules)\r
+*/\r
+\r
+BOOL InitTracks(void);\r
+void AddTrack(UBYTE *tr);\r
+BOOL ReadComment(UWORD len);\r
+BOOL AllocPatterns(void);\r
+BOOL AllocTracks(void);\r
+BOOL AllocInstruments(void);\r
+BOOL AllocSamples(INSTRUMENT *i);\r
+char *DupStr(char *s,UWORD len);\r
+void *MyMalloc(size_t size);\r
+void *MyCalloc(size_t nitems,size_t size);\r
+\r
+\r
+/*\r
+ Declare external loaders:\r
+*/\r
+extern LOADER load_uni;\r
+extern LOADER load_mod;\r
+extern LOADER load_m15;\r
+extern LOADER load_mtm;\r
+extern LOADER load_s3m;\r
+extern LOADER load_stm;\r
+extern LOADER load_ult;\r
+extern LOADER load_xm;\r
+\r
+\r
+/**************************************************************************\r
+****** Wavload stuff: *****************************************************\r
+**************************************************************************/\r
+\r
+SAMPLE *MW_LoadWavFP(FILE *fp);\r
+SAMPLE *MW_LoadWavFN(char *filename);\r
+void MW_FreeWav(SAMPLE *si);\r
+\r
+\r
+/**************************************************************************\r
+****** Driver stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ max. number of handles a driver has to provide. (not strict)\r
+*/\r
+\r
+#define MAXSAMPLEHANDLES 128\r
+\r
+\r
+/*\r
+ possible mixing mode bits:\r
+*/\r
+\r
+#define DMODE_STEREO 1\r
+#define DMODE_16BITS 2\r
+#define DMODE_INTERP 4\r
+\r
+\r
+/*\r
+ driver structure:\r
+*/\r
+\r
+typedef struct DRIVER{\r
+ struct DRIVER *next;\r
+ char *Name;\r
+ char *Version;\r
+ BOOL (*IsPresent) (void);\r
+ SWORD (*SampleLoad) (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+ void (*SampleUnLoad) (SWORD handle);\r
+ BOOL (*Init) (void);\r
+ void (*Exit) (void);\r
+ void (*PlayStart) (void);\r
+ void (*PlayStop) (void);\r
+ void (*Update) (void);\r
+ void (*VoiceSetVolume) (UBYTE voice,UBYTE vol);\r
+ void (*VoiceSetFrequency) (UBYTE voice,ULONG frq);\r
+ void (*VoiceSetPanning) (UBYTE voice,UBYTE pan);\r
+ void (*VoicePlay) (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+} DRIVER;\r
+\r
+\r
+/*\r
+ public driver variables:\r
+*/\r
+\r
+extern DRIVER *md_driver;\r
+extern UWORD md_device;\r
+extern UWORD md_mixfreq;\r
+extern UWORD md_dmabufsize;\r
+extern UWORD md_mode;\r
+extern UBYTE md_numchn;\r
+extern UBYTE md_bpm;\r
+extern void (*md_player)(void);\r
+\r
+/*\r
+ main driver prototypes:\r
+*/\r
+\r
+void MD_InfoDriver(void);\r
+void MD_RegisterDriver(DRIVER *drv);\r
+void MD_RegisterPlayer(void (*plr)(void));\r
+SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void MD_SampleUnLoad(SWORD handle);\r
+BOOL MD_Init(void);\r
+void MD_Exit(void);\r
+void MD_PlayStart(void);\r
+void MD_PlayStop(void);\r
+void MD_SetBPM(UBYTE bpm);\r
+void MD_Update(void);\r
+void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);\r
+void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void MD_VoiceSetPanning(UBYTE voice,ULONG pan);\r
+void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);\r
+void SL_Load(void *buffer,ULONG length);\r
+\r
+/*\r
+ Declare external drivers:\r
+*/\r
+\r
+extern DRIVER drv_gus; /* gravis ultrasound driver */\r
+extern DRIVER drv_sb; /* soundblaster DSP driver */\r
+extern DRIVER drv_ss; /* ensoniq soundscape driver */\r
+extern DRIVER drv_nos; /* nosound driver */\r
+extern DRIVER drv_raw; /* file output driver */\r
+extern DRIVER drv_w95; /* win95 driver */\r
+extern DRIVER drv_awe; /* experimental SB-AWE driver */\r
+extern DRIVER drv_vox; /* linux voxware driver */\r
+extern DRIVER drv_af; /* Dec Alpha AudioFile driver */\r
+extern DRIVER drv_sun; /* Sun driver */\r
+extern DRIVER drv_os2; /* Os2 driver */\r
+extern DRIVER drv_tim; /* timing driver */\r
+\r
+/**************************************************************************\r
+****** Player stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+typedef struct ENVPR{\r
+ UBYTE flg; /* envelope flag */\r
+ UBYTE pts; /* number of envelope points */\r
+ UBYTE sus; /* envelope sustain index */\r
+ UBYTE beg; /* envelope loop begin */\r
+ UBYTE end; /* envelope loop end */\r
+ SWORD p; /* current envelope counter */\r
+ UWORD a; /* envelope index a */\r
+ UWORD b; /* envelope index b */\r
+ ENVPT *env; /* envelope points */\r
+} ENVPR;\r
+\r
+\r
+typedef struct AUDTMP{\r
+ INSTRUMENT *i;\r
+ SAMPLE *s;\r
+\r
+ UWORD fadevol; /* fading volume */\r
+\r
+ ENVPR venv;\r
+ ENVPR penv;\r
+\r
+ UBYTE keyon; /* if true=key is pressed. */\r
+ UBYTE kick; /* if true=sample has to be restarted */\r
+ UBYTE sample; /* which sample number (0-31) */\r
+ SWORD handle; /* which sample-handle */\r
+\r
+ ULONG start; /* The start byte index in the sample */\r
+\r
+ UBYTE panning; /* panning position */\r
+ UBYTE pansspd; /* panslide speed */\r
+\r
+ SBYTE volume; /* amiga volume (0 t/m 64) to play the sample at */\r
+ UWORD period; /* period to play the sample at */\r
+\r
+ /* You should not have to use the values\r
+ below in the player routine */\r
+\r
+ SBYTE transpose;\r
+\r
+ UBYTE note; /* */\r
+\r
+ SWORD ownper;\r
+ SWORD ownvol;\r
+\r
+ UBYTE *row; /* row currently playing on this channel */\r
+\r
+ SBYTE retrig; /* retrig value (0 means don't retrig) */\r
+ UWORD c2spd; /* what finetune to use */\r
+\r
+ SBYTE tmpvolume; /* tmp volume */\r
+\r
+ UWORD tmpperiod; /* tmp period */\r
+ UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */\r
+\r
+ UWORD slidespeed; /* */\r
+ UWORD portspeed; /* noteslide speed (toneportamento) */\r
+\r
+ UBYTE s3mtremor; /* s3m tremor (effect I) counter */\r
+ UBYTE s3mtronof; /* s3m tremor ontime/offtime */\r
+\r
+ UBYTE s3mvolslide; /* last used volslide */\r
+\r
+ UBYTE s3mrtgspeed; /* last used retrig speed */\r
+ UBYTE s3mrtgslide; /* last used retrig slide */\r
+\r
+ UBYTE glissando; /* glissando (0 means off) */\r
+ UBYTE wavecontrol; /* */\r
+\r
+ SBYTE vibpos; /* current vibrato position */\r
+ UBYTE vibspd; /* "" speed */\r
+ UBYTE vibdepth; /* "" depth */\r
+\r
+ SBYTE trmpos; /* current tremolo position */\r
+ UBYTE trmspd; /* "" speed */\r
+ UBYTE trmdepth; /* "" depth */\r
+\r
+ UWORD soffset; /* last used sample-offset (effect 9) */\r
+} AUDTMP;\r
+\r
+\r
+extern AUDTMP mp_audio[32]; /* max eight channels */\r
+extern UBYTE mp_bpm; /* beats-per-minute speed */\r
+extern UWORD mp_patpos; /* current row number (0-63) */\r
+extern SWORD mp_sngpos; /* current song position */\r
+extern UWORD mp_sngspd; /* current songspeed */\r
+\r
+extern BOOL mp_loop;\r
+extern BOOL mp_panning;\r
+extern BOOL mp_extspd;\r
+extern UBYTE mp_volume;\r
+\r
+/*\r
+ player prototypes:\r
+*/\r
+\r
+int MP_Ready(void);\r
+void MP_NextPosition(void);\r
+void MP_PrevPosition(void);\r
+void MP_SetPosition(UWORD pos);\r
+void MP_HandleTick(void);\r
+void MP_Init(UNIMOD *m);\r
+\r
+\r
+/**************************************************************************\r
+****** Virtual channel stuff: *********************************************\r
+**************************************************************************/\r
+\r
+BOOL VC_Init(void);\r
+void VC_Exit(void);\r
+\r
+void VC_PlayStart(void);\r
+void VC_PlayStop(void);\r
+\r
+SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void VC_SampleUnload(SWORD handle);\r
+\r
+void VC_WriteSamples(SBYTE *buf,UWORD todo);\r
+UWORD VC_WriteBytes(SBYTE *buf,UWORD todo);\r
+void VC_SilenceBytes(SBYTE *buf,UWORD todo);\r
+\r
+void VC_VoiceSetVolume(UBYTE voice,UBYTE vol);\r
+void VC_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void VC_VoiceSetPanning(UBYTE voice,UBYTE pan);\r
+void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+byte *screen, *screenx; // virscr | realscr\r
+\r
+// ================================= Code ====================================\r
+\r
+void SetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int Mode13hShutdown(void)\r
+{\r
+ SetMode(0x3);\r
+ free(screen);\r
+ return 0;\r
+}\r
+\r
+void xShowPage(int startofs)\r
+{\r
+ asm("movl _screen, %%esi \n\t"\r
+ "addl %0, %%esi \n\t"\r
+ "movl _screenx, %%edi \n\t"\r
+ "movl $200, %%eax \n\t"\r
+"lineloop: \n\t"\r
+ "movl $80, %%ecx \n\t"\r
+ "rep \n\t"\r
+ "movsl \n\t"\r
+ "addl $32, %%esi \n\t"\r
+ "decl %%eax \n\t"\r
+ "jnz lineloop \n\t"\r
+ :\r
+ : "m" (startofs)\r
+ : "esi", "edi", "cc", "eax", "ecx");\r
+}\r
+\r
+int Mode13hShowPage(void)\r
+{\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+ xShowPage((16*352)+16);\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%edx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"csl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $352, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%ecx \n\t"\r
+ "shrl $2, %%ecx \n\t"\r
+ "repz \n\t"\r
+ "movsl \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz csl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopyTile(int x, int y, byte *spr)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+" ctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl $352, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz ctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr)\r
+ : "eax","ecx","esi","edi","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%ecx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"tcsl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $352, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%edx \n\t"\r
+"drawloop: \n\t"\r
+ "lodsb \n\t"\r
+ "orb %%al, %%al \n\t"\r
+ "jz nodraw \n\t"\r
+ "stosb \n\t"\r
+ "decl %%edx \n\t"\r
+ "jz endline \n\t"\r
+ "jmp drawloop \n\t"\r
+"nodraw: \n\t"\r
+ "incl %%edi \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz drawloop \n\t"\r
+"endline: \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tcsl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCopyTile(int x, int y, byte *spr, byte *matte)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl %3, %%edx \n\t"\r
+"tctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl $352, %%edi \n\t"\r
+ "addl $16, %%edx \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr), "m" (matte)\r
+ : "eax","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hScaleSprite(int x, int y, int w, int h, int tw, int th, byte *s)\r
+{ int i,j,xm,ym,xd,yd,sx,sy=0,xs,ys,dys=0;\r
+ unsigned char *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (!tw || !th) return 0;\r
+ tw += sgn(tw); th += sgn(th);\r
+ xm = abs(tw); ym = abs(th);\r
+ xs = (w<<16)/xm; ys = (h<<16)/ym;\r
+ xd = sgn(tw); yd = sgn(th);\r
+\r
+ if (tw>0 && th>0) dys=tsx-xm;\r
+ else if (tw>0 && th<0) dys=(0-tsx)-xm;\r
+ else if (tw<0 && th>0) dys=tsx+xm;\r
+ else if (tw<0 && th<0) dys=(0-tsx)+xm;\r
+\r
+ d = screen+(y*tsx)+x;\r
+ for (i=0;i<ym;++i) {\r
+ sx=0;\r
+ for (j=0;j<xm;++j) {\r
+ *d=s[(sx>>16)];\r
+ d+=xd;\r
+ sx+=xs;\r
+ }\r
+ d+=dys;\r
+ sy+=ys;\r
+ s+=(sy>>16)*w;\r
+ sy&=0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl $22, %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "movl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hTRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul $352, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl $22, %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop1: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "orw %%ax, %%ax \n\t"\r
+ "jz next1 \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "movl %%esi, %%edx \n\t"\r
+ "addl _vspmask, %%edx \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "addl %%eax, %%edx \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+"next1: \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hColorField(int x, int y, byte c)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%eax \n\t"\r
+ "imul $352, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl $8, %%ecx \n\t"\r
+ "movb %2, %%al \n\t"\r
+"lineloop1: \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "addl $336, %%edi \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "addl $336, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz lineloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (c)\r
+ : "eax","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(screen+(352*16)+16,0,(352*200));\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hPutPixel(int x, int y, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ screen[(y*tsx)+x]=color;\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hGetPixel(int x, int y)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ cpubyte=ETC;\r
+ return screen[(y*tsx)+x];\r
+}\r
+\r
+int Mode13hHLine(int x, int y, int x2, int color)\r
+{ byte *d;\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (x2<x) { int t=x2; x=x2; x2=t; }\r
+\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ x2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hVLine(int x, int y, int y2, int color)\r
+{ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (y2<y) { int t=y2; x=y2; y2=t; }\r
+\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ y2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hLine(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ x1+=16;y1+=16; // aen; adjust these here??\r
+ x2+=16;y2+=16;\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCircle(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ Mode13hPutPixel(x+cx,y+cy,color);\r
+ if (cx) Mode13hPutPixel(x-cx,y+cy,color);\r
+ if (cy) Mode13hPutPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) Mode13hPutPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ Mode13hPutPixel(x+cy,y+cx,color);\r
+ if (cx) Mode13hPutPixel(x+cy,y-cx,color);\r
+ if (cy) Mode13hPutPixel(x-cy,y+cx,color);\r
+ if (cx && cy) Mode13hPutPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hCircleFill(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ Mode13hHLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) Mode13hHLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ Mode13hHLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) Mode13hHLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int Mode13hRect(int x, int y, int x2, int y2, int color)\r
+{\r
+ Mode13hHLine(x,y,x2,color);\r
+ Mode13hHLine(x,y2,x2,color);\r
+ Mode13hVLine(x,y+1,y2-1,color);\r
+ Mode13hVLine(x2,y+1,y2-1,color);\r
+ return 0;\r
+}\r
+\r
+int Mode13hRectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (y2<y) { int t=y2; y=y2; y2=t; }\r
+\r
+ for (; y<=y2; y++)\r
+ Mode13hHLine(x,y,x2,color);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void InitMode13h(void)\r
+{\r
+ SetMode(0x13);\r
+\r
+ screenx=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ screen=(byte *) malloc(95744);\r
+ memset(screen, 0, 95744);\r
+\r
+ sx=320; sy=200;\r
+ tsx=352; tsy=232;\r
+ tx=20; ty=13;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo = Mode13hShutdown;\r
+ ShowPage = Mode13hShowPage;\r
+ CopySprite = Mode13hCopySprite;\r
+ TCopySprite = Mode13hTCopySprite;\r
+ CCopySprite = Mode13hCCopySprite;\r
+ TCCopySprite = Mode13hTCCopySprite;\r
+ CopyTile = Mode13hCopyTile;\r
+ TCopyTile = Mode13hTCopyTile;\r
+ ScaleSprite = Mode13hScaleSprite;\r
+ RenderMAPLine = Mode13hRenderMAPLine;\r
+ TRenderMAPLine = Mode13hTRenderMAPLine;\r
+ ColorField = Mode13hColorField;\r
+ ClearScreen = Mode13hClearScreen;\r
+ PutPixel = Mode13hPutPixel;\r
+ GetPixel = Mode13hGetPixel;\r
+ HLine = Mode13hHLine;\r
+ VLine = Mode13hVLine;\r
+ Line = Mode13hLine;\r
+ Circle = Mode13hCircle;\r
+ CircleFill = Mode13hCircleFill;\r
+ Rect = Mode13hRect;\r
+ RectFill = Mode13hRectFill;\r
+ DriverDesc = "320x200 (Mode 13h, linear)";\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+void BIOS_SetVideoMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+// =============================== Mode 13h ===================================\r
+\r
+int Mode13hShutdown(int i)\r
+{\r
+ if (i) BIOS_SetVideoMode(0x3);\r
+ free(screen);\r
+ return 0;\r
+}\r
+\r
+void InitMode13h(void)\r
+{\r
+ BIOS_SetVideoMode(0x13);\r
+\r
+ DriverDesc = "320x200 (Mode 13h, linear)";\r
+ sx=320, sy=200;\r
+ tx=20, ty=13;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+\r
+ // setup function drivers\r
+ ShowPage=LFB_ShowPage;\r
+ ShutdownVideo=Mode13hShutdown;\r
+\r
+ video=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vscreen=(byte *) valloc(sx*sy, "vscreen", 0);\r
+ screen=vscreen;\r
+ memset(screen, 0, sx*sy);\r
+}\r
+\r
+// ================================= Mode-X ==================================\r
+\r
+#define SEQU_ADDR 0x3c4\r
+#define CRTC_ADDR 0x3d4\r
+#define MISC_OUTPUT 0x3c2\r
+\r
+#define ATTRCON_ADDR 0x3c0\r
+#define MISC_ADDR 0x3c2\r
+#define VGAENABLE_ADDR 0x3c3\r
+#define SEQ_ADDR 0x3c4\r
+#define GRACON_ADDR 0x3ce\r
+#define CRTC_ADDR 0x3d4\r
+#define STATUS_ADDR 0x3da\r
+\r
+typedef struct\r
+{\r
+ unsigned port;\r
+ byte index, value;\r
+} Register;\r
+\r
+typedef Register *RegisterPtr;\r
+\r
+Register scr256x256[] =\r
+{\r
+ { 0x3c2, 0x00, 0xe3},{ 0x3d4, 0x00, 0x5f},{ 0x3d4, 0x01, 0x3f},\r
+ { 0x3d4, 0x02, 0x40},{ 0x3d4, 0x03, 0x82},{ 0x3d4, 0x04, 0x4A},\r
+ { 0x3d4, 0x05, 0x9A},{ 0x3d4, 0x06, 0x23},{ 0x3d4, 0x07, 0xb2},\r
+ { 0x3d4, 0x08, 0x00},{ 0x3d4, 0x09, 0x61},{ 0x3d4, 0x10, 0x0a},\r
+ { 0x3d4, 0x11, 0xac},{ 0x3d4, 0x12, 0xff},{ 0x3d4, 0x13, 0x20},\r
+ { 0x3d4, 0x14, 0x40},{ 0x3d4, 0x15, 0x07},{ 0x3d4, 0x16, 0x1a},\r
+ { 0x3d4, 0x17, 0xa3},{ 0x3c4, 0x01, 0x01},{ 0x3c4, 0x04, 0x0e},\r
+ { 0x3ce, 0x05, 0x40},{ 0x3ce, 0x06, 0x05},{ 0x3c0, 0x10, 0x41},\r
+ { 0x3c0, 0x13, 0x00}\r
+};\r
+\r
+// ================================= Code ====================================\r
+\r
+void plane(byte p)\r
+{\r
+ int hi=1<<p;\r
+ outpw(0x03c4, (hi<<8)|0x02);\r
+}\r
+\r
+int ModeXShutdown(int i)\r
+{\r
+ if (i) BIOS_SetVideoMode(0x3);\r
+ vfree(screen);\r
+ return 0;\r
+}\r
+\r
+int ModeXShowPage()\r
+{\r
+ byte *s,*d;\r
+ int x,y,k;\r
+ int sx2;\r
+\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ d=video;\r
+ sx2=sx>>2;\r
+\r
+ for (y=0; y<sy; ++y,d+=sx2)\r
+ {\r
+ s=screen+(y*sx);\r
+ for (k=0; k<4; k++,s-=sx)\r
+ {\r
+ plane(k);\r
+ for (x=0; x<sx2; x++,s+=4)\r
+ d[x]=s[k];\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+static void outReg(Register r)\r
+{\r
+ switch (r.port)\r
+ {\r
+ // First handle special cases:\r
+\r
+ case ATTRCON_ADDR:\r
+ // reset read/write flip-flop\r
+ inp(STATUS_ADDR);\r
+ // ensure VGA output is enabled\r
+ outp(ATTRCON_ADDR, r.index | 0x20);\r
+ outp(ATTRCON_ADDR, r.value);\r
+ break;\r
+\r
+ case MISC_ADDR:\r
+ case VGAENABLE_ADDR:\r
+ // directly to the port\r
+ outp(r.port, r.value);\r
+ break;\r
+\r
+ case SEQ_ADDR:\r
+ case GRACON_ADDR:\r
+ case CRTC_ADDR:\r
+ default:\r
+ // index to port\r
+ outp(r.port, r.index);\r
+ // value to port+1\r
+ outp(r.port + 1, r.value);\r
+ break;\r
+ }\r
+}\r
+\r
+// readyVgaRegs() does the initialization to make the VGA ready to\r
+// accept any combination of configuration register settings.\r
+//\r
+// This involves enabling writes to index 0 to 7 of the CRT controller\r
+// (port 0x3d4), by clearing the most significant bit (bit 7) of index\r
+// 0x11.\r
+\r
+static void readyVgaRegs(void)\r
+{\r
+ int v;\r
+\r
+ outp(0x3d4, 0x11);\r
+ v = inp(0x3d5) & 0x7f;\r
+ outp(0x3d4, 0x11);\r
+ outp(0x3d5, v);\r
+}\r
+\r
+// outRegArray sets n registers according to the array pointed to by r.\r
+// First, indexes 0-7 of the CRT controller are enabled for writing.\r
+\r
+static void outRegArray(Register *r, int n)\r
+{\r
+ readyVgaRegs();\r
+ while (n--)\r
+ outReg (*r++);\r
+}\r
+\r
+void Set256x256()\r
+{\r
+ DriverDesc = "256x256 (ModeX, planar)";\r
+\r
+ outRegArray(scr256x256, sizeof(scr256x256) / sizeof (Register));\r
+\r
+ sx=256, sy=256;\r
+ tx=17, ty=16;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+}\r
+\r
+void Set320x240()\r
+{ char in_byte;\r
+\r
+ DriverDesc = "320x240 (ModeX, planar)";\r
+\r
+ outpw(SEQU_ADDR, 0x0604);\r
+ memset((unsigned char *)0xA0000 + __djgpp_conventional_base,0,0x10000); // for clean mode switch\r
+ outpw(SEQU_ADDR, 0x0110);\r
+ outp(MISC_OUTPUT, 0xe3);\r
+ outpw(SEQU_ADDR, 0x0300);\r
+ outp(CRTC_ADDR, 0x11);\r
+ in_byte = inp((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outp((CRTC_ADDR+1), in_byte);\r
+ outpw(CRTC_ADDR, 0x0d06);\r
+ outpw(CRTC_ADDR, 0x3e07);\r
+ outpw(CRTC_ADDR, 0x4109);\r
+ outpw(CRTC_ADDR, 0xea10);\r
+ outpw(CRTC_ADDR, 0xac11);\r
+ outpw(CRTC_ADDR, 0xdf12);\r
+ outpw(CRTC_ADDR, 0x0014);\r
+ outpw(CRTC_ADDR, 0xe715);\r
+ outpw(CRTC_ADDR, 0x0616);\r
+ outpw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=320, sy=240;\r
+ tx=20, ty=15;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+}\r
+\r
+void Set360x240()\r
+{ char in_byte;\r
+\r
+ DriverDesc = "360x240 (ModeX, planar)";\r
+\r
+ outpw(SEQU_ADDR, 0x0604);\r
+ memset((unsigned char *)0xA0000 + __djgpp_conventional_base,0,0x10000); // for clean mode switch\r
+ outpw(SEQU_ADDR, 0x100);\r
+ outp(MISC_OUTPUT, 0xe7);\r
+ outpw(SEQU_ADDR, 0x300);\r
+ outp(CRTC_ADDR, 0x11);\r
+ in_byte = inp((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outp((CRTC_ADDR+1), in_byte);\r
+ outpw(CRTC_ADDR, 0x6b00);\r
+ outpw(CRTC_ADDR, 0x5901);\r
+ outpw(CRTC_ADDR, 0x5a02);\r
+ outpw(CRTC_ADDR, 0x8e03);\r
+ outpw(CRTC_ADDR, 0x5e04);\r
+ outpw(CRTC_ADDR, 0x8a05);\r
+ outpw(CRTC_ADDR, 0x0d06);\r
+ outpw(CRTC_ADDR, 0x3e07);\r
+ outpw(CRTC_ADDR, 0x4109);\r
+ outpw(CRTC_ADDR, 0xea10);\r
+ outpw(CRTC_ADDR, 0xac11);\r
+ outpw(CRTC_ADDR, 0xdf12);\r
+ outpw(CRTC_ADDR, 0x2d13);\r
+ outpw(CRTC_ADDR, 0x0014);\r
+ outpw(CRTC_ADDR, 0xe715);\r
+ outpw(CRTC_ADDR, 0x0616);\r
+ outpw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=360, sy=240;\r
+ tx=23, ty=15;\r
+ cx1=0, cy1=0;\r
+ cx2=sx-1, cy2=sy-1;\r
+}\r
+\r
+void InitModeX(int xres, int yres)\r
+{\r
+ int found;\r
+\r
+ BIOS_SetVideoMode(0x13);\r
+\r
+ found=0;\r
+ if (xres==320 && yres==240) { Set320x240(); found=1; }\r
+ if (xres==360 && yres==240) { Set360x240(); found=1; }\r
+ if (xres==256 && yres==256) { Set256x256(); found=1; }\r
+\r
+ if (!found)\r
+ {\r
+ // resolution not found, bitch...\r
+ err("Internal error: unknown ModeX resolution");\r
+ }\r
+ // resolution found..\r
+ else\r
+ {\r
+ ShowPage=LFB_ShowPage;\r
+ if (xres != 256 && yres != 256)\r
+ ShowPage=ModeXShowPage;\r
+ ShutdownVideo=ModeXShutdown;\r
+ }\r
+\r
+ video=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vscreen=(byte *) valloc(sx*sy, "vscreen", 0);\r
+ screen=vscreen;\r
+ memset(screen, 0, sx*sy);\r
+}\r
+\r
+// ================================= VESA ====================================\r
+\r
+int VESAShutdown(int i)\r
+{\r
+ if (i) BIOS_SetVideoMode(0x3);\r
+ free(screen);\r
+ return 0;\r
+}\r
+\r
+void VESASetBank(int bank)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, 0x4f05);\r
+ SET_BX(r, 0);\r
+ SET_DX(r, bank);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int VESAShowPage(void)\r
+{\r
+ byte *s,*d;\r
+ int y,bytes,bank;\r
+ int span;\r
+\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ s=screen;\r
+ d=video;\r
+\r
+ bank=0;\r
+ bytes=65536;\r
+ VESASetBank(bank++);\r
+\r
+ // *** no padding exists now, can be rewritten smaller/faster - aen\r
+ for (y=sy; y; y--)\r
+ {\r
+ if (bytes >= sx)\r
+ { memcpy(d,s,sx);\r
+ bytes-=sx;\r
+ s+=sx;\r
+ d+=sx;\r
+ }\r
+ else\r
+ { memcpy(d,s,bytes);\r
+ s+=bytes;\r
+ span=sx-bytes;\r
+\r
+ VESASetBank(bank++);\r
+ d=video;\r
+ bytes=65536;\r
+\r
+ memcpy(d,s,span);\r
+ bytes-=span;\r
+ s+=span;\r
+ d+=span;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void Set640x480()\r
+{\r
+ REGISTERS r;\r
+\r
+ DriverDesc = "640x480 (VESA, Banked)";\r
+\r
+ SET_BX(r, 0x0101);\r
+ SET_AX(r, 0x4f02);\r
+ INTERRUPT(0x10, r);\r
+\r
+ sx=640; sy=480;\r
+ tx=40; ty=30;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+}\r
+\r
+void InitVESA(int xres, int yres)\r
+{\r
+ int found;\r
+\r
+ found=0;\r
+ if (xres==640 && yres==480) { Set640x480(); found=1; }\r
+\r
+ if (!found)\r
+ err("Internal error: unknown VESA resolution");\r
+\r
+ // setup driver functions\r
+ ShowPage = VESAShowPage; // reassign for banked VESA video blt\r
+ ShutdownVideo = VESAShutdown;\r
+\r
+ video=(byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vscreen=(byte *) valloc(sx*sy, "vscreen", 0);\r
+ screen=vscreen;\r
+ memset(screen, 0, sx*sy);\r
+}\r
+\r
+// ============================================================================\r
+\r
+int InitVideo(int xres, int yres)\r
+{\r
+ int found;\r
+\r
+ found=0;\r
+ if (xres==320 && yres==200) { InitMode13h(); found=1; }\r
+ if (xres==320 && yres==240) { InitModeX(xres,yres); found=1; }\r
+ if (xres==360 && yres==240) { InitModeX(xres,yres); found=1; }\r
+ if (xres==256 && yres==256) { InitModeX(xres,yres); found=1; }\r
+ if (xres==640 && yres==480) { InitVESA(xres,yres); found=1; }\r
+\r
+ if (found)\r
+ {\r
+ tsx=xres; tsy=yres;\r
+ Logp("Sys: Initializing %s.", DriverDesc);\r
+ InitMouse(tsx, tsy);\r
+ }\r
+ else\r
+ {\r
+ InitMode13h();\r
+ tsx=320; tsy=200;\r
+ Logp("Unknown video mode %dx%d; defaulting to mode 13h.", xres, yres);\r
+ InitMouse(tsx, tsy);\r
+ }\r
+ LogDone();\r
+ return found;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#define SEQU_ADDR 0x3c4\r
+#define CRTC_ADDR 0x3d4\r
+#define MISC_OUTPUT 0x3c2\r
+\r
+byte *screenbase; // ptr to A000:0000\r
+int endcol,nextl; // end column number thingy | next line\r
+int winofs;\r
+\r
+// ================================= Code ====================================\r
+\r
+void ModeXSetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+void plane(byte p)\r
+{\r
+ int hi=1<<p;\r
+ outpw(0x03c4, (hi<<8)|0x02);\r
+}\r
+\r
+int ModeXShutdown()\r
+{\r
+ ModeXSetMode(0x3);\r
+ vfree(screen);\r
+ return 0;\r
+}\r
+\r
+void clearScreen()\r
+{\r
+ // set write to ALL PLANES simultaneously for extra-quick clears.\r
+ asm("movw $0x3c4, %%dx \n\t"\r
+ "movw $0x0f02, %%ax \n\t"\r
+ "outw %%ax, %%dx \n\t"\r
+ "movl _screenbase, %%edi \n\t"\r
+ "movl $0, %%eax \n\t"\r
+ "movl $11264, %%ecx \n\t"\r
+ "rep \n\t"\r
+ "stosl \n\t"\r
+ :\r
+ :\r
+ : "eax","edx","edi","ecx","cc" );\r
+}\r
+\r
+void SetView(word offset)\r
+{\r
+ while (inportb(0x3da) & 1);\r
+\r
+ _disable();\r
+\r
+ outportb(0x3d4, (offset >> 8) | 0x0c);\r
+ outportb(0x3d4, (offset & 0xff) | 0x0d);\r
+\r
+ _enable();\r
+}\r
+\r
+int ModeXShowPage()\r
+{\r
+ byte *s,*d;\r
+ int x,y,k;\r
+ int sx2;\r
+ int b;\r
+\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ //s=screen+(16*tsx)+16;\r
+ b=(16*tsx)+16;\r
+ d=screenbase;\r
+ sx2=sx>>2;\r
+\r
+ //while (!(inp(986) & 8));\r
+\r
+ for (y=0; y<sy; ++y,d+=sx2)\r
+ {\r
+ s=screen+(y*tsx)+b;\r
+ for (k=0; k<4; k++,s-=sx)\r
+ {\r
+ plane(k);\r
+ for (x=0; x<sx2; x++,s+=4)\r
+ d[x]=s[k];\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%edx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"csl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul _tsx, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%ecx \n\t"\r
+ "shrl $2, %%ecx \n\t"\r
+ "repz \n\t"\r
+ "movsl \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz csl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%ecx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"tcsl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul _tsx, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%edx \n\t"\r
+"drawloop: \n\t"\r
+ "lodsb \n\t"\r
+ "orb %%al, %%al \n\t"\r
+ "jz nodraw \n\t"\r
+ "stosb \n\t"\r
+ "decl %%edx \n\t"\r
+ "jz endline \n\t"\r
+ "jmp drawloop \n\t"\r
+"nodraw: \n\t"\r
+ "incl %%edi \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz drawloop \n\t"\r
+"endline: \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tcsl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCopyTile(int x, int y, byte *spr)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+" ctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl $0, %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl _tsx, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz ctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr)\r
+ : "eax","ecx","esi","edi","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTCopyTile(int x, int y, byte *spr, byte *matte)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl %3, %%edx \n\t"\r
+"tctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl _tsx, %%edi \n\t"\r
+ "addl $16, %%edx \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr), "m" (matte)\r
+ : "eax","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXScaleSprite(int x, int y, int w, int h, int tw, int th, byte *s)\r
+{ int i,j,xm,ym,xd,yd,sx,sy=0,xs,ys,dys=0;\r
+ unsigned char *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (!tw || !th) return 0;\r
+ tw += sgn(tw); th += sgn(th);\r
+ xm = abs(tw); ym = abs(th);\r
+ xs = (w<<16)/xm; ys = (h<<16)/ym;\r
+ xd = sgn(tw); yd = sgn(th);\r
+\r
+ if (tw>0 && th>0) dys=tsx-xm;\r
+ else if (tw>0 && th<0) dys=(0-tsx)-xm;\r
+ else if (tw<0 && th>0) dys=tsx+xm;\r
+ else if (tw<0 && th<0) dys=(0-tsx)+xm;\r
+\r
+ d = screen+(y*tsx)+x;\r
+ for (i=0;i<ym;++i) {\r
+ sx=0;\r
+ for (j=0;j<xm;++j) {\r
+ *d=s[(sx>>16)];\r
+ d+=xd;\r
+ sx+=xs;\r
+ }\r
+ d+=dys;\r
+ sy+=ys;\r
+ s+=(sy>>16)*w;\r
+ sy&=0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl _tx, %%ebx \n\t"\r
+ "incl %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "movl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXTRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%edi \n\t"\r
+ "imul _tsx, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _screen, %%edi \n\t"\r
+ "movl _tx, %%ebx \n\t"\r
+ "incl %%ebx \n\t"\r
+ "movl %3, %%ecx \n\t"\r
+"tileloop1: \n\t"\r
+ "movw (%%ecx), %%ax \n\t"\r
+ "movzwl %%ax, %%edx \n\t"\r
+ "shll $1, %%edx \n\t"\r
+ "addl _tileidx, %%edx \n\t"\r
+ "movw (%%edx), %%ax \n\t"\r
+ "orw %%ax, %%ax \n\t"\r
+ "jz next1 \n\t"\r
+ "movzwl %%ax, %%esi \n\t"\r
+ "shll $8, %%esi \n\t"\r
+ "movl %%esi, %%edx \n\t"\r
+ "addl _vspmask, %%edx \n\t"\r
+ "addl _vsp, %%esi \n\t"\r
+ "movl %2, %%eax \n\t"\r
+ "shll $4, %%eax \n\t"\r
+ "addl %%eax, %%esi \n\t"\r
+ "addl %%eax, %%edx \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+"next1: \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "addl $2, %%ecx \n\t"\r
+ "decl %%ebx \n\t"\r
+ "jnz tileloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (yofs), "m" (map)\r
+ : "eax","ebx","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXColorField(int x, int y, byte c)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl %1, %%eax \n\t"\r
+ "imul _tsx, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _screen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl $8, %%ecx \n\t"\r
+ "movb %2, %%al \n\t"\r
+"lineloop1: \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "addl _sx, %%edi \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "incl %%edi \n\t"\r
+ "stosb \n\t"\r
+ "addl _sx, %%edi \n\t"\r
+ "addl $16, %%edi \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz lineloop1 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (c)\r
+ : "eax","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(screen+(tsx*16)+16,0,(tsx*sy));\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXPutPixel(int x, int y, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ screen[(y*tsx)+x]=color;\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXGetPixel(int x, int y)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ cpubyte=ETC;\r
+ return screen[(y*tsx)+x];\r
+}\r
+\r
+int ModeXHLine(int x, int y, int x2, int color)\r
+{ byte *d;\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (x2<x) { int t=x2; x=x2; x2=t; }\r
+\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ x2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXVLine(int x, int y, int y2, int color)\r
+{ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (y2<y) { int t=y2; x=y2; y2=t; }\r
+\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ y2+=16;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXLine(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ x1+=16;y1+=16; // aen; adjust these here??\r
+ x2+=16;y2+=16;\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCircle(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ ModeXPutPixel(x+cx,y+cy,color);\r
+ if (cx) ModeXPutPixel(x-cx,y+cy,color);\r
+ if (cy) ModeXPutPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) ModeXPutPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ ModeXPutPixel(x+cy,y+cx,color);\r
+ if (cx) ModeXPutPixel(x+cy,y-cx,color);\r
+ if (cy) ModeXPutPixel(x-cy,y+cx,color);\r
+ if (cx && cy) ModeXPutPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXCircleFill(int x, int y, int radius, int color)\r
+{ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ ModeXHLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) ModeXHLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ ModeXHLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) ModeXHLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int ModeXRect(int x, int y, int x2, int y2, int color)\r
+{\r
+ ModeXHLine(x,y,x2,color);\r
+ ModeXHLine(x,y2,x2,color);\r
+ ModeXVLine(x,y+1,y2-1,color);\r
+ ModeXVLine(x2,y+1,y2-1,color);\r
+ return 0;\r
+}\r
+\r
+int ModeXRectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (y2<y) { int t=y2; y=y2; y2=t; }\r
+\r
+ for (; y<=y2; y++)\r
+ ModeXHLine(x,y,x2,color);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void Set256x256()\r
+// -- ric: 15/Jun/98 --\r
+// My first attempt at graphics code :)\r
+{\r
+ char in_byte;\r
+\r
+ outportw(SEQU_ADDR, 0x0100);\r
+ outportb(CRTC_ADDR, 0x11);\r
+ in_byte = inportb((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outportb((CRTC_ADDR+1), in_byte);\r
+ outportw(SEQU_ADDR, 0x0604);\r
+ outportb(MISC_OUTPUT, 0xe3);\r
+\r
+ outportb(CRTC_ADDR, 0x0); outportb(CRTC_ADDR+1, 0x5f);\r
+ outportb(CRTC_ADDR, 0x1); outportb(CRTC_ADDR+1, 0x3f);\r
+ outportb(CRTC_ADDR, 0x2); outportb(CRTC_ADDR+1, 0x40);\r
+ outportb(CRTC_ADDR, 0x3); outportb(CRTC_ADDR+1, 0x82);\r
+ outportb(CRTC_ADDR, 0x4); outportb(CRTC_ADDR+1, 0x4a);\r
+ outportb(CRTC_ADDR, 0x5); outportb(CRTC_ADDR+1, 0x9a);\r
+ outportb(CRTC_ADDR, 0x6); outportb(CRTC_ADDR+1, 0x23);\r
+ outportb(CRTC_ADDR, 0x7); outportb(CRTC_ADDR+1, 0xb2);\r
+ outportb(CRTC_ADDR, 0x8); outportb(CRTC_ADDR+1, 0x0);\r
+ outportb(CRTC_ADDR, 0x9); outportb(CRTC_ADDR+1, 0x61);\r
+ outportb(CRTC_ADDR, 0x10); outportb(CRTC_ADDR+1, 0xa);\r
+ outportb(CRTC_ADDR, 0x11); outportb(CRTC_ADDR+1, 0xac);\r
+ outportb(CRTC_ADDR, 0x12); outportb(CRTC_ADDR+1, 0xff);\r
+ outportb(CRTC_ADDR, 0x14); outportb(CRTC_ADDR+1, 0x0);\r
+ outportb(CRTC_ADDR, 0x15); outportb(CRTC_ADDR+1, 0x7);\r
+ outportb(CRTC_ADDR, 0x16); outportb(CRTC_ADDR+1, 0x1a);\r
+ outportb(CRTC_ADDR, 0x17); outportb(CRTC_ADDR+1, 0xe3);\r
+ outportb(SEQU_ADDR, 0x1); outportw(SEQU_ADDR+1, 0x1);\r
+ outportb(0x3ce, 0x5); outportb(0x3cf, 0x40);\r
+ outportb(0x3ce, 0x6); outportb(0x3cf, 0x5);\r
+ inportb(0x3DA);\r
+ outportb(0x3C0, 0x1 | 0x20);\r
+ outportb(0x3C0, 0x41);\r
+ outportb(CRTC_ADDR, 0x13);\r
+ outportb(CRTC_ADDR+1, 0x20);\r
+\r
+ outportw(SEQU_ADDR, 0x0300);\r
+\r
+ sx=256; sy=256;\r
+ tsx=288; tsy=288;\r
+ tx=17; ty=16;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+ endcol=272; nextl=64;\r
+ winofs=4608;\r
+ DriverDesc = "256x256 (ModeX, planar)";\r
+}\r
+\r
+void Set320x240()\r
+{ char in_byte;\r
+\r
+ outportw(SEQU_ADDR, 0x0604);\r
+ outportw(SEQU_ADDR, 0x0110);\r
+ outportb(MISC_OUTPUT, 0xe3);\r
+ outportw(SEQU_ADDR, 0x0300);\r
+ outportb(CRTC_ADDR, 0x11);\r
+ in_byte = inportb((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outportb((CRTC_ADDR+1), in_byte);\r
+ outportw(CRTC_ADDR, 0x0d06);\r
+ outportw(CRTC_ADDR, 0x3e07);\r
+ outportw(CRTC_ADDR, 0x4109);\r
+ outportw(CRTC_ADDR, 0xea10);\r
+ outportw(CRTC_ADDR, 0xac11);\r
+ outportw(CRTC_ADDR, 0xdf12);\r
+ outportw(CRTC_ADDR, 0x0014);\r
+ outportw(CRTC_ADDR, 0xe715);\r
+ outportw(CRTC_ADDR, 0x0616);\r
+ outportw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=320; sy=240;\r
+ tsx=352; tsy=272;\r
+ tx=20; ty=15;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+ endcol=336; nextl=80;\r
+ winofs=5632;\r
+ DriverDesc = "320x240 (ModeX, planar)";\r
+}\r
+\r
+void Set360x240()\r
+{ char in_byte;\r
+\r
+ outportw(SEQU_ADDR, 0x0604);\r
+ outportw(SEQU_ADDR, 0x100);\r
+ outportb(MISC_OUTPUT, 0xe7);\r
+ outportw(SEQU_ADDR, 0x300);\r
+ outportb(CRTC_ADDR, 0x11);\r
+ in_byte = inportb((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outportb((CRTC_ADDR+1), in_byte);\r
+ outportw(CRTC_ADDR, 0x6b00);\r
+ outportw(CRTC_ADDR, 0x5901);\r
+ outportw(CRTC_ADDR, 0x5a02);\r
+ outportw(CRTC_ADDR, 0x8e03);\r
+ outportw(CRTC_ADDR, 0x5e04);\r
+ outportw(CRTC_ADDR, 0x8a05);\r
+ outportw(CRTC_ADDR, 0x0d06);\r
+ outportw(CRTC_ADDR, 0x3e07);\r
+ outportw(CRTC_ADDR, 0x4109);\r
+ outportw(CRTC_ADDR, 0xea10);\r
+ outportw(CRTC_ADDR, 0xac11);\r
+ outportw(CRTC_ADDR, 0xdf12);\r
+ outportw(CRTC_ADDR, 0x2d13);\r
+ outportw(CRTC_ADDR, 0x0014);\r
+ outportw(CRTC_ADDR, 0xe715);\r
+ outportw(CRTC_ADDR, 0x0616);\r
+ outportw(CRTC_ADDR, 0xe317);\r
+\r
+ sx=360; sy=240;\r
+ tsx=392; tsy=272;\r
+ tx=23; ty=15;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+ endcol=376; nextl=90;\r
+ winofs=6272;\r
+ DriverDesc = "360x240 (ModeX, planar)";\r
+}\r
+\r
+void InitModeX(int res)\r
+{\r
+ ModeXSetMode(0x13);\r
+\r
+ switch (res)\r
+ {\r
+ case 0: Set320x240(); break;\r
+ case 1: Set360x240(); break;\r
+ case 2: Set256x256(); break; /* -- ric: 15/Jun/98 -- */\r
+ default: err("Internal error: unknown ModeX resolution code");\r
+ }\r
+\r
+ screenbase=(char *) 0xA0000+__djgpp_conventional_base;\r
+ screen=(char *) malloc(107648);\r
+ memset(screen,0,107648);\r
+ clearScreen();\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+\r
+ ShutdownVideo = ModeXShutdown;\r
+ ShowPage = ModeXShowPage;\r
+ CopySprite = ModeXCopySprite;\r
+ TCopySprite = ModeXTCopySprite;\r
+ CCopySprite = ModeXCCopySprite;\r
+ TCCopySprite = ModeXTCCopySprite;\r
+ CopyTile = ModeXCopyTile;\r
+ TCopyTile = ModeXTCopyTile;\r
+ ScaleSprite = ModeXScaleSprite;\r
+ RenderMAPLine = ModeXRenderMAPLine;\r
+ TRenderMAPLine = ModeXTRenderMAPLine;\r
+ ColorField = ModeXColorField;\r
+ ClearScreen = ModeXClearScreen;\r
+ PutPixel = ModeXPutPixel;\r
+ GetPixel = ModeXGetPixel;\r
+ HLine = ModeXHLine;\r
+ VLine = ModeXVLine;\r
+ Line = ModeXLine;\r
+ Circle = ModeXCircle;\r
+ CircleFill = ModeXCircleFill;\r
+ Rect = ModeXRect;\r
+ RectFill = ModeXRectFill;\r
+}\r
--- /dev/null
+#ifndef MTYPES_H\r
+#define MTYPES_H\r
+\r
+/*\r
+ MikMod atomic types:\r
+ ====================\r
+*/\r
+\r
+\r
+#ifdef __OS2__\r
+\r
+typedef signed char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+/* ULONG and BOOL are already defined in OS2.H */\r
+\r
+#elif defined(__alpha)\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+/* long is 8 bytes on dec alpha - RCA */\r
+typedef int SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned int ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#else\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned long ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#endif\r
+\r
+\r
+#ifdef __OS2__\r
+#define INCL_DOS\r
+#define INCL_MCIOS2\r
+#define INCL_MMIOOS2\r
+#include <os2.h>\r
+#include <os2me.h>\r
+#include <mmio.h>\r
+#endif\r
+\r
+\r
+#ifdef __WATCOMC__\r
+#define inportb(x) inp(x)\r
+#define outportb(x,y) outp(x,y)\r
+#define inport(x) inpw(x)\r
+#define outport(x,y) outpw(x,y)\r
+#define disable() _disable()\r
+#define enable() _enable()\r
+#endif\r
+\r
+\r
+#ifdef __DJGPP__\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+#include <pc.h>\r
+#define inp inportw\r
+#define outport outportw\r
+#define inport inportw\r
+#define interrupt \r
+#endif\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef PCX_H\r
+#define PCX_H\r
+\r
+// -- globals --\r
+\r
+extern word width,depth;\r
+\r
+// -- prototypes --\r
+\r
+extern void ReadPCXLine(byte *dest);\r
+extern void LoadPCXHeader(char *fname);\r
+extern void LoadPCXHeaderNP(char *fname);\r
+extern void LoadPCX(char *fname, byte *dest);\r
+extern byte *LoadPCXBuf(char *fname);\r
+\r
+#endif // PCX_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "verge.h"\r
+#include <math.h>\r
+\r
+// ================================= Data ====================================\r
+\r
+int oxw, oyw;\r
+int xofs, yofs;\r
+int xtc, ytc;\r
+\r
+byte curlayer, animate=0;\r
+byte cameratracking=1, tracker=0;\r
+byte showobs=0, showzone=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void BlitBackLayer(byte l)\r
+{\r
+ int i,j,c;\r
+ byte *img;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ // Adjust view\r
+\r
+ oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
+ oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
+ xofs=-(oxw&15); //(16-(oxw&15));\r
+ yofs=-(oyw&15); //(16-(oyw&15));\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ // Draw it, bitch!\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ c=layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)];\r
+ c=tileidx[c];\r
+ c=c<numtiles?c:0;\r
+ img=vsp+(256*c);\r
+ CopyTileClip((j*16)+xofs,(i*16)+yofs,img);\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+void TransBlitLayer(byte l)\r
+{\r
+ int i,j,offset,c;\r
+ byte *img,*mask;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ // Adjust view\r
+\r
+ oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
+ oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ // Draw it, bitch!\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];\r
+ c=c<numtiles?c:0;\r
+ offset=c*256;\r
+ img=vsp+offset; mask=vspmask+offset;\r
+ if (img!=vsp)\r
+ TCopyTileClip((j*16)+xofs,(i*16)+yofs,img,mask);\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+void BlitLayerLucent(byte l)\r
+{\r
+ int i,j,offset,c;\r
+ byte *img,*mask;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ // Adjust view\r
+\r
+ oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
+ oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ // Draw it, bitch!\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];\r
+ c=c<numtiles?c:0;\r
+ offset=c*256;\r
+ img=vsp+offset; mask=vspmask+offset;\r
+ if (img!=vsp)\r
+ TCopyTileLucentClip((j*16)+xofs,(i*16)+yofs,img);\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+void BlitLayer(byte c)\r
+{\r
+ if ( curlayer && !layer[c].hline && !layer[c].trans) { TransBlitLayer(c); return; }\r
+ if (!curlayer && !layer[c].hline && !layer[c].trans) { BlitBackLayer(c); return; }\r
+ if (layer[c].trans) { BlitLayerLucent(c); return; }\r
+ if (layer[c].hline) { ExecuteEvent(layer[c].hline); return; }\r
+}\r
+\r
+void DrawObstructions()\r
+{\r
+ int i,j;\r
+\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw/16;\r
+ ytc=oyw/16;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ if (obstruct[((ytc+i)*layer[0].sizex)+(xtc+j)])\r
+ ColorField((j*16)+xofs,(i*16)+yofs,7);\r
+ }\r
+}\r
+\r
+void DrawZones()\r
+{\r
+ int i,j;\r
+ char z;\r
+\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=-(oxw&15);\r
+ yofs=-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ z=zone[((ytc+i)*layer[0].sizex)+(xtc+j)];\r
+ if (z)\r
+ {\r
+ ColorField((j*16)+xofs,(i*16)+yofs,z);\r
+ }\r
+ if (player)\r
+ {\r
+ if ( ((player->x+7)/16)==(xtc+j) && ((player->y+7)/16)==(ytc+i))\r
+ {\r
+ ColorField((j*16)+xofs,(i*16)+yofs,31);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+void HookScriptThing(char *src)\r
+{\r
+ char mystr[10];\r
+\r
+ src++;\r
+ strcpy(mystr, src);\r
+ src=mystr;\r
+ while (*src != 'X') src++;\r
+ *src=0;\r
+ ExecuteEvent(atoi(mystr));\r
+}\r
+\r
+void RenderMAP()\r
+{ char *src;\r
+\r
+ curlayer=0;\r
+ src=rstring;\r
+ while (*src)\r
+ {\r
+ switch (*src)\r
+ {\r
+ case '1': BlitLayer(0); break;\r
+ case '2': BlitLayer(1); break;\r
+ case '3': BlitLayer(2); break;\r
+ case '4': BlitLayer(3); break;\r
+ case '5': BlitLayer(4); break;\r
+ case '6': BlitLayer(5); break;\r
+ case 'E': RenderEntities(); break;\r
+ case 'S': HookScriptThing(src); break;\r
+ case 'R': HookRetrace();\r
+ curlayer++; break;\r
+ }\r
+ src++;\r
+ }\r
+ if (!curlayer) ClearScreen();\r
+ if (showobs) DrawObstructions();\r
+ if (showzone) DrawZones();\r
+}\r
+\r
+void Render()\r
+{\r
+ if (cameratracking==1 && player)\r
+ {\r
+ if (player->x+8>(sx/2)) xwin=(player->x+8-(sx/2)); else xwin=0;\r
+ if (player->y+8>(sy/2)) ywin=(player->y+8-(sy/2)); else ywin=0;\r
+ if (xwin>((layer[0].sizex*16)-sx)) xwin=((layer[0].sizex*16)-sx);\r
+ if (ywin>((layer[0].sizey*16)-sy)) ywin=((layer[0].sizey*16)-sy);\r
+ }\r
+ if (cameratracking==2)\r
+ {\r
+ if (entity[tracker].x+8>(sx/2)) xwin=(entity[tracker].x+8-(sx/2)); else xwin=0;\r
+ if (entity[tracker].y+8>(sy/2)) ywin=(entity[tracker].y+8-(sy/2)); else ywin=0;\r
+ if (xwin>((layer[0].sizex*16)-sx)) xwin=((layer[0].sizex*16)-sx);\r
+ if (ywin>((layer[0].sizey*16)-sy)) ywin=((layer[0].sizey*16)-sy);\r
+ }\r
+ SiftEntities();\r
+ RenderMAP();\r
+}\r
+\r
+int rnd(int lo, int hi)\r
+{\r
+ int range=hi-lo+1;\r
+ int i=rand() % range;\r
+ return i+lo;\r
+}\r
+\r
+void AnimateTile(byte i, int l)\r
+{\r
+ switch (vspanim[i].mode)\r
+ {\r
+ case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
+ else tileidx[l]=vspanim[i].start;\r
+ break;\r
+ case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
+ else tileidx[l]=vspanim[i].finish;\r
+ break;\r
+ case 2: tileidx[l]=rnd(vspanim[i].start,vspanim[i].finish);\r
+ break;\r
+ case 3: if (flipped[l])\r
+ {\r
+ if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
+ else { tileidx[l]++; flipped[l]=0; }\r
+ }\r
+ else\r
+ {\r
+ if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
+ else { tileidx[l]--; flipped[l]=1; }\r
+ }\r
+ }\r
+}\r
+\r
+void Animate(byte i)\r
+{ static int l;\r
+\r
+ vadelay[i]=0;\r
+ for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
+ AnimateTile(i,l);\r
+}\r
+\r
+void CheckTileAnimation()\r
+{ static byte i;\r
+\r
+ if (!animate) return;\r
+ if (!vsp) return;\r
+ for (i=0; i<100; i++)\r
+ {\r
+ if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
+ Animate(i);\r
+ vadelay[i]++;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef RENDER_H\r
+#define RENDER_H\r
+\r
+extern byte animate, cameratracking, showobs, showzone, tracker;\r
+\r
+void Render();\r
+void BlitLayer(byte c);\r
+void CheckTileAnimation();\r
+int rnd(int min, int max);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+int sintbl[]=\r
+{\r
+ 0,\r
+ 1143,\r
+ 2287,\r
+ 3429,\r
+ 4571,\r
+ 5711,\r
+ 6850,\r
+ 7986,\r
+ 9120,\r
+ 10251,\r
+ 11380,\r
+ 12504,\r
+ 13625,\r
+ 14742,\r
+ 15854,\r
+ 16961,\r
+ 18063,\r
+ 19160,\r
+ 20251,\r
+ 21336,\r
+ 22414,\r
+ 23485,\r
+ 24549,\r
+ 25606,\r
+ 26655,\r
+ 27696,\r
+ 28728,\r
+ 29752,\r
+ 30766,\r
+ 31771,\r
+ 32767,\r
+ 33752,\r
+ 34728,\r
+ 35692,\r
+ 36646,\r
+ 37589,\r
+ 38520,\r
+ 39439,\r
+ 40347,\r
+ 41242,\r
+ 42125,\r
+ 42994,\r
+ 43851,\r
+ 44694,\r
+ 45524,\r
+ 46340,\r
+ 47141,\r
+ 47929,\r
+ 48701,\r
+ 49459,\r
+ 50202,\r
+ 50930,\r
+ 51642,\r
+ 52338,\r
+ 53018,\r
+ 53683,\r
+ 54330,\r
+ 54962,\r
+ 55576,\r
+ 56174,\r
+ 56754,\r
+ 57318,\r
+ 57863,\r
+ 58392,\r
+ 58902,\r
+ 59394,\r
+ 59869,\r
+ 60325,\r
+ 60762,\r
+ 61182,\r
+ 61582,\r
+ 61964,\r
+ 62327,\r
+ 62671,\r
+ 62996,\r
+ 63301,\r
+ 63588,\r
+ 63855,\r
+ 64102,\r
+ 64330,\r
+ 64539,\r
+ 64728,\r
+ 64897,\r
+ 65046,\r
+ 65175,\r
+ 65285,\r
+ 65375,\r
+ 65445,\r
+ 65495,\r
+ 65525,\r
+ 65534,\r
+ 65525,\r
+ 65495,\r
+ 65445,\r
+ 65375,\r
+ 65285,\r
+ 65176,\r
+ 65046,\r
+ 64897,\r
+ 64728,\r
+ 64539,\r
+ 64330,\r
+ 64102,\r
+ 63855,\r
+ 63588,\r
+ 63301,\r
+ 62996,\r
+ 62671,\r
+ 62327,\r
+ 61964,\r
+ 61582,\r
+ 61182,\r
+ 60763,\r
+ 60325,\r
+ 59869,\r
+ 59394,\r
+ 58902,\r
+ 58392,\r
+ 57864,\r
+ 57318,\r
+ 56755,\r
+ 56174,\r
+ 55576,\r
+ 54962,\r
+ 54331,\r
+ 53683,\r
+ 53019,\r
+ 52338,\r
+ 51642,\r
+ 50930,\r
+ 50202,\r
+ 49459,\r
+ 48702,\r
+ 47929,\r
+ 47142,\r
+ 46340,\r
+ 45524,\r
+ 44694,\r
+ 43851,\r
+ 42994,\r
+ 42125,\r
+ 41242,\r
+ 40347,\r
+ 39440,\r
+ 38520,\r
+ 37589,\r
+ 36646,\r
+ 35693,\r
+ 34728,\r
+ 33753,\r
+ 32767,\r
+ 31772,\r
+ 30766,\r
+ 29752,\r
+ 28728,\r
+ 27696,\r
+ 26655,\r
+ 25606,\r
+ 24549,\r
+ 23485,\r
+ 22414,\r
+ 21336,\r
+ 20251,\r
+ 19160,\r
+ 18064,\r
+ 16961,\r
+ 15854,\r
+ 14742,\r
+ 13625,\r
+ 12504,\r
+ 11380,\r
+ 10252,\r
+ 9120,\r
+ 7986,\r
+ 6850,\r
+ 5711,\r
+ 4571,\r
+ 3430,\r
+ 2287,\r
+ 1143,\r
+ 0,\r
+ -1143,\r
+ -2286,\r
+ -3429,\r
+ -4571,\r
+ -5711,\r
+ -6850,\r
+ -7986,\r
+ -9120,\r
+ -10251,\r
+ -11379,\r
+ -12504,\r
+ -13625,\r
+ -14741,\r
+ -15854,\r
+ -16961,\r
+ -18063,\r
+ -19160,\r
+ -20251,\r
+ -21335,\r
+ -22414,\r
+ -23485,\r
+ -24549,\r
+ -25606,\r
+ -26655,\r
+ -27696,\r
+ -28728,\r
+ -29752,\r
+ -30766,\r
+ -31771,\r
+ -32767,\r
+ -33752,\r
+ -34728,\r
+ -35692,\r
+ -36646,\r
+ -37589,\r
+ -38520,\r
+ -39439,\r
+ -40347,\r
+ -41242,\r
+ -42124,\r
+ -42994,\r
+ -43851,\r
+ -44694,\r
+ -45524,\r
+ -46340,\r
+ -47141,\r
+ -47929,\r
+ -48701,\r
+ -49459,\r
+ -50202,\r
+ -50930,\r
+ -51642,\r
+ -52338,\r
+ -53018,\r
+ -53682,\r
+ -54330,\r
+ -54962,\r
+ -55576,\r
+ -56174,\r
+ -56754,\r
+ -57318,\r
+ -57863,\r
+ -58392,\r
+ -58902,\r
+ -59394,\r
+ -59869,\r
+ -60325,\r
+ -60762,\r
+ -61182,\r
+ -61582,\r
+ -61964,\r
+ -62327,\r
+ -62671,\r
+ -62996,\r
+ -63301,\r
+ -63588,\r
+ -63855,\r
+ -64102,\r
+ -64330,\r
+ -64539,\r
+ -64728,\r
+ -64897,\r
+ -65046,\r
+ -65175,\r
+ -65285,\r
+ -65375,\r
+ -65445,\r
+ -65495,\r
+ -65525,\r
+ -65534,\r
+ -65525,\r
+ -65495,\r
+ -65445,\r
+ -65375,\r
+ -65285,\r
+ -65176,\r
+ -65046,\r
+ -64897,\r
+ -64728,\r
+ -64539,\r
+ -64330,\r
+ -64102,\r
+ -63855,\r
+ -63588,\r
+ -63302,\r
+ -62996,\r
+ -62671,\r
+ -62327,\r
+ -61964,\r
+ -61582,\r
+ -61182,\r
+ -60763,\r
+ -60325,\r
+ -59869,\r
+ -59395,\r
+ -58902,\r
+ -58392,\r
+ -57864,\r
+ -57318,\r
+ -56755,\r
+ -56174,\r
+ -55576,\r
+ -54962,\r
+ -54331,\r
+ -53683,\r
+ -53019,\r
+ -52338,\r
+ -51642,\r
+ -50930,\r
+ -50202,\r
+ -49460,\r
+ -48702,\r
+ -47929,\r
+ -47142,\r
+ -46340,\r
+ -45524,\r
+ -44694,\r
+ -43851,\r
+ -42995,\r
+ -42125,\r
+ -41242,\r
+ -40347,\r
+ -39440,\r
+ -38520,\r
+ -37589,\r
+ -36646,\r
+ -35693,\r
+ -34728,\r
+ -33753,\r
+ -32767,\r
+ -31772,\r
+ -30767,\r
+ -29752,\r
+ -28728,\r
+ -27696,\r
+ -26655,\r
+ -25606,\r
+ -24550,\r
+ -23485,\r
+ -22414,\r
+ -21336,\r
+ -20251,\r
+ -19160,\r
+ -18064,\r
+ -16962,\r
+ -15854,\r
+ -14742,\r
+ -13625,\r
+ -12504,\r
+ -11380,\r
+ -10252,\r
+ -9121,\r
+ -7987,\r
+ -6850,\r
+ -5712,\r
+ -4571,\r
+ -3430,\r
+ -2287,\r
+ -1144,\r
+};\r
+\r
+int costbl[]={\r
+ 65535,\r
+ 65525,\r
+ 65495,\r
+ 65445,\r
+ 65375,\r
+ 65285,\r
+ 65175,\r
+ 65046,\r
+ 64897,\r
+ 64728,\r
+ 64539,\r
+ 64330,\r
+ 64102,\r
+ 63855,\r
+ 63588,\r
+ 63301,\r
+ 62996,\r
+ 62671,\r
+ 62327,\r
+ 61964,\r
+ 61582,\r
+ 61182,\r
+ 60763,\r
+ 60325,\r
+ 59869,\r
+ 59394,\r
+ 58902,\r
+ 58392,\r
+ 57863,\r
+ 57318,\r
+ 56754,\r
+ 56174,\r
+ 55576,\r
+ 54962,\r
+ 54330,\r
+ 53683,\r
+ 53018,\r
+ 52338,\r
+ 51642,\r
+ 50930,\r
+ 50202,\r
+ 49459,\r
+ 48702,\r
+ 47929,\r
+ 47141,\r
+ 46340,\r
+ 45524,\r
+ 44694,\r
+ 43851,\r
+ 42994,\r
+ 42125,\r
+ 41242,\r
+ 40347,\r
+ 39439,\r
+ 38520,\r
+ 37589,\r
+ 36646,\r
+ 35692,\r
+ 34728,\r
+ 33753,\r
+ 32767,\r
+ 31772,\r
+ 30766,\r
+ 29752,\r
+ 28728,\r
+ 27696,\r
+ 26655,\r
+ 25606,\r
+ 24549,\r
+ 23485,\r
+ 22414,\r
+ 21336,\r
+ 20251,\r
+ 19160,\r
+ 18063,\r
+ 16961,\r
+ 15854,\r
+ 14742,\r
+ 13625,\r
+ 12504,\r
+ 11380,\r
+ 10252,\r
+ 9120,\r
+ 7986,\r
+ 6850,\r
+ 5711,\r
+ 4571,\r
+ 3429,\r
+ 2287,\r
+ 1143,\r
+ 0,\r
+ -1143,\r
+ -2287,\r
+ -3429,\r
+ -4571,\r
+ -5711,\r
+ -6850,\r
+ -7986,\r
+ -9120,\r
+ -10251,\r
+ -11379,\r
+ -12504,\r
+ -13625,\r
+ -14742,\r
+ -15854,\r
+ -16961,\r
+ -18063,\r
+ -19160,\r
+ -20251,\r
+ -21336,\r
+ -22414,\r
+ -23485,\r
+ -24549,\r
+ -25606,\r
+ -26655,\r
+ -27696,\r
+ -28728,\r
+ -29752,\r
+ -30766,\r
+ -31771,\r
+ -32767,\r
+ -33752,\r
+ -34728,\r
+ -35692,\r
+ -36646,\r
+ -37589,\r
+ -38520,\r
+ -39439,\r
+ -40347,\r
+ -41242,\r
+ -42124,\r
+ -42994,\r
+ -43851,\r
+ -44694,\r
+ -45524,\r
+ -46340,\r
+ -47141,\r
+ -47929,\r
+ -48701,\r
+ -49459,\r
+ -50202,\r
+ -50930,\r
+ -51642,\r
+ -52338,\r
+ -53018,\r
+ -53683,\r
+ -54330,\r
+ -54962,\r
+ -55576,\r
+ -56174,\r
+ -56754,\r
+ -57318,\r
+ -57863,\r
+ -58392,\r
+ -58902,\r
+ -59394,\r
+ -59869,\r
+ -60325,\r
+ -60762,\r
+ -61182,\r
+ -61582,\r
+ -61964,\r
+ -62327,\r
+ -62671,\r
+ -62996,\r
+ -63301,\r
+ -63588,\r
+ -63855,\r
+ -64102,\r
+ -64330,\r
+ -64539,\r
+ -64728,\r
+ -64897,\r
+ -65046,\r
+ -65175,\r
+ -65285,\r
+ -65375,\r
+ -65445,\r
+ -65495,\r
+ -65525,\r
+ -65534,\r
+ -65525,\r
+ -65495,\r
+ -65445,\r
+ -65375,\r
+ -65285,\r
+ -65176,\r
+ -65046,\r
+ -64897,\r
+ -64728,\r
+ -64539,\r
+ -64330,\r
+ -64102,\r
+ -63855,\r
+ -63588,\r
+ -63301,\r
+ -62996,\r
+ -62671,\r
+ -62327,\r
+ -61964,\r
+ -61582,\r
+ -61182,\r
+ -60763,\r
+ -60325,\r
+ -59869,\r
+ -59394,\r
+ -58902,\r
+ -58392,\r
+ -57864,\r
+ -57318,\r
+ -56755,\r
+ -56174,\r
+ -55576,\r
+ -54962,\r
+ -54331,\r
+ -53683,\r
+ -53019,\r
+ -52338,\r
+ -51642,\r
+ -50930,\r
+ -50202,\r
+ -49460,\r
+ -48702,\r
+ -47929,\r
+ -47142,\r
+ -46340,\r
+ -45524,\r
+ -44694,\r
+ -43851,\r
+ -42994,\r
+ -42125,\r
+ -41242,\r
+ -40347,\r
+ -39440,\r
+ -38520,\r
+ -37589,\r
+ -36646,\r
+ -35693,\r
+ -34728,\r
+ -33753,\r
+ -32767,\r
+ -31772,\r
+ -30767,\r
+ -29752,\r
+ -28728,\r
+ -27696,\r
+ -26655,\r
+ -25606,\r
+ -24550,\r
+ -23485,\r
+ -22414,\r
+ -21336,\r
+ -20251,\r
+ -19160,\r
+ -18064,\r
+ -16961,\r
+ -15854,\r
+ -14742,\r
+ -13625,\r
+ -12504,\r
+ -11380,\r
+ -10252,\r
+ -9120,\r
+ -7986,\r
+ -6850,\r
+ -5712,\r
+ -4571,\r
+ -3430,\r
+ -2287,\r
+ -1144,\r
+ 0,\r
+ 1143,\r
+ 2286,\r
+ 3429,\r
+ 4571,\r
+ 5711,\r
+ 6850,\r
+ 7986,\r
+ 9120,\r
+ 10251,\r
+ 11379,\r
+ 12504,\r
+ 13625,\r
+ 14741,\r
+ 15854,\r
+ 16961,\r
+ 18063,\r
+ 19160,\r
+ 20251,\r
+ 21335,\r
+ 22414,\r
+ 23485,\r
+ 24549,\r
+ 25606,\r
+ 26655,\r
+ 27696,\r
+ 28728,\r
+ 29752,\r
+ 30766,\r
+ 31771,\r
+ 32767,\r
+ 33752,\r
+ 34728,\r
+ 35692,\r
+ 36646,\r
+ 37589,\r
+ 38520,\r
+ 39439,\r
+ 40347,\r
+ 41242,\r
+ 42124,\r
+ 42994,\r
+ 43851,\r
+ 44694,\r
+ 45524,\r
+ 46340,\r
+ 47141,\r
+ 47929,\r
+ 48701,\r
+ 49459,\r
+ 50202,\r
+ 50930,\r
+ 51642,\r
+ 52338,\r
+ 53018,\r
+ 53682,\r
+ 54330,\r
+ 54962,\r
+ 55576,\r
+ 56174,\r
+ 56754,\r
+ 57318,\r
+ 57863,\r
+ 58391,\r
+ 58902,\r
+ 59394,\r
+ 59869,\r
+ 60325,\r
+ 60762,\r
+ 61182,\r
+ 61582,\r
+ 61964,\r
+ 62327,\r
+ 62671,\r
+ 62996,\r
+ 63301,\r
+ 63588,\r
+ 63855,\r
+ 64102,\r
+ 64330,\r
+ 64539,\r
+ 64728,\r
+ 64897,\r
+ 65046,\r
+ 65175,\r
+ 65285,\r
+ 65375,\r
+ 65445,\r
+ 65495,\r
+ 65525,\r
+};\r
+\r
+int tantbl[]=\r
+{\r
+ 0,\r
+ 1143,\r
+ 2288,\r
+ 3434,\r
+ 4582,\r
+ 5733,\r
+ 6888,\r
+ 8046,\r
+ 9210,\r
+ 10379,\r
+ 11555,\r
+ 12738,\r
+ 13929,\r
+ 15129,\r
+ 16339,\r
+ 17560,\r
+ 18791,\r
+ 20036,\r
+ 21293,\r
+ 22565,\r
+ 23852,\r
+ 25156,\r
+ 26477,\r
+ 27817,\r
+ 29178,\r
+ 30559,\r
+ 31963,\r
+ 33391,\r
+ 34845,\r
+ 36326,\r
+ 37836,\r
+ 39377,\r
+ 40950,\r
+ 42558,\r
+ 44203,\r
+ 45888,\r
+ 47613,\r
+ 49384,\r
+ 51201,\r
+ 53069,\r
+ 54990,\r
+ 56968,\r
+ 59007,\r
+ 61112,\r
+ 63286,\r
+ 65534,\r
+ 67863,\r
+ 70277,\r
+ 72783,\r
+ 75389,\r
+ 78101,\r
+ 80928,\r
+ 83880,\r
+ 86967,\r
+ 90201,\r
+ 93593,\r
+ 97159,\r
+ 100914,\r
+ 104877,\r
+ 109068,\r
+ 113509,\r
+ 118228,\r
+ 123253,\r
+ 128619,\r
+ 134366,\r
+ 140539,\r
+ 147193,\r
+ 154390,\r
+ 162204,\r
+ 170723,\r
+ 180055,\r
+ 190326,\r
+ 201695,\r
+ 214354,\r
+ 228546,\r
+ 244578,\r
+ 262845,\r
+ 283861,\r
+ 308316,\r
+ 337146,\r
+ 371664,\r
+ 413768,\r
+ 466301,\r
+ 533734,\r
+ 623516,\r
+ 749057,\r
+ 937177,\r
+ 1250451,\r
+ 1876607,\r
+ 3754215,\r
+ -2147483647, //8,\r
+ -3754786,\r
+ -1876749,\r
+ -1250515,\r
+ -937212,\r
+ -749080,\r
+ -623532,\r
+ -533746,\r
+ -466310,\r
+ -413775,\r
+ -371670,\r
+ -337151,\r
+ -308320,\r
+ -283865,\r
+ -262848,\r
+ -244581,\r
+ -228549,\r
+ -214356,\r
+ -201697,\r
+ -190328,\r
+ -180056,\r
+ -170725,\r
+ -162205,\r
+ -154391,\r
+ -147194,\r
+ -140540,\r
+ -134367,\r
+ -128620,\r
+ -123253,\r
+ -118228,\r
+ -113510,\r
+ -109068,\r
+ -104878,\r
+ -100915,\r
+ -97160,\r
+ -93594,\r
+ -90201,\r
+ -86968,\r
+ -83881,\r
+ -80929,\r
+ -78101,\r
+ -75389,\r
+ -72784,\r
+ -70277,\r
+ -67863,\r
+ -65535,\r
+ -63286,\r
+ -61112,\r
+ -59008,\r
+ -56968,\r
+ -54990,\r
+ -53069,\r
+ -51201,\r
+ -49384,\r
+ -47614,\r
+ -45888,\r
+ -44204,\r
+ -42559,\r
+ -40951,\r
+ -39377,\r
+ -37836,\r
+ -36326,\r
+ -34845,\r
+ -33391,\r
+ -31963,\r
+ -30559,\r
+ -29178,\r
+ -27818,\r
+ -26478,\r
+ -25156,\r
+ -23852,\r
+ -22565,\r
+ -21293,\r
+ -20036,\r
+ -18792,\r
+ -17560,\r
+ -16339,\r
+ -15130,\r
+ -13930,\r
+ -12738,\r
+ -11555,\r
+ -10379,\r
+ -9210,\r
+ -8046,\r
+ -6888,\r
+ -5733,\r
+ -4582,\r
+ -3434,\r
+ -2288,\r
+ -1144,\r
+ 0,\r
+ 1143,\r
+ 2288,\r
+ 3434,\r
+ 4582,\r
+ 5733,\r
+ 6887,\r
+ 8046,\r
+ 9210,\r
+ 10379,\r
+ 11555,\r
+ 12738,\r
+ 13929,\r
+ 15129,\r
+ 16339,\r
+ 17559,\r
+ 18791,\r
+ 20035,\r
+ 21293,\r
+ 22565,\r
+ 23852,\r
+ 25156,\r
+ 26477,\r
+ 27817,\r
+ 29177,\r
+ 30559,\r
+ 31963,\r
+ 33391,\r
+ 34845,\r
+ 36326,\r
+ 37836,\r
+ 39377,\r
+ 40950,\r
+ 42558,\r
+ 44203,\r
+ 45887,\r
+ 47613,\r
+ 49383,\r
+ 51201,\r
+ 53068,\r
+ 54990,\r
+ 56968,\r
+ 59007,\r
+ 61111,\r
+ 63285,\r
+ 65534,\r
+ 67863,\r
+ 70277,\r
+ 72783,\r
+ 75388,\r
+ 78101,\r
+ 80928,\r
+ 83880,\r
+ 86967,\r
+ 90200,\r
+ 93592,\r
+ 97158,\r
+ 100914,\r
+ 104877,\r
+ 109067,\r
+ 113509,\r
+ 118227,\r
+ 123252,\r
+ 128618,\r
+ 134365,\r
+ 140538,\r
+ 147192,\r
+ 154389,\r
+ 162203,\r
+ 170722,\r
+ 180053,\r
+ 190325,\r
+ 201693,\r
+ 214352,\r
+ 228544,\r
+ 244576,\r
+ 262842,\r
+ 283858,\r
+ 308312,\r
+ 337141,\r
+ 371659,\r
+ 413761,\r
+ 466292,\r
+ 533722,\r
+ 623500,\r
+ 749034,\r
+ 937141,\r
+ 1250388,\r
+ 1876464,\r
+ 3753644,\r
+ -2147483647, //8,\r
+ -3755357,\r
+ -1876892,\r
+ -1250578,\r
+ -937248,\r
+ -749103,\r
+ -623548,\r
+ -533757,\r
+ -466319,\r
+ -413782,\r
+ -371676,\r
+ -337155,\r
+ -308324,\r
+ -283868,\r
+ -262851,\r
+ -244584,\r
+ -228551,\r
+ -214358,\r
+ -201698,\r
+ -190330,\r
+ -180058,\r
+ -170726,\r
+ -162206,\r
+ -154392,\r
+ -147195,\r
+ -140541,\r
+ -134368,\r
+ -128621,\r
+ -123254,\r
+ -118229,\r
+ -113511,\r
+ -109069,\r
+ -104878,\r
+ -100916,\r
+ -97160,\r
+ -93594,\r
+ -90202,\r
+ -86968,\r
+ -83881,\r
+ -80929,\r
+ -78102,\r
+ -75390,\r
+ -72784,\r
+ -70278,\r
+ -67864,\r
+ -65535,\r
+ -63287,\r
+ -61112,\r
+ -59008,\r
+ -56969,\r
+ -54990,\r
+ -53069,\r
+ -51202,\r
+ -49384,\r
+ -47614,\r
+ -45888,\r
+ -44204,\r
+ -42559,\r
+ -40951,\r
+ -39377,\r
+ -37837,\r
+ -36327,\r
+ -34845,\r
+ -33392,\r
+ -31963,\r
+ -30559,\r
+ -29178,\r
+ -27818,\r
+ -26478,\r
+ -25156,\r
+ -23853,\r
+ -22565,\r
+ -21293,\r
+ -20036,\r
+ -18792,\r
+ -17560,\r
+ -16340,\r
+ -15130,\r
+ -13930,\r
+ -12739,\r
+ -11555,\r
+ -10380,\r
+ -9210,\r
+ -8047,\r
+ -6888,\r
+ -5733,\r
+ -4582,\r
+ -3434,\r
+ -2288,\r
+ -1144,\r
+};\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define SOUND_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+UNIMOD *mf;\r
+SAMPLE *sfx[100];\r
+int nsfx=0;\r
+char playing[60];\r
+\r
+// ================================= Code ====================================\r
+\r
+void PlaySound(int, int, int);\r
+\r
+void tickhandler()\r
+{\r
+ MP_HandleTick();\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+void InitMusicSystem()\r
+{\r
+ memset(playing, 0, 60);\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_uni);\r
+ ML_RegisterLoader(&load_xm);\r
+\r
+ MD_RegisterDriver(&drv_nos);\r
+// MD_RegisterDriver(&drv_ss);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+\r
+ MD_RegisterPlayer(tickhandler);\r
+ if (!MD_Init())\r
+ {\r
+ printf("Driver error: %s.\n",myerr);\r
+ exit(-1);\r
+ }\r
+}\r
+\r
+void PlayMusic(char *fname)\r
+{\r
+ strlwr(fname);\r
+ if (!strcmp(fname,playing)) return;\r
+ if (!MP_Ready())\r
+ {\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+ }\r
+ memcpy(playing, fname, strlen(fname));\r
+ if (!(mf=ML_LoadFN(fname))) err(myerr);\r
+ MP_Init(mf);\r
+ md_numchn=mf->numchn+2;\r
+ mp_loop=1; mp_volume=100;\r
+ MD_PlayStart();\r
+ PlaySound(0, 0, 0);\r
+ PlaySound(0, 0, 0);\r
+}\r
+\r
+void StopMusic()\r
+{\r
+ if (MP_Ready()) return;\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+}\r
+\r
+int CacheSound(char *fname)\r
+{\r
+ if (!(sfx[nsfx]=MW_LoadWavFN(fname)))\r
+ err("WAV [%s] load error: %s", fname, myerr);\r
+ return nsfx++;\r
+}\r
+\r
+void FreeAllSounds()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<nsfx; i++)\r
+ MW_FreeWav(sfx[i]);\r
+ nsfx=0;\r
+}\r
+\r
+void PlaySound(int index, int vol, int pan)\r
+{\r
+ static int switcher=1;\r
+ int chanl;\r
+\r
+ if (index >= nsfx) return;\r
+ switcher ^= 1;\r
+ chanl=md_numchn-1-switcher;\r
+ MD_VoiceSetVolume(chanl, vol);\r
+ MD_VoiceSetPanning(chanl, pan);\r
+ MD_VoiceSetFrequency(chanl, sfx[index]->c2spd);\r
+ MD_VoicePlay(chanl, sfx[index]->handle, 0, sfx[index]->length,\r
+ 0, 0, sfx[index]->flags);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef SOUND_H\r
+#define SOUND_H\r
+\r
+void InitMusicSystem();\r
+void PlayMusic(char *);\r
+void StopMusic();\r
+int CacheSound(char *);\r
+void FreeAllSounds();\r
+void PlaySound(int, int, int);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdarg.h> // va_*()\r
+#include <time.h>\r
+\r
+#define MAIN_H\r
+#include "verge.h"\r
+extern void vmain(int argc, char *argv[]);\r
+extern void Log(char *message, ...);\r
+\r
+int mx, my, mb;\r
+\r
+// ================================= Code ====================================\r
+\r
+void err(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ ShutdownVideo(1);\r
+ ShutdownTimer();\r
+ ShutdownKeyboard();\r
+// CD_Deinit();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ printf(tempbuf);\r
+ fflush(stdout);\r
+\r
+ Log("Sys: Exiting with message: %s", tempbuf);\r
+\r
+ exit(-1);\r
+}\r
+\r
+int sgn(int x)\r
+{\r
+ if (x>=0) return 1;\r
+ return 0;\r
+}\r
+\r
+void ver()\r
+{ char temp[256];\r
+\r
+ Con_NextLine();\r
+ Con_Printf("{|||||||||||||||||}");\r
+ sprintf(temp,"VERGE v.%s Copyright (C)1998 vecna",VERSION);\r
+ Con_Printf(temp);\r
+ Con_Printf("All rights reserved. DJGPP/DOS build.");\r
+ sprintf(strbuf,"Timestamp %s at %s.",__DATE__, __TIME__);\r
+ Con_Printf(strbuf);\r
+ Con_Printf("Options: -Wall -m486 -O1 -ffast-math");\r
+ Con_Printf("{|||||||||||||||||}");\r
+}\r
+\r
+void CheckMessages()\r
+{\r
+ // Win95 can bite me.\r
+}\r
+\r
+void InitMouse(int x, int y)\r
+{ REGISTERS r;\r
+\r
+ SET_AX(r,7);\r
+ SET_CX(r,0);\r
+ SET_DX(r,x);\r
+ INTERRUPT(0x33, r);\r
+\r
+ SET_AX(r,8);\r
+ SET_CX(r,0);\r
+ SET_DX(r,y);\r
+ INTERRUPT(0x33, r);\r
+}\r
+\r
+void ReadMouse()\r
+{ REGISTERS r;\r
+\r
+ SET_AX(r,3);\r
+ INTERRUPT(0x33, r);\r
+\r
+ mx=r.x.cx;\r
+ my=r.x.dx;\r
+ mb=r.x.bx;\r
+}\r
+\r
+void SetMouse(int x, int y)\r
+{ REGISTERS r;\r
+\r
+ SET_AX(r, 4);\r
+ SET_CX(r, x);\r
+ SET_DX(r, y);\r
+ INTERRUPT(0x33, r);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ if (argc==1)\r
+ {\r
+ printf("VERGE v.%s build %s at %s. \n",VERSION,__DATE__,__TIME__);\r
+ printf("Copyright (C)1998 vecna \n");\r
+ delay(500);\r
+ }\r
+ srand(time(NULL));\r
+ vmain(argc, argv);\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define TIMER_H\r
+#include <go32.h>\r
+#include <dpmi.h>\r
+#include <crt0.h>\r
+#include "verge.h"\r
+\r
+#define PIT0 0x40\r
+#define PIT1 0x41\r
+#define PIT2 0x42\r
+#define PITMODE 0x43\r
+#define PITCONST 1193180L\r
+\r
+#define OCR1 0x20\r
+#define IMR1 0x21\r
+\r
+#define OCR2 0xA0\r
+#define IMR2 0xA1\r
+\r
+// ================================= Data ====================================\r
+\r
+int _crt0_startup_flags = _CRT0_FLAG_NEARPTR;\r
+typedef __dpmi_paddr *PVI;\r
+static PVI oldhandler;\r
+\r
+unsigned int systemtime=0, timer_count=0;\r
+int (*callback) (void);\r
+\r
+// ================================= Code ====================================\r
+\r
+PVI DJSetHandlerFunc(unsigned char irqno, void (*handler)(), int len)\r
+{\r
+ PVI oldvect = (PVI) malloc(sizeof(__dpmi_paddr));\r
+ int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8;\r
+ _go32_dpmi_seginfo wrapper;\r
+ __dpmi_paddr new;\r
+\r
+ wrapper.pm_offset = (long int) handler;\r
+ wrapper.pm_selector = _my_cs();\r
+ _go32_dpmi_allocate_iret_wrapper(&wrapper);\r
+ new.offset32 = wrapper.pm_offset;\r
+ new.selector = wrapper.pm_selector;\r
+ __dpmi_get_and_disable_virtual_interrupt_state();\r
+ if (len) _go32_dpmi_lock_code(handler,len);\r
+ _go32_dpmi_lock_data(&wrapper,sizeof(_go32_dpmi_seginfo));\r
+ __dpmi_get_protected_mode_interrupt_vector(vecno,oldvect);\r
+ __dpmi_set_protected_mode_interrupt_vector(vecno,&new);\r
+ __dpmi_get_and_enable_virtual_interrupt_state();\r
+ return oldvect;\r
+}\r
+\r
+void DJSetHandlerAddr(unsigned char irqno, PVI handler)\r
+{\r
+ int vecno=(irqno>7) ? irqno+0x68 : irqno+0x8;\r
+ _go32_dpmi_seginfo wrapper;\r
+ __dpmi_paddr oldhandler;\r
+\r
+ __dpmi_get_and_disable_virtual_interrupt_state();\r
+ __dpmi_get_protected_mode_interrupt_vector(vecno, &oldhandler);\r
+ wrapper.pm_offset = oldhandler.offset32;\r
+ wrapper.pm_selector = oldhandler.selector;\r
+ _go32_dpmi_free_iret_wrapper(&wrapper);\r
+ __dpmi_set_protected_mode_interrupt_vector(vecno,handler);\r
+ __dpmi_get_and_enable_virtual_interrupt_state();\r
+ free(handler);\r
+}\r
+\r
+static void SendEOI (unsigned char irqno)\r
+{\r
+ unsigned char ocr=(irqno>7) ? OCR2 : OCR1;\r
+ unsigned char eoi=0x60|(irqno&7);\r
+\r
+ outportb(ocr,eoi);\r
+ if (irqno>7) outportb(OCR1,0x20);\r
+}\r
+\r
+static void newhandler(void)\r
+{\r
+ systemtime++;\r
+ timer_count++;\r
+ if (cpu_watch) CPUTick();\r
+ if (callback) callback();\r
+ CheckTileAnimation();\r
+ HookTimer();\r
+ MD_Update();\r
+ SendEOI(0);\r
+}\r
+\r
+static void EndNewHandler() { }\r
+\r
+void sethz(unsigned int hz)\r
+{ unsigned int pit0_set, pit0_value;\r
+\r
+ disable();\r
+\r
+ outportb(PITMODE, 0x34);\r
+ pit0_value=PITCONST / hz;\r
+ pit0_set=(pit0_value & 0x00ff);\r
+ outportb(PIT0, pit0_set);\r
+ pit0_set=(pit0_value >> 8);\r
+ outportb(PIT0, pit0_set);\r
+\r
+ enable();\r
+}\r
+\r
+void restorehz()\r
+{\r
+ disable();\r
+ outportb(PITMODE, 0x34);\r
+ outportb(PIT0, 0x00);\r
+ outportb(PIT0, 0x00);\r
+ enable();\r
+}\r
+\r
+void InitTimer()\r
+{\r
+ oldhandler = DJSetHandlerFunc(0, (void *) newhandler,\r
+ ((int) EndNewHandler) - ((int) newhandler));\r
+ sethz(100);\r
+}\r
+\r
+void ShutdownTimer()\r
+{\r
+ DJSetHandlerAddr(0, oldhandler);\r
+ restorehz();\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TIMER_H\r
+#define TIMER_H\r
+\r
+void InitTimer();\r
+void ShutdownTimer();\r
+\r
+extern int systemtime, timer_count;\r
+extern int (*callback) (void);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#define VC_H\r
+#include <math.h>\r
+#include "verge.h"\r
+#include "vccode.h"\r
+#include "sincos.h"\r
+#include "mikmod.h"\r
+\r
+#define USERFUNC_MARKER 10000\r
+\r
+// ================================= Data ====================================\r
+\r
+char *sysvc, *mapvc, *basevc; // VC pool ptrs\r
+char *code; // VC current instruction pointer (IP)\r
+\r
+int *globalint; // system.vc global int variables\r
+int maxint; // maximum allocated # of ints\r
+char *stringbuf; // vc string workspace\r
+int vcreturn; // return value of last function\r
+char *movescriptbuf; // VC EntityMove buffer\r
+char vctrack=0; // VC call tracking to verge.log\r
+\r
+quad *vcstack; // VC stack (seperate from main stack)\r
+quad *vcsp; // VC stack pointer [esp]\r
+\r
+int mapevents; // number of map events in this VC\r
+char *mapvctbl[1024]; // map VC offset table\r
+\r
+int hookretrace=0;\r
+int hooktimer=0;\r
+int invc=0;\r
+\r
+// -----------------\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[20];\r
+ int numargs, numlocals;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+funcdecl *funcs;\r
+int numfuncs;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int vsofs;\r
+ int arraylen;\r
+} strdecl;\r
+\r
+strdecl *str;\r
+int numstr=0;\r
+int stralloc;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+vardecl *vars;\r
+int numvars;\r
+char kill=0;\r
+\r
+// -- local func vars --\r
+\r
+typedef struct\r
+{\r
+ int nargs[20];\r
+ char s[2560];\r
+} lvars;\r
+\r
+//lvars *lvar;\r
+lvars lvar;\r
+\r
+// ============================== Prototypes =================================\r
+\r
+void ResolveString(char *buffer);\r
+void ExecuteSection();\r
+void ExecuteEvent(int i);\r
+void ExecuteUserFunc(int i);\r
+\r
+// ================================= Code ====================================\r
+\r
+int ProcessOperand(); // Mutually dependant functions suck.\r
+int ProcessIfOperand(); // Hell yeah they do, bitch.\r
+void HandleExternFunc();\r
+void HandleStdLib();\r
+void ExecuteBlock();\r
+\r
+void LoadSystemVC()\r
+{\r
+ VFILE *f=0;\r
+ int i=0;\r
+\r
+ Log("Initializing VC interpreter");\r
+ if (!(f=vopen("system.idx"))) err("Could not open system.idx.");\r
+ vread(&numvars, 4, f);\r
+ vars=(vardecl *) valloc(numvars*sizeof(vardecl), "LoadSystemVC:vars", OID_VC);\r
+ vread(vars, numvars*48, f);\r
+ vread(&numfuncs, 4, f);\r
+ funcs=(funcdecl *) valloc(numfuncs*sizeof(funcdecl), "LoadSystemVC:funcs", OID_VC);\r
+ vread(funcs, numfuncs*76, f);\r
+ vread(&numstr, 4, f);\r
+ str=(strdecl *) valloc(numstr*sizeof(strdecl), "LoadSystemVC:str", OID_VC);\r
+ vread(str, numstr*44, f);\r
+ vclose(f);\r
+\r
+ if (!(f=vopen("system.vcs"))) err("Could not open system.vcs");\r
+ i=filesize(f);\r
+ sysvc=(char *) valloc(i, "LoadSystemVC:sysvc", OID_VC);\r
+ vread(&numfuncs, 4, f);\r
+ vread(&maxint, 4, f);\r
+ vread(&stralloc, 4, f);\r
+\r
+ globalint=(int *) valloc(maxint ? maxint*4 : 4, "globalint", OID_VC);\r
+ if (stralloc)\r
+ {\r
+ stringbuf=(char *) valloc((stralloc*256),\r
+ "LoadSystemVC:stringbuf", OID_VC);\r
+ }\r
+ else\r
+ {\r
+ stringbuf=(char *) valloc(256,\r
+ "LoadSystemVC:stringbuf (256)", OID_VC);\r
+ }\r
+ vread(sysvc, i, f);\r
+ vclose(f);\r
+\r
+ // Initialize VC stack\r
+ vcstack=(quad *) valloc(6000, "vcstack", OID_VC);\r
+ vcsp=vcstack;\r
+\r
+ movescriptbuf=(char *) valloc(65535, "movescriptbuf", OID_VC);\r
+\r
+Log("system vclib init: %d funcs, %d ints (%d bytes), %d strings (%d bytes)",\r
+ numfuncs, numvars, maxint*4, numstr, stralloc*256);\r
+}\r
+\r
+void LoadMapVC(VFILE *f)\r
+{ int codesize=0;\r
+\r
+ vread(&mapevents, 4, f);\r
+ vread(mapvctbl, 4*mapevents, f);\r
+ vread(&codesize, 4, f);\r
+ mapvc=(char *) valloc(codesize, "mapvc", OID_VC);\r
+ vread(mapvc, codesize, f);\r
+}\r
+\r
+byte GrabC()\r
+{\r
+ return *code++;\r
+}\r
+\r
+word GrabW(void)\r
+{\r
+ word *ptr=(word *) code;\r
+ code+=2;\r
+ return *ptr;\r
+}\r
+\r
+quad GrabD(void)\r
+{\r
+ quad *ptr=(quad *) code;\r
+ code+=4;\r
+ return *ptr;\r
+}\r
+\r
+void GrabString(char *str)\r
+{ int i=0;\r
+\r
+ i=0;\r
+ while (*code)\r
+ {\r
+ str[i]=*code;\r
+ code++;\r
+ i++;\r
+ }\r
+ str[i]=0;\r
+ code++;\r
+}\r
+\r
+int ReadInt(char category, int loc, int ofs)\r
+{\r
+ switch (category)\r
+ {\r
+ case op_UVAR: return globalint[loc];\r
+ case op_UVARRAY: return globalint[loc];\r
+ case op_HVAR0: switch (loc)\r
+ {\r
+ case 0: return xwin;\r
+ case 1: return ywin;\r
+ case 2: return cameratracking;\r
+ case 3: return timer_count;\r
+ case 4: return up;\r
+ case 5: return down;\r
+ case 6: return left;\r
+ case 7: return right;\r
+ case 8: return b1;\r
+ case 9: return b2;\r
+ case 10: return b3;\r
+ case 11: return b4;\r
+ case 12: return sx;\r
+ case 13: return sy;\r
+ case 14: return playernum;\r
+ case 15: return cc;\r
+ case 16: return tracker;\r
+ case 17: return mx;\r
+ case 18: return my;\r
+ case 19: return mb;\r
+ case 20: return vctrack;\r
+ case 21: return width;\r
+ case 22: return depth;\r
+ case 23: return mp_volume;\r
+ case 24: return (int)vsp;\r
+ case 25: return lastent;\r
+ case 26: return last_pressed;\r
+ }\r
+ case op_HVAR1: switch (loc)\r
+ {\r
+ case 0: return (int) screen[ofs];\r
+ case 1: return entity[ofs].x;\r
+ case 2: return entity[ofs].y;\r
+ case 3: return entity[ofs].tx;\r
+ case 4: return entity[ofs].ty;\r
+ case 5: return entity[ofs].facing;\r
+ case 6: return entity[ofs].moving;\r
+ case 7: return entity[ofs].specframe;\r
+ case 8: return entity[ofs].speed;\r
+// case 9: return entity[ofs].movecode;\r
+ case 10: return entidx[ofs];\r
+ case 11: return key[ofs];\r
+ case 12: return layer[ofs].hline;\r
+ case 13: return (int) (*(byte *)ofs);\r
+ case 14: return (int) (*(word *)ofs);\r
+ case 15: return (int) (*(quad *)ofs);\r
+ case 16: return (int) pal[ofs];\r
+ case 17: return (int) (*(char *)ofs);\r
+ case 18: return (int) (*(short*)ofs);\r
+ case 19: return (int) (*(int *)ofs);\r
+ }\r
+ case op_LVAR: return lvar.nargs[loc];\r
+ default:\r
+ err("VC Execution error: Invalid ReadInt category %d", (int) category);\r
+ }\r
+ return 0;\r
+}\r
+\r
+void WriteInt(char category, int loc, int ofs, int value)\r
+{\r
+ switch (category)\r
+ {\r
+ case op_UVAR: globalint[loc]=value; break;\r
+ case op_UVARRAY: globalint[loc]=value; break;\r
+ case op_HVAR0: switch (loc)\r
+ {\r
+ case 0: xwin=value; return;\r
+ case 1: ywin=value; return;\r
+ case 2: cameratracking=value; return;\r
+ case 3: timer_count=value; return;\r
+ case 16: tracker=value; return;\r
+ case 20: vctrack=value; return;\r
+ case 23: mp_volume=value; return;\r
+ case 26: last_pressed=value; return;\r
+ }\r
+ case op_HVAR1: switch (loc)\r
+ {\r
+ case 0: screen[ofs]=(byte) value; return;\r
+ case 1: entity[ofs].x=value; return;\r
+ case 2: entity[ofs].y=value; return;\r
+ case 3: entity[ofs].tx=value; return;\r
+ case 4: entity[ofs].ty=value; return;\r
+ case 5: entity[ofs].facing=value; return;\r
+ case 6: entity[ofs].moving=value; return;\r
+ case 7: entity[ofs].specframe=value; return;\r
+ case 8: entity[ofs].speed=value; return;\r
+// case 9: entity[ofs].movecode=value; return;\r
+// case 10:\r
+ case 11: key[ofs]=value; return;\r
+ case 12: layer[ofs].hline=value; return;\r
+ case 13: (*(byte *)ofs)=(byte) value; return;\r
+ case 14: (*(word *)ofs)=(word) value; return;\r
+ case 15: (*(quad *)ofs)=(quad) value; return;\r
+ case 16: pal[ofs]=value; return;\r
+ case 17: (*(char *)ofs)=(byte) value; return;\r
+ case 18: (*(short*)ofs)=(word) value; return;\r
+ case 19: (*(int *)ofs)=(quad) value; return;\r
+ }\r
+ case op_LVAR: lvar.nargs[loc]=value; return;\r
+ default:\r
+ err("VC Execution error: Invalid WriteInt category %d", (int) category);\r
+ }\r
+}\r
+\r
+int ResolveOperand()\r
+{\r
+ int cr=0;\r
+ int d=0;\r
+ byte c=0;\r
+\r
+ cr=ProcessOperand(); // Get base number\r
+ while (1)\r
+ {\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case op_ADD: cr += ProcessOperand(); continue;\r
+ case op_SUB: cr -= ProcessOperand(); continue;\r
+ case op_DIV: d=ProcessOperand();\r
+ if (!d) cr=0; else cr /= d; continue;\r
+ case op_MULT: cr = cr * ProcessOperand(); continue;\r
+ case op_MOD: d=ProcessOperand();\r
+ if (!d) cr=0; else cr %= d; continue;\r
+ case op_SHL: cr = cr << ProcessOperand(); continue;\r
+ case op_SHR: cr = cr >> ProcessOperand(); continue;\r
+ case op_AND: cr = cr & ProcessOperand(); continue;\r
+ case op_OR: cr = cr | ProcessOperand(); continue;\r
+ case op_XOR: cr = cr ^ ProcessOperand(); continue;\r
+ case op_END: break;\r
+ }\r
+ break;\r
+ }\r
+ return cr;\r
+}\r
+\r
+int ProcessOperand()\r
+{ byte op_desc=0;\r
+ byte c=0;\r
+ quad d=0;\r
+ quad ofs=0;\r
+\r
+ op_desc=GrabC();\r
+ switch (op_desc)\r
+ {\r
+ case op_IMMEDIATE: return GrabD();\r
+ case op_HVAR0: c=GrabC(); return ReadInt(op_HVAR0, c, 0);\r
+ case op_HVAR1: c=GrabC(); ofs=ResolveOperand(); return ReadInt(op_HVAR1, c, ofs);\r
+ case op_UVAR: d=GrabD(); return ReadInt(op_UVAR, d, 0);\r
+ case op_UVARRAY: d=GrabD(); d+=ResolveOperand(); return ReadInt(op_UVARRAY, d, 0);\r
+ case op_LVAR: c=GrabC(); return lvar.nargs[c];\r
+ case op_BFUNC: HandleStdLib();\r
+ return vcreturn;\r
+ case op_UFUNC: HandleExternFunc();\r
+ return vcreturn;\r
+ case op_GROUP: return ResolveOperand();\r
+ default: sprintf(strbuf,"VC Execution error: Invalid operand %d.",op_desc);\r
+ err(strbuf); break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void HandleStringOperand(char *buffer)\r
+{\r
+ char tbuf[256];\r
+ char *d=0;\r
+ word w=0;\r
+ int c=0;\r
+ int i=0;\r
+ int j=0;\r
+ int z=0;\r
+\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case s_IMMEDIATE: GrabString(buffer); break;\r
+ case s_GLOBAL: w=GrabW();\r
+ d=(char *) (int) stringbuf + (w*256);\r
+ z=strlen(d);\r
+ if (strlen(buffer)+z+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, d, z+1);\r
+ break;\r
+ case s_ARRAY: w=GrabW();\r
+ w+=ResolveOperand();\r
+ d=(char *) (int) stringbuf + (w*256);\r
+ z=strlen(d);\r
+ if (strlen(buffer)+z+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, d, z+1);\r
+ break;\r
+ case s_NUMSTR: i=ResolveOperand();\r
+ sprintf(buffer,"%d",i);\r
+ break;\r
+ case s_LEFT: ResolveString(tbuf);\r
+ i=ResolveOperand();\r
+ c=i<strlen(tbuf) ? i : strlen(tbuf);\r
+ if (strlen(buffer)+c+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, tbuf, c);\r
+ buffer[c]=0;\r
+ break;\r
+ case s_RIGHT: ResolveString(tbuf);\r
+ i=ResolveOperand();\r
+ c=i<strlen(tbuf) ? i : strlen(tbuf);\r
+ if (strlen(buffer)+c+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, tbuf+strlen(tbuf)-c, c);\r
+ buffer[c]=0;\r
+ break;\r
+ case s_MID: ResolveString(tbuf);\r
+ i=ResolveOperand();\r
+ j=ResolveOperand();\r
+ i=i<strlen(tbuf) ? i : strlen(tbuf);\r
+ j=j<strlen(tbuf)-i ? j : strlen(tbuf)-i;\r
+ if (strlen(buffer)+j+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, tbuf+i, j);\r
+ buffer[j]=0;\r
+ break;\r
+ case s_CHR: if (strlen(buffer)+2>50)\r
+ err("Combined string length exceeds 250 char max.");\r
+ buffer[0]=(char) ResolveOperand();\r
+ buffer[1]=0;\r
+ break;\r
+ case s_LOCAL: c=GrabC();\r
+ d=&lvar.s[c*256];\r
+ z=strlen(d);\r
+ if (strlen(buffer)+z+1>250)\r
+ err("Combined string length exceeds 250 char max.");\r
+ memcpy(buffer, d, z+1);\r
+ break;\r
+ default: err("Invalid VC string operand %d", (int) c);\r
+ }\r
+}\r
+\r
+void ResolveString(char *buffer)\r
+{ char c=0;\r
+\r
+ HandleStringOperand(buffer);\r
+ while (1)\r
+ {\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case s_ADD:\r
+ HandleStringOperand((char *) (int) buffer + strlen(buffer)); break;\r
+ case s_END: return;\r
+ default:\r
+ err("VC execution error: Unknown string operator %d",(int) c);\r
+ }\r
+ }\r
+}\r
+\r
+void vcpush(quad info)\r
+{\r
+ if (vcsp>=vcstack+1500) err("VC stack overflow.");\r
+ *vcsp=info;\r
+ vcsp++;\r
+}\r
+\r
+quad vcpop()\r
+{\r
+ if (vcsp==vcstack) err("VC stack underflow.");\r
+ vcsp--;\r
+ return *vcsp;\r
+}\r
+\r
+void ReadVCVar()\r
+{ int i=0;\r
+ int j=0;\r
+\r
+ strlwr((char *) args[1]);\r
+ for (i=0; i<=numvars; i++)\r
+ if (!strcmp(vars[i].vname, (char *) args[1])) break;\r
+ if (i<numvars)\r
+ {\r
+ j=vars[i].varstartofs;\r
+ if (vars[i].arraylen>1)\r
+ j+=atoi((char *) args[2]);\r
+ j=globalint[j];\r
+ sprintf(strbuf,"%s:%d",vars[i].vname, j);\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ for (i=0; i<=numstr; i++)\r
+ if (!strcmp(str[i].vname, (char *) args[1])) break;\r
+ if (i<numstr)\r
+ {\r
+ j=(int) stringbuf + (i*256);\r
+ sprintf(strbuf,"%s:%s",str[i].vname, (char *) j);\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ Con_Printf("No such VC variable.");\r
+}\r
+\r
+void WriteVCVar()\r
+{ int i=0;\r
+ int j=0;\r
+\r
+ strlwr((char *) args[1]);\r
+ for (i=0; i<=numvars; i++)\r
+ if (!strcmp(vars[i].vname, (char *) args[1])) break;\r
+ if (i<numvars)\r
+ {\r
+ j=vars[i].varstartofs;\r
+ if (vars[i].arraylen>1)\r
+ {\r
+ j+=atoi((char *) args[2]);\r
+ globalint[j]=atoi((char *) args[3]);\r
+ }\r
+ else globalint[j]=atoi((char *) args[2]);\r
+ sprintf(strbuf,"%s:%d", vars[i].vname, atoi((char *) args[2]));\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ for (i=0; i<=numstr; i++)\r
+ if (!strcmp(str[i].vname, (char *) args[1])) break;\r
+ if (i<numstr)\r
+ {\r
+ j=(int) stringbuf + (i*256);\r
+ memcpy((char *) j, (char *) args[2], strlen((char *) args[2])+1);\r
+ sprintf(strbuf,"%s:%s", str[i].vname, (char *) args[2]);\r
+ Con_Printf(strbuf);\r
+ return;\r
+ }\r
+ Con_Printf("No such VC variable.");\r
+}\r
+\r
+// ======================= VC Standard Function Library =======================\r
+\r
+int ClipOn=1;\r
+int LucentOn=0;\r
+\r
+void vc_Exit_()\r
+{\r
+ ResolveString(strbuf);\r
+ err(strbuf);\r
+}\r
+\r
+void vc_Message()\r
+{\r
+ int i=0;\r
+ char str1[100];\r
+\r
+ ResolveString(str1);\r
+ i=ResolveOperand();\r
+ Message(str1, i);\r
+}\r
+\r
+void vc_Malloc()\r
+{\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ vcreturn=(int) valloc(i, "vcreturn", OID_TEMP);\r
+\r
+ Log("VC allocating %u bytes, ptr at %u.", i, vcreturn);\r
+\r
+ if (!vcreturn) Message("Warning: VC failed malloc", 750);\r
+}\r
+\r
+void vc_Free()\r
+{\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ vfree((char *) i);\r
+\r
+ Log("VC freeing allocated heap at %u.", i);\r
+}\r
+\r
+void vc_pow()\r
+{\r
+ int i=0;\r
+ int j=0;\r
+\r
+ i=ResolveOperand();\r
+ j=ResolveOperand();\r
+ vcreturn=pow(i,j);\r
+}\r
+\r
+void vc_loadimage()\r
+{\r
+ byte *t=0;\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ t=VLoadImageBuf(s);\r
+ vcreturn=(int) t;\r
+}\r
+\r
+void vc_copysprite()\r
+{\r
+ int a=0;\r
+ int b=0;\r
+ int c=0;\r
+ int d=0;\r
+ byte *e=0;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=(byte *) ResolveOperand();\r
+ if (!ClipOn && !LucentOn) CopySprite(a,b,c,d,e);\r
+ if ( ClipOn && !LucentOn) CopySpriteClip(a,b,c,d,e);\r
+ if (!ClipOn && LucentOn) CopySpriteLucent(a,b,c,d,e);\r
+ if ( ClipOn && LucentOn) CopySpriteLucentClip(a,b,c,d,e);\r
+}\r
+\r
+void vc_tcopysprite()\r
+{\r
+ int a=0;\r
+ int b=0;\r
+ int c=0;\r
+ int d=0;\r
+ byte *e=0;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=(byte *) ResolveOperand();\r
+ if (!ClipOn && !LucentOn) TCopySprite(a,b,c,d,e);\r
+ if ( ClipOn && !LucentOn) TCopySpriteClip(a,b,c,d,e);\r
+ if (!ClipOn && LucentOn) TCopySpriteLucent(a,b,c,d,e);\r
+ if ( ClipOn && LucentOn) TCopySpriteLucentClip(a,b,c,d,e);\r
+}\r
+\r
+void vc_EntitySpawn()\r
+{\r
+ int a=0;\r
+ int b=0;\r
+ char chrname[80];\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ ResolveString(chrname);\r
+ vcreturn=AllocateEntity(a, b, chrname);\r
+}\r
+\r
+void vc_SetPlayer()\r
+{\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=entities) err("SetPlayer(): Entity index out of range");\r
+\r
+ player=&entity[i];\r
+ playernum=i;\r
+\r
+// entity[i].movecode=0;\r
+ entity[i].moving=0;\r
+}\r
+\r
+void vc_Map()\r
+{\r
+ hookretrace=0;\r
+ hooktimer=0;\r
+ kill=1;\r
+ ResolveString(startmap);\r
+}\r
+\r
+void vc_LoadFont()\r
+{\r
+ char vcstr[80];\r
+\r
+ ResolveString(vcstr);\r
+ vcreturn=LoadFont(vcstr);\r
+}\r
+\r
+void vc_PlayFLI()\r
+{\r
+ char s[256];\r
+ BITMAP flibuf;\r
+ byte *data=0;\r
+ VFILE *f=0;\r
+ int i=0;\r
+\r
+ ResolveString(s);\r
+ flibuf.w=sx;\r
+ flibuf.h=sy;\r
+ flibuf.data=screen;\r
+ if (!(f=vopen(s))) err("PlayFLI: Could not open %s.",s);\r
+ i=filesize(f);\r
+ data=(byte *) malloc(i);\r
+ if (!data) err("Not enough memory to play FLI.");\r
+ vread(data, i, f);\r
+ vclose(f);\r
+ play_memory_fli(data, &flibuf, 0, ShowPage);\r
+ timer_count=0;\r
+ set_intensity(63);\r
+}\r
+\r
+void vc_PrintString()\r
+{\r
+ char s[256];\r
+ int i=0;\r
+\r
+ i=ResolveOperand();\r
+ ResolveString(s);\r
+ printstring(i,s);\r
+}\r
+\r
+void vc_LoadRaw()\r
+{\r
+ char s[256];\r
+ char *t=0;\r
+ VFILE *f=0;\r
+ int i=0;\r
+\r
+ ResolveString(s);\r
+ if (!(f=vopen(s))) err("LoadRaw(): Could not open file %s",s);\r
+ i=filesize(f);\r
+ t=(char *) valloc(i, "LoadRaw:t", OID_VC);\r
+ vread(t, i, f);\r
+ vclose(f);\r
+ vcreturn=(int) t;\r
+}\r
+\r
+void vc_SetTile()\r
+{\r
+ int x=0;\r
+ int y=0;\r
+ int layr=0;\r
+ int value=0;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ layr=ResolveOperand();\r
+ value=ResolveOperand();\r
+\r
+ switch (layr)\r
+ {\r
+ case 0:\r
+ case 1:\r
+ case 2:\r
+ case 3:\r
+ case 4:\r
+ case 5: layers[layr][(y*layer[layr].sizex)+x] = (short) value; break;\r
+ case 6: obstruct[(y*layer[0].sizex)+x] = (byte) value; break;\r
+ case 7: zone[(y*layer[0].sizex)+x] = (byte) value; break;\r
+ default: err("SetTile(): Invalid layer value");\r
+ }\r
+}\r
+\r
+void vc_ScaleSprite()\r
+{\r
+ int x,y,iw,ih,dw,dh,image;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ iw=ResolveOperand();\r
+ ih=ResolveOperand();\r
+ dw=ResolveOperand();\r
+ dh=ResolveOperand();\r
+ image=ResolveOperand();\r
+ if (!LucentOn) CopySpriteZoomClip(x,y,iw,ih,dw,dh,(byte *)image);\r
+ if ( LucentOn) CopySpriteZoomLucentClip(x,y,iw,ih,dw,dh,(byte *)image);\r
+}\r
+\r
+void vc_EntityMove()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ entity[i].moving=0;\r
+ entity[i].speedct=0;\r
+\r
+ entity[i].delayct=0;\r
+ entity[i].mode=0;\r
+ entity[i].data1=0;\r
+\r
+ ResolveString((char *) (int) movescriptbuf + (int) (i*256));\r
+ entity[i].scriptofs=(char *) (int) movescriptbuf + (int) (i*256);\r
+ entity[i].movecode=4;\r
+}\r
+\r
+void vc_HLine()\r
+{\r
+ int x, y, x2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) HLineClip(x,y,x2,c);\r
+ if ( LucentOn) HLineLucentClip(x,y,x2,c);\r
+\r
+}\r
+\r
+void vc_VLine()\r
+{\r
+ int x, y, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) VLineClip(x,y,y2,c);\r
+ if ( LucentOn) VLineLucentClip(x,y,y2,c);\r
+}\r
+\r
+void vc_Line()\r
+{\r
+ int x, y, x2, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) LineClip(x,y,x2,y2,c);\r
+ if ( LucentOn) LineLucentClip(x,y,x2,y2,c);\r
+}\r
+\r
+void vc_Circle()\r
+{\r
+ int x, y, radius, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ radius=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) CircleClip(x,y,radius,c);\r
+ if ( LucentOn) CircleLucentClip(x,y,radius,c);\r
+}\r
+\r
+void vc_CircleFill()\r
+{\r
+ int x, y, radius, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ radius=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) CircleFillClip(x,y,radius,c);\r
+ if ( LucentOn) CircleFillLucentClip(x,y,radius,c);\r
+}\r
+\r
+void vc_Rect()\r
+{\r
+ int x, y, x2, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) RectClip(x,y,x2,y2,c);\r
+ if ( LucentOn) RectLucentClip(x,y,x2,y2,c);\r
+}\r
+\r
+void vc_RectFill()\r
+{\r
+ int x, y, x2, y2, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ x2=ResolveOperand();\r
+ y2=ResolveOperand();\r
+ c=ResolveOperand();\r
+ if (!LucentOn) RectFillClip(x,y,x2,y2,c);\r
+ if ( LucentOn) RectFillLucentClip(x,y,x2,y2,c);\r
+}\r
+\r
+void vc_strlen()\r
+{\r
+ char str[256];\r
+\r
+ ResolveString(str);\r
+ vcreturn=strlen(str);\r
+}\r
+\r
+void vc_strcmp()\r
+{\r
+ char str1[256], str2[256];\r
+\r
+ ResolveString(str1);\r
+ ResolveString(str2);\r
+ vcreturn=strcmp(str1, str2);\r
+}\r
+\r
+void vc_FontWidth()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=numfonts)\r
+ {\r
+ vcreturn=0;\r
+ return;\r
+ }\r
+ vcreturn=font[i].width;\r
+}\r
+\r
+void vc_FontHeight()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=numfonts)\r
+ {\r
+ vcreturn=0;\r
+ return;\r
+ }\r
+ vcreturn=font[i].height;\r
+}\r
+\r
+void vc_SetPixel()\r
+{\r
+ int x, y, c;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ c=ResolveOperand();\r
+ SetPixelClip(x,y,c);\r
+}\r
+\r
+void vc_GetPixel()\r
+{\r
+ int x, y;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ vcreturn=GetPixelClip(x,y);\r
+}\r
+\r
+void vc_EntityOnScreen()\r
+{\r
+ int i,j;\r
+\r
+ i=ResolveOperand();\r
+ for (j=0; j<cc; j++)\r
+ if (entidx[j]==i)\r
+ {\r
+ vcreturn=1;\r
+ return;\r
+ }\r
+ vcreturn=0;\r
+}\r
+\r
+void vc_GetTile()\r
+{\r
+ int x, y, l;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ l=ResolveOperand();\r
+\r
+ switch (l)\r
+ {\r
+ case 0:\r
+ case 1:\r
+ case 2:\r
+ case 3:\r
+ case 4:\r
+ case 5: vcreturn=(int) layers[l][(y*layer[l].sizex)+x]; break;\r
+ case 6: vcreturn=(int) obstruct[(y*layer[0].sizex)+x]; break;\r
+ case 7: vcreturn=(int) zone[(y*layer[0].sizex)+x]; break;\r
+ default: err("GetTile(): Invalid layer value");\r
+ }\r
+}\r
+\r
+void vc_SetResolution()\r
+{\r
+ int xres, yres;\r
+\r
+ xres=ResolveOperand();\r
+ yres=ResolveOperand();\r
+ ShutdownVideo(0);\r
+ vcreturn=InitVideo(xres,yres);\r
+}\r
+\r
+void vc_SetRString()\r
+{\r
+ ResolveString(rstring);\r
+}\r
+\r
+void vc_SetClipRect()\r
+{\r
+ cx1=ResolveOperand();\r
+ cy1=ResolveOperand();\r
+ cx2=ResolveOperand();\r
+ cy2=ResolveOperand();\r
+}\r
+\r
+void vc_SetRenderDest()\r
+{\r
+ sx=ResolveOperand();\r
+ sy=ResolveOperand();\r
+ screen=(byte *) ResolveOperand();\r
+}\r
+\r
+void vc_RestoreRenderSettings()\r
+{\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+ sx=tsx;\r
+ sy=tsy;\r
+ screen=vscreen;\r
+}\r
+\r
+void vc_PartyMove()\r
+{\r
+ player=0;\r
+\r
+ entity[playernum].moving=0;\r
+ entity[playernum].speedct=0;\r
+ entity[playernum].delayct=0;\r
+ entity[playernum].mode=0;\r
+ entity[playernum].data1=0;\r
+\r
+ vcpush(cameratracking);\r
+ vcpush(tracker);\r
+ if (cameratracking==1)\r
+ {\r
+ cameratracking=2;\r
+ tracker=playernum;\r
+ }\r
+\r
+ ResolveString((char *) (int) movescriptbuf + (int) (playernum*256));\r
+ entity[playernum].scriptofs=(char *) (int) movescriptbuf + (int) (playernum*256);\r
+ entity[playernum].movecode=4;\r
+\r
+ while (entity[playernum].movecode)\r
+ {\r
+ while (timer_count)\r
+ {\r
+ ProcessEntities();\r
+ timer_count--;\r
+ }\r
+ Render();\r
+ ShowPage();\r
+ }\r
+ tracker=vcpop();\r
+ cameratracking=vcpop();\r
+ player=&entity[playernum];\r
+ timer_count=0;\r
+}\r
+\r
+void vc_WrapBlit()\r
+{\r
+ int a,b,c,d,e;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ if (!LucentOn) WrapBlit(a,b,c,d,(byte *) e);\r
+ else WrapBlitLucent(a,b,c,d,(byte *) e);\r
+}\r
+\r
+\r
+void vc_TWrapBlit()\r
+{\r
+ int a,b,c,d,e;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ if (!LucentOn) WrapBlitMasked(a,b,c,d,(byte *) e);\r
+ else WrapBlitLucentMasked(a,b,c,d,(byte *) e);\r
+}\r
+\r
+void vc_SetMousePos()\r
+{\r
+ int x, y;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ SetMouse(x, y);\r
+}\r
+\r
+void vc_HookRetrace()\r
+{\r
+ int script=0;\r
+ char which;\r
+\r
+ which=GrabC();\r
+ switch (which)\r
+ {\r
+ case 1: script=ResolveOperand(); break;\r
+ case 2: script=GrabD(); break;\r
+ }\r
+ if (which==2) script+=USERFUNC_MARKER;\r
+ hookretrace=script;\r
+}\r
+\r
+void vc_HookTimer()\r
+{\r
+ int script=0;\r
+ char which;\r
+\r
+ which=GrabC();\r
+ switch (which)\r
+ {\r
+ case 1: script=ResolveOperand(); break;\r
+ case 2: script=GrabD(); break;\r
+ }\r
+ if (which==2) script+=USERFUNC_MARKER;\r
+ hooktimer=script;\r
+}\r
+\r
+void vc_HookKey()\r
+{\r
+ int key, script=0;\r
+ char which;\r
+\r
+ key=ResolveOperand();\r
+ which=GrabC();\r
+\r
+ switch (which)\r
+ {\r
+ case 1: script=ResolveOperand(); break;\r
+ case 2: script=GrabD(); break;\r
+ }\r
+ if (which==2) script+=USERFUNC_MARKER;\r
+ bindarray[key]=script;\r
+}\r
+\r
+void vc_PlayMusic()\r
+{\r
+ char songname[256];\r
+\r
+ ResolveString(songname);\r
+ PlayMusic(songname);\r
+}\r
+\r
+void vc_PaletteMorph()\r
+{\r
+ int r,g,b,percent,intensity,i,wr,wg,wb;\r
+\r
+ r=ResolveOperand(); if (r<0) r=0; if (r>63) r=63;\r
+ g=ResolveOperand(); if (g<0) g=0; if (g>63) g=63;\r
+ b=ResolveOperand(); if (b<0) b=0; if (b>63) b=63;\r
+ percent=100-ResolveOperand();\r
+ intensity=ResolveOperand();\r
+\r
+ for (i=0; i<256; i++)\r
+ {\r
+ wr=pal[(i*3)];\r
+ wg=pal[(i*3)+1];\r
+ wb=pal[(i*3)+2];\r
+\r
+ wr=((wr*percent)+(r*(100-percent)))/100;\r
+ wg=((wg*percent)+(g*(100-percent)))/100;\r
+ wb=((wb*percent)+(b*(100-percent)))/100;\r
+\r
+ pal2[(i*3)]=wr*intensity/63;\r
+ pal2[(i*3)+1]=wg*intensity/63;\r
+ pal2[(i*3)+2]=wb*intensity/63;\r
+ }\r
+ SetPalette(pal2);\r
+}\r
+\r
+void EnforceNoDirectories(char *s)\r
+{\r
+ char y[256], *p;\r
+\r
+ strcpy(y, s);\r
+ p=(char *) (int) y + (int) strlen(y);\r
+ while (p>y && *p != '/' && *p != '\\')\r
+ p--;\r
+ if (*p == '/' || *p == '\\') p++;\r
+ strcpy(s, p);\r
+}\r
+\r
+void vc_OpenFile()\r
+{\r
+ VFILE *f;\r
+ char fname[256];\r
+\r
+ ResolveString(fname);\r
+ EnforceNoDirectories(fname);\r
+\r
+ f=vopen(fname);\r
+ vcreturn=(quad) f;\r
+\r
+ Log(" --> VC opened file %s, ptr %u", fname, (quad) f);\r
+}\r
+\r
+void vc_CloseFile()\r
+{\r
+ VFILE *f;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vclose(f);\r
+\r
+ Log(" --> VC closed file at ptr %u", (quad) f);\r
+}\r
+\r
+void vc_QuickRead()\r
+{\r
+ char fname[256], c, *p;\r
+ int d=0, l, i;\r
+ VFILE *f;\r
+ word w=0;\r
+\r
+ ResolveString(fname);\r
+ EnforceNoDirectories(fname);\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ d=0;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ d=ResolveOperand();\r
+ }\r
+ l=ResolveOperand();\r
+ l=l ? l : 1;\r
+ if (!(f=vopen(fname))) err("QuickRead() - could not open %s",fname);\r
+\r
+ p=(char *) (quad) stringbuf + ((w+d)*256);\r
+ for (i=0; i<l; i++)\r
+ vgets(p, 255, f);\r
+ while (*p)\r
+ {\r
+ if (*p == 10 || *p == 13) *p=0;\r
+ p++;\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+void vc_AddFollower()\r
+{\r
+ int i;\r
+\r
+ i=ResolveOperand();\r
+ if (i>=entities) err("AddFollower(): Not a valid entity index. (%d)",i);\r
+ follower[(int)numfollowers]=i;\r
+ numfollowers++;\r
+// ResetFollowers();\r
+}\r
+\r
+void vc_FlatPoly()\r
+{\r
+ int a, b, c, d, e, f, g;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+ FlatPoly(a,b,c,d,e,f,g);\r
+}\r
+\r
+void vc_TMapPoly()\r
+{\r
+ int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+ h=ResolveOperand();\r
+ i=ResolveOperand();\r
+ j=ResolveOperand();\r
+ k=ResolveOperand();\r
+ l=ResolveOperand();\r
+ m=ResolveOperand();\r
+ n=ResolveOperand();\r
+ o=ResolveOperand();\r
+ TMapPoly(a,b,c,d,e,f,g,h,i,j,k,l,m,n,(char *) o);\r
+}\r
+\r
+void vc_CacheSound()\r
+{\r
+ char fname[256];\r
+\r
+ ResolveString(fname);\r
+ vcreturn=CacheSound(fname);\r
+\r
+}\r
+\r
+void vc_PlaySound()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ PlaySound(a, b, c);\r
+}\r
+\r
+void vc_RotScale()\r
+{\r
+ int a, b, c, d, e, f, g;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+\r
+ RotScale(a, b, c, d, e*3.14159 / 180, (float) f/1000, (byte *) g);\r
+}\r
+\r
+void vc_MapLine()\r
+{\r
+ int x, y, sy, l;\r
+ int xtc, ytc, xofs, yofs;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ sy=ResolveOperand();\r
+ l=ResolveOperand();\r
+\r
+ xtc=x >> 4;\r
+ ytc=y >> 4;\r
+ xofs= -(x&15);\r
+ yofs= (y&15);\r
+\r
+ MapLine(xofs, sy, yofs, (word *) (layers[l]+((ytc*layer[l].sizex)+xtc)));\r
+}\r
+\r
+void vc_TMapLine()\r
+{\r
+ int x, y, sy, l;\r
+ int xtc, ytc, xofs, yofs;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ sy=ResolveOperand();\r
+ l=ResolveOperand();\r
+\r
+ xtc=x >> 4;\r
+ ytc=y >> 4;\r
+ xofs= -(x&15);\r
+ yofs= (y&15);\r
+\r
+ TMapLine(xofs, sy, yofs, (word *) (layers[l]+((ytc*layer[l].sizex)+xtc)));\r
+}\r
+\r
+void vc_val()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ vcreturn=atoi(s);\r
+}\r
+\r
+void vc_TScaleSprite()\r
+{\r
+ int x,y,iw,ih,dw,dh,image;\r
+\r
+ x=ResolveOperand();\r
+ y=ResolveOperand();\r
+ iw=ResolveOperand();\r
+ ih=ResolveOperand();\r
+ dw=ResolveOperand();\r
+ dh=ResolveOperand();\r
+ image=ResolveOperand();\r
+ if (!LucentOn) TCopySpriteZoomClip(x,y,iw,ih,dw,dh,(byte *) image);\r
+ if ( LucentOn) TCopySpriteZoomLucentClip(x,y,iw,ih,dw,dh,(byte *) image);\r
+}\r
+\r
+void vc_GrabRegion()\r
+{\r
+ int x1, y1, x2, y2;\r
+ int i, j, w, h;\r
+ char *ptr;\r
+\r
+ x1=ResolveOperand();\r
+ y1=ResolveOperand();\r
+ x2=ResolveOperand()+1;\r
+ y2=ResolveOperand()+1;\r
+ ptr=(char *) ResolveOperand();\r
+\r
+ if (x2>sx-1) x2=sx-1;\r
+ if (y2>sy-1) y2=sy-1;\r
+ if (x1<0) x1=0;\r
+ if (y1<0) y1=0;\r
+\r
+ w=x2 - x1;\r
+ h=y2 - y1;\r
+\r
+ for (j=y1; j<y2; j++)\r
+ for (i=x1; i<x2; i++)\r
+ ptr[((j-y1)*w)+i]=screen[(j*sx)+i];\r
+}\r
+\r
+void vc_Log()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ Log(s);\r
+}\r
+\r
+void vc_fseekline()\r
+{\r
+ int line, i;\r
+ VFILE *f;\r
+\r
+ line=ResolveOperand();\r
+ f=(VFILE *) ResolveOperand();\r
+\r
+ vseek(f, 0, 0);\r
+ line=( line==0 ? 0 : line-1 );\r
+\r
+ for (i=0; i<line; i++)\r
+ vgets(strbuf, 255, f);\r
+}\r
+\r
+void vc_fseekpos()\r
+{\r
+ int pos;\r
+ VFILE *f;\r
+\r
+ pos=ResolveOperand();\r
+ f=(VFILE *) ResolveOperand();\r
+ vseek(f, pos, 0);\r
+}\r
+\r
+void vc_fread()\r
+{\r
+ char *buffer;\r
+ int len;\r
+ VFILE *f;\r
+\r
+ buffer=(char *) ResolveOperand();\r
+ len=ResolveOperand();\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(buffer, len, f);\r
+}\r
+\r
+void vc_fgetbyte()\r
+{\r
+ VFILE *f;\r
+ byte i;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(&i, 1, f);\r
+ vcreturn=(int) i;\r
+}\r
+\r
+void vc_fgetword()\r
+{\r
+ VFILE *f;\r
+ word i;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(&i, 2, f);\r
+ vcreturn=(int) i;\r
+}\r
+\r
+void vc_fgetquad()\r
+{\r
+ VFILE *f;\r
+ quad i;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(&i, 4, f);\r
+ vcreturn=(int) i;\r
+}\r
+\r
+void vc_fgetline()\r
+{\r
+ char c, *p;\r
+ VFILE *f;\r
+ word w=0;\r
+ quad d;\r
+\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ d=0;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ d=ResolveOperand();\r
+ }\r
+ f=(VFILE *) ResolveOperand();\r
+ p=(char *) (quad) stringbuf + (w*256);\r
+ vgets(p, 255, f);\r
+ while (*p)\r
+ {\r
+ if (*p == 10 || *p == 13) *p=0;\r
+ p++;\r
+ }\r
+}\r
+\r
+void vc_fgettoken()\r
+{\r
+ char c, *p;\r
+ VFILE *f;\r
+ word w=0;\r
+ quad d;\r
+\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ d=0;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ d=ResolveOperand();\r
+ }\r
+ f=(VFILE *) ResolveOperand();\r
+ p=(char *) (quad) stringbuf + (w*256);\r
+ vscanf(f, "%s", p);\r
+}\r
+\r
+void vc_fwritestring()\r
+{\r
+ char s[256];\r
+ FILE *f;\r
+\r
+ ResolveString(s);\r
+ f=(FILE *) ResolveOperand();\r
+ fprintf(f,"%s\n",s);\r
+}\r
+\r
+void vc_fwrite()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ fwrite((char *) a, 1, b, (FILE *) c);\r
+}\r
+\r
+void vc_frename()\r
+{\r
+ char s1[256], s2[256];\r
+\r
+ ResolveString(s1);\r
+ ResolveString(s2);\r
+ EnforceNoDirectories(s1);\r
+ EnforceNoDirectories(s2);\r
+ rename(s1, s2);\r
+\r
+ Log(" --> VC renamed %s to %s.", s1, s2);\r
+}\r
+\r
+void vc_fdelete()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ EnforceNoDirectories(s);\r
+ remove(s);\r
+\r
+ Log(" --> VC deleted %s.", s);\r
+}\r
+\r
+void vc_fwopen()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ EnforceNoDirectories(s);\r
+ vcreturn=(int) fopen(s,"wb");\r
+\r
+ Log(" --> VC opened %s for writing, ptr %u.", s, vcreturn);\r
+}\r
+\r
+void vc_fwclose()\r
+{\r
+ FILE *f;\r
+\r
+ f=(FILE *) ResolveOperand();\r
+ fclose(f);\r
+\r
+ Log(" --> VC close file opened for writing, ptr %u.", (int) f);\r
+}\r
+\r
+void vc_memcpy()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ memcpy((char *) a, (char *) b, c);\r
+}\r
+\r
+void vc_memset()\r
+{\r
+ int a, b, c;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ memset((char *) a, (byte) b, c);\r
+}\r
+\r
+void vc_Silhouette()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int w=ResolveOperand();\r
+ int h=ResolveOperand();\r
+ byte *img=(byte *) ResolveOperand();\r
+ byte c=(byte) ResolveOperand();\r
+\r
+ if (ClipOn)\r
+ {\r
+ LucentOn ? SilhouetteLucentClip(x,y,w,h,c,img)\r
+ : SilhouetteClip(x,y,w,h,c,img);\r
+ }\r
+ else\r
+ {\r
+ LucentOn ? SilhouetteLucent(x,y,w,h,c,img)\r
+ : Silhouette(x,y,w,h,c,img);\r
+ }\r
+}\r
+\r
+void vc_SilhouetteScale()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int sw=ResolveOperand();\r
+ int sh=ResolveOperand();\r
+ int dw=ResolveOperand();\r
+ int dh=ResolveOperand();\r
+ byte *img=(byte *) ResolveOperand();\r
+ byte c=(byte) ResolveOperand();\r
+\r
+ if (ClipOn)\r
+ {\r
+ LucentOn ? SilhouetteZoomLucentClip(x,y,sw,sh,dw,dh,c,img)\r
+ : SilhouetteZoomClip(x,y,sw,sh,dw,dh,c,img);\r
+ }\r
+ else\r
+ {\r
+ LucentOn ? SilhouetteZoomLucent(x,y,sw,sh,dw,dh,c,img)\r
+ : SilhouetteZoom(x,y,sw,sh,dw,dh,c,img);\r
+ }\r
+}\r
+\r
+void vc_Tint()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int w=ResolveOperand();\r
+ int h=ResolveOperand();\r
+ byte *img=(byte *)ResolveOperand();\r
+ byte c=(byte)ResolveOperand();\r
+\r
+ ClipOn ? TintClip(x,y,w,h,c,img)\r
+ : Tint(x,y,w,h,c,img);\r
+}\r
+\r
+void vc_TintScale()\r
+{\r
+ int x=ResolveOperand();\r
+ int y=ResolveOperand();\r
+ int sw=ResolveOperand();\r
+ int sh=ResolveOperand();\r
+ int dw=ResolveOperand();\r
+ int dh=ResolveOperand();\r
+ byte *img=(byte *) ResolveOperand();\r
+ byte c=(byte) ResolveOperand();\r
+\r
+ ClipOn ? TintZoomClip(x,y,sw,sh,dw,dh,c,img)\r
+ : TintZoom(x,y,sw,sh,dw,dh,c,img);\r
+}\r
+\r
+void vc_Mosaic()\r
+{\r
+ int a,b,c,d,e,f,g;\r
+\r
+ a=ResolveOperand();\r
+ b=ResolveOperand();\r
+ c=ResolveOperand();\r
+ d=ResolveOperand();\r
+ e=ResolveOperand();\r
+ f=ResolveOperand();\r
+ g=ResolveOperand();\r
+ Mosaic(a,b,(byte *) c,d,e,f,g);\r
+}\r
+\r
+void vc_WriteVars()\r
+{\r
+ FILE *f;\r
+\r
+ f=(FILE *) ResolveOperand();\r
+ fwrite(globalint, 4, maxint, f);\r
+ fwrite(stringbuf, 256, stralloc, f);\r
+}\r
+\r
+void vc_ReadVars()\r
+{\r
+ VFILE *f;\r
+\r
+ f=(VFILE *) ResolveOperand();\r
+ vread(globalint, 4*maxint, f);\r
+ vread(stringbuf, 256*stralloc, f);\r
+}\r
+\r
+void vc_Asc()\r
+{\r
+ char s[256];\r
+\r
+ ResolveString(s);\r
+ vcreturn=(int) s[0];\r
+}\r
+\r
+void vc_NumForScript()\r
+{\r
+ vcreturn=GrabD();\r
+}\r
+\r
+void vc_Filesize()\r
+{\r
+ char s[256];\r
+ VFILE *f;\r
+\r
+ ResolveString(s);\r
+ f=vopen(s);\r
+ vcreturn=filesize(f);\r
+ vclose(f);\r
+}\r
+\r
+void vc_FTell()\r
+{\r
+ VFILE *f=(VFILE *)ResolveOperand();\r
+ vcreturn=vtell(f);\r
+}\r
+\r
+void vc_CheckCorrupt()\r
+{\r
+ Log("checking for corruption...");\r
+ CheckCorruption();\r
+}\r
+\r
+void HandleStdLib()\r
+{\r
+ int x=0;\r
+ byte c=0;\r
+\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case 1: vc_Exit_(); break;\r
+ case 2: vc_Message(); break;\r
+ case 3: vc_Malloc(); break;\r
+ case 4: vc_Free(); break;\r
+ case 5: vc_pow(); break;\r
+ case 6: vc_loadimage(); break;\r
+ case 7: vc_copysprite(); break;\r
+ case 8: vc_tcopysprite(); break;\r
+ case 9: Render(); break;\r
+ case 10: ShowPage(); break;\r
+ case 11: vc_EntitySpawn(); break;\r
+ case 12: vc_SetPlayer(); break;\r
+ case 13: vc_Map(); break;\r
+ case 14: vc_LoadFont(); break;\r
+ case 15: vc_PlayFLI(); break;\r
+ case 16: curx=ResolveOperand(); cury=ResolveOperand(); break;\r
+ case 17: vc_PrintString(); break;\r
+ case 18: vc_LoadRaw(); break;\r
+ case 19: vc_SetTile(); break;\r
+ case 20: allowconsole=ResolveOperand(); break;\r
+ case 21: vc_ScaleSprite(); break;\r
+ case 22: ProcessEntities(); break;\r
+ case 23: UpdateControls(); break;\r
+ case 24: UnPress(ResolveOperand()); break;\r
+ case 25: vc_EntityMove(); break;\r
+ case 26: vc_HLine(); break;\r
+ case 27: vc_VLine(); break;\r
+ case 28: vc_Line(); break;\r
+ case 29: vc_Circle(); break;\r
+ case 30: vc_CircleFill(); break;\r
+ case 31: vc_Rect(); break;\r
+ case 32: vc_RectFill(); break;\r
+ case 33: vc_strlen(); break;\r
+ case 34: vc_strcmp(); break;\r
+ case 35: break; //CD_Stop(); break;\r
+ case 36: ResolveOperand(); break; //CD_Play(ResolveOperand()); break;\r
+ case 37: vc_FontWidth(); break;\r
+ case 38: vc_FontHeight(); break;\r
+ case 39: vc_SetPixel(); break;\r
+ case 40: vc_GetPixel(); break;\r
+ case 41: vc_EntityOnScreen(); break;\r
+ case 42: vcreturn=0;\r
+ if ((x=ResolveOperand()))\r
+ vcreturn=rand()%x;\r
+ break;\r
+ case 43: vc_GetTile(); break;\r
+ case 44: vc_HookRetrace(); break;\r
+ case 45: vc_HookTimer(); break;\r
+ case 46: vc_SetResolution(); break;\r
+ case 47: vc_SetRString(); break;\r
+ case 48: vc_SetClipRect(); break;\r
+ case 49: vc_SetRenderDest(); break;\r
+ case 50: vc_RestoreRenderSettings(); break;\r
+ case 51: vc_PartyMove(); break;\r
+ case 52: vcreturn=sintbl[ResolveOperand()]; break;\r
+ case 53: vcreturn=costbl[ResolveOperand()]; break;\r
+ case 54: vcreturn=tantbl[ResolveOperand()]; break;\r
+ case 55: ReadMouse(); break;\r
+ case 56: ClipOn=ResolveOperand(); break;\r
+ case 57: LucentOn=ResolveOperand(); break;\r
+ case 58: vc_WrapBlit(); break;\r
+ case 59: vc_TWrapBlit(); break;\r
+ case 60: vc_SetMousePos(); break;\r
+ case 61: vc_HookKey(); break;\r
+ case 62: vc_PlayMusic(); break;\r
+ case 63: StopMusic(); break;\r
+ case 64: vc_PaletteMorph(); break;\r
+ case 65: vc_OpenFile(); break;\r
+ case 66: vc_CloseFile(); break;\r
+ case 67: vc_QuickRead(); break;\r
+ case 68: vc_AddFollower(); break;\r
+// case 69: vc_KillFollower(); break;\r
+// case 70: vc_KillAllFollowers(); break;\r
+// case 71: ResetFollowers();\r
+ case 72: vc_FlatPoly(); break;\r
+ case 73: vc_TMapPoly(); break;\r
+ case 74: vc_CacheSound(); break;\r
+ case 75: FreeAllSounds(); break;\r
+ case 76: vc_PlaySound(); break;\r
+ case 77: vc_RotScale(); break;\r
+ case 78: vc_MapLine(); break;\r
+ case 79: vc_TMapLine(); break;\r
+ case 80: vc_val(); break;\r
+ case 81: vc_TScaleSprite(); break;\r
+ case 82: vc_GrabRegion(); break;\r
+ case 83: vc_Log(); break;\r
+ case 84: vc_fseekline(); break;\r
+ case 85: vc_fseekpos(); break;\r
+ case 86: vc_fread(); break;\r
+ case 87: vc_fgetbyte(); break;\r
+ case 88: vc_fgetword(); break;\r
+ case 89: vc_fgetquad(); break;\r
+ case 90: vc_fgetline(); break;\r
+ case 91: vc_fgettoken(); break;\r
+ case 92: vc_fwritestring(); break;\r
+ case 93: vc_fwrite(); break;\r
+ case 94: vc_frename(); break;\r
+ case 95: vc_fdelete(); break;\r
+ case 96: vc_fwopen(); break;\r
+ case 97: vc_fwclose(); break;\r
+ case 98: vc_memcpy(); break;\r
+ case 99: vc_memset(); break;\r
+ case 100: vc_Silhouette(); break;\r
+ case 101: vcreturn=(int) InitMosaicTable(); break;\r
+ case 102: vc_Mosaic(); break;\r
+ case 103: vc_WriteVars(); break;\r
+ case 104: vc_ReadVars(); break;\r
+ case 105: ExecuteEvent(ResolveOperand()); break;\r
+ case 106: vc_Asc(); break;\r
+ case 107: ExecuteUserFunc(ResolveOperand()); break;\r
+ case 108: vc_NumForScript(); break;\r
+ case 109: vc_Filesize(); break;\r
+ case 110: vc_FTell(); break;\r
+ case 111: vc_CheckCorrupt(); break;\r
+ default: err("VC Execution error: Invalid STDLIB index. (%d)",(int) c);\r
+ }\r
+}\r
+\r
+// ========================== VC Interpretation Core ==========================\r
+\r
+int ProcessIf()\r
+{\r
+ byte exec, c;\r
+\r
+ exec=ProcessIfOperand(); // Get base value;\r
+\r
+ while (1)\r
+ {\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case i_AND: exec=exec & ProcessIfOperand(); continue;\r
+ case i_OR: exec=exec | ProcessIfOperand(); continue;\r
+ case i_UNGROUP: break;\r
+ }\r
+ break;\r
+ }\r
+ return exec;\r
+}\r
+\r
+int ProcessIfOperand()\r
+{\r
+ byte op_desc;\r
+ int eval;\r
+\r
+ eval=ResolveOperand();\r
+ op_desc=GrabC();\r
+ switch (op_desc)\r
+ {\r
+ case i_ZERO: if (!eval) return 1; else return 0;\r
+ case i_NONZERO: if (eval) return 1; else return 0;\r
+ case i_EQUALTO: if (eval == ResolveOperand()) return 1; else return 0;\r
+ case i_NOTEQUAL: if (eval != ResolveOperand()) return 1; else return 0;\r
+ case i_GREATERTHAN: if (eval > ResolveOperand()) return 1; else return 0;\r
+ case i_GREATERTHANOREQUAL: if (eval >= ResolveOperand()) return 1; else return 0;\r
+ case i_LESSTHAN: if (eval < ResolveOperand()) return 1; else return 0;\r
+ case i_LESSTHANOREQUAL: if (eval <= ResolveOperand()) return 1; else return 0;\r
+ case i_GROUP: if (ProcessIf()) return 1; else return 0;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void HandleIf()\r
+{\r
+ char *d;\r
+\r
+ if (ProcessIf())\r
+ {\r
+ GrabD();\r
+ return;\r
+ }\r
+ d=(char *) GrabD();\r
+ code=(char *) (int) basevc + (int) d;\r
+\r
+ return;\r
+}\r
+\r
+void HandleExternFunc()\r
+{\r
+ word i, j, k;\r
+ //lvars *ob = NULL;\r
+ //lvars *save = NULL;\r
+ lvars temp;\r
+ lvars ob;\r
+\r
+ // save lvar\r
+ memcpy(&temp, &lvar, sizeof(lvars));\r
+\r
+ memset(&ob, 0, sizeof(lvars));\r
+ //ob = (lvars *)valloc(sizeof(lvars)); //2640); //sizeof(lvars)); //2640);\r
+ //MSS_CHECK_POINTER_VALIDITY(ob);\r
+ //MSS_SET_BLOCK_LABEL(ob, "ob");\r
+\r
+ k = 0;\r
+ i = GrabW();\r
+ for (j=0; j<funcs[i].numargs; j++)\r
+ {\r
+ switch (funcs[i].argtype[j])\r
+ {\r
+ case 1: ob.nargs[j] = ResolveOperand(); break;\r
+ case 3: ResolveString(ob.s + (k << 8)), k++; break;\r
+ }\r
+ }\r
+\r
+ // copy in ob\r
+ memcpy(&lvar, &ob, sizeof(lvars));\r
+ //lvar = &ob;\r
+ //save = lvar\r
+ //lvar = ob;\r
+ //ob = save;\r
+\r
+ vcpush((quad)basevc);\r
+ vcpush((quad)code);\r
+\r
+ basevc = sysvc;\r
+ code = (char *)(sysvc + funcs[i].syscodeofs);\r
+\r
+ if (vctrack)\r
+ {\r
+ Log(" --> Entering user func %s, codeofs %d",\r
+ funcs[i].fname, funcs[i].syscodeofs);\r
+ }\r
+\r
+ ExecuteBlock();\r
+ basevc = (char *)vcpop();\r
+\r
+ // restore lvar\r
+ memcpy(&lvar, &temp, sizeof(lvars));\r
+ //memcpy(lvar, &temp, sizeof(lvars));\r
+ //vfree(lvar);\r
+ //lvar = ob;\r
+\r
+ if (vctrack)\r
+ {\r
+ Log(" --> Returned from %s", funcs[i].fname);\r
+ }\r
+\r
+// MSS_CHECK_ALL_BLOCKS;\r
+}\r
+\r
+void HandleAssign()\r
+{\r
+ byte c, d;\r
+ word w;\r
+ quad location=0, value, ofs=0;\r
+\r
+ c=GrabC();\r
+ if (c==op_STRING)\r
+ {\r
+ w=GrabW();\r
+ c=GrabC();\r
+ if (c!=a_SET) err("VC execution error: Corrupt string assignment");\r
+ location=(quad) stringbuf + (w*256);\r
+ ResolveString((char *) location);\r
+ return;\r
+ }\r
+ if (c==op_SARRAY)\r
+ {\r
+ w=GrabW();\r
+ w+=ResolveOperand();\r
+ c=GrabC();\r
+ if (c!=a_SET) err("VC execution error: Corrupt string assignment");\r
+ location=(quad) stringbuf + (w*256);\r
+ ResolveString((char *) location);\r
+ return;\r
+ }\r
+ if (c==op_SLOCAL)\r
+ {\r
+ w=GrabW();\r
+ c=GrabC();\r
+ if (c!=a_SET) err("VC execution error: Corrupt string assignment");\r
+ location=(quad) &lvar.s[w*256];\r
+ ResolveString((char *) location);\r
+ return;\r
+ }\r
+ switch (c)\r
+ {\r
+ case op_UVAR: location=GrabD(); break;\r
+ case op_UVARRAY: location=GrabD(); location+=ResolveOperand(); break;\r
+ case op_HVAR0: location=(int) GrabC(); break;\r
+ case op_HVAR1: location=(int) GrabC(); ofs=ResolveOperand(); break;\r
+ case op_LVAR: location=(int) GrabC(); break;\r
+ default: err("VC Execution error: Unknown assignment category.");\r
+ }\r
+ value=ReadInt(c, location, ofs);\r
+ d=GrabC();\r
+ switch(d)\r
+ {\r
+ case a_SET: value=ResolveOperand(); break;\r
+ case a_INC: value++; break;\r
+ case a_DEC: value--; break;\r
+ case a_INCSET: value+=ResolveOperand(); break;\r
+ case a_DECSET: value-=ResolveOperand(); break;\r
+ default:\r
+ err("VC Execution error: Invalid assignment operator %d.", (int) d);\r
+ }\r
+ WriteInt(c, location, ofs, value);\r
+}\r
+\r
+void HandleSwitch()\r
+{\r
+ int realvalue=0;\r
+ int compvalue=0;\r
+ byte c=0;\r
+ byte *next=0;\r
+\r
+ realvalue=ResolveOperand();\r
+ c=GrabC();\r
+ while (c!=opRETURN)\r
+ {\r
+ compvalue=ResolveOperand();\r
+ next=(byte *) GrabD();\r
+ if (compvalue!=realvalue)\r
+ {\r
+ code=(char *) (int) basevc+(int) next;\r
+ c=GrabC();\r
+ continue;\r
+ }\r
+ ExecuteSection();\r
+ c=GrabC();\r
+ }\r
+}\r
+\r
+void ExecuteVC()\r
+{\r
+ byte c=0;\r
+\r
+ while (1)\r
+ {\r
+ if (kill) break;\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case opEXEC_STDLIB: HandleStdLib(); break;\r
+ case opEXEC_LOCALFUNC: break;\r
+ case opEXEC_EXTERNFUNC: HandleExternFunc(); break;\r
+ case opIF: HandleIf(); break;\r
+ case opELSE: break;\r
+ case opGOTO: code=basevc+GrabD(); break;\r
+ case opSWITCH: HandleSwitch(); break;\r
+ case opASSIGN: HandleAssign(); break;\r
+ case opRETURN: code=(char *) vcpop(); break;\r
+ case opSETRETVAL: vcreturn=ResolveOperand(); break;\r
+ default:\r
+ err("Internal VC execution error. (%d)",(int) code - (int) basevc);\r
+ }\r
+ if ((int) code != -1) continue; else break;\r
+ }\r
+}\r
+\r
+void ExecuteBlock()\r
+{\r
+ byte c=0;\r
+\r
+ while (1)\r
+ {\r
+ if (kill) break;\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case opEXEC_STDLIB: HandleStdLib(); break;\r
+ case opEXEC_LOCALFUNC: break;\r
+ case opEXEC_EXTERNFUNC: HandleExternFunc(); break;\r
+ case opIF: HandleIf(); break;\r
+ case opELSE: break;\r
+ case opGOTO: code=basevc+GrabD(); break;\r
+ case opSWITCH: HandleSwitch(); break;\r
+ case opASSIGN: HandleAssign(); break;\r
+ case opRETURN: code=(char *) vcpop(); break;\r
+ case opSETRETVAL: vcreturn=ResolveOperand(); break;\r
+ default:\r
+ err("Internal VC execution error. (%d)",(int) code - (int) basevc);\r
+ }\r
+ if (c != opRETURN) continue; else break;\r
+ }\r
+}\r
+\r
+void ExecuteSection()\r
+{\r
+ byte c=0;\r
+\r
+ while (1)\r
+ {\r
+ if (kill) break;\r
+ c=GrabC();\r
+ switch (c)\r
+ {\r
+ case opEXEC_STDLIB: HandleStdLib(); break;\r
+ case opEXEC_LOCALFUNC: break;\r
+ case opEXEC_EXTERNFUNC: HandleExternFunc(); break;\r
+ case opIF: HandleIf(); break;\r
+ case opELSE: break;\r
+ case opGOTO: code=basevc+GrabD(); break;\r
+ case opSWITCH: HandleSwitch(); break;\r
+ case opASSIGN: HandleAssign(); break;\r
+ case opRETURN: break;\r
+ case opSETRETVAL: vcreturn=ResolveOperand(); break;\r
+ default:\r
+ err("Internal VC execution error. (%d)", (int) code - (int) basevc);\r
+ }\r
+ if (c != opRETURN) continue; else break;\r
+ }\r
+}\r
+\r
+void ExecuteEvent(int i)\r
+{\r
+ invc++;\r
+ vcpush((quad) code);\r
+ vcpush((quad) basevc);\r
+ if (i>mapevents) err("VC event out of bounds (%d)",i);\r
+ basevc=mapvc;\r
+ code=(char *) (int) mapvc + (int) mapvctbl[i];\r
+ vcpush(-1);\r
+ ExecuteVC();\r
+ basevc=(char *) vcpop();\r
+ code=(char *) vcpop();\r
+ invc--;\r
+}\r
+\r
+void ExecuteUserFunc(int i)\r
+{\r
+ //lvars *ob=0;\r
+ lvars temp;\r
+\r
+ // save lvar\r
+ memcpy(&temp, &lvar, sizeof(lvars));\r
+\r
+ vcpush((quad) code);\r
+ vcpush((quad) basevc);\r
+\r
+ if (i > numfuncs)\r
+ err("VC event out of bounds");\r
+\r
+ basevc = sysvc;\r
+ code = (char *)(sysvc + funcs[i].syscodeofs);\r
+\r
+ vcpush(-1);\r
+\r
+ memset(&lvar, 0, sizeof(lvar));\r
+ //ob = lvar;\r
+ //lvar = (lvars *)valloc(sizeof(lvars)); //2640);\r
+ //MSS_SET_BLOCK_LABEL(lvar, "lvar");\r
+\r
+ ExecuteVC();\r
+ basevc = (char *) vcpop();\r
+ code = (char *) vcpop();\r
+\r
+ //free(lvar);\r
+ //lvar = ob;\r
+\r
+ // restore lvar\r
+ memcpy(&lvar, &temp, sizeof(lvars));\r
+}\r
+\r
+void HookRetrace()\r
+{\r
+ if (!hookretrace) return;\r
+ if (hookretrace<USERFUNC_MARKER) ExecuteEvent(hookretrace);\r
+ if (hookretrace>=USERFUNC_MARKER) ExecuteUserFunc(hookretrace-USERFUNC_MARKER);\r
+}\r
+\r
+void HookTimer()\r
+{\r
+ if (!hooktimer) return;\r
+ if (hooktimer<USERFUNC_MARKER) ExecuteEvent(hooktimer);\r
+ if (hooktimer>=USERFUNC_MARKER) ExecuteUserFunc(hooktimer-USERFUNC_MARKER);\r
+}\r
+\r
+void HookKey(int script)\r
+{\r
+ if (!script) return;\r
+ if (script<USERFUNC_MARKER) ExecuteEvent(script);\r
+ if (script>=USERFUNC_MARKER) ExecuteUserFunc(script-USERFUNC_MARKER);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VC_H\r
+#define VC_H\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[12];\r
+ int numargs;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+extern funcdecl funcs[100];\r
+extern int numfuncs, mapevents;\r
+extern int hookretrace, hooktimer;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+extern vardecl vars[100];\r
+extern int numvars, invc;\r
+extern char *mapvc, kill;\r
+extern char *vcsp, *vcstack;\r
+\r
+void LoadSystemVC();\r
+void LoadMapVC(VFILE *f);\r
+void ReadVCVar();\r
+void WriteVCVar();\r
+void ExecuteEvent(int);\r
+void ExecuteUserFunc(int);\r
+\r
+void HookRetrace();\r
+void HookTimer();\r
+void HookKey(int script);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// We never use zero as a tag. This makes it easier to track down misbehaving\r
+// VC code, since zero is commonly come-by when going off into uncharted\r
+// depths of memory.\r
+\r
+#define ERROR 0\r
+\r
+// Opcode values.\r
+\r
+#define opEXEC_STDLIB 1\r
+#define opEXEC_LOCALFUNC 2\r
+#define opEXEC_EXTERNFUNC 3\r
+#define opIF 4\r
+#define opELSE 5\r
+#define opGOTO 6\r
+#define opSWITCH 7\r
+#define opCASE 8\r
+#define opRETURN 9\r
+#define opASSIGN 10\r
+#define opSETRETVAL 11\r
+#define opSETLOCALSTACK 12\r
+\r
+// Operand types.\r
+\r
+#define op_IMMEDIATE 1\r
+#define op_HVAR0 2\r
+#define op_HVAR1 3\r
+#define op_UVAR 4\r
+#define op_UVARRAY 5\r
+#define op_LVAR 6\r
+#define op_BFUNC 7\r
+#define op_UFUNC 8\r
+#define op_GROUP 9\r
+#define op_STRING 10\r
+#define op_SARRAY 11\r
+#define op_SLOCAL 12\r
+\r
+// Variable types.\r
+\r
+#define v_IMMEDIATE 1 // is this necessary?\r
+#define v_CHAR 2\r
+#define v_PTR 3\r
+#define v_INT 4\r
+\r
+// IF relational operators.\r
+\r
+#define i_ZERO 1\r
+#define i_NONZERO 2\r
+#define i_EQUALTO 3\r
+#define i_NOTEQUAL 4\r
+#define i_GREATERTHAN 5\r
+#define i_LESSTHAN 6\r
+#define i_GREATERTHANOREQUAL 7\r
+#define i_LESSTHANOREQUAL 8\r
+#define i_GROUP 9\r
+#define i_UNGROUP 10\r
+#define i_AND 11\r
+#define i_OR 12\r
+\r
+// Assignment operators.\r
+\r
+#define a_SET 1\r
+#define a_INC 2\r
+#define a_DEC 3\r
+#define a_INCSET 4\r
+#define a_DECSET 5\r
+#define a_MULTSET 6\r
+#define a_DIVSET 7\r
+\r
+// Operand combination operators.\r
+\r
+#define op_ADD 1\r
+#define op_SUB 2\r
+#define op_MULT 3\r
+#define op_DIV 4\r
+#define op_MOD 5\r
+#define op_SHL 6\r
+#define op_SHR 7\r
+#define op_AND 8\r
+#define op_OR 9\r
+#define op_XOR 10\r
+#define op_END 11\r
+\r
+// String components\r
+\r
+#define s_IMMEDIATE 1\r
+#define s_GLOBAL 2\r
+#define s_ARRAY 3\r
+#define s_NUMSTR 4\r
+#define s_LEFT 5\r
+#define s_RIGHT 6\r
+#define s_MID 7\r
+#define s_LOCAL 8\r
+#define s_ADD 9\r
+#define s_CHR 10\r
+#define s_END 11\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define VDRIVER_H\r
+\r
+#include <malloc.h>\r
+#include <mem.h>\r
+#include <conio.h>\r
+#include <math.h>\r
+#include "verge.h"\r
+\r
+#define SWAP(a,b) { a-=b; b+=a; a=b-a; }\r
+\r
+// ================================= Data ====================================\r
+\r
+char *DriverDesc;\r
+\r
+byte *screen,*video,*vscreen;\r
+byte pal[768], pal2[768];\r
+byte *translucency_table;\r
+\r
+int sx, sy;\r
+int tx, ty;\r
+int tsx, tsy;\r
+int cx1=0,cy1=0,cx2=319,cy2=199;\r
+\r
+// Driver function-pointers.\r
+int (*ShutdownVideo) (int i);\r
+int (*ShowPage) (void);\r
+\r
+// ================================= Code ====================================\r
+\r
+void SetPalette(byte *pall)\r
+{ quad i;\r
+\r
+ outp(0x03c8, 0);\r
+ for (i=0; i<768; i++)\r
+ outp(0x03c9, pall[i]);\r
+}\r
+\r
+void GetPalette()\r
+{ quad i;\r
+\r
+ outp(0x03c7, 0);\r
+ for (i=0; i<768; i++)\r
+ pal[i]=inp(0x03c9);\r
+}\r
+\r
+void set_intensity(quad n)\r
+{ quad i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal2[i] = (pal[i] * n) >> 6;\r
+\r
+ SetPalette(pal2);\r
+}\r
+\r
+int LFB_ShowPage(void)\r
+{\r
+ if (key[SCAN_ALT] && key[SCAN_X]) err("Exiting: ALT-X pressed.");\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+ memcpy(video,screen,sx*sy);\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void CopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ memcpy(d,src,width);\r
+ src+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d, c;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++,src++)\r
+ {\r
+ c=*src;\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteLucent(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++,src++)\r
+ d[x]=translucency_table[d[x]|(*src<<8)];\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteLucent(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *d, c;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++,src++)\r
+ {\r
+ c=*src;\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoom(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ d[j]=src[(xerr>>16)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoom(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ byte c;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=c;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ d[j]=translucency_table[d[j]|(src[(xerr>>16)]<<8)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ byte c;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ d = screen+(y*sx)+x;\r
+ yerr=0;\r
+\r
+ for (i=0; i<dh; i++)\r
+ {\r
+ xerr=0;\r
+ for (j=0; j<dw; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=c;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void Silhouette(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *d=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (height<1 || width<1) return;\r
+ d=screen+(y*sx)+x;\r
+ do {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ if (src[x])\r
+ d[x]=color;\r
+ }\r
+ src+=width;\r
+ d+=sx;\r
+ } while (--height);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj=(sw<<16)/dw;\r
+ yadj=(sh<<16)/dh;\r
+ d=screen+(y*sx)+x;\r
+ yerr=0;\r
+ do {\r
+ xerr=0;\r
+ for (x=0; x<dw; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=color;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ } while (--dh);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteLucent(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *d=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (width<1 || height<1) return;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ do {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ if (src[x])\r
+ d[x]=range[d[x]];\r
+ }\r
+ src+=width;\r
+ d+=sx;\r
+ } while (--height);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj=(sw<<16)/dw;\r
+ yadj=(sh<<16)/dh;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr=0;\r
+ do {\r
+ xerr=0;\r
+ for (x=0; x<dw; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=range[d[x]];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ } while (--dh);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void Tint(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *d=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (width<1 || height<1) return;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ do {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ c=src[x];\r
+ if (c)\r
+ d[x]=range[c];\r
+ }\r
+ src+=width;\r
+ d+=sx;\r
+ } while (--height);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TintZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xadj=(sw<<16)/dw;\r
+ yadj=(sh<<16)/dh;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr=0;\r
+ do {\r
+ xerr=0;\r
+ for (x=0; x<dw; x++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[x]=range[c];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr+=yadj;\r
+ src+=(yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ } while (--dh);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteLucentClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ d[x]=translucency_table[d[x]|(s[x]<<8)];\r
+\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteLucentClip(int x, int y, int width, int height, byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoomClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ d[j]=src[(xerr>>16)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoomClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ byte c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=c;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopySpriteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ d[j]=translucency_table[d[j]|(src[(xerr>>16)]<<8)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void TCopySpriteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, byte *src)\r
+{\r
+ int i,j;\r
+ int xerr,yerr;\r
+ int xerr_start, yerr_start;\r
+ int xadj,yadj;\r
+ byte *d;\r
+ int c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (i=0; i<yl; i++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (j=0; j<xl; j++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[j]=translucency_table[d[j]|(c<<8)];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteClip(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *s=0,*d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (s[x])\r
+ d[x]=color;\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xerr_start=0, yerr_start=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ yerr = yerr_start & 0xffff;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=color;\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteLucentClip(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *s=0,*d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (s[x])\r
+ d[x]=range[d[x]];\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SilhouetteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xerr_start=0, yerr_start=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr = yerr_start & 0xffff;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ if (src[(xerr>>16)])\r
+ d[x]=range[d[x]];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TintClip(int x, int y, int width, int height, int color, byte *src)\r
+{\r
+ byte *s=0,*d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=range[c];\r
+ }\r
+ s+=width;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TintZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src)\r
+{\r
+ int xerr=0,yerr=0;\r
+ int xerr_start=0, yerr_start=0;\r
+ int xadj=0,yadj=0;\r
+ byte *d=0;\r
+ int xl=0,yl=0,xs=0,ys=0;\r
+ byte *range=0;\r
+ byte c=0;\r
+\r
+ cpubyte=RENDER;\r
+ if (dw<1 || dh<1) return;\r
+ xl=dw;\r
+ yl=dh;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ xadj = (sw<<16)/dw;\r
+ yadj = (sh<<16)/dh;\r
+ xerr_start = xadj * xs;\r
+ yerr_start = yadj * ys;\r
+ if (ys) src+=((yerr_start>>16)*sw);\r
+ d = screen+(y*sx)+x;\r
+ range=translucency_table+(color<<8);\r
+ yerr = yerr_start & 0xffff;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ xerr = xerr_start;\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=src[(xerr>>16)];\r
+ if (c)\r
+ d[x]=range[c];\r
+ xerr+=xadj;\r
+ }\r
+ d+=sx;\r
+ yerr += yadj;\r
+ src += (yerr>>16)*sw;\r
+ yerr &= 0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CopyTile(int x, int y, byte *src)\r
+{\r
+ CopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTile(int x, int y, byte *src, byte *matte)\r
+{\r
+ matte=matte;\r
+ TCopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void CopyTileLucent(int x, int y, byte *src)\r
+{\r
+ CopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTileLucent(int x, int y, byte *src)\r
+{\r
+ TCopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+void CopyTileClip(int x, int y, byte *src)\r
+{\r
+ CopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTileClip(int x, int y, byte *src, byte *matte)\r
+{\r
+ matte=matte;\r
+ TCopySpriteClip(x,y,16,16,src);\r
+}\r
+\r
+void CopyTileLucentClip(int x, int y, byte *src)\r
+{\r
+ CopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+void TCopyTileLucentClip(int x, int y, byte *src)\r
+{\r
+ TCopySpriteLucentClip(x,y,16,16,src);\r
+}\r
+\r
+// aen\r
+void MapLine(int x, int y, int yofs, word *map)\r
+{\r
+ byte *d;\r
+ int tilesx,startx;\r
+ int counter;\r
+ int span, s;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // y clipping\r
+ if (y<0 || y>=tsy) return;\r
+ // x clipping\r
+ startx=0;\r
+ if (x<0) { startx=-x; x=0; }\r
+\r
+ d=screen+(y*sx)+x;\r
+ tilesx=(tsx/16);\r
+\r
+ // do clipped left tile\r
+ counter=0;\r
+ s=tileidx[*map];\r
+ memcpy(d, vsp+((s<numtiles ? s : 0)*256)+(yofs*16)+startx, 16-startx);\r
+ d+=16-startx;\r
+ counter+=16-startx;\r
+ map++;\r
+ // do midsection of line\r
+ for (x=1; x<tilesx; x++,counter+=16)\r
+ {\r
+ s=tileidx[*map];\r
+ memcpy(d, vsp+((s<numtiles ? s : 0)*256)+(yofs*16), 16);\r
+\r
+ d+=16;\r
+ map++;\r
+ }\r
+ // do clipped right tile\r
+ while (counter<tsx)\r
+ {\r
+ span=(tsx-counter);\r
+ if (span>16) span=16;\r
+ s=tileidx[*map];\r
+ memcpy(d, vsp+((s<numtiles ? s : 0)*256)+(yofs*16), span);\r
+ d+=span;\r
+ counter+=span;\r
+ map++;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+}\r
+\r
+// aen\r
+void TMapLine(int x, int y, int yofs, word *map)\r
+{\r
+ byte *s,*d;\r
+ byte c;\r
+ int tilesx,startx;\r
+ int counter;\r
+ int span;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // y clipping\r
+ if (y<0 || y>=tsy) return;\r
+ // x clipping\r
+ startx=0;\r
+ if (x<0) { startx=-x; x=0; }\r
+\r
+ d=screen+(y*sx)+x;\r
+ tilesx=(tsx/16);\r
+\r
+ // do clipped left tile\r
+ counter=0;\r
+ s=vsp+(256*tileidx[*map])+(16*yofs)+startx;\r
+ for (x=0; x<16-startx; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=16-startx;\r
+ counter+=16-startx;\r
+ map++;\r
+ // do midsection of line\r
+ for (y=1; y<tilesx; y++,counter+=16)\r
+ {\r
+ s=vsp+(256*tileidx[*map])+(16*yofs);\r
+ for (x=0; x<16; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=16;\r
+ map++;\r
+ }\r
+ // do clipped right tile\r
+ while (counter<tsx)\r
+ {\r
+ span=(tsx-counter);\r
+ if (span>16) span=16;\r
+ s=vsp+(256*tileidx[*map])+(16*yofs);\r
+ for (x=0; x<span; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ d+=span;\r
+ counter+=span;\r
+ map++;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+}\r
+\r
+void ClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(screen, 0, sx*sy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SetPixel(int x, int y, int color)\r
+{\r
+ screen[(y*sx)+x]=color;\r
+}\r
+\r
+void SetPixelLucent(int x, int y, int color)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ d=screen+(y*sx)+x;\r
+ *d=translucency_table[*d|(color<<8)];\r
+ cpubyte=ETC;\r
+}\r
+\r
+void SetPixelClip(int x, int y, int color)\r
+{\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2) return;\r
+ screen[(y*sx)+x]=color;\r
+}\r
+\r
+void SetPixelLucentClip(int x, int y, int color)\r
+{\r
+ byte *d;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2) return;\r
+ d=screen+(y*sx)+x;\r
+ *d=translucency_table[*d|(color<<8)];\r
+}\r
+\r
+int GetPixel(int x, int y)\r
+{\r
+ return screen[(y*sx)+x];\r
+}\r
+\r
+int GetPixelClip(int x, int y)\r
+{\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2) return 0;\r
+ return screen[(y*sx)+x];\r
+}\r
+\r
+void ColorField(int x, int y, char c)\r
+{\r
+ int i;\r
+\r
+ cpubyte=RENDER;\r
+ i=0;\r
+ do\r
+ {\r
+ SetPixelClip(x+0, y+i, 0);\r
+ SetPixelClip(x+2, y+i, 0);\r
+ SetPixelClip(x+4, y+i, 0);\r
+ SetPixelClip(x+6, y+i, 0);\r
+ SetPixelClip(x+8, y+i, 0);\r
+ SetPixelClip(x+10, y+i, 0);\r
+ SetPixelClip(x+12, y+i, 0);\r
+ SetPixelClip(x+14, y+i, 0);\r
+ i++;\r
+\r
+ SetPixelClip(x+0 +1, y+i, 0);\r
+ SetPixelClip(x+2 +1, y+i, 0);\r
+ SetPixelClip(x+4 +1, y+i, 0);\r
+ SetPixelClip(x+6 +1, y+i, 0);\r
+ SetPixelClip(x+8 +1, y+i, 0);\r
+ SetPixelClip(x+10 +1, y+i, 0);\r
+ SetPixelClip(x+12 +1, y+i, 0);\r
+ SetPixelClip(x+14 +1, y+i, 0);\r
+ i++;\r
+ } while (i<16);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLine(int x, int y, int x2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ memset(screen+(y*sx)+x,color,x2-x+1);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLineClip(int x, int y, int x2, int color)\r
+{\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return;\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+ memset(screen+(y*sx)+x,color,width);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLineLucent(int x, int y, int x2, int color)\r
+{\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (; x<=x2; x++,d++)\r
+ *d=translucency_table[c|*d];\r
+ cpubyte=ETC;\r
+}\r
+\r
+void HLineLucentClip(int x, int y, int x2, int color)\r
+{\r
+ byte *d;\r
+ int c,width;\r
+\r
+ cpubyte=RENDER;\r
+ if (x2<x) SWAP(x,x2);\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (x=0; x<width; x++,d++)\r
+ *d=translucency_table[c|*d];\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLine(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ d=screen+(y*sx)+x;\r
+ for (; y<=y2; y++)\r
+ {\r
+ *d=color;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLineClip(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLineLucent(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (; y<=y2; y++)\r
+ {\r
+ *d=translucency_table[c|*d];\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void VLineLucentClip(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int c,height;\r
+\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+ c=color<<8;\r
+ d=screen+(y*sx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=translucency_table[c|*d];\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// all the Line* routine were grabbed/modded from the Abuse source\r
+\r
+void Line(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// grabbed/modded from Abuse source\r
+void LineClip(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+ return;\r
+}\r
+\r
+void LineLucent(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ c=color<<8; // for translucency\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+void LineLucentClip(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+ byte *d;\r
+ int c;\r
+\r
+ cpubyte=RENDER;\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ SWAP(x1,x2);\r
+ SWAP(y1,y2);\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ c=color<<8; // for translucency\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ d=screen+(dcy*sx)+dcx;\r
+ *d=translucency_table[c|*d];\r
+ //screen[(dcy*sx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+ cpubyte=ETC;\r
+}\r
+\r
+// All the Circle* routines were grabbed/modded from Allegro source\r
+\r
+void Circle(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ SetPixel(x+cx,y+cy,color);\r
+ if (cx) SetPixel(x-cx,y+cy,color);\r
+ if (cy) SetPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixel(x+cy,y+cx,color);\r
+ if (cx) SetPixel(x+cy,y-cx,color);\r
+ if (cy) SetPixel(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do {\r
+ SetPixelClip(x+cx,y+cy,color);\r
+ if (cx) SetPixelClip(x-cx,y+cy,color);\r
+ if (cy) SetPixelClip(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixelClip(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixelClip(x+cy,y+cx,color);\r
+ if (cx) SetPixelClip(x+cy,y-cx,color);\r
+ if (cy) SetPixelClip(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixelClip(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleLucent(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do\r
+ {\r
+ SetPixelLucent(x+cx,y+cy,color);\r
+ if (cx) SetPixelLucent(x-cx,y+cy,color);\r
+ if (cy) SetPixelLucent(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixelLucent(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixelLucent(x+cy,y+cx,color);\r
+ if (cx) SetPixelLucent(x+cy,y-cx,color);\r
+ if (cy) SetPixelLucent(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixelLucent(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleLucentClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ SetPixelLucentClip(x+cx,y+cy,color);\r
+ if (cx) SetPixelLucentClip(x-cx,y+cy,color);\r
+ if (cy) SetPixelLucentClip(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) SetPixelLucentClip(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ SetPixelLucentClip(x+cy,y+cx,color);\r
+ if (cx) SetPixelLucentClip(x+cy,y-cx,color);\r
+ if (cy) SetPixelLucentClip(x-cy,y+cx,color);\r
+ if (cx && cy) SetPixelLucentClip(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFill(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do\r
+ {\r
+ HLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFillClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ HLineClip(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLineClip(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLineClip(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLineClip(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFillLucent(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ HLineLucent(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLineLucent(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLineLucent(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLineLucent(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void CircleFillLucentClip(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+ do\r
+ {\r
+ HLineLucentClip(x-cy,y-cx,x+cy,color);\r
+ if (cx) HLineLucentClip(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ HLineLucentClip(x-cx,y-cy,x+cx,color);\r
+ if (cy) HLineLucentClip(x-cx,y+cy,x+cx,color);\r
+ }\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+ cx++;\r
+ } while (cx <= cy);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void Rect(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLine(x,y,x2,color);\r
+ HLine(x,y2,x2,color);\r
+ VLine(x,y+1,y2-1,color);\r
+ VLine(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLineClip(x,y,x2,color);\r
+ HLineClip(x,y2,x2,color);\r
+ VLineClip(x,y+1,y2-1,color);\r
+ VLineClip(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectLucent(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLineLucent(x,y,x2,color);\r
+ HLineLucent(x,y2,x2,color);\r
+ VLineLucent(x,y+1,y2-1,color);\r
+ VLineLucent(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectLucentClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ HLineLucentClip(x,y,x2,color);\r
+ HLineLucentClip(x,y2,x2,color);\r
+ VLineLucentClip(x,y+1,y2-1,color);\r
+ VLineLucentClip(x2,y+1,y2-1,color);\r
+}\r
+\r
+void RectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLine(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void RectFillClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLineClip(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void RectFillLucent(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLineLucent(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void RectFillLucentClip(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+ if (y2<y) SWAP(y,y2);\r
+ for (; y<=y2; y++)\r
+ HLineLucentClip(x,y,x2,color);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// ============================================================================\r
+// = aen's wrap blitters =\r
+// ============================================================================\r
+\r
+void WrapBlit(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ memcpy(dest, source, spanx);\r
+\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void WrapBlitMasked(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i,j,c;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ for (j=0; j<spanx; j++)\r
+ {\r
+ c=source[j];\r
+ if (c)\r
+ dest[j]=c;\r
+ }\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void WrapBlitLucent(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i,j;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ for (j=0; j<spanx; j++)\r
+ dest[j]=translucency_table[(source[j]<<8)|dest[j]];\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+void WrapBlitLucentMasked(quad x, quad y, int wide, int high, byte *src)\r
+{\r
+ int i,j,c;\r
+ int cliph,clipw;\r
+ int curx,cury;\r
+ int spanx,spany;\r
+ byte *source,*dest;\r
+\r
+ cpubyte=RENDER;\r
+ cliph=cy2-cy1+1;\r
+ clipw=cx2-cx1+1;\r
+ y%=high;\r
+ curx=0;\r
+\r
+ do\r
+ {\r
+ x%=curx?1:wide;\r
+ spanx=wide-x;\r
+ if (curx+spanx>=clipw)\r
+ spanx=clipw-curx;\r
+ source=src+(y*wide)+x;\r
+ dest=screen+(cy1*sx)+cx1+curx;\r
+ cury=0;\r
+\r
+ do\r
+ {\r
+ spany=high-(cury?0:y);\r
+ if (cury+spany>=cliph)\r
+ spany=cliph-cury;\r
+ for (i=0; i<spany; i++,source+=wide,dest+=sx)\r
+ for (j=0; j<spanx; j++)\r
+ {\r
+ c=source[j];\r
+ if (c)\r
+ dest[j]=translucency_table[(c<<8)|dest[j]];\r
+ }\r
+ source=src+x;\r
+ cury+=spany;\r
+ } while (cury<cliph);\r
+ curx+=spanx;\r
+ } while (curx<clipw);\r
+ cpubyte=ETC;\r
+}\r
+\r
+// ============================================================================\r
+// = alias.zip / zero / aen rotational scaler routines =\r
+// ============================================================================\r
+\r
+void RotScale(int posx, int posy, quad width, quad height, float angle, float scale, byte *src)\r
+{\r
+ // new! shamelessly ripped off from alias.zip\r
+ // except the atan2 stuff which i had to make up myself AEN so there :p\r
+\r
+ int xs,ys,xl,yl;\r
+ int sinas,cosas,xc,yc,srcx,srcy,x,y,tempx,tempy,T_WIDTH_CENTER,T_HEIGHT_CENTER,W_WIDTH_CENTER,W_HEIGHT_CENTER,W_HEIGHT,W_WIDTH;\r
+ byte *dest,pt;\r
+ float ft;\r
+\r
+ ft=atan2((float)width,(float)height);\r
+\r
+ T_WIDTH_CENTER=width>>1;\r
+ T_HEIGHT_CENTER=height>>1;\r
+ W_WIDTH=((float)width/scale*sin(ft) + (float)height/scale*cos(ft));\r
+ W_HEIGHT=W_WIDTH;\r
+ W_HEIGHT_CENTER=W_HEIGHT>>1;\r
+ W_WIDTH_CENTER=W_HEIGHT_CENTER; //W_WIDTH/2;\r
+\r
+ sinas=sin(-angle)*65536*scale;\r
+ cosas=cos(-angle)*65536*scale;\r
+\r
+ xc=T_WIDTH_CENTER*65536 - (W_HEIGHT_CENTER*(cosas+sinas));\r
+ yc=T_HEIGHT_CENTER*65536 - (W_WIDTH_CENTER*(cosas-sinas));\r
+ posx-=W_WIDTH_CENTER;\r
+ posy-=W_HEIGHT_CENTER;\r
+\r
+ // clipping\r
+ if (W_WIDTH<2 || W_HEIGHT<2) return;\r
+ xl=W_WIDTH;\r
+ yl=W_HEIGHT;\r
+ xs=ys=0;\r
+ if (posx>cx2 || posy>cy2 || posx+xl<cx1 || posy+yl<cy1)\r
+ return;\r
+ if (posx+xl > cx2) xl=cx2-posx+1;\r
+ if (posy+yl > cy2) yl=cy2-posy+1;\r
+ if (posx<cx1)\r
+ {\r
+ xs=cx1-posx;\r
+ xl-=xs;\r
+ posx=cx1;\r
+\r
+ xc+=cosas*xs; // woo!\r
+ yc-=sinas*xs;\r
+ }\r
+ if (posy<cy1)\r
+ {\r
+ ys=cy1-posy;\r
+ yl-=ys;\r
+ posy=cy1;\r
+\r
+ xc+=sinas*ys; // woo!\r
+ yc+=cosas*ys;\r
+ }\r
+\r
+ dest=screen+posx+posy*sx;\r
+ for (y=0; y<yl; y++)\r
+ {\r
+ srcx=xc;\r
+ srcy=yc;\r
+\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ tempx=(srcx>>16);\r
+ tempy=(srcy>>16);\r
+\r
+ if (tempx>=0 && tempx<width && tempy>=0 && tempy<height)\r
+ {\r
+ if ((pt=src[tempx+tempy*width]))\r
+ dest[x]=pt;\r
+ }\r
+\r
+ srcx+=cosas;\r
+ srcy-=sinas;\r
+ }\r
+\r
+ dest+=sx;\r
+\r
+ xc+=sinas;\r
+ yc+=cosas;\r
+ }\r
+}\r
+\r
+// ============================================================================\r
+// = zero's Mosiac effects =\r
+// ============================================================================\r
+\r
+//mosaic routines\r
+//TODO-need to asm optimize these badly! they are rather slow!\r
+\r
+byte FindPalMatchForMosaic(quad r, quad g, quad b)\r
+{\r
+ quad index;\r
+ quad diffrecord,diff,record;\r
+ diffrecord=100000;\r
+ record=100000;\r
+\r
+ for(index=0; index<256; index++)\r
+ {\r
+ diff=abs(r-pal[index*3])+abs(g-pal[index*3+1])+abs(b-pal[index*3+2])+1;\r
+ if(diff<diffrecord)\r
+ {\r
+ diffrecord=diff;\r
+ if(diff==1) return index;\r
+ record=index;\r
+ }\r
+ }\r
+ return record;\r
+}\r
+\r
+byte *InitMosaicTable(void)\r
+{\r
+ quad r,g,b;\r
+ byte *tmp;\r
+ tmp=(byte *)malloc(262144);\r
+\r
+ for(r=0; r<64; r++)\r
+ for(g=0; g<64; g++)\r
+ for(b=0; b<64; b++)\r
+ tmp[r*4096+g*64+b]=FindPalMatchForMosaic(r,g,b);\r
+ return tmp;\r
+}\r
+\r
+void Mosaic(quad xlevel, quad ylevel, byte *tbl, quad xmin, quad ymin, quad xmax, quad ymax)\r
+{\r
+ quad x,y,rtot,btot,gtot,xloop,yloop,xfier,txlevel;\r
+ byte *src;\r
+ byte pixel;\r
+\r
+ for(y=ymin; y<ymax; y+=ylevel)\r
+ {\r
+ for(x=xmin; x<xmax; x+=xlevel)\r
+ {\r
+ rtot=0; gtot=0; btot=0;\r
+ src=y*sx+x+screen;\r
+ if(ymax-y<ylevel) ylevel=ymax-y;\r
+ if(xmax-x<xlevel) txlevel=xmax-x; else txlevel=xlevel;\r
+ xfier=ylevel*txlevel;\r
+ for(yloop=0; yloop<ylevel; yloop++)\r
+ {\r
+ for(xloop=0; xloop<txlevel; xloop++)\r
+ {\r
+ rtot+=pal[*src*3];\r
+ gtot+=pal[*src*3+1];\r
+ btot+=pal[*src*3+2];\r
+ src++;\r
+ }\r
+ src+=sx-txlevel;\r
+ }\r
+ rtot/=xfier;\r
+ gtot/=xfier;\r
+ btot/=xfier;\r
+ pixel=tbl[rtot*4096+gtot*64+btot];\r
+ src=y*sx+x+screen;\r
+ for(yloop=0; yloop<ylevel; yloop++)\r
+ {\r
+ for(xloop=0; xloop<txlevel; xloop++)\r
+ {\r
+ *src=pixel;\r
+ src++;\r
+ }\r
+ src+=sx-txlevel;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+// ============================================================================\r
+// = Mord's trifillers =\r
+// ============================================================================\r
+\r
+void FlatPoly(int x1, int y1, int x2, int y2, int x3, int y3, char color)\r
+{\r
+ int xstep,xstep2;\r
+ int xval,xval2;\r
+ int yon;\r
+ int swaptemp;\r
+\r
+ if (y1 > y3)\r
+ {\r
+ swaptemp=x1; x1=x3; x3=swaptemp;\r
+ swaptemp=y1; y1=y3; y3=swaptemp;\r
+ }\r
+ if (y2 > y3)\r
+ {\r
+ swaptemp=x2; x2=x3; x3=swaptemp;\r
+ swaptemp=y2; y2=y3; y3=swaptemp;\r
+ }\r
+ if (y1 > y2)\r
+ {\r
+ swaptemp=x1; x1=x2; x2=swaptemp;\r
+ swaptemp=y1; y1=y2; y2=swaptemp;\r
+ }\r
+\r
+ xstep2=((x3-x1) << 16) / (y3-y1);\r
+ xval2=x1 << 16;\r
+\r
+ if (y1 != y2)\r
+ {\r
+ xstep = ((x2-x1) << 16) / (y2-y1);\r
+ xval = x1 << 16;\r
+ for (yon=y1;yon < y2; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ HLineClip(xval>>16,yon,xval2>>16,color);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ }\r
+ }\r
+ if (y2 != y3)\r
+ {\r
+ xstep = ((x3-x2) << 16) / (y3-y2);\r
+ xval = x2 << 16;\r
+ for (yon=y2;yon < y3; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ HLineClip(xval>>16,yon,xval2>>16,color);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ }\r
+ }\r
+}\r
+\r
+char *image;\r
+int texw,texh; // those damn bastards want EVERYTHING!\r
+\r
+void tmaphline(int x1, int x2, int y, int tx1, int tx2, int ty1, int ty2)\r
+{\r
+ int i;\r
+ int txstep,txval;\r
+ int tystep,tyval;\r
+\r
+ if (x1 != x2)\r
+ {\r
+ if (x2 < x1)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=tx1; tx1=tx2; tx2=i;\r
+ i=ty1; ty1=ty2; ty2=i;\r
+ }\r
+ if ((x1 > sx) || (x2 < 0)) return;\r
+ txstep=((tx2-tx1)<<16)/(x2-x1);\r
+ tystep=((ty2-ty1)<<16)/(x2-x1);\r
+ txval=tx1<<16;\r
+ tyval=ty1<<16;\r
+\r
+ for (i=x1;i<x2;i++)\r
+ {\r
+ screen[y*sx+i] = image[(tyval>>16)*texw+(txval>>16)];\r
+ txval+=txstep;\r
+ tyval+=tystep;\r
+ }\r
+ }\r
+}\r
+\r
+void TMapPoly(int x1, int y1, int x2, int y2, int x3, int y3,\r
+ int tx1, int ty1, int tx2, int ty2, int tx3, int ty3,\r
+ int tw, int th, char *img)\r
+{\r
+ int xstep,xstep2;\r
+ int xval,xval2;\r
+ int txstep,txstep2;\r
+ int tystep,tystep2;\r
+ int txval,txval2;\r
+ int tyval,tyval2;\r
+ int yon;\r
+ int swaptemp;\r
+\r
+ image=img; texw=tw; texh=th;\r
+ if (y1 > y3)\r
+ {\r
+ swaptemp=x1; x1=x3; x3=swaptemp;\r
+ swaptemp=y1; y1=y3; y3=swaptemp;\r
+ swaptemp=tx1; tx1=tx3; tx3=swaptemp;\r
+ swaptemp=ty1; ty1=ty3; ty3=swaptemp;\r
+ }\r
+ if (y2 > y3)\r
+ {\r
+ swaptemp=x2; x2=x3; x3=swaptemp;\r
+ swaptemp=y2; y2=y3; y3=swaptemp;\r
+ swaptemp=tx2; tx2=tx3; tx3=swaptemp;\r
+ swaptemp=ty2; ty2=ty3; ty3=swaptemp;\r
+ }\r
+ if (y1 > y2)\r
+ {\r
+ swaptemp=x1; x1=x2; x2=swaptemp;\r
+ swaptemp=y1; y1=y2; y2=swaptemp;\r
+ swaptemp=tx1; tx1=tx2; tx2=swaptemp;\r
+ swaptemp=ty1; ty1=ty2; ty2=swaptemp;\r
+ }\r
+ xstep2=((x3-x1) << 16) / (y3-y1);\r
+ xval2=x1 << 16;\r
+ txstep2=((tx3-tx1) << 16) / (y3-y1);\r
+ txval2=tx1 << 16;\r
+ tystep2=((ty3-ty1) << 16) / (y3-y1);\r
+ tyval2=ty1 << 16;\r
+\r
+ if (y1 != y2)\r
+ {\r
+ xstep = ((x2-x1) << 16) / (y2-y1);\r
+ xval = x1 << 16;\r
+ txstep = ((tx2-tx1) << 16) / (y2-y1);\r
+ txval = tx1 << 16;\r
+ tystep = ((ty2-ty1) << 16) / (y2-y1);\r
+ tyval = ty1 << 16;\r
+\r
+ for (yon=y1;yon < y2; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ tmaphline(xval>>16,xval2>>16,yon,txval>>16,txval2>>16,\r
+ tyval>>16,tyval2>>16);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ txval+=txstep;\r
+ txval2+=txstep2;\r
+ tyval+=tystep;\r
+ tyval2+=tystep2;\r
+ }\r
+ }\r
+ if (y2 != y3)\r
+ {\r
+ xstep = ((x3-x2) << 16) / (y3-y2);\r
+ xval = x2 << 16;\r
+ txstep = ((tx3-tx2) << 16) / (y3-y2);\r
+ txval = tx2 << 16;\r
+ tystep = ((ty3-ty2) << 16) / (y3-y2);\r
+ tyval = ty2 << 16;\r
+\r
+ for (yon=y2;yon < y3; yon++)\r
+ {\r
+ if ((yon > -1) && (yon < 200))\r
+ {\r
+ tmaphline(xval>>16,xval2>>16,yon,txval>>16,txval2>>16,\r
+ tyval>>16,tyval2>>16);\r
+ }\r
+ xval+=xstep;\r
+ xval2+=xstep2;\r
+ txval+=txstep;\r
+ txval2+=txstep2;\r
+ tyval+=tystep;\r
+ tyval2+=tystep2;\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+// ============================================================================\r
+// = aen's ripple-blitter =\r
+// ============================================================================\r
+\r
+int thresh;\r
+int dispx[64],dispy[64];\r
+\r
+void InitDisplaceStuff(float xmag, float ymag)\r
+{\r
+ int x, y, *d;\r
+\r
+ xmag=4.0,d=dispx;\r
+ for (y=0; y<32; y++)\r
+ *d++=sin(y * (360.0/32) * (3.14/180))*xmag;\r
+\r
+ ymag=3.9,d=dispy;\r
+ for (x=0; x<32; x++)\r
+ *d++=cos(x * (360.0/32) * (3.14/180))*ymag;\r
+\r
+ thresh=14;\r
+}\r
+\r
+void CopyTileDisplace(int x, int y, unsigned char *spr)\r
+{\r
+ int i, j;\r
+ int xx, yy, xt, yt;\r
+ int xin, yin;\r
+ byte *dest;\r
+\r
+ xin = ((x+xwin)&31)<16 ? 0 : 16;\r
+ yin = ((y+ywin)&31)<16 ? 0 : 16;\r
+ dest=screen+(y*sx)+x;\r
+\r
+ // in the yy and xx calcs, +y and +x keep the start position correct\r
+ // within the 32 element lookup tables (ie. so they flow continuously\r
+ // across the 16x16 images).\r
+\r
+ for (j=0; j<16; j++)\r
+ {\r
+ yy = (j+yin+thresh) & 31;\r
+ for (i=0; i<16; i++)\r
+ {\r
+ xx = (i+xin+thresh) & 31;\r
+ xt = (i+dispx[yy]) & 15;\r
+ yt = (j+dispy[xx]) & 15;\r
+\r
+ dest[i]=spr[(yt*16)+xt];\r
+ }\r
+ dest+=sx;\r
+ }\r
+}\r
+\r
+void CopyTileDisplaceClip(int x, int y, unsigned char *spr)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int i, j;\r
+ int xx, yy, xt, yt;\r
+ int xin, yin;\r
+\r
+ cpubyte=RENDER;\r
+ xl=16;\r
+ yl=16;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=spr;\r
+ //if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ //if (xs) s+=xs;\r
+ d=screen+(y*sx)+x;\r
+\r
+ xin = ((x+xwin)&31)<16 ? 0 : 16; xin += xs;\r
+ yin = ((y+ywin)&31)<16 ? 0 : 16; yin += ys;\r
+\r
+ //dest=screen+(y*sx)+x;\r
+\r
+ // in the yy and xx calcs, +y and +x keep the start position correct\r
+ // within the 32 element lookup tables (ie. so they flow continuously\r
+ // across the 16x16 images).\r
+\r
+ for (j=0; j<yl; j++)\r
+ {\r
+ yy = (j+yin+thresh) & 31;\r
+ for (i=0; i<xl; i++)\r
+ {\r
+ xx = (i+xin+thresh) & 31;\r
+ xt = (i+xs+dispx[yy]) & 15;\r
+ yt = (j+ys+dispy[xx]) & 15;\r
+\r
+ d[i]=s[(yt*16)+xt];\r
+ }\r
+ d+=sx;\r
+ }\r
+ cpubyte=ETC;\r
+} */\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VDRIVER_H\r
+#define VDRIVER_H\r
+\r
+extern byte *screen,*video,*vscreen;\r
+extern byte pal[768], pal2[768];\r
+extern byte *translucency_table;\r
+\r
+extern int sx, sy;\r
+extern int tx, ty;\r
+extern int tsx, tsy;\r
+extern int cx1,cy1,cx2,cy2;\r
+\r
+extern char *DriverDesc;\r
+\r
+extern int InitVideo(int xres, int yres);\r
+extern void VidInfo(void);\r
+extern void SetPalette(byte *pall);\r
+extern void GetPalette(void);\r
+extern void set_intensity(unsigned int n);\r
+\r
+// driver interface\r
+\r
+extern int (*ShutdownVideo)(int i);\r
+extern int (*ShowPage)(void);\r
+\r
+// LFB routines for all driver functions\r
+\r
+extern int LFB_ShowPage(void);\r
+extern void ColorField(int x, int y, byte c);\r
+extern void ClearScreen(void);\r
+extern void MapLine(int x, int y, int yofs, word *map);\r
+extern void TMapLine(int x, int y, int yofs, word *map);\r
+\r
+extern void CopySprite(int x, int y, int width, int height, byte *src);\r
+extern void TCopySprite(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoom(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoom(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void CopySpriteLucent(int x, int y, int width, int height, byte *src);\r
+extern void TCopySpriteLucent(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoomLucent(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoomLucent(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void Silhouette(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void SilhouetteLucent(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoomLucent(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void Tint(int x, int y, int width, int height, int color, byte *src);\r
+extern void TintZoom(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+\r
+extern void CopySpriteClip(int x, int y, int width, int height, byte *src);\r
+extern void TCopySpriteClip(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoomClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoomClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void CopySpriteLucentClip(int x, int y, int width, int height, byte *src);\r
+extern void TCopySpriteLucentClip(int x, int y, int width, int height, byte *src);\r
+extern void CopySpriteZoomLucentClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void TCopySpriteZoomLucentClip(int x, int y, int width, int height, int dw, int dh, byte *src);\r
+extern void SilhouetteClip(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void SilhouetteLucentClip(int x, int y, int width, int height, int color, byte *src);\r
+extern void SilhouetteZoomLucentClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+extern void TintClip(int x, int y, int width, int height, int color, byte *src);\r
+extern void TintZoomClip(int x, int y, int sw, int sh, int dw, int dh, int color, byte *src);\r
+\r
+extern void CopyTile(int x, int y, byte *src);\r
+extern void TCopyTile(int x, int y, byte *spr, byte *matte);\r
+extern void CopyTileLucent(int x, int y, byte *src);\r
+extern void TCopyTileLucent(int x, int y, byte *spr);\r
+\r
+extern void CopyTileClip(int x, int y, byte *src);\r
+extern void TCopyTileClip(int x, int y, byte *spr, byte *matte);\r
+extern void CopyTileLucentClip(int x, int y, byte *src);\r
+extern void TCopyTileLucentClip(int x, int y, byte *spr);\r
+\r
+extern int GetPixel(int x, int y);\r
+extern void SetPixel(int x, int y, int color);\r
+extern void SetPixelLucent(int x, int y, int color);\r
+extern void HLine(int x, int y, int x2, int color);\r
+extern void HLineLucent(int x, int y, int x2, int color);\r
+extern void RectFill(int x, int y, int x2, int y2, int color);\r
+extern void RectFillLucent(int x, int y, int x2, int y2, int color);\r
+extern void VLine(int x, int y, int y2, int color);\r
+extern void VLineLucent(int x, int y, int y2, int color);\r
+extern void Rect(int x, int y, int x2, int y2, int color);\r
+extern void RectLucent(int x, int y, int x2, int y2, int color);\r
+extern void Line(int x, int y, int x2, int y2, int color);\r
+extern void LineLucent(int x, int y, int x2, int y2, int color);\r
+extern void CircleFill(int x, int y, int radius, int color);\r
+extern void CircleFillLucent(int x, int y, int radius, int color);\r
+extern void Circle(int x, int y, int radius, int color);\r
+extern void CircleLucent(int x, int y, int radius, int color);\r
+\r
+extern int GetPixelClip(int x, int y);\r
+extern void SetPixelClip(int x, int y, int color);\r
+extern void SetPixelLucentClip(int x, int y, int color);\r
+extern void HLineClip(int x, int y, int x2, int color);\r
+extern void HLineLucentClip(int x, int y, int x2, int color);\r
+extern void RectFillClip(int x, int y, int x2, int y2, int color);\r
+extern void RectFillLucentClip(int x, int y, int x2, int y2, int color);\r
+extern void VLineClip(int x, int y, int y2, int color);\r
+extern void VLineLucentClip(int x, int y, int y2, int color);\r
+extern void RectClip(int x, int y, int x2, int y2, int color);\r
+extern void RectLucentClip(int x, int y, int x2, int y2, int color);\r
+extern void LineClip(int x, int y, int x2, int y2, int color);\r
+extern void LineLucentClip(int x, int y, int x2, int y2, int color);\r
+extern void CircleFillClip(int x, int y, int radius, int color);\r
+extern void CircleFillLucentClip(int x, int y, int radius, int color);\r
+extern void CircleClip(int x, int y, int radius, int color);\r
+extern void CircleLucentClip(int x, int y, int radius, int color);\r
+\r
+extern void WrapBlit(quad x, quad y, int wide, int high, byte *src);\r
+extern void WrapBlitMasked(quad x, quad y, int wide, int high, byte *src);\r
+extern void WrapBlitLucent(quad x, quad y, int wide, int high, byte *src);\r
+extern void WrapBlitLucentMasked(quad x, quad y, int wide, int high, byte *src);\r
+\r
+void RotScale(int posx, int posy, quad width, quad height, float angle, float scale, byte *src);\r
+byte *InitMosaicTable(void);\r
+void Mosaic(quad xlevel, quad ylevel, byte *tbl, quad xmin, quad ymin, quad xmax, quad ymax);\r
+\r
+void TMapPoly(int x1, int y1, int x2, int y2, int x3, int y3,\r
+ int tx1, int ty1, int tx2, int ty2, int tx3, int ty3,\r
+ int tw, int th, char *img);\r
+void FlatPoly(int x1, int y1, int x2, int y2, int x3, int y3, char color);\r
+\r
+#endif // VDRIVER_H\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdarg.h> // va_*\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// declared in VDRIVER.C\r
+extern byte* translucency_table;\r
+\r
+char *strbuf=0; // Universal temporary string buffer. :)\r
+char joyflag=0;\r
+int vidxres=0,vidyres=0; // Joystick on/off | Video mode to use\r
+char logoutput=0; // Verbose debugging startup mode\r
+char nocdaudio=0; // do not use CD audio\r
+char startmap[80]; // startup map\r
+FILE *logf=0; // logfile file handle\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitializeDefaults()\r
+{\r
+ kb1=28; kb2=56; kb3=1; kb4=57; // default keyboard controls\r
+ jb1=1; jb2=2; jb3=3; jb4=4; // default joystick controls\r
+ joyflag=0; // joystick defaults to disabled\r
+ vidxres=320; vidyres=200;\r
+ logoutput=0; // Don't be annoyingly verbose\r
+ strbuf=(char *) valloc(2000, "strbuf", OID_TEMP);\r
+ memcpy(startmap,"test.map\0",9);\r
+\r
+ md_mixfreq=44100;\r
+ md_dmabufsize=2000;\r
+ md_mode=DMODE_16BITS|DMODE_STEREO;\r
+ md_device=0;\r
+}\r
+\r
+static VFILE *user_cfg_file=0;\r
+static char parse_str[256];\r
+\r
+static char *parse_cfg_token()\r
+{\r
+ vscanf(user_cfg_file, "%s", parse_str);\r
+ return parse_str;\r
+}\r
+\r
+// compares string against parse_str (grabbed by parse_cfg_token)\r
+// 0=mismatch, 1=match\r
+static int parse_match(char *str)\r
+{\r
+ return !strcmp(parse_str, str);\r
+}\r
+\r
+void ParseStartupFiles()\r
+{\r
+ user_cfg_file = vopen("user.cfg");\r
+ if (!user_cfg_file)\r
+ {\r
+ printf("Could not open user.cfg. \n");\r
+ exit(-1);\r
+ }\r
+\r
+ while (1)\r
+ {\r
+ parse_cfg_token();\r
+\r
+ // mounts a pack file; up to 3? (perhaps gaurd against more?)\r
+ if (parse_match("mount"))\r
+ { MountVFile(parse_cfg_token()); continue; }\r
+ // set video resolution\r
+ else if (parse_match("vidmode"))\r
+ {\r
+ vidxres = atoi(parse_cfg_token());\r
+ vidyres = atoi(parse_cfg_token());\r
+\r
+ // check validity\r
+ if (vidxres != 256 && vidxres != 320\r
+ && vidxres != 360 && vidxres != 640)\r
+ {\r
+ Log("user.cfg: invalid resolution width %i passed to vidmode",\r
+ vidxres);\r
+ }\r
+ if (vidyres != 200 && vidyres != 240\r
+ && vidyres != 256 && vidyres != 480)\r
+ {\r
+ Log("user.cfg: invalid resolution height %i passed to vidmode",\r
+ vidyres);\r
+ }\r
+\r
+ continue;\r
+ }\r
+ // log to VERGE.LOG\r
+ else if (parse_match("log"))\r
+ {\r
+ logoutput=1;\r
+ continue;\r
+ }\r
+ // disable CD playing\r
+ else if (parse_match("nocdaudio"))\r
+ {\r
+ nocdaudio=1;\r
+ continue;\r
+ }\r
+ // map VERGE.EXE will run first when executed\r
+ else if (parse_match("startmap"))\r
+ {\r
+ strcpy(startmap, parse_cfg_token());\r
+ continue;\r
+ }\r
+ // 0=auto detect, 1=???, 2=???, 3=nosound\r
+ else if (parse_match("sound_device"))\r
+ {\r
+ md_device = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("mixrate"))\r
+ {\r
+ md_mixfreq = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("dmabufsize"))\r
+ {\r
+ md_dmabufsize = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("force8bit"))\r
+ {\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("forcemono"))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ // unknown command, assume end\r
+ break;\r
+ }\r
+\r
+ // done parsing config\r
+ vclose(user_cfg_file);\r
+}\r
+\r
+void ParseAutoCFG()\r
+{ VFILE *f;\r
+ int i;\r
+\r
+ if (!(f=vopen("auto.cfg"))) return;\r
+\r
+ while (1)\r
+ {\r
+ vgets((char *) cmd, 40, f);\r
+ for (i=0; i<(signed) strlen((char *) cmd); i++)\r
+ if (cmd[i]==10 || cmd[i]==13) cmd[i]=0;\r
+ if (strlen((char*) cmd)<2) break;\r
+ ProcessCommand();\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+void InitLog()\r
+{\r
+ if (logoutput)\r
+ {\r
+ remove("verge.log");\r
+ }\r
+}\r
+\r
+void Log(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ if (!logoutput) return;\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "%s \n", tempbuf);\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+// used in conjunction with LogDone()\r
+void Logp(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ if (!logoutput) return;\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "%s", tempbuf);\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+void LogDone()\r
+{\r
+ if (!logoutput) return;\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "... OK \n");\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+void InitSystems()\r
+{\r
+ InitLog();\r
+ Log("V2 startup. Logfile initialized.");\r
+ Logp("Sys: Initializing keyboard handler.");\r
+ InitKeyboard();\r
+ LogDone();\r
+#ifdef __DJGPP__\r
+ keyboard_chain(0);\r
+#endif\r
+ Logp("Sys: Initializing timer. Set 100hz.");\r
+ InitTimer();\r
+ LogDone();\r
+\r
+ /*\r
+ Logp("Sys: Initializing CD Audio.");\r
+ CD_Init();\r
+ LogDone();\r
+ */\r
+\r
+ Logp("Sys: Initializing music system.");\r
+ InitMusicSystem();\r
+ LogDone();\r
+\r
+ InitVideo(vidxres, vidyres);\r
+}\r
+\r
+void LoadTransTable()\r
+{\r
+ FILE *fp=0;\r
+\r
+ if (translucency_table)\r
+ { free(translucency_table); translucency_table=0; }\r
+ translucency_table=(byte *)valloc(65536, "translucency_table", OID_MISC);\r
+\r
+ fp = fopen("trans.tbl", "rb");\r
+ if (!fp) err("Could not open trans.tbl.");\r
+\r
+ fread(translucency_table, 65536, 1, fp);\r
+\r
+ fclose(fp);\r
+}\r
+\r
+void vmain(int argc, char *argv[])\r
+{\r
+ char temp[256];\r
+\r
+ InitializeDefaults();\r
+ ParseStartupFiles();\r
+ InitSystems();\r
+ if (argc==2)\r
+ {\r
+ memcpy(startmap, argv[1], strlen(argv[1]));\r
+ }\r
+\r
+ InitConsole();\r
+ sprintf(temp,"VERGE System Version %s", VERSION);\r
+ Con_Printf(temp);\r
+ Con_Printf("Copyright (C)1998 vecna");\r
+\r
+ ParseAutoCFG();\r
+ LoadTransTable();\r
+ LoadSystemVC();\r
+ LoadMAP(startmap);\r
+\r
+ while (1)\r
+ {\r
+ while (timer_count!=0)\r
+ {\r
+ timer_count--;\r
+ GameTick();\r
+ }\r
+ Render();\r
+\r
+ ShowPage();\r
+ if (kill)\r
+ {\r
+ FreeVSP();\r
+ FreeMAP();\r
+ FreeCHRList();\r
+ vcsp=vcstack;\r
+ kill=0;\r
+ LoadMAP(startmap);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Wee. A generic #include. I feel so warm and fuzzy inside. :)\r
+\r
+#define VERSION "2.01b"\r
+\r
+#include <dos.h>\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#define byte unsigned char\r
+#define word unsigned short int\r
+#define quad unsigned int\r
+\r
+#define TRUE 1\r
+#define FALSE 0\r
+\r
+#include "inter.h"\r
+#include "a_memory.h"\r
+#include "vfile.h"\r
+#include "conlib.h"\r
+#include "console.h"\r
+#include "controls.h"\r
+#include "engine.h"\r
+#include "entity.h"\r
+#include "fli.h"\r
+#include "font.h"\r
+#include "image.h"\r
+#include "keyboard.h"\r
+#include "main.h"\r
+#include "message.h"\r
+#include "mikmod.h"\r
+#include "render.h"\r
+#include "sound.h"\r
+#include "timer.h"\r
+#include "vc.h"\r
+#include "vdriver.h"\r
+\r
+extern char *strbuf;
\ No newline at end of file
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <pc.h>\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+\r
+#include <dpmi.h>\r
+#include <sys\nearptr.h>\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+byte *vesascreen, *vesascreenx; // virscr | realscr\r
+\r
+// ================================= Code ====================================\r
+\r
+void VESASetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int VESAShutdown(void)\r
+{\r
+ VESASetMode(0x3);\r
+ free(vesascreen);\r
+ return 0;\r
+}\r
+\r
+void VESASetBank(int bank)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, 0x4f05);\r
+ SET_BX(r, 0);\r
+ SET_DX(r, bank);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int VESAShowPage(void)\r
+{ byte *s,*d;\r
+ int y,bytes,bank;\r
+ int span;\r
+\r
+ RenderGUI();\r
+ cpubyte=PFLIP;\r
+\r
+ s=vesascreen+(16*tsx)+16;\r
+ d=vesascreenx;\r
+\r
+ bank=0;\r
+ bytes=65536;\r
+ VESASetBank(bank++);\r
+\r
+ for (y=sy; y; y--)\r
+ {\r
+ if (bytes >= sx)\r
+ { memcpy(d,s,sx);\r
+ bytes-=sx;\r
+ s+=sx;\r
+ d+=sx;\r
+ }\r
+ else\r
+ { memcpy(d,s,bytes);\r
+ s+=bytes;\r
+ span=sx-bytes;\r
+\r
+ VESASetBank(bank++);\r
+ d=vesascreenx;\r
+ bytes=65536;\r
+\r
+ memcpy(d,s,span);\r
+ bytes-=span;\r
+ s+=span;\r
+ d+=span;\r
+ }\r
+ s+=32;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%edx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"csl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $672, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _vesascreen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%ecx \n\t"\r
+ "shrl $2, %%ecx \n\t"\r
+ "repz \n\t"\r
+ "movsl \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz csl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=vesascreen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATCCopySprite(int x,int y,int width,int height,byte *src)\r
+{\r
+ byte *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+ int cx1=0, cy1=0, cx2=tsx-1, cy2=tsy-1;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=vesascreen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACopyTile(int x, int y, byte *spr)\r
+{\r
+ int h;\r
+ byte *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ h=16;\r
+\r
+ d=vesascreen+(y*tsx)+x;\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d, spr, 16);\r
+ spr+=16;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATCopySprite(int x, int y, int width, int height, byte *src)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ asm("movl %3, %%ecx \n\t"\r
+ "movl %4, %%esi \n\t"\r
+"tcsl0: \n\t"\r
+ "movl %1, %%eax \n\t"\r
+ "imul $672, %%eax \n\t"\r
+ "addl %0, %%eax \n\t"\r
+ "addl _vesascreen, %%eax \n\t"\r
+ "movl %%eax, %%edi \n\t"\r
+ "movl %2, %%edx \n\t"\r
+"drawloop: \n\t"\r
+ "lodsb \n\t"\r
+ "orb %%al, %%al \n\t"\r
+ "jz nodraw \n\t"\r
+ "stosb \n\t"\r
+ "decl %%edx \n\t"\r
+ "jz endline \n\t"\r
+ "jmp drawloop \n\t"\r
+"nodraw: \n\t"\r
+ "incl %%edi \n\t"\r
+ "decl %%edx \n\t"\r
+ "jnz drawloop \n\t"\r
+"endline: \n\t"\r
+ "incl %1 \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tcsl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (width), "m" (height), "m" (src)\r
+ : "eax","edx","esi","edi","ecx","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATCopyTile(int x, int y, byte *spr, byte *matte)\r
+{\r
+ cpubyte=RENDER;\r
+ asm("movl $16, %%ecx \n\t"\r
+ "movl %2, %%esi \n\t"\r
+ "movl %1, %%edi \n\t"\r
+ "imul $672, %%edi \n\t"\r
+ "addl %0, %%edi \n\t"\r
+ "addl _vesascreen, %%edi \n\t"\r
+ "movl %3, %%edx \n\t"\r
+"tctl0: \n\t"\r
+ "movl (%%edi), %%eax \n\t"\r
+ "andl (%%edx), %%eax \n\t"\r
+ "orl (%%esi), %%eax \n\t"\r
+ "movl %%eax, (%%edi) \n\t"\r
+ "movl 4(%%edi), %%eax \n\t"\r
+ "andl 4(%%edx), %%eax \n\t"\r
+ "orl 4(%%esi), %%eax \n\t"\r
+ "movl %%eax, 4(%%edi) \n\t"\r
+ "movl 8(%%edi), %%eax \n\t"\r
+ "andl 8(%%edx), %%eax \n\t"\r
+ "orl 8(%%esi), %%eax \n\t"\r
+ "movl %%eax, 8(%%edi) \n\t"\r
+ "movl 12(%%edi), %%eax \n\t"\r
+ "andl 12(%%edx), %%eax \n\t"\r
+ "orl 12(%%esi), %%eax \n\t"\r
+ "movl %%eax, 12(%%edi) \n\t"\r
+ "addl $16, %%esi \n\t"\r
+ "addl $672, %%edi \n\t"\r
+ "addl $16, %%edx \n\t"\r
+ "decl %%ecx \n\t"\r
+ "jnz tctl0 \n\t"\r
+ :\r
+ : "m" (x), "m" (y), "m" (spr), "m" (matte)\r
+ : "eax","ecx","edx","esi","edi","cc" );\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAScaleSprite(int x, int y, int w, int h, int tw, int th, byte *s)\r
+{\r
+ int i,j,xm,ym,xd,yd,sx,sy=0,xs,ys,dys=0;\r
+ unsigned char *d;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ if (!tw || !th) return 0;\r
+ tw += sgn(tw); th += sgn(th);\r
+ xm = abs(tw); ym = abs(th);\r
+ xs = (w<<16)/xm; ys = (h<<16)/ym;\r
+ xd = sgn(tw); yd = sgn(th);\r
+\r
+ if (tw>0 && th>0) dys=tsx-xm;\r
+ else if (tw>0 && th<0) dys=(0-tsx)-xm;\r
+ else if (tw<0 && th>0) dys=tsx+xm;\r
+ else if (tw<0 && th<0) dys=(0-tsx)+xm;\r
+\r
+ d = vesascreen+(y*tsx)+x;\r
+ for (i=0;i<ym;++i) {\r
+ sx=0;\r
+ for (j=0;j<xm;++j) {\r
+ *d=s[(sx>>16)];\r
+ d+=xd;\r
+ sx+=xs;\r
+ }\r
+ d+=dys;\r
+ sy+=ys;\r
+ s+=(sy>>16)*w;\r
+ sy&=0xffff;\r
+ }\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESARenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ // ...\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESATRenderMAPLine(int x, int y, int yofs, word *map)\r
+{\r
+ cpubyte=RENDER;\r
+ // ...\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAColorField(int x, int y, byte c)\r
+{\r
+ cpubyte=RENDER;\r
+ // ...\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAClearScreen()\r
+{\r
+ cpubyte=RENDER;\r
+ memset(vesascreen+(672*16)+16,0,(672*480));\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAPutPixel(int x, int y, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ vesascreen[(y*tsx)+x]=color;\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAGetPixel(int x, int y)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (x<cx1 || y<cy1 || x>cx2 || y>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ x+=16;\r
+ y+=16;\r
+\r
+ cpubyte=ETC;\r
+ return vesascreen[(y*tsx)+x];\r
+ return 0;\r
+}\r
+\r
+int VESAHLine(int x, int y, int x2, int color)\r
+{\r
+ byte *d;\r
+ int width;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (x2<x) { int t=x2; x=x2; x2=t; }\r
+\r
+ width=x2-x+1;\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ x2+=16;\r
+\r
+ d=vesascreen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESAVLine(int x, int y, int y2, int color)\r
+{\r
+ byte *d;\r
+ int height;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // swap?\r
+ if (y2<y) { int t=y2; x=y2; y2=t; }\r
+\r
+ height=y2-y+1;\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+height<cy1)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (y+height > cy2) height=cy2-y+1;\r
+ if (y<cy1) { height-=(cy1-y); y=cy1; }\r
+\r
+ x+=16;\r
+ y+=16;\r
+ y2+=16;\r
+\r
+ d=vesascreen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESALine(int x1, int y1, int x2, int y2, int color)\r
+{\r
+ short i,xc,yc,er,n,m,xi,yi,xcxi,ycyi,xcyi;\r
+ unsigned dcy,dcx;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ // check to see if the line is completly clipped off\r
+ if ((x1<cx1 && x2<cx1) || (x1>cx2 && x2>cx2)\r
+ || (y1<cy1 && y2<cy1) || (y1>cy2 && y2>cy2))\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the left side\r
+ if (x1<cx1)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y1=myy*cx1/mxx+b;\r
+ x1=cx1;\r
+ }\r
+ else x1=cx1;\r
+ }\r
+\r
+ // clip the right side\r
+ if (x2>cx2)\r
+ { int myy=(y2-y1);\r
+ int mxx=(x2-x1),b;\r
+ if (!mxx)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (myy)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ y2=myy*cx2/mxx+b;\r
+ x2=cx2;\r
+ }\r
+ else x2=cx2;\r
+ }\r
+\r
+ if (y1>y2)\r
+ {\r
+ i=x1; x1=x2; x2=i;\r
+ i=y1; y1=y2; y2=i;\r
+ }\r
+\r
+ // clip the bottom\r
+ if (y2>cy2)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x2=(cy2-b)*mxx/myy;\r
+ y2=cy2;\r
+ }\r
+ else y2=cy2;\r
+ }\r
+\r
+ // clip the top\r
+ if (y1<cy1)\r
+ { int mxx=(x2-x1);\r
+ int myy=(y2-y1),b;\r
+ if (!myy)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+ if (mxx)\r
+ {\r
+ b=y1-(y2-y1)*x1/mxx;\r
+ x1=(cy1-b)*mxx/myy;\r
+ y1=cy1;\r
+ }\r
+ else y1=cy1;\r
+ }\r
+\r
+ // ???\r
+ // see if it got cliped into the box, out out\r
+ if (x1<cx1 || x2<cx1 || x1>cx2 || x2>cx2 || y1<cy1 || y2 <cy1 || y1>cy2 || y2>cy2)\r
+ {\r
+ cpubyte=ETC;\r
+ return 0;\r
+ }\r
+\r
+ if (x1>x2)\r
+ { xc=x2; xi=x1; }\r
+ else { xi=x2; xc=x1; }\r
+\r
+ x1+=16;y1+=16; // aen; adjust these here??\r
+ x2+=16;y2+=16;\r
+\r
+ // assume y1<=y2 from above swap operation\r
+ yi=y2; yc=y1;\r
+\r
+ dcx=x1; dcy=y1;\r
+ xc=(x2-x1); yc=(y2-y1);\r
+ if (xc<0) xi=-1; else xi=1;\r
+ if (yc<0) yi=-1; else yi=1;\r
+ n=abs(xc); m=abs(yc);\r
+ ycyi=abs(2*yc*xi);\r
+ er=0;\r
+\r
+ if (n>m)\r
+ {\r
+ xcxi=abs(2*xc*xi);\r
+ for (i=0;i<=n;i++)\r
+ {\r
+ vesascreen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcy+=yi;\r
+ er-=xcxi;\r
+ }\r
+ er+=ycyi;\r
+ dcx+=xi;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ xcyi=abs(2*xc*yi);\r
+ for (i=0;i<=m;i++)\r
+ {\r
+ vesascreen[(dcy*tsx)+dcx]=color;\r
+ if (er>0)\r
+ { dcx+=xi;\r
+ er-=ycyi;\r
+ }\r
+ er+=xcyi;\r
+ dcy+=yi;\r
+ }\r
+ }\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACircle(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ VESAPutPixel(x+cx,y+cy,color);\r
+ if (cx) VESAPutPixel(x-cx,y+cy,color);\r
+ if (cy) VESAPutPixel(x+cx,y-cy,color);\r
+ if ((cx) && (cy)) VESAPutPixel(x-cx,y-cy,color);\r
+\r
+ if (cx != cy)\r
+ {\r
+ VESAPutPixel(x+cy,y+cx,color);\r
+ if (cx) VESAPutPixel(x+cy,y-cx,color);\r
+ if (cy) VESAPutPixel(x-cy,y+cx,color);\r
+ if (cx && cy) VESAPutPixel(x-cy,y-cx,color);\r
+ }\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESACircleFill(int x, int y, int radius, int color)\r
+{\r
+ int cx=0;\r
+ int cy=radius;\r
+ int df=1-radius;\r
+ int d_e=3;\r
+ int d_se=-2*radius+5;\r
+\r
+ cpubyte=RENDER;\r
+\r
+ do {\r
+ VESAHLine(x-cy,y-cx,x+cy,color);\r
+ if (cx) VESAHLine(x-cy,y+cx,x+cy,color);\r
+\r
+ if (df<0)\r
+ {\r
+ df+=d_e;\r
+ d_e+=2;\r
+ d_se+=2;\r
+ }\r
+ else\r
+ {\r
+ if (cx != cy)\r
+ {\r
+ VESAHLine(x-cx,y-cy,x+cx,color);\r
+ if (cy) VESAHLine(x-cx,y+cy,x+cx,color);\r
+ }\r
+\r
+ df+=d_se;\r
+ d_e+=2;\r
+ d_se+=4;\r
+ cy--;\r
+ }\r
+\r
+ cx++;\r
+\r
+ } while (cx <= cy);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+int VESARect(int x, int y, int x2, int y2, int color)\r
+{\r
+ VESAHLine(x,y,x2,color);\r
+ VESAHLine(x,y2,x2,color);\r
+ VESAVLine(x,y+1,y2-1,color);\r
+ VESAVLine(x2,y+1,y2-1,color);\r
+ return 0;\r
+}\r
+\r
+int VESARectFill(int x, int y, int x2, int y2, int color)\r
+{\r
+ cpubyte=RENDER;\r
+\r
+ if (y2<y) { int t=y2; y=y2; y2=t; }\r
+\r
+ for (; y<=y2; y++)\r
+ VESAHLine(x,y,x2,color);\r
+\r
+ cpubyte=ETC;\r
+ return 0;\r
+}\r
+\r
+void InitVESA(void)\r
+{\r
+ REGISTERS r;\r
+\r
+ SET_BX(r, 0x0101);\r
+ SET_AX(r, 0x4f02);\r
+ INTERRUPT(0x10, r);\r
+\r
+ vesascreenx = (byte *) 0xA0000 + __djgpp_conventional_base;\r
+ vesascreen = (byte *) valloc(344064, "vesascreen", 0);\r
+ memset(vesascreen, 0, 344064);\r
+\r
+ sx=640; sy=480;\r
+ tsx=672; tsy=512;\r
+ tx=40; ty=30;\r
+ cx1=0; cy1=0;\r
+ cx2=sx-1;cy2=sy-1;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo = VESAShutdown;\r
+ ShowPage = VESAShowPage;\r
+ CopySprite = VESACopySprite;\r
+ TCopySprite = VESATCopySprite;\r
+ CCopySprite = VESACCopySprite;\r
+ TCCopySprite = VESATCCopySprite;\r
+ CopyTile = VESACopyTile;\r
+ TCopyTile = VESATCopyTile;\r
+ ScaleSprite = VESAScaleSprite;\r
+ RenderMAPLine = VESARenderMAPLine;\r
+ TRenderMAPLine = VESATRenderMAPLine;\r
+ ColorField = VESAColorField;\r
+ ClearScreen = VESAClearScreen;\r
+ PutPixel = VESAPutPixel;\r
+ GetPixel = VESAGetPixel;\r
+ HLine = VESAHLine;\r
+ VLine = VESAVLine;\r
+ Line = VESALine;\r
+ Circle = VESACircle;\r
+ CircleFill = VESACircleFill;\r
+ Rect = VESARect;\r
+ RectFill = VESARectFill;\r
+ DriverDesc = "640x480 (VESA, Banked)";\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define VFILE_H\r
+#define VC_H\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ FILE *fp; // real file pointer.\r
+ byte s; // 0=real file 1=vfile;\r
+ byte v; // if vfile, which vfile index\r
+ byte i; // which file index in vfile is it?\r
+ byte p; // data alignment pad. :)\r
+} VFILE;\r
+\r
+struct filestruct\r
+{\r
+ char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int curofs; // current file offset.\r
+ char extractable; // irrelevant to runtime, but...\r
+ char override; // should we override?\r
+};\r
+\r
+struct mountstruct\r
+{\r
+ char mountname[80]; // name of VRG packfile.\r
+ FILE *vhandle; // Real file-handle of packfile.\r
+ struct filestruct *files; // File record array.\r
+ int numfiles; // number of files in pack.\r
+ int curofs; // Current filepointer.\r
+};\r
+\r
+struct mountstruct pack[3]; // packfile structs\r
+byte filesmounted=0; // Number of VRG files to check.\r
+char headertag[]={ 'V','R','G','P','A','C','K',0 };\r
+\r
+// ================================= Code ====================================\r
+\r
+int Exist(char *fname)\r
+{ FILE *tempf;\r
+\r
+ tempf=fopen(fname,"rb");\r
+ if (tempf)\r
+ {\r
+ fclose(tempf);\r
+ return 1;\r
+ }\r
+ else return 0;\r
+}\r
+\r
+void DecryptHeader()\r
+{ byte lastvalue, precodebyte, *ptr;\r
+\r
+ ptr=(byte *) pack[filesmounted].files;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) pack[filesmounted].files + (int) pack[filesmounted].numfiles*100)\r
+ {\r
+ precodebyte=*ptr;\r
+ (*ptr)-=lastvalue;\r
+ lastvalue=precodebyte;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void MountVFile(char *fname)\r
+{ char buffer[10];\r
+\r
+ if (!(pack[filesmounted].vhandle = fopen(fname,"rb")))\r
+ {\r
+ printf("*error* Unable to mount %s; file not found. \n",fname);\r
+ exit(-1);\r
+ }\r
+\r
+ // Read pack header\r
+ memset(&buffer, 0, 10);\r
+ fread(&buffer, 1, 7, pack[filesmounted].vhandle);\r
+ if (strcmp(buffer,headertag))\r
+ {\r
+ printf("*error* %s is not a valid packfile. \n",fname);\r
+ exit(-1);\r
+ }\r
+\r
+ fread(&buffer, 1, 1, pack[filesmounted].vhandle);\r
+ if (buffer[0]!=1)\r
+ {\r
+ printf("*error* %s is an incompatible packfile version. (ver reported: %d) \n",fname,buffer[0]);\r
+ exit (-1);\r
+ }\r
+\r
+ fread(&pack[filesmounted].numfiles, 1, 4, pack[filesmounted].vhandle);\r
+ memcpy(pack[filesmounted].mountname,fname,strlen(fname)+1);\r
+\r
+ // Allocate memory for headers and read them in.\r
+\r
+ pack[filesmounted].files = (struct filestruct *) valloc(pack[filesmounted].numfiles*100, "pack[filesmounted].files", OID_VFILE);\r
+ fread(pack[filesmounted].files, pack[filesmounted].numfiles, 100, pack[filesmounted].vhandle);\r
+ DecryptHeader();\r
+ filesmounted++;\r
+}\r
+\r
+VFILE *vopen(char *fname)\r
+{ VFILE *tmp;\r
+ char rf=0,vf=0;\r
+ int i, j=0;\r
+\r
+ // All files using V* are read-only. To write a file, use regular i/o.\r
+ // First we'll see if a real file exists, then we'll check for one in VFiles,\r
+ // if we don't find one in VFile or it's overridable then a real file will\r
+ // be used. That's the general logic progression.\r
+\r
+ if (Exist(fname)) rf=1;\r
+\r
+ // Search the VFiles.\r
+ for (i=filesmounted-1; i>=0; i--)\r
+ {\r
+ for (j=0; j<pack[i].numfiles; j++)\r
+ if (!strcasecmp(fname,pack[i].files[j].fname)) { vf=1; break; }\r
+ if (vf) break;\r
+ }\r
+\r
+ if (!vf && !rf) return 0;\r
+\r
+ tmp=(VFILE *) valloc(sizeof(VFILE), "vopen:tmp", OID_VFILE);\r
+\r
+ if (vf && rf)\r
+ {\r
+ if (pack[i].files[j].override) vf=0;\r
+ else rf=0;\r
+ }\r
+\r
+ if (vf)\r
+ {\r
+ tmp->fp=pack[i].vhandle;\r
+ tmp->s=1;\r
+ tmp->v=i;\r
+ tmp->i=j;\r
+ pack[i].files[j].curofs=0;\r
+ fseek(tmp->fp, pack[i].files[j].packofs, 0);\r
+ pack[i].curofs=pack[i].files[j].packofs;\r
+ return tmp;\r
+ }\r
+\r
+ tmp->fp=fopen(fname,"rb");\r
+ tmp->s=0; tmp->v=0; tmp->i=0;\r
+ return tmp;\r
+}\r
+\r
+void vread(char *dest, int len, VFILE *f)\r
+{\r
+ // This is fairly simple.. Just make sure our filepointer is at the right\r
+ // place, then do a straight fread.\r
+\r
+ if (f->s)\r
+ {\r
+ if (pack[f->v].curofs != (pack[f->v].files[f->i].packofs + pack[f->v].files[f->i].curofs))\r
+ fseek(f->fp, pack[f->v].files[f->i].curofs+pack[f->v].files[f->i].packofs, 0);\r
+ pack[f->v].files[f->i].curofs+=len;\r
+ pack[f->v].curofs+=len;\r
+ }\r
+ fread(dest, 1, len, f->fp);\r
+}\r
+\r
+void vclose(VFILE *f)\r
+{\r
+ if (!f) return;\r
+ if (!f->s) fclose(f->fp);\r
+ f->fp=0;\r
+ vfree(f);\r
+}\r
+\r
+int filesize(VFILE *f)\r
+{\r
+ int oldpos, tmp;\r
+\r
+ // Filesize for Vfiles is real simple.\r
+ if (f->s) return pack[f->v].files[f->i].size;\r
+\r
+ // It's a bit more complex for external files.\r
+ oldpos=ftell(f->fp);\r
+ fseek(f->fp, 0, 2);\r
+ tmp=ftell(f->fp);\r
+ fseek(f->fp, oldpos, 0);\r
+ return tmp;\r
+}\r
+\r
+int vtell(VFILE *f)\r
+{\r
+ if (!f->s)\r
+ {\r
+ return ftell(f->fp);\r
+ }\r
+\r
+ return pack[f->v].files[f->i].curofs;\r
+}\r
+\r
+void vseek(VFILE *f, int offset, int origin)\r
+{\r
+ if (!f->s)\r
+ {\r
+ fseek(f->fp, offset, origin);\r
+ return;\r
+ }\r
+\r
+ switch(origin)\r
+ {\r
+ case 0: pack[f->v].files[f->i].curofs=offset;\r
+ fseek(f->fp, offset+pack[f->v].files[f->i].packofs, 0);\r
+ return;\r
+ case 1: pack[f->v].files[f->i].curofs+=offset;\r
+ fseek(f->fp, offset, 1);\r
+ return;\r
+ case 2: pack[f->v].files[f->i].curofs=pack[f->v].files[f->i].size-offset;\r
+ fseek(f->fp, pack[f->v].files[f->i].curofs+pack[f->v].files[f->i].packofs, 0);\r
+ return;\r
+ }\r
+}\r
+\r
+void _vscanf(VFILE *f, char *format, char *dest)\r
+{\r
+ fscanf(f->fp, format, dest);\r
+ if (f->s)\r
+ pack[f->v].files[f->i].curofs=ftell(f->fp)-pack[f->v].files[f->i].packofs;\r
+}\r
+\r
+char vgetc(VFILE *f)\r
+{ char c=0;\r
+\r
+ vread(&c, 1, f);\r
+ return c;\r
+}\r
+\r
+word vgetw(VFILE *f)\r
+{ word c=0;\r
+\r
+ vread((char *) &c, 2, f);\r
+ return c;\r
+}\r
+\r
+void vgets(char *str, int len, VFILE *f)\r
+{\r
+ if (f->s)\r
+ {\r
+ if (pack[f->v].curofs != (pack[f->v].files[f->i].packofs + pack[f->v].files[f->i].curofs))\r
+ fseek(f->fp, pack[f->v].files[f->i].curofs+pack[f->v].files[f->i].packofs, 0);\r
+ pack[f->v].files[f->i].curofs+=len;\r
+ pack[f->v].curofs+=len;\r
+ }\r
+ fgets(str, len, f->fp);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VFILE_H\r
+#define VFILE_H\r
+\r
+#define vscanf _vscanf\r
+\r
+typedef struct\r
+{\r
+ FILE *fp; // real file pointer.\r
+ byte s; // 0=real file 1=vfile;\r
+ byte v; // if vfile, which vfile index\r
+ byte i; // which file index in vfile is it?\r
+ byte p; // data alignment pad. :)\r
+} VFILE;\r
+\r
+struct filestruct\r
+{\r
+ unsigned char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int curofs; // current file offset.\r
+ char extractable; // irrelevant to runtime, but...\r
+ char override; // should we override?\r
+};\r
+\r
+struct mountstruct\r
+{\r
+ char mountname[80]; // name of VRG packfile.\r
+ FILE *vhandle; // Real file-handle of packfile.\r
+ struct filestruct *files; // File record array.\r
+ int numfiles; // number of files in pack.\r
+ int curofs; // Current filepointer.\r
+};\r
+\r
+extern struct mountstruct pack[3];\r
+extern char filesmounted;\r
+\r
+int Exist(char *fname);\r
+VFILE *vopen(char *fname);\r
+void MountVFile(char *fname);\r
+void vread(void *dest, int len, VFILE *f);\r
+void vclose(VFILE *f);\r
+int filesize(VFILE *f);\r
+int vtell(VFILE *f);\r
+void vseek(VFILE *f, int offset, int origin);\r
+void vscanf(VFILE *f, char *format, char *dest);\r
+char vgetc(VFILE *f);\r
+word vgetw(VFILE *f);\r
+void vgets(char *str, int len, VFILE *f);\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+void err(char *str, ...);\r
+void Log(char *str, ...);\r
+\r
+// *****\r
+// TODO: Move the chunk list from an array to a linked list?\r
+// Would eliminate hardcoded chunk limit, but would make\r
+// general operation slower. Probably not The Right Thing,\r
+// sides the chunk limit can be interesting sometimes. If\r
+// it becomes problematic, consider a Binary Tree.\r
+// *****\r
+\r
+// ***************************** Data *****************************\r
+\r
+#define MAXCHUNKS 200\r
+#define PARANOID 1\r
+#define PADFILLVALUE 254\r
+#define PADSIZE 256\r
+\r
+void MemReport(void);\r
+\r
+#define errm MemReport(), err\r
+\r
+typedef struct\r
+{\r
+ void *pointer;\r
+ int size;\r
+ int owner;\r
+ char desc[20];\r
+} memblockType;\r
+\r
+memblockType chunks[MAXCHUNKS+1];\r
+int numchunks=0;\r
+\r
+// ***************************** Code *****************************\r
+\r
+void *valloc(int amount, char *desc, int owner)\r
+{\r
+ if (numchunks == MAXCHUNKS)\r
+ err("Failed allocated %d bytes (%s), reason: Out of chunks.",\r
+ amount, desc);\r
+\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ chunks[numchunks].pointer = (void *) ((int) malloc(amount + (PADSIZE * 2)) + PADSIZE);\r
+ chunks[numchunks].size = amount;\r
+ memset((char *) chunks[numchunks].pointer - PADSIZE, PADFILLVALUE, PADSIZE);\r
+ memset((char *) chunks[numchunks].pointer +\r
+ chunks[numchunks].size, PADFILLVALUE, PADSIZE);\r
+#else\r
+ chunks[numchunks].pointer = malloc(amount);\r
+ chunks[numchunks].size = amount;\r
+#endif\r
+ chunks[numchunks].owner = owner;\r
+ strncpy(chunks[numchunks].desc, desc, 19);\r
+ memset(chunks[numchunks].pointer, 0, chunks[numchunks].size);\r
+ return chunks[numchunks++].pointer;\r
+}\r
+\r
+void *qvalloc(int amount)\r
+{\r
+ void *ptr;\r
+\r
+ // Quick and dirty memory allocation. Should be used ONLY\r
+ // for temporary blocks in speed-critical loops.\r
+\r
+ ptr = malloc(amount);\r
+ if (!ptr) errm("qvalloc: Failed allocating %d bytes.", amount);\r
+ return ptr;\r
+}\r
+\r
+void qvfree(void *ptr)\r
+{\r
+ free(ptr);\r
+}\r
+\r
+int TotalBytesAllocated(void)\r
+{\r
+ int i, tally=0;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ tally += chunks[i].size;\r
+\r
+ return tally;\r
+}\r
+\r
+int FindChunk(void *pointer)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].pointer == pointer) return i;\r
+ return -1;\r
+}\r
+\r
+void FreeChunk(int i)\r
+{\r
+#ifdef PARANOID\r
+ CheckCorruption();\r
+ free((void *) ((int) chunks[i].pointer - PADSIZE));\r
+#else\r
+ free(chunks[i].pointer);\r
+#endif\r
+ for (; i<numchunks; i++)\r
+ chunks[i]=chunks[i+1];\r
+ numchunks--;\r
+}\r
+\r
+int vfree(void *pointer)\r
+{\r
+ int i;\r
+\r
+ i=FindChunk(pointer);\r
+ if (i == -1)\r
+ {\r
+ Log("vfree: Attempted to free ptr %u that was not allocated. [dumping mem report]", pointer);\r
+ MemReport();\r
+ return -1;\r
+ }\r
+ FreeChunk(i);\r
+\r
+ return 0;\r
+}\r
+\r
+void FreeByOwner(int owner)\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ if (chunks[i].owner == owner)\r
+ FreeChunk(i--);\r
+}\r
+\r
+void MemReport(void)\r
+{\r
+ int i;\r
+\r
+ Log("");\r
+ Log("========================================");\r
+ Log("= Memory usage report for this session =");\r
+ Log("========================================");\r
+ Log("Chunks currently allocated: %d (MAXCHUNKS %d)", numchunks, MAXCHUNKS);\r
+ Log("%d total bytes allocated. ", TotalBytesAllocated());\r
+#ifdef PARANOID\r
+ Log("PARANOID is ON. (pad size: %d pad value: %d)", PADSIZE, PADFILLVALUE);\r
+#else\r
+ Log("PARANOID is OFF.");\r
+#endif\r
+ Log("");\r
+ Log("Per-chunk analysis: ");\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ Log("[%3d] Ptr at: %8u size: %8d owner: %3d desc: %s",\r
+ i, chunks[i].pointer, chunks[i].size, chunks[i].owner, chunks[i].desc);\r
+ }\r
+\r
+}\r
+\r
+#ifdef PARANOID\r
+int ChunkIntegrity(int i)\r
+{\r
+ char *tptr;\r
+\r
+ tptr=(char *) malloc(PADSIZE);\r
+ memset(tptr, PADFILLVALUE, PADSIZE);\r
+ if (memcmp((char *) chunks[i].pointer - PADSIZE, tptr, PADSIZE))\r
+ return -1; // Prefix corruption\r
+ if (memcmp((char *) chunks[i].pointer + chunks[i].size, tptr, PADSIZE))\r
+ return 1; // Suffix corruption\r
+ free(tptr);\r
+ return 0; // no corruption\r
+}\r
+\r
+void CheckCorruption(void)\r
+{\r
+ int i, j;\r
+\r
+ for (i=0; i<numchunks; i++)\r
+ {\r
+ j=ChunkIntegrity(i);\r
+ if (!j) continue;\r
+ if (j == -1) errm("Prefix corruption on chunk %d.", i);\r
+ if (j == 1) errm("Suffix corruption on chunk %d.", i);\r
+ }\r
+}\r
+#else\r
+void CheckCorruption(void)\r
+{\r
+ return;\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define BACKGROUND_LEN 64000\r
+\r
+ static unsigned char background_[]=\r
+ {\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,0x9a,0x9a,0x99,0x94,\r
+ 0x94,0x94,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9e,0x03,0x02,0x02,0x9e,\r
+ 0x94,0x94,0x94,0x97,0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,0x98,0x94,0x94,0x94,\r
+ 0x94,0x99,0x9f,0x9f,0x9a,0x99,0x97,0x94,0x97,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x99,0x98,0x99,0x9a,0x9b,0x9b,0x9a,0x98,0x94,0x94,\r
+ 0x94,0x98,0x99,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x98,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x98,0x98,0x98,0x97,0x98,0x98,0x9a,0x9b,0x9b,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x9c,\r
+ 0x9d,0x9c,0x99,0x87,0x97,0x87,0x87,0x87,0x87,0x99,0x9e,0x9d,0x99,\r
+ 0x87,0x97,0x99,0x99,0x98,0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x98,\r
+ 0x87,0x87,0x87,0x87,0x87,0x97,0x98,0x98,0x87,0x9c,0x03,0x9f,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9e,0x9c,0x9c,0x9c,0x9b,0x9a,\r
+ 0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x9d,0x9f,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9d,0x99,0x99,0x9a,0x9a,0x97,0x97,0x9a,0x98,0x97,\r
+ 0x94,0x94,0x97,0x9d,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9c,0x97,0x9e,0x94,0x99,\r
+ 0x9a,0x9a,0x98,0x9b,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9e,0x9c,0x9a,0x98,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x9a,0x9d,0x9f,0x9a,0x9a,0x99,0x94,0x94,0x94,0x97,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9d,0x03,0x02,0x02,0x9f,0x97,0x94,0x94,0x94,0x9a,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x03,0x9e,0x98,0x94,0x94,0x94,0x94,0x99,0x9f,0x9f,0x9a,\r
+ 0x99,0x97,0x94,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9a,0x99,\r
+ 0x99,0x9a,0x9b,0x9b,0x9a,0x98,0x94,0x94,0x97,0x99,0x9b,0x9c,0x9d,\r
+ 0x9d,0x9c,0x9c,0x9c,0x9b,0x9a,0x99,0x99,0x99,0x98,0x99,0x99,0x99,\r
+ 0x9a,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9b,0x9c,0x9d,0x9e,0x9c,0x9a,0x97,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x9a,0x9d,0x9d,0x9c,0x98,0x87,0x97,\r
+ 0x87,0x87,0x87,0x87,0x99,0x9f,0x9d,0x99,0x87,0x87,0x99,0x99,0x99,\r
+ 0x98,0x97,0x97,0x98,0x99,0x99,0x99,0x87,0x87,0x87,0x87,0x87,0x87,\r
+ 0x97,0x99,0x99,0x97,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x98,0x97,0x97,0x97,\r
+ 0x94,0x97,0x97,0x98,0x98,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x97,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9a,0x99,0x98,0x98,0x99,0x9c,\r
+ 0x9f,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9a,\r
+ 0x98,0x9a,0x9a,0x97,0x97,0x99,0x99,0x97,0x94,0x94,0x94,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x9c,0x98,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x99,0x99,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,0x9b,\r
+ 0x9b,0x99,0x94,0x94,0x94,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9f,\r
+ 0x02,0x02,0x02,0x9c,0x94,0x94,0x94,0x94,0x9c,0x9f,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x9f,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x98,0x9f,0x9f,0x9a,0x99,0x98,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9a,0x9a,0x9b,0x9c,0x9b,0x99,\r
+ 0x97,0x94,0x97,0x99,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,\r
+ 0x9e,0x9d,0x9a,0x98,0x97,0x94,0x94,0x97,0x97,0x98,0x98,0x99,0x9a,\r
+ 0x9b,0x9c,0x9d,0x9c,0x99,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x98,\r
+ 0x9f,0x9c,0x9b,0x87,0x87,0x97,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x97,0x87,0x87,0x87,0x87,0x87,0x87,0x98,0x99,0x9a,0x9a,0x98,0x9c,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9a,0x9a,0x9a,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,\r
+ 0x98,0x98,0x97,0x97,0x94,0x94,0x94,0x97,0x97,0x98,0x98,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x99,0x99,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9a,0x98,0x9a,0x9b,0x98,0x97,\r
+ 0x98,0x99,0x97,0x94,0x94,0x94,0x99,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9a,0x9a,\r
+ 0x9f,0x9a,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,0x98,0x98,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9a,0x9a,0x99,0x99,0x99,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,0x9c,0x9b,0x99,0x94,0x94,0x94,\r
+ 0x97,0x99,0x9a,0x9a,0x9a,0x99,0x9a,0x9d,0x9f,0x02,0x02,0x02,0x9d,\r
+ 0x97,0x94,0x94,0x94,0x97,0x9c,0x9f,0x03,0x02,0x01,0x01,0x01,0x01,\r
+ 0x01,0x02,0x03,0x9f,0x9e,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x9e,0x9f,0x9a,0x99,0x97,0x94,0x94,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x9a,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x98,0x9a,0x9c,0x9d,\r
+ 0x9d,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,0x9a,0x99,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9c,0x9c,0x9d,0x9d,0x9c,0x99,0x97,0x87,\r
+ 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x98,0x03,0x9c,0x9d,0x87,0x87,\r
+ 0x87,0x97,0x97,0x98,0x98,0x97,0x97,0x87,0x87,0x87,0x87,0x87,0x87,\r
+ 0x87,0x99,0x9b,0x9c,0x9b,0x9c,0x9d,0x9e,0x9f,0x03,0x03,0x9e,0x9c,\r
+ 0x99,0x99,0x99,0x9b,0x9e,0x9f,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x9a,\r
+ 0x99,0x97,0x97,0x98,0x97,0x97,0x97,0x98,0x99,0x99,0x99,0x99,0x97,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x99,0x99,0x9a,0x9b,0x9a,0x99,\r
+ 0x98,0x98,0x9a,0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x9f,0x9c,0x99,0x99,0x9b,0x99,0x97,0x94,0x9a,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x9a,0x99,0x9a,0x99,0x9e,0x97,0x99,0x9a,\r
+ 0x9a,0x98,0x9b,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x99,\r
+ 0x9d,0x9f,0x9d,0x9c,0x9a,0x94,0x94,0x94,0x97,0x99,0x9a,0x9a,0x99,\r
+ 0x99,0x99,0x99,0x9c,0x9f,0x03,0x02,0x02,0x9f,0x9b,0x97,0x94,0x94,\r
+ 0x94,0x94,0x97,0x9a,0x9b,0x9d,0x9e,0x9d,0x9d,0x9c,0x99,0x98,0x94,\r
+ 0x94,0x94,0x94,0x98,0x98,0x99,0x97,0x94,0x9a,0x9e,0x9a,0x98,0x97,\r
+ 0x94,0x94,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9c,\r
+ 0x9d,0x9c,0x9a,0x9b,0x9d,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9d,0x9d,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9b,0x9b,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x06,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x04,0x04,\r
+ 0x04,0x05,0x05,0x06,0x05,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x03,\r
+ 0x02,0x02,0xf7,0x02,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x9a,0x99,0x98,0x98,0x99,0x9c,0x9e,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x99,0x99,\r
+ 0x9a,0x9a,0x98,0x97,0x9a,0x98,0x98,0x98,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x94,0x94,0x94,\r
+ 0x98,0x99,0x9c,0x99,0x03,0x99,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9a,0x9a,0x9a,0x9a,\r
+ 0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9d,0x9e,0x9d,0x9c,0x9a,\r
+ 0x94,0x94,0x94,0x94,0x98,0x9a,0x9a,0x99,0x99,0x98,0x98,0x99,0x9a,\r
+ 0x9d,0x9f,0x03,0x02,0x02,0x03,0x9d,0x99,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x9b,0x9c,0x9c,\r
+ 0x9b,0x99,0x97,0x97,0x9e,0x9a,0x97,0x94,0x94,0x94,0x9f,0x97,0x97,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9b,0x9d,0x9d,0x9d,\r
+ 0x9b,0x9a,0x9a,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x04,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x05,0x05,0x04,0x04,\r
+ 0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0xf7,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x02,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x9a,0x9a,0x99,0x98,0x98,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9c,0x98,0x99,0x9b,0x99,0x97,0x94,\r
+ 0x9b,0x94,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x97,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x9a,0x94,0x94,0x97,0x9a,0x9a,0x9b,0x99,\r
+ 0x9e,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x99,0x98,0x98,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x98,0x9d,0x9e,0x9e,0x9b,0x9a,0x94,0x97,0x97,0x94,0x97,\r
+ 0x9a,0x9a,0x99,0x98,0x97,0x97,0x98,0x98,0x99,0x9a,0x9c,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x99,0x98,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x9a,0x98,0x94,0x9c,\r
+ 0x9a,0x97,0x94,0x94,0x98,0x02,0x9d,0x97,0x98,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x97,0x98,0x99,0x99,0x98,0x98,0x98,0x98,\r
+ 0x98,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x99,0x99,0x99,0x02,0x02,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x04,0x02,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x06,0x05,0x04,0x03,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x02,0x03,0x04,0x03,0x02,0x02,0x04,0x06,0x05,0x05,0x05,\r
+ 0x04,0x03,0x02,0xf7,0x02,0x03,0x03,0x03,0x03,0x9a,0x9a,0x9a,0x99,\r
+ 0x98,0x98,0x9b,0x9e,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9a,0x98,0x9a,0x9a,0x98,0x97,0x9a,0x9a,0x98,0x9b,0x97,\r
+ 0x98,0x94,0x94,0x94,0x97,0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x98,0x97,0x97,0x99,0x99,0x9c,0x9a,0x9f,0x9d,0x98,0x99,0x9b,\r
+ 0x99,0x99,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9e,0x9b,0x99,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9c,0x9e,\r
+ 0x9e,0x9b,0x9a,0x94,0x98,0x97,0x94,0x97,0x99,0x9b,0x99,0x98,0x97,\r
+ 0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x97,0x9a,0x9a,0x97,0x94,0x94,0x9b,\r
+ 0x03,0x03,0x94,0x9a,0x97,0x97,0x98,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x97,0x98,0x99,0x98,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9a,0x99,0x98,0x97,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x06,\r
+ 0x05,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x03,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,\r
+ 0x02,0x03,0x03,0x03,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x99,0x9c,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9d,0x99,0x99,\r
+ 0x9b,0x99,0x98,0x94,0x9d,0x98,0x9a,0x9b,0x98,0x98,0x97,0x94,0x94,\r
+ 0x99,0x94,0x94,0x97,0x97,0x98,0x97,0x97,0x94,0x98,0x97,0x97,0x98,\r
+ 0x9a,0x9a,0x9c,0x98,0x9f,0x98,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,\r
+ 0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x9b,0x9d,0x9e,0x9a,0x99,0x97,0x99,\r
+ 0x97,0x94,0x97,0x99,0x9b,0x9a,0x98,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x99,0x9a,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,0x9e,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x99,\r
+ 0x99,0x97,0x97,0x9a,0x97,0x94,0x94,0x9b,0x03,0x02,0x94,0x9a,0x99,\r
+ 0x97,0x97,0x98,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x98,0x99,0x9a,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9a,0x98,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,\r
+ 0x05,0x05,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,\r
+ 0x04,0x05,0x04,0x02,0xf7,0xf7,0x02,0x06,0x05,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x05,\r
+ 0x06,0x06,0x06,0x06,0x07,0x06,0x05,0x02,0xf7,0x02,0x03,0x03,0x9b,\r
+ 0x9a,0x9a,0x9a,0x99,0x98,0x98,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9b,0x98,0x9a,0x9b,0x99,0x98,0x97,\r
+ 0x9e,0x97,0x9a,0x99,0x9a,0x98,0x97,0x97,0x98,0x97,0x97,0x99,0x9a,\r
+ 0x9a,0x9a,0x99,0x98,0x94,0x98,0x98,0x98,0x99,0x9a,0x9a,0x9b,0x99,\r
+ 0x9f,0x94,0x98,0x99,0x9a,0x99,0x9a,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x9a,0x9d,0x9e,0x9a,0x99,0x97,0x98,0x97,0x97,0x94,0x97,0x9a,\r
+ 0x9a,0x99,0x97,0x99,0x99,0x99,0x99,0x98,0x97,0x97,0x97,0x97,0x98,\r
+ 0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x94,0x9a,0x98,\r
+ 0x94,0x94,0x97,0x9c,0x9f,0x94,0x9a,0x99,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x98,0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9a,0x9c,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x05,0x05,0x05,0x04,0x03,0x03,0x04,0x04,0x05,0x05,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x06,0x06,0x04,0x02,\r
+ 0xf7,0xf7,0x06,0x04,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x02,0x03,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,\r
+ 0x98,0x98,0x9a,0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9a,0x99,0x9a,0x9a,0x98,0x97,0x9b,0x9f,0x98,0x9c,0x9a,\r
+ 0x9b,0x99,0x99,0x99,0x98,0x97,0x9a,0x9b,0x9c,0x9c,0x9b,0x9a,0x99,\r
+ 0x97,0x98,0x99,0x98,0x99,0x9a,0x9b,0x9b,0x9c,0x9e,0x97,0x98,0x9a,\r
+ 0x9a,0x98,0x9b,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9c,0x9d,0x9c,\r
+ 0x98,0x97,0x97,0x98,0x97,0x94,0x97,0x99,0x9b,0x99,0x98,0x99,0x9b,\r
+ 0x9d,0x9e,0x9e,0x9d,0x9a,0x99,0x98,0x97,0x97,0x97,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9b,0x9a,0x98,0x97,0x94,0x99,0x98,0x94,0x94,0x94,0x94,0x97,\r
+ 0x94,0x99,0x99,0x97,0x94,0x97,0x97,0x97,0x98,0x9a,0x9a,0x99,0x94,\r
+ 0x94,0x99,0x9a,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9a,0x9a,0x99,0x97,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0xf7,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,\r
+ 0xf7,0x02,0x04,0x06,0x07,0x06,0x05,0x03,0xf7,0xf7,0x05,0x04,0x02,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x05,0x05,0x06,0x05,0x05,0x04,0x03,0x04,0x05,0x07,0x07,0x05,0x03,\r
+ 0xf7,0x02,0x9b,0x9c,0x9b,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9d,0x99,0x99,\r
+ 0x9b,0x9a,0x98,0x97,0x9e,0x9f,0x9a,0x9d,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x97,0x98,0x9b,0x9d,0x9d,0x9d,0x9c,0x9b,0x98,0x97,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9c,0x9a,0x9f,0x9c,0x97,0x98,0x9b,0x9a,0x99,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,\r
+ 0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x9a,0x9b,0x9e,0x98,0x98,0x97,0x99,0x97,\r
+ 0x97,0x94,0x97,0x9b,0x9a,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9e,0x9c,0x9a,0x99,0x98,0x98,0x97,0x98,0x98,0x98,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9b,0x99,0x97,\r
+ 0x97,0x97,0x99,0x94,0x94,0x94,0x94,0x97,0x97,0x9a,0x99,0x97,0x94,\r
+ 0x94,0x97,0x97,0x98,0x9a,0x9a,0x99,0x94,0x97,0x9d,0x03,0x01,0xf7,\r
+ 0xf7,0x01,0x02,0x02,0x9f,0x9d,0x9a,0x97,0x94,0x94,0x94,0x94,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x9a,0x9d,0x9f,\r
+ 0x9f,0x9b,0x97,0x94,0x02,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x05,\r
+ 0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x06,\r
+ 0x06,0x05,0x04,0x04,0x06,0x06,0x04,0x02,0xf7,0xf7,0x02,0x05,0x06,\r
+ 0x06,0x06,0x04,0xf7,0xf7,0x04,0x05,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x02,\r
+ 0x02,0x02,0x03,0x03,0x05,0x06,0x07,0x05,0x03,0xf7,0x98,0x9b,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9b,0x98,0x99,0x9b,0x99,0x99,0x94,\r
+ 0x9f,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9a,0x97,0x99,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x99,0x98,0x99,0x9a,0x9a,0x9c,0x99,\r
+ 0x9f,0x9a,0x97,0x98,0x9b,0x9a,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9a,0x9d,0x99,0x97,0x97,0x99,0x97,0x97,0x94,0x97,0x99,0x9b,\r
+ 0x99,0x99,0x9a,0x9e,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9d,0x9c,0x9b,0x9a,0x99,0x99,0x99,0x98,0x98,0x98,0x98,0x98,0x98,\r
+ 0x98,0x98,0x98,0x99,0x9a,0x9b,0x9b,0x98,0x97,0x94,0x98,0x94,0x94,\r
+ 0x97,0x99,0x9b,0x9d,0x9c,0x99,0x97,0x94,0x94,0x94,0x97,0x98,0x99,\r
+ 0x9a,0x99,0x97,0x94,0x94,0x97,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x03,\r
+ 0x9f,0x9e,0x9c,0x99,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9b,0x03,0xf7,0x02,0x9e,0x98,0x94,0x97,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x06,0x06,0x04,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x06,0x05,0xf7,0xf7,0xf7,0x03,0x05,0x06,0x06,0x04,0x02,0xf7,\r
+ 0x02,0x06,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x05,0x04,0x04,0x03,0x02,0xf7,0x02,0x02,0x02,0x03,0x04,\r
+ 0x05,0x07,0x07,0x06,0x02,0x94,0x98,0x9b,0x9c,0x9c,0x9b,0x9a,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9a,0x98,0x9a,0x9b,0x99,0x98,0x97,0x9f,0x9a,0x9c,0x9d,\r
+ 0x9c,0x9c,0x9c,0x9d,0x99,0x97,0x9a,0x9c,0x9d,0x9d,0x9c,0x9c,0x9a,\r
+ 0x97,0x97,0x99,0x98,0x98,0x9b,0x9a,0x9c,0x97,0x9e,0x98,0x97,0x98,\r
+ 0x9b,0x99,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,0x02,0x03,0x03,0x03,\r
+ 0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x99,0x9b,0x9d,0x97,\r
+ 0x97,0x99,0x99,0x97,0x97,0x94,0x97,0x9a,0x9a,0x99,0x99,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9e,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x99,0x99,0x99,\r
+ 0x9a,0x9b,0x99,0x97,0x94,0x98,0x97,0x97,0x99,0x9a,0x9c,0x9e,0x9d,\r
+ 0x99,0x97,0x94,0x94,0x94,0x97,0x98,0x99,0x9b,0x9c,0x9d,0x9c,0x9a,\r
+ 0x9a,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9a,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9a,0x9d,0x9b,\r
+ 0x9a,0x99,0x97,0x94,0x94,0x97,0x98,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,\r
+ 0x05,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x05,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x04,0x03,0xf7,0xf7,0x06,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x06,\r
+ 0x9a,0x94,0x97,0x9b,0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x99,\r
+ 0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x99,0x99,\r
+ 0x9a,0x9a,0x99,0x98,0x9a,0x03,0x9a,0x9d,0x9d,0x9b,0x9c,0x9d,0x9d,\r
+ 0x98,0x97,0x9a,0x9c,0x9d,0x9d,0x9d,0x9b,0x99,0x97,0x98,0x98,0x98,\r
+ 0x98,0x9a,0x99,0x9b,0x97,0x9e,0x97,0x97,0x99,0x9b,0x99,0x99,0x9e,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,\r
+ 0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x9d,0x98,0x97,0x98,0x99,0x98,0x97,\r
+ 0x94,0x94,0x97,0x9b,0x9a,0x99,0x9a,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9e,0x9e,0x9d,0x9a,0x99,0x99,0x9b,0x9a,0x97,0x94,\r
+ 0x97,0x97,0x98,0x9a,0x9a,0x9b,0x9d,0x9c,0x99,0x97,0x94,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9a,0x9d,0x9e,0x9f,0x9e,0x9d,0x9c,0x9c,0x9a,0x9a,\r
+ 0x99,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x99,\r
+ 0x9a,0x9b,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x04,0x02,0xf7,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x04,0xf7,0xf7,0x03,0x04,0x05,\r
+ 0x05,0x03,0xf7,0xf7,0x05,0x03,0xf7,0x02,0x03,0x04,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x07,0x03,0x9b,0x94,0x97,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9a,0x9a,0x99,0x98,0x98,0x99,0x9c,0x9f,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x99,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x9d,0x03,0x9a,0x9d,0x9d,0x9b,0x9d,0x9d,0x9d,0x97,0x98,0x9a,0x9c,\r
+ 0x9d,0x9d,0x9c,0x9b,0x98,0x97,0x98,0x98,0x97,0x98,0x9a,0x99,0x9a,\r
+ 0x94,0x9d,0x97,0x97,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9a,0x9d,0x97,0x98,0x99,0x99,0x97,0x97,0x94,0x94,0x98,0x9c,\r
+ 0x9a,0x99,0x9a,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9d,0x9a,0x99,0x9a,0x9c,0x98,0x94,0x94,0x97,0x98,0x9a,0x9a,\r
+ 0x9a,0x9c,0x9b,0x98,0x97,0x94,0x94,0x94,0x94,0x97,0x98,0x9a,0x9c,\r
+ 0x9e,0x9f,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x99,0x98,\r
+ 0x97,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9b,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x05,0x06,0x05,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x05,0x06,0x06,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x06,0x04,0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x02,0x02,\r
+ 0xf7,0x02,0x06,0x02,0xf7,0x02,0x04,0x04,0x04,0x04,0x02,0xf7,0x03,\r
+ 0x05,0xf7,0x02,0x03,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x06,0x04,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x06,0x07,\r
+ 0x07,0x07,0x07,0xf7,0x02,0x9c,0x94,0x97,0x9a,0x9c,0x9c,0x9c,0x9a,\r
+ 0x9a,0x99,0x98,0x97,0x99,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9b,0x98,0x99,0x9b,0x9a,0x99,0x97,0x9e,0x9f,0x9b,0x9d,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9c,0x97,0x98,0x9b,0x9d,0x9d,0x9d,0x9c,0x9a,\r
+ 0x98,0x97,0x98,0x97,0x97,0x98,0x99,0x9a,0x9a,0x97,0x9d,0x94,0x97,\r
+ 0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x9c,0x99,0x98,\r
+ 0x98,0x99,0x99,0x97,0x98,0x94,0x97,0x99,0x9c,0x99,0x99,0x9c,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9c,0x99,0x99,\r
+ 0x9b,0x99,0x94,0x94,0x97,0x99,0x99,0x99,0x9a,0x9b,0x9c,0x98,0x97,\r
+ 0x94,0x94,0x94,0x94,0x97,0x98,0x9a,0x9c,0x9e,0x9f,0x9e,0x9d,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x97,0x97,0x97,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,\r
+ 0x98,0x99,0x99,0x99,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x05,0x06,0x06,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x05,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x03,0xf7,0xf7,0x02,0x02,\r
+ 0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x02,0x02,0xf7,0x04,0x05,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x04,0x03,0xf7,0xf7,0x06,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x04,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,\r
+ 0x02,0x9d,0x97,0x94,0x9a,0x9d,0x9c,0x9c,0x9a,0x9a,0x99,0x99,0x97,\r
+ 0x99,0x9c,0x9e,0x9f,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9a,0x98,\r
+ 0x99,0x9b,0x99,0x99,0x94,0x9f,0x9f,0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9c,0x9a,0x97,0x97,0x98,0x97,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x97,0x9d,0x94,0x97,0x9a,0x9a,0x99,0x9b,\r
+ 0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x9d,0x98,0x98,0x99,0x99,0x99,0x97,\r
+ 0x97,0x94,0x97,0x9a,0x9b,0x99,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9e,0x9a,0x99,0x9a,0x9a,0x94,0x94,0x97,\r
+ 0x97,0x99,0x9a,0x9a,0x9c,0x9d,0x99,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9a,0x9c,0x9d,0x9d,0x9c,0x9a,0x99,0x99,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0xf7,0x02,0x03,0x04,0x05,0x05,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x06,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x04,0x06,0x03,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x02,0x02,0x02,0x03,0x06,0xf7,0xf7,0x02,0x04,0x04,0x04,\r
+ 0x03,0xf7,0xf7,0x05,0x03,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x02,0xf7,0xf7,0x02,0x02,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x01,0x9f,0x97,0x94,\r
+ 0x99,0x9d,0x9d,0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x99,0x98,0x9a,0x9b,0x99,0x99,\r
+ 0x97,0x9f,0x9d,0x9d,0x9d,0x9c,0x9c,0x9d,0x9d,0x9a,0x97,0x9a,0x9c,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9a,0x97,0x97,0x97,0x97,0x97,0x98,0x98,0x9a,\r
+ 0x9a,0x97,0x9c,0x97,0x97,0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x9a,0x9c,0x98,0x98,0x99,0x99,0x97,0x97,0x94,0x94,0x97,0x9b,\r
+ 0x9a,0x99,0x99,0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9b,0x99,0x9a,0x9b,0x97,0x94,0x98,0x97,0x99,0x9a,0x9b,0x9d,\r
+ 0x9e,0x9a,0x97,0x94,0x94,0x94,0x94,0x97,0x98,0x9a,0x9a,0x99,0x94,\r
+ 0x94,0x94,0x97,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9b,0x9d,\r
+ 0x9e,0x9d,0x9f,0x9f,0x03,0x02,0x02,0x01,0x07,0x07,0x07,0x06,0x05,\r
+ 0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x04,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x06,0x02,0xf7,0x02,0x04,0x05,0x05,0x04,0x02,0xf7,0x02,0x04,\r
+ 0xf7,0xf7,0x03,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x06,0x03,0xf7,0xf7,0x02,0x02,0x04,0x06,0x07,0x07,0x07,\r
+ 0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x99,0x94,0x99,0x9d,0x9d,0x9c,\r
+ 0x9b,0x9a,0x9a,0x99,0x98,0x98,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9c,0x99,0x99,0x9a,0x9a,0x99,0x99,0x99,0x9f,0x9c,0x9d,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9d,0x99,0x97,0x9a,0x9c,0x9d,0x9d,0x9c,0x9b,\r
+ 0x99,0x97,0x98,0x97,0x97,0x97,0x99,0x98,0x9b,0x9a,0x99,0x9c,0x97,\r
+ 0x98,0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9a,0x9a,0x98,\r
+ 0x99,0x99,0x99,0x97,0x98,0x94,0x97,0x99,0x9c,0x9a,0x98,0x9a,0x9e,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9b,0x98,0x9a,0x9b,\r
+ 0x97,0x94,0x99,0x97,0x94,0x97,0x98,0x9a,0x9b,0x9a,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x98,0x99,0x9a,0x97,0x94,0x9c,0x03,0xf7,0xf7,0xf7,\r
+ 0x02,0x03,0x9f,0x9e,0x9c,0x9b,0x99,0x98,0x97,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x9c,0x9f,0x03,\r
+ 0x9f,0x9f,0x9c,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,\r
+ 0x05,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x06,0x05,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x06,0x03,0xf7,0x02,\r
+ 0x04,0x04,0x05,0x04,0x03,0xf7,0xf7,0x05,0xf7,0xf7,0x03,0x05,0x05,\r
+ 0x05,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x9a,0x94,0x97,0x9c,0x9d,0x9d,0x9b,0x9a,0x9a,0x99,\r
+ 0x98,0x98,0x9a,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9a,0x98,\r
+ 0x99,0x9a,0x9a,0x99,0x98,0x9c,0x03,0x9b,0x9d,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9d,0x98,0x98,0x9b,0x9d,0x9d,0x9d,0x9c,0x9a,0x99,0x94,0x99,0x97,\r
+ 0x94,0x97,0x99,0x98,0x9c,0x99,0x9a,0x9b,0x97,0x98,0x9b,0x9a,0x99,\r
+ 0x9e,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x99,0x9c,0x99,0x99,0x99,0x99,0x99,0x97,\r
+ 0x97,0x94,0x97,0x9a,0x9a,0x99,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9a,0x98,0x9a,0x9b,0x98,0x97,0x99,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x9a,0x98,0x94,0x94,0x97,0x97,0x97,0x98,0x99,\r
+ 0x9a,0x97,0x94,0x9a,0x9d,0x9c,0x9b,0x9a,0x9a,0x99,0x99,0x97,0x98,\r
+ 0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,\r
+ 0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x06,0x04,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0x03,0x06,0x02,0xf7,0x02,0x03,0x05,0x05,0x05,0x04,\r
+ 0x02,0xf7,0x04,0x03,0xf7,0x02,0x04,0x05,0x05,0x05,0x04,0x04,0x04,\r
+ 0x04,0x03,0x03,0x03,0x03,0x02,0x05,0x05,0x02,0xf7,0xf7,0x02,0x04,\r
+ 0x06,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,\r
+ 0x94,0x97,0x9c,0x9d,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x99,0x9c,\r
+ 0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9d,0x99,0x98,0x99,0x9b,0x9a,0x99,\r
+ 0x97,0x9e,0x03,0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x97,0x98,0x9b,\r
+ 0x9d,0x9d,0x9d,0x9c,0x9a,0x98,0x94,0x99,0x94,0x94,0x97,0x99,0x98,\r
+ 0x9c,0x98,0x9d,0x9a,0x97,0x98,0x9b,0x99,0x99,0x9e,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x99,0x9c,0x98,0x99,0x99,0x99,0x97,0x98,0x94,0x97,0x99,0x9b,\r
+ 0x9a,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9c,0x99,\r
+ 0x98,0x9a,0x9a,0x99,0x97,0x9b,0x97,0x97,0x94,0x9e,0x02,0x99,0x9a,\r
+ 0x98,0x97,0x97,0x97,0x94,0x97,0x97,0x99,0x99,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x94,0x97,0x97,0x97,0x02,0x03,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x07,0x07,0x06,\r
+ 0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x06,0x06,0x03,0x03,0x03,0x04,0x04,0x04,0x03,\r
+ 0x03,0x02,0x03,0x03,0x04,0x04,0x04,0x03,0x03,0x02,0x03,0x05,0x06,\r
+ 0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x05,0x03,0xf7,0xf7,0x05,0xf7,\r
+ 0xf7,0x04,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x03,0x03,0x03,\r
+ 0x02,0x03,0x06,0x03,0xf7,0xf7,0x02,0x03,0x06,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x97,0x9c,0x9d,\r
+ 0x9d,0x9c,0x9a,0x9a,0x99,0x98,0x97,0x98,0x9b,0x9d,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9e,0x9c,0x99,0x98,0x9a,0x9b,0x99,0x99,0x97,0x9f,0x9f,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9b,\r
+ 0x9a,0x97,0x94,0x99,0x94,0x94,0x97,0x9a,0x99,0x9c,0x97,0x9e,0x98,\r
+ 0x97,0x98,0x9b,0x99,0x99,0x9e,0x03,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x98,0x9c,0x99,0x99,\r
+ 0x99,0x99,0x98,0x97,0x94,0x94,0x97,0x9a,0x9a,0x99,0x98,0x9a,0x9b,\r
+ 0x9d,0x9e,0x9d,0x9e,0x9d,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x99,0x9a,0x9a,0x99,0x97,\r
+ 0x9e,0x97,0x99,0x94,0x94,0x9f,0x9c,0x99,0x99,0x97,0x97,0x99,0x99,\r
+ 0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x9d,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x06,\r
+ 0x04,0x04,0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x04,0x03,0x03,0x04,0x06,0x06,0x03,0xf7,0xf7,0x03,0x04,0x06,\r
+ 0x06,0x06,0x06,0x04,0xf7,0xf7,0x04,0x02,0xf7,0x02,0x05,0x05,0x05,\r
+ 0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x04,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9d,0x94,0x94,0x9c,0x9d,0x9d,0x9c,0x9a,0x9a,\r
+ 0x99,0x98,0x97,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x9e,0x9d,0x9a,0x98,\r
+ 0x99,0x9a,0x9a,0x99,0x99,0x97,0x9f,0x9e,0x9d,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9b,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x94,0x99,\r
+ 0x94,0x97,0x97,0x9a,0x99,0x9b,0x97,0x9e,0x97,0x97,0x99,0x9b,0x99,\r
+ 0x99,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x9c,0x99,0x99,0x99,0x99,0x97,0x97,\r
+ 0x94,0x97,0x9a,0x9b,0x99,0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9a,0x9a,\r
+ 0x99,0x98,0x98,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x9a,0x9b,0x9a,0x94,0x9f,0x9c,0x9b,0x98,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x9a,0x99,0x98,0x99,0x9a,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x07,\r
+ 0x06,0x06,0x06,0x05,0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0x02,0x03,0x05,0x05,0x04,0x04,0x04,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x04,0x04,0x05,0x06,\r
+ 0x05,0x03,0xf7,0xf7,0x02,0x04,0x05,0x06,0x07,0x07,0x06,0x05,0x03,\r
+ 0xf7,0x02,0x04,0xf7,0xf7,0x04,0x05,0x05,0x05,0x04,0x03,0x03,0x04,\r
+ 0x04,0x03,0x03,0x03,0x02,0x02,0x06,0x04,0xf7,0xf7,0x02,0x04,0x06,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x9e,0x94,0x94,0x9b,0x9d,0x9d,0x9c,0x9b,0x9a,0x99,0x99,0x98,0x98,\r
+ 0x99,0x9b,0x9d,0x9e,0x9e,0x9e,0x9c,0x99,0x98,0x99,0x9a,0x9a,0x99,\r
+ 0x99,0x99,0x9f,0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9a,0x97,0x9a,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9a,0x99,0x97,0x94,0x99,0x97,0x97,0x97,0x9a,\r
+ 0x99,0x9a,0x97,0x9e,0x97,0x97,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,\r
+ 0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9c,0x99,0x99,0x16,0x99,0x97,0x98,0x94,0x97,0x99,0x9b,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x99,0x98,0x98,0x97,0x97,0x97,0x98,0x98,0x98,\r
+ 0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9c,\r
+ 0x9d,0x9b,0x97,0x02,0x9f,0x9d,0x9c,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9a,0x9a,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x03,0x03,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x05,\r
+ 0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0x04,\r
+ 0x05,0x06,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,0x05,0xf7,0xf7,\r
+ 0x03,0x05,0x05,0x05,0x05,0x03,0x02,0x03,0x04,0x04,0x03,0x03,0x03,\r
+ 0x02,0x03,0x06,0x02,0xf7,0xf7,0x02,0x05,0x07,0x07,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9e,0x94,0x94,0x9a,\r
+ 0x9d,0x9d,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x99,0x9b,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9a,0x99,0x98,0x99,0x9b,0x9a,0x99,0x98,0x9b,0x9f,0x9c,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x99,0x97,0x9a,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9a,0x9a,0x97,0x97,0x99,0x97,0x97,0x98,0x9a,0x9a,0x9a,0x97,0x9d,\r
+ 0x94,0x98,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9c,0x99,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9b,0x99,0x99,0x12,\r
+ 0x99,0x97,0x97,0x94,0x97,0x99,0x9b,0x9a,0x99,0x98,0x98,0x98,0x97,\r
+ 0x97,0x97,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x15,0x9b,0x9e,0x9e,0x9e,0x97,0x9f,0x9e,0x9f,\r
+ 0x9f,0x9d,0x9c,0x9a,0x97,0x99,0x94,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x9a,0x9c,0x9d,0x9c,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x04,0x05,0x06,0x06,0x04,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x05,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x03,0xf7,0x02,0x03,0xf7,0xf7,0x05,0x05,0x05,0x05,\r
+ 0x03,0x02,0xf7,0x02,0x04,0x04,0x03,0x03,0x03,0x02,0x05,0x05,0xf7,\r
+ 0xf7,0xf7,0x03,0x06,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x97,0x94,0x99,0x9d,0x9d,0x9d,0x9c,\r
+ 0x9a,0x9a,0x99,0x98,0x97,0x98,0x9a,0x9c,0x9c,0x9d,0x9b,0x99,0x98,\r
+ 0x98,0x9a,0x9b,0x9a,0x99,0x97,0x9e,0x9f,0x9c,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9d,0x98,0x97,0x9a,0x9c,0x9d,0x9c,0x9c,0x9a,0x9a,0x97,0x97,\r
+ 0x98,0x97,0x97,0x98,0x99,0x9a,0x9a,0x97,0x9d,0x94,0x97,0x9a,0x9b,\r
+ 0x99,0x9a,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9f,0x9e,0x9c,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9a,0x9a,0x99,0x5c,0x16,0x98,0x97,0x94,0x94,\r
+ 0x98,0x9b,0x9a,0x99,0x98,0x98,0x97,0x97,0x98,0x98,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x0f,0x5a,\r
+ 0x9f,0x9f,0x9f,0x9a,0x94,0x01,0x9e,0x98,0x98,0x9f,0x9d,0x9d,0x9d,\r
+ 0x97,0x97,0x97,0x94,0x97,0x99,0x9c,0x9d,0x9c,0x9c,0x9d,0x9d,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x05,\r
+ 0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x06,0x07,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x05,0xf7,0xf7,0xf7,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,\r
+ 0xf7,0x05,0xf7,0xf7,0x03,0x05,0x05,0x05,0x04,0x02,0xf7,0xf7,0x03,\r
+ 0x04,0x03,0x03,0x03,0x03,0x03,0x06,0x02,0xf7,0xf7,0x02,0x05,0x07,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x98,0x94,0x98,0x9d,0x9e,0x9d,0x9c,0x9a,0x9a,0x99,0x98,\r
+ 0x97,0x98,0x99,0x9b,0x9b,0x9b,0x9a,0x99,0x98,0x99,0x9a,0x9a,0x99,\r
+ 0x99,0x94,0x9f,0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x97,0x98,\r
+ 0x9b,0x9d,0x9d,0x9d,0x9c,0x9b,0x9a,0x97,0x97,0x98,0x97,0x97,0x99,\r
+ 0x99,0x9a,0x9a,0x98,0x9d,0x94,0x97,0x9a,0x9a,0x99,0x9b,0x9f,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9c,\r
+ 0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x99,\r
+ 0x9b,0x16,0x5c,0x13,0x98,0x97,0x94,0x94,0x97,0x9a,0x9a,0x99,0x98,\r
+ 0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9c,0x9d,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x08,0x1a,0x58,0x03,0x0c,0x13,0x0e,0x15,\r
+ 0x19,0x11,0x19,0x97,0x98,0x9f,0x9b,0x9a,0x99,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9c,0x13,0x13,0x13,0x13,0x13,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x06,0x04,0x03,0x02,0x03,0x04,0x04,0x04,0xf7,0xf7,\r
+ 0x03,0x04,0x04,0x05,0x05,0xf7,0x02,0x03,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0x02,0x03,0xf7,0x02,\r
+ 0x05,0x05,0x05,0x04,0x02,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x03,0x03,\r
+ 0x03,0x04,0x05,0xf7,0xf7,0x02,0x03,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x94,\r
+ 0x97,0x9c,0x9e,0x9d,0x9c,0x9a,0x9a,0x99,0x98,0x97,0x98,0x99,0x9a,\r
+ 0x9a,0x9a,0x99,0x98,0x98,0x99,0x9a,0x9a,0x99,0x99,0x97,0x9f,0x9f,\r
+ 0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9c,0x99,0x97,0x97,0x98,0x97,0x97,0x99,0x99,0x9b,0x9a,0x98,\r
+ 0x9d,0x97,0x97,0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x94,0x94,0x94,0x19,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r
+ 0x0e,0x0f,0x1f,0x94,0x94,0x94,0x97,0x99,0x9c,0x13,0x5c,0x5c,0x98,\r
+ 0x97,0x97,0x94,0x16,0x13,0x13,0x12,0x11,0x11,0x11,0x11,0x12,0x12,\r
+ 0x13,0x13,0x15,0x16,0x17,0x18,0x18,0x18,0x17,0x09,0x03,0x03,0x09,\r
+ 0x19,0x59,0x5a,0x14,0x5d,0x5e,0x5d,0xff,0xff,0xff,0x1d,0x13,0x99,\r
+ 0x9f,0x9a,0x9a,0x99,0x9d,0x9a,0x9a,0x9c,0x12,0x5b,0x5b,0x5c,0x5d,\r
+ 0x5d,0x5d,0x14,0x10,0x9e,0x9e,0x9e,0x9e,0x9e,0x11,0x15,0x15,0x15,\r
+ 0x15,0x15,0x14,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x12,\r
+ 0x12,0x12,0x17,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x06,0x04,\r
+ 0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x05,0xf7,0xf7,0x04,0x05,0x05,0x05,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x06,0x02,0xf7,\r
+ 0x02,0x02,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9c,0x94,0x94,0x9c,0x9e,0x9d,\r
+ 0x9c,0x9a,0x9a,0x99,0x98,0x98,0x97,0x98,0x99,0x99,0x99,0x99,0x98,\r
+ 0x99,0x9a,0x9b,0x9a,0x99,0x99,0x99,0x9f,0x9e,0x9d,0x9d,0x9d,0x9c,\r
+ 0x9d,0x9d,0x9b,0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9c,0x9b,0x99,0x97,\r
+ 0x98,0x97,0x97,0x97,0x99,0x99,0x9c,0x9a,0x99,0x9c,0x97,0x98,0x9a,\r
+ 0x9a,0x99,0x9d,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,\r
+ 0x94,0x94,0x1b,0x0d,0x5e,0x5e,0x5e,0x5e,0x0d,0x1d,0x94,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9c,0x5c,0x5c,0x5c,0x19,0x97,0x97,0x94,0x97,0x15,\r
+ 0x14,0x5c,0x5c,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5a,0x59,0x59,0x59,\r
+ 0x59,0x5a,0x5b,0x14,0x97,0x97,0x17,0x5d,0x5d,0x5e,0x5e,0x5e,0x5e,\r
+ 0x5d,0x58,0xff,0xff,0xff,0xff,0x5d,0x12,0x9d,0x99,0x9a,0x9a,0x9d,\r
+ 0x97,0x9a,0x13,0x5b,0x5b,0x5b,0x5c,0x5d,0x5e,0x5d,0x5b,0x5a,0x16,\r
+ 0x10,0x9f,0x0e,0x9f,0x9e,0x10,0x17,0x5a,0x5b,0x5b,0x5b,0x5b,0x5b,\r
+ 0x5b,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x13,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9b,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0x04,0x05,0x06,0x04,0x03,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,\r
+ 0x03,0x03,0xf7,0x02,0x05,0x04,0x05,0x04,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x03,0x03,0x03,0x03,0x04,0x05,0xf7,0xf7,0x02,0x02,0x9f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x9c,0x94,0x94,0x9b,0x9e,0x9d,0x9c,0x9a,0x9a,0x99,\r
+ 0x99,0x98,0x97,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x9a,0x9a,0x9a,\r
+ 0x99,0x98,0x9c,0x9f,0x9d,0x9d,0x9d,0x9c,0x9c,0x9d,0x9d,0x99,0x97,\r
+ 0x9a,0x9c,0x9d,0x9d,0x9d,0x9c,0x9b,0x99,0x97,0x98,0x97,0x97,0x97,\r
+ 0x99,0x98,0x9c,0x99,0x9a,0x9c,0x97,0x98,0x9b,0x9a,0x99,0x9e,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x1f,0x7d,\r
+ 0x5e,0x5e,0x5e,0x16,0x94,0x94,0x94,0x94,0x94,0x97,0x99,0x12,0x5c,\r
+ 0x5c,0x5c,0x11,0x97,0x97,0x94,0x97,0x9a,0x14,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5c,0x5b,0x5a,0x59,0x59,0x59,0x5a,0x5d,0x5d,0x12,0x94,0x94,\r
+ 0x19,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0x5d,0x5a,0xff,0xff,0xff,0xff,\r
+ 0xff,0x5b,0x5d,0x13,0x99,0x9a,0x9b,0x9d,0x97,0x13,0x5b,0x5b,0x5b,\r
+ 0x5b,0x5c,0x5d,0x5e,0x5d,0x5b,0x5a,0x5a,0x59,0x5a,0x14,0x9e,0x9e,\r
+ 0x9d,0x12,0x5b,0x5b,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5c,0x5b,0x12,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x06,0x06,0x06,0x06,0x05,\r
+ 0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x05,0xf7,0xf7,0x04,\r
+ 0x04,0x04,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x03,0x03,\r
+ 0x03,0x06,0x02,0xf7,0xf7,0x02,0x9a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9d,\r
+ 0x94,0x94,0x9a,0x9e,0x9d,0x9d,0x9a,0x9a,0x9a,0x99,0x98,0x98,0x98,\r
+ 0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x99,0x97,0x9f,0x9f,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x98,0x97,0x9a,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9b,0x99,0x94,0x99,0x97,0x97,0x97,0x9a,0x98,0x9c,0x99,\r
+ 0x9b,0x9b,0x97,0x98,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x14,0x5e,0x5e,0x5e,0x10,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x99,0x12,0x5c,0x5c,0x5c,0x5d,0x14,0x97,\r
+ 0x94,0x97,0x9a,0x9b,0x12,0x5c,0x5c,0x5c,0x12,0x13,0x15,0x17,0x18,\r
+ 0x18,0x5b,0x5d,0x5e,0x0e,0x94,0x94,0x94,0x94,0x1c,0x5d,0x5d,0x5d,\r
+ 0x5d,0x5d,0x5b,0x0f,0x03,0xf7,0x0c,0x11,0xff,0x5a,0x5d,0x5b,0x19,\r
+ 0x9a,0x9b,0x9d,0x1a,0x5c,0x5b,0x5b,0x5b,0x5c,0x12,0x13,0x0f,0x5d,\r
+ 0x5b,0x5a,0x5a,0x5a,0x12,0x9d,0x9c,0x9b,0x9b,0x9b,0x13,0x5c,0x5c,\r
+ 0x5c,0x12,0x12,0x12,0x12,0x13,0x13,0x5c,0x5b,0x5b,0x13,0x9c,0x9c,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x99,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x06,0x07,0x07,\r
+ 0x07,0x06,0x04,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x05,0x06,0x05,0x04,0x04,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x02,0x03,0xf7,0x02,0x05,0x04,0x04,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x04,0x03,0x03,0x03,0x03,0x04,0x05,0xf7,0xf7,\r
+ 0x02,0x98,0x9d,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9e,0x94,0x94,0x9a,0x9e,\r
+ 0x9d,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x98,0x98,0x98,0x98,0x98,\r
+ 0x99,0x9a,0x9a,0x9a,0x99,0x99,0x97,0x9f,0x9f,0x9d,0x9d,0x9d,0x9b,\r
+ 0x9d,0x9d,0x9d,0x97,0x98,0x9b,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x99,\r
+ 0x94,0x99,0x97,0x97,0x97,0x9a,0x99,0x9c,0x98,0x9d,0x9a,0x97,0x98,\r
+ 0x9b,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x1d,0x5e,0x5e,0x5e,0x7d,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x99,0x16,0x5c,0x5c,0x5c,0x5d,0x5d,0x19,0x94,0x97,0x9a,0x9b,0x13,\r
+ 0x5c,0x5c,0x12,0x9a,0x9b,0x9e,0x9f,0x03,0x9f,0x19,0x5e,0x0d,0x1e,\r
+ 0x94,0x98,0x9a,0x9a,0x9a,0x13,0x5b,0x5c,0x5c,0x15,0x0c,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0x11,0x5a,0x5d,0x5a,0x13,0x9a,0x9a,0x9d,0x12,0x5d,\r
+ 0x5b,0x5b,0x15,0x15,0x99,0x97,0x97,0x14,0x5b,0x5b,0x5b,0x13,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x13,0x5c,0x5c,0x12,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9c,0x12,0x5b,0x16,0x11,0x9c,0x9b,0x9a,0x98,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0x06,0x04,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x05,\r
+ 0x05,0x05,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,\r
+ 0x05,0xf7,0xf7,0x04,0x04,0x04,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x04,0x03,0x03,0x03,0x03,0x06,0x02,0xf7,0xf7,0x98,0x99,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9e,0x97,0x94,0x9a,0x9e,0x9d,0x9d,0x9b,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x98,0x98,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,\r
+ 0x99,0x99,0x99,0x9f,0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,0x97,\r
+ 0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x98,0x94,0x99,0x97,0x97,\r
+ 0x97,0x9a,0x99,0x9c,0x97,0x9e,0x98,0x98,0x99,0x9b,0x99,0x9a,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x0e,0x5e,\r
+ 0x5e,0x5e,0x19,0x94,0x94,0x94,0x94,0x97,0x16,0x5a,0x5b,0x5b,0x5c,\r
+ 0x19,0x97,0x97,0x94,0x97,0x99,0x9b,0x13,0x5c,0x5c,0x12,0x9a,0x9c,\r
+ 0x9f,0x03,0x03,0x9d,0x1d,0x0f,0x1b,0x94,0x98,0x9b,0x9d,0x9e,0x9e,\r
+ 0x11,0x5b,0x5a,0x5b,0x10,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x59,\r
+ 0x5d,0x58,0x11,0x9a,0x9a,0x14,0x5b,0x5c,0x5c,0x5b,0x14,0x9a,0x99,\r
+ 0x99,0x9a,0x15,0x5b,0x14,0x16,0x9a,0x99,0x9a,0x9a,0x9a,0x99,0x99,\r
+ 0x13,0x5d,0x5d,0x11,0x99,0x9a,0x9c,0x9b,0x9b,0x9a,0x1a,0x11,0x19,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x02,0x03,\r
+ 0x05,0x06,0x07,0x07,0x07,0x07,0x06,0x04,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x05,0x05,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0xf7,0x03,0xf7,0x02,0x05,\r
+ 0x04,0x04,0x03,0xf7,0xf7,0x02,0xf7,0xf7,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0xf7,0xf7,0x97,0x99,0x9b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9f,0x97,0x94,0x9a,0x9e,0x9e,0x9d,0x9c,0x9a,0x9a,0x9a,0x99,0x99,\r
+ 0x99,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x9d,0x9f,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9b,0x97,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9a,0x98,0x94,0x99,0x97,0x97,0x97,0x9a,0x99,0x9b,\r
+ 0x97,0x9e,0x97,0x98,0x99,0x9b,0x99,0x9b,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x97,\r
+ 0x97,0x97,0x94,0x94,0x94,0x94,0x16,0x5e,0x5e,0x5e,0x12,0x94,0x94,\r
+ 0x94,0x94,0x97,0x13,0x5a,0x5b,0x5b,0x13,0x97,0x98,0x98,0x97,0x97,\r
+ 0x99,0x9b,0x13,0x5c,0x5c,0x12,0x9a,0x9c,0x9f,0x03,0x03,0x13,0x1c,\r
+ 0x94,0x94,0x94,0x98,0x9a,0x9d,0x9e,0x9e,0x0f,0x5a,0x5b,0x5b,0x9d,\r
+ 0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x5a,0x5d,0x1f,0x12,0x9a,0x9a,\r
+ 0x13,0x5b,0x5b,0x5b,0x13,0x9d,0x9d,0x9d,0x9d,0x11,0x5b,0x13,0x15,\r
+ 0x9a,0x99,0x99,0x1a,0x97,0x97,0x97,0x98,0x13,0x5c,0x5c,0x11,0x97,\r
+ 0x94,0x94,0x94,0x94,0x12,0x1e,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x98,0x9c,0x9f,0x03,0x03,0x03,0x06,0x05,0x05,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x05,\r
+ 0x06,0x06,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x04,0xf7,0xf7,0x04,0x04,0x04,0x04,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x04,0x03,0x03,0x03,0x03,0x05,0x03,0xf7,0x94,\r
+ 0x98,0x99,0x9e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x94,0x99,\r
+ 0x9d,0x9e,0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x9f,0x9f,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9a,0x97,0x9a,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9a,\r
+ 0x97,0x94,0x99,0x97,0x97,0x97,0x9a,0x99,0x9b,0x97,0x9e,0x94,0x98,\r
+ 0x9a,0x9a,0x99,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x99,0x98,0x99,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x97,0x97,\r
+ 0x94,0x1e,0x5e,0x5e,0x5e,0x0c,0x94,0x94,0x94,0x94,0x97,0x5c,0x5a,\r
+ 0x5b,0x5b,0x19,0x94,0x98,0x98,0x97,0x98,0x99,0x9b,0x13,0x5c,0x5c,\r
+ 0x12,0x9a,0x9c,0x9f,0x03,0x0f,0x5a,0x17,0x94,0x94,0x94,0x97,0x99,\r
+ 0x9b,0x9c,0x9d,0x13,0x5c,0x5c,0x5c,0x19,0x9b,0x9f,0xf7,0xf7,0xf7,\r
+ 0xf7,0x06,0x5c,0x5d,0x58,0x13,0x9b,0x99,0x11,0x5b,0x5c,0x5d,0x1a,\r
+ 0x97,0x98,0x99,0x9a,0x13,0x13,0x98,0x97,0x97,0x1b,0x12,0x17,0x98,\r
+ 0x98,0x97,0x94,0x13,0x5e,0x5e,0x0e,0x94,0x94,0x94,0x94,0x16,0x5e,\r
+ 0x19,0x94,0x97,0x9a,0x9e,0x9f,0x9f,0x9f,0x9e,0x9e,0x9b,0x99,0x97,\r
+ 0x94,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x07,0x06,0x03,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,\r
+ 0x04,0xf7,0x02,0x05,0x04,0x04,0x02,0xf7,0x02,0x02,0x02,0xf7,0x03,\r
+ 0x04,0x03,0x03,0x03,0x04,0x04,0x03,0x98,0x97,0x99,0x9a,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x94,0x98,0x9d,0x9e,0x9d,0x9d,\r
+ 0x9b,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x97,0x9f,0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x99,\r
+ 0x97,0x9b,0x9d,0x9d,0x9d,0x9d,0x9c,0x9b,0x9a,0x98,0x94,0x99,0x97,\r
+ 0x97,0x98,0x9a,0x9a,0x9b,0x99,0x9e,0x97,0x98,0x9a,0x9a,0x99,0x9d,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x98,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9b,0x9a,0x99,0x97,0x10,0x5e,0x5e,\r
+ 0x5e,0x1b,0x94,0x94,0x94,0x18,0x5b,0x5a,0x5b,0x13,0x99,0x94,0x98,\r
+ 0x98,0x97,0x98,0x99,0x9a,0x13,0x5c,0x5c,0x5c,0x13,0x13,0x16,0x18,\r
+ 0x58,0x59,0x15,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x17,0x5d,\r
+ 0x5d,0x5e,0x11,0x97,0x9a,0x03,0xf7,0xf7,0xf7,0x18,0x5d,0x5e,0x5a,\r
+ 0x12,0x9d,0x9d,0x5d,0x5d,0x5e,0x7d,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x98,0x99,0x16,0x5c,0x10,0x94,0x94,0x94,0x94,0x94,0x14,0x5e,\r
+ 0x5e,0x7d,0x0e,0x0e,0x10,0x11,0x5b,0x5b,0x11,0x9d,0x9d,0x9b,0x9a,\r
+ 0x98,0x97,0x94,0x94,0x94,0x97,0x99,0x9a,0x9c,0x04,0x04,0x05,0x05,\r
+ 0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,\r
+ 0x06,0x06,0x06,0x06,0x07,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x03,0xf7,0xf7,0x04,0x04,\r
+ 0x04,0x04,0xf7,0xf7,0x02,0x03,0x02,0xf7,0x04,0x03,0x03,0x03,0x03,\r
+ 0x05,0x04,0x9e,0x9a,0x99,0x99,0x9e,0x01,0x01,0x01,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x99,0x94,0x97,0x9c,0x9e,0x9d,0x9d,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x99,0x9f,\r
+ 0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x97,0x98,0x9b,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9b,0x9a,0x98,0x97,0x98,0x97,0x98,0x99,0x9a,0x9b,\r
+ 0x9b,0x9c,0x9d,0x97,0x98,0x9a,0x9a,0x99,0x9e,0x03,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x99,0x98,\r
+ 0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x98,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9b,0x9a,0x13,0x5d,0x5e,0x5e,0x14,0x94,0x94,0x94,\r
+ 0x12,0x5b,0x5a,0x5b,0x14,0x98,0x94,0x98,0x99,0x94,0x98,0x99,0x9a,\r
+ 0x13,0x5c,0x5c,0x5c,0x5c,0x5b,0x5a,0x59,0x58,0x58,0x10,0x99,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x19,0x5e,0x5e,0x5e,0x5e,0x0e,0x16,\r
+ 0x99,0x02,0x07,0x19,0x5c,0x5d,0x5b,0x5a,0x12,0x9c,0x97,0x5d,0x5d,\r
+ 0x5e,0x0e,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x18,0x7d,0x5e,\r
+ 0x16,0x94,0x94,0x94,0x94,0x94,0x13,0x5d,0x5d,0x5d,0x5d,0x5c,0x5c,\r
+ 0x5d,0x5d,0x5d,0x17,0x94,0x94,0x94,0x97,0x98,0x9a,0x9b,0x9d,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x05,0x05,0x06,0x06,0x06,0x05,0x05,0x06,0x07,0x07,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x05,0xf7,0x02,0x05,0x04,0x04,0x02,0xf7,0x02,\r
+ 0x03,0x03,0x02,0x02,0x04,0x03,0x03,0x03,0x04,0x04,0x9f,0x9f,0x9c,\r
+ 0x9a,0x9e,0x01,0x02,0x03,0x9f,0x03,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x94,\r
+ 0x94,0x9a,0x9d,0x9e,0x9d,0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x9e,0x9f,0x9e,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9d,0x9c,0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,\r
+ 0x9a,0x98,0x97,0x98,0x98,0x98,0x9a,0x9a,0x9c,0x9a,0x9e,0x9c,0x97,\r
+ 0x98,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x99,0x98,0x98,0x99,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,0x98,0x97,0x97,0x98,\r
+ 0x17,0x5c,0x5d,0x5e,0x0d,0x94,0x94,0x94,0x5c,0x5b,0x5a,0x5b,0x9a,\r
+ 0x97,0x94,0x98,0x99,0x94,0x98,0x99,0x9a,0x13,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5b,0x59,0x58,0x58,0x0c,0x9f,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x19,0x5e,0x5e,0x5d,0x5d,0x5d,0x5e,0x5e,0x5b,0xff,0x59,0x5c,\r
+ 0x59,0x5a,0x12,0x9a,0x94,0x94,0x5e,0x5e,0x5e,0x0f,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x12,0x5d,0x5d,0x5d,0x19,0x94,0x94,0x94,0x97,\r
+ 0x97,0x13,0x5d,0x5d,0x5d,0x5d,0x5e,0x5e,0x5d,0x5d,0x5d,0x15,0x9a,\r
+ 0x9c,0x9d,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9c,0x9c,0x9a,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x04,0x05,0x05,0x06,0x06,\r
+ 0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0x02,\r
+ 0x02,0xf7,0x04,0x04,0x04,0x04,0xf7,0x02,0x03,0x03,0x03,0xf7,0x04,\r
+ 0x03,0x03,0x04,0x04,0x04,0x9f,0x9f,0x9f,0x9e,0x9d,0x02,0x02,0x9e,\r
+ 0x9b,0x9d,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9d,0x97,0x94,0x98,0x9c,0x9e,\r
+ 0x9d,0x9d,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x97,0x9f,0x9f,0x9d,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9a,\r
+ 0x97,0x99,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x98,\r
+ 0x98,0x99,0x9a,0x9a,0x9c,0x99,0x9f,0x9b,0x98,0x98,0x9b,0x99,0x99,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x9f,0x9e,0x9b,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x94,0x94,0x97,0x97,0x98,0x99,0x99,0x97,0x94,0x11,0x5c,0x5d,0x5d,\r
+ 0x1c,0x94,0x16,0x5c,0x5b,0x5a,0x13,0x99,0x94,0x94,0x98,0x99,0x94,\r
+ 0x98,0x99,0x9a,0x13,0x5c,0x5c,0x5c,0x12,0x12,0x13,0x15,0x59,0x58,\r
+ 0x0c,0x02,0x02,0x9f,0x9e,0x9b,0x9a,0x9a,0x9a,0x12,0x5b,0x5a,0x5a,\r
+ 0x5a,0x5b,0x5d,0x5e,0x5d,0x1f,0x59,0x58,0x59,0x13,0x99,0x97,0x94,\r
+ 0x94,0x5e,0x5d,0x5c,0x5c,0x98,0x97,0x98,0x99,0x99,0x16,0x13,0x5c,\r
+ 0x5c,0x5d,0x5d,0x97,0x97,0x94,0x94,0x94,0x94,0x13,0x5d,0x5d,0x5d,\r
+ 0x12,0x13,0x13,0x15,0x5a,0x5a,0x10,0x9e,0x9e,0x9e,0x9d,0x9d,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0x03,0x04,0x05,0x06,0x06,0x05,0x04,0x04,0x04,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0x05,0xf7,0x02,0x04,0x04,\r
+ 0x04,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x04,0x03,0x03,0x04,0x04,\r
+ 0x9d,0x9f,0x9f,0x9f,0x9e,0x03,0x02,0x9d,0x98,0x97,0x99,0x9d,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x9f,0x98,0x94,0x94,0x9a,0x9d,0x9d,0x9d,0x9d,0x9c,\r
+ 0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x97,0x99,0x9f,\r
+ 0x9f,0x9d,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,0x99,0x97,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x99,0x99,0x99,0x9b,0x9a,\r
+ 0x9c,0x98,0x9f,0x99,0x98,0x99,0x9b,0x99,0x99,0x9f,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9a,0x99,\r
+ 0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x98,0x14,0x5d,0x5d,0x5d,0x15,0x94,0x12,0x5c,0x5b,\r
+ 0x5b,0x16,0x98,0x94,0x94,0x98,0x99,0x94,0x98,0x99,0x9a,0x13,0x5c,\r
+ 0x5c,0x11,0x99,0x99,0x99,0x9a,0x12,0x59,0x0e,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x0c,0x58,0x58,0x58,0x1a,0x59,0x5b,0x5d,0x5d,\r
+ 0x59,0x58,0x59,0x12,0x9c,0x94,0x94,0x9e,0x01,0x0f,0x5c,0x5c,0x5c,\r
+ 0x98,0x97,0x98,0x98,0x99,0x14,0x13,0x14,0x5c,0x5c,0x5c,0x99,0x99,\r
+ 0x99,0x99,0x9a,0x9b,0x12,0x5b,0x5b,0x15,0x9e,0x9e,0x9e,0x9d,0x12,\r
+ 0x5b,0x12,0x9c,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,\r
+ 0x9a,0x9a,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x05,0x05,0x06,0x05,0x03,0x03,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x04,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,0x03,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x02,0xf7,0x02,0xf7,0x04,0x04,0x04,0x04,0xf7,0x02,0x03,\r
+ 0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x9d,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x01,0x9e,0x97,0x94,0x94,0x97,0x9a,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x9a,0x94,0x94,0x98,0x9c,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x94,0x9e,0x9f,0x9f,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9d,0x9d,0x97,0x98,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9a,0x97,0x97,0x99,0x99,0x99,0x9b,0x9a,0x9c,0x97,0x9f,0x98,\r
+ 0x98,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9a,0x99,0x98,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x1b,\r
+ 0x5d,0x5d,0x5d,0x10,0x94,0x5d,0x5c,0x5c,0x12,0x98,0x97,0x94,0x94,\r
+ 0x98,0x9a,0x97,0x98,0x99,0x9a,0x12,0x5c,0x5d,0x11,0x99,0x99,0x99,\r
+ 0x99,0x9a,0x12,0x11,0x0e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x0e,\r
+ 0x59,0x59,0x59,0x9f,0x10,0x12,0x12,0x5d,0x5a,0x59,0x5c,0x99,0x97,\r
+ 0x94,0x9e,0x9f,0x9a,0x11,0x5c,0x5c,0x5d,0x14,0x97,0x98,0x98,0x98,\r
+ 0x99,0x9a,0x13,0x5b,0x5b,0x5b,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x13,\r
+ 0x5b,0x5b,0x13,0x9b,0x9b,0x9b,0x9c,0x9b,0x13,0x12,0x13,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9d,0x9d,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x02,0x03,\r
+ 0x05,0x06,0x06,0x04,0x03,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x05,\r
+ 0xf7,0xf7,0x04,0x04,0x04,0xf7,0xf7,0x03,0x03,0x03,0x03,0x02,0x04,\r
+ 0x03,0x02,0x04,0x9d,0x9d,0x9e,0x9f,0x03,0x03,0x02,0x9f,0x97,0x94,\r
+ 0x94,0x94,0x94,0x98,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x98,0x94,0x94,\r
+ 0x99,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x98,0x97,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,0x9d,0x9d,0x9c,\r
+ 0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x97,\r
+ 0x99,0x99,0x99,0x9b,0x9a,0x9c,0x97,0x9f,0x97,0x98,0x99,0x9b,0x99,\r
+ 0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9f,0x9e,0x9a,0x99,0x98,0x98,0x99,0x99,0x99,0x99,0x9a,0x9a,\r
+ 0x99,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x10,0x5d,0x5d,0x5d,0x13,\r
+ 0x5c,0x5c,0x5d,0x14,0x97,0x94,0x94,0x94,0x98,0x9a,0x97,0x98,0x99,\r
+ 0x9a,0x13,0x5c,0x5d,0x11,0x98,0x98,0x98,0x99,0x99,0x19,0x15,0x15,\r
+ 0x13,0x9d,0x9e,0x9e,0x9f,0x9f,0x9f,0x0f,0x5a,0x5a,0x5a,0x9d,0x9c,\r
+ 0x9b,0x99,0x13,0x5b,0x5b,0x5d,0x15,0x94,0x94,0x94,0x97,0x9a,0x13,\r
+ 0x5b,0x5c,0x5d,0x5c,0x97,0x97,0x98,0x98,0x99,0x99,0x14,0x5c,0x5b,\r
+ 0x5b,0x15,0x9a,0x9a,0x9a,0x9a,0x9a,0x12,0x5c,0x5c,0x12,0x9a,0x9a,\r
+ 0x9b,0x9c,0x9c,0x12,0x12,0x11,0x12,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9e,0x9e,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x03,0x03,0x05,0x06,0x06,0x04,0x02,0x03,0x05,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0xf7,0x02,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x02,0xf7,0xf7,0xf7,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x02,0xf7,0x03,0x04,0x04,\r
+ 0x03,0xf7,0x02,0x03,0x03,0x03,0x02,0x02,0x04,0x03,0x03,0x9c,0x9d,\r
+ 0x9d,0x9f,0x9f,0x03,0x02,0x02,0x98,0x94,0x97,0x97,0x94,0x94,0x97,\r
+ 0x9e,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x9d,0x94,0x94,0x97,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x97,0x9a,0x9f,\r
+ 0x9f,0x9d,0x9d,0x9d,0x9c,0x9c,0x9d,0x9d,0x9a,0x97,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9a,0x97,0x98,0x99,0x99,0x99,0x9a,\r
+ 0x9a,0x9b,0x98,0x9f,0x97,0x98,0x99,0x9b,0x99,0x9b,0x9f,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9f,0x9d,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x99,0x99,0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x94,\r
+ 0x94,0x94,0x94,0x13,0x5d,0x5d,0x5d,0x5d,0x5c,0x5c,0x5d,0x1d,0x94,\r
+ 0x94,0x94,0x94,0x98,0x9a,0x97,0x98,0x99,0x9a,0x13,0x5c,0x5d,0x11,\r
+ 0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x14,0x5c,0x16,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9c,0x12,0x5b,0x5b,0x5b,0x9c,0x9a,0x99,0x97,0x19,0x5b,0x5d,\r
+ 0x5d,0x0e,0x98,0x9a,0x9b,0x9c,0x9e,0x9e,0x5c,0x5c,0x5d,0x5d,0x12,\r
+ 0x97,0x97,0x98,0x98,0x98,0x11,0x5c,0x5c,0x5c,0x14,0x99,0x99,0x99,\r
+ 0x99,0x99,0x12,0x5c,0x5c,0x13,0x9b,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,\r
+ 0x11,0x5a,0x10,0x9d,0x9d,0x9c,0x9b,0x9a,0x99,0x99,0x98,0x97,0x98,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,0x04,\r
+ 0x06,0x06,0x03,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x03,0xf7,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x04,0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0xf7,0x05,0xf7,0xf7,0x04,0x04,0x04,0xf7,0xf7,0x03,0x03,\r
+ 0x03,0x03,0x02,0x04,0x03,0x02,0x9c,0x9c,0x9d,0x9e,0x9f,0x03,0x03,\r
+ 0x02,0x9c,0x94,0x97,0x99,0x98,0x94,0x94,0x94,0x9d,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x9f,0x9a,0x94,0x94,0x97,0x99,0x9c,0x9d,0x9d,0x9c,0x9c,\r
+ 0x9c,0x9b,0x9b,0x9a,0x9a,0x98,0x97,0x9f,0x9f,0x9f,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9d,0x9d,0x99,0x98,0x9b,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9c,0x9a,0x97,0x98,0x99,0x99,0x99,0x9a,0x9b,0x9b,0x99,0x9e,\r
+ 0x94,0x98,0x9a,0x9a,0x98,0x9d,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x98,0x98,0x98,0x99,\r
+ 0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9d,0x9c,0x98,0x94,0x94,0x1b,0x5e,\r
+ 0x5d,0x5d,0x5d,0x5c,0x5c,0x10,0x98,0x97,0x94,0x94,0x94,0x98,0x9a,\r
+ 0x94,0x98,0x99,0x9a,0x5c,0x5c,0x5d,0x5d,0x13,0x13,0x13,0x13,0x13,\r
+ 0x13,0x13,0x5c,0x5d,0x5c,0x19,0x99,0x99,0x9a,0x9a,0x13,0x5b,0x5b,\r
+ 0x5b,0x9a,0x99,0x97,0x97,0x9a,0x12,0x5d,0x5d,0x5c,0x14,0x99,0x98,\r
+ 0x99,0x9c,0x9a,0x16,0x5d,0x5d,0x5d,0x5d,0x5d,0x14,0x17,0x16,0x11,\r
+ 0x5d,0x5d,0x5d,0x5c,0x5c,0x16,0x99,0x9a,0x9a,0x9a,0x5c,0x5b,0x5b,\r
+ 0x5b,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x14,0x5d,0x5d,0x1d,0x94,\r
+ 0x97,0x99,0x9a,0x9b,0x9b,0x9a,0x98,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x04,0x02,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,\r
+ 0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,\r
+ 0x03,0xf7,0xf7,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x02,\r
+ 0xf7,0x03,0x04,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,0x03,0x02,0x04,\r
+ 0x03,0x99,0x9c,0x9d,0x9d,0x9e,0x9f,0x03,0x02,0x03,0x97,0x97,0x9a,\r
+ 0x9b,0x9a,0x97,0x94,0x94,0x9c,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,\r
+ 0x99,0x94,0x94,0x97,0x99,0x9b,0x9c,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,\r
+ 0x99,0x97,0x99,0x03,0x9f,0x2a,0x2a,0x2b,0x2a,0x2c,0x2b,0x2b,0x2b,\r
+ 0x97,0x99,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x97,\r
+ 0x98,0x99,0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9e,0x97,0x98,0x9a,0x9a,\r
+ 0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9f,0x9f,0x9c,0x99,0x98,0x98,0x98,0x98,0x98,0x98,0x97,0x98,\r
+ 0x99,0x9a,0x9c,0x9d,0x98,0x94,0x94,0x5e,0x5e,0x5d,0x5d,0x5c,0x5c,\r
+ 0x12,0x9e,0x9c,0x98,0x94,0x94,0x98,0x9a,0x94,0x98,0x99,0x16,0x5c,\r
+ 0x5c,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r
+ 0x12,0x98,0x99,0x99,0x9a,0x12,0x5b,0x5b,0x5c,0x18,0x97,0x94,0x99,\r
+ 0x98,0x1a,0x5c,0x5d,0x5d,0x5d,0x1a,0x98,0x9c,0x9d,0x9b,0x9a,0x12,\r
+ 0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5c,0x5c,0x13,\r
+ 0x14,0x9b,0x9c,0x9d,0x10,0x5a,0x5a,0x5a,0x5a,0x5a,0x5b,0x5c,0x5d,\r
+ 0x5d,0x5d,0x5d,0x5b,0x5a,0x59,0x15,0x03,0x02,0x01,0x01,0x01,0x02,\r
+ 0x9f,0x9d,0x9a,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x05,0x06,0x07,\r
+ 0x06,0x06,0x05,0x05,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x04,0x05,\r
+ 0x06,0x05,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x06,0x07,0x06,0x02,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x02,0xf7,0x02,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0x04,0xf7,0xf7,0x04,0x03,0x04,\r
+ 0xf7,0xf7,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x03,0x02,0x9a,0x94,0x9a,0x9c,0x9c,0x9b,0x99,0x94,\r
+ 0x94,0x9a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,0x99,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9a,0x9b,0x9b,0x9a,0x9a,0x99,0x97,0x27,0x2a,0x27,\r
+ 0x28,0x2a,0x2a,0x2b,0x2b,0x2c,0x2a,0x2b,0x2c,0xf6,0x2a,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x99,0x99,0x99,0x9a,\r
+ 0x9a,0x9c,0x9b,0x9e,0x9e,0x97,0x99,0x9a,0x9a,0x99,0x9e,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9e,0x9c,\r
+ 0x9a,0x99,0x98,0x98,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9b,0x9d,\r
+ 0x97,0x14,0x5e,0x5e,0x5d,0x5d,0x5c,0x5d,0x5d,0x09,0x9f,0x9a,0x94,\r
+ 0x97,0x98,0x9b,0x94,0x98,0x17,0x13,0x5c,0x5c,0x5d,0x5d,0x5d,0x5d,\r
+ 0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x99,0x99,0x16,\r
+ 0x5c,0x5c,0x5c,0x5d,0x0f,0x19,0x98,0x97,0x98,0x98,0x12,0x5d,0x5c,\r
+ 0x5b,0x13,0x9d,0x9e,0x9e,0x9d,0x9c,0x9b,0x13,0x5c,0x5c,0x5c,0x5c,\r
+ 0x5c,0x5c,0x5c,0x5b,0x5b,0x5b,0x12,0x9d,0x9e,0x9e,0x9e,0x0f,0x15,\r
+ 0x5b,0x5b,0x5d,0x5d,0x5d,0x5d,0x5b,0x59,0x59,0x5b,0x5d,0x5d,0x5e,\r
+ 0x5e,0x5e,0x13,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x06,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x04,0x04,0x05,0x06,0x03,0x02,0x02,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x02,0x05,\r
+ 0x06,0x06,0x05,0x02,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x05,0x06,0x05,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x03,0xf7,0x02,0xf7,0x04,0x03,0x03,0x03,0xf7,0x03,0x03,0x03,\r
+ 0x03,0x04,0x02,0x04,0x9b,0x98,0x9d,0x9d,0x9c,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x94,0x99,0x9c,0x9d,0x9d,0x9c,0x9a,0x94,0x94,0x9a,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9f,0x9a,0x97,0x94,0x94,0x94,0x98,\r
+ 0x99,0x99,0x99,0x2f,0x2f,0x05,0x2e,0x27,0x27,0x29,0x2a,0x2a,0x2b,\r
+ 0x2c,0x2b,0x2b,0x2b,0x2f,0x2f,0x2d,0x2a,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9b,0x99,0x97,0x99,0x99,0x99,0x9a,0x9b,0x9c,0x9a,0x9f,\r
+ 0x9d,0x97,0x99,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x99,0x99,0x94,\r
+ 0x94,0x94,0x94,0x97,0x97,0x98,0x99,0x13,0x13,0x5d,0x5e,0x5e,0x5e,\r
+ 0x5e,0x5d,0x5d,0x5d,0x1f,0x10,0x9a,0x94,0x97,0x97,0x9b,0x94,0x16,\r
+ 0x5c,0x5b,0x5c,0x5c,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r
+ 0x5d,0x5d,0x5d,0x5d,0x5d,0x14,0x14,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,\r
+ 0x5d,0x13,0x98,0x97,0x97,0x15,0x5b,0x5b,0x5b,0x5a,0x5a,0x13,0x9e,\r
+ 0x9e,0x9d,0x9d,0x9c,0x12,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x14,\r
+ 0x10,0x9d,0x9d,0x9c,0x9b,0x15,0x5d,0x5d,0x5d,0x5b,0x59,0x59,0x59,\r
+ 0x5c,0x5d,0x5e,0x5e,0x5e,0x5d,0x5d,0x5c,0x5c,0x5c,0x5c,0x14,0x97,\r
+ 0x97,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,\r
+ 0x05,0x05,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x02,0x02,0x03,0x06,0x05,0x05,0x05,0x04,0xf7,\r
+ 0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x06,\r
+ 0x03,0xf7,0x02,0x07,0x07,0x07,0x06,0x07,0x07,0x05,0xf7,0x04,0xf7,\r
+ 0x02,0x04,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,0x02,0x9d,\r
+ 0x9a,0x99,0x9d,0x9d,0x9d,0x9e,0x9f,0x03,0x02,0x9b,0x97,0x9b,0x9d,\r
+ 0x9d,0x9e,0x9e,0x9b,0x94,0x94,0x99,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0x9c,0x99,0x94,0x94,0x94,0x94,0x05,0x2f,0x02,\r
+ 0x01,0x2f,0x28,0x27,0x27,0x29,0x2a,0x2b,0x2b,0x2c,0x2b,0x2b,0x2c,\r
+ 0xf6,0x2f,0x2c,0x2b,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x98,\r
+ 0x97,0x99,0x99,0x9a,0x9b,0x9b,0x9d,0x99,0x03,0x9b,0x98,0x99,0x9b,\r
+ 0x99,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9d,0x9b,0x9a,0x94,0x94,0x94,0x94,0x97,0x98,\r
+ 0x99,0x99,0x9a,0x9d,0x99,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x02,\r
+ 0x9e,0x98,0x94,0x97,0x97,0x9c,0x94,0x99,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,\r
+ 0x99,0x9a,0x9a,0x9a,0x99,0x97,0x94,0x99,0x97,0x99,0x98,0x97,0x99,\r
+ 0x9a,0x14,0x5b,0x5a,0x5a,0x5a,0x0f,0x9e,0x9e,0x9d,0x9d,0x9d,0x9d,\r
+ 0x12,0x12,0x13,0x14,0x14,0x13,0x12,0x9c,0x9a,0x98,0x94,0x97,0x9a,\r
+ 0x9e,0x9f,0x9e,0x9a,0x97,0x94,0x94,0x94,0x94,0x97,0x99,0x99,0x9a,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,0x9b,0x99,0x97,\r
+ 0x98,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x05,0x05,0x02,0x02,0x03,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x02,\r
+ 0x02,0x06,0x05,0x03,0x02,0x04,0x04,0x03,0xf7,0xf7,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x06,0x05,0xf7,0xf7,0x06,0x07,\r
+ 0x07,0x06,0x06,0x07,0x07,0x02,0x03,0xf7,0xf7,0x04,0x03,0x03,0x02,\r
+ 0xf7,0x03,0x03,0x04,0x03,0x03,0x03,0x9a,0x9c,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9f,0x9f,0x03,0x02,0x94,0x99,0x9c,0x9d,0x9d,0x9e,0x9e,0x9c,\r
+ 0x97,0x94,0x98,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x03,0x9d,0x99,0x97,0x27,0x05,0x01,0x01,0x01,0x2f,0x2a,0x26,0x27,\r
+ 0x27,0x2a,0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2e,0xf6,0x2e,0x2c,0x2a,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9b,0x98,0x97,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9b,0x9c,0x99,0x03,0x99,0x98,0x99,0x9b,0x99,0x99,0x9f,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9e,0x9d,0x94,0x94,0x97,0x97,0x98,0x99,0x9a,0x9a,0x9b,0x9c,0x9c,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x9c,0x9c,0x94,0x94,0x97,0x94,\r
+ 0x9c,0x97,0x99,0x99,0x9a,0x9a,0x99,0x98,0x98,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x94,0x99,0x97,0x98,0x99,0x97,0x99,0x9a,0x9b,0x12,0x5a,0x5a,0x5a,\r
+ 0x10,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x99,0x94,0x94,0x9a,0x9e,0x9e,0x99,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x99,0x9a,0x9a,0x9b,0x9c,0x9d,0x9d,0x9e,0x9e,0x9f,0x9e,0x9e,0x9e,\r
+ 0x9f,0x9f,0x9d,0x9c,0x9c,0x9c,0x9a,0x97,0x97,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,\r
+ 0x04,0x05,0x05,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x04,0x02,0xf7,0x05,0x05,0x04,0x04,0x03,\r
+ 0xf7,0xf7,0x03,0x03,0xf7,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x05,0x06,0x06,0xf7,0xf7,0x05,0x07,0x07,0x06,0x04,0x07,0x07,\r
+ 0x03,0xf7,0x02,0xf7,0x03,0x03,0x02,0x03,0xf7,0x03,0x03,0x04,0x03,\r
+ 0x03,0x04,0x9a,0x9c,0x9b,0x97,0x9d,0x9d,0x9c,0x9e,0x9f,0x9f,0x03,\r
+ 0x9c,0x97,0x9b,0x9c,0x9d,0x9d,0x9e,0x9e,0x9d,0x97,0x94,0x98,0x9f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x27,0x28,\r
+ 0x2f,0xf6,0x01,0xf6,0x2f,0x2a,0x25,0x26,0x27,0x28,0x2a,0x2a,0x2b,\r
+ 0x2c,0x2b,0x2b,0x2b,0xf6,0x2f,0x2c,0x2b,0x2a,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9b,0x97,0x97,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x98,\r
+ 0x9f,0x98,0x98,0x99,0x9b,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x97,0x97,0x98,\r
+ 0x99,0x9a,0x9a,0x9b,0x9c,0x9c,0x9d,0x9d,0x99,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x9a,0x94,0x94,0x98,0x94,0x9d,0x97,0x99,0x9a,0x9a,\r
+ 0x9a,0x99,0x98,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x99,0x98,0x97,0x99,0x98,0x97,0x99,0x97,\r
+ 0x98,0x99,0x9a,0x9c,0x0f,0x5a,0x5a,0x14,0x9e,0x9e,0x9e,0x9e,0x9d,\r
+ 0x9a,0x9a,0x9a,0x9c,0x9b,0x98,0x94,0x97,0x9d,0x9d,0x97,0x94,0x94,\r
+ 0x94,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9c,0x9c,0x9c,0x9d,0x9e,0x9f,\r
+ 0x9e,0x99,0x94,0x94,0x94,0x94,0x97,0x99,0x9f,0x03,0x9c,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x9a,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x05,0x05,0x02,0x02,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x02,0xf7,0xf7,0x05,0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0x03,0x02,\r
+ 0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x06,0x06,0xf7,\r
+ 0xf7,0x04,0x07,0x07,0x06,0x04,0x06,0x07,0x04,0xf7,0x04,0xf7,0x02,\r
+ 0x04,0x02,0x03,0xf7,0x02,0x03,0x04,0x04,0x03,0x03,0x9c,0x99,0x9d,\r
+ 0x9a,0x99,0x9d,0x9d,0x9d,0x9e,0x9f,0x03,0x02,0x97,0x9a,0x9c,0x9c,\r
+ 0x9d,0x9e,0x9e,0x9e,0x9d,0x98,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x23,0x26,0x28,0x2c,0x2c,0x2d,0x2b,\r
+ 0x27,0x25,0x26,0x27,0x27,0x29,0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2e,\r
+ 0xf6,0x2e,0x2c,0x2b,0x2a,0x9d,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,\r
+ 0x97,0x97,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x99,0x9f,0x97,0x98,0x99,\r
+ 0x9b,0x99,0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x97,0x97,0x99,0x99,0x9a,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9c,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x99,0x94,0x9e,0x98,0x99,0x9a,0x9a,0x9a,0x99,0x99,0x98,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x99,0x9a,0x9a,\r
+ 0x99,0x97,0x97,0x99,0x94,0x99,0x99,0x97,0x97,0x98,0x9d,0x9e,0x9e,\r
+ 0x13,0x5a,0x12,0x9d,0x9d,0x9d,0x9a,0x9a,0x9b,0x9c,0x99,0x94,0x97,\r
+ 0x9c,0x97,0x94,0x94,0x94,0x97,0x98,0x99,0x9b,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9e,0x9e,0x9f,0x9e,0x9c,0x98,0x94,0x94,0x94,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x97,0x9d,0x03,0x99,0x99,0x9a,0x9a,0x9a,0x99,0x9b,0x04,\r
+ 0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x03,0x04,0x04,0x05,0x03,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0xf7,0x02,0x05,0x04,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0xf7,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x06,0x06,0xf7,0xf7,0x04,0x07,0x07,0x05,\r
+ 0x04,0x04,0x07,0x05,0xf7,0x04,0xf7,0xf7,0x04,0x02,0x03,0xf7,0x02,\r
+ 0x03,0x04,0x04,0x04,0x03,0x9b,0x9c,0x9a,0x9d,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x03,0x9f,0x97,0x9b,0x9c,0x9c,0x9d,0x9d,0x9e,0x9e,\r
+ 0x9e,0x99,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x23,0x23,0x23,0x23,0x25,0x27,0x27,0x27,0x25,0x25,0x27,0x27,0x27,\r
+ 0x27,0x2a,0x2a,0x2c,0x2c,0x2a,0x2b,0x2c,0xf6,0x2f,0x2c,0x2b,0x2a,\r
+ 0x9d,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,0x97,0x98,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9c,0x9c,0x99,0x9f,0x97,0x98,0x99,0x9b,0x99,0x9a,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x98,0x98,0x99,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9d,0x99,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x97,0x9b,0x97,0x9f,0x9b,\r
+ 0x98,0x9a,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x99,0x9a,0x9a,0x9a,0x98,0x94,0x9a,0x97,0x94,\r
+ 0x99,0x99,0x98,0x97,0x9c,0x9e,0x9c,0x9c,0x13,0x5b,0x9c,0x9c,0x9c,\r
+ 0x9a,0x9b,0x9b,0x98,0x94,0x9a,0x97,0x94,0x94,0x97,0x98,0x9a,0x9c,\r
+ 0x9d,0x9d,0x9e,0x9f,0x9f,0x9d,0x99,0x94,0x94,0x94,0x94,0x94,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x99,0x9a,0x9a,0x98,0x94,0x94,0x9d,0x9f,\r
+ 0x97,0x98,0x9a,0x9a,0x9a,0x9b,0x9d,0x04,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x05,0x04,0xf7,\r
+ 0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x03,0xf7,0xf7,0x04,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x05,\r
+ 0x06,0x06,0xf7,0xf7,0x04,0x07,0x07,0x05,0x03,0x04,0x07,0x06,0xf7,\r
+ 0x04,0xf7,0xf7,0x04,0x03,0x03,0x02,0xf7,0x03,0x03,0x04,0x04,0x04,\r
+ 0x9a,0x9c,0x9a,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9e,0x9f,0x9f,0x03,\r
+ 0x99,0x99,0x9b,0x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9e,0x99,0x94,0x97,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x25,0x27,0x2c,0x2c,0x2a,0x27,0x29,0x2a,0x2b,0x2c,\r
+ 0x2b,0x2b,0x2b,0x2f,0x2f,0x2e,0x2c,0x2b,0x2a,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9a,0x97,0x99,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,\r
+ 0x99,0x9f,0x97,0x98,0x99,0x9b,0x99,0x9b,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x99,0x99,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9c,0x9b,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9c,0x99,0x9f,0x9e,0x97,0x9a,0x9a,0x9a,0x9a,\r
+ 0x99,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x99,\r
+ 0x9a,0x9a,0x99,0x98,0x99,0x99,0x94,0x94,0x9a,0x99,0x98,0x9a,0x9c,\r
+ 0x9a,0x99,0x99,0x99,0x13,0x9a,0x9d,0x9c,0x9c,0x98,0x94,0x9a,0x94,\r
+ 0x94,0x97,0x99,0x9b,0x9d,0x9d,0x9f,0x9f,0x9e,0x97,0x94,0x94,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x97,0x9a,0x9e,\r
+ 0x9f,0x9f,0x9e,0x9c,0x97,0x94,0x9e,0x9a,0x97,0x98,0x9c,0x9b,0x9b,\r
+ 0x9d,0x9d,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x05,0x02,0x02,0x02,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x02,0xf7,0x02,\r
+ 0x05,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x05,0x06,0x06,0xf7,0xf7,0x04,\r
+ 0x07,0x06,0x04,0x03,0x03,0x07,0x06,0xf7,0x04,0xf7,0xf7,0x04,0x03,\r
+ 0x02,0x02,0xf7,0x03,0x03,0x04,0x04,0x04,0x9c,0x9b,0x9c,0x99,0x9d,\r
+ 0x9a,0x98,0x9d,0x9d,0x9d,0x9e,0x9f,0x03,0x03,0x94,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9e,0x9e,0x9e,0x99,0x94,0x94,0x9f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,\r
+ 0x2e,0x2f,0x2f,0x29,0x28,0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2e,0xf6,\r
+ 0x2f,0x2c,0x2b,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9a,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9c,0x9c,0x9a,0x9e,0x94,0x98,\r
+ 0x9a,0x9a,0x98,0x9c,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x99,0x99,0x9a,0x9b,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,\r
+ 0x99,0x9a,0x9c,0x9a,0x94,0x94,0x94,0x97,0x94,0x94,0x94,0x99,0x9a,\r
+ 0x9c,0x9e,0x9f,0x97,0x9a,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x97,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x99,0x9a,0x9a,0x9a,0x99,0x97,0x9b,\r
+ 0x98,0x94,0x97,0x9a,0x9a,0x9a,0x9c,0x99,0x98,0x97,0x97,0x98,0x16,\r
+ 0x9e,0x9d,0x9a,0x94,0x9b,0x94,0x94,0x98,0x9b,0x9d,0x9e,0x9f,0x9f,\r
+ 0x98,0x94,0x97,0x98,0x97,0x99,0x9c,0x9f,0x03,0x9f,0x9f,0x9d,0x9a,\r
+ 0x99,0x98,0x98,0x98,0x99,0x9a,0x9c,0x9e,0x9f,0x9f,0x9e,0x9a,0x94,\r
+ 0x94,0x9f,0x97,0x97,0x99,0x9c,0x9b,0x9c,0x9d,0x9d,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,\r
+ 0x04,0xf7,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0x05,0x05,0x04,0x04,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0x04,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x04,0x04,0x06,0x06,0x05,0xf7,0xf7,0x05,0x07,0x06,0x04,0x03,0x03,\r
+ 0x07,0x05,0xf7,0x04,0xf7,0xf7,0x04,0x03,0x02,0x03,0xf7,0x02,0x03,\r
+ 0x04,0x04,0x04,0x9d,0x9b,0x9b,0x9c,0x99,0x9d,0x99,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x03,0x9d,0x98,0x9b,0x9b,0x9b,0x9b,0x9c,0x9d,0x9e,\r
+ 0x9e,0x9e,0x99,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x26,0x2d,0x2f,0xf6,0x2c,0x28,\r
+ 0x2a,0x2b,0x2c,0x2b,0x2a,0x2b,0x2c,0xf6,0x2f,0x2c,0x2b,0x2a,0x2a,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9c,0x9c,0x9c,0x9e,0x97,0x98,0x9a,0x9a,0x98,0x9d,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x99,0x99,\r
+ 0x9a,0x9b,0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x99,0x99,0x9a,0x9c,0x99,\r
+ 0x94,0x94,0x97,0x97,0x94,0x97,0x9a,0x9a,0x9c,0x9c,0x9f,0x9b,0x99,\r
+ 0x9b,0x9b,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x99,0x9a,0x9a,0x9a,0x99,0x97,0x9a,0x97,0x94,0x97,0x9a,0x9b,\r
+ 0x9d,0x99,0x97,0x97,0x97,0x97,0x9a,0x9e,0x9d,0x97,0x99,0x9a,0x94,\r
+ 0x98,0x9b,0x9d,0x9f,0x9f,0x97,0x97,0x98,0x99,0x9e,0x02,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9f,0x9c,0x99,0x98,0x97,0x97,\r
+ 0x99,0x99,0x9b,0x9d,0x9d,0x9b,0x97,0x94,0x98,0x9f,0x97,0x97,0x9a,\r
+ 0x9a,0x9a,0x9c,0x9d,0x9b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x04,0x05,0x02,0xf7,0x02,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x07,0x07,0x07,0x06,\r
+ 0xf7,0x02,0x06,0x04,0x03,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x02,0x05,0x03,0x02,0x03,0x04,0x04,0x04,0x05,0x06,0x07,0x04,\r
+ 0xf7,0xf7,0x06,0x07,0x05,0x03,0x02,0x03,0x07,0x04,0xf7,0x04,0xf7,\r
+ 0xf7,0x04,0x03,0x02,0x03,0xf7,0x02,0x03,0x04,0x04,0x05,0x9e,0x9c,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9c,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x03,\r
+ 0x97,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9d,0x9e,0x9e,0x9e,0x9a,0x94,\r
+ 0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x25,0x2c,0x2f,0xf6,0xf6,0x2a,0x29,0x2a,0x2c,0x2b,0x2a,\r
+ 0x2a,0x2c,0xf6,0x2f,0x2e,0x2c,0x2a,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x99,0x9a,0x9a,0x9a,0x9b,0x9c,\r
+ 0x9b,0x9d,0x9e,0x97,0x99,0x9a,0x9a,0x99,0x9e,0x9f,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9a,0x9a,0x9a,0x9b,0x9c,0x2f,0x2f,\r
+ 0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2e,0x2c,0x28,0x26,0xf7,0x2f,0x2f,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x01,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2c,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2e,0xf6,0xf7,0x2a,0xf7,0xf7,0xf7,0x2e,0x2a,0x29,0xf7,0xf7,\r
+ 0x01,0x23,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x23,0x2a,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2a,0x2f,0xf7,0xf7,0x01,0x9a,0x9a,0x9d,0x99,0x94,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,\r
+ 0x05,0x05,0x05,0x06,0x07,0x07,0x07,0x05,0xf7,0x03,0x06,0x03,0x03,\r
+ 0x04,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x05,0xf7,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x03,0xf7,0xf7,0x06,0x07,0x04,\r
+ 0x03,0x02,0x04,0x07,0x03,0xf7,0x02,0xf7,0x02,0x04,0x03,0x02,0x03,\r
+ 0xf7,0x02,0x03,0x03,0x04,0x05,0x9e,0x9d,0x9c,0x9a,0x9c,0x9a,0x9c,\r
+ 0x9b,0x97,0x9d,0x9d,0x9c,0x9e,0x9f,0x9f,0x9f,0x97,0x9a,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9b,0x9c,0x9e,0x9e,0x9f,0x9a,0x94,0x94,0x9f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,0x2f,\r
+ 0xf6,0x01,0x2e,0x2a,0x2a,0x2b,0x2b,0x2b,0x2a,0x2c,0xf6,0x2f,0x2e,\r
+ 0x2c,0x2b,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,\r
+ 0x9c,0x99,0x97,0x99,0x9a,0x9a,0x9b,0x9b,0x9c,0x9b,0x9f,0x9e,0x97,\r
+ 0x99,0x9b,0x9a,0x99,0x9e,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x03,\r
+ 0x03,0x9d,0x9d,0x9d,0x9d,0x9d,0x2e,0x2e,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2e,0x2f,0x02,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2e,0x2b,\r
+ 0x28,0x25,0x02,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf6,0x2a,0x2e,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0x23,0xf7,\r
+ 0xf7,0x01,0x2d,0x27,0xf7,0xf7,0x2c,0x36,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x23,0x27,0x2b,0x2c,0x2a,0x25,0x36,0x35,0x23,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x26,0xf7,\r
+ 0xf7,0x01,0x01,0x99,0x99,0x97,0x94,0x94,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x02,0xf7,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x06,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x06,0x07,\r
+ 0x07,0x07,0x04,0xf7,0x04,0x04,0x02,0x03,0x03,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x04,0x04,0x06,0x06,0xf7,0x04,0x05,0x05,0x06,\r
+ 0x06,0x06,0xf7,0xf7,0x02,0x07,0x06,0x04,0x03,0x02,0x05,0x07,0xf7,\r
+ 0x02,0xf7,0xf7,0x03,0x04,0x03,0x03,0x03,0xf7,0xf7,0x03,0x03,0x04,\r
+ 0x04,0x9e,0x9e,0x9d,0x9c,0x9a,0x9c,0x99,0x9d,0x9a,0x9a,0x9d,0x9d,\r
+ 0x9d,0x9e,0x9f,0x9f,0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,\r
+ 0x9e,0x9f,0x9f,0x9a,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x25,0x25,0x2b,0x2f,0xf6,0x01,0x2f,0x2a,0x2a,\r
+ 0x2b,0x2c,0x2b,0x2a,0x2d,0xf6,0x2f,0x2e,0x2c,0x2b,0x2a,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x99,0x97,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9d,0x9a,0x03,0x9c,0x98,0x99,0x9b,0x99,0x99,\r
+ 0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x99,0x99,0x9a,0x9a,\r
+ 0x9c,0x2e,0x2e,0x2e,0x2f,0x02,0x01,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,\r
+ 0x2f,0x01,0xf7,0x2e,0x2d,0x2e,0x2e,0x2b,0x28,0x25,0x23,0xf7,0x2f,\r
+ 0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf6,0x02,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0x35,0xf7,0xf7,0x01,0x2c,0x2a,0xf7,0xf7,\r
+ 0x36,0x35,0x35,0x35,0x35,0x35,0x23,0x29,0x2d,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0x28,0x35,0x27,0xf7,0xf7,0xf7,0x01,0x2e,0x2c,0x2b,0x2a,\r
+ 0x2f,0xf7,0xf7,0x01,0x2a,0x23,0x2d,0xf7,0x01,0x2f,0xf7,0x97,0x94,\r
+ 0x94,0x94,0x94,0xf7,0x02,0x02,0x02,0xf7,0x02,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x07,0x07,0x07,0x03,0xf7,0x06,\r
+ 0x02,0x02,0x03,0x03,0x02,0x02,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x06,0x06,0x04,0xf7,0x04,0x05,0x06,0x06,0x04,0xf7,0xf7,0x02,\r
+ 0x07,0x06,0x03,0x03,0x02,0x06,0x06,0xf7,0x04,0xf7,0xf7,0x04,0x03,\r
+ 0x03,0x03,0x03,0xf7,0xf7,0x02,0x03,0x03,0x04,0x9e,0x9e,0x9e,0x9d,\r
+ 0x9b,0x9b,0x9c,0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x03,\r
+ 0x97,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,0x9e,0x9e,0x9f,0x9b,\r
+ 0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x25,\r
+ 0x23,0x2a,0xf6,0xf6,0x02,0x2e,0x28,0x2a,0x2c,0x2c,0x2b,0x2b,0x2f,\r
+ 0xf6,0x2f,0x2e,0x2c,0x2b,0x2a,0x2b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x98,0x97,0x9a,0x9a,0x9a,0x9b,0x9c,\r
+ 0x9d,0x99,0x03,0x9a,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x94,0x94,0x94,0x97,0x99,0xf6,0x2e,0x2f,0x2e,\r
+ 0x2f,0x2f,0x01,0x01,0x01,0xf6,0x2f,0x2f,0x2f,0x2d,0xf7,0xf7,0x2e,\r
+ 0x2e,0x2f,0x2b,0x28,0x27,0x25,0x2e,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x02,0xf7,0xf7,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x02,0xf7,0xf7,0xf7,0x01,0xf7,0x27,\r
+ 0x2e,0xf7,0x01,0x2c,0x2c,0xf7,0x2f,0x36,0x35,0x35,0x35,0x36,0x27,\r
+ 0x2c,0x2f,0x02,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0x2a,0x35,0xf7,\r
+ 0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2d,0x27,0x23,0x23,0x25,\r
+ 0x2a,0x2f,0x2f,0x2f,0x2e,0xf7,0x98,0x94,0x94,0x97,0x99,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x03,0xf7,0x03,0xf7,0xf7,0x03,0x04,0x05,0x03,\r
+ 0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x04,\r
+ 0x04,0x06,0x07,0x07,0x06,0x03,0xf7,0x06,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x02,0xf7,0x02,0x03,0x04,0x04,0x04,0x05,0x05,0x03,0x07,0x02,\r
+ 0xf7,0x03,0x04,0x04,0x02,0xf7,0xf7,0x03,0x07,0x06,0x03,0x03,0x02,\r
+ 0x07,0x05,0xf7,0x03,0xf7,0xf7,0x04,0x03,0x03,0x04,0x03,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x9c,0x9e,0x9e,0x9e,0x9c,0x9b,0x9b,0x9b,0x9c,\r
+ 0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x9f,0x97,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9b,0x9d,0x9e,0x9f,0x9b,0x94,0x94,0x9f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x23,0x23,0x2a,0xf6,0xf6,0x2f,\r
+ 0x28,0x28,0x2c,0x2c,0x2c,0x2c,0x2c,0x2f,0xf6,0x2f,0x2e,0x2c,0x2b,\r
+ 0x2a,0x2a,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9c,0x98,0x97,0x9a,0x9a,0x9b,0x9b,0x9c,0x9d,0x99,0x03,0x99,\r
+ 0x98,0x99,0x9b,0x9a,0x99,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,0x94,\r
+ 0x94,0x94,0x94,0x94,0xf7,0x2f,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0xf6,\r
+ 0xf6,0x2f,0x2f,0x02,0x2f,0x2f,0xf7,0x02,0x2f,0x2d,0x2c,0x28,0x28,\r
+ 0x2c,0x36,0xf7,0x2f,0x2e,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x02,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0x2c,0xf7,0xf6,0x2e,0x2a,0xf7,\r
+ 0x2f,0x36,0x35,0x35,0x35,0x27,0x2d,0x2f,0x02,0xf6,0x2f,0x2d,0x2d,\r
+ 0x2e,0x2f,0xf7,0xf7,0xf7,0x23,0x29,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2d,0x2e,0x2f,0x2f,0x2d,0xf7,0xf7,\r
+ 0xf7,0x94,0x94,0x98,0x98,0x98,0x02,0x02,0x03,0x02,0xf7,0x03,0x02,\r
+ 0x03,0x03,0xf7,0x02,0x03,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x06,\r
+ 0x02,0xf7,0x06,0xf7,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x02,0x02,\r
+ 0x04,0x04,0x04,0x05,0x02,0x02,0x07,0x07,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0x03,0x07,0x06,0x04,0x03,0x03,0x07,0x04,0xf7,0x02,0xf7,\r
+ 0x02,0x04,0x04,0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x9a,\r
+ 0x9c,0x9e,0x9e,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x9b,0x98,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9b,0x9d,0x9f,0x9f,0x9c,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x2b,0x02,0xf6,0x2c,0x26,0x2b,0x2d,0x2c,0x2c,\r
+ 0x2c,0x2f,0x2f,0x2f,0x2e,0x2c,0x2c,0x2b,0x2a,0x2a,0x9d,0x9c,0x9c,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9b,0x98,0x97,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x99,0x03,0x98,0x98,0x99,0x9b,0x9a,\r
+ 0x99,0x9a,0x9e,0x9f,0x9f,0x03,0x03,0x97,0x97,0x98,0x99,0x97,0xf7,\r
+ 0x01,0x2e,0x2e,0xf7,0xf7,0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf7,\r
+ 0x2e,0xf6,0xf7,0x2f,0x2f,0x2c,0x2a,0x2a,0xf6,0x2d,0x2a,0xf7,0x2e,\r
+ 0x2e,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,\r
+ 0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,\r
+ 0xf7,0x2e,0xf7,0xf7,0x2f,0x2a,0xf7,0xf7,0x36,0x35,0x35,0x23,0x2c,\r
+ 0x2f,0x2f,0x2f,0x2a,0x2a,0x28,0x28,0x2a,0x2c,0x2f,0xf7,0xf7,0xf6,\r
+ 0x36,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,\r
+ 0x2f,0x2f,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x97,0x97,0x99,\r
+ 0x9b,0x03,0x03,0xf7,0xf7,0x02,0x03,0xf7,0x06,0x03,0xf7,0x03,0x04,\r
+ 0x05,0x04,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x05,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0x05,0xf7,0x02,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x03,0x02,0x03,0x04,0x04,0x04,0xf7,\r
+ 0x02,0x07,0x07,0x05,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x07,0x06,\r
+ 0x04,0x03,0x04,0x07,0x03,0xf7,0x02,0xf7,0x03,0x04,0x04,0x04,0x05,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x9a,0x9a,0x9c,0x9d,0x9e,0x9d,\r
+ 0x9c,0x9a,0x9c,0x9a,0x9d,0x99,0x9b,0x9d,0x9d,0x9d,0x9e,0x9e,0x9f,\r
+ 0x97,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x9a,0x9b,0x9d,0x9f,0x9f,\r
+ 0x9b,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,\r
+ 0x02,0xf6,0x27,0x28,0x2e,0x2e,0x2d,0x2c,0x2e,0x2f,0x2f,0x2e,0x2d,\r
+ 0x2c,0x2c,0x2b,0x2a,0x2b,0x9d,0x9c,0x9c,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9b,0x97,0x97,0x9b,0x9b,0x9a,0x9b,\r
+ 0x9c,0x9c,0x99,0x9f,0x97,0x98,0x98,0x9b,0x9a,0x99,0x99,0x9b,0x9e,\r
+ 0x9f,0x9f,0x94,0x94,0x94,0x94,0x97,0xf7,0xf7,0xf7,0x2f,0x2d,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0x2d,0x01,0x01,0x2f,\r
+ 0x2e,0x2c,0x2c,0xf7,0xf7,0x36,0xf7,0x2f,0x2c,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,0xf7,0x2d,0x02,0xf7,0xf7,\r
+ 0x2f,0x01,0xf7,0xf7,0x01,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x2f,0x2d,\r
+ 0xf7,0xf7,0x35,0x35,0x35,0x27,0x2e,0x2f,0x2e,0x2a,0x27,0x25,0x23,\r
+ 0x25,0x27,0x2a,0x2c,0x02,0xf7,0xf7,0x35,0x2f,0xf7,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0xf6,0x2f,0x2e,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x02,0x03,0x06,0xf7,0x02,0x03,0x04,0x05,0xf7,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x04,0x05,0x07,0x07,0x07,\r
+ 0x07,0x05,0x03,0xf7,0x03,0x04,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x03,0x03,0x03,0x03,0x05,0xf7,0x02,0x07,0x07,0x07,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x06,0x07,0x06,0x04,0x06,0x07,0x04,\r
+ 0xf7,0x02,0xf7,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0x97,0x99,0x9a,0x9c,0x9d,0x9e,0x9d,0x9b,0x9b,0x9c,0x9a,\r
+ 0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,0x9f,0x97,0x9a,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9d,0x9e,0x9f,0x9c,0x94,0x94,0x9f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,0x01,0x2f,0x25,0x2c,0x2f,\r
+ 0x2f,0x2d,0x2e,0x2e,0x2e,0x2e,0x2d,0x2c,0x2c,0x2b,0x2b,0x2a,0x2b,\r
+ 0x9d,0x9c,0x9c,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9a,0x97,0x98,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x98,0x9f,\r
+ 0x98,0x97,0x98,0x9a,0x9b,0x9a,0x99,0x99,0x99,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0xf7,0xf6,0xf7,0xf7,0x01,0x2e,0x01,0xf7,0xf7,0x01,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf7,0x01,0x2f,0x01,0xf6,0x2f,0x2a,0x2f,0xf7,0xf7,\r
+ 0x01,0x27,0xf7,0x2c,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x2f,0x02,0xf7,0x2c,0x01,0xf7,0xf7,0x2f,0x2e,0xf7,0xf7,0x01,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0xf7,0x2d,0x36,0x35,0x27,\r
+ 0x2f,0xf6,0x2c,0x27,0x23,0x36,0x36,0x36,0x25,0x27,0x2a,0x2f,0xf7,\r
+ 0xf7,0x25,0x27,0xf7,0x2d,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0x94,\r
+ 0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x07,0x04,0xf7,\r
+ 0x02,0x04,0x05,0x03,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x02,\r
+ 0x02,0x02,0x03,0x05,0x07,0x07,0x07,0x06,0x05,0x03,0xf7,0xf7,0x04,\r
+ 0x03,0xf7,0xf7,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,\r
+ 0x03,0x06,0x02,0xf7,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0x03,0xf7,0x03,0x04,\r
+ 0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x94,0x94,0x99,\r
+ 0x9a,0x9c,0x9e,0x9e,0x9d,0x9b,0x9b,0x9b,0x9c,0x9c,0x97,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9c,0x99,0x9a,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x9a,0x9a,0x9d,0x9e,0x9f,0x9c,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x25,0x2b,0x01,0x2f,0x26,0x2f,0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,\r
+ 0x2e,0x2d,0x2c,0x2c,0x2b,0x2a,0x2b,0x2b,0x9c,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9c,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,0x97,\r
+ 0x99,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x98,0x9f,0x99,0x97,0x98,0x99,\r
+ 0x9b,0x9b,0x9a,0x99,0x99,0x94,0x94,0x94,0x94,0x97,0xf7,0x2d,0x2e,\r
+ 0x01,0x01,0x01,0x2f,0x2f,0xf7,0xf7,0x01,0xf6,0x2f,0x2f,0x01,0xf7,\r
+ 0x2f,0x02,0x01,0xf6,0x2f,0x2a,0xf7,0xf7,0xf7,0x25,0xf7,0x2f,0x2c,\r
+ 0x2e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0x02,0xf7,0x2a,\r
+ 0xf7,0xf7,0xf7,0x2e,0x2a,0xf7,0xf7,0x01,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2d,0xf7,0xf7,0x35,0x35,0x23,0x2d,0x02,0x2e,0x26,0x36,0x36,\r
+ 0x36,0x36,0x23,0x25,0x29,0x2d,0x01,0xf7,0x2c,0x36,0xf7,0xf7,0x2c,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,\r
+ 0xf7,0x02,0x03,0xf7,0x04,0x07,0xf7,0x02,0x03,0x04,0x05,0xf7,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x05,0x07,0x07,\r
+ 0x06,0x05,0x03,0x02,0xf7,0xf7,0x02,0x05,0x02,0xf7,0xf7,0x04,0x05,\r
+ 0x05,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x03,0x03,0xf7,0x07,\r
+ 0x07,0x07,0x07,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0xf7,0x04,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x05,\r
+ 0x05,0x05,0x05,0x04,0x04,0x9c,0x97,0x94,0x98,0x9a,0x9c,0x9e,0x9e,\r
+ 0x9c,0x9a,0x9c,0x9b,0x9d,0x9a,0x99,0x9d,0x9d,0x9d,0x9d,0x9e,0x9f,\r
+ 0x97,0x99,0x9a,0x9a,0x9a,0x99,0x98,0x98,0x99,0x99,0x9a,0x9d,0x9e,\r
+ 0x9f,0x9b,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x02,0x2f,\r
+ 0x27,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2e,0x2c,0x2c,0x2b,0x2b,\r
+ 0x2b,0x2b,0x2c,0x9c,0x9b,0x9c,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9a,0x97,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9b,0x97,0x9f,0x9c,0x97,0x97,0x98,0x9a,0x9b,0x9c,0x9b,\r
+ 0x94,0x94,0x97,0x97,0x98,0x02,0x2d,0x2f,0x2f,0xf6,0x01,0x02,0x2f,\r
+ 0x2c,0xf7,0xf7,0xf7,0xf6,0x2f,0xf6,0xf7,0xf7,0x2d,0x01,0x01,0x02,\r
+ 0x29,0xf7,0xf7,0xf7,0x02,0x23,0xf7,0x2c,0x2c,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x2f,0x02,0xf7,0x2a,0xf7,0xf7,0xf7,0x2d,0x27,\r
+ 0xf7,0xf7,0x02,0x01,0x02,0xf7,0xf7,0xf7,0x2e,0x2c,0xf7,0xf7,0x35,\r
+ 0x35,0x27,0x2f,0x2f,0x2a,0x23,0x36,0x35,0x36,0x36,0x25,0x28,0x2d,\r
+ 0xf6,0xf7,0xf6,0x35,0x2a,0xf7,0x28,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,0x02,0x03,0x03,0xf7,0x07,\r
+ 0x02,0xf7,0x02,0x04,0x05,0x02,0x02,0x03,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x02,0xf7,0x03,0x07,0x07,0x05,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0xf7,0xf7,0xf7,0x04,0x05,0x05,0x05,0x03,0x02,0x02,\r
+ 0x04,0x04,0x03,0x03,0x02,0x06,0xf7,0x06,0x07,0x07,0x07,0x05,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x05,0xf7,0x06,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x04,\r
+ 0x9b,0x9c,0x99,0x94,0x98,0x9a,0x9d,0x9e,0x9d,0x9c,0x9a,0x9c,0x9a,\r
+ 0x9d,0x99,0x9c,0x9d,0x9c,0x9d,0x9e,0x9e,0x9f,0x97,0x99,0x9a,0x9a,\r
+ 0x99,0x99,0x98,0x98,0x99,0x99,0x9a,0x9d,0x9f,0x9f,0x9b,0x94,0x94,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x28,0xf6,0x01,0x27,0x2f,0x2f,0x2f,0x2e,\r
+ 0x2e,0x2d,0x2d,0x2c,0x2c,0x2b,0x2b,0x2c,0x2c,0x2c,0x2c,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9d,0x9d,0x9c,0x99,0x97,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,0x97,\r
+ 0x9e,0x9d,0x97,0x97,0x97,0x98,0x99,0x99,0x94,0x94,0x97,0x98,0x99,\r
+ 0x2f,0x2f,0x2d,0x2d,0xf6,0x01,0x01,0xf6,0x2d,0x2a,0xf7,0xf7,0x01,\r
+ 0xf6,0xf6,0x02,0xf7,0xf7,0x2f,0x01,0x02,0x02,0x28,0xf7,0xf7,0xf7,\r
+ 0x23,0xf7,0x02,0x2c,0x2d,0x02,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,\r
+ 0x02,0xf7,0x2a,0xf7,0xf7,0xf7,0x2f,0x23,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2e,0x2d,0xf7,0x2a,0x36,0x35,0x27,0x2f,0x2d,0x25,\r
+ 0x36,0x35,0x36,0x36,0x25,0x2a,0x2f,0x02,0x01,0x02,0x35,0x36,0xf7,\r
+ 0xf7,0x25,0xf7,0xf6,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x94,0x94,\r
+ 0x94,0x94,0x02,0x03,0x04,0xf7,0x04,0x04,0xf7,0x02,0x04,0x04,0x04,\r
+ 0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,\r
+ 0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0x06,\r
+ 0x07,0x05,0x02,0xf7,0xf7,0x02,0x03,0x04,0x05,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x05,0x05,0x05,0x04,0x02,0x02,0x03,0x04,0x04,0x03,0x02,\r
+ 0x05,0xf7,0x05,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x06,0x07,0x07,0x07,0x03,0xf7,0x06,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x9d,0x9b,0x9a,0x99,0x94,\r
+ 0x99,0x9b,0x9d,0x9e,0x9d,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9e,0x99,0x9a,0x9a,0x9a,0x99,0x98,0x98,0x98,\r
+ 0x99,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,0x94,0x97,0x9f,0xf7,0xf7,0xf7,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x26,0x2e,0x01,0x2a,0x2c,0x2f,0x2f,0x2e,0x2d,0x2c,0x2c,0x2c,0x2b,\r
+ 0x2b,0x2c,0x2c,0x2d,0x2d,0x2e,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x99,\r
+ 0x97,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9c,0x99,0x99,0x9e,0x9a,0x94,\r
+ 0x97,0x97,0x97,0x99,0x99,0x9a,0x9b,0x9b,0x2e,0x2d,0x2b,0x2c,0x27,\r
+ 0x2e,0xf7,0xf7,0x2f,0x2c,0x2a,0xf7,0xf7,0x01,0xf6,0xf6,0x01,0xf7,\r
+ 0x2f,0xf6,0x01,0x01,0x2a,0xf7,0xf7,0xf7,0x2f,0x36,0xf7,0x2c,0x2b,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x02,0xf7,0x2a,0xf7,0xf7,\r
+ 0xf7,0x2f,0x36,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,\r
+ 0xf7,0x36,0x35,0x35,0x23,0x2a,0x27,0x36,0x35,0x35,0x35,0x36,0x27,\r
+ 0x2e,0xf6,0xf6,0x2f,0x36,0x35,0x27,0xf7,0x2a,0x2c,0xf6,0x2e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x94,0x94,0x94,0x97,0x03,0x04,0x03,\r
+ 0xf7,0x06,0xf7,0xf7,0x03,0x04,0x05,0xf7,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x07,0x06,0x02,0xf7,0x02,0x04,\r
+ 0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,0x05,\r
+ 0x04,0x02,0x02,0x02,0x04,0x04,0x04,0x02,0x02,0x02,0x03,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0x02,0x04,0x03,0x02,0xf7,0x02,0x07,0x07,0x07,\r
+ 0x02,0xf7,0x03,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x9e,0x9d,0x9a,0x99,0x99,0x94,0x9a,0x9b,0x9e,0x9e,\r
+ 0x9d,0x9a,0x9b,0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,\r
+ 0x99,0x99,0x9a,0x9a,0x99,0x98,0x97,0x97,0x98,0x99,0x99,0x9a,0x9d,\r
+ 0x9e,0x9f,0x9b,0x94,0x97,0x9f,0xf7,0xf7,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2a,0x01,0x2f,0x27,\r
+ 0xf6,0x2f,0x2f,0x2c,0x2c,0x2c,0x2c,0x2b,0x2c,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x98,0x97,0x99,0x99,0x99,\r
+ 0x99,0x9a,0x99,0x9c,0x9a,0x97,0x9e,0x9e,0x9b,0x97,0x97,0x99,0x99,\r
+ 0x99,0x9a,0x9c,0x2d,0x2a,0x28,0x2f,0xf7,0x2d,0x27,0xf7,0xf7,0x2f,\r
+ 0x2a,0x2c,0xf7,0xf7,0x01,0xf6,0x02,0xf7,0xf7,0x2e,0x01,0x01,0x01,\r
+ 0x26,0xf7,0xf7,0xf7,0x36,0xf7,0x01,0x2a,0x2c,0xf6,0xf7,0xf7,0xf7,\r
+ 0x02,0x2f,0x2f,0xf6,0xf7,0x2a,0xf7,0xf7,0xf7,0x02,0x36,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0x36,0x35,0x35,0x35,\r
+ 0x23,0x35,0x36,0x25,0x23,0x36,0x36,0x23,0x28,0x2a,0x27,0x36,0x35,\r
+ 0x35,0xf7,0xf7,0x25,0x2f,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x94,0x94,0x97,0x97,0x99,0x04,0x04,0xf7,0x05,0xf7,0xf7,0x02,0x04,\r
+ 0x05,0x02,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x02,\r
+ 0x02,0x04,0x07,0x04,0xf7,0x02,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,0x05,0x05,0x03,0x02,0x02,0x04,\r
+ 0x05,0x05,0x03,0xf7,0x05,0xf7,0x07,0x07,0x07,0x07,0xf7,0xf7,0x03,\r
+ 0x06,0x06,0x05,0x02,0xf7,0x03,0x07,0x07,0x02,0xf7,0x02,0x05,0x04,\r
+ 0x03,0x04,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x99,0x9e,\r
+ 0x9d,0x9a,0x99,0x97,0x97,0x9a,0x9d,0x9e,0x9e,0x9c,0x9a,0x9c,0x9b,\r
+ 0x9d,0x9a,0x9a,0x9d,0x9d,0x9d,0x9d,0x9e,0x9f,0x94,0x99,0x9a,0x9a,\r
+ 0x99,0x98,0x97,0x97,0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,0x94,\r
+ 0x97,0x9f,0xf7,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x27,0x2f,0x01,0x28,0x2f,0xf6,0x2f,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2b,0x2c,0x2f,0x2f,0x2f,0x2f,0x2f,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9d,0x9d,0x9d,0x9b,0x98,0x97,0x99,0x98,0x98,0x98,0x9b,0x99,0x9b,\r
+ 0x9b,0x99,0x99,0x9f,0x9f,0x9f,0x94,0x94,0x94,0x97,0x9a,0x2c,0x28,\r
+ 0x27,0xf7,0xf7,0xf7,0xf7,0x23,0xf7,0xf7,0x2f,0x2c,0x2f,0xf7,0xf7,\r
+ 0x02,0xf6,0x01,0xf7,0xf6,0x2f,0x01,0x01,0x2a,0xf7,0xf7,0xf7,0x2a,\r
+ 0x36,0xf7,0x2c,0x2a,0x2e,0x01,0x01,0x01,0x02,0x2f,0x2f,0xf6,0xf7,\r
+ 0x2a,0xf7,0xf7,0xf7,0x01,0x36,0x02,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2e,0xf7,0xf7,0x36,0x35,0x35,0x35,0x35,0x25,0x2d,0x02,0x2e,\r
+ 0x2a,0x23,0x35,0x36,0x35,0x35,0x35,0x36,0x2f,0xf7,0xf6,0x2c,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x98,0x99,0x9e,\r
+ 0x04,0xf7,0x04,0x02,0xf7,0x02,0x04,0x05,0x04,0xf7,0x02,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x04,0x03,0x03,0x03,0x02,0x02,0x06,0x07,0x02,0xf7,\r
+ 0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x05,0x05,0x05,0x04,0x02,0x02,0x04,0x05,0x05,0x04,0xf7,0x06,\r
+ 0xf7,0x07,0x07,0x07,0x07,0x02,0xf7,0x04,0x07,0x06,0x06,0x06,0x03,\r
+ 0xf7,0x05,0x06,0x02,0x02,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0xf7,0xf7,0x97,0x97,0x9d,0x9c,0x99,0x99,0x94,\r
+ 0x98,0x9a,0x9e,0x9e,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x98,0x9d,0x9d,\r
+ 0x9c,0x9d,0x9e,0x9f,0x9f,0x98,0x99,0x9a,0x9a,0x98,0x98,0x98,0x97,\r
+ 0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,0x94,0x97,0x9f,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x2a,0x02,0x2f,0x28,0xf6,0x2f,0x2d,0x2a,0x2a,0x2b,0x2a,0x2c,0x2f,\r
+ 0xf6,0xf6,0x2f,0x2f,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9a,\r
+ 0x97,0x97,0x98,0x98,0x97,0x98,0x9a,0x9a,0x9a,0x9c,0x9b,0x9a,0x98,\r
+ 0x99,0x9a,0x9a,0x9c,0x9f,0x03,0x28,0x27,0x27,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x23,0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x2e,0x02,0x01,0xf7,0x25,0xf7,0xf7,0x01,0x35,0x2f,0xf7,0x2a,0x2a,\r
+ 0x2f,0x01,0x01,0xf6,0x2f,0x2f,0xf6,0xf7,0x29,0xf7,0xf7,0xf7,0xf7,\r
+ 0x35,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x01,0xf7,0x36,\r
+ 0x35,0x35,0x35,0x26,0x01,0xf7,0xf7,0xf7,0xf7,0x2e,0x23,0x35,0x35,\r
+ 0x35,0x35,0x23,0xf7,0xf7,0x2c,0x2e,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x97,0x98,0x9a,0x9e,0x9d,0xf7,0x03,0x02,0xf7,0x02,\r
+ 0x04,0x04,0x05,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,\r
+ 0x03,0x03,0x03,0x03,0x07,0x06,0xf7,0x02,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x05,0x04,\r
+ 0x02,0x02,0x03,0x05,0x05,0x05,0xf7,0x03,0xf7,0x06,0x07,0x07,0x07,\r
+ 0x03,0xf7,0x05,0x06,0x06,0x06,0x06,0x05,0x03,0xf7,0x07,0x03,0x06,\r
+ 0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x05,0x06,0x06,0x05,\r
+ 0x04,0x97,0x94,0x97,0x9c,0x9b,0x98,0x9a,0x94,0x9a,0x9c,0x9f,0x9f,\r
+ 0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,\r
+ 0x9b,0x99,0x99,0x9b,0x99,0x98,0x98,0x98,0x97,0x97,0x98,0x99,0x9a,\r
+ 0x9d,0x9e,0x9f,0x9b,0x94,0x97,0x27,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x26,0x2d,0x01,0x2a,0x2f,\r
+ 0xf6,0x2f,0x2b,0x2a,0x2a,0x2a,0x2b,0x2f,0x02,0xf6,0x2f,0x2f,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9a,0x97,0x97,0x98,0x98,\r
+ 0x98,0x99,0x9a,0x9a,0x9b,0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9d,0x2a,0x26,0x36,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0xf7,0xf7,\r
+ 0x2f,0x2c,0xf7,0xf7,0x01,0xf6,0x01,0xf7,0x01,0x2f,0x01,0x01,0x2c,\r
+ 0xf7,0xf7,0xf7,0x27,0x35,0xf7,0x2c,0x2a,0x2c,0x2f,0x02,0x2f,0x2e,\r
+ 0x2f,0x02,0xf7,0x29,0xf7,0x01,0xf7,0xf7,0x35,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x2e,0x2d,0xf7,0x35,0x35,0x35,0x25,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x36,0x35,0x35,0x35,0xf7,0xf7,0x2a,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x9a,\r
+ 0x9f,0x9d,0x94,0x03,0x03,0xf7,0x02,0x04,0x04,0x05,0xf7,0x02,0x05,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x07,\r
+ 0x06,0xf7,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x04,0x05,0x05,0x04,0x05,0x03,0x02,0x03,0x05,0x05,\r
+ 0x05,0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x04,0xf7,0x05,0x06,0x06,\r
+ 0x06,0x05,0x05,0x04,0x02,0x02,0x07,0x06,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x06,0x06,0x03,0x02,0x02,0x03,0x9f,0x99,0x94,0x97,\r
+ 0x9d,0x9a,0x98,0x97,0x97,0x9a,0x9d,0x9f,0x9e,0x9d,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9b,0x97,0x9d,0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x9a,\r
+ 0x99,0x98,0x98,0x99,0x98,0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9b,\r
+ 0x94,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x28,0x2f,0x01,0x27,0xf6,0xf6,0x2e,0x2a,0x2a,\r
+ 0x2a,0x2a,0x2e,0x02,0x02,0x2f,0x2f,0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9a,0x98,0x97,0x98,0x99,0x99,0x9a,0x9a,0x9b,\r
+ 0x9c,0x9d,0x9d,0x9d,0x97,0x97,0x97,0x97,0x94,0xf7,0xf7,0xf7,0x27,\r
+ 0x36,0x2f,0xf7,0xf7,0xf7,0xf7,0x27,0xf7,0x01,0xf6,0x2e,0xf7,0xf7,\r
+ 0xf6,0xf6,0xf7,0xf7,0x2e,0xf6,0x01,0xf7,0x25,0xf7,0xf7,0x2f,0x35,\r
+ 0x2e,0xf7,0x2a,0x2a,0x2e,0x2f,0x2f,0x2e,0x2f,0x02,0xf7,0x29,0xf7,\r
+ 0x01,0xf7,0xf7,0x35,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2d,\r
+ 0x28,0xf7,0x36,0x35,0x36,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2a,0x35,0x35,0x2f,0xf7,0x28,0x2e,0xf6,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9a,0x9f,0x9c,0x94,0x9c,0x02,0xf7,\r
+ 0x02,0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0xf7,0x04,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,\r
+ 0x05,0x05,0x05,0x04,0x03,0x03,0x04,0x04,0x05,0x03,0xf7,0x04,0x03,\r
+ 0x07,0x07,0x07,0x06,0xf7,0x05,0x06,0x06,0x05,0x05,0x05,0x04,0x04,\r
+ 0xf7,0x05,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x94,0x9b,0x9a,0x94,0x97,0x9d,0x99,0x99,0x94,\r
+ 0x99,0x9b,0x9f,0x9f,0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,0x9a,0x9a,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9e,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x98,0x99,0x99,\r
+ 0x98,0x97,0x98,0x99,0x9a,0x9d,0x9e,0x9f,0x9a,0xf7,0x2f,0x27,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,\r
+ 0x2b,0x01,0x2f,0x2a,0xf6,0x2f,0x2b,0x2a,0x2a,0x2a,0x2c,0x2f,0x01,\r
+ 0xf6,0x2f,0x9a,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9b,0x98,0x97,0x98,0x9a,0x9b,0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x94,\r
+ 0x94,0x97,0x97,0x98,0xf7,0x01,0x01,0xf7,0xf7,0x23,0x27,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2f,0x01,0x01,0x2f,0xf6,0xf7,0x01,0x2f,0x01,0xf7,0x01,\r
+ 0x2f,0x01,0xf7,0x2c,0xf7,0xf7,0xf7,0x36,0x35,0xf7,0x2c,0x2a,0x2b,\r
+ 0x2d,0x2e,0x2d,0x2f,0x01,0xf7,0x28,0xf7,0x01,0xf7,0xf7,0x36,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0x2e,0x27,0xf7,0x23,0x35,0xf6,\r
+ 0xf7,0xf7,0x2f,0x27,0x25,0x28,0x2f,0xf7,0xf7,0xf7,0x36,0x36,0xf7,\r
+ 0x27,0x2d,0xf7,0xf7,0x2f,0x25,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x9f,0x9a,0x94,0x9e,0x97,0xf7,0x02,0x04,0x04,0x05,0xf7,0x02,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x02,0x03,0x02,0xf7,0x02,0x04,0x04,0x04,0x04,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x05,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0xf7,0x06,0x02,0x07,0x07,0x07,0x07,0xf7,\r
+ 0x04,0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x03,0xf7,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x05,0x04,0xf7,0xf7,0xf7,0xf7,0x04,0x05,0x04,0x99,\r
+ 0x94,0x9a,0x99,0x94,0x99,0x9c,0x98,0x9a,0x94,0x9a,0x9c,0x9f,0x9f,\r
+ 0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9e,0x9f,\r
+ 0x9e,0x98,0x99,0x9b,0x99,0x98,0x99,0x9a,0x9a,0x98,0x97,0x98,0x99,\r
+ 0x9a,0x9d,0x9e,0x9f,0x2e,0xf7,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x2d,0x01,0x2a,0x2f,\r
+ 0xf6,0x2f,0x2a,0x2a,0x2a,0x2a,0x2f,0x01,0x02,0x2f,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9b,0x99,0x97,0x97,\r
+ 0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x97,0x97,0x97,0x98,0x99,0xf7,\r
+ 0x01,0xf6,0x2f,0xf6,0xf7,0x29,0x2a,0xf7,0xf7,0xf7,0x27,0x02,0x02,\r
+ 0x01,0x2f,0x01,0xf7,0xf6,0xf6,0xf7,0xf7,0x2e,0x02,0x01,0xf7,0x25,\r
+ 0xf7,0xf7,0x2b,0x35,0xf6,0xf7,0x2a,0x2a,0x2c,0x2c,0x2c,0x2f,0x01,\r
+ 0xf7,0x28,0xf7,0x02,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0xf7,0x2c,\r
+ 0xf7,0xf7,0x2f,0x29,0x01,0x27,0x27,0xf7,0xf7,0x28,0x23,0x36,0x36,\r
+ 0x23,0x25,0x28,0x01,0xf7,0x2a,0x26,0x26,0x2c,0x2f,0xf7,0xf7,0x36,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x99,0x97,0x9e,0x94,\r
+ 0x94,0x02,0x04,0x04,0x05,0xf7,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x05,0x04,0x02,0x02,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x02,\r
+ 0x02,0x03,0xf7,0x02,0x04,0x04,0x05,0x05,0x04,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0xf7,0x04,0xf7,0x07,0x07,0x07,0x07,0xf7,0x02,0x06,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x03,0x02,0x03,0x05,0x05,0x04,0x05,0x05,0x05,0x03,\r
+ 0xf7,0xf7,0x02,0x06,0x07,0x07,0x07,0x03,0x9b,0x94,0x9b,0x97,0x94,\r
+ 0x9d,0x9a,0x98,0x97,0x97,0x9a,0x9e,0x9f,0x9f,0x9e,0x9b,0x9a,0x9c,\r
+ 0x9b,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x99,0x99,0x99,0x9b,\r
+ 0x99,0x98,0x9a,0x9b,0x9a,0x99,0x97,0x98,0x99,0x9a,0x9d,0x9f,0x2a,\r
+ 0x2f,0xf7,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x28,0x2f,0x01,0x27,0xf6,0xf6,0x2d,0x29,0x29,\r
+ 0x2a,0x2a,0xf6,0x01,0x2f,0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x9a,0x98,0x97,0x9a,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9c,0x97,0x97,0x97,0x98,0x99,0xf7,0x01,0x02,0x2f,0x2f,0x2f,\r
+ 0xf7,0x2a,0x2f,0xf7,0xf7,0xf7,0x2a,0x2f,0x02,0x01,0x2e,0xf7,0x01,\r
+ 0x2f,0x01,0xf7,0x2f,0xf6,0x01,0x01,0x28,0xf7,0xf7,0xf7,0x36,0x36,\r
+ 0xf7,0x2a,0x2a,0x2a,0x2c,0x2c,0x2e,0xf7,0xf7,0x28,0xf7,0xf6,0xf7,\r
+ 0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0x01,0x28,0xf7,0xf7,0x2f,0x2a,0x2a,\r
+ 0x36,0xf7,0xf7,0x29,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x2a,0xf7,\r
+ 0xf7,0x23,0x29,0x01,0xf7,0xf7,0x2c,0xf7,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2e,0xf7,0x9a,0x9f,0x94,0x94,0x99,0x04,0x05,0x05,0xf7,\r
+ 0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x06,0x02,0x02,0x03,\r
+ 0x04,0x04,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xf7,0x03,0xf7,0x07,0x07,\r
+ 0x07,0x07,0x03,0xf7,0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x03,0x03,\r
+ 0xf7,0x05,0x05,0x05,0x05,0x06,0x04,0xf7,0x02,0x02,0x06,0x07,0x07,\r
+ 0x07,0x07,0xf7,0x02,0x9b,0x94,0x9e,0x94,0x97,0x9d,0x99,0x99,0x94,\r
+ 0x99,0x9c,0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9c,0x9b,0x97,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x99,0x9b,0x9c,\r
+ 0x9c,0x99,0x97,0x98,0x99,0x9a,0x9d,0x2a,0x2a,0x2f,0xf7,0x2f,0x26,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x2a,0x02,0x2f,0x29,0x02,0xf6,0x2c,0x29,0x29,0x29,0x2d,0x01,0xf6,\r
+ 0x99,0x9a,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9b,0x99,0x97,0x99,0x9c,0x9c,0x9c,0x9c,0x97,0x97,0x97,\r
+ 0x98,0x99,0x01,0x02,0x02,0x02,0x2f,0x2f,0x2f,0xf7,0x23,0x01,0xf7,\r
+ 0x2e,0x2c,0x2e,0x2f,0xf7,0x2f,0x2d,0x2f,0x2f,0x2f,0xf7,0x2f,0xf6,\r
+ 0x01,0x01,0x02,0x2d,0xf7,0xf7,0x26,0x35,0xf7,0x2f,0x2a,0x2a,0x2b,\r
+ 0x2c,0x2e,0xf7,0xf7,0x28,0xf7,0xf6,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,\r
+ 0xf7,0x01,0x25,0xf7,0xf7,0x2f,0x2a,0x25,0x36,0xf7,0x2f,0x28,0x27,\r
+ 0x2a,0x2f,0xf6,0x2f,0x2b,0x2a,0x2c,0x2f,0xf7,0x28,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0x2f,0x03,\r
+ 0x94,0x94,0x99,0x9d,0x05,0x04,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x07,0x07,\r
+ 0x07,0x07,0x05,0xf7,0x06,0x02,0x02,0x02,0x03,0x04,0x04,0x04,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0xf7,0x02,0xf7,0x06,0x07,0x07,0x07,0x05,0xf7,0x05,\r
+ 0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x06,0x06,0x06,\r
+ 0x04,0x02,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0x02,\r
+ 0x99,0x94,0x9c,0x94,0x9a,0x9b,0x98,0x99,0x94,0x9a,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,0x9a,0x9a,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9c,0x9d,0x9c,0x99,0x97,0x98,\r
+ 0x99,0x9a,0x2a,0x2a,0x2a,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x2c,0x01,0x2e,0x2c,\r
+ 0x02,0x2f,0x2a,0x29,0x29,0x2a,0x2f,0x01,0x98,0x9a,0x9b,0x9c,0x9c,\r
+ 0x9c,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9b,0x9a,\r
+ 0x99,0x99,0x9b,0x9c,0x9c,0x97,0x97,0x97,0x99,0x9a,0xf6,0xf6,0xf6,\r
+ 0x02,0x02,0xf6,0x2f,0x2f,0xf7,0x36,0x2a,0x27,0x2a,0x2d,0x2e,0x2e,\r
+ 0xf7,0x2f,0x2e,0x2f,0x2e,0x2f,0x2f,0x2f,0xf7,0x02,0x01,0x25,0xf7,\r
+ 0xf7,0x2e,0x35,0xf6,0xf7,0x2a,0x2a,0x2a,0x2c,0x2e,0xf7,0xf6,0x27,\r
+ 0xf7,0x2f,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0x01,0x23,0xf7,0xf7,\r
+ 0x2f,0x2d,0x25,0x28,0xf7,0x2c,0x2a,0x2e,0x01,0xf7,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0xf6,0xf7,0x2d,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x36,0x94,0x97,0x99,0x9d,0x9f,0x04,\r
+ 0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x05,0xf7,0x02,\r
+ 0x05,0x02,0x02,0x03,0x03,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0xf7,0xf7,\r
+ 0xf7,0x05,0x07,0x07,0x07,0x07,0xf7,0x02,0x06,0x06,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x03,0xf7,0x05,0x07,0x05,0x03,0x02,0x03,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x03,0x94,0x99,0x97,0x94,\r
+ 0x9d,0x9a,0x99,0x94,0x98,0x9b,0x9f,0x9f,0x9f,0x9e,0x9c,0x9a,0x9c,\r
+ 0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x9e,0x98,0x99,0x9b,\r
+ 0x99,0x98,0x9b,0x9d,0x9e,0x9c,0x99,0x97,0x98,0x99,0x2e,0x2a,0x2a,\r
+ 0x2a,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x27,0x2e,0x01,0x2a,0x2f,0xf6,0x2f,0x2a,0x29,\r
+ 0x2a,0x2a,0x02,0x94,0x99,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9d,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x97,0x97,0x97,0x99,0x9a,0x2f,0xf6,0x02,0x01,0x01,0x01,0x02,0x2f,\r
+ 0x2f,0xf7,0x23,0x27,0x2a,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2d,0x2f,0x01,0x02,0x02,0x27,0xf7,0xf7,0xf7,0x36,0x25,0xf7,\r
+ 0x2c,0x2a,0x2a,0x2c,0x2e,0xf7,0x2f,0x27,0xf7,0x2f,0xf7,0xf7,0x36,\r
+ 0x2e,0xf7,0xf7,0xf7,0x01,0x23,0xf7,0xf7,0x2f,0xf6,0x27,0x02,0x01,\r
+ 0x2c,0x2d,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,\r
+ 0x36,0x2f,0x94,0x99,0x9d,0x9f,0x9b,0xf7,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x03,\r
+ 0xf7,0xf7,0x05,0x07,0x07,0x05,0xf7,0x02,0x06,0x03,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x04,\r
+ 0x04,0x04,0x03,0x03,0x03,0x04,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,\r
+ 0x07,0x02,0xf7,0x04,0x06,0x06,0x06,0x05,0x05,0x04,0x04,0x03,0xf7,\r
+ 0x03,0x07,0x06,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x02,0xf7,0xf7,0xf7,0x9e,0x94,0x9f,0x94,0x97,0x9d,0x99,0x9a,0x94,\r
+ 0x9a,0x9d,0x9f,0x03,0x9f,0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9f,0x9a,0x99,0x99,0x9a,0x99,0x99,0x9c,0x9e,\r
+ 0x9e,0x9c,0x99,0x97,0x98,0x2f,0x2e,0x2a,0x2a,0x2a,0x2f,0xf7,0x2f,\r
+ 0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x27,0x2f,0x01,0x28,0xf6,0xf6,0x2d,0x29,0x2a,0x29,0x2c,0x94,0x97,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9c,0x9d,0x9c,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9d,0x9d,0x9a,0x99,0x99,0x9a,0x9a,0x9a,0x97,0x97,0x97,0x99,0x9a,\r
+ 0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0x01,0x02,0xf6,0xf7,0x27,0x27,0x2c,\r
+ 0x2e,0x2f,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,\r
+ 0x2f,0x2b,0xf7,0xf7,0xf7,0x27,0x36,0xf7,0x2f,0x2a,0x2a,0x2c,0x2e,\r
+ 0xf7,0x2f,0x27,0xf7,0x2f,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,0xf7,0x01,\r
+ 0x36,0xf7,0xf7,0x2f,0xf7,0x27,0xf7,0x2f,0x2e,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2d,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x27,0xf7,0x9a,0x9d,0x9e,\r
+ 0x9c,0x97,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,\r
+ 0xf7,0xf7,0xf7,0x02,0x05,0x06,0x06,0x06,0x04,0xf7,0xf7,0x07,0x07,\r
+ 0x06,0x02,0xf7,0x03,0x06,0x02,0x02,0x02,0x03,0x03,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x05,0x04,0x04,0x03,0x04,0x04,\r
+ 0x03,0xf7,0x02,0xf7,0x05,0x07,0x06,0x07,0x07,0x05,0xf7,0xf7,0x05,\r
+ 0x06,0x06,0x06,0x05,0x05,0x04,0x03,0xf7,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0xf7,0xf7,0x01,\r
+ 0x9a,0x94,0x9a,0x94,0x9b,0x9c,0x99,0x98,0x97,0x9a,0x9f,0x03,0x9f,\r
+ 0x9f,0x9d,0x9a,0x9a,0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9c,\r
+ 0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9a,0x9e,0x9f,0x9e,0x9d,0x99,0x97,\r
+ 0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x29,0x2f,0x02,0x28,\r
+ 0x02,0xf6,0x2b,0x29,0x2a,0x2a,0x99,0x94,0x98,0x9a,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x9c,0x9d,0x9c,0x9c,0x9c,0x9c,0x9a,0x9a,0x9b,0x9d,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x97,0x97,0x97,0x99,0x9a,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x01,0xf7,0x28,0x02,0x2e,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2d,0x2e,0xf7,0xf7,\r
+ 0x2e,0x35,0xf7,0xf6,0x2a,0x2a,0x2c,0x2e,0xf7,0x2c,0x27,0xf7,0x2f,\r
+ 0xf7,0xf7,0x23,0x2e,0xf7,0xf7,0xf7,0x01,0x36,0xf7,0xf7,0x2f,0xf7,\r
+ 0x28,0xf7,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0x25,0xf7,0xf7,0x9b,0x9d,0x9e,0x94,0x97,0x05,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0x03,0x06,\r
+ 0x06,0x06,0x06,0x06,0x04,0xf7,0x03,0x07,0x07,0x02,0xf7,0xf7,0x06,\r
+ 0x04,0x02,0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0xf7,0xf7,0x02,0xf7,0x05,\r
+ 0x07,0x05,0x06,0x07,0x07,0x02,0xf7,0xf7,0x04,0x05,0x06,0x05,0x05,\r
+ 0x04,0x02,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0x03,0x03,0xf7,0xf7,0x03,0x94,0x9b,0x97,0x97,\r
+ 0x9e,0x9b,0x9a,0x94,0x99,0x9c,0x9f,0x03,0x9f,0x9f,0x9d,0x9a,0x9b,\r
+ 0x9b,0x9d,0x9a,0x9a,0x9d,0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,\r
+ 0x99,0x98,0x9b,0x9e,0x9f,0x9f,0x9e,0x99,0x2f,0x2f,0x2f,0x2d,0x2a,\r
+ 0x2a,0x2a,0x2f,0xf7,0x2e,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x2a,0x01,0x2f,0x2a,0x02,0xf6,0x2a,0x2a,\r
+ 0x2a,0x9e,0x97,0x94,0x99,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9c,0x9c,\r
+ 0x9c,0x9b,0x99,0x9a,0x9d,0x9d,0x9b,0x9a,0x9a,0x9a,0x9a,0x97,0x97,\r
+ 0x98,0x99,0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,\r
+ 0xf7,0x2c,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2e,0x2e,0x2c,0xf7,0xf7,0x01,0x35,0xf7,0xf7,0x2a,\r
+ 0x2a,0x2c,0x2f,0xf7,0x2a,0x27,0x01,0x2f,0xf7,0xf7,0x23,0x2e,0xf7,\r
+ 0xf7,0xf7,0x01,0x36,0xf7,0xf7,0xf6,0xf7,0x29,0xf7,0xf6,0x2f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0x2c,0x2c,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0xf7,0xf7,\r
+ 0x9c,0x9f,0x94,0x97,0x9d,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0xf7,0xf7,0xf7,0x04,0x06,0x06,0x06,0x06,0x06,0x05,\r
+ 0x04,0xf7,0x06,0x07,0x03,0x02,0xf7,0x02,0x06,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0x04,0xf7,0x06,0x07,0x04,0x04,0x07,0x07,\r
+ 0x05,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,0xf7,0xf7,0xf7,0x02,0x05,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x03,\r
+ 0x03,0x01,0xf7,0xf7,0x9d,0x94,0x9f,0x94,0x98,0x9e,0x9c,0x9b,0x94,\r
+ 0x9a,0x9d,0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x9c,0x9a,0x9d,0x99,0x9c,\r
+ 0x9d,0x9c,0x9d,0x9d,0x9f,0x9f,0x98,0x99,0x9b,0x99,0x99,0x9d,0x9f,\r
+ 0x9f,0x9f,0x9e,0x2e,0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,0xf7,\r
+ 0x2e,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x25,0x2c,0x01,0x2c,0x2e,0x02,0x2f,0x2a,0x2a,0x9e,0x9d,0x94,0x97,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9b,0x99,0x99,0x9c,\r
+ 0x9d,0x9c,0x9a,0x9a,0x9a,0x9a,0x97,0x97,0x98,0x99,0x9b,0x2f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,\r
+ 0x2c,0x2a,0xf7,0xf7,0x35,0xf7,0xf7,0x2c,0x2a,0x2c,0x2f,0xf7,0x2a,\r
+ 0x27,0x01,0x2f,0xf7,0xf7,0x25,0x2f,0xf7,0xf7,0xf7,0xf7,0x36,0xf7,\r
+ 0xf7,0x02,0xf7,0x2a,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2a,0x2c,0x2d,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0x2f,0x9d,0x99,0x97,0x98,0xf7,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,\r
+ 0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,\r
+ 0xf7,0x04,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x02,0x02,0x07,0x05,\r
+ 0x02,0xf7,0xf7,0x04,0x06,0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0x07,0x06,0x03,0x03,0x05,0x07,0x07,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x01,0x02,0x01,0xf7,0xf7,0x01,\r
+ 0x9a,0x94,0x9c,0x97,0x9c,0x9e,0x9d,0x97,0x97,0x9b,0x9f,0x9f,0x03,\r
+ 0x9f,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9f,0x9a,0x99,0x99,0x9a,0x98,0x99,0x9e,0x9f,0x9f,0x9f,0x2a,0x2d,\r
+ 0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,0xf7,0x2c,0x25,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x2d,0x01,0x2a,\r
+ 0x2f,0x02,0x2f,0x2a,0x9e,0x9e,0x9b,0x94,0x99,0x9a,0x9b,0x9c,0x9c,\r
+ 0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9b,0x99,0x99,0x9b,0x9d,0x9c,0x9a,0x9a,0x9a,\r
+ 0x9a,0x97,0x97,0x98,0x9a,0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf6,0x36,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x28,0x01,0xf7,0x36,\r
+ 0xf7,0x01,0x2b,0x2b,0x2c,0x2f,0xf7,0x28,0x27,0x02,0x2f,0xf7,0xf7,\r
+ 0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0x35,0xf7,0xf7,0x01,0xf7,0x2a,0xf7,\r
+ 0x01,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2e,0x2a,0x2c,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0x02,\r
+ 0xf7,0xf7,0x2f,0x9f,0x94,0x97,0x03,0x01,0x07,0x07,0x07,0x07,0x06,\r
+ 0x05,0x05,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,0x03,0x06,0x06,0x06,\r
+ 0x06,0x05,0x05,0x05,0x04,0xf7,0x06,0x07,0x03,0x02,0xf7,0x02,0x06,\r
+ 0x05,0x02,0x02,0x02,0x02,0xf7,0xf7,0x02,0x04,0x05,0x05,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0xf7,0x03,0x07,0x04,0x02,\r
+ 0x03,0x04,0x06,0x07,0x07,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x97,0x9b,0x98,0x97,\r
+ 0x9e,0x9f,0x9e,0x94,0x99,0x9c,0x9f,0x03,0x9f,0x9f,0x9e,0x9b,0x9a,\r
+ 0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x97,0x99,0x9a,\r
+ 0x9a,0x98,0x9a,0x9f,0x9f,0x9f,0x28,0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,\r
+ 0x2a,0x2a,0x2a,0x2f,0xf7,0x2d,0x25,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x27,0x2f,0x01,0x28,0x02,0xf6,0x2c,0x9f,\r
+ 0x9e,0x9e,0x98,0x94,0x99,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,\r
+ 0x99,0x99,0x9a,0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x97,0x97,0x98,0x9a,\r
+ 0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,0xf6,0xf7,0xf7,\r
+ 0x01,0xf7,0xf7,0xf7,0x2c,0x25,0xf7,0x01,0xf7,0xf7,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2d,0x2a,0x29,0x2f,0x23,0xf7,0x2f,0x2b,0x2b,0x2c,\r
+ 0x2f,0xf7,0x28,0x27,0xf6,0x2f,0xf7,0xf7,0x27,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0x35,0xf7,0xf7,0xf7,0xf7,0x2c,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0xf6,0x2b,\r
+ 0x2a,0x2c,0x2d,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x99,0x94,\r
+ 0x98,0xf7,0x01,0x07,0x07,0x07,0x06,0x05,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x04,0xf7,0xf7,0xf7,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x05,\r
+ 0x02,0x02,0x07,0x05,0x02,0x02,0xf7,0x02,0x06,0x05,0x02,0x02,0x02,\r
+ 0x02,0x03,0x04,0x06,0x05,0x04,0x04,0x05,0x05,0x03,0x02,0x02,0x02,\r
+ 0x03,0x03,0xf7,0xf7,0x06,0x07,0x02,0x02,0x03,0x03,0x04,0x06,0x07,\r
+ 0x07,0x05,0x03,0x03,0x02,0x03,0x04,0x04,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x9e,0x94,0x03,0x97,0x98,0x9e,0x9f,0x9e,0x94,\r
+ 0x9a,0x9d,0x9f,0x03,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9a,0x98,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x99,0x98,0x9d,0x9f,\r
+ 0x9f,0x27,0x28,0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,0x2a,0x2f,\r
+ 0xf7,0x2d,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x28,0x2f,0x01,0x28,0x02,0xf6,0x9e,0x9e,0x9e,0x9e,0x94,0x97,\r
+ 0x9a,0x9b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x9c,0x9a,0x98,0x9a,0x9d,0x9c,\r
+ 0x9b,0x9a,0x9a,0x9a,0x98,0x98,0x99,0x9a,0x9b,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0x01,0xf7,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2a,\r
+ 0x26,0x28,0x2c,0xf7,0x2e,0x2b,0x2b,0x2c,0x2f,0xf7,0x27,0x27,0x2f,\r
+ 0x2f,0xf7,0xf7,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0x36,0x02,0xf7,0xf7,\r
+ 0xf7,0x2c,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf6,0x2a,0x2a,0x2c,0x2d,0x2f,0x2f,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0x2e,0xf7,0xf7,0x2f,0x2c,0x94,0x97,0x03,0xf7,0xf7,0x07,0x07,\r
+ 0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x06,\r
+ 0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,\r
+ 0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0xf7,0x07,0x07,0x03,\r
+ 0x02,0xf7,0xf7,0x03,0x06,0x06,0x04,0x03,0x04,0x05,0x06,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0x04,0x07,\r
+ 0x05,0xf7,0x02,0x03,0x03,0x03,0x05,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0x97,0x97,0x02,0x98,0x99,0x9e,0x9e,0x9a,0x97,0x9a,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9d,0x9a,0x9c,0x9b,0x9d,0x99,0x9b,0x9d,0x9c,0x9d,0x9d,\r
+ 0x9e,0x9f,0x98,0x99,0x9b,0x99,0x99,0x9e,0x9f,0x27,0x27,0x27,0x2a,\r
+ 0x2d,0x2f,0x2f,0x2f,0x2e,0x2a,0x2a,0x2a,0x2f,0x01,0x2c,0x25,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x02,0xf6,\r
+ 0x2a,0x02,0x97,0x9e,0x9e,0x9e,0x9c,0x94,0x98,0x9a,0x9b,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,\r
+ 0x9c,0x9c,0x9c,0x9a,0x98,0x99,0x9d,0x9d,0x9b,0x9a,0x9a,0x9a,0x98,\r
+ 0x98,0x99,0x9a,0x9b,0x2f,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,\r
+ 0x02,0xf7,0x2a,0x2a,0xf7,0xf7,0x2f,0x2c,0x26,0x36,0xf7,0xf7,0x2c,\r
+ 0x2b,0x2b,0x2c,0x2f,0xf7,0x27,0x26,0x2f,0x2f,0xf7,0xf7,0x2b,0xf6,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x2e,0xf7,0xf7,0xf7,0x2d,0xf7,0xf7,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x2e,0x2a,0x2b,0x2c,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0xf7,0xf7,0x01,0x2f,\r
+ 0x2e,0x94,0x97,0xf7,0x01,0xf7,0x07,0x06,0x05,0x04,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0x04,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x04,0xf7,0x04,0x07,0x06,0x02,0x02,0xf7,0x02,0x03,\r
+ 0x06,0x06,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x06,0x02,0xf7,0x02,0x03,0x03,\r
+ 0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x97,0x97,0x03,0x98,\r
+ 0x99,0x9d,0x9e,0x97,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9e,0x9c,0x9a,\r
+ 0x9c,0x9a,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x9b,0x99,0x99,\r
+ 0x9a,0x98,0x9b,0x9f,0x27,0x27,0x27,0x27,0x2a,0x2c,0x2f,0x2f,0x2f,\r
+ 0x2d,0x2a,0x2a,0x2a,0xf6,0xf7,0x2c,0x25,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x25,0x2a,0x01,0x2e,0x2d,0x97,0x99,0x9f,\r
+ 0x9e,0x9e,0x99,0x94,0x99,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9c,0x9c,\r
+ 0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9c,0x9c,0x9a,0x98,\r
+ 0x99,0x9c,0x9d,0x9b,0x9b,0x9a,0x9a,0x98,0x98,0x99,0x9a,0x9b,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2f,0x2c,0x2f,0x02,0x01,0x01,0xf7,0x25,0x2a,0xf7,\r
+ 0xf7,0x2f,0x2f,0x27,0x23,0xf7,0xf6,0x2c,0x2b,0x2b,0x2c,0x2f,0xf7,\r
+ 0x25,0x26,0x2f,0x2f,0xf7,0xf7,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0x27,\r
+ 0x28,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf6,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2a,0x2a,0x2b,0x2c,\r
+ 0x2c,0x2c,0x2d,0x2c,0x2c,0x2c,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0x27,0xf7,0xf7,0x2f,0x2d,0xf7,0x97,0x9e,0xf7,0xf7,\r
+ 0xf7,0x06,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x03,0xf7,0xf7,0xf7,0x03,0x05,0x06,0x06,0x06,0x05,0x04,0xf7,\r
+ 0x02,0x07,0x07,0x04,0x02,0x02,0xf7,0x02,0x03,0x04,0x05,0x05,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x07,0x07,0x03,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x99,0x9f,0x99,0x9a,0x9c,0x9e,0x94,\r
+ 0x9a,0x9c,0x9f,0x9f,0x9f,0x9f,0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x97,0x99,0x9a,0x9a,0x98,0x9d,0x28,\r
+ 0x27,0x27,0x27,0x27,0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,0x2a,\r
+ 0x02,0x01,0x2a,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x25,0x2c,0x01,0x2a,0x97,0x97,0x9a,0x9f,0x9e,0x9e,0x97,0x97,\r
+ 0x9a,0x9b,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9c,0x9c,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9c,0x9c,0x9a,0x98,0x98,0x9b,0x9d,0x9c,0x9b,\r
+ 0x9b,0x9a,0x98,0x98,0x99,0x9a,0x9b,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2a,\r
+ 0x2e,0xf6,0xf6,0x01,0xf7,0x2d,0x2b,0xf7,0xf7,0x02,0x2f,0x27,0x2b,\r
+ 0xf7,0x2e,0x2c,0x2b,0x2b,0x2c,0x2f,0xf7,0x27,0x26,0x2d,0x2f,0xf7,\r
+ 0xf7,0x2e,0x02,0xf7,0x01,0x01,0xf7,0x2c,0x36,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0x2f,0x01,0x01,0xf6,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2a,0x2a,0x2b,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2f,0x02,0xf7,0xf7,0xf7,0x2f,0x02,0xf7,0x27,0x2f,0xf7,\r
+ 0xf7,0x2f,0x2b,0xf7,0x97,0xf7,0x01,0xf7,0x01,0x06,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x04,0x02,0xf7,0x02,0x07,0x07,0x07,0x03,\r
+ 0x02,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x04,0x05,\r
+ 0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,\r
+ 0x97,0x97,0x9a,0x9f,0x99,0x9a,0x9c,0x9e,0x94,0x9a,0x9c,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9b,0x98,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9c,0x9f,0x97,0x99,0x9b,0x99,0x99,0x2a,0x27,0x27,0x27,0x27,0x27,\r
+ 0x2a,0x2d,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,0x2a,0x02,0x01,0x2a,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x2f,0x01,\r
+ 0x9f,0x94,0x97,0x9d,0x9e,0x9e,0x9e,0x94,0x97,0x9a,0x9b,0x9d,0x9d,\r
+ 0x9e,0x9e,0x9d,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,\r
+ 0x9c,0x9b,0x99,0x97,0x9a,0x9d,0x9c,0x9b,0x9b,0x9b,0x98,0x98,0x99,\r
+ 0x9a,0x9b,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2a,0x2e,0x2f,0x2f,0x01,0xf7,\r
+ 0xf6,0x2b,0xf7,0xf7,0xf7,0x28,0x26,0xf7,0xf7,0x2d,0x2c,0x2b,0x2b,\r
+ 0x2c,0x2f,0xf7,0x27,0x26,0x2d,0x2f,0xf7,0xf7,0x2e,0x02,0xf7,0x01,\r
+ 0x02,0xf7,0xf7,0x35,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2c,0x2a,\r
+ 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2b,0x2c,0x2c,0x2f,0xf6,\r
+ 0x2f,0x2b,0x2f,0xf7,0x29,0x23,0xf7,0xf7,0x2f,0x2d,0xf7,0xf7,0x99,\r
+ 0xf7,0xf7,0xf7,0x02,0x05,0x04,0x04,0x03,0x03,0x03,0x02,0x03,0x05,\r
+ 0x07,0x07,0x06,0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0x06,0x07,0x07,0x06,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x04,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x9b,0x98,0x97,0x94,0x9c,0x9e,\r
+ 0x99,0x9a,0x9b,0x9d,0x94,0x9b,0x9d,0x9f,0x9f,0x9f,0x9f,0x9d,0x9a,\r
+ 0x9b,0x9b,0x9d,0x9a,0x9b,0x9d,0x9c,0x9d,0x9d,0x9e,0x9f,0x98,0x99,\r
+ 0x9b,0x99,0x2e,0x28,0x27,0x27,0x27,0x27,0x27,0x2a,0x2d,0x2f,0x2f,\r
+ 0x2f,0x2d,0x2a,0x29,0x2a,0x01,0x01,0x2a,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x28,0xf6,0x97,0x9f,0x94,0x97,0x9e,\r
+ 0x9e,0x9d,0x9b,0x94,0x99,0x9a,0x9c,0x9d,0x9e,0x9e,0x9e,0x9e,0x9d,\r
+ 0x9d,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x99,0x97,0x99,\r
+ 0x9d,0x9d,0x9c,0x9b,0x9b,0x98,0x98,0x99,0x9a,0x9b,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2f,0x2c,0x2e,0x2f,0x2f,0xf7,0xf7,0x02,0x2d,0xf7,0xf7,0xf7,\r
+ 0x27,0x27,0xf7,0xf6,0x2c,0x2c,0x2a,0x2b,0x2c,0x2e,0xf7,0x27,0x26,\r
+ 0x2e,0x2f,0xf7,0xf7,0x2c,0xf6,0xf7,0x02,0x02,0x01,0xf7,0x36,0x2a,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf6,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x2f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2b,0x2c,0x2e,0x2f,0x02,0x01,0x02,0x2f,0x2c,0x2f,0xf7,0x2a,0x36,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2a,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0x03,0x05,\r
+ 0x04,0x03,0x03,0x03,0x02,0x02,0x03,0x06,0x07,0x06,0x04,0x03,0x02,\r
+ 0x02,0x03,0x05,0x07,0x07,0x07,0x06,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x05,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x06,\r
+ 0x07,0x07,0x07,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x01,0x02,0x02,0xf7,0x02,0x03,0x9f,0x03,\r
+ 0x02,0x01,0x9e,0x99,0x98,0x97,0x94,0x9d,0x9d,0x9a,0x9a,0x9b,0x9a,\r
+ 0x97,0x9b,0x9e,0x9f,0x9f,0x9f,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,0x98,\r
+ 0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x9a,0x99,0x99,0x9a,0x2f,0x2c,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x2a,0x2e,0x2f,0x2f,0x2f,0x2c,0x2a,0x29,\r
+ 0x2a,0x01,0x01,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x2a,0x94,0x99,0x9a,0x97,0x99,0x9f,0x9e,0x9e,0x99,0x94,\r
+ 0x99,0x9b,0x9c,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9c,0x9c,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9c,0x9a,0x97,0x97,0x9c,0x9d,0x9c,0x9c,0x9c,\r
+ 0x98,0x98,0x98,0x99,0x9a,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0x2a,0xf7,0xf7,0xf7,0xf7,0x28,0x2c,0xf7,0x2f,0x2c,\r
+ 0x2c,0x2b,0x2b,0x2c,0x2e,0xf7,0x29,0x26,0x2f,0x2f,0xf7,0xf7,0x2a,\r
+ 0xf6,0xf7,0x02,0x01,0x02,0xf7,0x2a,0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0x2f,\r
+ 0x2e,0x2a,0x2a,0x2a,0x2a,0x2b,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x2f,0x01,0xf7,0x2d,0x2a,0xf7,0xf7,0x02,0x2f,0x2c,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x04,0x04,0x03,0x03,0x03,0x02,\r
+ 0x02,0x04,0x07,0x07,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x07,\r
+ 0x07,0x07,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x07,0x07,0x07,0x06,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x05,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x03,\r
+ 0x9c,0x9f,0x02,0x01,0x9f,0x9b,0x98,0x94,0x97,0x9b,0x02,0x03,0x99,\r
+ 0x98,0x94,0x94,0x9f,0x9b,0x9a,0x9a,0x9c,0x98,0x99,0x9b,0x9e,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9b,0x9a,0x9c,0x9b,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9c,0x9f,0x97,0x99,0x9a,0x2e,0x2f,0x2a,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x2a,0x2d,0x2f,0x2f,0x2f,0x2c,0x2a,0x29,0x2a,0x01,0x02,0x27,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x25,0x9c,0x94,\r
+ 0x9d,0x98,0x97,0x9a,0x9f,0x9e,0x9d,0x97,0x94,0x9a,0x9b,0x9d,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9d,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9a,0x9c,\r
+ 0x9a,0x97,0x97,0x9a,0x9d,0x9d,0x9c,0x9c,0x98,0x98,0x98,0x99,0x9a,\r
+ 0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,0x2b,0xf7,\r
+ 0xf7,0x01,0x02,0x27,0x2f,0xf7,0x2e,0x2c,0x2c,0x2c,0x2c,0x2c,0x2e,\r
+ 0xf7,0x2b,0x27,0x2f,0x2f,0xf7,0xf7,0x25,0xf6,0xf7,0x01,0xf7,0x01,\r
+ 0xf7,0xf7,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,0x2d,0x2b,0x2b,0x2c,0x2e,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0x2c,\r
+ 0xf7,0xf7,0xf7,0x01,0x2f,0x2c,0x2c,0xf7,0xf7,0x23,0x01,0xf7,0xf7,\r
+ 0x02,0x9f,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x04,0x07,0x06,0x02,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x06,0x04,0x04,\r
+ 0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x05,0x03,0x02,0x02,0x02,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x05,0x03,0x02,0x02,0x02,0x03,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x04,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x02,0x02,0x03,0x06,0x03,0x03,0x03,0x03,0x9e,\r
+ 0x98,0x94,0x97,0x98,0x97,0x94,0x9d,0x01,0x9a,0x98,0x94,0x94,0x9f,\r
+ 0x9a,0x9a,0x9a,0x9d,0x94,0x9a,0x9c,0x9f,0x9f,0x9f,0x9f,0x9d,0x9a,\r
+ 0x9a,0x9c,0x9d,0x9b,0x98,0x9d,0x9d,0x9d,0x9d,0x9c,0x9f,0x97,0x99,\r
+ 0x2d,0x2f,0x2f,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2c,0x2a,0x29,0x2c,0x01,0xf6,0x27,0x23,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x02,0x9a,0x94,0x9f,0x97,0x97,0x9c,\r
+ 0x9e,0x9e,0x9d,0x94,0x97,0x9a,0x9b,0x9d,0x9e,0x9f,0x9e,0x9e,0x9e,\r
+ 0x9e,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x9b,0x9b,0x99,0x94,0x98,0x9c,\r
+ 0x9d,0x9d,0x9d,0x97,0x97,0x98,0x99,0x9a,0xf6,0xf6,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0x2b,0x27,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x35,0xf7,0xf7,0xf7,0xf6,0x2e,0x27,0x2f,\r
+ 0xf7,0x2e,0x2c,0x2c,0x2c,0x2c,0x2c,0x2e,0xf7,0x2e,0x27,0x02,0x2f,\r
+ 0xf7,0xf7,0x23,0xf6,0xf7,0x01,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2c,\r
+ 0x29,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0xf7,0x02,0x9f,0x04,0x04,0x03,\r
+ 0x03,0x03,0x02,0x02,0x05,0x07,0x04,0xf7,0xf7,0x04,0x04,0x04,0x05,\r
+ 0x02,0xf7,0x02,0x06,0x07,0x07,0x04,0x04,0x04,0x04,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x04,0x04,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,0x04,\r
+ 0x06,0x05,0x05,0x9e,0x9f,0x03,0x9f,0x9d,0x97,0x97,0x99,0x9a,0x9a,\r
+ 0x9a,0x98,0x97,0x01,0x9a,0x97,0x94,0x94,0x03,0x9a,0x9a,0x9a,0x9d,\r
+ 0x94,0x9b,0x9c,0x9f,0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9b,0x9d,0x99,\r
+ 0x9b,0x9d,0x9c,0x9d,0x9d,0x9e,0x9e,0x98,0x2c,0x2d,0x2f,0x2d,0x28,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2e,0x2f,0x2f,0x2f,0x2c,0x2a,\r
+ 0x29,0x2c,0x01,0x2f,0x27,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,\r
+ 0x23,0xf7,0x03,0x98,0x94,0x9f,0x94,0x97,0x9d,0x9e,0x9d,0x9d,0x94,\r
+ 0x97,0x9a,0x9c,0x9e,0x9e,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,\r
+ 0x9b,0x9b,0x9b,0x9c,0x99,0x97,0x97,0x9a,0x9d,0x9d,0x9d,0x97,0x97,\r
+ 0x98,0x98,0x99,0x02,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,\r
+ 0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0x35,0x2e,0xf7,0xf7,0xf7,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0x2f,0x2a,0x25,0x2a,0xf7,0x2e,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2e,0xf7,0x01,0x27,0x01,0x02,0xf7,0xf7,0x36,0xf6,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x2d,0x2c,0x29,0xf7,0xf7,0xf7,0x36,0x36,\r
+ 0xf7,0xf7,0xf7,0x02,0x9f,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x06,\r
+ 0x07,0x03,0xf7,0x03,0x04,0x02,0x02,0x03,0x05,0x02,0xf7,0x04,0x07,\r
+ 0x07,0x04,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,\r
+ 0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x02,0x02,0x04,0x06,0x05,0x04,0x03,0x02,0x97,0x94,\r
+ 0x98,0x9a,0x9b,0x97,0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9a,0x94,0x02,\r
+ 0x9b,0x97,0x94,0x98,0x9f,0x9a,0x9a,0x9a,0x9b,0x97,0x9b,0x9e,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9c,0x99,0x9c,0x9b,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,\r
+ 0x9d,0x9f,0x9a,0x2f,0x2c,0x2d,0x2f,0x2c,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x27,0x2a,0x2f,0x2f,0x2f,0x2f,0x2c,0x2a,0x29,0x2d,0xf7,0x2f,\r
+ 0x26,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0xf7,0xf7,0x9f,0x97,\r
+ 0x97,0x9e,0x94,0x97,0x9e,0x9e,0x9d,0x9c,0x94,0x98,0x9a,0x9c,0x9e,\r
+ 0x9e,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x9a,\r
+ 0x97,0x94,0x98,0x9c,0x9e,0x9e,0x97,0x97,0x97,0x98,0x99,0x01,0xf6,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2d,\r
+ 0x28,0x25,0x25,0xf7,0x2e,0x2c,0x2c,0x2d,0x2c,0x2c,0x2e,0x01,0xf7,\r
+ 0x28,0xf7,0x01,0xf7,0xf7,0x36,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2f,0x2e,0x2d,\r
+ 0x2a,0x2a,0xf7,0xf7,0xf7,0x27,0x36,0x35,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x05,0x04,0x04,0x03,0x03,0x03,0x02,0x06,0x07,0x03,0xf7,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0x04,0xf7,0x02,0x07,0x07,0x04,0x03,0x03,0x03,\r
+ 0x03,0x04,0x04,0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x02,0x06,\r
+ 0x05,0x04,0x03,0x03,0x02,0xf7,0x97,0x97,0x97,0x98,0x99,0x97,0x94,\r
+ 0x97,0x98,0x99,0x9a,0x9a,0x9a,0x9b,0x97,0x02,0x9b,0x98,0x97,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9b,0x97,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9e,0x9b,\r
+ 0x99,0x9c,0x9c,0x9c,0x97,0x9d,0x9d,0x9c,0x9d,0x9d,0x9f,0x2f,0x2f,\r
+ 0x2d,0x2f,0x2f,0x2a,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2c,0x2a,0x29,0x2e,0xf7,0x2f,0x26,0x23,0x23,0x23,\r
+ 0x23,0x23,0x23,0x23,0xf7,0xf7,0xf7,0x9e,0x94,0x99,0x9b,0x94,0x97,\r
+ 0x9e,0x9e,0x9c,0x9b,0x94,0x99,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9e,0x9e,0x9d,0x9d,0x9c,0x9b,0x9b,0x9b,0x99,0x94,0x94,0x99,0x9c,\r
+ 0x9e,0x97,0x97,0x97,0x98,0x98,0xf7,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf6,0x01,0xf7,0xf7,0x29,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2c,0x27,0x28,0x36,0xf7,0x2f,\r
+ 0x2c,0x2c,0x2d,0x2e,0x2d,0x2f,0x01,0xf7,0x2a,0xf7,0xf7,0xf7,0x2f,\r
+ 0x26,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf6,0x2f,0x2e,0x2c,0x2a,0x2a,0x28,0x2f,0xf7,0xf7,0xf7,0x2c,\r
+ 0x36,0x36,0x35,0xf7,0xf7,0xf7,0x02,0x03,0x06,0x05,0x04,0x03,0x03,\r
+ 0x03,0x02,0x06,0x07,0x02,0xf7,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,\r
+ 0x02,0xf7,0x06,0x07,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,\r
+ 0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x02,0x02,0x05,0x05,0x04,0x04,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0x94,0x94,0x97,0x97,0x97,0x97,0x94,0x97,0x98,0x9a,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9b,0x97,0x02,0x9b,0x99,0x98,0x9d,0x9c,0x9a,0x9a,0x9d,\r
+ 0x94,0x9b,0x9c,0x9e,0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9a,\r
+ 0x98,0x9d,0x9d,0x9d,0x9d,0x9d,0x28,0x2f,0x2f,0x2c,0x2f,0x2e,0x29,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2f,0x2f,0x2f,0x2e,0x2c,\r
+ 0x29,0x29,0x2f,0xf7,0x2f,0x25,0x23,0x23,0x23,0x23,0x23,0x23,0xf7,\r
+ 0xf7,0xf7,0x01,0x9d,0x94,0x9a,0x9a,0x94,0x98,0x9f,0x9e,0x9d,0x9a,\r
+ 0x94,0x99,0x9b,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,\r
+ 0x9c,0x9b,0x9b,0x9a,0x97,0x94,0x97,0x99,0x9c,0x97,0x97,0x97,0x98,\r
+ 0x98,0xf7,0x01,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x01,0xf7,0xf7,\r
+ 0x2a,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2e,0x2f,0x2a,0x27,0x2f,0x29,0x2f,0xf7,0x2c,0x2c,0x2d,0x2e,0x2f,\r
+ 0x2f,0x02,0xf7,0x2a,0xf7,0xf7,0xf7,0x2e,0x01,0xf7,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x2f,0x2f,0x2f,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x2f,0x2a,0x29,0x27,0x27,\r
+ 0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,0x2a,0x36,0x36,0x35,0x35,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0x06,0x06,0x05,0x04,0x03,0x03,0x03,0x06,0x07,0x02,\r
+ 0xf7,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0xf7,0x05,0x07,0x04,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,\r
+ 0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x03,0x06,\r
+ 0x04,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x9a,0x99,0x99,\r
+ 0x97,0x97,0x94,0x94,0x99,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9b,0x97,\r
+ 0x01,0x9a,0x99,0x99,0x9f,0x9a,0x9a,0x9a,0x9d,0x97,0x9b,0x9d,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,0x99,0x9c,0x9d,0x9c,0x9d,\r
+ 0x9d,0x2a,0x29,0x2f,0x2f,0x2c,0x2f,0x2c,0x28,0x27,0x27,0x27,0x27,\r
+ 0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,0x2e,0x2c,0x29,0x29,0x2f,0xf7,\r
+ 0x2f,0x25,0x23,0x23,0x23,0x23,0x23,0xf7,0xf7,0xf7,0xf7,0x02,0x9c,\r
+ 0x94,0x9c,0x99,0x97,0x98,0x9e,0x9d,0x9c,0x99,0x94,0x99,0x9b,0x9e,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9c,0x9b,0x9b,0x99,\r
+ 0x97,0x94,0x97,0x99,0x94,0x94,0x97,0x97,0x98,0xf7,0x01,0xf6,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0xf7,0x28,0x2a,0x2e,0x2f,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2e,0x2e,0x2a,0x2a,0xf7,\r
+ 0x01,0x23,0xf7,0x2d,0x2c,0x2e,0x2f,0x2f,0x2f,0x01,0xf7,0x2e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,\r
+ 0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf6,\r
+ 0x2f,0x2c,0x28,0x27,0x27,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x26,0x36,0x36,0x35,0x35,0x35,0xf7,0xf7,0xf7,0x01,0x01,0x07,0x07,\r
+ 0x06,0x05,0x04,0x03,0x03,0x06,0x07,0x03,0xf7,0x04,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x04,0xf7,0x04,0x07,0x04,0x02,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,\r
+ 0x05,0x05,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x02,0x02,0x06,0x05,0x04,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x03,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x9a,\r
+ 0x9c,0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9b,0x94,0x02,0x9a,0x9a,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9a,0x99,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9e,0x9c,\r
+ 0x99,0x9c,0x9b,0x9d,0x98,0x9d,0x9d,0x9c,0x9d,0x2a,0x28,0x2c,0x2f,\r
+ 0x2f,0x2d,0x2f,0x2a,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,\r
+ 0x2f,0xf6,0x2f,0x2e,0x2b,0x29,0x29,0x2f,0xf7,0x2d,0x25,0x23,0x23,\r
+ 0x23,0x23,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x9d,0x98,0x97,\r
+ 0x99,0x9e,0x9d,0x9c,0x98,0x94,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9d,0x9c,0x9b,0x9b,0x9a,0x98,0x94,0x94,0x94,0x98,\r
+ 0x98,0x97,0x97,0x98,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0x02,0xf7,0x2a,0x27,0x2a,0x2e,0x2f,0x2e,0x2f,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2e,0x2f,0x2d,0x2c,0x2c,0xf7,0xf7,0x25,0xf7,0xf6,0x2e,\r
+ 0x2e,0x2f,0x2f,0x02,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2c,0x01,0xf7,0xf7,0x01,0x2f,0x2f,0x2c,0x28,0x26,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x27,0x36,0x36,0x36,0x36,0x35,0x35,\r
+ 0x35,0xf7,0xf7,0xf7,0x01,0x01,0x07,0x07,0x07,0x05,0x04,0x04,0x03,\r
+ 0x07,0x07,0x03,0xf7,0x05,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0xf7,\r
+ 0x04,0x07,0x04,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x02,0x06,\r
+ 0x04,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x03,0x02,0x02,0x98,\r
+ 0x99,0x98,0x94,0x94,0x94,0x94,0x94,0x9b,0x9b,0x99,0x99,0x99,0x98,\r
+ 0x98,0x9a,0x9a,0x9b,0x97,0x9f,0x9b,0x9a,0x9c,0x9e,0x9a,0x9a,0x9c,\r
+ 0x94,0x9b,0x9c,0x9f,0x9f,0x9f,0x9f,0x9e,0x9b,0x99,0x9c,0x9b,0x9c,\r
+ 0x97,0x9d,0x9d,0x9c,0x2b,0x2a,0x28,0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,0x2e,\r
+ 0x2a,0x29,0x29,0x2f,0xf7,0x2d,0x25,0x23,0x23,0x23,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x9e,0x97,0x97,0x9a,0x9e,0x9c,0x9d,\r
+ 0x94,0x97,0x9a,0x9c,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,\r
+ 0x9c,0x9b,0x9a,0x99,0x97,0x94,0x94,0x9a,0x9a,0x97,0x97,0x98,0xf7,\r
+ 0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0x02,0xf7,0x25,\r
+ 0x28,0x2a,0x2d,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0x2a,0x2c,0xf6,0xf7,0x2f,0x27,0xf7,0x2f,0x2f,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0x01,0x2f,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2a,0x2c,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x2e,0x2a,0x27,0x29,0xf7,0xf7,0xf7,0x2f,0x28,0x25,0x36,0x36,0x36,\r
+ 0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x07,0x07,0x04,0xf7,0x05,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0xf7,0x04,0x07,0x04,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0x02,0x04,0x05,0x04,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0x03,0x03,0x02,0x02,0x02,0x02,0x9a,0x9b,0x9a,0x97,0x94,0x94,\r
+ 0x94,0x94,0x9b,0x9b,0x99,0x9a,0x9d,0x9d,0x99,0x98,0x9a,0x9b,0x9a,\r
+ 0x9e,0x9e,0x9b,0x9b,0x9e,0x9b,0x9a,0x9a,0x9d,0x97,0x9b,0x9d,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9d,0x9a,0x9a,0x9c,0x9d,0x9b,0x98,0x9d,0x9d,0x2b,\r
+ 0x2a,0x2a,0x28,0x02,0x2f,0x2d,0x2f,0x2f,0x28,0x27,0x27,0x27,0x26,\r
+ 0x27,0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,0x2e,0x2a,0x29,0x29,0x2f,\r
+ 0xf7,0x2c,0x25,0x23,0x23,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x9a,0x94,0x9e,0x97,0x97,0x9b,0x9e,0x9c,0x9c,0x94,0x98,0x9a,0x9d,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,\r
+ 0x97,0x94,0x9c,0x9c,0x9a,0x97,0x97,0xf7,0xf7,0x01,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0xf6,0xf6,0xf7,0x23,0x26,0x27,0x2a,0x2d,0x2f,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2c,0x2c,0x2c,0x2c,0x2e,\r
+ 0x36,0xf7,0x01,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2f,0x2a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x2d,0x2a,0x27,\r
+ 0x27,0xf6,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2a,0x27,0x2e,0xf7,0xf7,\r
+ 0x2b,0x23,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x05,0x07,0x07,0x06,0xf7,0x04,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0xf7,0x04,0x07,0x04,0x02,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x05,0x04,0x03,0x03,0x04,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x06,\r
+ 0x04,0x04,0x03,0xf7,0xf7,0x02,0xf7,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x9c,0x9c,0x9c,0x98,0x94,0x94,0x94,0x94,0x9c,0x9a,0x99,\r
+ 0x9d,0x9f,0x9f,0x9e,0x99,0x98,0x9a,0x9b,0x98,0x02,0x9c,0x9a,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9a,0x99,0x99,0x9c,0x9f,0x9f,0x03,0x9f,0x9f,0x9d,\r
+ 0x9a,0x9b,0x9b,0x9d,0x99,0x9b,0x9d,0x2c,0x2b,0x2a,0x2a,0x29,0x2f,\r
+ 0x2f,0x2c,0x2f,0x2d,0x28,0x27,0x27,0x26,0x26,0x27,0x27,0x27,0x27,\r
+ 0x2a,0x2f,0xf6,0x2f,0x2e,0x2a,0x29,0x29,0x2f,0xf7,0x2c,0x25,0x23,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9f,0x97,\r
+ 0x97,0x9c,0x9e,0x9c,0x9c,0x94,0x99,0x9b,0x9e,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9d,0x9b,0x9a,0x9a,0x99,0x98,0x9d,0x9d,0x9c,\r
+ 0x98,0x97,0xf7,0xf7,0x01,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,\r
+ 0x2f,0xf7,0x28,0x27,0x27,0x28,0x2c,0x2c,0x2f,0x2f,0x01,0x01,0x01,\r
+ 0x01,0x01,0x2f,0x2f,0x2a,0x2a,0x28,0x27,0x25,0x27,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf6,0x2a,0x27,\r
+ 0x27,0x27,0x25,0x25,0x23,0x23,0x25,0x28,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf6,0x2e,0x2a,0x27,0x2f,0xf7,0xf7,0x27,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,\r
+ 0x07,0xf7,0x02,0x05,0x02,0xf7,0xf7,0xf7,0x04,0x02,0xf7,0x05,0x07,\r
+ 0x04,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x07,0x07,0x07,\r
+ 0x07,0x06,0x03,0x02,0x02,0x02,0x02,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x04,0x02,0x02,0x05,0x04,0x04,0x02,0xf7,0x02,0xf7,\r
+ 0x02,0x04,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x9c,0x9c,0x9c,\r
+ 0x98,0x94,0x94,0x94,0x94,0x9c,0x9a,0x9a,0x9f,0x9f,0x03,0x9f,0x9f,\r
+ 0x99,0x99,0x9a,0x9b,0x94,0x03,0x9a,0x99,0x9a,0x9e,0x9a,0x9a,0x9c,\r
+ 0x94,0x9b,0x9d,0x9f,0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x9c,0x9a,0x9d,\r
+ 0x98,0x9d,0x2a,0x2c,0x2b,0x2a,0x28,0x2a,0x2f,0x2f,0x2d,0x2f,0x2c,\r
+ 0x27,0x27,0x27,0x26,0x26,0x27,0x27,0x27,0x27,0x2a,0x2f,0xf6,0x2f,\r
+ 0x2e,0x2a,0x29,0x2a,0xf6,0xf7,0x2b,0x23,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9f,0x94,0x97,0x9e,0x9d,0x9b,\r
+ 0x9a,0x94,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9d,\r
+ 0x9c,0x9b,0x9a,0x9a,0x99,0x9d,0x9d,0x9d,0x9a,0x97,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0xf7,0x25,0x2f,\r
+ 0x2e,0x2c,0x2a,0x2f,0x2f,0x01,0x01,0xf7,0x01,0x01,0x2f,0x2f,0x2e,\r
+ 0x2d,0x2a,0x2a,0x27,0x27,0x2d,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0x2e,0x25,0x36,0x35,0x35,0x36,0x36,0x36,\r
+ 0x23,0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2b,0x27,0x2f,0xf7,\r
+ 0xf7,0x28,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0xf7,0x06,0x04,\r
+ 0x02,0x02,0x03,0x05,0xf7,0xf7,0x06,0x07,0x04,0x03,0x03,0x03,0x04,\r
+ 0x04,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,\r
+ 0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x05,0x04,0x9c,0x9c,0x9b,0x97,0x94,0x94,0x94,0x94,\r
+ 0x9c,0x9a,0x9a,0x9f,0x03,0x03,0x03,0x03,0x9e,0x98,0x9a,0x9b,0x9b,\r
+ 0x9c,0x9c,0x99,0x98,0x9f,0x9a,0x9a,0x9a,0x9c,0x97,0x9b,0x9e,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9c,0x9a,0x9c,0x9b,0x9c,0x97,0x2b,0x2b,0x2c,\r
+ 0x2b,0x2a,0x27,0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,0x27,0x26,\r
+ 0x26,0x27,0x27,0x27,0x27,0x2b,0x2f,0x2f,0x2f,0x2e,0x2a,0x29,0x2a,\r
+ 0xf6,0x01,0x2b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x98,0x94,0x9f,0x94,0x97,0x9e,0x9d,0x9c,0x99,0x94,0x9a,0x9b,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x9f,0x9f,0x9f,0x9d,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9e,0x9e,0x9e,0x9d,0x97,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x2f,0xf7,0x23,0xf6,0xf7,0x01,0x2e,0x2c,0xf6,\r
+ 0xf6,0x01,0xf7,0x01,0x01,0xf7,0x2f,0x2f,0x2e,0x2e,0x2d,0x2c,0x2a,\r
+ 0x2a,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,\r
+ 0xf6,0x27,0x23,0x36,0x36,0x23,0x25,0x27,0x2c,0x01,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0x2d,0x2c,0x28,0x2e,0xf7,0xf7,0x2a,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x04,0xf7,0x03,0x06,0x04,0x04,0x05,0x04,0xf7,\r
+ 0x03,0x07,0x07,0x05,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x02,0xf7,0x05,0x05,0x04,0x03,0xf7,0xf7,0x02,\r
+ 0xf7,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x05,0x05,0x04,\r
+ 0x9c,0x9c,0x9a,0x94,0x94,0x94,0x94,0x97,0x9c,0x9a,0x9a,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9b,0x98,0x9a,0x9c,0x97,0x01,0x99,0x97,0x97,\r
+ 0x9f,0x9a,0x9a,0x9c,0x97,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9a,0x9a,0x9c,0x9c,0x9c,0x2f,0x2b,0x2b,0x2c,0x2b,0x2b,0x28,0x02,\r
+ 0x2f,0x2d,0x2f,0x2f,0x29,0x27,0x27,0x26,0x26,0x26,0x27,0x27,0x27,\r
+ 0x27,0x2b,0x2f,0x2f,0x2f,0x2e,0x2a,0x29,0x2a,0x02,0x01,0x9e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x9e,\r
+ 0x94,0x97,0x9e,0x9c,0x9c,0x97,0x97,0x9a,0x9c,0x9f,0x9f,0x03,0x03,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x9c,0x9c,0x9f,0x9e,0x9c,\r
+ 0xf7,0xf7,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,\r
+ 0x2f,0xf7,0x27,0xf7,0xf7,0x01,0x28,0xf6,0xf6,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0x2f,0x2d,0x2d,0x2f,0x2f,0x2f,0xf7,0xf7,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0xf7,0x2e,0x2a,0x27,0x2a,\r
+ 0x2c,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2d,0x2a,0x2c,\r
+ 0xf7,0xf7,0xf6,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0xf7,0xf7,0x05,0x06,0x06,0x05,0xf7,0xf7,0x05,0x07,0x07,0x06,0x05,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,\r
+ 0x06,0x04,0x04,0x02,0xf7,0x02,0xf7,0x02,0x04,0x04,0x04,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x9c,0x9c,0x99,0x94,0x94,\r
+ 0x94,0x94,0x98,0x9c,0x9a,0x9a,0x9f,0x03,0x03,0x03,0x03,0x03,0x9e,\r
+ 0x98,0x99,0x9b,0x9c,0x99,0x9c,0x97,0x94,0x9c,0x9a,0x9a,0x9a,0x9d,\r
+ 0x97,0x9b,0x9e,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9a,0x9b,0x9b,0x9d,\r
+ 0x2e,0x2e,0x2a,0x2c,0x2b,0x2a,0x2a,0x28,0x2f,0x2f,0x2c,0x2f,0x2e,\r
+ 0x28,0x27,0x27,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x2b,0x2f,0x2f,\r
+ 0x2f,0x2d,0x2a,0x29,0x2a,0x02,0x94,0x9e,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x98,0x9a,0x94,0x98,0x9e,0x9c,\r
+ 0x9c,0x94,0x97,0x9a,0x9d,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,\r
+ 0x9d,0x9c,0x9b,0x99,0x99,0x9d,0x9f,0x9e,0xf7,0xf7,0x01,0x01,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0xf7,0x23,0x01,0xf7,\r
+ 0xf7,0x2f,0x2a,0xf6,0x2f,0x01,0xf7,0xf7,0xf7,0x01,0x2f,0x01,0xf7,\r
+ 0x01,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2d,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2f,0x2e,0x2a,0x29,0xf7,0xf7,0xf7,0x27,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x06,0x05,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0xf7,0x02,0x04,0x04,\r
+ 0x02,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x04,0x02,0x03,0x05,0x04,0x03,0xf7,0xf7,0x04,\r
+ 0xf7,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x05,\r
+ 0x04,0x04,0x03,0x9c,0x99,0x94,0x94,0x94,0x94,0x94,0x98,0x9c,0x99,\r
+ 0x99,0x9f,0x03,0x03,0x03,0x03,0x03,0x9f,0x99,0x98,0x9a,0x9d,0x97,\r
+ 0x01,0x99,0x97,0x94,0x03,0x99,0x9a,0x9c,0x97,0x9a,0x9c,0x9f,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9c,0x9a,0x9c,0x9a,0x2b,0x2f,0x2c,0x2a,0x2c,\r
+ 0x2b,0x2a,0x29,0x2a,0x2f,0x2f,0x2c,0x2f,0x2c,0x27,0x27,0x26,0x26,\r
+ 0x26,0x26,0x26,0x27,0x27,0x28,0x2b,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,\r
+ 0x2a,0x94,0x94,0x9e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x9e,0x94,0x9a,0x99,0x97,0x9a,0x9e,0x9c,0x9c,0x94,0x98,0x9a,\r
+ 0x9d,0x9f,0x9f,0x03,0x03,0x9f,0x9f,0x9f,0x9e,0x9d,0x9c,0x97,0x97,\r
+ 0x99,0x03,0x9f,0x2b,0xf7,0xf7,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2f,0x2f,0xf7,0x25,0xf7,0xf7,0x2f,0x2a,0x2f,0x2f,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2c,\r
+ 0x28,0xf7,0xf7,0xf7,0x2f,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x06,0x05,0x05,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x03,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x04,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,\r
+ 0x05,0x05,0x04,0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x04,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x03,0x03,0x99,0x94,\r
+ 0x94,0x97,0x94,0x94,0x94,0x99,0x9c,0x99,0x99,0x9d,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x99,0x97,0x9a,0x9d,0x9c,0x9d,0x9c,0x98,0x94,0x9c,\r
+ 0x9a,0x99,0x9b,0x9d,0x97,0x9b,0x9e,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9a,0x9c,0x2d,0x2c,0x2f,0x2a,0x2b,0x2c,0x2b,0x2a,0x28,0x2d,\r
+ 0x2f,0x2f,0x2d,0x2f,0x2a,0x27,0x27,0x26,0x26,0x26,0x26,0x26,0x27,\r
+ 0x27,0x28,0x2c,0x2f,0x2f,0x2f,0x2d,0x2a,0x29,0x9e,0x94,0x94,0x9f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x94,0x9e,\r
+ 0x97,0x97,0x9c,0x9d,0x9b,0x9c,0x94,0x99,0x9b,0x9d,0x9f,0x9f,0x03,\r
+ 0x03,0x9f,0x9f,0x9f,0x9e,0x9d,0x9a,0x9a,0x99,0x9c,0x9f,0x27,0xf7,\r
+ 0xf7,0x02,0xf6,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0xf7,0x28,0x2f,0xf7,0x2f,0x2c,0x2c,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2d,0x29,0x2f,0xf7,0xf7,0xf7,0x25,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x06,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x05,0x04,0x04,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,\r
+ 0x05,0x04,0x03,0x03,0x03,0x02,0x94,0x97,0x98,0x94,0x97,0x94,0x94,\r
+ 0x99,0x9c,0x9a,0x98,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,0x9e,0x99,0x97,\r
+ 0x99,0x9c,0x9e,0x94,0xf7,0x99,0x97,0x97,0x03,0x99,0x9a,0x9d,0x94,\r
+ 0x9a,0x9d,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9b,0x9a,0x2c,0x2c,\r
+ 0x2c,0x2f,0x2b,0x2b,0x2c,0x2b,0x2a,0x28,0x2f,0x2f,0x2e,0x2f,0x2f,\r
+ 0x29,0x27,0x27,0x26,0x26,0x26,0x26,0x26,0x27,0x27,0x28,0x2c,0x2f,\r
+ 0x2f,0x2f,0x2d,0x2a,0x9f,0x9d,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9b,0x94,0x9f,0x94,0x97,0x9d,0x9d,\r
+ 0x9b,0x9a,0x94,0x9a,0x9b,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9e,0x9c,0x9c,0x9d,0x9c,0x9f,0x27,0x26,0xf7,0x01,0x2f,0x2f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0xf7,0x23,0x2f,0x2a,\r
+ 0x29,0x2c,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,\r
+ 0x01,0x2f,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0xf6,0x02,0x2f,0xf6,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,\r
+ 0x2e,0x2a,0x2e,0xf7,0xf7,0xf7,0x2d,0x36,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0xf7,0xf7,0xf7,0xf7,0xf7,0x07,0x06,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,\r
+ 0x02,0x06,0x04,0x04,0x02,0xf7,0x03,0xf7,0x03,0x04,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0x99,0x98,0x97,0x98,0x94,0x94,0x97,0x99,0x9b,0x9a,0x99,0x98,\r
+ 0x99,0x9b,0x9d,0x9d,0x9b,0x99,0x97,0x97,0x99,0x9d,0x9e,0x94,0xf7,\r
+ 0x03,0x98,0x97,0x9f,0x99,0x99,0x9c,0x9c,0x97,0x9b,0x9e,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9d,0x9a,0x2d,0x2c,0x2b,0x2d,0x2f,0x2b,0x2b,\r
+ 0x2b,0x2a,0x2a,0x28,0xf6,0x2f,0x2c,0x2f,0x2e,0x28,0x27,0x27,0x26,\r
+ 0x26,0x26,0x26,0x26,0x27,0x27,0x28,0x2c,0x2f,0x2f,0x2f,0x2d,0x9e,\r
+ 0x9f,0x9d,0x94,0x94,0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x9a,0x94,0x9f,0x94,0x97,0x9e,0x9d,0x9c,0x99,0x94,0x9a,\r
+ 0x9b,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9d,0x9d,0x9d,0x9e,\r
+ 0x9f,0x27,0x25,0x2a,0xf7,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2f,0xf7,0x2a,0x29,0x28,0x28,0x2c,0x2e,0x2d,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x36,0x2a,0xf7,0xf7,0xf7,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2c,0x2c,0x2c,0x2d,0x2f,\r
+ 0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2c,0x2a,0xf7,0xf7,0xf7,\r
+ 0xf7,0x23,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x04,0x02,0x03,0x05,0x04,0x03,0xf7,0xf7,\r
+ 0x04,0xf7,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x97,0x97,0x98,0x98,\r
+ 0x94,0x97,0x98,0x99,0x9a,0x9a,0x99,0x98,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x9e,0x9f,0x97,0x03,0xf7,0x9d,0x97,0x98,0x9e,\r
+ 0x99,0x9a,0x9d,0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x2e,0x2c,0x2d,0x2a,0x2f,0x2c,0x2b,0x2c,0x2b,0x2a,0x2a,0x29,\r
+ 0x2f,0x2f,0x2c,0x2f,0x2c,0x27,0x27,0x26,0x26,0x25,0x26,0x26,0x26,\r
+ 0x27,0x27,0x28,0x2c,0x2f,0x2f,0x2f,0x9b,0x9f,0x9f,0x9d,0x94,0x97,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x98,0x97,\r
+ 0x9e,0x94,0x97,0x9e,0x9d,0x9c,0x97,0x94,0x9a,0x9a,0x9c,0x9e,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9d,0x9e,0x9f,0x27,0x26,0x23,0xf6,\r
+ 0xf7,0x2e,0x2d,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2f,\r
+ 0xf7,0x36,0x26,0x28,0x2c,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x27,0x27,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2c,0x2a,0x2b,0x2d,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0x2f,0x2d,0x2a,0xf7,0xf7,0xf7,0xf7,0x29,0x36,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x23,0x02,0x02,0x01,0xf7,0xf7,0x07,0x07,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x03,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,\r
+ 0x02,0x05,0x05,0x04,0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0x97,0x99,0x9a,0x97,0x97,0x98,0x99,0x9a,0x9a,\r
+ 0x9a,0x9a,0x99,0x99,0x98,0x97,0x97,0x97,0x97,0x98,0x99,0x9b,0x9f,\r
+ 0x9f,0x97,0x9b,0xf7,0x01,0x98,0x97,0x02,0x99,0x9a,0x9c,0x9b,0x97,\r
+ 0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9e,0x2c,0x2f,0x2c,0x2e,\r
+ 0x2b,0x2f,0x2b,0x2b,0x2c,0x2b,0x2a,0x28,0x2c,0x2f,0x2f,0x2d,0x2f,\r
+ 0x2a,0x27,0x27,0x26,0x26,0x25,0x25,0x26,0x26,0x27,0x27,0x28,0x2c,\r
+ 0xf6,0x2f,0x99,0x9b,0x9f,0x9f,0x9d,0x94,0x97,0x03,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x98,0x9b,0x94,0x99,0x9e,\r
+ 0x9c,0x9c,0x97,0x94,0x99,0x9a,0x9b,0x9c,0x9d,0x9c,0x9c,0x9c,0x9d,\r
+ 0x9d,0x9d,0x9e,0x9f,0x27,0x2e,0xf6,0x36,0xf7,0xf7,0x2c,0x2c,0x2f,\r
+ 0xf6,0x01,0x01,0x01,0x01,0xf6,0x2f,0x2f,0xf7,0x28,0x25,0x29,0x2c,\r
+ 0x2e,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf6,0xf6,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2a,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x03,0x02,0x02,0x02,0xf7,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x06,0x04,0x04,0x02,0xf7,\r
+ 0x02,0x02,0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x04,0x04,0x02,0x02,0x02,0x02,0x03,0xf7,0xf7,0xf7,0x02,0x9a,\r
+ 0x9b,0x99,0x97,0x97,0x99,0x9a,0x9a,0x9b,0x9c,0x9b,0x9a,0x9a,0x99,\r
+ 0x99,0x99,0x99,0x99,0x9a,0x9d,0x9f,0x03,0x03,0x94,0x9a,0xf7,0xf7,\r
+ 0x9e,0x97,0x9a,0x9a,0x99,0x9b,0x9d,0x94,0x9a,0x9c,0x9f,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x2a,0x2c,0x2e,0x2c,0x2c,0x2c,0xf6,0x2b,0x2b,\r
+ 0x2c,0x2b,0x2a,0x28,0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,0x26,\r
+ 0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x28,0x2c,0xf6,0x98,0x99,0x9b,\r
+ 0x9f,0x9f,0x9c,0x94,0x97,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x9e,0x94,0x9a,0x99,0x97,0x9a,0x9e,0x9c,0x9c,0x98,0x94,\r
+ 0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9d,0x9d,0x9d,0x9e,0x9f,0x2c,\r
+ 0xf7,0xf7,0x01,0x35,0xf7,0xf7,0x2c,0x2b,0x2c,0x2e,0x2f,0xf6,0xf6,\r
+ 0x2f,0x2f,0x2f,0x01,0xf7,0x26,0x2a,0x2e,0x2f,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2f,0x2e,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0x23,0x36,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x27,0x9f,0x9f,0x03,0x02,\r
+ 0x01,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x04,0x06,0x07,0x07,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,\r
+ 0x02,0x02,0x06,0x04,0x04,0x02,0xf7,0x03,0xf7,0x03,0x04,0x04,0x03,\r
+ 0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x02,0x02,0x02,\r
+ 0x03,0x02,0xf7,0xf7,0x02,0x02,0x03,0x9c,0x9b,0x98,0x94,0x97,0x99,\r
+ 0x9a,0x9c,0x9d,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x03,\r
+ 0x02,0x02,0x02,0x9e,0x94,0x9a,0xf7,0xf7,0x02,0x97,0x97,0x03,0x99,\r
+ 0x9a,0x9c,0x9b,0x98,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x29,\r
+ 0x2a,0x2d,0x2d,0x2c,0x2c,0x2d,0x2f,0x2b,0x2b,0x2b,0x2a,0x2a,0x28,\r
+ 0x02,0x2f,0x2d,0x2f,0x2f,0x28,0x27,0x27,0x26,0x25,0x25,0x25,0x26,\r
+ 0x26,0x27,0x27,0x28,0x2c,0x97,0x98,0x99,0x9c,0x9f,0x9f,0x9c,0x94,\r
+ 0x98,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9c,0x94,\r
+ 0x9e,0x97,0x97,0x9a,0x9e,0x9c,0x9b,0x9a,0x94,0x94,0x97,0x97,0x98,\r
+ 0x98,0x98,0x9d,0x9d,0x9e,0x9e,0x9d,0xf7,0xf7,0xf7,0xf7,0x27,0x35,\r
+ 0xf6,0xf7,0xf6,0x2b,0x2a,0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x01,0xf7,\r
+ 0x27,0x2a,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2f,0x2c,\r
+ 0x2d,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2e,0x2c,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0x26,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x23,\r
+ 0x25,0x27,0x28,0x2a,0x9f,0x9f,0x9f,0x03,0x02,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x06,0x07,0x07,0x07,0x04,0x03,0x02,0x04,0x06,0x07,\r
+ 0x06,0x03,0x02,0x02,0x02,0x03,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,0x05,0x04,0x03,0xf7,\r
+ 0xf7,0x04,0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x04,0x04,0x04,0x04,0x02,0x02,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x04,0x04,0x9d,0x9a,0x97,0x94,0x97,0x99,0x9a,0x9c,0x9e,0x9e,0x9f,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x9f,0x97,0x94,\r
+ 0x9b,0xf7,0xf7,0x01,0x9a,0x97,0x9f,0x99,0x99,0x9a,0x9d,0x94,0x9a,\r
+ 0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x28,0x2a,0x2b,0x2e,0x2c,0x2d,\r
+ 0x2a,0x2f,0x2c,0x2b,0x2c,0x2b,0x2a,0x29,0x28,0x2f,0x2f,0x2c,0x2f,\r
+ 0x2c,0x27,0x27,0x26,0x26,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x28,\r
+ 0x9b,0x97,0x98,0x99,0x9c,0x9f,0x9f,0x9b,0x94,0x98,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x9f,0x97,0x97,0x9a,\r
+ 0x9e,0x9c,0x9a,0x9a,0x9a,0x97,0x94,0x94,0x94,0x94,0x9b,0x9b,0x9b,\r
+ 0x9d,0x9f,0x2f,0xf7,0xf7,0xf7,0x2e,0x35,0x35,0x23,0xf7,0xf7,0xf7,\r
+ 0x2d,0x2c,0x2c,0x2e,0x2f,0x2f,0xf7,0xf7,0x29,0x27,0xf7,0x2f,0xf7,\r
+ 0xf7,0x01,0xf6,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf6,0x2e,0x2c,0x2c,0x2c,0x2f,0xf6,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2e,0x2e,0x2d,0x2c,0xf7,0xf7,0xf7,0xf7,0x2a,0x36,\r
+ 0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x29,0x2a,0x2c,0x2c,0x9e,\r
+ 0x9e,0x9f,0x9f,0x03,0x06,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x03,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x02,0x04,0x06,0x07,0x06,0x04,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x02,0xf7,0x05,0x05,0x04,0x03,0xf7,0xf7,0x02,0xf7,0x04,0x04,0x03,\r
+ 0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x03,0x02,0x02,\r
+ 0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x04,0x05,0x05,0x04,0x9b,0x99,0x97,\r
+ 0x94,0x94,0x97,0x98,0x99,0x9c,0x9e,0x9f,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x03,0x03,0x9f,0x9d,0x9b,0x97,0x94,0x94,0x9e,0xf7,0xf7,0xf7,0x03,\r
+ 0x97,0x99,0x9e,0x99,0x9a,0x9b,0x9c,0x97,0x9b,0x9d,0x9f,0x9f,0x03,\r
+ 0x03,0x03,0x27,0x28,0x2a,0x2c,0x2f,0x2c,0x2e,0x2c,0x2f,0x2b,0x2b,\r
+ 0x2c,0x2a,0x2a,0x28,0x2c,0x2f,0x2f,0x2d,0x2f,0x2a,0x27,0x27,0x26,\r
+ 0x26,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x9f,0x9b,0x97,0x98,0x99,\r
+ 0x9c,0x9f,0x9f,0x9a,0x94,0x99,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x99,0x94,0x9f,0x97,0x97,0x99,0x9e,0x9c,0x9a,0x98,\r
+ 0x97,0x98,0x98,0x97,0x97,0x9b,0x9b,0x9a,0x9a,0x9a,0x26,0x2f,0xf7,\r
+ 0xf7,0xf7,0x27,0x35,0x35,0x35,0x36,0x2f,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0x2a,0x2c,0xf7,0xf7,0xf7,0xf7,0x25,0x27,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2e,0x2d,\r
+ 0x2c,0xf7,0xf7,0xf7,0xf7,0x2c,0x36,0x36,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x23,\r
+ 0x25,0x27,0x2a,0x2c,0x2c,0x2e,0x2e,0x9c,0x9d,0x9e,0x9e,0x9f,0x05,\r
+ 0x06,0x06,0x05,0x05,0x05,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x05,0x07,0x07,0x05,0x02,0x02,\r
+ 0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,0x06,0x04,0x04,0x02,\r
+ 0xf7,0x02,0xf7,0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x03,0x02,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x05,0x05,0x05,0x04,0x9a,0x98,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0x01,0x97,0x97,0x02,0x99,0x9a,\r
+ 0x9a,0x9c,0x97,0x9a,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x27,0x27,0x28,\r
+ 0x2a,0x2c,0x2e,0x2c,0x2c,0x2c,0xf6,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,\r
+ 0x2f,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,0x26,0x25,0x25,0x25,0x25,\r
+ 0x26,0x26,0x27,0x03,0x9f,0x9b,0x97,0x98,0x99,0x9c,0x9f,0x9f,0x99,\r
+ 0x94,0x9a,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x99,\r
+ 0x94,0x9f,0x97,0x97,0x97,0x9c,0x9d,0x9b,0x9a,0x98,0x97,0x97,0x97,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0xf7,0x28,0x2c,0xf7,0xf7,0xf7,0x26,0x36,\r
+ 0x35,0x35,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,0x02,0x2a,0x2a,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2e,0x23,0x27,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x2e,0x2e,0x2d,0x2c,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x27,0x2a,0x2c,0x2d,0x2f,\r
+ 0x2f,0x2f,0x9c,0x9d,0x9d,0x9d,0x9e,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x05,0x07,0x07,0x07,0x04,0xf7,0xf7,0x03,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0x03,0x06,0x07,0x06,0x03,0x02,0x02,0x03,0x04,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x04,0x02,0x02,0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,0x04,0x04,\r
+ 0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x02,\r
+ 0x03,0x03,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x05,0x06,0x06,0x04,0x03,\r
+ 0x99,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x9b,0x03,0xf7,\r
+ 0xf7,0xf7,0x01,0x99,0x97,0x9b,0x9d,0x99,0x9a,0x9a,0x9d,0x94,0x9b,\r
+ 0x9c,0x9e,0x9f,0x03,0x03,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,0x2c,\r
+ 0x2b,0x2d,0x2f,0x2b,0x2b,0x2b,0x2a,0x2a,0x28,0x02,0x2f,0x2d,0x2f,\r
+ 0x2f,0x29,0x27,0x27,0x26,0x25,0x25,0x25,0x25,0x26,0x26,0x03,0x03,\r
+ 0x9f,0x9a,0x97,0x98,0x99,0x9d,0x9f,0x9f,0x99,0x94,0x9b,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9e,0x99,0x94,\r
+ 0x94,0x97,0x9a,0x9d,0x9d,0x9c,0x9c,0x9c,0x9b,0x9b,0x9a,0x9a,0x9a,\r
+ 0xf7,0xf7,0x2f,0x27,0xf7,0xf7,0xf7,0x2d,0x27,0x26,0x25,0x27,0x2a,\r
+ 0x2e,0x27,0x36,0x25,0x27,0x29,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2e,\r
+ 0x2d,0x2c,0x02,0xf7,0xf7,0xf7,0xf7,0x23,0x36,0x36,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x27,0x29,0x2a,0x2c,0x2e,0x2f,0x2f,0x2f,0x2f,0x9c,0x9c,0x9c,\r
+ 0x9d,0x9d,0x04,0x04,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x02,\r
+ 0xf7,0x02,0x05,0x06,0x05,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x07,\r
+ 0x07,0x05,0x03,0x02,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,0x05,0x04,0x03,\r
+ 0xf7,0xf7,0x03,0xf7,0x04,0x04,0x04,0x03,0x02,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0xf7,0xf7,0x02,0xf7,\r
+ 0x04,0x05,0x06,0x06,0x06,0x05,0x04,0x03,0x99,0x99,0x99,0x98,0x98,\r
+ 0x98,0x98,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9a,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,\r
+ 0x97,0x02,0x99,0x9a,0x9a,0x9b,0x99,0x99,0x9b,0x9d,0x9f,0x9f,0x03,\r
+ 0x27,0x27,0x27,0x28,0x2a,0x2b,0x2e,0x2c,0x2e,0x2b,0x2f,0x2c,0x2b,\r
+ 0x2c,0x2a,0x2a,0x2a,0x27,0x2f,0x2f,0x2d,0x2f,0x2e,0x28,0x27,0x26,\r
+ 0x26,0x25,0x25,0x25,0x25,0x26,0x02,0x03,0x03,0x9f,0x9a,0x97,0x98,\r
+ 0x9a,0x9d,0x9f,0x9f,0x98,0x94,0x9b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x9b,0x94,0x99,0x9f,0x98,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x97,0x9e,0x9e,0x9d,0x9d,0x9d,0x2e,0xf7,0xf7,0xf7,0x27,\r
+ 0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x26,0x27,0x28,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2e,0x2e,0x2c,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0x26,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x23,0x23,0x27,0x29,0x2a,0x2c,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x9c,0x9d,0x9d,0x9d,0x9d,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x06,0x07,0x07,0x04,0xf7,0x02,0x06,0x07,0x06,0x06,\r
+ 0x06,0x03,0xf7,0xf7,0xf7,0x02,0x03,0x06,0x07,0x07,0x05,0x04,0x04,\r
+ 0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x02,0xf7,0x05,0x05,0x04,0x02,0xf7,0xf7,0x02,0x02,0x04,0x04,\r
+ 0x03,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0x02,0xf7,0x05,0x05,0x06,0x07,0x07,0x05,\r
+ 0x04,0x03,0x03,0x9a,0x9a,0x9c,0x9b,0x9c,0x9c,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9a,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9b,0x9c,0x9e,0x9f,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x97,0x97,0x9d,0x9e,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x9a,0x9b,0x9d,0x9f,0x03,0x27,0x27,0x27,0x27,0x28,\r
+ 0x2a,0x2c,0x2e,0x2c,0x2e,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,\r
+ 0x2a,0x2f,0x2f,0x2c,0x2f,0x2c,0x27,0x27,0x26,0x25,0x25,0x25,0x25,\r
+ 0x25,0x02,0x02,0x03,0x03,0x9f,0x9a,0x97,0x98,0x9a,0x9d,0x9f,0x9f,\r
+ 0x98,0x94,0x9c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x9e,0x97,0x94,0x98,0x9e,0x9d,0x99,0x97,0x94,0x94,0x94,0x97,0x97,\r
+ 0x99,0x9e,0x9f,0x2a,0x2a,0x2e,0xf7,0xf7,0xf7,0x27,0x29,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2b,0x28,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0xf6,0x2f,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,\r
+ 0x2e,0x2e,0x2c,0x2d,0xf7,0xf7,0xf7,0xf7,0x2a,0x36,0x36,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x27,0x2a,0x2a,0x2c,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x9d,0x9e,0x9d,0x9d,0x9c,0x04,0x03,0x03,0x03,0x03,0x04,0x07,0x07,\r
+ 0x06,0x02,0xf7,0x04,0x06,0x05,0x05,0x05,0x06,0x05,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0x06,0x07,0x07,0x07,0x06,0x05,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,0x06,0x04,0x04,\r
+ 0x02,0xf7,0x03,0xf7,0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x05,0x06,0x06,0x07,0x07,0x06,0x05,0x04,0x04,0x04,0x9c,0x9d,\r
+ 0x9e,0x9f,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x99,0x97,0x98,0x02,0x9a,0x9a,0x9a,0x9b,0x9c,0x97,0x9b,\r
+ 0x9c,0x9e,0x9f,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,\r
+ 0x2c,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x2e,0x2f,0x2e,0x2d,\r
+ 0x2f,0x2a,0x27,0x27,0x26,0x25,0x25,0x25,0x25,0x02,0x02,0x02,0x03,\r
+ 0x03,0x9f,0x99,0x97,0x99,0x9a,0x9d,0x9f,0x9f,0x97,0x94,0x9c,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9d,0x99,0x94,\r
+ 0x94,0x94,0x94,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x9c,0x2c,0x2c,\r
+ 0x2c,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0x2a,0x23,0x2a,0x01,0x2e,0x2a,\r
+ 0x2c,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,0x2f,0x2c,0x2c,\r
+ 0x2f,0xf6,0x01,0xf7,0xf7,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2c,0x2c,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x36,0x23,0x25,0x27,0x29,0x2a,0x2c,0x2e,0x2f,\r
+ 0x2f,0xf6,0x2f,0xf6,0x2f,0x2f,0x2e,0x2d,0x9e,0x9e,0x9e,0x9d,0x9c,\r
+ 0x03,0x03,0x03,0x03,0x03,0x06,0x07,0x07,0x04,0xf7,0x03,0x06,0x04,\r
+ 0x03,0x03,0x03,0x05,0x06,0x04,0xf7,0xf7,0x02,0x02,0x06,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x03,0x02,0x02,0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,0x04,\r
+ 0x04,0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,\r
+ 0x03,0x03,0x03,0xf7,0xf7,0xf7,0x02,0x02,0x05,0x06,0x06,0x06,0x07,\r
+ 0x06,0x06,0x05,0x04,0x04,0x04,0x9f,0x9f,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x02,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9c,0x97,0x94,\r
+ 0x9b,0x9f,0x9a,0x9a,0x9a,0x9c,0x99,0x99,0x9b,0x9d,0x9f,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,0x2d,0x2b,0x2d,0x2f,0x2b,\r
+ 0x2b,0x2b,0x2a,0x2a,0x28,0xf6,0x2f,0x2e,0x2e,0x2f,0x2a,0x27,0x27,\r
+ 0x26,0x25,0x25,0x25,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x99,0x97,\r
+ 0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9d,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x9f,0x9d,0x9c,0x9b,0x9a,\r
+ 0x9a,0x99,0x99,0x98,0x94,0x94,0xf7,0xf6,0x01,0x2f,0x2c,0x2a,0x2c,\r
+ 0x01,0xf7,0xf7,0xf7,0xf6,0x2a,0x2c,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x02,0x01,0x02,0x2c,0x2a,0x2d,0x2f,0x02,0x01,0x01,\r
+ 0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2d,0x2e,0x2c,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0x36,0x36,0x36,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,\r
+ 0x25,0x27,0x2a,0x2a,0x2c,0x2f,0x2f,0xf6,0x2f,0xf6,0x2f,0x2f,0x2f,\r
+ 0x2d,0x2c,0x2c,0x9e,0x9e,0x9e,0x9d,0x9c,0x03,0x03,0x03,0x03,0x04,\r
+ 0x07,0x07,0x06,0xf7,0xf7,0x06,0x05,0x02,0x02,0x03,0x03,0x04,0x06,\r
+ 0x06,0x02,0xf7,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x02,0x04,0x05,0x04,\r
+ 0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x03,0x03,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0xf7,0xf7,0xf7,\r
+ 0x03,0x02,0x05,0x06,0x05,0x06,0x07,0x07,0x06,0x05,0x05,0x05,0x05,\r
+ 0x05,0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x97,0x03,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x9a,0x9b,0x9d,0x29,0x27,0x27,0x27,0x27,0x27,0x28,\r
+ 0x2a,0x2b,0x2e,0x2c,0x2f,0x2b,0x2e,0x2c,0x2b,0x2c,0x2b,0x2a,0x2a,\r
+ 0x27,0x02,0x2f,0x2d,0x2f,0x2f,0x2a,0x27,0x27,0x26,0x25,0x25,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,0x9f,\r
+ 0x9f,0x97,0x94,0x9d,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9a,0x9a,0x9a,0x99,\r
+ 0x97,0xf7,0xf7,0xf6,0x2f,0x2f,0x2c,0x2a,0x2a,0x2f,0x01,0x01,0xf6,\r
+ 0x2f,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x01,0x2e,0x2c,0x2d,0x2f,0xf6,0x02,0x02,0x02,0x02,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2d,0x2a,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0x25,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x27,0x27,0x2a,0x2c,0x2e,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf6,0x2f,0x2f,0x2e,0x2d,0x2c,0x2a,0x2a,0x9e,0x9e,\r
+ 0x9d,0x9c,0x9b,0x03,0x03,0x03,0x04,0x07,0x07,0x06,0x03,0xf7,0x04,\r
+ 0x06,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x06,0x03,0xf7,0xf7,0x02,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x02,0xf7,0x05,0x04,0x04,0x02,0xf7,0x02,0x02,0x02,0x04,\r
+ 0x04,0x03,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x04,0x03,0x03,0x02,0xf7,0xf7,0x02,0x03,0x03,0x05,0x06,0x04,0x06,\r
+ 0x07,0x07,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x02,0x02,0x02,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x98,0x97,0x94,0x99,0x03,0x9a,0x9a,0x9a,0x9a,0x9c,0x94,0x9b,\r
+ 0x9c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,\r
+ 0x2e,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x29,0x28,0x2f,0x2f,0x2d,\r
+ 0x2f,0x2f,0x28,0x27,0x27,0x26,0x25,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9c,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9b,0x9b,0x9a,0x9a,0x99,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2d,0x2a,0x2a,0x2d,0x2f,0x01,0x01,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf6,0x28,0xf7,0xf7,0x2f,0x01,0xf7,0xf7,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0xf6,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2d,0x2e,0x2e,0x2c,0x2a,0xf7,0xf7,0xf7,0xf7,0x2a,0x35,\r
+ 0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x23,\r
+ 0x23,0x27,0x29,0x2a,0x2d,0x2f,0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2d,0x2c,0x2a,0x2a,0x2a,0x2a,0x9e,0x9d,0x9c,0x9b,0x9a,0x03,0x03,\r
+ 0x03,0x07,0x07,0x07,0x04,0xf7,0x02,0x06,0x04,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x04,0x06,0x04,0x02,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x02,0x02,0x06,0x04,\r
+ 0x03,0x02,0xf7,0x04,0xf7,0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0x02,0x03,0x04,0x06,0x05,0x04,0x06,0x07,0x07,0x07,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x07,0x01,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x98,0x97,0x94,\r
+ 0x9e,0x9f,0x9a,0x9a,0x9a,0x9b,0x99,0x97,0x9b,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,0x2d,0x2c,0x2f,0x2b,\r
+ 0x2b,0x2c,0x2a,0x2a,0x28,0x2a,0x2f,0x2f,0x2c,0x2f,0x2d,0x27,0x27,\r
+ 0x26,0x26,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x99,\r
+ 0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9c,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x03,0x03,0x9f,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9a,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2f,\r
+ 0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x36,0x2a,0xf7,0x2f,0x2f,\r
+ 0x01,0xf7,0x2f,0x2f,0x2f,0x2f,0xf6,0x2f,0x2f,0x2f,0x2f,0x02,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2f,0x2c,\r
+ 0x29,0x2c,0xf7,0xf7,0xf7,0xf7,0x36,0x36,0x36,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x23,0x25,0x27,0x29,0x2a,0x2d,0x2f,\r
+ 0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,0x2e,0x2c,0x2c,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2b,0x9d,0x9c,0x9b,0x9a,0x9a,0x03,0x04,0x07,0x07,0x07,0x04,0xf7,\r
+ 0xf7,0x06,0x05,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,\r
+ 0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x04,0x02,0x03,0x05,0x04,0x03,0xf7,0xf7,0x04,0xf7,0x03,\r
+ 0x04,0x04,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x04,0x03,0x04,0x02,0xf7,0xf7,0x03,0x03,0x04,0x06,0x04,0x03,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9c,0x98,0x97,0x94,0x97,0x03,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x99,0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,\r
+ 0x29,0x2a,0x2d,0x2d,0x2d,0x2c,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,\r
+ 0x28,0x2f,0x2f,0x2e,0x2d,0x2f,0x2c,0x27,0x27,0x26,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,\r
+ 0x9f,0x9f,0x97,0x94,0x9c,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x9c,0x9c,0x9c,0x9b,0x9b,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0x2c,0x2f,0x2f,0x2e,0x2f,0x2f,\r
+ 0x02,0x02,0x02,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2d,0x2e,0x2f,0x2f,0x2a,0x27,0x2f,0xf7,0xf7,0xf7,\r
+ 0x2c,0x35,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,\r
+ 0x23,0x25,0x27,0x2a,0x2c,0x2e,0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2d,0x2c,0x2a,0x2a,0x2a,0x2a,0x2a,0x2b,0x2d,0x9c,0x9b,0x9a,0x9a,\r
+ 0x9a,0x04,0x07,0x07,0x07,0x05,0xf7,0xf7,0x04,0x06,0x04,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x06,0x02,0xf7,0xf7,0x05,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x02,0x04,0x05,\r
+ 0x04,0x02,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x03,0x02,0x02,0x02,0x03,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x04,0x06,0x03,0x04,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9e,\r
+ 0x99,0x98,0x97,0x94,0x9a,0x03,0x9a,0x9a,0x9a,0x9a,0x9d,0x94,0x2d,\r
+ 0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,0x2c,\r
+ 0x2e,0x2b,0x2e,0x2d,0x2b,0x2b,0x2b,0x2a,0x2a,0x27,0x02,0x2f,0x2e,\r
+ 0x2e,0x2f,0x2a,0x27,0x27,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x9e,0x99,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,\r
+ 0x9b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x9c,0x9c,0x9c,0x9c,0x9c,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x01,0x01,\r
+ 0x2f,0x2c,0x2d,0x2f,0x2f,0x2f,0x2f,0xf6,0x01,0xf7,0x01,0x2f,0x2f,\r
+ 0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2d,0x2e,0x2f,\r
+ 0x2f,0x2d,0x28,0x27,0x02,0xf7,0xf7,0xf7,0x25,0x35,0x36,0x36,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x25,0x27,0x2a,0x2c,0x2e,\r
+ 0x2f,0x2f,0xf6,0xf6,0x2f,0x2f,0x2f,0x2c,0x2a,0x2a,0x29,0x2a,0x2a,\r
+ 0x2a,0x2b,0x2d,0x2f,0x9a,0x9a,0x9a,0x9a,0x9e,0x07,0x07,0x07,0x05,\r
+ 0xf7,0xf7,0x03,0x06,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x05,0x06,0x02,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0xf7,0x05,0x04,0x04,0x02,0xf7,0x03,0x02,0x02,\r
+ 0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x03,0x05,0x06,0x03,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x9a,0x98,0x97,0x94,0x94,\r
+ 0x9d,0x9f,0x9a,0x9a,0x9a,0x9b,0x9c,0x02,0x2c,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,0x2f,0x2b,0x2f,0x2c,\r
+ 0x2b,0x2c,0x2a,0x2a,0x29,0x27,0xf6,0x2f,0x2d,0x2f,0x2f,0x2a,0x27,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,\r
+ 0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x97,0x94,0x9a,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0x2f,0x2f,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2d,0x2d,0x2f,0x2f,0x2f,0x2e,0x2a,0x26,0x26,0x01,\r
+ 0xf7,0xf7,0xf7,0x25,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,\r
+ 0x23,0x23,0x27,0x29,0x2a,0x2d,0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2e,0x2c,0x2a,0x2a,0x29,0x29,0x29,0x2a,0x2b,0x2d,0x2f,0x02,0x9a,\r
+ 0x9a,0x9a,0x9f,0xf7,0x07,0x07,0x06,0xf7,0xf7,0x02,0x06,0x06,0x04,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x06,0x02,0xf7,\r
+ 0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0x02,0x06,\r
+ 0x04,0x04,0x02,0xf7,0x04,0xf7,0x03,0x04,0x04,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0xf7,\r
+ 0xf7,0xf7,0x03,0x04,0x05,0x06,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x03,0x9d,0x99,0x98,0x97,0x94,0x97,0x9f,0x9d,0x9a,0x9a,\r
+ 0x9a,0x9c,0x2f,0x2f,0x2c,0x2c,0x29,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x28,0x2a,0x2c,0x2e,0x2c,0x2d,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,\r
+ 0x28,0x28,0x2f,0x2f,0x2c,0x2f,0x2f,0x28,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9e,0x98,0x97,0x99,0x9a,\r
+ 0x9e,0x9f,0x9f,0x97,0x94,0x99,0x03,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x27,0x23,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2d,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2e,0x2c,0x27,0x23,0x26,0x01,0xf7,0xf7,0xf7,0x27,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x23,0x25,0x27,0x2a,0x2c,0x2e,\r
+ 0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,0x2d,0x2c,0x2a,0x29,0x29,0x28,\r
+ 0x29,0x2a,0x2b,0x2e,0x2f,0x02,0x01,0x9a,0x9b,0x9f,0xf7,0xf7,0x07,\r
+ 0x05,0xf7,0xf7,0x02,0x05,0x06,0x05,0x04,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x06,0x06,0x02,0xf7,0xf7,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x06,0x02,0x03,0x05,0x04,0x04,0xf7,0xf7,0x04,0xf7,\r
+ 0x03,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x05,\r
+ 0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9f,0x9a,\r
+ 0x98,0x98,0x97,0x94,0x98,0x03,0x9b,0x9a,0x9a,0x9a,0x2b,0x02,0x2f,\r
+ 0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,\r
+ 0x2c,0x2c,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x2c,0x2f,0x2f,\r
+ 0x2d,0x2f,0x2d,0x9f,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x9e,0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x98,\r
+ 0x94,0x97,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,\r
+ 0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf6,0xf6,0xf6,0xf6,\r
+ 0x2f,0xf6,0x02,0xf7,0xf7,0xf7,0xf7,0x2c,0x36,0x23,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2e,0x2e,0x2d,0x2c,0x2b,0x2a,0x2a,0x2a,0x28,0x27,\r
+ 0x23,0x25,0x2e,0xf7,0xf7,0xf7,0x2f,0x25,0x35,0x35,0x35,0x35,0x36,\r
+ 0x23,0x25,0x27,0x29,0x2a,0x2c,0x2e,0x2f,0x2f,0xf6,0xf6,0x2f,0x2f,\r
+ 0x2f,0x2c,0x2a,0x2a,0x29,0x28,0x28,0x29,0x2a,0x2c,0x2f,0xf6,0x01,\r
+ 0x01,0x02,0x9c,0x03,0xf7,0xf7,0xf7,0x05,0xf7,0xf7,0x02,0x05,0x06,\r
+ 0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x07,\r
+ 0x04,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x05,0x06,0x06,0x07,0x07,0x07,0x05,0x02,0x05,\r
+ 0x05,0x04,0x03,0xf7,0xf7,0x03,0xf7,0x04,0x04,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x04,0x02,\r
+ 0xf7,0xf7,0xf7,0x03,0x04,0x05,0x05,0x02,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x9d,0x99,0x98,0x98,0x97,0x94,\r
+ 0x9a,0x03,0x9a,0x9a,0x9a,0x2c,0x2c,0x01,0x2d,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,0x2c,0x2e,0x2b,0x2e,0x2f,\r
+ 0x2b,0x2b,0x2b,0x2a,0x2a,0x27,0x2f,0x2f,0x2e,0x2d,0x2f,0x9d,0x9f,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x9e,0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x98,0x94,0x97,0x9e,0x03,\r
+ 0x02,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x94,0x94,0x94,0x94,0x94,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0xf6,0x02,0xf7,0xf7,\r
+ 0xf7,0xf6,0x23,0x36,0x2a,0xf7,0xf7,0xf7,0x02,0x2f,0x2f,0x2d,0x2c,\r
+ 0x2a,0x27,0x25,0x23,0x25,0x25,0x25,0x26,0x25,0x23,0x26,0x2e,0xf7,\r
+ 0xf7,0xf7,0x2f,0x25,0x35,0x35,0x35,0x36,0x26,0x29,0x2a,0x2c,0x2d,\r
+ 0x2f,0x2f,0xf6,0xf6,0xf6,0x2f,0x2f,0x2e,0x2c,0x2a,0x29,0x28,0x28,\r
+ 0x28,0x29,0x2a,0x2c,0x2f,0xf6,0x01,0x01,0xf6,0x2e,0x02,0xf7,0xf7,\r
+ 0xf7,0x9c,0xf7,0xf7,0x02,0x04,0x06,0x05,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x06,0x07,0x06,0x02,0xf7,0xf7,0xf7,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,\r
+ 0x05,0x06,0x07,0x07,0x05,0x03,0x06,0x05,0x04,0x04,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x04,0x03,0x04,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,\r
+ 0x04,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0x9f,0x9c,0x99,0x98,0x97,0x97,0x94,0x9b,0x03,0x99,0x9a,\r
+ 0x2e,0x2c,0x2e,0xf6,0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x28,0x2a,0x2c,0x2e,0x2c,0x2f,0x2b,0x2f,0x2c,0x2b,0x2c,0x2a,0x2a,\r
+ 0x29,0x27,0x02,0x2f,0x2e,0x2e,0x98,0x9e,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x9f,0x9e,0x98,0x97,0x99,\r
+ 0x9a,0x9e,0x9f,0x9f,0x98,0x94,0x94,0x9a,0x9f,0x9f,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x94,0x94,0x94,0x94,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0x01,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0x27,0x35,0x2a,0xf7,\r
+ 0xf7,0xf7,0xf6,0x2f,0x2e,0x2c,0x2e,0xf7,0xf7,0x01,0xf6,0x2c,0x27,\r
+ 0x25,0x23,0x27,0x28,0x2a,0x27,0x26,0x27,0x01,0xf7,0xf7,0xf6,0x26,\r
+ 0x35,0x35,0x35,0x27,0x2c,0x2d,0x2e,0x2f,0xf6,0x02,0xf6,0xf6,0x2f,\r
+ 0x2f,0x2d,0x2a,0x2a,0x29,0x28,0x28,0x28,0x29,0x2a,0x2c,0x2f,0x02,\r
+ 0x01,0x02,0x2f,0x2b,0x36,0xf7,0xf7,0xf7,0x99,0x97,0xf7,0x02,0x04,\r
+ 0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x07,0x06,0x03,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x05,\r
+ 0x06,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x06,0x03,0x02,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,0x9f,0x9d,\r
+ 0x99,0x98,0x97,0x97,0x97,0x9f,0x9e,0x9a,0x2e,0x2d,0x2c,0xf6,0x2f,\r
+ 0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,\r
+ 0x2c,0x2e,0x2c,0x2f,0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x27,0x2f,0x2f,\r
+ 0x2d,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x9f,0x9e,0x98,0x97,0x99,0x9a,0x9e,0x9f,0x9f,\r
+ 0x98,0x94,0x94,0x98,0x9c,0x9e,0x9f,0x9f,0x9e,0x9f,0x9e,0x99,0x99,\r
+ 0x98,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0x01,0xf7,0xf7,0x2c,0x35,0x27,0xf7,0xf7,0x01,0xf6,0x2e,0x2c,0x2a,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x27,0x27,0x2e,0xf7,\r
+ 0xf7,0xf7,0x02,0x2a,0x2a,0xf7,0xf7,0x02,0x26,0x35,0x35,0x27,0x2f,\r
+ 0x2f,0x2f,0xf6,0x02,0x02,0xf6,0x2f,0x2f,0x2c,0x2a,0x29,0x28,0x27,\r
+ 0x28,0x28,0x2a,0x2a,0x2c,0x2f,0x02,0x01,0x02,0x2f,0x28,0x35,0x35,\r
+ 0xf7,0x01,0x97,0x97,0x97,0x02,0x04,0x05,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x04,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,0xf7,0x03,0x03,0x04,\r
+ 0x06,0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x03,0x9e,0x9a,0x98,0x97,0x97,\r
+ 0x98,0x02,0x9a,0x2f,0x2e,0x2c,0x2b,0x01,0x2d,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2d,0x2d,0x2c,0x2c,0x2c,0x2f,\r
+ 0x2b,0x2b,0x2c,0x2a,0x2a,0x28,0x2a,0x2f,0x2e,0x9b,0x99,0x9a,0x9f,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x01,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x9f,0x9d,0x97,0x97,0x99,0x9a,0x9e,0x9f,0x9f,0x99,0x94,0x94,0x94,\r
+ 0x99,0x9a,0x9b,0x9c,0x9d,0x9c,0x99,0x99,0x99,0x98,0x98,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,0x25,0x27,\r
+ 0xf7,0xf7,0x01,0xf6,0x2e,0x2a,0x2f,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2f,0x28,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x28,0xf7,0xf7,0x2f,0x36,0x35,0x23,0x2f,0x02,0x02,0x01,0x02,0xf6,\r
+ 0x2f,0x2d,0x2c,0x2a,0x29,0x27,0x27,0x28,0x29,0x2a,0x2a,0x2e,0x2f,\r
+ 0x02,0x01,0xf6,0x2f,0x27,0x35,0x35,0x35,0x03,0x97,0x97,0x94,0x99,\r
+ 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x06,\r
+ 0x06,0x05,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x05,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x05,0xf7,0x02,0xf7,0xf7,0x02,0x04,0x03,0x04,0x03,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x03,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x06,0x02,0x03,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0x9f,0x9a,0x98,0x97,0x94,0x99,0x02,0x2f,0x2e,\r
+ 0x2e,0x2c,0x2c,0xf6,0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x28,0x2a,0x2b,0x2d,0x2c,0x2e,0x2b,0x2d,0x2f,0x2c,0x2b,0x2b,0x2a,\r
+ 0x29,0x27,0x2f,0x2f,0x9a,0x9a,0x98,0x9a,0x9f,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x9f,0x9c,0x97,0x97,\r
+ 0x99,0x9a,0x9e,0x9f,0x9f,0x9a,0x94,0x94,0x94,0x94,0x98,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x02,0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,0xf7,0xf6,0x2e,0x2a,\r
+ 0x01,0xf7,0xf7,0xf6,0x36,0x35,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,\r
+ 0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0xf7,0xf7,0x2a,\r
+ 0x35,0x23,0x02,0x01,0x01,0x01,0xf6,0x2f,0x2e,0x2c,0x29,0x28,0x27,\r
+ 0x27,0x27,0x29,0x2a,0x2c,0x2e,0x2f,0x01,0x01,0x2f,0x2c,0x23,0x35,\r
+ 0x35,0x35,0x2c,0x97,0x94,0x94,0x9b,0x9e,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x05,0x05,0x04,0x03,0x04,0x06,0x06,0x05,0x04,0xf7,0x02,0xf7,\r
+ 0xf7,0x03,0x03,0x03,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x02,0xf7,0xf7,0xf7,0x04,0x04,\r
+ 0x05,0x06,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x9f,0x9a,0x97,0x97,0x97,0x9d,0x29,0x2f,0x2e,0x2d,0x2c,0x2f,0x2f,\r
+ 0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,\r
+ 0x2c,0x2f,0x2b,0x2e,0x2c,0x2c,0x2b,0x2a,0x2a,0x28,0x27,0x02,0x9a,\r
+ 0x9a,0x9a,0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x9f,0x9c,0x97,0x97,0x99,0x9a,0x9e,0x9f,\r
+ 0x9f,0x9c,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x99,0x99,0x98,\r
+ 0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2a,0xf7,0xf7,0xf7,0x27,0x36,0x36,\r
+ 0x36,0x35,0x35,0x35,0x35,0x2a,0xf7,0xf7,0x2a,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2a,0xf7,0x01,0x36,0x36,0x01,0xf7,0x01,\r
+ 0x02,0x2f,0x2e,0x2a,0x29,0x27,0x27,0x27,0x27,0x29,0x2a,0x2c,0x2f,\r
+ 0x02,0x01,0x02,0x2f,0x2a,0x36,0x35,0x35,0x35,0x02,0xf7,0x94,0x94,\r
+ 0x9e,0x9d,0x9c,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x05,0x05,0x05,\r
+ 0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x03,\r
+ 0x06,0x06,0x05,0x03,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,0x03,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x02,0x02,0xf7,0xf7,0x04,0x04,0x05,0x05,0x02,0x04,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x9a,0x97,0x97,\r
+ 0x97,0x27,0x2c,0x2f,0x2e,0x2d,0x2b,0x01,0x2e,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2e,0x2c,0x2e,0x2c,0x2f,\r
+ 0x2c,0x2c,0x2b,0x2a,0x29,0x27,0x27,0x97,0x9a,0x9a,0x9a,0x98,0x9e,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x9f,0x9c,0x97,0x97,0x99,0x9b,0x9e,0x9f,0x9f,0x9d,0x97,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0x2a,0x2f,0xf7,0xf7,0x23,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x36,0x2f,0xf7,0x2d,0xf7,0xf7,0xf7,0x02,0x2e,0x2f,0x01,0xf7,0xf7,\r
+ 0xf7,0x01,0xf7,0x25,0x36,0xf7,0xf7,0x01,0xf6,0x2e,0x2c,0x2a,0x27,\r
+ 0x27,0x27,0x27,0x29,0x2a,0x2d,0x2f,0x02,0x01,0x02,0x2f,0x27,0x35,\r
+ 0x35,0x35,0x36,0xf7,0xf7,0xf7,0x99,0x9f,0x9d,0x9c,0x9c,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x04,0x06,0x07,0x07,0x07,0x06,0x06,0x05,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x05,0x04,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0x03,0x03,0x02,0x04,0x04,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x04,0x04,0x03,0xf7,0x02,0xf7,0xf7,0x04,\r
+ 0x04,0x05,0x05,0x02,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x99,0x97,0x97,0x2f,0x26,0x2f,0x2f,\r
+ 0x2e,0x2c,0x2c,0x02,0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x29,0x2a,0x2d,0x2d,0x2d,0x2c,0x2d,0x2f,0x2c,0x2b,0x2b,0x2a,\r
+ 0x28,0x27,0x9f,0x99,0x9a,0x9a,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x9f,0x9c,0x97,\r
+ 0x98,0x99,0x9a,0x9e,0x9f,0x9f,0x9e,0x99,0x94,0x94,0x94,0x94,0x98,\r
+ 0x98,0x98,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x2b,0xf7,0xf7,0x26,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0x23,0x35,0x35,0x25,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0x2d,0x2a,0x2a,0x2c,0x01,0xf7,0xf7,0x2b,0xf7,0x28,0x35,\r
+ 0xf7,0xf7,0x01,0x2f,0x2c,0x2a,0x28,0x27,0x27,0x27,0x2a,0x2a,0x2d,\r
+ 0x2f,0x01,0x01,0xf6,0x2d,0x26,0x35,0x35,0x35,0x23,0xf7,0xf7,0xf7,\r
+ 0x2e,0x9e,0x9c,0x9c,0x9b,0x9a,0x02,0x02,0x02,0x03,0x03,0x03,0x04,\r
+ 0x04,0x04,0x05,0xf7,0xf7,0xf7,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x05,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,\r
+ 0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,0x02,0x03,0x04,\r
+ 0x04,0x03,0xf7,0x03,0xf7,0x02,0x04,0x04,0x05,0x04,0x02,0x04,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x9f,0x98,0x97,0x02,0x2c,0x28,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,\r
+ 0x2c,0x2b,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,\r
+ 0x2c,0x2f,0x2b,0x2e,0x2f,0x2c,0x2b,0x2a,0x29,0x27,0x03,0x9a,0x9a,\r
+ 0x9a,0x9a,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9c,0x97,0x98,0x99,0x9a,0x9e,\r
+ 0x9f,0x9f,0x9f,0x9b,0x98,0x94,0x94,0x9b,0x9b,0x9b,0x9b,0x9a,0x02,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0x2a,0xf7,0xf7,0x2f,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x36,0x36,0x35,0x35,0x2f,0xf7,0x2f,0xf7,0xf7,0x2e,0x2a,0x2a,\r
+ 0x2a,0x2e,0xf7,0xf7,0x2e,0xf7,0x2b,0x35,0xf7,0xf7,0x02,0x2f,0x2b,\r
+ 0x2a,0x27,0x27,0x28,0x2a,0x2b,0x2e,0xf6,0x01,0x01,0x2f,0x2c,0x23,\r
+ 0x35,0x36,0x35,0x2a,0xf7,0xf7,0xf7,0x2a,0x2c,0x9c,0x9b,0x9b,0x99,\r
+ 0x97,0xf7,0xf7,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x04,0xf7,0xf7,\r
+ 0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,\r
+ 0x02,0xf7,0xf7,0x02,0x03,0x03,0x03,0x03,0x05,0x04,0x04,0x03,0x03,\r
+ 0xf7,0xf7,0xf7,0x03,0x03,0x02,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x04,0x03,0xf7,0x02,0xf7,0x02,\r
+ 0x04,0x04,0x06,0x03,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9d,0x94,0xf6,\r
+ 0xf6,0x27,0x2c,0x2f,0x2e,0x2d,0x2b,0x02,0x2e,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,0x2d,0x2c,0x2f,0x2c,0x2e,\r
+ 0x2c,0x2c,0x2a,0x2a,0x28,0x03,0x03,0x97,0x9a,0x9a,0x9a,0x98,0x9a,\r
+ 0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x9f,0x9b,0x97,0x98,0x99,0x9a,0x9e,0x9f,0x9f,0x9f,0x9e,\r
+ 0x9b,0x99,0x9c,0x9c,0x9c,0x9c,0x9c,0x2f,0x2f,0xf6,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2d,0xf6,0xf7,0xf7,\r
+ 0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x2a,0xf7,0x25,0xf7,0xf7,0x02,0x2f,0x2d,0x2c,0x2d,0xf7,0xf7,0x2d,\r
+ 0xf7,0x2a,0x36,0xf7,0xf7,0xf6,0x2d,0x2a,0x28,0x27,0x29,0x2a,0x2c,\r
+ 0x2f,0x02,0x01,0x02,0x2f,0x2a,0x36,0x35,0x35,0x35,0x02,0xf7,0xf7,\r
+ 0xf7,0x2a,0x2d,0x2f,0x9b,0x9a,0x98,0x94,0x94,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x03,0x04,0x04,0x05,0x03,0xf7,0x02,0x02,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x02,0xf7,0x02,0x04,0x06,\r
+ 0x06,0x06,0x05,0x04,0x04,0x03,0x02,0xf7,0xf7,0x02,0xf7,0x03,0x03,\r
+ 0x03,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x04,0xf7,0x02,0x02,0xf7,0x03,0x04,0x04,0x06,0x02,0x02,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x97,0xf6,0x2f,0x26,0x2f,0x2f,\r
+ 0x2e,0x2c,0x2c,0x01,0x2d,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x28,0x2a,0x2c,0x2d,0x2c,0x2e,0x2d,0x2f,0x2c,0x2c,0x2a,0x9f,\r
+ 0x9f,0x03,0x03,0x94,0x9a,0x9a,0x9a,0x98,0x9a,0x9f,0x03,0x02,0x02,\r
+ 0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9b,\r
+ 0x97,0x98,0x99,0x9a,0x9d,0x9f,0x9f,0x9f,0x9f,0x9f,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2d,0x2e,0x2c,0xf7,0xf7,0xf6,0x35,0x35,0x35,0x35,0x25,\r
+ 0x2c,0x2e,0x27,0x36,0x35,0x35,0x35,0x36,0x23,0xf7,0x2a,0x01,0xf7,\r
+ 0xf7,0x01,0x02,0xf6,0x02,0xf7,0xf7,0x2a,0xf7,0x2a,0x36,0xf7,0xf7,\r
+ 0x2f,0x2e,0x2a,0x2a,0x2a,0x2a,0x2d,0x2f,0x02,0x01,0xf6,0x2e,0x27,\r
+ 0x35,0x35,0x35,0x36,0xf7,0xf7,0xf7,0x2f,0x2a,0x2e,0x2f,0xf6,0x99,\r
+ 0x97,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,\r
+ 0x02,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x02,0xf7,0x03,0x06,0x06,0x05,0x05,0x04,0x04,0x04,\r
+ 0x02,0xf7,0xf7,0x03,0x03,0x02,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x03,0xf7,0x03,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x06,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x9a,0x06,0xf6,0x2f,0x27,0x2f,0x2f,0x2d,0x2c,0x2e,0xf6,\r
+ 0x2c,0x2c,0x29,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2c,\r
+ 0x2c,0x2e,0x2c,0x2e,0x2f,0x2c,0x2b,0x9d,0x9f,0x9f,0x03,0x03,0x97,\r
+ 0x9a,0x9a,0x9a,0x98,0x9c,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,0x01,\r
+ 0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9b,0x97,0x98,0x99,0x9a,\r
+ 0x9d,0x9e,0x9f,0x9f,0x9f,0x99,0x99,0x99,0x99,0x99,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x02,0x02,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2e,0x2c,0x2f,\r
+ 0xf7,0xf7,0x27,0x35,0x35,0x35,0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0x35,0x35,0x35,0x27,0xf7,0xf7,0x27,0x01,0x01,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0xf7,0x29,0xf7,0x25,0x36,0xf7,0xf7,0x02,0x2f,0x2d,0x2c,0x2d,\r
+ 0x2f,0x2f,0x01,0x02,0x2f,0x2c,0x25,0x35,0x35,0x35,0x26,0xf7,0xf7,\r
+ 0xf7,0x2a,0x2c,0x2f,0x2f,0x02,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x02,0x02,0x03,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x02,0xf7,\r
+ 0x04,0x06,0x03,0x03,0x03,0x03,0x04,0x03,0xf7,0xf7,0x03,0x07,0x04,\r
+ 0x02,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x02,0xf7,0x05,0xf7,0xf7,0x02,0x04,0x05,0x06,0x02,0x02,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x0b,0xf6,\r
+ 0xf6,0x2a,0x2a,0x2f,0x2f,0x2d,0x2b,0xf6,0x2f,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2b,0x2d,0x2c,0x2f,0x2b,0x2e,\r
+ 0x2d,0x2c,0x9d,0x9e,0x9f,0x03,0x03,0x9e,0x99,0x9a,0x9a,0x99,0x98,\r
+ 0x9d,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,\r
+ 0x02,0x03,0x03,0x9f,0x9b,0x97,0x97,0x99,0x9a,0x9b,0x9d,0x9e,0x9e,\r
+ 0x98,0x98,0x98,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x02,0xf6,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0xf7,0x2f,0x2d,0x2e,0x2b,0xf7,0xf7,0xf7,0x23,0x35,0x35,\r
+ 0x25,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x35,0x35,0x2f,0xf7,\r
+ 0xf7,0x28,0x2e,0x2f,0x2f,0xf6,0x02,0xf7,0xf7,0x2c,0xf7,0xf7,0x35,\r
+ 0x36,0x01,0x01,0x01,0xf6,0x2f,0x2f,0x2f,0xf6,0x02,0x2f,0x2e,0x29,\r
+ 0x36,0x35,0x36,0x35,0x2d,0xf7,0xf7,0xf7,0x2a,0x2d,0x2f,0xf6,0x01,\r
+ 0xf7,0xf7,0x94,0x94,0x97,0x97,0x94,0xf7,0xf7,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x05,0x06,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,0x05,0x04,0x02,0x02,0x03,\r
+ 0x03,0x04,0x03,0xf7,0xf7,0xf7,0x04,0xf7,0x02,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x03,0x07,0xf7,\r
+ 0xf7,0x02,0x04,0x05,0x05,0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xd7,0x2f,0xf6,0x2f,0x27,0x2e,0x2f,\r
+ 0x2e,0x2c,0x2a,0x01,0x2e,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x28,0x2a,0x2c,0x2d,0x2c,0x2f,0x2c,0x2e,0x3a,0x9c,0x9e,0x9e,\r
+ 0x9f,0x03,0x02,0x99,0x9a,0x9a,0x9a,0x99,0x99,0x9e,0x03,0x03,0x02,\r
+ 0x02,0x02,0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,\r
+ 0x9c,0x97,0x97,0x98,0x99,0x9a,0x9a,0x9b,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x01,0x01,0x02,0x02,0x02,0x02,0xf6,0xf6,0xf6,0xf6,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2d,0x2e,\r
+ 0x2d,0x2a,0xf7,0xf7,0xf7,0x36,0x35,0x35,0xf6,0xf7,0xf7,0x2d,0x27,\r
+ 0x29,0x2d,0xf7,0xf7,0x25,0x35,0xf7,0xf7,0x2f,0x2c,0x2c,0x2e,0x2f,\r
+ 0x2f,0xf6,0x01,0x2c,0x27,0xf7,0x29,0x35,0x36,0x2f,0x2f,0xf6,0x2f,\r
+ 0x2e,0x2c,0x2d,0x2e,0x2d,0x2a,0x25,0x35,0x35,0x36,0x35,0x01,0xf7,\r
+ 0xf7,0x01,0x2a,0x2e,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0x97,0x99,0x9a,\r
+ 0x9a,0x99,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x04,0x05,0x05,0x02,0x03,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x04,0xf7,0x04,0x04,0x02,0x02,0x03,0x03,0x04,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x03,0xf7,0x07,0x03,0xf7,0x02,0x04,0x04,0x05,0xf7,\r
+ 0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2a,0xf6,0xf6,0x2f,0x25,0x2f,0x2f,0x2d,0x2c,0x2c,0x02,\r
+ 0x2c,0x2c,0x29,0x28,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,\r
+ 0x2c,0x2d,0x2e,0x2d,0x99,0x9c,0x9c,0x9e,0x9f,0x9f,0x03,0x02,0x97,\r
+ 0x9a,0x9a,0x9a,0x99,0x99,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x01,\r
+ 0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9c,0x98,0x97,0x98,\r
+ 0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x02,0x02,0x02,0xf6,0xf6,\r
+ 0xf6,0xf6,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2f,0x2c,0x2b,0xf7,0xf7,0xf7,\r
+ 0x35,0x35,0x36,0xf7,0xf7,0x2b,0x27,0x27,0x27,0x27,0x2a,0x02,0xf7,\r
+ 0x23,0x2f,0x2c,0x27,0x2c,0x2f,0x2f,0x2e,0x2e,0x2d,0x2a,0x27,0xf7,\r
+ 0xf7,0x35,0x35,0x35,0x23,0x27,0x27,0x26,0x25,0x25,0x26,0x25,0x23,\r
+ 0x35,0x35,0x35,0x36,0x35,0xf7,0xf7,0xf7,0x2c,0x2b,0x2f,0x2f,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9c,0x9e,0x9e,0x9e,0x9c,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x04,0x05,0x06,0x03,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x03,0x03,\r
+ 0x02,0x02,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x02,0x03,\r
+ 0xf7,0xf7,0x03,0x04,0x04,0x05,0xf7,0x02,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x2b,0xf6,\r
+ 0xf6,0x2e,0x28,0x2f,0x2f,0x2d,0x2b,0x2f,0x2f,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x29,0x2a,0x2c,0x2c,0x2f,0x2c,0x9a,\r
+ 0x99,0x9c,0x9d,0x9d,0x9f,0x03,0x03,0x02,0x94,0x9a,0x9a,0x9a,0x98,\r
+ 0x9a,0x9f,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,\r
+ 0x02,0x02,0x03,0x03,0x9f,0x9e,0x99,0x97,0x97,0x98,0x98,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x01,0x02,0x02,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,\r
+ 0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2e,0x2e,0x2f,0x2b,0x2f,0xf7,0xf7,0x01,0x35,0x35,0x23,0xf7,0xf7,\r
+ 0x27,0x27,0x27,0x29,0x2a,0x2a,0x2c,0x02,0xf7,0x36,0x26,0x2a,0x2d,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2e,0x2c,0xf7,0xf7,0xf7,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0xf7,\r
+ 0xf7,0xf7,0x2a,0x2c,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x2b,\r
+ 0x9f,0x03,0x9f,0x9e,0x9e,0x03,0xf7,0xf7,0xf7,0x03,0x03,0x03,0x05,\r
+ 0x06,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x02,0x02,0x04,0x02,0x02,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x02,0xf7,0x03,0xf7,0xf7,0xf7,0xf7,0x04,0x04,0x05,\r
+ 0xf7,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x2d,0xf6,0xf6,0x29,0x2c,0x2f,\r
+ 0x2e,0x2c,0x2a,0x01,0x2e,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x28,0x2a,0x2b,0x2d,0x2c,0x98,0x9d,0x9a,0x9a,0x9c,0x9e,0x9e,\r
+ 0x9f,0x03,0x03,0x03,0x98,0x9a,0x9a,0x9a,0x98,0x9b,0x9f,0x03,0x02,\r
+ 0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,\r
+ 0x03,0x9e,0x9c,0x99,0x98,0x98,0x99,0x99,0x9a,0x9a,0x9a,0x01,0x02,\r
+ 0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2d,0x2e,0x2f,0x2f,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2e,0x2f,0x2f,0x2a,0xf6,\r
+ 0xf7,0xf7,0x02,0x35,0x35,0x27,0xf7,0xf6,0x28,0x28,0x2a,0x2d,0x2f,\r
+ 0x2e,0x2e,0x2f,0xf7,0x01,0x27,0x2c,0x2f,0x2f,0xf6,0x2f,0x2d,0x2d,\r
+ 0x2a,0x01,0xf7,0xf7,0x35,0x35,0x35,0x35,0x35,0x23,0x27,0x25,0x36,\r
+ 0x35,0x35,0x35,0x35,0x35,0x36,0xf7,0xf7,0xf7,0x29,0x2c,0x2e,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0x27,0x27,0x9f,0x9f,0x9f,0x9e,0x9e,\r
+ 0x04,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x05,0x06,0x07,0x07,0x06,0x04,\r
+ 0x04,0x04,0x05,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x03,0xf7,0x05,0xf7,0x02,0x03,0x03,0x03,0x03,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x04,0xf7,0xf7,0x02,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x02,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x25,0x26,0x2f,0xf6,0x2f,0x25,0x2f,0x2f,0x2d,0x2c,0x2c,0x01,\r
+ 0x2c,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x2c,\r
+ 0x2d,0x9c,0x99,0x9c,0x9a,0x9b,0x9c,0x9e,0x9f,0x9f,0x03,0x02,0x9c,\r
+ 0x99,0x9a,0x9a,0x99,0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,\r
+ 0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x9e,\r
+ 0x9c,0x99,0x99,0x99,0x9a,0x9a,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2d,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2e,0x2f,0x2f,0x28,0xf7,0xf7,0xf7,0x2f,0x35,0x35,\r
+ 0x27,0xf7,0x2f,0x28,0x29,0x2c,0x2f,0xf6,0xf6,0x2f,0x2f,0x02,0xf7,\r
+ 0x2d,0x27,0xf7,0x01,0x2f,0x2f,0x2f,0x2e,0x2a,0x2a,0xf7,0x2f,0x35,\r
+ 0x35,0x35,0x27,0xf7,0xf7,0xf7,0xf7,0x2f,0x25,0x35,0x35,0x35,0x35,\r
+ 0xf6,0xf7,0xf7,0x29,0x2c,0x2e,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x2a,\r
+ 0x27,0x27,0x27,0x9f,0x9e,0x9d,0x9d,0x9e,0x04,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x03,0x05,0x06,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x06,0xf7,0x02,\r
+ 0x03,0x03,0x03,0x04,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x04,\r
+ 0x04,0x04,0xf7,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x02,\r
+ 0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x27,0x2f,\r
+ 0xf6,0x2f,0x27,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,0x2c,0x2a,0x28,0x27,\r
+ 0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x2a,0x9c,0x9b,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9c,0x9c,0x9e,0x9f,0x9f,0x03,0x02,0x97,0x9a,0x9a,0x9a,0x99,\r
+ 0x98,0x9d,0x9f,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x9f,0x9f,0x98,0x98,0x98,0x99,\r
+ 0x99,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,\r
+ 0x2f,0x27,0xf7,0xf7,0xf7,0x2a,0x35,0x35,0x25,0xf7,0x01,0x29,0x2a,\r
+ 0x2c,0x2f,0xf6,0x02,0xf6,0xf6,0x01,0xf7,0xf7,0x2d,0x2e,0xf7,0xf7,\r
+ 0x01,0x2f,0x2e,0x2a,0x27,0xf7,0x2c,0x35,0x25,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x27,0xf7,0xf7,0x28,0x2c,0x2e,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x28,0x27,0x27,0x27,0x2b,0x9d,0x9c,\r
+ 0x9c,0x9c,0x9d,0x04,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x06,0x06,0x04,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0xf7,0x04,0xf7,0x02,0x03,0x03,0x03,0x04,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x04,0x04,0x06,0x02,0xf7,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x25,0x29,0xf6,0xf6,0x2a,0x2c,0x2f,\r
+ 0x2e,0x2c,0x2a,0x01,0x2e,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,\r
+ 0x27,0x27,0x9f,0x9d,0x9b,0x9b,0x99,0x9c,0x9a,0x9a,0x9c,0x9d,0x9e,\r
+ 0x9f,0x9f,0x03,0x02,0x94,0x9a,0x9a,0x9a,0x99,0x98,0x9e,0x9f,0x03,\r
+ 0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x03,0x03,0x03,0x94,0x94,0x94,0x97,0x97,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2e,0x2e,0x2c,0x2c,0x2a,0x2a,0x2c,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,0x2d,0x27,0xf7,0xf7,0xf7,\r
+ 0x27,0x35,0x35,0x23,0xf7,0xf7,0x2a,0x2a,0x2b,0x2f,0xf6,0xf6,0xf6,\r
+ 0xf6,0x01,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf7,0x01,0x2a,0x26,\r
+ 0x26,0x36,0x2f,0xf7,0xf7,0x2f,0x2c,0x2a,0x2a,0x2f,0xf7,0xf7,0xf7,\r
+ 0x36,0x35,0xf7,0xf7,0x27,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x27,0x26,0x27,0x2a,0x2b,0x2d,0x9c,0x9a,0x9a,0x9b,0x9c,0x04,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0x03,0x05,0x05,0x02,0xf7,0x02,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,\r
+ 0xf7,0x02,0xf7,0x03,0x04,0x03,0x04,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0x03,0x06,0x02,0xf7,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x02,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x25,0x2c,0xf6,0x2f,0x26,0x2f,0x2f,0x2e,0x2c,0x2b,0x01,\r
+ 0x2d,0x2c,0x2a,0x28,0x27,0x27,0x27,0x27,0x27,0x03,0x9f,0x9f,0x9d,\r
+ 0x9a,0x9c,0x98,0x9d,0x99,0x9a,0x9b,0x9e,0x9e,0x9f,0x9f,0x03,0x02,\r
+ 0x97,0x9b,0x9a,0x9a,0x99,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x97,\r
+ 0x97,0x97,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2d,0x2c,0x2c,\r
+ 0x2a,0x2a,0x29,0x2b,0x2f,0x2f,0x2f,0x2e,0x2f,0x01,0xf7,0xf7,0xf6,\r
+ 0x2f,0x2f,0x2f,0x2a,0x28,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x35,0xf7,\r
+ 0xf7,0x2e,0x2a,0x2a,0x2c,0x2f,0x2f,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0x01,0xf7,0x2f,0x27,0x27,0x26,0x28,0xf7,0xf7,0x2f,0x2a,\r
+ 0x28,0x27,0x27,0x27,0x27,0x29,0x2f,0xf7,0xf6,0x36,0x2c,0x26,0x2a,\r
+ 0x2e,0x02,0xf7,0xf7,0xf7,0xf7,0x2f,0x27,0x27,0x27,0x2b,0x2d,0x2f,\r
+ 0x2f,0x9a,0x9a,0x9a,0x9a,0x9b,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x05,0x04,0xf7,0x02,0x03,0x04,0x04,0x05,0x04,0x02,0xf7,0xf7,0xf7,\r
+ 0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0xf7,0x05,0xf7,0x03,0x04,\r
+ 0x04,0x04,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x03,0x03,0x03,0x03,0x05,\r
+ 0x04,0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x02,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x25,0x2f,\r
+ 0xf6,0x2f,0x27,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,0x2c,0x2b,0x29,0x27,\r
+ 0x27,0x27,0x27,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9b,0x98,0x9c,\r
+ 0x9a,0x9b,0x9b,0x9f,0x9f,0x9f,0x9f,0x03,0x9f,0x98,0x9b,0x9a,0x9a,\r
+ 0x98,0x99,0x9e,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x97,0x97,0x97,0x94,0x94,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2f,0x2f,0x2d,0x2c,0x2c,0x2d,0x2d,0x2b,0x2a,0x2c,\r
+ 0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf6,0x29,0x2c,\r
+ 0xf7,0xf7,0x2f,0x36,0x35,0x35,0x35,0x2a,0xf7,0xf7,0x2c,0x2a,0x2a,\r
+ 0x2c,0x2d,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0x2f,0x2e,0x2e,0x2e,0x2a,\r
+ 0x2a,0x2a,0x2f,0xf7,0xf7,0x2f,0x2c,0x2c,0x2c,0x2c,0x2d,0x2c,0x2a,\r
+ 0x2a,0x2a,0x2f,0xf7,0x2a,0x23,0x28,0xf6,0x2f,0xf6,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2a,0x27,0x2a,0x2b,0x2d,0x2f,0x01,0x01,0x9a,0x99,0x99,0x9a,\r
+ 0x9a,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x03,0xf7,0x03,0x04,\r
+ 0x04,0x04,0x05,0x05,0x05,0x04,0xf7,0xf7,0xf7,0x05,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0xf7,0x05,0xf7,0x02,0x04,0x04,0x04,0x02,0x04,0x04,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x06,0xf7,0xf7,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x04,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x01,0x01,0x02,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x2f,0xf6,0x2c,0x2a,0x2f,\r
+ 0x2e,0x2c,0x2a,0x02,0x2f,0x2c,0x2a,0x28,0x27,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x9e,\r
+ 0x9f,0x9e,0x9f,0x03,0x9b,0x9a,0x9b,0x9a,0x9a,0x98,0x9a,0x9f,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x97,0x97,0x97,0x97,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x2f,0x2e,\r
+ 0x2c,0x2a,0x2b,0x2e,0x2d,0x2c,0x2c,0x2c,0x2e,0x2f,0x2e,0x2d,0x2e,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x25,0xf6,0xf7,0xf7,0x25,0x36,0x35,\r
+ 0x35,0x35,0x36,0x2f,0xf7,0xf7,0x01,0x2c,0x2b,0x2c,0x2e,0x2f,0x02,\r
+ 0xf7,0xf7,0xf7,0x2e,0x2c,0x2b,0x2b,0x2a,0x2b,0x2d,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0x2f,0x02,0x01,0xf7,0x01,0x02,0x2f,0x2d,0x2e,0xf6,0xf7,\r
+ 0x28,0x27,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0x2b,0x2b,0x2b,0x2d,0x2f,\r
+ 0x2f,0x01,0x01,0x01,0x99,0x99,0x99,0x9a,0x99,0x03,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x04,0x02,0xf7,0x03,0x03,0x04,0x04,0x05,0x05,0x06,\r
+ 0x06,0x04,0xf7,0xf7,0xf7,0x06,0x07,0x07,0x07,0x07,0x07,0x03,0x02,\r
+ 0x02,0xf7,0x05,0x04,0x04,0xf7,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x03,0x03,0x04,0x03,\r
+ 0x03,0x02,0x02,0x05,0x02,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x04,\r
+ 0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,\r
+ 0x07,0x07,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9f,0x97,0x97,0x27,0x2f,0x2f,0x2e,0x2c,0x2b,0x01,\r
+ 0x2d,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,\r
+ 0x9b,0x9c,0x98,0x9d,0x9a,0x9a,0x9b,0x9e,0x9e,0x9e,0x9e,0x9e,0x02,\r
+ 0x98,0x9a,0x9b,0x9a,0x99,0x98,0x9b,0x9f,0x03,0x03,0x02,0x02,0x02,\r
+ 0x02,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x97,0x97,0x97,\r
+ 0x97,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2b,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2a,0x2c,0x2c,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,0x2e,0x2f,0x2f,0xf6,\r
+ 0x2c,0x25,0xf7,0xf7,0xf6,0x35,0x36,0x35,0x35,0x35,0x35,0x36,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x28,0x29,0x28,\r
+ 0x27,0x27,0x29,0x2a,0x2e,0xf7,0xf7,0x01,0xf6,0x2f,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf6,0x2f,0xf6,0xf7,0xf7,0x2a,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2c,0x2f,0x2f,0x02,0x02,0x01,0x01,0xf7,0xf7,0x99,\r
+ 0x99,0x99,0x99,0x99,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x02,\r
+ 0xf7,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x04,0xf7,0xf7,\r
+ 0x02,0x07,0x07,0x07,0x07,0x07,0x06,0xf7,0x05,0xf7,0x04,0x05,0x04,\r
+ 0xf7,0x03,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x03,0x04,0x03,0x02,0x04,0x03,0x03,0x03,0x02,0x02,0x06,\r
+ 0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x05,0x03,0x03,0x03,0x05,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0xf7,0xf7,0x01,\r
+ 0x02,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x9a,\r
+ 0x97,0x98,0x02,0x99,0x99,0x9a,0x9c,0x9a,0x97,0x9b,0x9c,0x9f,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x97,0x9d,\r
+ 0x99,0x9a,0x9b,0x9e,0x9e,0x9e,0x9d,0x9e,0x01,0x94,0x9b,0x9b,0x9a,\r
+ 0x99,0x98,0x9b,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x98,0x98,0x97,0x97,0x97,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2f,0x2e,0x2b,0x2a,0x29,0x29,0x29,0x2a,0x2c,0x2e,0x2e,0x2e,\r
+ 0x2d,0x2d,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,0x27,0x2a,0xf7,0xf7,0x23,\r
+ 0x35,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x26,0x2a,0x2e,0x2e,\r
+ 0x2c,0x27,0x36,0x36,0x23,0x25,0x27,0x28,0x28,0x27,0x27,0x29,0x2a,\r
+ 0xf7,0xf7,0x01,0x02,0xf6,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x02,0x01,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x99,0x98,0x99,0x99,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x03,0x04,0x04,0x05,0x06,0x06,0x05,0xf7,0xf7,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x02,0x05,0xf7,0x03,0x05,0x05,0x02,0x02,0x04,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x02,0x02,0x04,0x03,0x03,0x02,0x02,0x05,0x02,0xf7,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x03,\r
+ 0x03,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0xf7,0x01,0x02,0x9f,0x9f,0x9f,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x98,0x97,0x9a,0x9e,0x99,\r
+ 0x9a,0x9b,0x9d,0x97,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x99,0x9c,0x9a,0x9b,0x9b,0x9f,\r
+ 0x9e,0x9d,0x9c,0x9e,0x02,0x94,0x9b,0x9b,0x9a,0x99,0x98,0x9d,0x9f,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x98,0x98,0x98,0x98,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2f,0x2c,0x2a,\r
+ 0x2a,0x2a,0x2a,0x2a,0x2c,0x2f,0x2f,0x2e,0x2d,0x2d,0x2d,0x2e,0x2f,\r
+ 0x2f,0xf6,0x2c,0x23,0xf7,0xf7,0x2f,0x35,0x36,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x2e,0xf7,0xf6,\r
+ 0x27,0x27,0x28,0x2a,0x2c,0x2a,0x28,0x28,0x2a,0xf7,0xf7,0x01,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0xf7,0xf7,0xf7,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x99,0x99,0x98,0x99,0x98,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x03,0x03,0xf7,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,\r
+ 0x06,0x06,0x05,0xf7,0xf7,0x06,0x07,0x07,0x07,0x07,0x04,0xf7,0x02,\r
+ 0x02,0x05,0x05,0x03,0xf7,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x03,0xf7,0x04,0x04,0x03,\r
+ 0x03,0x02,0x03,0x05,0xf7,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x03,0x02,0x03,0x04,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0xf7,0x02,0x03,0x9f,0x9e,0x9e,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9f,0x97,0x97,0x03,0x9a,0x99,0x9a,0x9c,0x9d,0x94,\r
+ 0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9b,0x99,0x9a,0x9a,0x9a,0x9b,0x9c,0x9f,0x9d,0x9c,0x9b,0x9f,\r
+ 0x9f,0x98,0x9b,0x9a,0x9a,0x99,0x98,0x9d,0x9f,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x99,0x99,0x99,0x98,0x97,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2e,0x2f,0x2e,0x2c,0x2b,0x2a,0x2c,0x2c,0x2d,\r
+ 0x2f,0x2f,0x2f,0x2e,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,0x25,0x2c,0xf7,\r
+ 0xf7,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x25,0x01,0xf7,0xf7,0xf7,0x2a,0x27,0x29,0x2a,\r
+ 0x2a,0x2a,0x29,0x27,0x29,0xf7,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x99,0x98,\r
+ 0x99,0x98,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x02,\r
+ 0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x06,0x06,0x04,0xf7,\r
+ 0xf7,0x07,0x07,0x07,0x07,0x06,0xf7,0x06,0xf7,0x04,0x05,0x05,0xf7,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x03,0x04,0x03,0xf7,0x03,0x04,0x04,0x03,0x02,0x02,0x06,0xf7,\r
+ 0xf7,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x03,0x02,0x02,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x01,0x03,0x9f,0x9d,0x9c,\r
+ 0x9e,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x9b,\r
+ 0x97,0x97,0x02,0x99,0x99,0x9a,0x9c,0x9c,0x94,0x9b,0x9c,0x9f,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x98,0x9d,\r
+ 0x9a,0x9a,0x9b,0x9d,0x9e,0x9c,0x9a,0x9a,0x03,0x9b,0x99,0x9b,0x9a,\r
+ 0x9a,0x98,0x99,0x9e,0x9f,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x99,0x99,0x99,0x99,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,\r
+ 0x2f,0x2f,0x2e,0x2c,0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x2f,0x2e,0x2d,\r
+ 0x2e,0x2f,0x2f,0x2d,0x27,0x27,0xf7,0xf7,0x2b,0x35,0x35,0x35,0x36,\r
+ 0x23,0x23,0x23,0x36,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x36,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2a,0x28,0x2a,0x2a,0x2a,0x2a,0x29,0x27,\r
+ 0x27,0xf7,0x01,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x99,0x98,0x98,0x99,0x98,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,\r
+ 0x02,0x02,0x03,0x03,0x05,0x06,0x06,0x03,0xf7,0x04,0x07,0x07,0x07,\r
+ 0x07,0x02,0x04,0xf7,0x03,0x05,0x05,0xf7,0x03,0x03,0x04,0x04,0x04,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x02,\r
+ 0x02,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0xf7,0x03,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x02,0x02,0x02,0x02,0x03,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x02,0x03,0x9d,0x9b,0x9b,0x9e,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x98,0x97,0x99,0x9f,0x99,\r
+ 0x99,0x9b,0x9c,0x99,0x98,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x97,0x9d,0x9a,0x9a,0x9b,0x9f,\r
+ 0x9d,0x9b,0x99,0x9a,0x02,0x97,0x9b,0x9c,0x9a,0x9a,0x98,0x99,0x9e,\r
+ 0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x99,0x99,\r
+ 0x99,0x99,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,\r
+ 0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2b,0x27,0x27,\r
+ 0xf7,0xf7,0x01,0x35,0x35,0x35,0x36,0x28,0x2a,0x2b,0x2b,0x2a,0x29,\r
+ 0x25,0x35,0x35,0x35,0x35,0x35,0x27,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x28,0x27,0x27,0xf7,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x98,0x98,0x98,0x98,0x97,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x03,0x02,0xf7,0x02,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x04,0x06,0x06,0x02,0xf7,0x07,0x07,0x07,0x07,0x04,0xf7,0x02,0x02,\r
+ 0x05,0x05,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0xf7,0x04,0x03,0x03,0x03,\r
+ 0x02,0x02,0x06,0xf7,0xf7,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x9e,\r
+ 0x9b,0x9a,0x9c,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9e,0x97,0x97,0x9e,0x9c,0x99,0x9a,0x9b,0x9d,0x94,\r
+ 0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9b,0x9a,0x99,0x9c,0x99,0x9b,0x9b,0x9f,0x9b,0x99,0x98,0x9b,\r
+ 0x01,0x94,0x9c,0x9c,0x9a,0x99,0x98,0x99,0x9e,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0x99,0x99,0x99,0x98,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2f,0x2d,0x2e,0x2f,0x2f,0x2f,0x2f,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2e,0x2d,0x2a,0x27,0x29,0xf7,0xf7,0xf7,0x36,0x35,0x35,\r
+ 0x23,0x2c,0x2e,0x2f,0x2f,0xf6,0x2f,0x2f,0x2a,0x36,0x35,0x35,0x23,\r
+ 0x2e,0xf7,0xf7,0xf7,0x01,0x2a,0x26,0x25,0x27,0x29,0x2a,0x2c,0x2c,\r
+ 0x2a,0x2a,0x29,0x27,0x26,0x25,0xf7,0xf6,0xf6,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x98,0x98,0x98,0x97,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0x02,0x02,\r
+ 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x06,0x06,0xf7,\r
+ 0x02,0x07,0x07,0x07,0x07,0xf7,0x06,0xf7,0x04,0x05,0x04,0xf7,0x03,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,\r
+ 0x03,0x04,0x03,0x02,0x04,0x04,0x03,0x03,0x02,0x02,0x05,0x03,0xf7,\r
+ 0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x9f,0x9d,0x9a,0x9a,0x9d,0x9f,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,\r
+ 0x97,0x97,0x03,0x9a,0x99,0x9a,0x9b,0x9d,0x94,0x9a,0x9c,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9b,0x99,0x9a,\r
+ 0x9a,0x9a,0x9b,0x9c,0x9f,0x99,0x97,0x98,0x9c,0x03,0x97,0x9c,0x9c,\r
+ 0x9a,0x99,0x98,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x99,0x99,0x99,0x98,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0x2e,\r
+ 0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2d,0x2a,0x2a,\r
+ 0x2f,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x23,0x2e,0x2f,0x02,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0x2d,0x35,0x35,0x28,0xf7,0xf7,0xf7,0x27,0x27,0x2e,\r
+ 0x01,0xf7,0x01,0x01,0xf6,0x2f,0x2c,0x2b,0x2c,0x2a,0x2a,0x27,0x27,\r
+ 0x25,0x23,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,\r
+ 0x01,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x98,0x98,0x98,0x98,0x97,0x02,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x02,\r
+ 0xf7,0x02,0x02,0x02,0x03,0x05,0x06,0x05,0xf7,0x06,0x07,0x07,0x07,\r
+ 0x02,0x02,0x02,0x02,0x05,0x05,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x03,0x02,0x03,\r
+ 0x04,0x03,0x03,0x02,0x02,0x03,0x06,0xf7,0xf7,0x02,0x05,0x06,0x06,\r
+ 0x06,0x04,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x06,0x9e,0x9b,0x9a,0x9b,0x9e,0x02,0xf7,0xf7,0x01,0xf7,0x01,0x02,\r
+ 0x03,0x03,0x02,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9f,0x97,0x97,0x98,0x02,0x99,\r
+ 0x99,0x9a,0x9c,0x9c,0x94,0x9b,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x97,0x9d,0x9a,0x9a,0x9a,0x9e,\r
+ 0x9d,0x97,0x97,0x99,0x9f,0x9c,0x99,0x9c,0x9b,0x9a,0x99,0x98,0x99,\r
+ 0x9d,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x98,0x98,0x97,0x97,\r
+ 0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2d,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0x36,0x35,\r
+ 0x35,0x23,0x2f,0xf6,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0x2f,0x35,\r
+ 0x27,0xf7,0xf7,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x02,0xf6,0x2f,0x2c,0x2a,0x2c,0x29,0x29,0x2a,0x2b,0x23,0xf7,0x2f,\r
+ 0x2f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf6,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x98,\r
+ 0x98,0x98,0x97,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0xf7,0x02,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,\r
+ 0x03,0x05,0x06,0x03,0xf7,0x07,0x07,0x07,0x05,0xf7,0x05,0x02,0x04,\r
+ 0x05,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x04,0x03,0x02,0x03,0x04,0x03,0x03,0x03,0x02,\r
+ 0x02,0x06,0x03,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x9d,0x9a,0x9a,0x9c,\r
+ 0x9f,0xf7,0xf7,0xf7,0xf7,0x02,0x9e,0x9a,0x9a,0x9a,0x9e,0x9f,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x9c,0x97,0x97,0x99,0x03,0x99,0x99,0x9a,0x9c,0x99,\r
+ 0x98,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,\r
+ 0x9c,0x9b,0x9b,0x97,0x9d,0x9a,0x9a,0x9a,0x9f,0x99,0x94,0x97,0x99,\r
+ 0x02,0x97,0x9a,0x9c,0x9b,0x9a,0x99,0x98,0x99,0x9b,0x9e,0x9f,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x2e,0x2c,0x2c,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x35,0x35,0x35,0x23,0x2f,0x02,0x01,0x01,\r
+ 0x02,0x02,0xf6,0x01,0xf7,0xf7,0x2a,0x35,0x01,0xf7,0x2d,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2f,0xf6,0x01,0x01,0x01,0x02,0xf6,0xf6,0x2f,\r
+ 0x2a,0x2d,0x2f,0xf7,0xf7,0xf6,0x25,0xf7,0x2e,0x2d,0xf6,0x01,0xf7,\r
+ 0xf7,0xf7,0x01,0xf6,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0x98,0x98,0x98,0x97,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,\r
+ 0x03,0x02,0x02,0x02,0x02,0x02,0xf7,0x02,0x02,0x03,0x05,0x06,0xf7,\r
+ 0x04,0x07,0x07,0x07,0xf7,0x05,0x02,0x03,0x04,0x04,0xf7,0x03,0x04,\r
+ 0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,0x04,\r
+ 0x04,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x04,0x06,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,0x02,0x02,0x04,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x9b,0x9a,0x9b,0x9d,0x01,0xf7,0xf7,0xf7,0x9f,\r
+ 0x98,0x97,0x97,0x97,0x98,0x99,0x9b,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,\r
+ 0x97,0x97,0x9c,0x9f,0x99,0x9a,0x9b,0x9d,0x94,0x99,0x9b,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x99,\r
+ 0x9b,0x9a,0x9a,0x9a,0x9f,0x94,0x94,0x98,0x99,0x01,0x94,0x9c,0x9d,\r
+ 0x9b,0x9a,0x99,0x98,0x98,0x9a,0x9c,0x9e,0x9f,0x9f,0x9f,0x9f,0x94,\r
+ 0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2d,\r
+ 0x2d,0x2e,0x2e,0x2e,0x2d,0x2c,0x2e,0xf7,0xf7,0xf7,0xf7,0x2a,0x35,\r
+ 0x35,0x35,0x23,0x2f,0x02,0x01,0x01,0xf6,0x2f,0x2f,0x2f,0x01,0xf7,\r
+ 0xf7,0x25,0x25,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2c,0x2e,0x2f,0x02,0x01,0x01,0x02,0x02,0xf6,0x28,0xf6,0xf7,0xf7,\r
+ 0xf7,0x2c,0x27,0xf7,0x2c,0x2c,0x2f,0x01,0xf7,0x01,0x01,0xf6,0x01,\r
+ 0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x98,0x98,0x98,0x97,0x97,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x03,0x03,\r
+ 0x03,0x02,0xf7,0xf7,0x02,0x03,0x05,0x05,0xf7,0x07,0x07,0x07,0x02,\r
+ 0x02,0x03,0x02,0x04,0x04,0xf7,0x03,0x04,0x04,0x04,0x04,0x04,0x03,\r
+ 0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,0x04,0x04,0x03,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x06,0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x06,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x9a,\r
+ 0x9a,0x9c,0x9f,0xf7,0xf7,0xf7,0x9c,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x98,0x99,0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x9e,0x98,0x97,0x97,0x9f,0x9b,\r
+ 0x99,0x9a,0x9b,0x9d,0x94,0x9a,0x9c,0x9f,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9c,0x98,0x9c,0x9a,0x9a,0x9a,0x9d,\r
+ 0x9e,0x94,0x97,0x99,0x9c,0x02,0x94,0x9d,0x9d,0x9b,0x9a,0x99,0x98,\r
+ 0x98,0x99,0x9a,0x9b,0x9d,0x9e,0x9e,0x94,0x94,0x94,0x94,0x94,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,\r
+ 0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0x2f,0x2d,0x2e,0x2e,0x2e,0x2c,0x2a,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0x23,0x35,0x35,0x35,0x26,0x2f,0x02,0x01,\r
+ 0x01,0x2f,0x2f,0x2d,0x2e,0x2f,0x01,0xf7,0xf7,0x36,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0x2e,0x2f,0x2f,0x2f,0x2c,0x2a,0x2a,0x2a,0x2c,0x2f,0x2f,\r
+ 0xf6,0x01,0x01,0x01,0x01,0x26,0xf7,0xf7,0xf7,0x2f,0x36,0x27,0xf7,\r
+ 0x2c,0x2b,0x2e,0xf6,0x02,0x02,0x02,0x01,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x98,0x98,0x97,\r
+ 0x97,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0x03,0x03,0x02,0x02,0x03,0x04,0x04,0x03,0x02,0xf7,0x02,\r
+ 0x02,0x04,0x05,0x03,0x03,0x07,0x07,0x03,0xf7,0x07,0x02,0x03,0x04,\r
+ 0x03,0x02,0x03,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x06,0x06,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x03,0x03,0x02,\r
+ 0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x05,0x03,0x9a,0x9b,0x9d,0xf7,0xf7,0xf7,\r
+ 0x9d,0x94,0x97,0x97,0x97,0x97,0x97,0x97,0x98,0x98,0x9a,0x9f,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x9c,0x97,0x97,0x97,0x02,0x99,0x99,0x9a,0x9c,0x9a,\r
+ 0x97,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9b,0x9b,0x97,0x9d,0x9a,0x9a,0x9a,0x9f,0x99,0x94,0x97,0x99,\r
+ 0x9f,0x9d,0x97,0x9d,0x9d,0x9b,0x9a,0x99,0x99,0x98,0x98,0x99,0x99,\r
+ 0x9a,0x9a,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0xf6,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0x2f,0x2f,0x2f,0x2f,0x2a,0x29,0xf7,0xf7,0xf7,0xf7,0x35,\r
+ 0x35,0x35,0x35,0x28,0x2f,0x02,0x01,0x02,0x2f,0x2c,0x2c,0x2b,0x2c,\r
+ 0x2f,0x01,0xf7,0xf7,0x35,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,\r
+ 0xf6,0x2e,0x2e,0x2f,0x2f,0x2f,0x2d,0x2c,0x2f,0x2f,0x02,0x01,0xf7,\r
+ 0x01,0x25,0xf7,0xf7,0xf7,0x36,0x35,0x2a,0xf7,0x2c,0x2a,0x2c,0x2f,\r
+ 0x2f,0xf6,0x02,0x01,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,0x03,\r
+ 0x02,0x03,0x04,0x04,0x04,0x04,0x02,0xf7,0x02,0x03,0x04,0x05,0xf7,\r
+ 0x07,0x07,0x04,0xf7,0x03,0x03,0x02,0x04,0x04,0xf7,0x03,0x04,0x04,\r
+ 0x04,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,0x04,0x04,0x04,\r
+ 0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x06,0x04,0x02,0xf7,\r
+ 0x02,0x03,0x04,0x05,0x05,0x05,0x04,0x02,0x02,0x03,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x03,0x9a,0x9c,0x9f,0xf7,0xf7,0x03,0x94,0x97,0x97,0x99,0x99,\r
+ 0x97,0x94,0x94,0x97,0x98,0x99,0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x99,\r
+ 0x97,0x97,0x99,0x02,0x99,0x99,0x9b,0x9d,0x98,0x99,0x9b,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x9a,0x98,\r
+ 0x9c,0x9a,0x9a,0x9a,0x03,0x94,0x94,0x98,0x9a,0x01,0x99,0x99,0x9d,\r
+ 0x9d,0x9b,0x9a,0x99,0x99,0x98,0x98,0x98,0x98,0x98,0x94,0x94,0x94,\r
+ 0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x02,\r
+ 0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x02,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0x2f,0x27,0x2a,0xf7,0xf7,0xf7,0x35,0x35,0x35,0x36,0x2a,0x2f,0x02,\r
+ 0x01,0xf6,0x2f,0x2c,0x2a,0x2a,0x2a,0x2c,0x2f,0xf7,0xf7,0x2e,0x23,\r
+ 0xf7,0xf7,0xf7,0xf7,0x2e,0xf7,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2c,0x2e,0x2f,0xf6,0xf7,0xf7,0x2f,0x2c,0xf7,0xf7,\r
+ 0x27,0x35,0x35,0x2a,0xf7,0x2e,0x2a,0x2c,0x2e,0x2f,0x2f,0x02,0xf7,\r
+ 0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,\r
+ 0x97,0x97,0x97,0x97,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,0x02,0x04,0x04,0x05,\r
+ 0x05,0x04,0x03,0xf7,0x02,0x03,0x05,0x04,0x02,0x07,0x06,0x02,0xf7,\r
+ 0x06,0x02,0x03,0x04,0x02,0x02,0x03,0x04,0x04,0x04,0x04,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,\r
+ 0x03,0x03,0x03,0x04,0x05,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,\r
+ 0x06,0x04,0x02,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x03,0x9b,0x9d,0x02,\r
+ 0xf7,0xf7,0x99,0x94,0x98,0x9e,0x9f,0x9f,0x9c,0x98,0x94,0x97,0x97,\r
+ 0x98,0x9c,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x9f,0x9e,0x9e,0x9f,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x99,0x97,0x97,0x9a,0x9e,\r
+ 0x99,0x9a,0x9b,0x9d,0x94,0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9c,0x98,0x9b,0x9a,0x9a,0x9a,0x9c,\r
+ 0x9f,0x94,0x97,0x98,0x9f,0xf7,0x94,0x9a,0x9e,0x9d,0x9b,0x9a,0x9a,\r
+ 0x99,0x99,0x98,0x98,0x98,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0x01,\r
+ 0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xf6,0x2f,0x2f,\r
+ 0x2f,0x02,0x01,0x01,0x01,0x01,0xf6,0x02,0x01,0x26,0x2e,0xf7,0xf7,\r
+ 0x36,0x35,0x35,0x36,0x2c,0x2f,0x02,0x01,0xf6,0x2f,0x2c,0x2a,0x28,\r
+ 0x28,0x2a,0x2c,0x2f,0xf7,0xf7,0x23,0x2c,0xf7,0xf7,0xf7,0x01,0x2f,\r
+ 0xf7,0xf7,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,\r
+ 0x2c,0x2e,0x2f,0xf7,0xf7,0x27,0xf7,0xf7,0x2d,0x36,0x35,0x35,0x2a,\r
+ 0xf7,0x02,0x2a,0x2c,0x2e,0x2f,0xf6,0x01,0xf7,0xf7,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0x02,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x04,0x03,0xf7,\r
+ 0x02,0x03,0x05,0xf7,0x06,0x07,0x02,0xf7,0x04,0x03,0x03,0x03,0x04,\r
+ 0xf7,0x03,0x03,0x04,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x03,0x03,0x03,0x03,0x02,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x02,0x02,0x06,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x05,0x04,0x03,0x9c,0x9f,0xf7,0xf7,0x9f,0x94,0x97,0x9f,\r
+ 0x02,0x02,0x02,0x03,0x9d,0x97,0x94,0x97,0x98,0x99,0x9f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x9d,\r
+ 0x9a,0x99,0x99,0x99,0x9a,0x9c,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x9e,0x98,0x97,0x97,0x03,0x9a,0x99,0x9a,0x9c,0x9c,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9d,0x9b,0x9c,0x97,0x9d,0x9a,0x9a,0x9a,0x9f,0x99,0x94,0x98,0x9a,\r
+ 0x02,0x02,0x94,0x9c,0x9e,0x9d,0x9b,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x97,0x97,0x98,0x99,0x9b,0x2f,0x2f,0x2f,0xf6,0x02,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x02,0x02,0xf6,0xf6,0xf6,0xf6,0x02,0x01,0x01,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0x25,0xf7,0xf7,0x29,0x35,0x35,0x23,0x2e,0xf6,\r
+ 0x01,0x01,0x2f,0x2d,0x2a,0x28,0x27,0x27,0x28,0x2a,0x2e,0x02,0xf7,\r
+ 0xf7,0x35,0xf7,0xf7,0xf7,0xf7,0x2e,0x02,0x01,0x2e,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2b,0x2c,0x2d,0x2f,0xf7,\r
+ 0xf7,0x23,0xf7,0xf7,0x23,0x36,0x35,0x35,0x27,0xf7,0xf7,0x2e,0x2d,\r
+ 0x2f,0x2f,0x01,0xf7,0xf7,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x98,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,\r
+ 0x03,0x04,0x05,0x06,0x06,0x05,0x04,0x02,0x02,0x02,0x04,0x04,0xf7,\r
+ 0x07,0x03,0x02,0xf7,0x06,0x03,0x03,0x04,0xf7,0x03,0x03,0x04,0x04,\r
+ 0x04,0x03,0x03,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x02,0x02,0x02,\r
+ 0xf7,0xf7,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r
+ 0x04,0x04,0x05,0x05,0x05,0xf7,0x02,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x03,0x03,\r
+ 0x9d,0x03,0xf7,0xf7,0x9b,0x94,0x9b,0x02,0x9f,0x9e,0x9f,0x03,0x03,\r
+ 0x9a,0x94,0x97,0x97,0x98,0x9e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0x03,0x9c,0x99,0x98,0x98,0x99,0x99,0x99,\r
+ 0x99,0x9b,0x9f,0x01,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0x01,0x9d,\r
+ 0x97,0x97,0x98,0x02,0x99,0x99,0x9b,0x9d,0x99,0x97,0x9b,0x9e,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9a,0x97,\r
+ 0x9d,0x9a,0x9a,0x99,0x02,0x97,0x97,0x98,0x9f,0xf7,0x9f,0x94,0x9d,\r
+ 0x9e,0x9e,0x9c,0x9a,0x9a,0x99,0x99,0x99,0x9b,0x9b,0x9c,0x9d,0x9c,\r
+ 0x2f,0x2f,0x02,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,\r
+ 0xf6,0x2f,0x2f,0xf6,0xf6,0xf6,0x02,0x01,0x01,0xf7,0xf7,0xf7,0x23,\r
+ 0xf7,0xf7,0x36,0x35,0x23,0x2f,0x01,0x01,0x02,0x2f,0x2c,0x2a,0x27,\r
+ 0x27,0x26,0x27,0x28,0x2a,0x2f,0xf7,0xf7,0x2c,0x36,0xf7,0x2f,0xf7,\r
+ 0xf7,0x2d,0x2f,0x2d,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2c,0x2c,0x2c,0x2d,0xf7,0xf7,0x2f,0x2f,0xf7,0x2f,\r
+ 0x36,0x36,0x35,0x35,0x25,0xf7,0xf7,0x01,0x2f,0xf6,0x01,0xf7,0xf7,\r
+ 0x02,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,\r
+ 0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x04,0x05,0x06,0x06,\r
+ 0x06,0x05,0x04,0x02,0x02,0x03,0x04,0x03,0x05,0x04,0x02,0xf7,0x05,\r
+ 0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x04,0x04,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0x03,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,0x04,\r
+ 0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,\r
+ 0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x06,0x04,0x03,0x04,0x9e,0x01,0xf7,0x01,0x97,\r
+ 0x97,0x03,0x03,0x9d,0x9a,0x9b,0x9e,0x03,0x9f,0x98,0x94,0x97,0x97,\r
+ 0x9d,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x03,\r
+ 0x9c,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x9c,0x03,0xf7,\r
+ 0xf7,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0x02,0x9b,0x97,0x97,0x9a,0x9e,\r
+ 0x99,0x9a,0x9c,0x9e,0x94,0x9a,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x99,0x99,0x9b,0x9a,0x9a,0x9a,\r
+ 0x03,0x94,0x97,0x9a,0x01,0xf7,0x9b,0x94,0x9e,0x9f,0x9e,0x9d,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9d,0x9d,0x9d,0x9c,0x9c,0x2f,0x2f,0x2c,0x29,0x26,\r
+ 0x25,0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0x2a,0xf7,0x2c,0x35,0x36,0xf6,\r
+ 0x01,0x01,0xf6,0x2f,0x2b,0x28,0x27,0x26,0x25,0x27,0x27,0x2a,0x2d,\r
+ 0xf6,0xf7,0xf7,0x36,0x2d,0xf7,0x01,0xf7,0xf7,0x2a,0x2a,0x2a,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2d,0x2e,\r
+ 0x2e,0x2e,0x02,0xf7,0xf7,0x23,0xf7,0xf7,0x2c,0x36,0x35,0x35,0x35,\r
+ 0x23,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0x03,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,0x05,0x04,0xf7,\r
+ 0x02,0x03,0x04,0xf7,0x06,0x02,0xf7,0xf7,0x05,0x03,0x03,0x04,0xf7,\r
+ 0x03,0x03,0x04,0x04,0x03,0x03,0x02,0xf7,0xf7,0xf7,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0xf7,0x02,0x02,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x04,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x04,0x04,0x9f,0xf7,0xf7,0x02,0x94,0x98,0x02,0x9e,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9f,0x03,0x9b,0x97,0x97,0x97,0x9a,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x9e,0x99,0x97,0x98,0x97,0x97,\r
+ 0x97,0x97,0x98,0x99,0x99,0x9a,0x9f,0x01,0xf7,0x01,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x9a,0x97,0x97,0x03,0x99,0x99,0x9b,0x9d,0x9d,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9e,0x9b,0x9c,0x97,0x9c,0x9b,0x9a,0x99,0x9e,0x9b,0x97,0x97,0x9f,\r
+ 0xf7,0xf7,0x97,0x97,0x9e,0x9f,0x9f,0x9e,0x9d,0x9b,0x9b,0x9d,0x9d,\r
+ 0x9c,0x9c,0x9c,0x2a,0x27,0x27,0x2d,0x01,0xf7,0xf7,0x2f,0x25,0x29,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2e,0x2c,0x2c,0x2c,0x2c,0x2e,0xf7,0xf7,\r
+ 0xf7,0x2f,0xf7,0xf7,0x26,0x35,0x2f,0xf7,0x01,0x2f,0x2d,0x2a,0x28,\r
+ 0x27,0x26,0x26,0x26,0x27,0x29,0x2c,0x2f,0xf7,0xf7,0x2d,0x36,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2a,0x2a,0x2b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0x2f,0x2f,0x2f,0x02,0xf7,0xf7,\r
+ 0x2f,0x2a,0xf7,0xf7,0x2f,0x25,0x36,0x35,0x35,0x36,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,\r
+ 0x04,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,0x03,0x04,0x04,0x04,\r
+ 0x03,0x02,0xf7,0x05,0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x04,0x04,\r
+ 0x03,0x02,0x02,0xf7,0xf7,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,0x03,0x03,0x04,0x04,\r
+ 0x04,0x05,0x04,0x02,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x05,0x02,0xf7,\r
+ 0xf7,0x03,0x94,0x99,0x02,0x9c,0x99,0x9a,0x9a,0x9a,0x9c,0x03,0x9f,\r
+ 0x97,0x97,0x97,0x9a,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x01,0x02,0x9b,0x97,0x97,0x97,0x97,0x94,0x94,0x97,0x97,0x98,0x99,\r
+ 0x99,0x9d,0x02,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x99,0x97,0x97,0x02,0x98,0x99,0x9c,0x9e,0x99,0x97,0x9b,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9a,0x94,\r
+ 0x9d,0x9a,0x9a,0x99,0x03,0x98,0x97,0x99,0xf7,0xf7,0x02,0x94,0x98,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9d,0x9d,0x9d,0x9d,0x9e,0x2a,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2c,0x27,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0x2a,0xf7,0x2f,0x35,\r
+ 0x28,0xf7,0xf7,0xf6,0x2d,0x2a,0x27,0x27,0x26,0x26,0x27,0x27,0x29,\r
+ 0x2c,0x2f,0x01,0xf7,0xf7,0x35,0x2a,0xf7,0x2b,0xf7,0xf7,0x2c,0x2a,\r
+ 0x2d,0x2d,0x02,0xf7,0xf7,0xf7,0x02,0x02,0xf6,0xf6,0x2f,0x2f,0x2e,\r
+ 0x2d,0x2f,0x02,0x01,0x01,0x01,0xf7,0xf7,0xf7,0x23,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x28,0x26,0x25,0x36,0x2a,0xf7,0xf7,0xf7,0xf7,0x2e,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,0x03,0x05,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x02,0x02,0x03,0x04,0xf7,0x07,0x02,0xf7,0x02,0x05,\r
+ 0x03,0x03,0x04,0xf7,0x03,0x03,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x02,0x03,0x04,0x04,0x05,0x02,0x02,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x06,0x05,0x05,0x06,0x01,0xf7,0xf7,0x9f,0x94,0x9a,0x02,\r
+ 0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9f,0x03,0x99,0x97,0x97,0x98,0x03,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0x03,0x99,0x97,0x97,\r
+ 0x97,0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x99,0x9d,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x98,0x97,0x9b,0x9d,\r
+ 0x98,0x9a,0x9d,0x9e,0x94,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9e,0x9d,0x9b,0x99,0x98,0x9c,0x9a,0x99,0x99,\r
+ 0x03,0x97,0x97,0x03,0xf7,0xf7,0x9f,0x94,0x99,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x9d,0x9d,0x9d,0x9e,0x9e,0x2f,0xf7,0xf7,0xf7,0xf7,0x01,0x2c,\r
+ 0x29,0x2d,0xf7,0xf7,0xf7,0x2f,0x28,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,0x25,0x36,0xf7,0xf7,0x01,0x2f,0x2b,\r
+ 0x28,0x27,0x27,0x26,0x27,0x28,0x2a,0x2d,0x2f,0x01,0xf7,0xf7,0x23,\r
+ 0x36,0xf7,0xf7,0x2f,0xf7,0xf7,0x2e,0x2f,0x2f,0x2d,0x2f,0x02,0x2f,\r
+ 0x2f,0x2e,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2f,0xf6,0x01,0xf7,0x01,\r
+ 0x01,0x01,0xf7,0xf7,0x2a,0x27,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2c,0x36,0x25,0x2a,0x2d,0x2d,0x2c,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0x02,0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,\r
+ 0x03,0x03,0x04,0x03,0x03,0xf7,0xf7,0x05,0x03,0x03,0x03,0x03,0x02,\r
+ 0x03,0x03,0x04,0x03,0x03,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x02,0x03,0x04,0x04,0x06,0x02,0x02,0x07,0x07,0x07,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,\r
+ 0x07,0xf7,0xf7,0xf7,0x9e,0x97,0x9a,0x02,0x9b,0x99,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9d,0x02,0x9c,0x97,0x97,0x98,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0xf7,0x9f,0x98,0x97,0x97,0x97,0x94,0x94,0x94,0x94,\r
+ 0x97,0x97,0x98,0x99,0x9e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x03,0x97,0x97,0x03,0x99,0x98,0x9c,0x9e,0x9e,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9e,0x9c,0x9b,0x97,0x9a,0x9b,0x9a,0x99,0x9c,0x9c,0x97,0x99,0x01,\r
+ 0xf7,0xf7,0x9d,0x94,0x99,0x9f,0x03,0x02,0x02,0x9c,0x9c,0x9c,0x9d,\r
+ 0x9e,0xf6,0xf7,0xf7,0xf7,0xf6,0x23,0x36,0x35,0x35,0x35,0x23,0x2f,\r
+ 0xf7,0xf7,0xf7,0x2a,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf7,0xf7,\r
+ 0x2c,0x35,0x02,0xf7,0xf7,0x2f,0x2d,0x2a,0x28,0x27,0x27,0x28,0x2a,\r
+ 0x2c,0x2f,0xf6,0x01,0xf7,0x01,0x25,0x35,0x28,0xf7,0x2f,0xf7,0xf7,\r
+ 0xf7,0x2f,0xf6,0xf6,0x2e,0x2e,0x2e,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x02,0x01,0xf7,0xf7,0xf7,0x01,0xf6,0x01,0x01,0x2f,\r
+ 0x25,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x29,0x23,0x25,0x27,\r
+ 0x2a,0x2a,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,\r
+ 0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0x03,0x03,0x02,0x03,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x02,0x03,0x04,0x02,0x07,\r
+ 0x02,0x02,0x02,0x05,0x03,0x03,0x04,0xf7,0x03,0x03,0x03,0x03,0x03,\r
+ 0x02,0xf7,0xf7,0xf7,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x04,0x06,\r
+ 0x02,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,\r
+ 0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x9e,\r
+ 0x97,0x9a,0x02,0x9b,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x03,0x9f,0x97,\r
+ 0x97,0x97,0x9f,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0xf7,0x9f,\r
+ 0x98,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x97,0x98,0x98,0x99,0x03,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0x03,0x97,0x97,0x02,0x98,0x99,0x9d,0x9e,0x9a,0x97,0x9b,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x9b,0x94,\r
+ 0x9d,0x9b,0x9a,0x99,0x03,0x98,0x97,0x03,0xf7,0xf7,0xf7,0x98,0x94,\r
+ 0x99,0x9f,0x03,0x02,0x9c,0x9c,0x9c,0x9d,0x9f,0x2d,0xf7,0xf7,0xf7,\r
+ 0x26,0x35,0x35,0x35,0x35,0x36,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x2e,0x2f,0xf7,0xf7,0xf7,0x2f,0x35,0x27,0xf7,0xf7,0x01,\r
+ 0x2f,0x2d,0x2a,0x2a,0x2a,0x2b,0x2d,0x2f,0x02,0x01,0x01,0xf6,0x2f,\r
+ 0x25,0x35,0x35,0x2f,0xf7,0x26,0xf7,0xf7,0xf7,0x01,0x01,0x02,0x2e,\r
+ 0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf6,0x2f,0x2f,0xf6,0xf6,0x2a,0x26,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x2a,0x25,0x26,0x27,0x28,0x27,0x2d,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x97,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x02,0x02,0x03,0x04,0x02,0x04,0x02,0x03,0x05,0x03,\r
+ 0x03,0x03,0x04,0x02,0x03,0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x02,0x06,0x07,0x07,0x07,\r
+ 0x07,0x07,0x07,0x06,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x05,0x06,\r
+ 0x07,0x07,0x07,0x07,0xf7,0xf7,0xf7,0x9e,0x97,0x99,0x02,0x9d,0x99,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9f,0x03,0x98,0x97,0x97,0x9f,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0x9f,0x98,0x97,0x97,0x97,0x94,\r
+ 0x94,0x94,0x97,0x97,0x98,0x98,0x9b,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x9f,0x94,0x99,0x9d,\r
+ 0x98,0x9a,0x9e,0x9e,0x97,0x99,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x9a,0x97,0x9c,0x9a,0x99,0x99,\r
+ 0x02,0x97,0x99,0x01,0xf7,0xf7,0x01,0x97,0x94,0x97,0x9d,0x9f,0x9c,\r
+ 0x9c,0x9d,0x9d,0x9f,0x2a,0xf7,0xf7,0x01,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x27,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2a,0x35,0x25,0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0x2d,0x2d,0x2f,\r
+ 0x2f,0x02,0x01,0xf6,0x2f,0x2c,0x28,0x36,0x35,0x35,0x25,0xf7,0xf7,\r
+ 0x25,0xf7,0xf7,0x01,0x01,0xf7,0xf6,0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2d,0x29,0x29,0xf6,0xf7,0xf7,0xf7,0x01,0x2d,0x27,\r
+ 0x26,0x27,0x28,0x27,0x27,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x99,0x98,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,\r
+ 0x03,0x03,0x03,0x07,0x03,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x05,0x03,0x02,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x04,\r
+ 0x03,0x03,0x02,0x02,0xf7,0x02,0x02,0x04,0x06,0x07,0x07,0x07,0xf7,\r
+ 0xf7,0xf7,0x9f,0x97,0x97,0x03,0x9f,0x9a,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9f,0x02,0x99,0x97,0x97,0x9f,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0x03,0x99,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\r
+ 0x99,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0x9a,0x94,0x9f,0x98,0x98,0x9d,0x9e,0x9e,\r
+ 0x94,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9e,0x9c,0x9b,0x98,0x9a,0x9c,0x9a,0x99,0x9a,0x9c,0x97,0x03,0x01,\r
+ 0xf7,0xf7,0x02,0x94,0x94,0x94,0x97,0x9c,0x9c,0x9d,0x9d,0x9f,0x27,\r
+ 0xf7,0xf7,0x2f,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x35,0x36,0x23,0x27,0x27,0x23,0x36,0x35,0x29,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x02,0xf6,0xf6,0xf6,0x01,0x01,0x02,0x2f,0x2a,0x25,\r
+ 0x36,0x35,0x35,0x35,0x35,0x2f,0xf7,0xf7,0x25,0xf7,0x01,0x02,0x01,\r
+ 0x01,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0x2f,0x2e,0x2d,0x2e,0x2f,0x2f,0x2f,0x2c,\r
+ 0x2a,0x2b,0x2d,0x2d,0x2c,0x2a,0x28,0x27,0x27,0x28,0x2a,0x2c,0x2f,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x99,0x98,0x97,0x97,\r
+ 0x97,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,0x03,0x03,0xf7,0x06,\r
+ 0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x03,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x05,0x04,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0x06,0x02,0x03,0x07,\r
+ 0x07,0x07,0x07,0x07,0x07,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,0xf7,0xf7,0x01,0x03,0x97,0x97,\r
+ 0x9f,0x03,0x9a,0x99,0x99,0x99,0x99,0x9a,0x9f,0x02,0x99,0x97,0x97,\r
+ 0x9f,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0x03,0x9a,0x97,\r
+ 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x9c,0x02,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x98,0x94,0x02,0x97,0x99,0x9d,0x9e,0x9a,0x94,0x9b,0x9d,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9b,0x94,\r
+ 0x9d,0x9b,0x9a,0x99,0x9f,0x97,0x97,0xf7,0xf7,0xf7,0xf7,0x03,0x94,\r
+ 0x94,0x94,0x9c,0x9c,0x9d,0x9d,0x9e,0x27,0x2e,0xf7,0xf6,0x35,0x35,\r
+ 0x36,0x25,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,\r
+ 0x35,0x36,0x23,0x28,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2f,0x2b,0x23,0x35,0x35,0x35,0x36,0x36,0x35,0x2d,\r
+ 0xf7,0xf7,0x01,0x25,0x02,0x02,0xf6,0xf7,0xf7,0xf6,0x01,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf6,0x2e,0x2d,0x2e,0x2f,0x2f,0x2e,0x2c,0x2c,0x2c,0x2b,0x2a,\r
+ 0x29,0x28,0x28,0x29,0x2a,0x2a,0x2f,0x01,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x99,0x99,0x97,0x97,0x97,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0x02,0x04,0x03,0x02,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x05,0x02,0x03,0x03,0x03,0x06,0x05,0x04,0x04,0x05,0x03,\r
+ 0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x04,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0x04,0x05,0x02,0x05,0x07,0x07,0x07,0x07,0x07,0x06,\r
+ 0x04,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0x07,0x07,0xf7,0xf7,0x01,0x03,0x97,0x97,0x9a,0x02,0x9d,0x9a,0x99,\r
+ 0x99,0x99,0x9a,0x9f,0x02,0x99,0x97,0x97,0x9f,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x01,0x01,0xf7,0x03,0x9c,0x98,0x97,0x97,0x97,0x97,0x97,\r
+ 0x97,0x97,0x99,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0x02,0x94,0x97,0x9f,\r
+ 0x98,0x9a,0x9d,0x9e,0x98,0x98,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9b,0x9a,0x97,0x9d,0x9b,0x99,0x98,\r
+ 0x02,0x97,0x9e,0xf7,0xf7,0xf7,0xf7,0x03,0x99,0x94,0x9b,0x9b,0x9d,\r
+ 0x9d,0x9e,0x28,0x28,0xf7,0x2f,0x35,0x27,0xf7,0xf7,0xf7,0xf7,0x2d,\r
+ 0x23,0x35,0x35,0x35,0x35,0x35,0x23,0x2a,0x2b,0x2f,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2a,0x36,0x35,\r
+ 0x35,0x35,0x36,0x36,0x36,0x27,0xf7,0xf7,0xf7,0xf7,0xf7,0x27,0x2e,\r
+ 0xf6,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2d,0x2d,\r
+ 0x2e,0x2e,0x2e,0x2e,0x2d,0x2c,0x2d,0x2c,0x2a,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2b,0x2c,0x2e,0x2f,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0x01,0x2d,0x9c,\r
+ 0x9a,0x99,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x02,\r
+ 0x03,0x03,0xf7,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x04,0x02,0x03,\r
+ 0x03,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x04,0x06,0x04,0xf7,0xf7,0xf7,0xf7,0x03,0x04,0x05,0x03,\r
+ 0x02,0x07,0x07,0x07,0x07,0x07,0x06,0x05,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0xf7,0xf7,0x01,\r
+ 0x02,0x98,0x97,0x98,0x9f,0x03,0x9c,0x9a,0x99,0x9a,0x9c,0x03,0x02,\r
+ 0x99,0x97,0x97,0x9f,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0xf7,\r
+ 0x03,0x9c,0x99,0x97,0x97,0x97,0x97,0x97,0x97,0x99,0x9d,0x02,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0x9e,0x94,0x9b,0x9b,0x98,0x9a,0x9d,0x9e,\r
+ 0x94,0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x98,0x99,0x9c,0x9b,0x99,0x99,0x9e,0x94,0xf7,0x01,\r
+ 0xf7,0xf7,0xf7,0x01,0x9f,0x9a,0x9a,0x9c,0x9d,0x9d,0x2a,0x27,0x2f,\r
+ 0x2f,0x35,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x28,0x35,0x35,\r
+ 0x36,0x35,0x36,0x29,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x01,0x2a,0x23,0x35,0x35,0x35,0x36,0x36,0x36,0x23,0x2c,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2a,0x2b,0x2f,0x2f,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x2e,0x2d,0x2d,0x2e,0x2e,0x2e,0x2e,\r
+ 0x2d,0x2d,0x2d,0x2c,0x2a,0x2a,0x2a,0x2b,0x2c,0x2c,0x2e,0x2e,0x2f,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf6,0x2b,0x9e,0x9c,0x9a,0x99,0x99,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x03,0x03,0x02,0x04,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x02,0x03,0x03,0x04,0x06,\r
+ 0x05,0x05,0x05,0x03,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x05,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x06,0x02,0x02,0x07,0x07,0x07,0x07,\r
+ 0x07,0x05,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x04,\r
+ 0x03,0xf7,0xf7,0xf7,0x06,0xf7,0xf7,0xf7,0x01,0x9a,0x97,0x97,0x9a,\r
+ 0x02,0x9f,0x9d,0x9b,0x9c,0x9f,0x02,0x03,0x98,0x97,0x97,0x9f,0xf7,\r
+ 0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0x9f,0x9c,0x99,0x97,0x97,\r
+ 0x97,0x97,0x97,0x98,0x9a,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0xf7,0x99,0x97,0x9f,0x99,0x99,0x9a,0x9c,0x9d,0x94,0x9b,0x9c,0x9f,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x94,\r
+ 0x9c,0x9c,0x9a,0x98,0x9c,0x98,0x98,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9b,0x9b,0x9b,0x9d,0x9d,0x2a,0x27,0x29,0x2c,0x36,0xf7,0xf7,0x01,\r
+ 0x2c,0x2c,0x2f,0xf7,0xf7,0xf7,0xf7,0x2e,0x36,0x35,0x35,0x35,0x25,\r
+ 0x2b,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf6,0x27,0x35,0x35,0x35,0x35,\r
+ 0x35,0x35,0x28,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2a,0x2a,\r
+ 0x29,0x2c,0x2c,0x2d,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0x2e,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2e,0x2d,0x2c,0x2d,0x2d,\r
+ 0x2c,0x2c,0x2c,0x2c,0x2d,0x2e,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x2f,0x9e,0x9f,0x9e,0x9d,0x9b,0x03,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x04,0x02,0x03,0x03,0x02,0x07,0x06,0x05,0x04,0x04,0x03,\r
+ 0x03,0x04,0x02,0x03,0x03,0x03,0x02,0x02,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x04,0xf7,0xf7,0xf7,0x02,0x04,\r
+ 0x04,0x06,0x02,0x05,0x07,0x07,0x07,0x07,0x06,0x04,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x05,0x06,0x07,0x07,0x06,0x06,0x05,0x03,0xf7,0x02,\r
+ 0xf7,0xf7,0xf7,0x01,0x9e,0x97,0x97,0x97,0x9e,0x02,0x03,0x9f,0x9f,\r
+ 0x03,0x02,0x9d,0x97,0x97,0x97,0x03,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,\r
+ 0x01,0x02,0x9f,0x9c,0x9a,0x98,0x98,0x97,0x97,0x98,0x98,0x9a,0x9e,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x03,0x97,0x97,0x02,\r
+ 0x99,0x99,0x9a,0x9c,0x9b,0x97,0x9b,0x9c,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9a,0x94,0x9d,0x9c,0x9a,0x98,\r
+ 0x03,0x94,0x9e,0xf7,0xf7,0xf7,0xf7,0xf7,0x9a,0x9a,0x9b,0x9c,0x9d,\r
+ 0x2c,0x29,0x26,0x29,0x36,0xf7,0xf7,0x2d,0x2a,0x29,0x27,0x27,0x27,\r
+ 0x2b,0xf7,0xf7,0xf7,0xf7,0x26,0x35,0x35,0x36,0x27,0x2b,0x2f,0x2f,\r
+ 0x2f,0x2a,0x35,0x35,0x35,0x35,0x36,0x2a,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x2f,0x28,0x27,0x28,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2c,0x2e,0x2e,\r
+ 0x2e,0x2e,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,0x2f,0x2e,0x2d,0x2d,0x2e,0x2e,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2e,0x2d,0x2c,0x2c,0x2c,0x2d,0x2c,0x2d,0x2d,\r
+ 0x2e,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9e,0x03,0x03,\r
+ 0x9f,0x9f,0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,\r
+ 0x03,0x03,0x03,0x06,0x06,0x05,0x04,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x03,0x02,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x02,0x04,0xf7,0xf7,0xf7,0x02,0x04,0x05,0x04,0x02,0x07,0x07,\r
+ 0x07,0x07,0x07,0x05,0x02,0xf7,0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,\r
+ 0x07,0x06,0x06,0x06,0x06,0x06,0x03,0xf7,0x9f,0xf7,0xf7,0xf7,0x03,\r
+ 0x99,0x97,0x97,0x99,0x9f,0x02,0x02,0x02,0x02,0x9f,0x99,0x97,0x97,\r
+ 0x99,0x03,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0x01,0x01,0x02,0x03,0x9f,0x9d,0x9a,0x99,0x98,\r
+ 0x98,0x98,0x98,0x98,0x98,0x99,0x9b,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0x02,0x99,0x97,0x98,0x02,0x99,0x99,0x9a,0x9c,\r
+ 0x98,0x98,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x99,0x97,0x9d,0x9c,0x99,0x98,0x03,0x94,0x02,0xf7,\r
+ 0xf7,0xf7,0xf7,0x99,0x99,0x9a,0x9c,0x9d,0x2d,0x2a,0x27,0x26,0x36,\r
+ 0xf7,0xf7,0x2d,0x2c,0x2a,0x2a,0x28,0x27,0x27,0x25,0x28,0xf7,0xf7,\r
+ 0xf7,0xf7,0x27,0x35,0x35,0x36,0x23,0x27,0x26,0x35,0x35,0x35,0x36,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0x2e,0x29,0x2a,0x2c,0x2c,0x2d,0x2d,0x2e,\r
+ 0x2d,0x2c,0x2b,0x2b,0x2c,0x2c,0x2d,0x2e,0x2e,0x2e,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x2f,0x2f,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2e,0x2c,0x2c,0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x2f,0xf6,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x03,0x02,0x01,0x02,0x06,0x05,0x04,\r
+ 0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,0x03,0x02,0x06,0x06,\r
+ 0x05,0x04,0x04,0x04,0x03,0x04,0x02,0x03,0x02,0x02,0x02,0x02,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0x03,0x04,0x05,0x02,0x02,0x07,0x07,0x07,0x07,0x06,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0x04,0x07,0x07,0x07,0x06,0x05,0x05,0x04,0x05,0x05,\r
+ 0x05,0x05,0x02,0x94,0x01,0xf7,0xf7,0x02,0x9e,0x97,0x97,0x97,0x98,\r
+ 0x9c,0x9f,0x9f,0x9e,0x9a,0x97,0x97,0x94,0x9c,0x02,0xf7,0xf7,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0x02,\r
+ 0x9f,0x9b,0x99,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x99,\r
+ 0x9a,0x9d,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x02,0x9f,0x9f,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9c,0x9f,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9e,0x97,0x97,0x99,0x03,0x99,0x9a,0x9a,0x9c,0x97,0x9a,0x9b,0x9e,\r
+ 0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x97,\r
+ 0x9b,0x9d,0x9c,0x98,0x99,0x9b,0x97,0x01,0xf7,0xf7,0xf7,0x99,0x99,\r
+ 0x9a,0x9c,0x9b,0x2e,0x2c,0x29,0x26,0x25,0x28,0xf7,0x2f,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2c,0x2a,0x27,0x26,0x25,0x27,0x01,0xf7,0xf7,0x2f,0x35,\r
+ 0x35,0x35,0x35,0x35,0x35,0x35,0x23,0xf7,0xf7,0xf7,0xf7,0x2c,0x2c,\r
+ 0x2e,0x2d,0x2f,0xf6,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0x01,0x2e,0x2c,\r
+ 0x2c,0x2c,0x2d,0x2e,0x2e,0x2e,0x2e,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2d,\r
+ 0x2c,0x2c,0x2d,0x2e,0x2f,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x9c,0x03,0x02,0x01,0xf7,0x07,0x07,0x06,0x05,0x04,0x03,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x03,0x02,0x03,0x03,0xf7,0x06,0x06,0x05,0x04,0x04,0x03,\r
+ 0x03,0x03,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x06,0x02,\r
+ 0x04,0x07,0x07,0x07,0x07,0x04,0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,\r
+ 0x07,0x06,0x04,0x03,0x02,0x02,0x03,0x04,0x05,0x05,0x05,0x94,0x9d,\r
+ 0xf7,0xf7,0xf7,0x03,0x9a,0x97,0x97,0x97,0x97,0x99,0x99,0x98,0x97,\r
+ 0x97,0x94,0x97,0x9f,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0x01,0x01,0x01,0x01,0x01,0x03,0x9d,0x99,0x98,0x98,0x98,0x97,0x97,\r
+ 0x97,0x97,0x97,0x98,0x98,0x98,0x99,0x99,0x99,0x9b,0x9f,0x02,0xf7,\r
+ 0xf7,0x01,0x03,0x9e,0x9a,0x98,0x94,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x9c,0x02,0xf7,0xf7,0x03,0x99,0x97,0x94,0x9a,\r
+ 0x9f,0x9a,0x9a,0x9a,0x9d,0x97,0x9a,0x9b,0x9e,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9c,0x9b,0x94,0x9e,0x9d,0x9a,0x98,\r
+ 0x9d,0x97,0x97,0x02,0xf7,0xf7,0x99,0x99,0x9a,0x9c,0x9d,0x2f,0x2d,\r
+ 0x2a,0x27,0x25,0x36,0xf7,0x01,0x2e,0x2e,0x2f,0x2f,0xf6,0x2f,0x2f,\r
+ 0x2b,0x27,0x25,0x23,0x27,0xf7,0xf7,0xf7,0x35,0x35,0x35,0x35,0x36,\r
+ 0x23,0xf7,0xf7,0xf7,0x2f,0x2c,0x2f,0x2f,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x2d,0x2c,0x2e,0x2b,0x2a,0x2b,0x2c,0x2e,\r
+ 0x2e,0x2f,0x2f,0xf7,0xf7,0x2f,0x2f,0xf6,0x01,0x01,0x02,0xf6,0x2f,\r
+ 0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0xf6,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,\r
+ 0x2e,0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x94,0x99,0x9e,0x03,0x01,\r
+ 0x07,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,\r
+ 0x03,0x03,0x06,0x06,0x05,0x04,0x04,0x04,0x03,0x04,0x02,0x04,0x02,\r
+ 0x02,0x02,0x02,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x02,0x04,0x04,0x06,0x02,0x06,0x07,0x07,0x07,0x04,\r
+ 0xf7,0xf7,0xf7,0xf7,0x04,0x07,0x07,0x06,0x05,0x03,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x04,0x05,0x9b,0x94,0x01,0xf7,0xf7,0x02,0x9f,\r
+ 0x99,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x9a,0x03,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x01,0x01,0x01,0x01,0x01,0x02,0x9c,\r
+ 0x98,0x98,0x97,0x97,0x97,0x9b,0x9f,0x9f,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9e,0x9f,0x03,0x01,0x02,0x9f,0x9a,0x97,0x94,0x94,0x94,\r
+ 0x94,0x97,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x99,0x98,0x97,0x94,\r
+ 0x94,0x9d,0xf7,0x02,0x9a,0x98,0x97,0x94,0x9d,0x9e,0x9a,0x9a,0x9a,\r
+ 0x9d,0x94,0x9a,0x9c,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x99,0x97,0x9e,0x9d,0x99,0x97,0x9f,0x97,0x94,0x9c,\r
+ 0x03,0x99,0x99,0x99,0x9b,0x9d,0x2e,0x2f,0x2c,0x2a,0x27,0x25,0x25,\r
+ 0xf7,0x2f,0x2f,0x2f,0xf6,0x01,0x01,0xf7,0x01,0xf6,0x2c,0x27,0x25,\r
+ 0x25,0xf7,0xf7,0x2e,0x35,0x35,0x35,0x36,0xf7,0xf7,0xf7,0x2c,0x2e,\r
+ 0x2f,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x2c,0x28,0x27,0x29,0x2a,0x2a,0x2a,0x2c,0x2d,0x2f,0x2f,0xf7,0xf7,\r
+ 0x2f,0x2e,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2e,0x2f,0xf6,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xf6,0xf6,0x2f,0x2f,0x2f,\r
+ 0xf6,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,0x2d,0x2f,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x94,0x94,0x94,0x98,0x9d,0x06,0x07,0x07,0x07,0x07,\r
+ 0x06,0x06,0x04,0x03,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,0x03,0x03,0xf7,0x06,0x06,\r
+ 0x05,0x04,0x04,0x03,0x03,0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x04,\r
+ 0x05,0x05,0x02,0x06,0x07,0x07,0x06,0x02,0xf7,0xf7,0xf7,0x04,0x07,\r
+ 0x07,0x06,0x05,0x03,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0x03,\r
+ 0x04,0x9e,0x94,0x9c,0xf7,0xf7,0xf7,0x02,0x9f,0x99,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x97,0x98,0x9f,0x01,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0xf7,0x03,0x99,0x98,0x97,0x94,0x9a,0x9f,0x9f,\r
+ 0x9f,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x03,0x03,0x02,0x02,0x9f,\r
+ 0x9a,0x97,0x94,0x94,0x97,0x9a,0x9b,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9a,0x94,0x98,0x02,0x9f,\r
+ 0x99,0x97,0x94,0x94,0x9f,0x9d,0x9a,0x9a,0x9a,0x9d,0x97,0x9b,0x9c,\r
+ 0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x97,\r
+ 0x9a,0x9d,0x9c,0x99,0x97,0x9f,0x9a,0x94,0x94,0x98,0x98,0x99,0x9b,\r
+ 0x9d,0x2d,0x2e,0x2f,0x2c,0x29,0x27,0x23,0x2c,0xf7,0x2f,0x2f,0x2f,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2a,0x26,0x26,0xf7,0xf7,0x27,\r
+ 0x35,0x35,0x2e,0xf7,0xf7,0x2a,0x2f,0x2f,0xf7,0xf7,0xf7,0x2e,0x2a,\r
+ 0x2b,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,0x2f,0x2c,0x29,0x28,\r
+ 0x27,0x28,0x2a,0x2b,0x2c,0x2f,0x2f,0xf7,0x01,0x2f,0x2e,0x2e,0x2f,\r
+ 0x2f,0x2f,0x2e,0x2d,0x2f,0xf6,0x01,0x01,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x02,0xf6,0xf6,0xf6,0xf6,0xf6,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2e,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0x94,0x94,\r
+ 0x94,0x94,0x94,0x02,0x04,0x06,0x07,0x07,0x07,0x07,0x06,0x05,0x04,\r
+ 0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x05,0x02,0x03,0x03,0x03,0x06,0x06,0x05,0x04,0x04,0x04,0x02,\r
+ 0x04,0x02,0x04,0x02,0x02,0x02,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x02,0x07,0x07,\r
+ 0x06,0x03,0xf7,0xf7,0x02,0x04,0x06,0x07,0x06,0x05,0x03,0x02,0xf7,\r
+ 0xf7,0xf7,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x9e,0x9c,0x94,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0x03,0x9c,0x99,0x97,0x97,0x97,0x97,0x99,0x9d,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0x01,0x01,0x01,0xf7,0x01,0x9e,\r
+ 0x98,0x97,0x94,0x99,0x9f,0x9f,0x9e,0x9d,0x9d,0x9c,0x9c,0x9a,0x9a,\r
+ 0x98,0x99,0x9f,0x03,0x9f,0x9f,0x9b,0x97,0x97,0x98,0x9a,0x9b,0x9c,\r
+ 0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,\r
+ 0x9d,0x9d,0x9d,0x9d,0x9c,0x99,0x94,0x9f,0x03,0x99,0x98,0x98,0x99,\r
+ 0x9f,0x9d,0x9a,0x9a,0x9a,0x9c,0x97,0x9b,0x9c,0x9f,0x03,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9e,0x9c,0x9b,0x94,0x9d,0x9d,0x9c,0x99,\r
+ 0x97,0x9a,0x02,0x9f,0x97,0x97,0x97,0x97,0x9c,0x2d,0x2d,0x2e,0x2e,\r
+ 0x2a,0x28,0x26,0x23,0xf7,0xf7,0x2f,0x2f,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2c,0x27,0x27,0xf7,0xf7,0x35,0x36,0xf7,0xf7,0x28,\r
+ 0x2d,0x2f,0xf7,0xf7,0xf7,0x23,0x35,0x2c,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x28,0x27,0x27,0x27,0x29,0x2c,\r
+ 0x2c,0x2f,0x2f,0xf7,0x01,0x2f,0x2e,0xf6,0xf7,0x01,0x02,0x2f,0x2e,\r
+ 0x2e,0x2f,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0x02,0x02,0xf6,0xf6,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2e,0x2d,0x2e,0x01,0xf7,0xf7,0x94,0x94,0x94,0x94,0x94,0xf7,0xf7,\r
+ 0x02,0x04,0x06,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x02,0x03,\r
+ 0x03,0xf7,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x04,0x03,0x03,0x02,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x03,0x03,0x04,0x05,0x05,0x02,0x07,0x07,0x04,0xf7,0xf7,0x02,0x05,\r
+ 0x07,0x07,0x06,0x05,0x03,0x02,0xf7,0xf7,0xf7,0x02,0x03,0x03,0x03,\r
+ 0x02,0xf7,0x02,0x03,0x9e,0x9e,0x94,0x9e,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0x02,0x9f,0x9d,0x9b,0x9b,0x9c,0x9f,0x03,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0x01,0x9c,0x97,0x97,0x94,0x9e,0x9f,0x9d,\r
+ 0x9d,0x9a,0x99,0x99,0x99,0x99,0x99,0x98,0x98,0x94,0x97,0x9e,0x9e,\r
+ 0x9b,0x97,0x97,0x99,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b,\r
+ 0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9c,0x9c,\r
+ 0x9c,0x9b,0x97,0x9b,0x02,0x9d,0x9b,0x9b,0x9c,0x9f,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9b,0x97,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9d,0x9b,0x9a,0x94,0x9e,0x9d,0x9c,0x99,0x98,0x97,0x98,0x99,\r
+ 0x99,0x99,0x97,0x97,0xf6,0x2d,0x2e,0x2f,0x2d,0x2a,0x27,0x25,0x36,\r
+ 0xf7,0xf6,0x2f,0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x2a,0x2a,0xf7,0x2c,0x28,0xf7,0x27,0x2c,0x2e,0x02,0xf7,0xf7,0x25,\r
+ 0x2a,0xf7,0xf7,0xf7,0x02,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2e,0x25,0x26,0x27,0x28,0x2c,0x2c,0x2f,0xf6,0x01,\r
+ 0x01,0x2d,0x2f,0xf7,0xf7,0xf7,0xf7,0xf6,0x2e,0x2e,0x2f,0x2f,0xf6,\r
+ 0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x02,0xf6,0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2f,\r
+ 0xf7,0x97,0x94,0x94,0x94,0x94,0xf7,0xf7,0xf7,0xf7,0x03,0x05,0x07,\r
+ 0x07,0x07,0x07,0x06,0x04,0x03,0x02,0x02,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x02,0x03,0x03,0x04,0x06,0x05,\r
+ 0x04,0x04,0x04,0x02,0x04,0x03,0x04,0x02,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,\r
+ 0x03,0x07,0x06,0xf7,0xf7,0x03,0x05,0x06,0x06,0x06,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0x02,0x03,0x04,0x05,0x05,0x04,0x03,0x02,0x02,0x03,0x9c,\r
+ 0x9e,0x9a,0x94,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0x02,0x03,0x03,\r
+ 0x03,0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,\r
+ 0x9c,0x97,0x97,0x94,0x9f,0x9e,0x9d,0x9a,0x98,0x94,0x94,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x97,0x99,0x9b,0x98,0x97,0x98,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9b,0x99,0x97,\r
+ 0x02,0x9f,0x9e,0x9d,0x9d,0x9f,0x9c,0x9a,0x9a,0x9b,0x99,0x99,0x9b,\r
+ 0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9b,0x99,\r
+ 0x98,0x9e,0x9d,0x9c,0x9a,0x99,0x98,0x99,0x99,0x99,0x9a,0x99,0xf7,\r
+ 0x01,0x2d,0x2e,0x2e,0x2c,0x29,0x27,0x27,0x36,0xf7,0x2f,0x2e,0x2f,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0x2c,0x2e,0xf7,0x36,\r
+ 0x26,0x29,0x2e,0xf7,0xf7,0xf7,0x27,0x2a,0xf7,0xf7,0xf7,0xf6,0x2f,\r
+ 0x2f,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,\r
+ 0x23,0x26,0x27,0x29,0x2c,0x2e,0x2f,0x01,0xf7,0x2f,0x2e,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x2f,0x2f,0x2e,0x2f,0x2f,0x2f,0x2f,0xf6,0xf6,0xf6,\r
+ 0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0x01,0x01,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0x99,0x98,0x98,0x94,\r
+ 0x94,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,0x07,0x06,\r
+ 0x05,0x03,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x05,0x02,0x03,0x03,0x02,0x06,0x05,0x05,0x04,0x04,0x04,0x03,\r
+ 0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,0x02,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x06,0x03,0x07,0x03,0xf7,0x03,\r
+ 0x05,0x06,0x06,0x06,0x04,0x03,0x02,0xf7,0xf7,0x02,0x04,0x05,0x05,\r
+ 0x06,0x06,0x05,0x05,0x03,0xf7,0x02,0x9a,0x9e,0x9e,0x94,0x9f,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9d,0x97,0x97,0x94,0x9f,0x9e,\r
+ 0x9d,0x99,0x97,0x94,0x94,0x9c,0x99,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x98,0x99,0x97,0x94,0x97,0x98,0x99,0x99,0x9a,0x9b,0x9b,0x9b,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x94,0x02,0x03,0x9f,0x9e,\r
+ 0x9e,0x9f,0x9b,0x9a,0x9a,0x9c,0x97,0x99,0x9b,0x9e,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9c,0x9b,0x97,0x99,0x9e,0x9d,0x9c,\r
+ 0x9c,0x9b,0x9a,0x9a,0x9a,0x9a,0x9b,0xf6,0xf7,0xf7,0x2e,0x2e,0x2d,\r
+ 0x2a,0x28,0x2a,0x2e,0x36,0xf7,0x2e,0x2d,0xf6,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x2f,0x2e,0xf7,0x2c,0x26,0x2d,0x2f,0xf7,0xf7,\r
+ 0xf7,0x36,0xf7,0xf7,0xf7,0x01,0x2f,0x2d,0x2f,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x23,0x27,0x28,0x2a,\r
+ 0x2a,0x2f,0x2f,0x01,0x01,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0x01,0x2f,\r
+ 0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xf6,0xf6,0xf6,0xf6,\r
+ 0xf6,0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r
+ 0x01,0xf7,0xf7,0xf7,0x97,0x97,0x97,0x99,0x9a,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x03,0x06,0x07,0x07,0x07,0x06,0x05,0x04,0x03,0x02,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x02,0x03,\r
+ 0x03,0x03,0x06,0x05,0x04,0x04,0x04,0x02,0x03,0x03,0x04,0x02,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0x03,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,\r
+ 0x04,0x05,0x06,0x04,0x07,0xf7,0x02,0x05,0x06,0x06,0x05,0x03,0x02,\r
+ 0x02,0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x04,\r
+ 0x02,0x02,0x9a,0x9d,0x9e,0x9a,0x97,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x9f,0x97,0x97,0x94,0x9f,0x9e,0x9d,0x99,0x94,0x94,0x9d,0x9b,\r
+ 0x94,0x97,0x9a,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x97,0x97,0x94,0x94,\r
+ 0x94,0x97,0x99,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x9a,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x94,0x02,0x03,0x9f,0x9e,0x9e,0x9f,0x9a,0x9a,\r
+ 0x9a,0x9d,0x97,0x9a,0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,\r
+ 0x9f,0x9e,0x9c,0x9b,0x97,0x97,0x9d,0x9d,0x9d,0x9c,0x9b,0x9b,0x9c,\r
+ 0x9c,0x9c,0x2e,0x2f,0xf7,0xf7,0x2f,0x2f,0x2c,0x2a,0x2f,0xf7,0x02,\r
+ 0x27,0xf7,0x2c,0x2c,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x2f,0x2f,0xf7,0x27,0x2f,0xf6,0xf7,0xf7,0x2f,0x36,0xf7,0xf7,0x02,\r
+ 0x02,0xf6,0x2f,0x2f,0xf6,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0xf7,0x2d,0x25,0x28,0x29,0x2a,0x2a,0x2f,0x2f,0x01,\r
+ 0x01,0x2f,0x2f,0xf7,0xf7,0xf7,0xf7,0x2f,0x2e,0x2d,0x2e,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0xf6,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0xf7,0x01,0x01,0x9a,\r
+ 0x9a,0x99,0x97,0x94,0x02,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x05,0x06,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x03,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,0x03,0x02,0x06,0x05,0x05,\r
+ 0x04,0x04,0x04,0x02,0x04,0x03,0x03,0x02,0x02,0x02,0xf7,0xf7,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x03,0x04,0x05,0x06,0x06,0x06,\r
+ 0xf7,0x04,0x05,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,0x02,0x04,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0xf7,0x99,0x9a,0x9e,\r
+ 0x9e,0x94,0x9f,0xf7,0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9f,0x97,0x97,0x94,0x9d,\r
+ 0x9e,0x9d,0x99,0x94,0x94,0x9f,0x98,0x97,0x9c,0x9c,0x9a,0x99,0x98,\r
+ 0x97,0x97,0x97,0x97,0x97,0x94,0x94,0x94,0x94,0x98,0x9a,0x9c,0x9b,\r
+ 0x9a,0x9a,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9a,0x9b,0x9a,0x9a,0x9a,\r
+ 0x97,0x03,0x03,0x9e,0x9e,0x9d,0x9f,0x9a,0x9a,0x9a,0x9d,0x94,0x9b,\r
+ 0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9c,0x9b,\r
+ 0x98,0x94,0x9a,0x9d,0x9d,0x97,0x97,0x98,0x99,0x9d,0x2e,0x2e,0x2e,\r
+ 0x01,0xf7,0x2f,0x2f,0x2a,0xf7,0xf7,0xf7,0x27,0x2c,0xf7,0x2a,0x2c,\r
+ 0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0xf6,0xf7,0x2a,0x2c,\r
+ 0x01,0xf7,0xf7,0x01,0x36,0xf7,0xf7,0x01,0x01,0x02,0xf7,0xf6,0x2f,\r
+ 0x02,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf6,0x02,0x01,0x01,0xf7,\r
+ 0x27,0x25,0x27,0x2a,0x2c,0x2b,0xf6,0xf6,0x01,0x01,0x2f,0x2f,0x02,\r
+ 0x01,0x01,0x2f,0x2e,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r
+ 0x2f,0xf6,0xf6,0xf6,0x02,0x01,0x01,0x9a,0x9b,0x9c,0x9c,0x9a,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x04,0x06,0x07,0x07,\r
+ 0x06,0x05,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x03,0x02,0x03,0x05,0x06,0x06,0x06,0x06,\r
+ 0x06,0x04,0x02,0x03,0x03,0xf7,0x06,0x05,0x04,0x04,0x04,0x02,0x03,\r
+ 0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0xf7,0x03,0xf7,0xf7,0xf7,0x02,\r
+ 0xf7,0x02,0x03,0x04,0x04,0x06,0x06,0x04,0x02,0x04,0x04,0x04,0x03,\r
+ 0x02,0x02,0xf7,0xf7,0x02,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x04,0x02,0x98,0x9a,0x9d,0x9e,0x99,0x97,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x02,0x98,0x97,0x94,0x98,0x9e,0x9d,0x9a,0x94,0x97,0x03,\r
+ 0x97,0x9a,0x9e,0x9e,0x9c,0x9a,0x98,0x98,0x99,0x99,0x98,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,0x9a,0x9a,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\r
+ 0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x97,0x03,0x03,0x9e,\r
+ 0x9d,0x9c,0x9f,0x9a,0x9a,0x9a,0x9d,0x97,0x9b,0x9d,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9c,0x9b,0x99,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x97,0x2f,0x2d,0x2f,0x2e,0x01,0x01,0x2f,0x2c,\r
+ 0x2f,0xf7,0xf7,0x2d,0x35,0xf7,0xf7,0x2a,0x2c,0x01,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0xf7,0x02,0x27,0xf7,0xf7,0xf7,0xf7,0x23,\r
+ 0xf7,0xf7,0x01,0xf7,0x01,0x01,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x2f,0x2f,0xf6,0x01,0x02,0xf7,0x23,0x27,0x28,0x2a,\r
+ 0x2c,0x2c,0xf6,0x02,0x01,0x02,0x2f,0x2e,0x2f,0x2f,0x2f,0x2d,0x2c,\r
+ 0x2c,0x2e,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,0x2c,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2d,0x2d,0x2e,0x2f,0x2f,0x2f,\r
+ 0x2f,0x2f,0x9d,0x9d,0x9d,0x9d,0x9d,0x04,0x02,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x04,0x06,0x07,0x07,0x06,0x05,0x04,0x02,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,0xf7,0xf7,\r
+ 0x03,0x03,0x02,0x04,0x06,0x06,0x06,0x06,0x06,0x05,0x02,0x03,0x03,\r
+ 0x02,0x05,0x05,0x05,0x04,0x04,0x04,0x02,0x04,0x03,0x04,0x02,0x02,\r
+ 0xf7,0xf7,0xf7,0x03,0x02,0xf7,0xf7,0x02,0xf7,0x02,0x03,0x04,0x04,\r
+ 0x05,0x06,0x04,0x02,0x04,0x04,0x03,0x02,0x02,0xf7,0xf7,0x03,0x04,\r
+ 0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,\r
+ 0x97,0x99,0x9b,0x9e,0x9d,0x94,0x03,0xf7,0xf7,0xf7,0xf7,0x01,0x01,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x9a,0x97,0x94,\r
+ 0x94,0x9f,0x9d,0x9a,0x94,0x97,0x02,0x97,0x9a,0x9f,0x9d,0x9a,0x9b,\r
+ 0x9d,0x9e,0x9b,0x9b,0x9b,0x9b,0x98,0x94,0x94,0x94,0x94,0x94,0x99,\r
+ 0x9c,0x9c,0x9a,0x99,0x99,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x99,0x99,\r
+ 0x99,0x99,0x9a,0x9a,0x9a,0x98,0x03,0x9f,0x9c,0x9a,0x9c,0x9f,0x9a,\r
+ 0x9a,0x9b,0x9a,0x98,0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x9f,0x9d,0x9c,0x9b,0x9b,0x9a,0x99,0x97,0x97,0x97,0x97,0x94,\r
+ 0xf7,0xf6,0x2f,0xf6,0x2f,0xf7,0x01,0x01,0x27,0xf7,0xf7,0xf7,0x35,\r
+ 0x35,0xf7,0x2f,0x28,0x2c,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0x02,\r
+ 0x01,0xf7,0x28,0xf7,0xf6,0xf7,0xf7,0x2c,0xf7,0xf7,0x01,0xf7,0xf7,\r
+ 0x02,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x2f,0xf6,\r
+ 0xf6,0xf6,0x01,0x02,0xf7,0x23,0x27,0x2a,0x2a,0x2a,0x2f,0xf6,0x01,\r
+ 0x01,0xf6,0x2f,0x2e,0x2e,0x2e,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,\r
+ 0x2c,0x2c,0x2b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,\r
+ 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2c,0x2c,0x2c,0x2e,0x9c,0x9a,0x9a,\r
+ 0x9b,0x9c,0x04,0x04,0x03,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0x04,0x06,0x07,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x02,0xf7,0xf7,0x02,0x04,0x03,0x02,0x05,\r
+ 0x06,0x06,0x06,0x06,0x06,0x04,0x02,0x03,0x03,0xf7,0x06,0x05,0x04,\r
+ 0x04,0x04,0x03,0x03,0x04,0x04,0x03,0x02,0xf7,0xf7,0xf7,0xf7,0x03,\r
+ 0xf7,0xf7,0xf7,0x02,0x02,0x03,0x04,0x04,0x05,0x06,0x03,0x03,0x04,\r
+ 0x03,0x03,0x02,0xf7,0x02,0x03,0x05,0x05,0x06,0x06,0x06,0x06,0x06,\r
+ 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x97,0x98,0x9a,0x9e,0x9e,\r
+ 0x97,0x99,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,\r
+ 0xf7,0xf7,0xf7,0x01,0x9c,0x97,0x97,0x94,0x9f,0x9d,0x9b,0x98,0x94,\r
+ 0x02,0x99,0x99,0x9e,0x9a,0x98,0x99,0x9a,0x9c,0x9e,0x9e,0x9c,0x9c,\r
+ 0x9c,0x99,0x94,0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,0x9a,0x99,0x99,\r
+ 0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9c,0x9c,0x9d,0x9d,0x9c,0x9b,0x99,0x98,0x99,0x9a,0x9a,\r
+ 0x9a,0x97,0x02,0x9e,0x9b,0x99,0x9d,0x9e,0x9a,0x9a,0x9b,0x98,0x99,\r
+ 0x9c,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9d,0x9c,\r
+ 0x9b,0x9b,0x9b,0x99,0x99,0x99,0x98,0x97,0x97,0x97,0x9a,0x9b,0x99,\r
+ 0x9c,0x9a,0x9a,0x99,0x02,0x97,0x97,0x02,0xf7,0x01,0x94,0x9e,0x9f,\r
+ 0x9d,0x9a,0x99,0x98,0x98,0x99,0x9a,0x9a,0x9a,0x94,0x9f,0x97,0x9b,\r
+ 0x97,0x94,0x97,0x97,0x99,0x9a,0x98,0x98,0x99,0x99,0x97,0x98,0x94,\r
+ 0x94,0x94,0x97,0x97,0x94,0x98,0x9c,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x98,0x02,0x9f,0x9e,0x9e,0x9f,0x9b,0x9a,0x9a,0x9a,0x9b,0x9c,0x9d,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9c,0x99,0x97,0x97,0x97,0x99,0x9a,0x9c,0x9d,\r
+ 0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x9d,0x02,0xf7,\r
+ 0xf7,0x02,0x9f,0x9c,0x99,0x98,0x97,0x94,0x94,0x94,0x94,0x87,0x87,\r
+ 0x98,0x99,0x87,0x87,0x99,0x9b,0x99,0x9a,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x9f,0x99,0x99,0x9a,0x99,0x9e,0x9f,0x9e,0x9d,0x9d,0x9d,0x97,0x9d,\r
+ 0x9a,0x9c,0x99,0x97,0x97,0x87,0x87,0x9a,0x99,0x97,0x87,0x98,0x99,\r
+ 0x9a,0x9c,0x9d,0x9e,0x03,0x9d,0x99,0x9b,0x9a,0x99,0x97,0x98,0x9b,\r
+ 0x9f,0x9f,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,\r
+ 0x03,0x03,0x9e,0x99,0x97,0x99,0x9c,0x9e,0x9d,0x94,0x03,0xf7,0xf7,\r
+ 0xf7,0xf7,0x01,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x9e,0x97,\r
+ 0x97,0x94,0x9a,0x9e,0x9b,0x99,0x94,0x03,0x9e,0x97,0x9d,0x9a,0x97,\r
+ 0x97,0x98,0x9a,0x9c,0x9e,0x9f,0x9d,0x9c,0x9b,0x9a,0x94,0x94,0x94,\r
+ 0x94,0x94,0x99,0x9c,0x9b,0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9b,0x9c,0x9d,0x9e,\r
+ 0x9f,0x9f,0x9f,0x9e,0x9c,0x99,0x98,0x9a,0x9a,0x9b,0x97,0x02,0x9d,\r
+ 0x9a,0x99,0x9e,0x9c,0x9a,0x9a,0x9c,0x94,0x9a,0x9c,0x9f,0x03,0x03,\r
+ 0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9e,0x9d,0x9d,0x9c,0x9a,0x9a,\r
+ 0x9a,0x9a,0x99,0x99,0x99,0x99,0x9b,0x99,0x9a,0x9b,0x9a,0x99,0x9a,\r
+ 0x9a,0x97,0x03,0xf7,0xf7,0x03,0x94,0x9f,0x03,0x9e,0x9a,0x99,0x99,\r
+ 0x99,0x9a,0x9b,0x9a,0x97,0x9f,0x9a,0x9a,0x97,0x94,0x94,0x94,0x97,\r
+ 0x99,0x98,0x97,0x98,0x9a,0x94,0x9f,0x9a,0x94,0x94,0x94,0x98,0x94,\r
+ 0x97,0x9b,0x9b,0x9a,0x99,0x9a,0x9a,0x9a,0x9a,0x9e,0x9f,0x9e,0x9b,\r
+ 0x9c,0x9f,0x9a,0x9a,0x9a,0x9a,0x9c,0x9d,0x9e,0x9e,0x9e,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e,0x9e,0x9e,\r
+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9a,\r
+ 0x97,0x94,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9a,0x97,0x94,0x94,\r
+ 0x94,0x94,0x94,0x94,0x94,0x94,0x9d,0x02,0xf7,0x01,0x02,0x9f,0x9c,\r
+ 0x9a,0x98,0x97,0x94,0x94,0x94,0x87,0x87,0x97,0x98,0x98,0x87,0x97,\r
+ 0x9a,0x9a,0x99,0x9d,0x9f,0x03,0x03,0x03,0x03,0x9e,0x98,0x9a,0x9a,\r
+ 0x97,0x03,0x9f,0x9e,0x9c,0x9d,0x9c,0x9a,0x9d,0x9c,0x9a,0x98,0x97,\r
+ 0x97,0x87,0x99,0x9b,0x98,0x97,0x98,0x99,0x9a,0x9b,0x9d,0x9e,0x9f,\r
+ 0x9f,0x99,0x9a,0x9a,0x99,0x97,0x99,0x9e,0x9f,0x03,0x03,0x03,0x03,\r
+ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x9f,0x9b,0x97,\r
+ 0x99,0x9a,0x9e,0x9e,0x94,0x9b,0xf7,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,\r
+ 0xf7,0xf7,0xf7,0xf7,0xf7,0x03,0x98,0x97,0x94,0x97,0x9e,0x9c,0x9a,\r
+ 0x94,0x9e,0x02,0x94,0x9c,0x9a,0x97,0x94,0x97,0x97,0x9a,0x9c,0x9e,\r
+ 0x9e,0x9e,0x9c,0x9b,0x9a,0x97,0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,\r
+ 0x9a,0x99,0x99,0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9e,0x9a,0x98,0x9a,0x9a,0x9b,0x94,0x02,0x9b,0x9a,0x99,0x9f,0x9a,\r
+ 0x9a,0x9a,0x9d,0x94,0x9b,0x9d,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,\r
+ 0x03,0x9f,0x9f,0x9f,0x9e,0x9e,0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,\r
+ 0x9a,0x9a,0x9c,0x97,0x9c,0x9c,0x9b,0x98,0x9f,0x97,0x9d,0x01,0xf7,\r
+ 0xf7,0x9d,0x94,0x9f,0x03,0x9e,0x9a,0x9a,0x9a,0x9b,0x9c,0x9b,0x97,\r
+ 0x9f,0x9e,0x9b,0x99,0x98,0x94,0x94,0x94,0x94,0x94,0x97,0x97,0x99,\r
+ 0x99,0x9a,0x01,0x9d,0x94,0x94,0x97,0x97,0x94,0x99,0x9c,0x9a,0x99,\r
+ 0x99,0x9a,0x9a,0x9b,0x98,0x02,0x9c,0x99,0x97,0x9a,0x9f,0x9a,0x9a,\r
+ 0x9a,0x9c,0x9d,0x9e,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,\r
+ 0x9f,0x9f,0x9e,0x9e,0x9d,0x9c,0x9c,0x9b,0x9a,0x9b,0x9c,0x9d,0x9d,\r
+ 0x9e,0x9d,0x9c,0x9c,0x9c,0x9d,0x9d,0x9a,0x94,0x94,0x97,0x9a,0x9a,\r
+ 0x9c,0x9c,0x9c,0x9d,0x9d,0x9a,0x97,0x94,0x94,0x94,0x94,0x94,0x94,\r
+ 0x94,0x97,0x9d,0x02,0xf7,0x01,0x02,0x9e,0x9c,0x99,0x97,0x97,0x94,\r
+ 0x87,0x87,0x87,0x87,0x97,0x99,0x87,0x87,0x97,0x9c,0x9a,0x99,0x9f,\r
+ 0x03,0x03,0x03,0x03,0x9f,0x9b,0x99,0x9a,0x99,0x9a,0x9f,0x9e,0x9d,\r
+ 0x9d,0x9d,0x97,0x9c,0x9b,0x9d,0x99,0x97,0x97,0x87,0x97,0x9c,0x9a,\r
+ 0x99,0x97,0x99,0x9a,0x9c,0x9d,0x9d,0x9f,0x9f,0x98,0x9a,0x9a,0x99,\r
+ 0x97,0x9c,0x9f,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,\r
+ 0x02,0x02,0x02,0x03,0x03,0x03,0x9e,0x98,0x98,0x9a,0x9c,0x9e,0x9b,\r
+ 0x94,0x02,0xf7,0xf7,0xf7,0xf7,0x01,0xf7,0xf7,0xf7,0xf7,0xf7,0x02,\r
+ 0x9a,0x97,0x97,0x94,0x9e,0x9d,0x9b,0x94,0x98,0xf7,0x97,0x9a,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x97,0x99,0x9c,0x9e,0x9e,0x9f,0x9c,0x9a,0x9a,\r
+ 0x97,0x94,0x94,0x94,0x94,0x99,0x9c,0x9c,0x9a,0x99,0x99,0x99,0x9a,\r
+ 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9c,0x9c,\r
+ 0x9d,0x9e,0x9f,0x9f,0x03,0x03,0x03,0x03,0x9f,0x9f,0x9a,0x98,0x9a,\r
+ 0x9a,0x9b,0x94,0x03,0x9a,0x99,0x9a,0x9f,0x9a,0x9a,0x9a,0x9b,0x97,\r
+ 0x9b,0x9e,0x9f,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x9f,0x9f,\r
+ 0x9f,0x9f\r
+ };\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#define SPRITES_LEN 3200\r
+\r
+ static unsigned char sprites_[]=\r
+ {\r
+ 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x73,0x70,0x73,0x78,0x00,\r
+ 0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,\r
+ 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x78,0x73,0x70,0x73,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,\r
+ 0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x1f,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,\r
+ 0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,\r
+ 0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x73,0x70,0x73,\r
+ 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,\r
+ 0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x73,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x70,0x00,\r
+ 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x23,\r
+ 0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,\r
+ 0x25,0x26,0x26,0x25,0x23,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x24,0x28,0x27,0x27,0x25,0x23,0x23,0x23,0x23,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x24,0x28,0x28,0x26,0x25,0x23,0x23,0x22,0x23,0x23,\r
+ 0x23,0x00,0x00,0x00,0x00,0x00,0x24,0x28,0x27,0x27,0x25,0x23,0x22,\r
+ 0xe0,0x21,0x23,0x22,0x00,0x00,0x00,0x00,0x26,0x28,0x28,0x28,0x26,\r
+ 0x27,0x25,0x23,0x21,0x23,0x24,0x25,0x23,0x00,0x00,0x00,0x26,0x2a,\r
+ 0x28,0x28,0x27,0x27,0x26,0x25,0x23,0x24,0x25,0x26,0x22,0x00,0x00,\r
+ 0x00,0x26,0x2a,0x2a,0x28,0x27,0x27,0x26,0x26,0x25,0x25,0x27,0x27,\r
+ 0x23,0x00,0x00,0x00,0x00,0xeb,0x2a,0x2a,0x28,0x27,0x26,0x27,0x26,\r
+ 0x27,0x27,0xeb,0x00,0x00,0x00,0x00,0xeb,0xf2,0x2a,0x2a,0x28,0x28,\r
+ 0xf2,0x27,0x27,0x27,0x28,0xf2,0xeb,0x00,0x00,0x00,0xeb,0xf1,0xf2,\r
+ 0x2a,0x2a,0xf2,0xeb,0xf1,0x28,0x28,0xf2,0xf1,0xeb,0x00,0x00,0xeb,\r
+ 0xf2,0xf4,0xeb,0x27,0x26,0xf2,0xf1,0xee,0xeb,0x25,0xeb,0xf4,0xf2,\r
+ 0xeb,0x00,0xeb,0xf1,0xf2,0xa1,0xeb,0xf2,0xeb,0xee,0xeb,0xf2,0xeb,\r
+ 0xa1,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf2,0xeb,0xf2,0xf1,0xf2,\r
+ 0xf1,0xf3,0xf0,0xf2,0xf2,0xeb,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,\r
+ 0x00,0xeb,0x4e,0xeb,0x00,0x00,0xeb,0xeb,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x93,0x96,0x96,0x94,\r
+ 0x90,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x98,0x97,\r
+ 0x96,0x94,0x91,0x91,0x91,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x92,\r
+ 0x98,0x98,0x96,0x94,0x91,0x91,0x8c,0x92,0x91,0x90,0x00,0x00,0x00,\r
+ 0x00,0x00,0x92,0x98,0x97,0x96,0x94,0x91,0x8d,0x8b,0x8c,0x91,0x90,\r
+ 0x00,0x00,0x00,0x00,0x94,0x98,0x98,0x98,0x96,0x96,0x94,0x91,0x8d,\r
+ 0x92,0x91,0x94,0x90,0x00,0x00,0x00,0x94,0x9a,0x98,0x98,0x97,0x96,\r
+ 0x96,0x94,0x91,0x91,0x94,0x96,0x90,0x00,0x00,0x00,0x94,0x9a,0x9a,\r
+ 0x98,0x98,0x96,0x96,0x96,0x94,0x94,0x96,0x97,0x90,0x00,0x00,0x00,\r
+ 0x00,0xeb,0x9a,0x99,0x98,0x98,0x96,0x96,0x96,0x96,0x97,0xeb,0x00,\r
+ 0x00,0x00,0x00,0xeb,0xf2,0x9a,0x9a,0x98,0x98,0xf2,0x97,0x98,0x97,\r
+ 0x98,0xf2,0xeb,0x00,0x00,0x00,0xeb,0xf1,0xf2,0x9a,0x99,0xf2,0xeb,\r
+ 0xf1,0x98,0x98,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf4,0xeb,0x94,\r
+ 0x95,0xf2,0xf1,0xee,0xeb,0x92,0xeb,0xf4,0xf2,0xeb,0x00,0xeb,0xf1,\r
+ 0xf2,0xa1,0xeb,0xf2,0xeb,0xee,0xeb,0xf2,0xeb,0xa1,0xf2,0xf1,0xeb,\r
+ 0x00,0x00,0xeb,0xf2,0xf2,0xeb,0xf2,0xf1,0xf2,0xf1,0xf2,0xeb,0xf2,\r
+ 0xf2,0xeb,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x00,0xeb,0x4e,0xeb,\r
+ 0x00,0x00,0xeb,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x5a,0x5a,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x5c,0x5c,0x61,0x61,0x5d,0x5a,0x5a,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x63,0x61,0x61,0x5d,0x5b,0x5b,\r
+ 0x5b,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x63,0x61,0x61,0x5d,\r
+ 0x5b,0x5b,0x5a,0x5b,0x5b,0x5a,0x00,0x00,0x00,0x00,0x00,0x5c,0x63,\r
+ 0x61,0x61,0x5d,0x5b,0x59,0x58,0x59,0x5b,0x5a,0x00,0x00,0x00,0x00,\r
+ 0x5e,0x63,0x62,0x61,0x61,0x5f,0x5d,0x5b,0x59,0x5b,0x5b,0x5e,0x5a,\r
+ 0x00,0x00,0x00,0x5e,0x63,0x63,0x62,0x61,0x61,0x5f,0x5d,0x5b,0x5c,\r
+ 0x5d,0x61,0x5a,0x00,0x00,0x00,0x5e,0x65,0x63,0x63,0x61,0x61,0x61,\r
+ 0x5f,0x5d,0x5d,0x62,0x61,0x5a,0x00,0x00,0x00,0x00,0xeb,0x65,0x63,\r
+ 0x62,0x61,0x61,0x61,0x61,0x61,0x61,0xeb,0x00,0x00,0x00,0x00,0xeb,\r
+ 0xf2,0x65,0x63,0x62,0x63,0xf2,0x61,0x61,0x61,0x63,0xf2,0xeb,0x00,\r
+ 0x00,0x00,0xeb,0xf1,0xf2,0x65,0x63,0xf2,0xeb,0xf1,0x63,0x62,0xf2,\r
+ 0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf4,0xeb,0x5e,0x5e,0xf2,0xf1,0xed,\r
+ 0xf0,0x5c,0xeb,0xf4,0xf2,0xeb,0x00,0xeb,0xf1,0xf2,0xa1,0xeb,0xf2,\r
+ 0xeb,0xed,0xf0,0xf2,0xeb,0xa1,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,\r
+ 0xf2,0xeb,0xf2,0xf1,0xf2,0xf1,0xf2,0xeb,0xf2,0xf2,0xeb,0x00,0x00,\r
+ 0x00,0x00,0xeb,0xeb,0x00,0x00,0xeb,0x4e,0xeb,0x00,0x00,0xeb,0xeb,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,\r
+ 0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x44,0x44,0x48,0x48,0x45,0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x44,0x4a,0x49,0x48,0x45,0x43,0x43,0x43,0x42,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x44,0x4a,0x49,0x48,0x45,0x43,0x43,0xb6,0x43,\r
+ 0x43,0x42,0x00,0x00,0x00,0x00,0x00,0x44,0x4a,0x49,0x48,0x45,0x43,\r
+ 0xb6,0x40,0x42,0x43,0x42,0x00,0x00,0x00,0x00,0x46,0x4a,0x4a,0x49,\r
+ 0x48,0xee,0x45,0x43,0x41,0x43,0x43,0x45,0x42,0x00,0x00,0x00,0x46,\r
+ 0x4b,0x4a,0x4b,0x49,0x48,0xee,0x45,0x43,0x43,0x45,0x49,0x42,0x00,\r
+ 0x00,0x00,0x46,0x4c,0x4b,0x4a,0x49,0x48,0x48,0x47,0x45,0x45,0x49,\r
+ 0x49,0x42,0x00,0x00,0x00,0x00,0xeb,0x4c,0x4b,0x4a,0x49,0x48,0x48,\r
+ 0x48,0x48,0x49,0xeb,0x00,0x00,0x00,0x00,0xeb,0xf2,0x4c,0x4c,0x4a,\r
+ 0x4a,0xf2,0x49,0x49,0x49,0x4b,0xf2,0xeb,0x00,0x00,0x00,0xeb,0xf1,\r
+ 0xf2,0x4c,0x4b,0xf2,0xea,0xf1,0x4b,0x4a,0xf2,0xf1,0xeb,0x00,0x00,\r
+ 0xeb,0xf2,0x4e,0xeb,0x46,0x46,0xf2,0xf2,0xee,0xeb,0x44,0xeb,0xf4,\r
+ 0xf2,0xeb,0x00,0xeb,0xf1,0xf2,0xa1,0xeb,0xf2,0xeb,0xee,0xeb,0xf2,\r
+ 0xeb,0xf5,0xf2,0xf1,0xeb,0x00,0x00,0xeb,0xf2,0xf2,0xeb,0xf2,0xf1,\r
+ 0xf2,0xf1,0xf2,0xeb,0xf2,0xf2,0xea,0x00,0x00,0x00,0x00,0xeb,0xeb,\r
+ 0x00,0x00,0xeb,0x4e,0xeb,0x00,0x00,0xeb,0xeb,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x72,0x72,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x74,0x78,0x78,\r
+ 0x75,0x72,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x7a,\r
+ 0x79,0x78,0x75,0x73,0x73,0x73,0x72,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x74,0x7a,0x79,0x78,0x75,0x73,0x73,0x71,0x73,0x73,0x72,0x00,0x00,\r
+ 0x00,0x00,0x00,0x74,0x7a,0x79,0x78,0x75,0x73,0x71,0x70,0x71,0x73,\r
+ 0x72,0x00,0x00,0x00,0x00,0x76,0x7a,0x7a,0x79,0x78,0x78,0x75,0x73,\r
+ 0x71,0x73,0x73,0x75,0x72,0x00,0x00,0x00,0x76,0x7b,0x7a,0x7a,0x79,\r
+ 0x78,0x78,0x75,0x73,0x73,0x75,0x78,0x72,0x00,0x00,0x00,0x76,0x7c,\r
+ 0x7b,0x7a,0x79,0x78,0x78,0x78,0x75,0x75,0x78,0x79,0x72,0x00,0x00,\r
+ 0x00,0x00,0xf0,0x7c,0x7b,0x7a,0x79,0x78,0x78,0x78,0x78,0x79,0xf0,\r
+ 0x00,0x00,0x00,0x00,0xf0,0xf2,0x7c,0x7b,0x7a,0x7a,0xf2,0x79,0x79,\r
+ 0x79,0x7a,0xf2,0xf0,0x00,0x00,0x00,0xf0,0xf1,0xf2,0x7c,0x7b,0xf2,\r
+ 0xf0,0xf1,0x7a,0x7a,0xf2,0xf1,0xf0,0x00,0x00,0xf0,0xf2,0xf4,0xf0,\r
+ 0x76,0x76,0xf2,0xf1,0xee,0xf0,0x74,0xf0,0xf4,0xf2,0xf0,0x00,0xf0,\r
+ 0xf1,0xf2,0xf5,0xf0,0xf2,0xf0,0xee,0xf0,0xf2,0xf0,0xf5,0xf2,0xf1,\r
+ 0xf0,0x00,0x00,0xf0,0xf2,0xf2,0xf0,0xf2,0xf1,0xf2,0xf1,0xf2,0xf0,\r
+ 0xf2,0xf2,0xf0,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x00,0xf0,0xf4,\r
+ 0xf0,0x00,0x00,0xf0,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x09,0x09,0x06,0x03,0x03,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b,0x0a,0x09,0x06,0x04,\r
+ 0x04,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0b,0x0a,0x09,\r
+ 0x06,0x04,0x04,0x02,0x04,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x05,\r
+ 0x0b,0x0a,0x09,0x06,0x04,0x02,0x02,0x02,0x04,0x03,0x00,0x00,0x00,\r
+ 0x00,0x07,0x0b,0x0b,0x0a,0x09,0x07,0x06,0x04,0x02,0x04,0x04,0x05,\r
+ 0x03,0x00,0x00,0x00,0x07,0x0c,0x0b,0x0a,0x09,0x09,0x06,0x06,0x04,\r
+ 0x04,0x06,0x09,0x03,0x00,0x00,0x00,0x07,0x0d,0x0c,0x0b,0x0a,0x09,\r
+ 0x09,0x06,0x06,0x06,0x09,0x0a,0x03,0x00,0x00,0x00,0x00,0xf0,0x0d,\r
+ 0x0c,0x0b,0x0a,0x09,0x0a,0x09,0x09,0x0a,0xf0,0x00,0x00,0x00,0x00,\r
+ 0xf0,0xf2,0x0d,0x0c,0x0b,0x0b,0xf2,0x0a,0x0a,0x0a,0x0b,0xf2,0xf0,\r
+ 0x00,0x00,0x00,0xf0,0xf1,0xf2,0x0d,0x0c,0xf2,0xf0,0xf1,0x0b,0x0b,\r
+ 0xf2,0xf1,0xf0,0x00,0x00,0xf0,0xf2,0xf4,0xf0,0x07,0x07,0xf2,0xf1,\r
+ 0xee,0xf0,0x05,0xf0,0xf4,0xf2,0xf0,0x00,0xf0,0xf1,0xf2,0xf5,0xf0,\r
+ 0xf2,0xf0,0xee,0xf0,0xf2,0xf0,0xf5,0xf2,0xf1,0xf0,0x00,0x00,0xf0,\r
+ 0xf2,0xf2,0xf0,0xf2,0xf1,0xf2,0xf1,0xf2,0xf0,0xf2,0xf2,0xf0,0x00,\r
+ 0x00,0x00,0x00,0xf0,0xf0,0x00,0x00,0xf0,0xf4,0xf0,0x00,0x00,0xf0,\r
+ 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\r
+ 0xff,0xff,0xff\r
+ };\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "maped.h"\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+#include <time.h>\r
+\r
+#include "config.h"\r
+#include "keyboard.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "colbak.h"\r
+#include "colstuff.h"\r
+\r
+#include "smalfont.h"\r
+#include "gui.h"\r
+\r
+#include "tilesel.h"\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+// ================================= Data ====================================\r
+\r
+char *field, *destruct;\r
+char *background, *sprites;\r
+int startofs=16;\r
+int turnlength, turnctr;\r
+int destructed, difficulty=4;\r
+int blocks, score, scoremultiplier;\r
+int level;\r
+\r
+// Current piece falling\r
+\r
+char piece[3], tempspot;\r
+int xpos, ypos, ypofs;\r
+char newpiece;\r
+char nextpiece[3];\r
+\r
+// ================================= Code ====================================\r
+\r
+void BlitPlayField()\r
+{\r
+ int i, j;\r
+ char c;\r
+\r
+ for (i=0; i<12; i++)\r
+ for (j=0; j<6; j++)\r
+ {\r
+ c=field[(i*6)+j];\r
+ if (c) TCopySprite(128+(j*16), startofs+4+(i*16), 16, 16, sprites+((c+1)*256));\r
+ }\r
+}\r
+\r
+void BlitPlayFieldwDestruct(char flash)\r
+{\r
+ int i, j;\r
+ char c;\r
+\r
+ for (i=0; i<12; i++)\r
+ for (j=0; j<6; j++)\r
+ {\r
+ c=field[(i*6)+j];\r
+ if (c && !destruct[(i*6)+j])\r
+ TCopySprite(128+(j*16), startofs+4+(i*16), 16, 16, sprites+((c+1)*256));\r
+ if (destruct[(i*6)+j])\r
+ TCopySprite(128+(j*16), startofs+4+(i*16), 16, 16, sprites+(flash*256));\r
+ }\r
+}\r
+\r
+void BlitPiece()\r
+{\r
+ ypofs=((100 * turnctr) / turnlength) * 16 / 100;\r
+\r
+ TCopySprite(128+(xpos*16), startofs+4+(ypos*16)+ypofs, 16, 16, sprites+((piece[0]+1)*256));\r
+ TCopySprite(128+(xpos*16), startofs+20+(ypos*16)+ypofs, 16, 16, sprites+((piece[1]+1)*256));\r
+ TCopySprite(128+(xpos*16), startofs+36+(ypos*16)+ypofs, 16, 16, sprites+((piece[2]+1)*256));\r
+\r
+ TCopySprite(276, startofs+70, 16, 16, sprites+((nextpiece[0]+1)*256));\r
+ TCopySprite(276, startofs+90, 16, 16, sprites+((nextpiece[1]+1)*256));\r
+ TCopySprite(276, startofs+110, 16, 16, sprites+((nextpiece[2]+1)*256));\r
+}\r
+\r
+void GenerateNewPiece()\r
+{\r
+ newpiece=0;\r
+ xpos=2;\r
+ ypos=0;\r
+ if (field[2]) key[SCAN_ESC]=1;\r
+ if (field[8]) key[SCAN_ESC]=1;\r
+ if (field[14]) key[SCAN_ESC]=1;\r
+ if (field[20]) key[SCAN_ESC]=1;\r
+\r
+ if (key[SCAN_ESC])\r
+ {\r
+ if (difficulty==4 && blocks<240) Message("You really suck at columns, man.",300);\r
+ if (difficulty==5 && blocks<80) Message("You really suck at columns, man.",300);\r
+ if (score>3200 && score<=6400) Message("Not bad.",300);\r
+ if (score>6400) Message("Behold, the Columns God walks among us.",500);\r
+ }\r
+\r
+ memcpy(&piece, &nextpiece, 3);\r
+ nextpiece[0]=random(1,difficulty);\r
+ nextpiece[1]=random(1,difficulty);\r
+ nextpiece[2]=random(1,difficulty);\r
+}\r
+\r
+void DestroyBlock(int x, int y)\r
+{\r
+ int i;\r
+\r
+ for (i=y; i>0; i--)\r
+ {\r
+ field[(i*6)+x]=field[((i-1)*6)+x];\r
+ }\r
+ blocks++;\r
+ score+=scoremultiplier;\r
+}\r
+\r
+void ClearConsecutiveColumns()\r
+{\r
+ int x, y;\r
+ char c;\r
+\r
+ // Scan for things to destroy, but don't destroy them, just mark\r
+ // them in the Destroy field.\r
+\r
+ destructed=0;\r
+ memset(destruct, 0, (6*13));\r
+\r
+ for (y=0; y<12; y++)\r
+ for (x=0; x<6; x++)\r
+ {\r
+ c=field[(y*6)+x];\r
+\r
+ // Test vertical match\r
+ if (y<10)\r
+ {\r
+ if ((field[((y+1)*6)+x]==c) && (field[((y+2)*6)+x]==c) && c)\r
+ {\r
+ // vertical match. Set destruct field.\r
+ destruct[((y+0)*6)+x]=1;\r
+ destruct[((y+1)*6)+x]=1;\r
+ destruct[((y+2)*6)+x]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ // Test horizontal match\r
+ if (x<4)\r
+ {\r
+ if ((field[(y*6)+x+1]==c) && (field[(y*6)+x+2]==c) && c)\r
+ {\r
+ // horizontal match. Set destruct field.\r
+ destruct[(y*6)+x+0]=1;\r
+ destruct[(y*6)+x+1]=1;\r
+ destruct[(y*6)+x+2]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ // Test negative diagonal match\r
+ if (x<4 && y<10)\r
+ {\r
+ if ((field[((y+1)*6)+x+1]==c) && (field[((y+2)*6)+x+2]==c) && c)\r
+ {\r
+ // negative diagonal match. set destruct field.\r
+ destruct[((y+0)*6)+x+0]=1;\r
+ destruct[((y+1)*6)+x+1]=1;\r
+ destruct[((y+2)*6)+x+2]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ // Test positive diagonal match\r
+ if (x>=2 && y<10)\r
+ {\r
+ if ((field[((y+1)*6)+x-1]==c) && (field[((y+2)*6)+x-2]==c) && c)\r
+ {\r
+ // positive diagonal match. set destruct field.\r
+ destruct[((y+0)*6)+x-0]=1;\r
+ destruct[((y+1)*6)+x-1]=1;\r
+ destruct[((y+2)*6)+x-2]=1;\r
+ destructed=1;\r
+ }\r
+ }\r
+ }\r
+\r
+ // Show which tiles are being destroyed before clearing out for increase\r
+ // visual coolishness.\r
+\r
+ if (destructed)\r
+ {\r
+ timer_count=0;\r
+ while (timer_count<50)\r
+ {\r
+ if (timer_count<10 || (timer_count>20 && timer_count<30) ||\r
+ (timer_count>40 && timer_count<50)) c=1;\r
+ else c=0;\r
+\r
+ CopySprite(16,16,320,200,background);\r
+ BlitPlayFieldwDestruct(c);\r
+ TCopySprite(276, startofs+70, 16, 16, sprites+((nextpiece[0]+1)*256));\r
+ TCopySprite(276, startofs+90, 16, 16, sprites+((nextpiece[1]+1)*256));\r
+ TCopySprite(276, startofs+110, 16, 16, sprites+((nextpiece[2]+1)*256));\r
+\r
+GotoXY(55,130);\r
+sprintf(strbuf,"Blocks: %d", blocks);\r
+printstring(strbuf);\r
+GotoXY(55,140);\r
+sprintf(strbuf,"Score: %d", score);\r
+printstring(strbuf);\r
+GotoXY(55,150);\r
+sprintf(strbuf,"Level: %d", level);\r
+printstring(strbuf);\r
+\r
+ ShowPage();\r
+ }\r
+ }\r
+\r
+ // Apply destruct-o patch to the field.\r
+\r
+ for (y=0; y<12; y++)\r
+ for (x=0; x<6; x++)\r
+ if (destruct[(y*6)+x]) DestroyBlock(x,y);\r
+}\r
+\r
+void NextTurn()\r
+{\r
+ ypos++;\r
+ if (field[((ypos+3)*6)+xpos])\r
+ {\r
+ if (ypos<3) key[SCAN_ESC]=1;\r
+ // Hit something; set piece here.\r
+ field[(ypos*6)+xpos]=piece[0];\r
+ field[((ypos+1)*6)+xpos]=piece[1];\r
+ field[((ypos+2)*6)+xpos]=piece[2];\r
+ newpiece=1;\r
+\r
+ // Scan for consecutive things to delete.\r
+ do\r
+ {\r
+ ClearConsecutiveColumns();\r
+ scoremultiplier*=2;\r
+ } while (destructed);\r
+ }\r
+}\r
+\r
+int CanGoLeft()\r
+{\r
+ if (!xpos) return 0;\r
+ if (field[((ypos+1)*6)+xpos-1]) return 0;\r
+ if (field[((ypos+2)*6)+xpos-1]) return 0;\r
+ if (field[((ypos+3)*6)+xpos-1]) return 0;\r
+ return 1;\r
+}\r
+\r
+int CanGoRight()\r
+{\r
+ if (xpos==5) return 0;\r
+ if (field[((ypos+1)*6)+xpos+1]) return 0;\r
+ if (field[((ypos+2)*6)+xpos+1]) return 0;\r
+ if (field[((ypos+3)*6)+xpos+1]) return 0;\r
+ return 1;\r
+}\r
+\r
+void RotatePiece()\r
+{\r
+ tempspot=piece[0];\r
+ piece[0]=piece[1];\r
+ piece[1]=piece[2];\r
+ piece[2]=tempspot;\r
+}\r
+\r
+void ProcessLevels()\r
+{\r
+ if (blocks>80) { level=2; turnlength=90; }\r
+ if (blocks>160) { level=3; turnlength=80; }\r
+ if (blocks>240) { level=4; turnlength=70; }\r
+ if (blocks>320) { level=5; turnlength=60; }\r
+ if (blocks>400) { level=6; turnlength=50; }\r
+ if (blocks>480) { level=7; turnlength=40; }\r
+ if (blocks>560) { level=8; turnlength=30; }\r
+ if (blocks>640) { level=9; turnlength=20; }\r
+}\r
+\r
+extern FILE *pcxf;\r
+extern int width, depth;\r
+extern int bytes;\r
+extern int vidoffset;\r
+\r
+void LoadBackground()\r
+{\r
+ int i;\r
+\r
+ if (!(pcxf=fopen("colback.pcx","rb")))\r
+ {\r
+ background=background_;\r
+ }\r
+ else\r
+ {\r
+ fclose(pcxf);\r
+ background=(char *) valloc(64000,"col bakg",0);\r
+ LoadPCXHeaderNP("colback.pcx");\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=width*i;\r
+ ReadPCXLine(background);\r
+ }\r
+ fclose(pcxf);\r
+ }\r
+\r
+ if (!(pcxf=fopen("colspr.pcx","rb")))\r
+ {\r
+ sprites=sprites_;\r
+ }\r
+ else\r
+ {\r
+ fclose(pcxf);\r
+ LoadPCXHeaderNP("colspr.pcx");\r
+ sprites=(char *) valloc(width*depth,"col spr",0);\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=width*i;\r
+ ReadPCXLine(sprites);\r
+ }\r
+ fclose(pcxf);\r
+ }\r
+}\r
+\r
+void Columns()\r
+{\r
+ ClearScreen();\r
+ srand(time(NULL));\r
+ LoadBackground();\r
+ field=(char *) valloc(6*13,"col field",0);\r
+ destruct=(char *) valloc(6*13,"col dest",0);\r
+ memset(field, 0, 6*12);\r
+ memset(field+(6*12), 255, 6);\r
+ newpiece=1;\r
+ turnlength=100;\r
+ turnctr=0;\r
+ timer_count=0;\r
+ blocks=0;\r
+ score=0;\r
+ level=1;\r
+ GenerateNewPiece();\r
+ GenerateNewPiece();\r
+ while (!key[SCAN_ESC])\r
+ {\r
+ CopySprite(16,16,320,200,background);\r
+ if (key[SCAN_LEFT])\r
+ {\r
+ if (xpos && CanGoLeft()) xpos--;\r
+ key[SCAN_LEFT]=0;\r
+ }\r
+ if (key[SCAN_RIGHT])\r
+ {\r
+ if (xpos<5 && CanGoRight()) xpos++;\r
+ key[SCAN_RIGHT]=0;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ timer_count*=5;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ RotatePiece();\r
+ key[SCAN_UP]=0;\r
+ }\r
+ ProcessLevels();\r
+ turnctr+=timer_count;\r
+ timer_count=0;\r
+ switch (difficulty)\r
+ {\r
+ case 4: scoremultiplier=5;\r
+ case 5: scoremultiplier=10;\r
+ case 6: scoremultiplier=15;\r
+ }\r
+ if (turnctr>=turnlength)\r
+ {\r
+ NextTurn();\r
+ turnctr-=turnlength;\r
+ }\r
+ if (newpiece) GenerateNewPiece();\r
+ BlitPlayField();\r
+ BlitPiece();\r
+\r
+GotoXY(55,130);\r
+sprintf(strbuf,"Blocks: %d", blocks);\r
+printstring(strbuf);\r
+GotoXY(55,140);\r
+sprintf(strbuf,"Score: %d", score);\r
+printstring(strbuf);\r
+GotoXY(55,150);\r
+sprintf(strbuf,"Level: %d", level);\r
+printstring(strbuf);\r
+\r
+ ShowPage();\r
+ }\r
+ vfree(sprites);\r
+ vfree(background);\r
+ vfree(field);\r
+ vfree(destruct);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef COLUMNS_INC\r
+#define COLUMNS_INC\r
+\r
+extern void BlitPlayField();\r
+extern void BlitPlayFieldwDestruct(char flash);\r
+extern void BlitPiece();\r
+extern void GenerateNewPiece();\r
+extern void DestroyBlock(int x, int y);\r
+extern void ClearConsecutiveColumns();\r
+extern void NextTurn();\r
+extern int CanGoLeft();\r
+extern int CanGoRight();\r
+extern void RotatePiece();\r
+extern void ProcessLevels();\r
+extern void LoadBackground();\r
+extern void Columns();\r
+\r
+#endif // COLUMNS_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#include "gui.h"\r
+#include "mikmod.h"\r
+#include "maped.h"\r
+\r
+#include "smalfont.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+FILE *cfg;\r
+char *strbuf;\r
+\r
+char vm=0; // Video mode\r
+char white=0, black=0; // Color definitions\r
+char pad=0; // Padding mode in tile selector.\r
+char th=0, mh=0; // tile-highlight, map highlight\r
+\r
+// GUI default colors\r
+\r
+char winbg=23;\r
+char titlebg=125;\r
+char brightw=31;\r
+char darkw=13;\r
+char darkred=44;\r
+\r
+// ------------------\r
+\r
+extern char scrollmode, vcedprog[80];\r
+extern int difficulty;\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitializeDefaults()\r
+{\r
+ vm=0;\r
+ white=31;\r
+ black=1;\r
+ pad=1;\r
+ th=1;\r
+ mh=1;\r
+ mouse_scroll=1;\r
+ scrollmode=1;\r
+ memcpy(vcedprog,"edit",5);\r
+}\r
+\r
+void GetConfig(char *fname)\r
+{\r
+ strbuf=(char *) valloc(2000,"strbuf!",0);\r
+ InitializeDefaults();\r
+ if (!(cfg=fopen(fname,"r")))\r
+ {\r
+ printf("Unable to open config file. Using defaults... \n");\r
+ return;\r
+ }\r
+\r
+ while (1)\r
+ {\r
+ fscanf(cfg,"%s",strbuf);\r
+\r
+ if (!strcmp(strbuf,"difficulty"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ difficulty=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"nocdaudio"))\r
+ {\r
+ //nocdaudio=1;\r
+ continue;\r
+ }\r
+ if (!strcmp(strbuf,"vidmode"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ vm=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"white"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ white=atoi(strbuf); brightw=atoi(strbuf);\r
+ TextColor(atoi(strbuf)); continue; }\r
+ if (!strcmp(strbuf,"black"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ black=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"winbg"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ winbg=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"shadow"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ darkw=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"darkred"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ darkred=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"titlebg"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ titlebg=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"pad"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ pad=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "scrollmode"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ scrollmode=atoi(strbuf); continue; }\r
+ // aen\r
+ if (!strcmp(strbuf, "mouse_scroll"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mouse_scroll=atoi(strbuf)&1; continue; }\r
+ if (!strcmp(strbuf, "md_device"))\r
+ { fscanf(cfg, "%s", strbuf);\r
+ md_device=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "th"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ th=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mh"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mh=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "amxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ amxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "amyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ amyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mmxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mmxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mmyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mmyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "cnxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ cnxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "cnyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ cnyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lmxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lmyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lmyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lmyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lvxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lvxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "lvyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ lvyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mpxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mpxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "mpyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ mpyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "vaxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ vaxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "vayofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ vayofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "zexofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ zexofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "zeyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ zeyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "exofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ exofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "eyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ eyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "prxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ prxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "pryofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ pryofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "rsxofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ rsxofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf, "rsyofs"))\r
+ { fscanf(cfg,"%s",strbuf);\r
+ rsyofs=atoi(strbuf); continue; }\r
+ if (!strcmp(strbuf,"vcedprog"))\r
+ { fscanf(cfg,"%s",vcedprog);\r
+ continue; }\r
+ break;\r
+ }\r
+ fclose(cfg);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef CONFIG_INC\r
+#define CONFIG_INC\r
+\r
+extern char vm;\r
+extern char *strbuf;\r
+extern char white,black,darkred,pad,th,mh;\r
+extern char winbg,titlebg,brightw,darkw;\r
+\r
+extern void InitializeDefaults();\r
+extern void GetConfig(char *fname);\r
+\r
+#endif // CONFIG_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <zero 5.7.99>\r
+// + fixed ScreenShot() to properly save screenshots with\r
+// the sequential filenames.\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+// ================================= Data ====================================\r
+\r
+// ================================= Code ====================================\r
+\r
+int CheckMouseTabs()\r
+{ int i;\r
+\r
+ for (i=0; i<10; i++)\r
+ {\r
+ if (i<6 && i>=numlayers) continue;\r
+ if (mb==1 && mx>17+(i*10) && mx<26+(i*10) && my>(tsy-7) && my<tsy)\r
+ { layertoggle[i]=layertoggle[i] ^ 1; WaitRelease(); return 1; }\r
+ if (mb==2 && mx>17+(i*10) && mx<26+(i*10) && my>(tsy-7) && my<tsy)\r
+ { el=i; WaitRelease(); return 1; }\r
+ }\r
+ return 0;\r
+}\r
+\r
+HAL()\r
+{ int i;\r
+\r
+ Message("I'm sorry dave, I can't do that...",600);\r
+ i=systemtime+400;\r
+ while (systemtime<i)\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+ ShowPage();\r
+ }\r
+ Message("Just kidding! :)",200);\r
+}\r
+\r
+void WritePCXLine(unsigned char *p,int len,FILE *pcxf)\r
+{ int i;\r
+ unsigned char byt, samect, repcode;\r
+\r
+ i=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<(unsigned) 63 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1 || (byt & 0xC0) != 0)\r
+ {\r
+ repcode=0xC0 | samect;\r
+ fwrite(&repcode,1,1,pcxf);\r
+ }\r
+ fwrite(&byt,1,1,pcxf);\r
+ } while (i<len);\r
+}\r
+\r
+acopytile(int x, int y, char *src, char *pt)\r
+{\r
+ char *d;\r
+ int h;\r
+\r
+ h=16;\r
+\r
+ y<<=6;\r
+ d=pt+y+(y<<2)+x;\r
+\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d,src,16);\r
+ src+=16;\r
+ d+=320;\r
+ }\r
+}\r
+\r
+extern FILE *pcxf;\r
+\r
+void WritePalette(FILE *f)\r
+{ char b;\r
+ int i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] << 2;\r
+\r
+ b=12; fwrite(&b, 1, 1, f);\r
+ fwrite(pal, 1, 768, f);\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+}\r
+\r
+void OutputVSPpcx()\r
+{ int i,j,_x,_y;\r
+ unsigned char *ptr;\r
+ char b1;\r
+ short int w1,w2;\r
+\r
+ // First figure out the filename\r
+\r
+ i=0;\r
+ ptr=&vspname;\r
+ while (*ptr != '.')\r
+ {\r
+ strbuf[i]=*ptr;\r
+ ptr++;\r
+ i++;\r
+ }\r
+ strbuf[i++]='.';\r
+ strbuf[i++]='P';\r
+ strbuf[i++]='C';\r
+ strbuf[i++]='X';\r
+ strbuf[i++]=0;\r
+\r
+ pcxf=fopen(strbuf,"wb");\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=319; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+\r
+ // At this point we need to figure out how many vertical rows tall the\r
+ // PCX needs to be in order to accomidate the number of tiles in the VSP.\r
+\r
+ w2=numtiles/18; w2++;\r
+ w2=(w2*17); fwrite(&w2, 1, 2, pcxf); // ymax = ?;\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w2++; fwrite(&w2, 1, 2, pcxf); // vres = ?;\r
+\r
+ fwrite(screen, 1, 48, pcxf); // 16-color palette data. Who knows what's\r
+ // actually in here. It doesn't matter since\r
+ // the 256-color palette is stored elsewhere.\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(screen, 1, 59, pcxf); // filler\r
+\r
+ // The header is written. Now we need to generate a large buffer where we'll\r
+ // "draw" the PCX, and then encode the data and save the PCX.\r
+\r
+ ptr=(char *) malloc(320*w2);\r
+ memset(ptr,255,(320*w2)); // Give the PCX a white background\r
+\r
+ // Now we "draw" the tiles into the buffer.\r
+\r
+ for (i=0; i<numtiles; i++)\r
+ {\r
+ j=i/18;\r
+ _y=1+(j*17);\r
+ j=i-(j*18);\r
+ _x=1+(j*17);\r
+ acopytile(_x,_y,vsp+(i*256),ptr);\r
+ }\r
+\r
+ // And now we save the rest of the PCX.\r
+\r
+ for (w1=0; w1<w2; w1++)\r
+ WritePCXLine(ptr+(w1*320),320,pcxf);\r
+\r
+ WritePalette(pcxf);\r
+ fclose(pcxf);\r
+\r
+ vfree(ptr);\r
+}\r
+\r
+void ScreenShot()\r
+{\r
+ unsigned char b1;\r
+ unsigned short int w1;\r
+ int i,n; //zero 5.7.99\r
+ char fnamestr[13];\r
+ static int ss=0;\r
+ FILE *pcxf;\r
+\r
+//--- zero 5.7.99\r
+ n=0;\r
+ do\r
+ {\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+ pcxf=fopen(fnamestr,"r");\r
+ i=(int)pcxf;\r
+ if(pcxf) fclose(pcxf);\r
+ n++;\r
+ } while(i);\r
+ n--;\r
+\r
+ // Takes a snapshot of the current screen.\r
+\r
+ sprintf(fnamestr,"%d.pcx",n);\r
+//---\r
+\r
+ pcxf=fopen(&fnamestr,"wb");\r
+ ss++;\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=sx-1; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+ w1=sy-1; fwrite(&w1, 1, 2, pcxf); // ymax = 199;\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w1=sy; fwrite(&w1, 1, 2, pcxf); // vres = 200;\r
+\r
+ fwrite(screen,1,48,pcxf);\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=sx; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(screen, 1, 59, pcxf); // filler\r
+\r
+ for (w1=0; w1<sy; w1++)\r
+ WritePCXLine(screen+((w1+16)*tsx)+16, sx, pcxf);\r
+\r
+ WritePalette(pcxf);\r
+ fclose(pcxf);\r
+ timer_count=0;\r
+}\r
+\r
+// aen -- put this out here because the PollMovement() routine i added\r
+// needs access to them.\r
+\r
+int ms_right=0;\r
+int ms_down=0;\r
+int ms_left=0;\r
+int ms_up=0;\r
+\r
+void PollMovement() // aen\r
+{\r
+ int xmax, ymax;\r
+\r
+ // d'oh! :p\r
+ ms_right=0;\r
+ ms_down=0;\r
+ ms_left=0;\r
+ ms_up=0;\r
+\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+\r
+ // aen: made all scroll code apply movement first, correct afterwards. if\r
+ // not done this way, bugs crop up with the movement when holding page\r
+ // down, to scroll to the bottom of the map (in tile scroll), then holding\r
+ // the up arrow key to scroll back up to the top (will scroll into the\r
+ // negatives).\r
+\r
+ if (mouse_scroll)\r
+ {\r
+ if (my<18) ms_up=1;\r
+ if (my>(tsy-2)) ms_down=1;\r
+ if (mx>334) ms_right=1;\r
+ if (mx<18) ms_left=1;\r
+ }\r
+\r
+ if (key[SCAN_UP] || ms_up)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ ywin -= map_scroll_y;\r
+ if (ywin < 0) ywin = 0;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_UP] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_UP]=0;\r
+ ywin -= 16;\r
+ if (ywin < 0) ywin = 0;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_DOWN] || ms_down)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ ywin += map_scroll_y;\r
+ if (ywin > ymax)\r
+ ywin = ymax;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_DOWN] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_DOWN]=0;\r
+ ywin += 16;\r
+ if (ywin > ymax)\r
+ ywin = ymax;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_RIGHT] || ms_right)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ xwin += map_scroll_x;\r
+ if (xwin > xmax)\r
+ xwin = xmax;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_RIGHT] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_RIGHT]=0;\r
+ xwin += 16;\r
+ if (xwin > xmax)\r
+ xwin = xmax;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_LEFT] || ms_left)\r
+ {\r
+ if (scrollmode)\r
+ {\r
+ xwin -= map_scroll_x;\r
+ if (xwin < 0) xwin=0;\r
+ }\r
+ else\r
+ {\r
+ if (key[SCAN_LEFT] || (!(systemtime%10)))\r
+ {\r
+ key[SCAN_LEFT]=0;\r
+ xwin -= 16;\r
+ if (xwin < 0) xwin = 0;\r
+ systemtime++;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+ProcessControls()\r
+{\r
+ int xmax, ymax;\r
+\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+\r
+ if (key[SCAN_F5]) { key[SCAN_F5]=0; ShellMAP(); }\r
+ if (key[SCAN_F6]) { key[SCAN_F6]=0; CompileAll(); }\r
+ if (key[SCAN_F8]) { key[SCAN_F8]=0; ShellVERGE(); }\r
+ if (key[SCAN_ALT] && key[SCAN_D]) { key[SCAN_D]=0; ShellToDOS(); }\r
+ if (key[SCAN_ALT] && key[SCAN_L]) LoadMAPDialog();\r
+ if (key[SCAN_ALT] && key[SCAN_V]) ShellEditMAP();\r
+ if (key[SCAN_ALT] && key[SCAN_S]) ShellEditSystem();\r
+ if (key[SCAN_ALT] && key[SCAN_N]) NewMAP();\r
+ if (key[SCAN_ALT] && key[SCAN_P]) MPDialog();\r
+ if (!key[SCAN_ALT] && key[SCAN_P]) { pasting^=1; key[SCAN_P]=0; } // aen\r
+\r
+ if (key[SCAN_A] && el<6)\r
+ {\r
+ lt++;\r
+ if (lt==numtiles) lt=0;\r
+ key[SCAN_A]=0;\r
+ }\r
+ if (key[SCAN_Z] && el<6)\r
+ {\r
+ if (lt) lt--;\r
+ else lt=numtiles-1;\r
+ key[SCAN_Z]=0;\r
+ }\r
+ if (key[SCAN_A] && el==7)\r
+ {\r
+ curzone++;\r
+ key[SCAN_A]=0;\r
+ }\r
+ if (key[SCAN_Z] && el==7)\r
+ {\r
+ curzone--;\r
+ key[SCAN_Z]=0;\r
+ }\r
+ if (key[SCAN_S])\r
+ {\r
+ rt++;\r
+ if (rt==numtiles) rt=0;\r
+ key[SCAN_S]=0;\r
+ }\r
+ if (key[SCAN_X])\r
+ {\r
+ if (rt) rt--;\r
+ else rt=numtiles-1;\r
+ key[SCAN_X]=0;\r
+ }\r
+ if (key[SCAN_F10])\r
+ {\r
+ key[SCAN_F10]=0;\r
+ if (random(0,255)<15) HAL();\r
+ SaveMAP(mapname);\r
+ SaveVSP(vspname);\r
+ CompileMAP();\r
+ Message("MAP/VSP saved.",100);\r
+ modified=0;\r
+ }\r
+ if (key[SCAN_C])\r
+ {\r
+ key[SCAN_C]=0;\r
+ sprintf(strbuf,"Left: %d Right: %d", lt, rt);\r
+ Message(strbuf, 300);\r
+ }\r
+ if (key[SCAN_M])\r
+ {\r
+ key[SCAN_M]=0;\r
+ GenerateMiniVSP();\r
+ MiniMAP();\r
+ }\r
+ if (key[SCAN_H])\r
+ {\r
+ key[SCAN_H]=0;\r
+ mh=mh^1;\r
+ if (mh) Message("MAP Tile Highlight enabled.",100);\r
+ else Message("MAP Tile Highlight disabled.",100);\r
+ }\r
+\r
+ // ***\r
+ // movement code moved to PollMovement()\r
+ // ***\r
+\r
+ if (key[SCAN_PGUP])\r
+ {\r
+ key[SCAN_PGUP]=0;\r
+ ywin -= sy;\r
+ if (ywin < 0)\r
+ ywin = 0;\r
+ }\r
+ if (key[SCAN_HOME])\r
+ {\r
+ key[SCAN_HOME]=0;\r
+ xwin -= sx;\r
+ if (xwin < 0)\r
+ xwin = 0;\r
+ }\r
+ if (key[SCAN_END])\r
+ {\r
+ key[SCAN_END]=0;\r
+ xwin += sx;\r
+ if (xwin > xmax)\r
+ xwin = xmax;\r
+ }\r
+ if (key[SCAN_PGDN])\r
+ {\r
+ key[SCAN_PGDN]=0;\r
+ ywin += sy;\r
+ if (ywin > ymax)\r
+ ywin = ymax;\r
+ }\r
+\r
+ if (key[SCAN_CTRL] && el<6)\r
+ {\r
+ key[SCAN_CTRL]=0;\r
+ TileSelector();\r
+ }\r
+ if (key[SCAN_CTRL] && el==7)\r
+ {\r
+ key[SCAN_CTRL]=0;\r
+ ZoneEdDialog();\r
+ }\r
+\r
+ if (key[SCAN_TAB])\r
+ {\r
+ key[SCAN_TAB]=0;\r
+ if (scrollmode)\r
+ {\r
+ scrollmode=0;\r
+ xwin=xwin/16; xwin=xwin*16;\r
+ ywin=ywin/16; ywin=ywin*16;\r
+ Message("Tile scroll.",150);\r
+ }\r
+ else\r
+ {\r
+ scrollmode=1;\r
+ Message("Pixel scroll.",150);\r
+ }\r
+ }\r
+\r
+ if (key[SCAN_1])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[0]=0;\r
+ return;\r
+ }\r
+ layertoggle[0]=1;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ el=0;\r
+ key[SCAN_1]=0;\r
+ }\r
+ if (key[SCAN_2])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[1]=0;\r
+ return;\r
+ }\r
+ key[SCAN_2]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>1)\r
+ { layertoggle[1]=1;\r
+ el=1; }\r
+ }\r
+ if (key[SCAN_3])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[2]=0;\r
+ return;\r
+ }\r
+ key[SCAN_3]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>2)\r
+ { layertoggle[2]=1;\r
+ el=2; }\r
+ }\r
+ if (key[SCAN_4])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[3]=0;\r
+ return;\r
+ }\r
+ key[SCAN_4]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>3)\r
+ { layertoggle[3]=1;\r
+ el=3; }\r
+ }\r
+ if (key[SCAN_5])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[4]=0;\r
+ return;\r
+ }\r
+ key[SCAN_5]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>4)\r
+ { layertoggle[4]=1;\r
+ el=4; }\r
+ }\r
+ if (key[SCAN_6])\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
+ {\r
+ layertoggle[5]=0;\r
+ return;\r
+ }\r
+ key[SCAN_6]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ if (numlayers>5)\r
+ { layertoggle[5]=1;\r
+ el=5; }\r
+ }\r
+ if (key[SCAN_O])\r
+ {\r
+ key[SCAN_O]=0;\r
+ layertoggle[6]=1; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ el=6;\r
+ }\r
+ if (key[SCAN_N])\r
+ {\r
+ key[SCAN_N]=0;\r
+ layertoggle[6]=0; layertoggle[7]=1;\r
+ layertoggle[8]=0; layertoggle[9]=0;\r
+ el=7;\r
+ }\r
+ if (key[SCAN_E])\r
+ {\r
+ key[SCAN_E]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=1; layertoggle[9]=0;\r
+ el=8;\r
+ }\r
+ if (key[SCAN_T])\r
+ {\r
+ key[SCAN_T]=0;\r
+ layertoggle[6]=0; layertoggle[7]=0;\r
+ layertoggle[8]=0; layertoggle[9]=1;\r
+ el=9;\r
+ }\r
+ if (key[SCAN_F9])\r
+ { // aen\r
+ key[SCAN_F9]=0;\r
+ mouse_scroll^=1;\r
+ sprintf(strbuf,"Mouse scroll %sabled.", mouse_scroll ? "en" : "dis");\r
+ Message(strbuf, 100);\r
+ }\r
+ if (key[SCAN_F11])\r
+ {\r
+ key[SCAN_F11]=0;\r
+ ScreenShot();\r
+ Message("Screen capture saved.",300);\r
+ }\r
+ if (key[SCAN_F12])\r
+ {\r
+ key[SCAN_F12]=0;\r
+ OutputVSPpcx();\r
+ Message("PCX file exported.",300);\r
+ }\r
+ if (key[SCAN_LANGLE])\r
+ {\r
+ key[SCAN_LANGLE]=0;\r
+ ShutdownVideo();\r
+ vm=0;\r
+ InitVideo(0);\r
+ set_intensity(63);\r
+ InitMouse();\r
+\r
+ // aen -- gotta recalc this if you're in a lower res at the bottom of\r
+ // the map and jump to a higher res.\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+ if (xwin > xmax) xwin=xmax;\r
+ if (ywin > ymax) ywin=ymax;\r
+ }\r
+ if (key[SCAN_RANGLE])\r
+ {\r
+ key[SCAN_RANGLE]=0;\r
+ ShutdownVideo();\r
+ vm=1;\r
+ InitVideo(1);\r
+ set_intensity(63);\r
+ InitMouse();\r
+\r
+ // aen -- gotta recalc this if you're in a lower res at the bottom of\r
+ // the map and jump to a higher res.\r
+ xmax = (layer[0].sizex * 16) - sx;\r
+ ymax = (layer[0].sizey * 16) - sy;\r
+ if (xwin > xmax) xwin=xmax;\r
+ if (ywin > ymax) ywin=ymax;\r
+ }\r
+\r
+ if (CheckMouseTabs()) return;\r
+\r
+ if (mb>=3) MainMenu(mx-4,my-5);\r
+ if (key[SCAN_ESC]) DoMainMenu();\r
+\r
+ if (mb==1 && key[SCAN_SLASH] && el<6)\r
+ {\r
+ lt=layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16)];\r
+\r
+ return;\r
+ }\r
+\r
+ if (mb==2 && key[SCAN_SLASH] && el<6)\r
+ {\r
+ rt=layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16)];\r
+ return;\r
+ }\r
+\r
+ // aen; these must come before the tile plotting code just below\r
+ // to work correctly.\r
+ if (mb && el<6 && key[SCAN_LSHIFT] && !shifted)\r
+ {\r
+ selx1=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
+ sely1=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
+ selx2=selx1;\r
+ sely2=sely1;\r
+ shifted=mb;\r
+ return;\r
+ }\r
+ if (mb && el<6 && shifted)\r
+ {\r
+ selx2=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
+ sely2=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
+ return;\r
+ }\r
+ if (!mb && el<6 && shifted)\r
+ { int i,j;\r
+ int x1,y1,x2,y2;\r
+\r
+ x1=selx1;\r
+ y1=sely1;\r
+ x2=selx2;\r
+ y2=sely2;\r
+\r
+ if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
+ if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
+\r
+ copybuf_wide=x2-x1+1;\r
+ copybuf_deep=y2-y1+1;\r
+\r
+ if (shifted==2)\r
+ {\r
+ // block fill\r
+ modified=1;\r
+ for (j=0; j<copybuf_deep; j++)\r
+ {\r
+ for (i=0; i<copybuf_wide; i++)\r
+ layers[el][((y1+j)*layer[el].sizex)+(x1+i)]=lt;\r
+ }\r
+ }\r
+\r
+ if (shifted==1)\r
+ {\r
+ modified=1;\r
+ if (copybuf) vfree(copybuf);\r
+ copybuf=(word *)valloc(copybuf_wide*copybuf_deep*2, "copybuf", 0);\r
+\r
+ // copy\r
+ for (j=0; j<copybuf_deep; j++)\r
+ {\r
+ for (i=0; i<copybuf_wide; i++)\r
+ copybuf[(j*copybuf_wide)+i]=layers[el][((y1+j)*layer[el].sizex)+(x1+i)];\r
+ }\r
+ pasting=1;\r
+ }\r
+ selx1=sely1=0;\r
+ selx2=sely2=0;\r
+ shifted=0;\r
+ }\r
+ if (mb==1 && el<6 && !shifted && pasting)\r
+ { int a,b,i,j;\r
+\r
+ a=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
+ b=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
+\r
+ // paste\r
+ for (j=0; j<copybuf_deep; j++)\r
+ {\r
+ for (i=0; i<copybuf_wide; i++)\r
+ {\r
+ if (b+j<layer[el].sizey && a+i<layer[el].sizex)\r
+ layers[el][((b+j)*layer[el].sizex)+(a+i)]=copybuf[(j*copybuf_wide)+i];\r
+ }\r
+ }\r
+ }\r
+\r
+ if (mb==1 && el<6 && !shifted && !pasting)\r
+ {\r
+ if (mx>335) mx=334;\r
+ modified=1;\r
+ layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)\r
+ /16)]=lt;\r
+ }\r
+ if (mb==2 && el<6 && !shifted)\r
+ {\r
+ if (mx>335) mx=334;\r
+ modified=1;\r
+ layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
+ layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)\r
+ /16)]=rt;\r
+ }\r
+\r
+ if (mb==1 && el==6)\r
+ {\r
+ modified=1;\r
+ obstruct[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=1;\r
+ }\r
+ if (mb==2 && el==6)\r
+ {\r
+ modified=1;\r
+ obstruct[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=0;\r
+ }\r
+ if (mb==1 && el==7 && (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]))\r
+ {\r
+ curzone=zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)];\r
+ WaitRelease();\r
+ ZoneEdDialog();\r
+ return;\r
+ }\r
+ if (mb==1 && el==7)\r
+ {\r
+ modified=1;\r
+ zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=curzone;\r
+ }\r
+ if (mb==2 && el==7)\r
+ {\r
+ modified=1;\r
+ zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
+ /16)]=0;\r
+ }\r
+ if (mb==1 && el==8)\r
+ {\r
+ WaitRelease();\r
+ ProcessEntity((xwin+(mx-16))/16,(ywin+(my-16))/16);\r
+ modified=1;\r
+ }\r
+ if (el==8 && EntityThere((mx-16+xwin)/16,(my+ywin-16)/16) &&\r
+ key[SCAN_DEL])\r
+ {\r
+ WaitRelease();\r
+ DeleteEntity((mx-16+xwin)/16,(my-16+ywin)/16);\r
+ modified=1;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+\r
+#include "config.h"\r
+#include "guicomp.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+#include "keyboard.h"\r
+\r
+#include "smalfont.h"\r
+#include "columns.h"\r
+#include "tilesel.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+struct message\r
+{\r
+ char text[44]; // message text\r
+ int exptime; // message expire time\r
+};\r
+\r
+struct message messages[6]; // 5-message buffer\r
+char num_msgs=0; // number of active messages\r
+char playingmod[80]; // currently playing mod.\r
+extern char scrollmode;\r
+\r
+// ================================= Code ====================================\r
+\r
+void CheckMessageExpirations()\r
+{ int i;\r
+\r
+ for (i=0; i<num_msgs; i++)\r
+ if (systemtime>messages[i].exptime)\r
+ {\r
+ memcpy(messages[i].text, messages[i+1].text, (48*(num_msgs-i+1)));\r
+ num_msgs--;\r
+ }\r
+}\r
+\r
+void Message(char *text, int duration)\r
+{\r
+ if (num_msgs<5)\r
+ {\r
+ memcpy(messages[num_msgs].text, text, strlen(text));\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+ num_msgs++;\r
+ return;\r
+ }\r
+\r
+ memcpy(&messages[0].text, &messages[1].text, 192);\r
+ memcpy(messages[4].text, text, strlen(text)+1);\r
+ messages[num_msgs].exptime=systemtime+duration;\r
+}\r
+\r
+void DrawScreenControls()\r
+{ int i;\r
+ byte c;\r
+\r
+ if (el<6)\r
+ {\r
+ if (pasting)\r
+ {\r
+ GotoXY(298-5,tsy-19+13);\r
+ printstring("P");\r
+ }\r
+ }\r
+\r
+ // Put current-tile boxes if applicable.\r
+ if (el<6)\r
+ {\r
+ FilledBox(298,tsy-19,18,18,white);\r
+ FilledBox(317,tsy-19,18,18,white);\r
+ CopySprite(299,tsy-18,16,16,vsp+(256*lt));\r
+ CopySprite(318,tsy-18,16,16,vsp+(256*rt));\r
+ }\r
+\r
+ if (el==7)\r
+ {\r
+ sprintf(strbuf,"Zone %d",curzone);\r
+ GotoXY(280,tsy-16);\r
+ printstring(strbuf);\r
+ GotoXY(280,tsy-10);\r
+ printstring(zones[curzone].name);\r
+\r
+ c=zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
+ layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)/16)];\r
+\r
+ if (c)\r
+ {\r
+ sprintf(strbuf,"zone %d",c);\r
+ GotoXY(280,17);\r
+ printstring(strbuf);\r
+ GotoXY(280,23);\r
+ printstring(zones[c].name);\r
+ }\r
+ }\r
+\r
+ if (el==8)\r
+ {\r
+ sprintf(strbuf,"%d entities",entities);\r
+ GotoXY(285,17); printstring(strbuf);\r
+\r
+ if (c=EntityThere((mx+xwin-16)/16,(my+ywin-16)/16))\r
+ {\r
+ c--;\r
+ GotoXY(285,tsy-10);\r
+ printstring(entity[c].desc);\r
+ }\r
+ }\r
+\r
+ // Put the current-tile mouse thingy.\r
+ GotoXY(17,17);\r
+ dec_to_asciiz((xwin+mx-16)/16,strbuf);\r
+ printstring(strbuf); printstring(", ");\r
+ dec_to_asciiz((ywin+my-16)/16,strbuf);\r
+ printstring(strbuf);\r
+\r
+ // Put the layer editor/selector.\r
+\r
+ for (i=0; i<6; i++)\r
+ {\r
+ if (el==i) c=white; else c=darkw;\r
+ FilledBox(17+(i*10),tsy-7,9,7,c);\r
+ if (layertoggle[i]) c=darkred; else c=0;\r
+ FilledBox(18+(i*10),tsy-6,7,6,c);\r
+ GotoXY(20+(i*10),tsy-5); dec_to_asciiz(i+1,strbuf);\r
+ if (i<numlayers) printstring(strbuf);\r
+ }\r
+\r
+ for (i=6; i<10; i++)\r
+ {\r
+ if (el==i) c=white; else c=darkw;\r
+ FilledBox(17+(i*10),tsy-7,9,7,c);\r
+ if (layertoggle[i]) c=darkred; else c=0;\r
+ FilledBox(18+(i*10),tsy-6,7,6,c);\r
+ GotoXY(20+(i*10),tsy-5);\r
+ switch (i)\r
+ {\r
+ case 6: printstring("O"); break;\r
+ case 7: printstring("N"); break;\r
+ case 8: printstring("E"); break;\r
+ case 9: printstring("T"); break;\r
+ }\r
+ }\r
+}\r
+\r
+void RenderMessages()\r
+{ int i;\r
+\r
+ CheckMessageExpirations();\r
+ for (i=0; i<num_msgs; i++)\r
+ {\r
+ GotoXY(17,23+(i*6));\r
+ printstring(messages[i].text);\r
+ }\r
+}\r
+\r
+void RenderGUI()\r
+{\r
+ RenderMessages();\r
+ DrawScreenControls();\r
+ DrawMouse();\r
+}\r
+\r
+// ============================= Dialog Code =================================\r
+\r
+int mmxofs=60, mmyofs=50;\r
+\r
+void DoMainMenu()\r
+{\r
+ key[SCAN_ESC]=0;\r
+ MainMenu(mmxofs, mmyofs);\r
+}\r
+\r
+void MainMenu(int dx, int dy)\r
+{ char done=0;\r
+ //int mxo, myo, cursorblink;\r
+\r
+ mmxofs=dx;\r
+ mmyofs=dy;\r
+ do\r
+ {\r
+ if (dx<16) dx=16;\r
+ if (dy<16) dy=16;\r
+ if (dx+80>335) dx=336-80;\r
+ if (dy+89>sy+16) dy=(sy+16)-89;\r
+\r
+ RenderMap();\r
+ RenderGUI();\r
+ stdwindow(dx, dy, dx+80, dy+89);\r
+\r
+ if (mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
+ if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
+ if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
+ if (my>dy+20 && my<dy+26) FilledBox(dx+2, dy+20, 76, 7, darkw);\r
+ if (my>dy+29 && my<dy+36) FilledBox(dx+2, dy+29, 76, 7, darkw);\r
+ if (my>dy+35 && my<dy+42) FilledBox(dx+2, dy+35, 76, 7, darkw);\r
+ if (my>dy+41 && my<dy+48) FilledBox(dx+2, dy+41, 76, 7, darkw);\r
+ if (my>dy+47 && my<dy+54) FilledBox(dx+2, dy+47, 76, 7, darkw);\r
+ if (my>dy+53 && my<dy+60) FilledBox(dx+2, dy+53, 76, 7, darkw);\r
+ if (my>dy+59 && my<dy+66) FilledBox(dx+2, dy+59, 76, 7, darkw);\r
+ if (my>dy+65 && my<dy+72) FilledBox(dx+2, dy+65, 76, 7, darkw);\r
+ if (my>dy+71 && my<dy+78) FilledBox(dx+2, dy+71, 76, 7, darkw);\r
+ if (my>dy+80 && my<dy+87) FilledBox(dx+2, dy+80, 76, 7, darkw);\r
+ }\r
+\r
+ GotoXY(dx+3, dy+3); printstring("New MAP");\r
+ GotoXY(dx+3, dy+9); printstring("Load MAP");\r
+ GotoXY(dx+3, dy+15); printstring("Save MAP");\r
+ GotoXY(dx+3, dy+21); printstring("Load VSP");\r
+ HLine(dx+2, dy+28, 76, white);\r
+ GotoXY(dx+3, dy+30); printstring("MAP Properties");\r
+ GotoXY(dx+3, dy+36); printstring("Layers"); GotoXY(dx+73, dy+36); printstring(">");\r
+ GotoXY(dx+3, dy+42); printstring("Options");\r
+ GotoXY(dx+3, dy+48); printstring("MOD Player");\r
+ GotoXY(dx+3, dy+54); printstring("CD Player");\r
+ GotoXY(dx+3, dy+60); printstring("Columns");\r
+ GotoXY(dx+3, dy+66); printstring("Execute"); GotoXY(dx+73, dy+66); printstring(">");\r
+ GotoXY(dx+3, dy+72); printstring("Exit to DOS");\r
+ HLine(dx+2, dy+79, 76, white);\r
+ GotoXY(dx+3, dy+81); printstring("About MapEd");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ if (mb==1 && mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) { NewMAP(); done=1; WaitRelease(); break; }\r
+ if (my>dy+8 && my<dy+15) { done=1; WaitRelease(); LoadMAPDialog(); break; }\r
+ if (my>dy+14 && my<dy+21) { done=1; WaitRelease(); key[SCAN_F10]=1; break; }\r
+ if (my>dy+20 && my<dy+26) { done=1; WaitRelease(); LoadVSPDialog(); break; }\r
+ if (my>dy+29 && my<dy+36) { done=1; WaitRelease(); MapPropertiesDialog(); break; }\r
+ if (my>dy+35 && my<dy+42) { done=1; WaitRelease(); LayersSubMenu(dx,dy); break; }\r
+ if (my>dy+41 && my<dy+48) { done=1; WaitRelease(); OptionsDialog(); break; }\r
+ if (my>dy+47 && my<dy+54) { done=1; WaitRelease(); MPDialog(); break; }\r
+ if (my>dy+53 && my<dy+60) { done=1; WaitRelease(); CDDialog(); break; }\r
+ if (my>dy+59 && my<dy+66) { done=1; WaitRelease(); Columns(); break; }\r
+ if (my>dy+65 && my<dy+72) { done=1; WaitRelease(); ExecuteSubMenu(); break; }\r
+ if (my>dy+71 && my<dy+78) { done=1; WaitRelease(); key[SCAN_X]=1; key[SCAN_ALT]=1; break; }\r
+ if (my>dy+80 && my<dy+87) { done=1; About(); break; }\r
+ }\r
+\r
+ if (mb==1)\r
+ {\r
+ WaitRelease();\r
+ done=1;\r
+ }\r
+ if (key[SCAN_ESC]==1) done=1;\r
+ } while (!done);\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+// tilesel.c\r
+extern FILE *pcxf;\r
+extern int width, depth;\r
+extern int vidoffset;\r
+extern char *ovsp;\r
+extern char *t;\r
+extern word ontiles;\r
+\r
+static int TileMatch(int a, int b)\r
+ { return !memcmp(ovsp+(a*256), ovsp+(b*256), 256); }\r
+\r
+int ilxsize=145, ilysize=122+10;\r
+int ilxofs=16, ilyofs=16;\r
+\r
+// make this configurable at some point\r
+#define MIN_TILE_X 50\r
+#define MIN_TILE_Y 50\r
+\r
+static int BitToNum(int num)\r
+{\r
+ int i;\r
+\r
+ if (!num)\r
+ return 0;\r
+\r
+ for (i=0; i<32; i++)\r
+ {\r
+ if (num & (1<<i))\r
+ break;\r
+ }\r
+\r
+ return i+1;\r
+}\r
+\r
+//zero\r
+byte TileCmp(byte *one, byte *two)\r
+ { return !memcmp(one,two, 256); }\r
+\r
+void ImageToLayer()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, tt, *str;\r
+ char nstr1[80], nstr2[80];\r
+\r
+ int i,j,k,m;\r
+ FILE *f=0;\r
+ int num_padx=0,num_pady=0; // in tiles\r
+ int minpadx=0,minpady=0; // in tiles\r
+ int tilesx=0,tilesy=0; // in tiles\r
+ int totalx=0,totaly=0; // in tiles\r
+ int excessx=0,excessy=0; // in pixels\r
+ //int chk_1=1,chk_2=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0; // radio control\r
+ int chk_layer=1;\r
+ int chk_grabexcess=0,chk_centerinpad=0,chk_nodup=1; //,chk_padisblank=1;\r
+ char txt_imagename[80];\r
+ // ...\r
+ int ly=0;\r
+ int wide=0,deep=0;\r
+ int lsz=0;\r
+ int matched=0,plot=0; //,mapat=0;\r
+ int tilesripped=0;\r
+ int startx=0,starty=0;\r
+ memset(txt_imagename,0,80);\r
+ bmode=0; // for browser; update map/gui\r
+ width=0; depth=0; // for pcx loading code\r
+\r
+ sprintf(nstr1, "%d", num_padx);\r
+ sprintf(nstr2, "%d", num_pady);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ ilxofs = (mx-mxo);\r
+ ilyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (ilxofs<16) ilxofs = 16;\r
+ if (ilyofs<16) ilyofs = 16;\r
+ if (ilxofs+ilxsize>335) ilxofs = 336-ilxsize;\r
+ if (ilyofs+ilysize>sy+16) ilyofs = (sy+16)-ilysize;\r
+ }\r
+\r
+ Window(ilxofs, ilyofs, ilxofs+ilxsize, ilyofs+ilysize, "Import Image As Layer");\r
+ Button(ilxofs+109, ilyofs+12, "Browse");\r
+ Button(ilxofs+109, ilyofs+30, "OK");\r
+ GotoXY(ilxofs+5, ilyofs+25); printstring("Layer:");\r
+ // layer select radio buttons\r
+ for (i=0; i<6; i++)\r
+ {\r
+ CheckBox(ilxofs+29+(i*10), ilyofs+33, chk_layer & (1<<i));\r
+ GotoXY(ilxofs+31+(i*10), ilyofs+25);\r
+ sprintf(strbuf, "%i", i+1); printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+14); printstring("Image:");\r
+ //TextField(ilxofs+29, ilyofs+12, 75, txt_imagename, ctf == 1 ? cb : 0);\r
+ GotoXY(ilxofs+29, ilyofs+14); printstring(txt_imagename);\r
+ HLine(ilxofs+1, ilyofs+44, 143, white);\r
+ GotoXY(ilxofs+5, ilyofs+49); printstring("Image Dimensions:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Image Dimensions:")+3, ilyofs+49);\r
+ sprintf(strbuf, "%dx%d", width, depth);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+60); printstring("Tiles X:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Tiles X:")+3, ilyofs+60);\r
+ sprintf(strbuf, "%d", tilesx);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+71); printstring("Tiles Y:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Tiles Y:")+3, ilyofs+71);\r
+ sprintf(strbuf, "%d", tilesy);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+51, ilyofs+60); printstring("Pad X:");\r
+ GotoXY(ilxofs+51, ilyofs+71); printstring("Pad Y:");\r
+ TextField(ilxofs+74, ilyofs+58, 12, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(ilxofs+74, ilyofs+69, 12, nstr2, ctf == 2 ? cb : 0);\r
+ GotoXY(ilxofs+95, ilyofs+60); printstring("Total X:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+95+pixels("Total X:")+3, ilyofs+60);\r
+ sprintf(strbuf, "%d", totalx);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+95, ilyofs+71); printstring("Total Y:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+95+pixels("Total Y:")+3, ilyofs+71);\r
+ sprintf(strbuf, "%d", totaly);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+81); printstring("Excess Pixels X:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Excess Pixels X:")+3, ilyofs+81);\r
+ sprintf(strbuf, "%d", excessx);\r
+ printstring(strbuf);\r
+ }\r
+ GotoXY(ilxofs+5, ilyofs+91); printstring("Excess Pixels Y:");\r
+ if (width+depth)\r
+ {\r
+ GotoXY(ilxofs+5+pixels("Excess Pixels Y:")+3, ilyofs+91);\r
+ sprintf(strbuf, "%d", excessy);\r
+ printstring(strbuf);\r
+ }\r
+ CheckBox(ilxofs+5, ilyofs+101, chk_grabexcess);\r
+ GotoXY(ilxofs+17, ilyofs+102); printstring("Grab Excess");\r
+ CheckBox(ilxofs+5, ilyofs+110, chk_centerinpad);\r
+ GotoXY(ilxofs+17, ilyofs+111); printstring("Center Within Padding");\r
+ CheckBox(ilxofs+5, ilyofs+119, chk_nodup);\r
+ GotoXY(ilxofs+17, ilyofs+120); printstring("Eliminate Duplicates");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>ilxofs+109 && mx<ilxofs+30+109 && my>ilyofs+12 && my<ilyofs+10+12 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(ilxofs+109, ilyofs+12, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1, "*.pcx", "", "", "", txt_imagename);\r
+ key[SCAN_ESC]=0; // just in case ESC exited\r
+ f=fopen(txt_imagename, "rb");\r
+ if (f)\r
+ {\r
+ LoadPCXHeaderNP(txt_imagename);\r
+ fclose(pcxf);\r
+\r
+ if (chk_grabexcess) i=15; else i=0;\r
+ tilesx=((width+i)&~15)/16;\r
+ tilesy=((depth+i)&~15)/16;\r
+ excessx=width & 15;\r
+ excessy=depth & 15;\r
+ if (tilesx<MIN_TILE_X) { minpadx=MIN_TILE_X-tilesx; num_padx=minpadx; }\r
+ if (tilesy<MIN_TILE_Y) { minpady=MIN_TILE_Y-tilesy; num_pady=minpady; }\r
+ sprintf(nstr1, "%d", minpadx);\r
+ sprintf(nstr2, "%d", minpady);\r
+ totalx=tilesx+minpadx;\r
+ totaly=tilesy+minpady;\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>ilxofs+109 && mx<ilxofs+30+109 && my>ilyofs+30 && my<ilyofs+10+30 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(ilxofs+109, ilyofs+30, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+\r
+ if (strlen(txt_imagename))\r
+ {\r
+ done=1;\r
+\r
+ ly=BitToNum(chk_layer) -1;\r
+\r
+ startx=0;\r
+ starty=0;\r
+ if (chk_centerinpad)\r
+ {\r
+ startx=(totalx-tilesx)/2;\r
+ starty=(totaly-tilesy)/2;\r
+ }\r
+\r
+ LoadPCXHeaderNP(txt_imagename);\r
+\r
+ wide=width;\r
+ deep=depth;\r
+ if (chk_grabexcess)\r
+ {\r
+ // round up to the nearest multiple of 16 if grabbing excess\r
+ wide=(width+15)&~15;\r
+ deep=(depth+15)&~15;\r
+ }\r
+ // allocate transit image bay, which may have padding ^\r
+ t=(char *) valloc(wide * deep,"img2layer",0);\r
+\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=wide*i;\r
+ ReadPCXLine(t);\r
+ }\r
+ fclose(pcxf);\r
+\r
+ deep=tilesy;\r
+ wide=tilesx;\r
+ ontiles=(wide*deep)+1; // +1 for our empty tile\r
+\r
+ ovsp=(char *) valloc(ontiles*256,"img2layer2",0);\r
+\r
+ layer[ly].pmultx=1; layer[ly].pmulty=1;\r
+ layer[ly].pdivx=1; layer[ly].pdivy=1;\r
+ // totalx & totaly are the sum of tilesx/tilesy & num_padx/num_pady\r
+ layer[ly].sizex=totalx; layer[ly].sizey=totaly;\r
+ layer[ly].trans=0; layer[ly].hline=0;\r
+\r
+ lsz = totalx * totaly;\r
+\r
+ if (layers[ly]) vfree(layers[ly]);\r
+ layers[ly]=(unsigned short *) valloc((lsz*2)+4,"layer data",ly);\r
+\r
+ tilesripped=0;\r
+ memset(ovsp,0,256);\r
+ tilesripped++;\r
+\r
+ for (i=0; i<deep; i++)\r
+ {\r
+ for (j=0; j<wide; j++)\r
+ {\r
+ GrabTileAt((j*16), (i*16), tilesripped, 0);\r
+ plot=tilesripped;\r
+\r
+ // eliminate duplicates?\r
+ if (chk_nodup)\r
+ {\r
+ matched=0;\r
+ for (k=0; k<tilesripped; k++)\r
+ {\r
+ if (TileMatch(tilesripped, k))\r
+ {\r
+ matched=1;\r
+ plot=k;\r
+ break;\r
+ }\r
+ }\r
+ //begin zero\r
+ for(m=0; m<numtiles; m++)\r
+ {\r
+ if(TileCmp(vsp+m*256,ovsp+tilesripped*256))\r
+ {\r
+ matched=1;\r
+ plot=m-numtiles;\r
+// plot=0;\r
+ break;\r
+ }\r
+ }\r
+ //end zero!\r
+ if (!matched) tilesripped++;\r
+ }\r
+ // grabbing all; keep it regardless\r
+ else tilesripped++;\r
+\r
+ layers[ly][((i+starty)*totalx)+j+startx]=plot;\r
+ }\r
+ }\r
+\r
+ // adjust indices past current tile amount\r
+ for (i=0; i<(totalx*totaly); i++)\r
+ layers[ly][i]+=numtiles;\r
+\r
+ if (!ly)\r
+ {\r
+ if (obstruct) vfree(obstruct);\r
+ obstruct=(char *) valloc(lsz+4,"obstruct",0);\r
+ if (zone) vfree(zone);\r
+ zone=(char *) valloc(lsz+4,"zone", 0);\r
+ }\r
+\r
+ // reallocate tilebay and patch in ovsp\r
+ str=(char *)valloc((numtiles+tilesripped)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp, (tilesripped*256));\r
+ numtiles+=tilesripped;\r
+\r
+ // did we make a new layer?\r
+ if (ly+1>numlayers)\r
+ {\r
+ numlayers++;\r
+ sprintf(rstring, "%s%i", rstring, ly+1); // update render-order\r
+ }\r
+\r
+ vfree(t);\r
+ vfree(ovsp);\r
+ }\r
+ // ...\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+29 && mx<ilxofs+8+29 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ chk_layer ^= 1;\r
+ chk_layer &= 1;\r
+ //chk_1 ^= 1;\r
+ //chk_2=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+39 && mx<ilxofs+8+39 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 2)\r
+ {\r
+ chk_layer ^= 2;\r
+ chk_layer &= 2;\r
+ //chk_2 ^= 1;\r
+ //chk_1=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+49 && mx<ilxofs+8+49 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 3)\r
+ {\r
+ chk_layer ^= 4;\r
+ chk_layer &= 4;\r
+ //chk_3 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_4=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+59 && mx<ilxofs+8+59 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 4)\r
+ {\r
+ chk_layer ^= 8;\r
+ chk_layer &= 8;\r
+ //chk_4 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_3=0,chk_5=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+69 && mx<ilxofs+8+69 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 5)\r
+ {\r
+ chk_layer ^= 16;\r
+ chk_layer &= 16;\r
+ //chk_5 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_3=0,chk_4=0,chk_6=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+79 && mx<ilxofs+8+79 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
+ {\r
+ if (numlayers+1 >= 6)\r
+ {\r
+ chk_layer ^= 32;\r
+ chk_layer &= 32;\r
+ //chk_6 ^= 1;\r
+ //chk_1=0,chk_2=0,chk_3=0,chk_4=0,chk_5=0;\r
+ WaitRelease(); continue;\r
+ }\r
+ }\r
+\r
+ // if no checkboxes are marked, mark the first.\r
+ //if (!(chk_1+chk_2+chk_3+chk_4+chk_5+chk_6)) chk_1=1;\r
+ if (!chk_layer) chk_layer=1;\r
+\r
+// if (mb==1 && mx>ilxofs+29 && mx<ilxofs+75+29 && my>ilyofs+12 && my<ilyofs+9+12 && !moving)\r
+// {\r
+// ctf=1; str=txt_imagename; cb=1;\r
+// cursorblink=systemtime+40; continue;\r
+// }\r
+\r
+ if (mb==1)\r
+ {\r
+ if (mx>ilxofs+74 && mx<ilxofs+12+74 && my>ilyofs+58 && my<ilyofs+9+58 && !moving)\r
+ {\r
+ if (ctf==2)\r
+ {\r
+ if (atoi(str)<minpady)\r
+ sprintf(str, "%d", minpady);\r
+ }\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mx>ilxofs+74 && mx<ilxofs+12+74 && my>ilyofs+69 && my<ilyofs+9+69 && !moving)\r
+ {\r
+ if (ctf==1)\r
+ {\r
+ if (atoi(str)<minpadx)\r
+ sprintf(str, "%d", minpadx);\r
+ }\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ switch (ctf)\r
+ {\r
+ case 1: if (atoi(str) < minpadx) sprintf(str, "%d", minpadx); break;\r
+ case 2: if (atoi(str) < minpady) sprintf(str, "%d", minpady); break;\r
+ }\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+101 && my<ilyofs+7+101 && !moving)\r
+ {\r
+ chk_grabexcess ^= 1;\r
+ // <barf>\r
+ if (excessx+excessy)\r
+ {\r
+ if (chk_grabexcess)\r
+ {\r
+ if (excessx) tilesx++;\r
+ if (excessy) tilesy++;\r
+ }\r
+ else\r
+ {\r
+ if (excessx) tilesx--;\r
+ if (excessy) tilesy--;\r
+ }\r
+ if (tilesx<MIN_TILE_X) { minpadx=MIN_TILE_X-tilesx; num_padx=minpadx; }\r
+ if (tilesy<MIN_TILE_Y) { minpady=MIN_TILE_Y-tilesy; num_pady=minpady; }\r
+ sprintf(nstr1, "%d", minpadx);\r
+ sprintf(nstr2, "%d", minpady);\r
+ totalx=tilesx+minpadx;\r
+ totaly=tilesy+minpady;\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+110 && my<ilyofs+7+110 && !moving)\r
+ {\r
+ chk_centerinpad ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+119 && my<ilyofs+7+119 && !moving)\r
+ {\r
+ chk_nodup ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(ilxofs+ilxsize-9) && (mx<ilxofs+ilxsize-2)\r
+ && my>(ilyofs+1) && (my<ilyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>ilxofs && mx<ilxofs+ilxsize && my>ilyofs && my<(ilyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-ilxofs;\r
+ myo=my-ilyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+\r
+ // keep minimally required padding\r
+ if (ctf==1)\r
+ {\r
+ if (atoi(str)<minpadx)\r
+ sprintf(str, "%d", minpadx);\r
+ }\r
+ if (ctf==2)\r
+ {\r
+ if (atoi(str)<minpady)\r
+ sprintf(str, "%d", minpady);\r
+ }\r
+\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=0; str=0; break;\r
+ //case 3: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=2; str=nstr2; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ //case 3: ctf=2; str=nstr1; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ tt=strlen(str);\r
+ str[tt]=c;\r
+ str[tt+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+\r
+ //num_padx=atoi(nstr1);\r
+ //num_pady=atoi(nstr2);\r
+}\r
+\r
+int dtxsize=102, dtysize=52;\r
+int dtxofs=100, dtyofs=70;\r
+// aen\r
+void Destroyer()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ int zn_check=0,zd_check=0,ob_check=0,ent_check=0;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ dtxofs = (mx-mxo);\r
+ dtyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (dtxofs<16) dtxofs = 16;\r
+ if (dtyofs<16) dtyofs = 16;\r
+ if (dtxofs+dtxsize>335) dtxofs = 336-dtxsize;\r
+ if (dtyofs+dtysize>sy+16) dtyofs = (sy+16)-dtysize;\r
+ }\r
+\r
+ Window(dtxofs, dtyofs, dtxofs+dtxsize, dtyofs+dtysize, "Destroyer");\r
+ CheckBox(dtxofs+4, dtyofs+11, zn_check);\r
+ CheckBox(dtxofs+4, dtyofs+31, ob_check);\r
+ CheckBox(dtxofs+4, dtyofs+21, zd_check);\r
+ GotoXY(dtxofs+15, dtyofs+12); printstring("Zones");\r
+ GotoXY(dtxofs+15, dtyofs+32); printstring("Obstructions");\r
+ GotoXY(dtxofs+15, dtyofs+22); printstring("Zone Data");\r
+ Button(dtxofs+68, dtyofs+11, "ok");\r
+ Button(dtxofs+68, dtyofs+24, "cancel");\r
+ CheckBox(dtxofs+4, dtyofs+41, ent_check);\r
+ GotoXY(dtxofs+15, dtyofs+42); printstring("Entities");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+11 && my<dtyofs+7+11 && !moving)\r
+ {\r
+ zn_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+21 && my<dtyofs+7+21 && !moving)\r
+ {\r
+ zd_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+31 && my<dtyofs+7+31 && !moving)\r
+ {\r
+ ob_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+41 && my<dtyofs+7+41 && !moving)\r
+ {\r
+ ent_check ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+68 && mx<dtxofs+30+68 && my>dtyofs+11 && my<dtyofs+10+11 && !moving)\r
+ {\r
+ // insert code for button "ok" here\r
+ ButtonPressed(dtxofs+68, dtyofs+11, "ok");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+\r
+ if (Confirm("Are you sure?"))\r
+ {\r
+ done=1;\r
+ if (ob_check) memset(obstruct, 0, (layer[0].sizex*layer[0].sizey)+4);\r
+ if (zn_check) memset(zone, 0, (layer[0].sizex*layer[0].sizey)+4);\r
+ if (zd_check)\r
+ {\r
+ numzones=0;\r
+ memset(&zones, 0, sizeof zones);\r
+ }\r
+ if (ent_check)\r
+ {\r
+ entities=0;\r
+ nmchr=0;\r
+ nms=0;\r
+ memset(&ms, 0, sizeof ms);\r
+ memset(&entity, 0, sizeof entities);\r
+ memset(&chrlist, 0, sizeof chrlist);\r
+ }\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs+68 && mx<dtxofs+30+68 && my>dtyofs+24 && my<dtyofs+10+24 && !moving)\r
+ {\r
+ done=1;\r
+ // insert code for button "cancel" here\r
+ ButtonPressed(dtxofs+68, dtyofs+24, "cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(dtxofs+dtxsize-9) && (mx<dtxofs+dtxsize-2)\r
+ && my>(dtyofs+1) && (my<dtyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>dtxofs && mx<dtxofs+dtxsize && my>dtyofs && my<(dtyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-dtxofs;\r
+ myo=my-dtyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+void LayersSubMenu(int dx, int dy)\r
+{ char done=0;\r
+ //int mxo, myo, cursorblink;\r
+\r
+ do\r
+ {\r
+ if (dx<16) dx=16;\r
+ if (dy<16) dy=16;\r
+ if (dx+80>335) dx=336-80;\r
+ if (dy+89>sy+16) dy=(sy+16)-89;\r
+\r
+ RenderMap();\r
+ RenderGUI();\r
+ stdwindow(dx, dy, dx+80, dy+29);\r
+\r
+ if (mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
+ if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
+ if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
+ if (my>dy+20 && my<dy+26) FilledBox(dx+2, dy+20, 76, 7, darkw);\r
+ }\r
+\r
+ GotoXY(dx+3, dy+3); printstring("Add Layer");\r
+ GotoXY(dx+3, dy+9); printstring("Edit Layer");\r
+ GotoXY(dx+3, dy+15); printstring("Import Image");\r
+ GotoXY(dx+3, dy+21); printstring("Destroyer");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ if (mb==1 && mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) { AddLayer(); NoticeDialog(); done=1; WaitRelease(); break; }\r
+ if (my>dy+8 && my<dy+15) { EditLayerProperties(); done=1; WaitRelease(); break; }\r
+ if (my>dy+14 && my<dy+21) { ImageToLayer(); done=1; WaitRelease(); break; }\r
+ if (my>dy+20 && my<dy+26) { Destroyer(); done=1; WaitRelease(); break; }\r
+ }\r
+\r
+ if (mb==1)\r
+ {\r
+ WaitRelease();\r
+ done=1;\r
+ }\r
+ if (key[SCAN_ESC]==1) done=1;\r
+ } while (!done);\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+void ExecuteSubMenu(int dx, int dy)\r
+{ char done=0;\r
+ //int mxo, myo, cursorblink;\r
+\r
+ do\r
+ {\r
+ if (dx<16) dx=16;\r
+ if (dy<16) dy=16;\r
+ if (dx+80>335) dx=336-80;\r
+ if (dy+89>sy+16) dy=(sy+16)-89;\r
+\r
+ RenderMap();\r
+ RenderGUI();\r
+ stdwindow(dx, dy, dx+80, dy+23);\r
+\r
+ if (mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
+ if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
+ if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
+ }\r
+\r
+ GotoXY(dx+3, dy+3); printstring("MAP");\r
+ GotoXY(dx+3, dy+9); printstring("VERGE");\r
+ GotoXY(dx+3, dy+15); printstring("DOS");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ if (mb==1 && mx>dx && mx<dx+80)\r
+ {\r
+ if (my>dy+2 && my<dy+9) { ShellMAP(); done=1; WaitRelease(); break; }\r
+ if (my>dy+8 && my<dy+15) { ShellVERGE(); done=1; WaitRelease(); break; }\r
+ if (my>dy+14 && my<dy+21) { ShellToDOS(); done=1; WaitRelease(); break; }\r
+ }\r
+\r
+ if (mb==1)\r
+ {\r
+ WaitRelease();\r
+ done=1;\r
+ }\r
+ if (key[SCAN_ESC]==1) done=1;\r
+ } while (!done);\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+void AddLayer()\r
+{\r
+ layers[numlayers]=(word *) valloc(layer[0].sizex * layer[0].sizey * 2,"layer data",numlayers);\r
+ //memset(layers[numlayers], 0, layer[0].sizex * layer[0].sizey * 2);\r
+ layer[numlayers].pmultx=1; layer[numlayers].pmulty=1;\r
+ layer[numlayers].pdivx=1; layer[numlayers].pdivy=1;\r
+ layer[numlayers].sizex=layer[0].sizex;\r
+ layer[numlayers].sizey=layer[0].sizey;\r
+ layer[numlayers].trans=0;\r
+ layer[numlayers].hline=0;\r
+ numlayers++;\r
+}\r
+\r
+int lpxsize=190, lpysize=68;\r
+int lpxofs=40, lpyofs=60;\r
+\r
+void EditLayerProperties()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, i;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80], nstr5[80],nstr6[80];\r
+\r
+ i=el;\r
+ if (i>5) i=0;\r
+ if (i>=numlayers) i=0;\r
+\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ sprintf(nstr5, "%d", layer[i].trans);\r
+ sprintf(nstr6, "%d", layer[i].hline);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lpxofs = (mx-mxo);\r
+ lpyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lpxofs<16) lpxofs = 16;\r
+ if (lpyofs<16) lpyofs = 16;\r
+ if (lpxofs+lpxsize>335) lpxofs = 336-lpxsize;\r
+ if (lpyofs+lpysize>sy+16) lpyofs = (sy+16)-lpysize;\r
+ }\r
+\r
+ Window(lpxofs, lpyofs, lpxofs+lpxsize, lpyofs+lpysize, "Edit Layer Properties");\r
+ GotoXY(lpxofs+3, lpyofs+10); printstring("Parallax controls:");\r
+ GotoXY(lpxofs+4, lpyofs+21); printstring("MultX:");\r
+ GotoXY(lpxofs+12, lpyofs+31); printstring("DivX:");\r
+ GotoXY(lpxofs+93, lpyofs+21); printstring("MultY:");\r
+ GotoXY(lpxofs+101, lpyofs+31); printstring("DivY:");\r
+ TextField(lpxofs+29, lpyofs+19, 60, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(lpxofs+29, lpyofs+29, 60, nstr2, ctf == 2 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+19, 60, nstr3, ctf == 3 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+29, 60, nstr4, ctf == 4 ? cb : 0);\r
+ HLine(lpxofs+1, lpyofs+43, 188, white);\r
+ GotoXY(lpxofs+9, lpyofs+48); printstring("Transparent");\r
+ GotoXY(lpxofs+36, lpyofs+58); printstring("HLine");\r
+ TextField(lpxofs+56, lpyofs+46, 60, nstr5, ctf == 5 ? cb : 0);\r
+ TextField(lpxofs+56, lpyofs+56, 60, nstr6, ctf == 6 ? cb : 0);\r
+ Button(lpxofs+156, lpyofs+55, "OK");\r
+ GotoXY(lpxofs+144, lpyofs+47); printstring("Layer");\r
+ sprintf(strbuf,"%d",i); GotoXY(lpxofs+168, lpyofs+47); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+60+56 && my>lpyofs+46 && my<lpyofs+9+46 && !moving)\r
+ {\r
+ ctf=5; str=nstr5; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+60+56 && my>lpyofs+56 && my<lpyofs+9+56 && !moving)\r
+ {\r
+ ctf=6; str=nstr6; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lpxofs+156 && mx<lpxofs+30+156 && my>lpyofs+55 && my<lpyofs+10+55 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(lpxofs+156, lpyofs+55, "OK");\r
+ DrawMouse(); done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lpxofs+lpxsize-9) && (mx<lpxofs+lpxsize-2)\r
+ && my>(lpyofs+1) && (my<lpyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs && mx<lpxofs+lpxsize && my>lpyofs && my<(lpyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lpxofs;\r
+ myo=my-lpyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ layer[i].trans=atoi(nstr5);\r
+ layer[i].hline=atoi(nstr6);\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ if (i) i--; else i=numlayers-1;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ sprintf(nstr5, "%d", layer[i].trans);\r
+ sprintf(nstr6, "%d", layer[i].hline);\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ layer[i].trans=atoi(nstr5);\r
+ layer[i].hline=atoi(nstr6);\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ if (i<numlayers-1) i++; else i=0;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ sprintf(nstr5, "%d", layer[i].trans);\r
+ sprintf(nstr6, "%d", layer[i].hline);\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=5; str=nstr5; break;\r
+ case 5: ctf=6; str=nstr6; break;\r
+ case 6: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=6; str=nstr6; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ case 5: ctf=4; str=nstr4; break;\r
+ case 6: ctf=5; str=nstr5; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ layer[i].trans=atoi(nstr5);\r
+ layer[i].hline=atoi(nstr6);\r
+}\r
+/*\r
+int lpxsize=190, lpysize=68;\r
+int lpxofs=40, lpyofs=60;\r
+\r
+void EditLayerProperties()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, i;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ i=el;\r
+ if (i>5) i=0;\r
+ if (i>=numlayers) i=0;\r
+\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lpxofs = (mx-mxo);\r
+ lpyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lpxofs<16) lpxofs = 16;\r
+ if (lpyofs<16) lpyofs = 16;\r
+ if (lpxofs+lpxsize>335) lpxofs = 336-lpxsize;\r
+ if (lpyofs+lpysize>sy+16) lpyofs = (sy+16)-lpysize;\r
+ }\r
+\r
+ Window(lpxofs, lpyofs, lpxofs+lpxsize, lpyofs+lpysize, "Edit Layer Properties");\r
+ GotoXY(lpxofs+3, lpyofs+10); printstring("Parallax controls:");\r
+ GotoXY(lpxofs+4, lpyofs+21); printstring("MultX:");\r
+ GotoXY(lpxofs+12, lpyofs+31); printstring("DivX:");\r
+ GotoXY(lpxofs+93, lpyofs+21); printstring("MultY:");\r
+ GotoXY(lpxofs+101, lpyofs+31); printstring("DivY:");\r
+ TextField(lpxofs+29, lpyofs+19, 60, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(lpxofs+29, lpyofs+29, 60, nstr2, ctf == 2 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+19, 60, nstr3, ctf == 3 ? cb : 0);\r
+ TextField(lpxofs+118, lpyofs+29, 60, nstr4, ctf == 4 ? cb : 0);\r
+ HLine(lpxofs+1, lpyofs+43, 188, white);\r
+ GotoXY(lpxofs+6, lpyofs+49); printstring("Transparent");\r
+ GotoXY(lpxofs+32, lpyofs+56); printstring("HLine");\r
+ CheckBox(lpxofs+56, lpyofs+48, layer[i].trans);\r
+ CheckBox(lpxofs+56, lpyofs+56, layer[i].hline);\r
+ Button(lpxofs+156, lpyofs+55, "OK");\r
+ GotoXY(lpxofs+144, lpyofs+47); printstring("Layer");\r
+ sprintf(strbuf,"%d",i); GotoXY(lpxofs+168, lpyofs+47); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+8+56 && my>lpyofs+48 && my<lpyofs+7+48 && !moving)\r
+ {\r
+ layer[i].trans ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs+56 && mx<lpxofs+8+56 && my>lpyofs+56 && my<lpyofs+7+56 && !moving)\r
+ {\r
+ layer[i].hline ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lpxofs+156 && mx<lpxofs+30+156 && my>lpyofs+55 && my<lpyofs+10+55 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(lpxofs+156, lpyofs+55, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lpxofs+lpxsize-9) && (mx<lpxofs+lpxsize-2)\r
+ && my>(lpyofs+1) && (my<lpyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lpxofs && mx<lpxofs+lpxsize && my>lpyofs && my<(lpyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lpxofs;\r
+ myo=my-lpyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ if (i) i--; else i=numlayers-1;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ if (i<numlayers-1) i++; else i=0;\r
+ sprintf(nstr1, "%d", layer[i].pmultx);\r
+ sprintf(nstr2, "%d", layer[i].pdivx);\r
+ sprintf(nstr3, "%d", layer[i].pmulty);\r
+ sprintf(nstr4, "%d", layer[i].pdivy);\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=4; str=nstr4; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+\r
+ layer[i].pmultx=atoi(nstr1);\r
+ layer[i].pdivx=atoi(nstr2);\r
+ layer[i].pmulty=atoi(nstr3);\r
+ layer[i].pdivy=atoi(nstr4);\r
+}\r
+ */\r
+void NewMAP()\r
+{ int cursorblink;\r
+\r
+ if (Confirm("Lose existing MAP?"))\r
+ {\r
+ for (cursorblink=0; cursorblink<numlayers; cursorblink++)\r
+ vfree(layers[cursorblink]);\r
+ memcpy(mapname,"UNTITLED.MAP",13);\r
+ memcpy(vspname,"UNTITLED.VSP",13);\r
+ memcpy(musname,"\0",1);\r
+ memcpy(rstring,"1E",2);\r
+ xstart=1; ystart=1;\r
+ numlayers=1;\r
+ wrap=0;\r
+\r
+ // aen: default newmap dimensions set to 100x100\r
+ layer[0].pmultx=1; layer[0].pmulty=1;\r
+ layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[0].sizex=100; layer[0].sizey=100;\r
+ layer[0].trans=0; layer[0].hline=0;\r
+\r
+ layers[0] = (unsigned short *)valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
+ vfree(obstruct);\r
+ obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct",0);\r
+ vfree(zone);\r
+ zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone",0);\r
+ entities=0; // Mordred\r
+\r
+ // aen: default number of tiles set to 100\r
+ numtiles=100;\r
+ vfree(vsp);\r
+ vsp=(char *) valloc(256 * numtiles,"vsp data",0);\r
+\r
+ // zero: was re-allocating same memory so gfx still visible in some places\r
+ memset(vsp,0,256*numtiles);\r
+ // zero: gotta clear that anim stuff man!\r
+ memset(vspanim,0,800);\r
+ InitTileIDX();\r
+\r
+\r
+\r
+ layertoggle[0]=1; layertoggle[1]=0; layertoggle[2]=0; layertoggle[3]=0;\r
+ layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
+ xwin=0; ywin=0;\r
+ }\r
+}\r
+\r
+int amxsize=150, amysize=88;\r
+int amxofs=60, amyofs=60;\r
+\r
+void About()\r
+{\r
+ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ amxofs = (mx-mxo);\r
+ amyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (amxofs<16) amxofs = 16;\r
+ if (amyofs<16) amyofs = 16;\r
+ if (amxofs+amxsize>335) amxofs = 336-amxsize;\r
+ if (amyofs+amysize>sy+16) amyofs = (sy+16)-amysize;\r
+ }\r
+\r
+ sprintf(strbuf, "About MapEd %s", ME2_VERSION);\r
+ Window(amxofs, amyofs, amxofs+amxsize, amyofs+amysize, strbuf);\r
+ sprintf(strbuf, "MapEd v.%s", ME2_VERSION);\r
+ GotoXY(amxofs+52, amyofs+16); printstring(strbuf);\r
+ GotoXY(amxofs+31, amyofs+22); printstring("Copyright (C) 1998 vecna");\r
+ GotoXY(amxofs+40, amyofs+28); printstring("All Rights Reserved");\r
+ GotoXY(amxofs+(75-pixels("Additional code by Ric")/2), amyofs+41);\r
+ printstring("Additional code by Ric");\r
+ GotoXY(amxofs+(75-pixels("Additional code by aen")/2), amyofs+47);\r
+ printstring("Additional code by aen");\r
+ GotoXY(amxofs+(75-pixels("Additional code by zeromus")/2), amyofs+53);\r
+ printstring("Additional code by zeromus");\r
+ Button(amxofs+60, amyofs+68, "OK");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>amxofs+66 && mx<amxofs+30+66 && my>amyofs+68 && my<amyofs+10+68 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(amxofs+60, amyofs+68, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(amxofs+amxsize-9) && (mx<amxofs+amxsize-2) &&\r
+ my>(amyofs+1) && (my<amyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>amxofs && mx<amxofs+amxsize && my>amyofs && my<(amyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-amxofs;\r
+ myo=my-amyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+}\r
+\r
+int cnxsize=125, cnysize=50;\r
+int cnxofs=114, cnyofs=70;\r
+\r
+int Confirm(char *message)\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ WaitRelease();\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ cnxofs = (mx-mxo);\r
+ cnyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (cnxofs<16) cnxofs = 16;\r
+ if (cnyofs<16) cnyofs = 16;\r
+ if (cnxofs+cnxsize>335) cnxofs = 336-cnxsize;\r
+ if (cnyofs+cnysize>sy+16) cnyofs = (sy+16)-cnysize;\r
+ }\r
+\r
+ Window(cnxofs, cnyofs, cnxofs+cnxsize, cnyofs+cnysize, "Confirm? (Y/N)");\r
+ GotoXY(cnxofs+125/2-(pixels(message)/2), cnyofs+15); printstring(message);\r
+\r
+ Button(cnxofs+24, cnyofs+30, "Yes");\r
+ Button(cnxofs+69, cnyofs+30, "No");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>cnxofs+24 && mx<cnxofs+30+24 && my>cnyofs+30 && my<cnyofs+10+30 && !moving)\r
+ {\r
+ // insert code for button "Yes" here\r
+ ButtonPressed(cnxofs+24, cnyofs+30, "Yes");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ return 1;\r
+ }\r
+\r
+ if (mb==1 && mx>cnxofs+69 && mx<cnxofs+30+69 && my>cnyofs+30 && my<cnyofs+10+30 && !moving)\r
+ {\r
+ ButtonPressed(cnxofs+69, cnyofs+30, "No");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ return 0;\r
+ }\r
+\r
+ if (mb==1 && mx>(cnxofs+cnxsize-9) && (mx<cnxofs+cnxsize-2)\r
+ && my>(cnyofs+1) && (my<cnyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>cnxofs && mx<cnxofs+cnxsize && my>cnyofs && my<(cnyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-cnxofs;\r
+ myo=my-cnyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (last_pressed==SCAN_N)\r
+ {\r
+ key[SCAN_N]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (last_pressed==SCAN_Y)\r
+ {\r
+ key[SCAN_Y]=0;\r
+ return 1;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+ return 0;\r
+}\r
+\r
+int lmxsize=145, lmysize=36;\r
+int lmxofs=80, lmyofs=50;\r
+\r
+void LoadMAPDialog()\r
+{ char lmapname[80];\r
+ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ memset(lmapname, 0, 80);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lmxofs = (mx-mxo);\r
+ lmyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lmxofs<16) lmxofs = 16;\r
+ if (lmyofs<16) lmyofs = 16;\r
+ if (lmxofs+lmxsize>335) lmxofs = 336-lmxsize;\r
+ if (lmyofs+lmysize>sy+16) lmyofs = (sy+16)-lmysize;\r
+ }\r
+\r
+ Window(lmxofs, lmyofs, lmxofs+lmxsize, lmyofs+lmysize, "Load MAP");\r
+ GotoXY(lmxofs+2, lmyofs+13); printstring("Load MAP:");\r
+ TextField(lmxofs+38, lmyofs+11, 70, lmapname, ctf == 1 ? cb : 0);\r
+ Button(lmxofs+79, lmyofs+22, "OK");\r
+ Button(lmxofs+111, lmyofs+22, "Cancel");\r
+ Button(lmxofs+111, lmyofs+11, "Browse");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lmxofs+38 && mx<lmxofs+70+38 && my>lmyofs+11 && my<lmyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=lmapname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lmxofs+79 && mx<lmxofs+30+79 && my>lmyofs+22 && my<lmyofs+10+22 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ if (modified)\r
+ if (!Confirm("Lose unsaved changes?")) { done=1; continue; }\r
+ for (cursorblink=0; cursorblink<numlayers; cursorblink++)\r
+ vfree(layers[cursorblink]);\r
+ vfree(obstruct);\r
+ vfree(zone);\r
+ vfree(vsp);\r
+\r
+ memcpy(mapname, lmapname, strlen(lmapname)+1);\r
+ LoadMAP(mapname);\r
+ InitTileIDX();\r
+ xwin=0; ywin=0; done=1;\r
+\r
+ ButtonPressed(lmxofs+79, lmyofs+22, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lmxofs+111 && mx<lmxofs+30+111 && my>lmyofs+22 && my<lmyofs+10+22 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ ButtonPressed(lmxofs+111, lmyofs+22, "Cancel");\r
+ DrawMouse(); done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lmxofs+111 && mx<lmxofs+30+111 && my>lmyofs+11 && my<lmyofs+10+11 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(lmxofs+111, lmyofs+11, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ Browse(1,"*.map","","","",lmapname);\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lmxofs+lmxsize-9) && (mx<lmxofs+lmxsize-2)\r
+ && my>(lmyofs+1) && (my<lmyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lmxofs && mx<lmxofs+lmxsize && my>lmyofs && my<(lmyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lmxofs;\r
+ myo=my-lmyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=lmapname; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+}\r
+\r
+int lvxsize=145, lvysize=35;\r
+int lvxofs=80, lvyofs=50;\r
+\r
+void LoadVSPDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char lvspname[80];\r
+\r
+ last_pressed=0;\r
+ memset(lvspname,0,80);\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ lvxofs = (mx-mxo);\r
+ lvyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (lvxofs<16) lvxofs = 16;\r
+ if (lvyofs<16) lvyofs = 16;\r
+ if (lvxofs+lvxsize>335) lvxofs = 336-lvxsize;\r
+ if (lvyofs+lvysize>sy+16) lvyofs = (sy+16)-lvysize;\r
+ }\r
+\r
+ Window(lvxofs, lvyofs, lvxofs+lvxsize, lvyofs+lvysize, "Load VSP");\r
+ GotoXY(lvxofs+2, lvyofs+13); printstring("Load VSP:");\r
+ TextField(lvxofs+38, lvyofs+11, 70, lvspname, ctf == 1 ? cb : 0);\r
+ Button(lvxofs+79, lvyofs+21, "OK");\r
+ Button(lvxofs+111, lvyofs+21, "Cancel");\r
+ Button(lvxofs+111, lvyofs+10, "Browse");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>lvxofs+38 && mx<lvxofs+70+38 && my>lvyofs+11 && my<lvyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=lvspname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lvxofs+79 && mx<lvxofs+30+79 && my>lvyofs+21 && my<lvyofs+10+21 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ vfree(vsp);\r
+ memcpy(vspname, lvspname, strlen(lvspname)+1);\r
+ LoadVSP(vspname);\r
+ InitTileIDX();\r
+ ButtonPressed(lvxofs+79, lvyofs+21, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>lvxofs+111 && mx<lvxofs+30+111 && my>lvyofs+21 && my<lvyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ ButtonPressed(lvxofs+111, lvyofs+21, "Cancel");\r
+ DrawMouse(); done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>lvxofs+111 && mx<lvxofs+30+111 && my>lvyofs+10 && my<lvyofs+10+10 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(lvxofs+111, lvyofs+10, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.vsp","","","",lvspname);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(lvxofs+lvxsize-9) && (mx<lvxofs+lvxsize-2)\r
+ && my>(lvyofs+1) && (my<lvyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>lvxofs && mx<lvxofs+lvxsize && my>lvyofs && my<(lvyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-lvxofs;\r
+ myo=my-lvyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=lvspname; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=lvspname; break;\r
+ case 1: ctf=0; str=lvspname; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+int mpxsize=175, mpysize=37;\r
+int mpxofs=60, mpyofs=60;\r
+\r
+void MPDialog()\r
+{ char done=0, moving=0, playmod[80];\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ memset(playmod, 0, 80);\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ mpxofs = (mx-mxo);\r
+ mpyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (mpxofs<16) mpxofs = 16;\r
+ if (mpyofs<16) mpyofs = 16;\r
+ if (mpxofs+mpxsize>335) mpxofs = 336-mpxsize;\r
+ if (mpyofs+mpysize>sy+16) mpyofs = (sy+16)-mpysize;\r
+ }\r
+\r
+ Window(mpxofs, mpyofs, mpxofs+mpxsize, mpyofs+mpysize, "MOD Player Controls");\r
+ GotoXY(mpxofs+2, mpyofs+15); printstring("MOD Playing:");\r
+ TextField(mpxofs+49, mpyofs+13, 90, playmod, ctf == 1 ? cb : 0);\r
+ Button(mpxofs+110, mpyofs+24, "Play");\r
+ Button(mpxofs+142, mpyofs+24, "Stop");\r
+ Button(mpxofs+78, mpyofs+24, "OK");\r
+ Button(mpxofs+142, mpyofs+12, "Browse");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>mpxofs+49 && mx<mpxofs+90+49 && my>mpyofs+13 && my<mpyofs+9+13 && !moving)\r
+ {\r
+ ctf=1; str=playmod; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>mpxofs+110 && mx<mpxofs+30+110 && my>mpyofs+24 && my<mpyofs+10+24 && !moving)\r
+ {\r
+ // insert code for button "Play" here\r
+ ButtonPressed(mpxofs+110, mpyofs+24, "Play");\r
+ PlayMusic(playmod);\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>mpxofs+142 && mx<mpxofs+30+142 && my>mpyofs+24 && my<mpyofs+10+24 && !moving)\r
+ {\r
+ // insert code for button "Stop" here\r
+ memset(playingmod, 0, 80);\r
+ memset(playmod, 0, 80);\r
+ StopMusic();\r
+ ButtonPressed(mpxofs+142, mpyofs+24, "Stop");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>mpxofs+78 && mx<mpxofs+30+78 && my>mpyofs+24 && my<mpyofs+10+24 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(mpxofs+78, mpyofs+24, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>mpxofs+142 && mx<mpxofs+30+142 && my>mpyofs+12 && my<mpyofs+10+12 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(mpxofs+142, mpyofs+12, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(4,"*.s3m","*.mod","*.xm",".it",playmod);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(mpxofs+mpxsize-9) && (mx<mpxofs+mpxsize-2)\r
+ && my>(mpyofs+1) && (my<mpyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>mpxofs && mx<mpxofs+mpxsize && my>mpyofs && my<(mpyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-mpxofs;\r
+ myo=my-mpyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=playmod; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=playmod; break;\r
+ case 1: ctf=0; str=playmod; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int zexsize=135, zeysize=86;\r
+int zexofs=80, zeyofs=40;\r
+\r
+void ZoneEdDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, i=0;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ i=curzone;\r
+ sprintf(nstr1, "%d", zones[i].script);\r
+ sprintf(nstr2, "%d", zones[i].percent);\r
+ sprintf(nstr3, "%d", zones[i].delay);\r
+ sprintf(nstr4, "%d", zones[i].entityscript);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ zexofs = (mx-mxo);\r
+ zeyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (zexofs<16) zexofs = 16;\r
+ if (zeyofs<16) zeyofs = 16;\r
+ if (zexofs+zexsize>335) zexofs = 336-zexsize;\r
+ if (zeyofs+zeysize>sy+16) zeyofs = (sy+16)-zeysize;\r
+ }\r
+\r
+ Window(zexofs, zeyofs, zexofs+zexsize, zeyofs+zeysize, "Zone Editor");\r
+ GotoXY(zexofs+8, zeyofs+12); printstring("Name:");\r
+ TextField(zexofs+30, zeyofs+10, 100, zones[i].name, ctf == 1 ? cb : 0);\r
+ GotoXY(zexofs+5, zeyofs+22); printstring("Script:");\r
+ TextField(zexofs+30, zeyofs+20, 100, nstr1, ctf == 2 ? cb : 0);\r
+ GotoXY(zexofs+2, zeyofs+32); printstring("Chance:");\r
+ TextField(zexofs+30, zeyofs+30, 100, nstr2, ctf == 3 ? cb : 0);\r
+ GotoXY(zexofs+7, zeyofs+42); printstring("Delay:");\r
+ TextField(zexofs+30, zeyofs+40, 100, nstr3, ctf == 4 ? cb : 0);\r
+ GotoXY(zexofs+4, zeyofs+52); printstring("Entity:");\r
+ TextField(zexofs+30, zeyofs+50, 100, nstr4, ctf == 5 ? cb : 0);\r
+ CheckBox(zexofs+20, zeyofs+61, zones[i].aaa);\r
+ GotoXY(zexofs+31, zeyofs+62); printstring("Allow Adjacent Activation");\r
+ Button(zexofs+99, zeyofs+71, "OK");\r
+ GotoXY(zexofs+12, zeyofs+73); printstring("Zone");\r
+ GotoXY(zexofs+30, zeyofs+73);\r
+ sprintf(strbuf,"%d",i); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+10 && my<zeyofs+9+10 && !moving)\r
+ {\r
+ ctf=1; str=zones[i].name; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+20 && my<zeyofs+9+20 && !moving)\r
+ {\r
+ ctf=2; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+30 && my<zeyofs+9+30 && !moving)\r
+ {\r
+ ctf=3; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+40 && my<zeyofs+9+40 && !moving)\r
+ {\r
+ ctf=4; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+50 && my<zeyofs+9+50 && !moving)\r
+ {\r
+ ctf=5; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs+20 && mx<zexofs+8+20 && my>zeyofs+61 && my<zeyofs+7+61 && !moving)\r
+ {\r
+ zones[i].aaa ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>zexofs+99 && mx<zexofs+30+99 && my>zeyofs+71 && my<zeyofs+10+71 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(zexofs+99, zeyofs+71, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(zexofs+zexsize-9) && (mx<zexofs+zexsize-2)\r
+ && my>(zeyofs+1) && (my<zeyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>zexofs && mx<zexofs+zexsize && my>zeyofs && my<(zeyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-zexofs;\r
+ myo=my-zeyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ zones[i].script=atoi(nstr1);\r
+ zones[i].percent=atoi(nstr2);\r
+ zones[i].delay=atoi(nstr3);\r
+ zones[i].entityscript=atoi(nstr4);\r
+ if (i<255) i++; else i=0;\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ sprintf(nstr1, "%d", zones[i].script);\r
+ sprintf(nstr2, "%d", zones[i].percent);\r
+ sprintf(nstr3, "%d", zones[i].delay);\r
+ sprintf(nstr4, "%d", zones[i].entityscript);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ zones[i].script=atoi(nstr1);\r
+ zones[i].percent=atoi(nstr2);\r
+ zones[i].delay=atoi(nstr3);\r
+ zones[i].entityscript=atoi(nstr4);\r
+ if (i) i--; else i=255;\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ sprintf(nstr1, "%d", zones[i].script);\r
+ sprintf(nstr2, "%d", zones[i].percent);\r
+ sprintf(nstr3, "%d", zones[i].delay);\r
+ sprintf(nstr4, "%d", zones[i].entityscript);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=zones[i].name; break;\r
+ case 1: ctf=2; str=nstr1; break;\r
+ case 2: ctf=3; str=nstr2; break;\r
+ case 3: ctf=4; str=nstr3; break;\r
+ case 4: ctf=5; str=nstr4; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=nstr4; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=zones[i].name; break;\r
+ case 3: ctf=2; str=nstr1; break;\r
+ case 4: ctf=3; str=nstr2; break;\r
+ case 5: ctf=4; str=nstr3; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+ curzone=i;\r
+ zones[i].script=atoi(nstr1);\r
+ zones[i].percent=atoi(nstr2);\r
+ zones[i].delay=atoi(nstr3);\r
+ zones[i].entityscript=atoi(nstr4);\r
+}\r
+\r
+int exsize=180, eysize=175;\r
+int exofs=70, eyofs=30;\r
+\r
+void EntityEditor(int i)\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80], nstr5[80], nstr6[80], nstr7[80], nstr8[80], nstr9[80], nstr10[80], nstr11[80], nstr12[80], nstr13[80];\r
+\r
+ sprintf(nstr1, "%d", entity[i].x);\r
+ sprintf(nstr2, "%d", entity[i].y);\r
+ sprintf(nstr3, "%d", entity[i].chrindex);\r
+ sprintf(nstr4, "%d", entity[i].speed);\r
+ sprintf(nstr5, "%d", entity[i].actscript);\r
+ sprintf(nstr6, "%d", entity[i].movecode);\r
+ sprintf(nstr7, "%d", entity[i].step);\r
+ sprintf(nstr8, "%d", entity[i].data2);\r
+ sprintf(nstr9, "%d", entity[i].data3);\r
+ sprintf(nstr10, "%d", entity[i].delay);\r
+ sprintf(nstr11, "%d", entity[i].data5);\r
+ sprintf(nstr12, "%d", entity[i].data6);\r
+ sprintf(nstr13, "%d", entity[i].movescript);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ exofs = (mx-mxo);\r
+ eyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (exofs<16) exofs = 16;\r
+ if (eyofs<16) eyofs = 16;\r
+ if (exofs+exsize>335) exofs = 336-exsize;\r
+ if (eyofs+eysize>sy+16) eyofs = (sy+16)-eysize;\r
+ }\r
+\r
+ Window(exofs, eyofs, exofs+exsize, eyofs+eysize, "Entity Editor");\r
+ GotoXY(exofs+7, eyofs+13); printstring("Desc:");\r
+ TextField(exofs+26, eyofs+11, 80, entity[i].desc, ctf == 1 ? cb : 0);\r
+ GotoXY(exofs+19, eyofs+23); printstring("X:");\r
+ TextField(exofs+26, eyofs+21, 80, nstr1, ctf == 2 ? cb : 0);\r
+ GotoXY(exofs+19, eyofs+33); printstring("Y:");\r
+ TextField(exofs+26, eyofs+31, 80, nstr2, ctf == 3 ? cb : 0);\r
+ GotoXY(exofs+11, eyofs+43); printstring("CHR:");\r
+ TextField(exofs+26, eyofs+41, 80, nstr3, ctf == 4 ? cb : 0);\r
+\r
+ // ***\r
+ // entity image goes here (just above chr list button)\r
+ // ***\r
+\r
+ BigButton(exofs+116, eyofs+61, "CHR List");\r
+ BigButton(exofs+115, eyofs+153, "Scripts");\r
+ GotoXY(exofs+2, eyofs+155); printstring("Movescript:");\r
+ HLine(exofs+1, eyofs+73, 178, white);\r
+ GotoXY(exofs+3, eyofs+53); printstring("Speed:");\r
+ TextField(exofs+26, eyofs+51, 80, nstr4, ctf == 5 ? cb : 0);\r
+ TextField(exofs+26, eyofs+61, 80, nstr5, ctf == 6 ? cb : 0);\r
+ GotoXY(exofs+107, eyofs+79); printstring("Is Obstruction");\r
+ CheckBox(exofs+161, eyofs+87, entity[i].obsmode1);\r
+ GotoXY(exofs+102, eyofs+88); printstring("Is Obstructable");\r
+ CheckBox(exofs+161, eyofs+78, entity[i].obsmode2);\r
+ GotoXY(exofs+24, eyofs+79); printstring("Auto Face");\r
+ CheckBox(exofs+61, eyofs+78, entity[i].face);\r
+ GotoXY(exofs+10, eyofs+88); printstring("Activ. Method");\r
+ CheckBox(exofs+61, eyofs+87, entity[i].actm);\r
+ HLine(exofs+1, eyofs+98, 178, white);\r
+ GotoXY(exofs+126, eyofs+166); printstring("Entity");\r
+ GotoXY(exofs+6, eyofs+104); printstring("Move Code:");\r
+ TextField(exofs+47, eyofs+103, 80, nstr6, ctf == 7 ? cb : 0);\r
+ TextField(exofs+30, eyofs+115, 40, nstr7, ctf == 8 ? cb : 0);\r
+ TextField(exofs+30, eyofs+125, 40, nstr8, ctf == 9 ? cb : 0);\r
+ TextField(exofs+30, eyofs+135, 40, nstr9, ctf == 10 ? cb : 0);\r
+ TextField(exofs+113, eyofs+115, 40, nstr10, ctf == 11 ? cb : 0);\r
+ TextField(exofs+113, eyofs+125, 40, nstr11, ctf == 12 ? cb : 0);\r
+ TextField(exofs+113, eyofs+135, 40, nstr12, ctf == 13 ? cb : 0);\r
+ HLine(exofs+1, eyofs+148, 178, white);\r
+ TextField(exofs+46, eyofs+153, 60, nstr13, ctf == 14 ? cb : 0);\r
+ GotoXY(exofs+5, eyofs+63); printstring("Activ:");\r
+ GotoXY(exofs+152, eyofs+166);\r
+ sprintf(strbuf, "%d/%d", i, entities-1); printstring(strbuf);\r
+ entity[i].movecode=atoi(nstr6);\r
+ if (ctf!=4) entity[i].chrindex=atoi(nstr3);\r
+\r
+ switch (entity[i].movecode)\r
+ {\r
+ case 0: GotoXY(exofs+131, eyofs+104); printstring("Stopped"); break;\r
+ case 1: GotoXY(exofs+131, eyofs+104); printstring("Wander");\r
+ GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
+ GotoXY(exofs+90, eyofs+116); printstring("Delay:"); break;\r
+ case 2: GotoXY(exofs+131, eyofs+104); printstring("Wander Zone");\r
+ GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
+ GotoXY(exofs+90, eyofs+116); printstring("Delay:");\r
+ GotoXY(exofs+10, eyofs+126); printstring("Zone:"); break;\r
+ case 3: GotoXY(exofs+131, eyofs+104); printstring("Wander Box");\r
+ GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
+ GotoXY(exofs+90, eyofs+116); printstring("Delay:");\r
+ GotoXY(exofs+21, eyofs+126); printstring("X1:");\r
+ GotoXY(exofs+21, eyofs+136); printstring("Y1:");\r
+ GotoXY(exofs+102, eyofs+126); printstring("X2:");\r
+ GotoXY(exofs+102, eyofs+136); printstring("Y2:"); break;\r
+ case 4: GotoXY(exofs+131, eyofs+104); printstring("Scripted"); break;\r
+ }\r
+ switch (entity[i].actm)\r
+ {\r
+ case 0: GotoXY(exofs+72, eyofs+88); printstring("Actv"); break;\r
+ case 1: GotoXY(exofs+72, eyofs+88); printstring("Adjc"); break;\r
+ }\r
+\r
+ if (chrs[entity[i].chrindex].frame)\r
+ TCopySprite(exofs+143-(chrs[entity[i].chrindex].fx/2),\r
+ eyofs+31-(chrs[entity[i].chrindex].fy/2),\r
+ chrs[entity[i].chrindex].fx, chrs[entity[i].chrindex].fy,\r
+ chrs[entity[i].chrindex].frame);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+11 && my<eyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=entity[i].desc; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+21 && my<eyofs+9+21 && !moving)\r
+ {\r
+ ctf=2; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+31 && my<eyofs+9+31 && !moving)\r
+ {\r
+ ctf=3; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+41 && my<eyofs+9+41 && !moving)\r
+ {\r
+ ctf=4; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+116 && mx<exofs+50+116 && my>eyofs+61 && my<eyofs+10+61 && !moving)\r
+ {\r
+ // insert code for button "CHR List" here\r
+ BigButtonPressed(exofs+116, eyofs+61, "CHR List");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ CHRList();\r
+// DoCHRdealy();\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+51 && my<eyofs+9+51 && !moving)\r
+ {\r
+ ctf=5; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+61 && my<eyofs+9+61 && !moving)\r
+ {\r
+ ctf=6; str=nstr5; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+115 && mx<exofs+50+115 && my>eyofs+153 && my<eyofs+10+153 && !moving)\r
+ {\r
+ // insert code for button "Scripts..." here\r
+ BigButtonPressed(exofs+115, eyofs+153, "Scripts");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ MoveScriptDialog();\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+161 && mx<exofs+8+161 && my>eyofs+87 && my<eyofs+7+87 && !moving)\r
+ {\r
+ entity[i].obsmode1 ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+161 && mx<exofs+8+161 && my>eyofs+78 && my<eyofs+7+78 && !moving)\r
+ {\r
+ entity[i].obsmode2 ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+61 && mx<exofs+8+61 && my>eyofs+78 && my<eyofs+7+78 && !moving)\r
+ {\r
+ entity[i].face ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+61 && mx<exofs+8+61 && my>eyofs+87 && my<eyofs+7+87 && !moving)\r
+ {\r
+ entity[i].actm ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+47 && mx<exofs+80+47 && my>eyofs+103 && my<eyofs+9+103 && !moving)\r
+ {\r
+ ctf=7; str=nstr6; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+115 && my<eyofs+9+115 && !moving)\r
+ {\r
+ ctf=8; str=nstr7; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+125 && my<eyofs+9+125 && !moving)\r
+ {\r
+ ctf=9; str=nstr8; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+135 && my<eyofs+9+135 && !moving)\r
+ {\r
+ ctf=10; str=nstr9; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+115 && my<eyofs+9+115 && !moving)\r
+ {\r
+ ctf=11; str=nstr10; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+125 && my<eyofs+9+125 && !moving)\r
+ {\r
+ ctf=12; str=nstr11; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+135 && my<eyofs+9+135 && !moving)\r
+ {\r
+ ctf=13; str=nstr12; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs+46 && mx<exofs+60+46 && my>eyofs+153 && my<eyofs+9+153 && !moving)\r
+ {\r
+ ctf=14; str=nstr13; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(exofs+exsize-9) && (mx<exofs+exsize-2)\r
+ && my>(eyofs+1) && (my<eyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>exofs && mx<exofs+exsize && my>eyofs && my<(eyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-exofs;\r
+ myo=my-eyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ entity[i].x=atoi(nstr1);\r
+ entity[i].y=atoi(nstr2);\r
+ entity[i].chrindex=atoi(nstr3);\r
+ entity[i].speed=atoi(nstr4);\r
+ entity[i].actscript=atoi(nstr5);\r
+ entity[i].movecode=atoi(nstr6);\r
+ entity[i].step=atoi(nstr7);\r
+ entity[i].data2=atoi(nstr8);\r
+ entity[i].data3=atoi(nstr9);\r
+ entity[i].delay=atoi(nstr10);\r
+ entity[i].data5=atoi(nstr11);\r
+ entity[i].data6=atoi(nstr12);\r
+ entity[i].movescript=atoi(nstr13);\r
+\r
+ if (i<entities-1) i++; else i=0;\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+\r
+ sprintf(nstr1, "%d", entity[i].x);\r
+ sprintf(nstr2, "%d", entity[i].y);\r
+ sprintf(nstr3, "%d", entity[i].chrindex);\r
+ sprintf(nstr4, "%d", entity[i].speed);\r
+ sprintf(nstr5, "%d", entity[i].actscript);\r
+ sprintf(nstr6, "%d", entity[i].movecode);\r
+ sprintf(nstr7, "%d", entity[i].step);\r
+ sprintf(nstr8, "%d", entity[i].data2);\r
+ sprintf(nstr9, "%d", entity[i].data3);\r
+ sprintf(nstr10, "%d", entity[i].delay);\r
+ sprintf(nstr11, "%d", entity[i].data5);\r
+ sprintf(nstr12, "%d", entity[i].data6);\r
+ sprintf(nstr13, "%d", entity[i].movescript);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ entity[i].x=atoi(nstr1);\r
+ entity[i].y=atoi(nstr2);\r
+ entity[i].chrindex=atoi(nstr3);\r
+ entity[i].speed=atoi(nstr4);\r
+ entity[i].actscript=atoi(nstr5);\r
+ entity[i].movecode=atoi(nstr6);\r
+ entity[i].step=atoi(nstr7);\r
+ entity[i].data2=atoi(nstr8);\r
+ entity[i].data3=atoi(nstr9);\r
+ entity[i].delay=atoi(nstr10);\r
+ entity[i].data5=atoi(nstr11);\r
+ entity[i].data6=atoi(nstr12);\r
+ entity[i].movescript=atoi(nstr13);\r
+\r
+ if (i) i--; else i=entities-1;\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+\r
+ sprintf(nstr1, "%d", entity[i].x);\r
+ sprintf(nstr2, "%d", entity[i].y);\r
+ sprintf(nstr3, "%d", entity[i].chrindex);\r
+ sprintf(nstr4, "%d", entity[i].speed);\r
+ sprintf(nstr5, "%d", entity[i].actscript);\r
+ sprintf(nstr6, "%d", entity[i].movecode);\r
+ sprintf(nstr7, "%d", entity[i].step);\r
+ sprintf(nstr8, "%d", entity[i].data2);\r
+ sprintf(nstr9, "%d", entity[i].data3);\r
+ sprintf(nstr10, "%d", entity[i].delay);\r
+ sprintf(nstr11, "%d", entity[i].data5);\r
+ sprintf(nstr12, "%d", entity[i].data6);\r
+ sprintf(nstr13, "%d", entity[i].movescript);\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=entity[i].desc; break;\r
+ case 1: ctf=2; str=nstr1; break;\r
+ case 2: ctf=3; str=nstr2; break;\r
+ case 3: ctf=4; str=nstr3; break;\r
+ case 4: ctf=5; str=nstr4; break;\r
+ case 5: ctf=6; str=nstr5; break;\r
+ case 6: ctf=7; str=nstr6; break;\r
+ case 7: ctf=8; str=nstr7; break;\r
+ case 8: ctf=9; str=nstr8; break;\r
+ case 9: ctf=10; str=nstr9; break;\r
+ case 10: ctf=11; str=nstr10; break;\r
+ case 11: ctf=12; str=nstr11; break;\r
+ case 12: ctf=13; str=nstr12; break;\r
+ case 13: ctf=14; str=nstr13; break;\r
+ case 14: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=13; str=nstr12; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=entity[i].desc; break;\r
+ case 3: ctf=2; str=nstr1; break;\r
+ case 4: ctf=3; str=nstr2; break;\r
+ case 5: ctf=4; str=nstr3; break;\r
+ case 6: ctf=5; str=nstr4; break;\r
+ case 7: ctf=6; str=nstr5; break;\r
+ case 8: ctf=7; str=nstr6; break;\r
+ case 9: ctf=8; str=nstr7; break;\r
+ case 10: ctf=9; str=nstr8; break;\r
+ case 11: ctf=10; str=nstr9; break;\r
+ case 12: ctf=11; str=nstr10; break;\r
+ case 13: ctf=12; str=nstr11; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ entity[i].x=atoi(nstr1);\r
+ entity[i].y=atoi(nstr2);\r
+ entity[i].chrindex=atoi(nstr3);\r
+ entity[i].speed=atoi(nstr4);\r
+ entity[i].actscript=atoi(nstr5);\r
+ entity[i].movecode=atoi(nstr6);\r
+ entity[i].step=atoi(nstr7);\r
+ entity[i].data2=atoi(nstr8);\r
+ entity[i].data3=atoi(nstr9);\r
+ entity[i].delay=atoi(nstr10);\r
+ entity[i].data5=atoi(nstr11);\r
+ entity[i].data6=atoi(nstr12);\r
+ entity[i].movescript=atoi(nstr13);\r
+}\r
+\r
+int clxsize=170, clysize=78;\r
+int clxofs=105, clyofs=80;\r
+char base=0;\r
+\r
+void CHRList()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ clxofs = (mx-mxo);\r
+ clyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (clxofs<16) clxofs = 16;\r
+ if (clyofs<16) clyofs = 16;\r
+ if (clxofs+clxsize>335) clxofs = 336-clxsize;\r
+ if (clyofs+clysize>sy+16) clyofs = (sy+16)-clysize;\r
+ }\r
+\r
+ Window(clxofs, clyofs, clxofs+clxsize, clyofs+clysize, "Entity CHR Reference Index");\r
+ TextField(clxofs+14, clyofs+11, 120, chrlist[base].t, ctf == 1 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+22, 120, chrlist[base+1].t, ctf == 2 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+33, 120, chrlist[base+2].t, ctf == 3 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+44, 120, chrlist[base+3].t, ctf == 4 ? cb : 0);\r
+ TextField(clxofs+14, clyofs+55, 120, chrlist[base+4].t, ctf == 5 ? cb : 0);\r
+ Button(clxofs+137, clyofs+65, "OK");\r
+ Button(clxofs+137, clyofs+10, "Browse");\r
+ Button(clxofs+137, clyofs+21, "Browse");\r
+ Button(clxofs+137, clyofs+32, "Browse");\r
+ Button(clxofs+137, clyofs+43, "Browse");\r
+ Button(clxofs+137, clyofs+54, "Browse");\r
+ GotoXY(clxofs+3, clyofs+11); sprintf(strbuf,"%d:", base); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+22); sprintf(strbuf,"%d:", base+1); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+33); sprintf(strbuf,"%d:", base+2); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+44); sprintf(strbuf,"%d:", base+3); printstring(strbuf);\r
+ GotoXY(clxofs+3, clyofs+55); sprintf(strbuf,"%d:", base+4); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+11 && my<clyofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=chrlist[base].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+22 && my<clyofs+9+22 && !moving)\r
+ {\r
+ ctf=2; str=chrlist[base+1].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+33 && my<clyofs+9+33 && !moving)\r
+ {\r
+ ctf=3; str=chrlist[base+2].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+44 && my<clyofs+9+44 && !moving)\r
+ {\r
+ ctf=4; str=chrlist[base+3].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+55 && my<clyofs+9+55 && !moving)\r
+ {\r
+ ctf=5; str=chrlist[base+4].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+65 && my<clyofs+10+65 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(clxofs+137, clyofs+65, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+10 && my<clyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+10, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+21 && my<clyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+21, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+1].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+32 && my<clyofs+10+32 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+32, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+2].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+43 && my<clyofs+10+43 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+43, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+3].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+54 && my<clyofs+10+54 && !moving)\r
+ {\r
+ // insert code for button "Browse" here\r
+ ButtonPressed(clxofs+137, clyofs+54, "Browse");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ Browse(1,"*.chr","","","",chrlist[base+4].t);\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(clxofs+clxsize-9) && (mx<clxofs+clxsize-2)\r
+ && my>(clyofs+1) && (my<clyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>clxofs && mx<clxofs+clxsize && my>clyofs && my<(clyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-clxofs;\r
+ myo=my-clyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ key[SCAN_UP]=0;\r
+ if (base) base--;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ key[SCAN_DOWN]=0;\r
+ if (base<95) base++;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=chrlist[base].t; break;\r
+ case 1: ctf=2; str=chrlist[base+1].t; break;\r
+ case 2: ctf=3; str=chrlist[base+2].t; break;\r
+ case 3: ctf=4; str=chrlist[base+3].t; break;\r
+ case 4: ctf=5; str=chrlist[base+4].t; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=chrlist[base].t; break;\r
+ case 1: ctf=0; str=chrlist[base].t; break;\r
+ case 2: ctf=1; str=chrlist[base+1].t; break;\r
+ case 3: ctf=2; str=chrlist[base+2].t; break;\r
+ case 4: ctf=3; str=chrlist[base+3].t; break;\r
+ case 5: ctf=4; str=chrlist[base+4].t; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int msxsize=181, msysize=77;\r
+int msxofs=70, msyofs=50;\r
+char base1=0;\r
+\r
+void MoveScriptDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ msxofs = (mx-mxo);\r
+ msyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (msxofs<16) msxofs = 16;\r
+ if (msyofs<16) msyofs = 16;\r
+ if (msxofs+msxsize>335) msxofs = 336-msxsize;\r
+ if (msyofs+msysize>sy+16) msyofs = (sy+16)-msysize;\r
+ }\r
+\r
+ Window(msxofs, msyofs, msxofs+msxsize, msyofs+msysize, "Movement Script Editor");\r
+ TextField(msxofs+15, msyofs+12, 160, ms[base1].t, ctf == 1 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+22, 160, ms[base1+1].t, ctf == 2 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+32, 160, ms[base1+2].t, ctf == 3 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+42, 160, ms[base1+3].t, ctf == 4 ? cb : 0);\r
+ TextField(msxofs+15, msyofs+52, 160, ms[base1+4].t, ctf == 5 ? cb : 0);\r
+ Button(msxofs+146, msyofs+63, "OK");\r
+ GotoXY(msxofs+3, msyofs+11); sprintf(strbuf,"%d:", base1); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+22); sprintf(strbuf,"%d:", base1+1); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+33); sprintf(strbuf,"%d:", base1+2); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+44); sprintf(strbuf,"%d:", base1+3); printstring(strbuf);\r
+ GotoXY(msxofs+3, msyofs+55); sprintf(strbuf,"%d:", base1+4); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+12 && my<msyofs+10+12 && !moving)\r
+ {\r
+ ctf=1; str=ms[base1].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+22 && my<msyofs+9+22 && !moving)\r
+ {\r
+ ctf=2; str=ms[base1+1].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+32 && my<msyofs+9+32 && !moving)\r
+ {\r
+ ctf=3; str=ms[base1+2].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+42 && my<msyofs+9+42 && !moving)\r
+ {\r
+ ctf=4; str=ms[base1+3].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+52 && my<msyofs+9+52 && !moving)\r
+ {\r
+ ctf=5; str=ms[base1+4].t; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>msxofs+146 && mx<msxofs+30+146 && my>msyofs+63 && my<msyofs+10+63 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(msxofs+146, msyofs+63, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(msxofs+msxsize-9) && (mx<msxofs+msxsize-2)\r
+ && my>(msyofs+1) && (my<msyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>msxofs && mx<msxofs+msxsize && my>msyofs && my<(msyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-msxofs;\r
+ myo=my-msyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ key[SCAN_UP]=0;\r
+ if (base1) base1--;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ key[SCAN_DOWN]=0;\r
+ if (base1<95) base1++;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=ms[base1].t; break;\r
+ case 1: ctf=2; str=ms[base1+1].t; break;\r
+ case 2: ctf=3; str=ms[base1+2].t; break;\r
+ case 3: ctf=4; str=ms[base1+3].t; break;\r
+ case 4: ctf=5; str=ms[base1+4].t; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=ms[base1+4].t; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=ms[base1].t; break;\r
+ case 3: ctf=2; str=ms[base1+1].t; break;\r
+ case 4: ctf=3; str=ms[base1+2].t; break;\r
+ case 5: ctf=4; str=ms[base1+3].t; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int prxsize=150, prysize=80;\r
+int prxofs=50, pryofs=60;\r
+\r
+void MapPropertiesDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ prxofs = (mx-mxo);\r
+ pryofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (prxofs<16) prxofs = 16;\r
+ if (pryofs<16) pryofs = 16;\r
+ if (prxofs+prxsize>335) prxofs = 336-prxsize;\r
+ if (pryofs+prysize>sy+16) pryofs = (sy+16)-prysize;\r
+ }\r
+\r
+ Window(prxofs, pryofs, prxofs+prxsize, pryofs+prysize, "MAP Properties");\r
+ GotoXY(prxofs+10, pryofs+23); printstring("Music:");\r
+ TextField(prxofs+33, pryofs+11, 112, mapname, ctf == 1 ? cb : 0);\r
+ TextField(prxofs+33, pryofs+21, 112, musname, ctf == 2 ? cb : 0);\r
+ GotoXY(prxofs+18, pryofs+33); printstring("VSP:");\r
+ TextField(prxofs+33, pryofs+31, 112, vspname, ctf == 3 ? cb : 0);\r
+ GotoXY(prxofs+3, pryofs+43); printstring("rstring:");\r
+ TextField(prxofs+33, pryofs+41, 112, rstring, ctf == 4 ? cb : 0);\r
+ BigButton(prxofs+97, pryofs+56, "Resize MAP");\r
+ HLine(prxofs+1, pryofs+53, 148, white);\r
+ GotoXY(prxofs+3, pryofs+58); printstring("xsize:");\r
+ sprintf(strbuf,"%d",layer[0].sizex); printstring(strbuf);\r
+ GotoXY(prxofs+49, pryofs+58); printstring("ysize:");\r
+ sprintf(strbuf,"%d",layer[0].sizey); printstring(strbuf);\r
+ Button(prxofs+117, pryofs+67, "OK");\r
+ GotoXY(prxofs+16, pryofs+13); printstring("MAP:");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+11 && my<pryofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=mapname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+21 && my<pryofs+9+21 && !moving)\r
+ {\r
+ ctf=2; str=musname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+31 && my<pryofs+9+31 && !moving)\r
+ {\r
+ ctf=3; str=vspname; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+41 && my<pryofs+9+41 && !moving)\r
+ {\r
+ ctf=4; str=rstring; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs+97 && mx<prxofs+30+97 && my>pryofs+56 && my<pryofs+10+56 && !moving)\r
+ {\r
+ // insert code for button "Resize MAP" here\r
+ BigButtonPressed(prxofs+97, pryofs+56, "Resize MAP");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease();\r
+ ResizeMapDialog();\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>prxofs+117 && mx<prxofs+30+117 && my>pryofs+67 && my<pryofs+10+67 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(prxofs+117, pryofs+67, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(prxofs+prxsize-9) && (mx<prxofs+prxsize-2)\r
+ && my>(pryofs+1) && (my<pryofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>prxofs && mx<prxofs+prxsize && my>pryofs && my<(pryofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-prxofs;\r
+ myo=my-pryofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=mapname; break;\r
+ case 1: ctf=2; str=musname; break;\r
+ case 2: ctf=3; str=vspname; break;\r
+ case 3: ctf=4; str=rstring; break;\r
+ case 4: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=4; str=rstring; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=mapname; break;\r
+ case 3: ctf=2; str=musname; break;\r
+ case 4: ctf=3; str=vspname; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+\r
+ } while (!done);\r
+\r
+}\r
+\r
+int rsxsize=134, rsysize=44;\r
+int rsxofs=20, rsyofs=20;\r
+\r
+static void PutByte(byte *to, byte v, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return;\r
+\r
+ to[(y*w)+x]=v;\r
+}\r
+\r
+static byte GetByte(byte *from, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return 0;\r
+\r
+ return from[(y*w)+x];\r
+}\r
+\r
+static void PutWord(word *to, word v, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return;\r
+\r
+ to[(y*w)+x]=v;\r
+}\r
+\r
+static word GetWord(word *from, int x, int y, int w, int h)\r
+{\r
+ if (x<0 || x>=w || y<0 || y>=h)\r
+ return 0;\r
+\r
+ return from[(y*w)+x];\r
+}\r
+\r
+void ResizeMapDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, basex, basey, i; //, xl, yl;\r
+ char ctf=0, cb=0, c, t;\r
+ char *str, *tb; //, *s1, *d1;\r
+ char nstr1[80], nstr2[80];\r
+ word *tbw; //, *s=NULL,*d=NULL;\r
+ //int temp_width;\r
+ int a,b;\r
+\r
+ basex=layer[0].sizex;\r
+ basey=layer[0].sizey;\r
+ sprintf(nstr1, "%d", basex);\r
+ sprintf(nstr2, "%d", basey);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ rsxofs = (mx-mxo);\r
+ rsyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (rsxofs<16) rsxofs = 16;\r
+ if (rsyofs<16) rsyofs = 16;\r
+ if (rsxofs+rsxsize>335) rsxofs = 336-rsxsize;\r
+ if (rsyofs+rsysize>sy+16) rsyofs = (sy+16)-rsysize;\r
+ }\r
+\r
+ Window(rsxofs, rsyofs, rsxofs+rsxsize, rsyofs+rsysize, "Resize MAP");\r
+ GotoXY(rsxofs+4, rsyofs+12); printstring("Base X:");\r
+ GotoXY(rsxofs+4, rsyofs+22); printstring("Base Y:");\r
+ TextField(rsxofs+30, rsyofs+10, 100, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(rsxofs+30, rsyofs+20, 100, nstr2, ctf == 2 ? cb : 0);\r
+ Button(rsxofs+69, rsyofs+31, "Resize");\r
+ Button(rsxofs+101, rsyofs+31, "Cancel");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>rsxofs+30 && mx<rsxofs+100+30 && my>rsyofs+10 && my<rsyofs+9+10 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs+30 && mx<rsxofs+100+30 && my>rsyofs+20 && my<rsyofs+9+20 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs+69 && mx<rsxofs+30+69 && my>rsyofs+31 && my<rsyofs+10+31 && !moving)\r
+ {\r
+ printf("&");\r
+ fflush(stdout);\r
+ // insert code for button "Resize" here\r
+ ButtonPressed(rsxofs+69, rsyofs+31, "Resize");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ basex=atoi(nstr1);\r
+ basey=atoi(nstr2);\r
+\r
+ tb = (char *)valloc(basex*basey,"tilebuf",0);\r
+ for (b=0; b<basey; ++b)\r
+ for (a=0; a<basex; ++a)\r
+ PutByte(tb,\r
+ GetByte(obstruct,a,b,layer[0].sizex,layer[0].sizey),\r
+ a,b,basex,basey);\r
+ vfree(obstruct);\r
+ obstruct=tb;\r
+\r
+ tb = (char *)valloc(basex*basey,"tilebuf",0);\r
+ for (b=0; b<basey; ++b)\r
+ for (a=0; a<basex; ++a)\r
+ PutByte(tb,\r
+ GetByte(zone,a,b,layer[0].sizex,layer[0].sizey),\r
+ a,b,basex,basey);\r
+ vfree(zone);\r
+ zone=tb;\r
+\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ tbw=(word *)valloc(basex*basey*2,"tilebuf",0);\r
+ //memset(tbw, 0, basex*basey*2);\r
+ for (b=0; b<basey; ++b)\r
+ for (a=0; a<basex; ++a)\r
+ PutWord(tbw,\r
+ GetWord(layers[i],a,b,layer[i].sizex,layer[i].sizey),\r
+ a,b,basex,basey);\r
+\r
+ vfree(layers[i]);\r
+ layers[i]=tbw;\r
+ }\r
+ for (i=0; i<numlayers; ++i)\r
+ {\r
+ layer[i].sizex=basex;\r
+ layer[i].sizey=basey;\r
+ }\r
+ xwin=0; ywin=0;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs+101 && mx<rsxofs+30+101 && my>rsyofs+31 && my<rsyofs+10+31 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ done=1;\r
+ ButtonPressed(rsxofs+101, rsyofs+31, "Cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(rsxofs+rsxsize-9) && (mx<rsxofs+rsxsize-2)\r
+ && my>(rsyofs+1) && (my<rsyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>rsxofs && mx<rsxofs+rsxsize && my>rsyofs && my<(rsyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-rsxofs;\r
+ myo=my-rsyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=2; str=nstr2; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ basex=atoi(nstr1);\r
+ basey=atoi(nstr2);\r
+}\r
+\r
+int cdxsize=150, cdysize=45;\r
+int cdxofs=110, cdyofs=70;\r
+char curtrack=1;\r
+\r
+void CDDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ cdxofs = (mx-mxo);\r
+ cdyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (cdxofs<16) cdxofs = 16;\r
+ if (cdyofs<16) cdyofs = 16;\r
+ if (cdxofs+cdxsize>335) cdxofs = 336-cdxsize;\r
+ if (cdyofs+cdysize>sy+16) cdyofs = (sy+16)-cdysize;\r
+ }\r
+\r
+ Window(cdxofs, cdyofs, cdxofs+cdxsize, cdyofs+cdysize, "CD Player");\r
+ Button(cdxofs+53, cdyofs+10, "Play");\r
+ Button(cdxofs+53, cdyofs+21, "Stop");\r
+ Button(cdxofs+85, cdyofs+10, "Eject");\r
+ Button(cdxofs+85, cdyofs+21, "Close");\r
+ Button(cdxofs+117, cdyofs+10, "Next");\r
+ Button(cdxofs+117, cdyofs+21, "Prev");\r
+ Button(cdxofs+117, cdyofs+32, "OK");\r
+ GotoXY(cdxofs+4, cdyofs+18); printstring("Track ");\r
+ sprintf(strbuf,"%d",curtrack); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>cdxofs+53 && mx<cdxofs+30+53 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Play" here\r
+ ButtonPressed(cdxofs+53, cdyofs+10, "Play");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Play(curtrack);\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+53 && mx<cdxofs+30+53 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Stop" here\r
+ ButtonPressed(cdxofs+53, cdyofs+21, "Stop");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Stop();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+85 && mx<cdxofs+30+85 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Eject" here\r
+ ButtonPressed(cdxofs+85, cdyofs+10, "Eject");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Open_Door();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+85 && mx<cdxofs+30+85 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Close" here\r
+ ButtonPressed(cdxofs+85, cdyofs+21, "Close");\r
+ DrawMouse();\r
+ ShowPage();\r
+ //CD_Close_Door();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
+ {\r
+ // insert code for button "Next" here\r
+ ButtonPressed(cdxofs+117, cdyofs+10, "Next");\r
+ curtrack++;\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
+ {\r
+ // insert code for button "Prev" here\r
+ ButtonPressed(cdxofs+117, cdyofs+21, "Prev");\r
+ DrawMouse();\r
+ if (curtrack>1) curtrack--;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+32 && my<cdyofs+10+32 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(cdxofs+117, cdyofs+32, "OK");\r
+ DrawMouse();\r
+ done=1;\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(cdxofs+cdxsize-9) && (mx<cdxofs+cdxsize-2)\r
+ && my>(cdyofs+1) && (my<cdyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>cdxofs && mx<cdxofs+cdxsize && my>cdyofs && my<(cdyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-cdxofs;\r
+ myo=my-cdyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int ntxsize=130, nytsize=51;\r
+int ntxofs=110, ntyofs=70;\r
+\r
+void NoticeDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ ntxofs = (mx-mxo);\r
+ ntyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (ntxofs<16) ntxofs = 16;\r
+ if (ntyofs<16) ntyofs = 16;\r
+ if (ntxofs+ntxsize>335) ntxofs = 336-ntxsize;\r
+ if (ntyofs+nytsize>sy+16) ntyofs = (sy+16)-nytsize;\r
+ }\r
+\r
+ Window(ntxofs, ntyofs, ntxofs+ntxsize, ntyofs+nytsize, "Notice!");\r
+ GotoXY(ntxofs+20, ntyofs+20); printstring("Don't forget to add this");\r
+ GotoXY(ntxofs+14, ntyofs+26); printstring("layer to the Render String!");\r
+ Button(ntxofs+50, ntyofs+36, "OK");\r
+ GotoXY(ntxofs+25, ntyofs+14); printstring("Layer has been added.");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>ntxofs+50 && mx<ntxofs+30+50 && my>ntyofs+36 && my<ntyofs+10+36 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(ntxofs+50, ntyofs+36, "OK");\r
+ done=1;\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(ntxofs+ntxsize-9) && (mx<ntxofs+ntxsize-2)\r
+ && my>(ntyofs+1) && (my<ntyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>ntxofs && mx<ntxofs+ntxsize && my>ntyofs && my<(ntyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-ntxofs;\r
+ myo=my-ntyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+int oxsize=150, oysize=98;\r
+int oxofs=120, oyofs=70;\r
+extern char vcedprog[80];\r
+\r
+void OptionsDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ sprintf(nstr1, "%d", winbg);\r
+ sprintf(nstr2, "%d", titlebg);\r
+ sprintf(nstr3, "%d", brightw);\r
+ sprintf(nstr4, "%d", darkw);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ oxofs = (mx-mxo);\r
+ oyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (oxofs<16) oxofs = 16;\r
+ if (oyofs<16) oyofs = 16;\r
+ if (oxofs+oxsize>335) oxofs = 336-oxsize;\r
+ if (oyofs+oysize>sy+16) oyofs = (sy+16)-oysize;\r
+ }\r
+\r
+ Window(oxofs, oyofs, oxofs+oxsize, oyofs+oysize, "MapEd Options");\r
+ GotoXY(oxofs+16, oyofs+12); printstring("Smooth Scroll");\r
+ CheckBox(oxofs+5, oyofs+11, scrollmode);\r
+ GotoXY(oxofs+16, oyofs+20); printstring("Tile Highlight");\r
+ CheckBox(oxofs+5, oyofs+19, mh);\r
+ GotoXY(oxofs+38, oyofs+31); printstring("Window Background");\r
+ TextField(oxofs+5, oyofs+29, 30, nstr1, ctf == 1 ? cb : 0);\r
+ TextField(oxofs+5, oyofs+39, 30, nstr2, ctf == 2 ? cb : 0);\r
+ GotoXY(oxofs+38, oyofs+41); printstring("Titlebar Background");\r
+ CheckBox(oxofs+74, oyofs+11, vm);\r
+ GotoXY(oxofs+84, oyofs+12); printstring("320x240 driver");\r
+ CheckBox(oxofs+74, oyofs+19, mouse_scroll);\r
+ GotoXY(oxofs+84, oyofs+20); printstring("Mouse Scrolling");\r
+ TextField(oxofs+5, oyofs+49, 30, nstr3, ctf == 3 ? cb : 0);\r
+ TextField(oxofs+5, oyofs+59, 30, nstr4, ctf == 4 ? cb : 0);\r
+ GotoXY(oxofs+38, oyofs+51); printstring("White");\r
+ GotoXY(oxofs+38, oyofs+61); printstring("Shadow");\r
+ Button(oxofs+60, oyofs+85, "OK");\r
+ HLine(oxofs+1, oyofs+71, 148, white);\r
+ GotoXY(oxofs+3, oyofs+76); printstring("Editor:");\r
+ TextField(oxofs+28, oyofs+74, 118, vcedprog, ctf == 5 ? cb : 0);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+8+5 && my>oyofs+11 && my<oyofs+7+11 && !moving)\r
+ {\r
+ xwin=xwin>>4; xwin=xwin<<4;\r
+ ywin=ywin>>4; ywin=ywin<<4;\r
+ scrollmode ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+8+5 && my>oyofs+19 && my<oyofs+7+19 && !moving)\r
+ {\r
+ mh ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+29 && my<oyofs+9+29 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+39 && my<oyofs+9+39 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+74 && mx<oxofs+8+74 && my>oyofs+11 && my<oyofs+7+11 && !moving)\r
+ {\r
+ vm ^= 1; WaitRelease();\r
+ ShutdownVideo();\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+74 && mx<oxofs+8+74 && my>oyofs+19 && my<oyofs+7+19 && !moving)\r
+ {\r
+ mouse_scroll ^= 1; WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+49 && my<oyofs+9+49 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+59 && my<oyofs+9+59 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>oxofs+60 && mx<oxofs+30+60 && my>oyofs+85 && my<oyofs+10+85 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(oxofs+60, oyofs+85, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs+28 && mx<oxofs+118+28 && my>oyofs+74 && my<oyofs+9+74 && !moving)\r
+ {\r
+ ctf=5; str=vcedprog; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(oxofs+oxsize-9) && (mx<oxofs+oxsize-2)\r
+ && my>(oyofs+1) && (my<oyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>oxofs && mx<oxofs+oxsize && my>oyofs && my<(oyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-oxofs;\r
+ myo=my-oyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=5; str=vcedprog; break;\r
+ case 5: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=5; str=vcedprog; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ case 5: ctf=4; str=nstr4; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ winbg=atoi(nstr1);\r
+ titlebg=atoi(nstr2);\r
+ brightw=atoi(nstr3);\r
+ darkw=atoi(nstr4);\r
+}\r
+\r
+int vcexsize=200, vceysize=60;\r
+int vcexofs=76, vceyofs=70;\r
+\r
+void VCNotify(char *msg)\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ vcexofs = (mx-mxo);\r
+ vceyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (vcexofs<16) vcexofs = 16;\r
+ if (vceyofs<16) vceyofs = 16;\r
+ if (vcexofs+vcexsize>335) vcexofs = 336-vcexsize;\r
+ if (vceyofs+vceysize>sy+16) vceyofs = (sy+16)-vceysize;\r
+ }\r
+\r
+ Window(vcexofs, vceyofs, vcexofs+vcexsize, vceyofs+vceysize, "VergeC Error Report");\r
+ Button(vcexofs+85, vceyofs+41, "OK");\r
+ GotoXY(vcexofs+29, vceyofs+17); printstring("VCC has reported the following error:");\r
+ GotoXY(vcexofs+100-(pixels(msg)/2), vceyofs+23); printstring(msg);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if ((mb==1 && mx>vcexofs+85 && mx<vcexofs+30+85 && my>vceyofs+41 && my<vceyofs+10+41 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ ButtonPressed(vcexofs+85, vceyofs+41, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(vcexofs+vcexsize-9) && (mx<vcexofs+vcexsize-2)\r
+ && my>(vceyofs+1) && (my<vceyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>vcexofs && mx<vcexofs+vcexsize && my>vceyofs && my<(vceyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-vcexofs;\r
+ myo=my-vceyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef GUI_INC\r
+#define GUI_INC\r
+\r
+extern int amxofs, amyofs;\r
+extern int mmxofs, mmyofs;\r
+extern int cnxofs, cnyofs;\r
+extern int lmxofs, lmyofs;\r
+extern int lvxofs, lvyofs;\r
+extern int vaxofs, vayofs;\r
+extern int mpxofs, mpyofs;\r
+extern int zexofs, zeyofs;\r
+extern int exofs, eyofs;\r
+extern int prxofs, pryofs;\r
+extern int rsxofs, rsyofs;\r
+\r
+extern void CheckMessageExpirations();\r
+extern void Message(char *text, int duration);\r
+extern void DrawScreenControls();\r
+extern void RenderMessages();\r
+extern void RenderGUI();\r
+extern void DoMainMenu();\r
+extern void MainMenu(int dx, int dy);\r
+#define byte unsigned char\r
+extern byte TileCmp(byte *one, byte *two);\r
+extern void ImageToLayer();\r
+extern void Destroyer();\r
+extern void LayersSubMenu(int dx, int dy);\r
+extern void ExecuteSubMenu(int dx, int dy);\r
+extern void AddLayer();\r
+extern void EditLayerProperties();\r
+extern void NewMAP();\r
+extern void About();\r
+extern int Confirm(char *message);\r
+extern void LoadMAPDialog();\r
+extern void LoadVSPDialog();\r
+extern void MPDialog();\r
+extern void ZoneEdDialog();\r
+extern void EntityEditor(int i);\r
+extern void CHRList();\r
+extern void MoveScriptDialog();\r
+extern void MapPropertiesDialog();\r
+extern void ResizeMapDialog();\r
+extern void CDDialog();\r
+extern void NoticeDialog();\r
+extern void OptionsDialog();\r
+extern void VCNotify(char *msg);\r
+\r
+#endif // GUI_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Additional code by Richard Lau (aka Ric)\r
+\r
+#include "config.h" // Colour definitions\r
+#include "vdriver.h" // Video driver functions\r
+#include "smalfont.h"\r
+\r
+// ================================= Code ====================================\r
+\r
+void stdwindow(int x1, int y1, int x2, int y2)\r
+{\r
+ FilledBox(x1, y1, x2-x1, y2-y1, winbg);\r
+ HLine(x1, y1, x2-x1, black); /* -- ric: 13/Jun/98 -- */\r
+ VLine(x1, y1, y2-y1, black); /* Outline window in black */\r
+ HLine(x1+1, y2-1, x2-x1-1, black);\r
+ VLine(x2-1, y1+1, y2-y1-1, black);\r
+\r
+ HLine(x1+1, y1+1, x2-x1-2, brightw);\r
+ VLine(x1+1, y1+1, y2-y1-2, brightw);\r
+ HLine(x1+2, y2-2, x2-x1-3, darkw);\r
+ VLine(x2-2, y1+2, y2-y1-3, darkw);\r
+}\r
+\r
+void Window(int x1, int y1, int x2, int y2, char *title)\r
+{\r
+ FilledBox(x1, y1, x2-x1, y2-y1, winbg);\r
+ FilledBox(x1, y1, x2-x1, 8, titlebg);\r
+ HLine(x1, y1, x2-x1, brightw);\r
+ VLine(x1, y1, y2-y1, brightw);\r
+ HLine(x1+1, y2-1, x2-x1-1, darkw);\r
+ VLine(x2-1, y1+1, y2-y1-1, darkw);\r
+ FilledBox(x2-8, y1+2, 5, 5, winbg);\r
+ HLine(x2-8, y1+2, 6, brightw);\r
+ VLine(x2-8, y1+2, 5, brightw);\r
+ HLine(x2-7, y1+6, 4, darkw);\r
+ VLine(x2-3, y1+3, 4, darkw);\r
+\r
+ GotoXY(x1+2, y1+2);\r
+ printstring(title);\r
+}\r
+\r
+void CheckBox(int x, int y, char checked)\r
+{\r
+ FilledBox(x, y, 7, 6, 0);\r
+ HLine(x, y, 8, darkw);\r
+ VLine(x, y, 7, darkw);\r
+ HLine(x+1, y+6, 7, brightw);\r
+ VLine(x+7, y+1, 5, brightw);\r
+ if (checked)\r
+ {\r
+ GotoXY(x+2, y+2);\r
+ printstring("*");\r
+ }\r
+}\r
+\r
+void Button(int x, int y, char *str)\r
+{\r
+ stdwindow(x,y,x+30,y+10);\r
+// HLine(x, y, 30, black); /* -- ric: 13/Jun/98 -- */\r
+// VLine(x, y, 10, black); /* Outline buttons in black */\r
+/* HLine(x+1, y+9, 29, black);\r
+ VLine(x+29, y+1, 9, black);\r
+\r
+ HLine(x+1, y+1, 28, white);\r
+ VLine(x+1, y+1, 8, white);\r
+ HLine(x+2, y+8, 27, darkw);\r
+ VLine(x+28, y+2, 7, darkw); */\r
+ GotoXY(x+(15-(pixels(str)/2)), y+2);\r
+ printstring(str);\r
+}\r
+\r
+void BigButton(int x, int y, char *str)\r
+{\r
+ stdwindow(x,y,x+50,y+10);\r
+// HLine(x, y, 50, black); /* -- ric: 13/Jun/98 -- */\r
+// VLine(x, y, 10, black); /* Outline buttons in black */\r
+/* HLine(x+1, y+9, 49, black);\r
+ VLine(x+49, y+1, 9, black);\r
+\r
+ HLine(x+1, y+1, 48, white);\r
+ VLine(x+1, y+1, 8, white);\r
+ HLine(x+2, y+8, 47, darkw);\r
+ VLine(x+48, y+2, 7, darkw); */\r
+ GotoXY(x+(25-(pixels(str)/2)), y+2);\r
+ printstring(str);\r
+}\r
+\r
+void ButtonPressed(int x, int y, char *str)\r
+/* -- ric: 13/Jun/98 -- */\r
+/* Draws a depressed button */\r
+{\r
+ stdwindow(x,y,x+30,y+10);\r
+ HLine(x+1, y+1, 28, darkw);\r
+ VLine(x+1, y+1, 8, darkw);\r
+ HLine(x+2, y+8, 27, winbg);\r
+ VLine(x+28, y+2, 7, winbg);\r
+ GotoXY(x+1+(15-(pixels(str)/2)), y+3);\r
+ printstring(str);\r
+}\r
+\r
+void BigButtonPressed(int x, int y, char *str)\r
+{\r
+ stdwindow(x,y,x+50,y+10);\r
+ HLine(x+1, y+1, 48, darkw);\r
+ VLine(x+1, y+1, 8, darkw);\r
+ HLine(x+2, y+8, 47, winbg);\r
+ VLine(x+48, y+2, 7, winbg);\r
+ GotoXY(x+1+(25-(pixels(str)/2)), y+3);\r
+ printstring(str);\r
+}\r
+\r
+void TextField(int x, int y, int width, char *str, char blink)\r
+{\r
+ FilledBox(x, y, width, 9, 0);\r
+ HLine(x, y, width+1, darkw);\r
+ VLine(x, y, 9, darkw);\r
+ HLine(x+1, y+8, width-1, brightw);\r
+ VLine(x+width, y+1, 8, brightw);\r
+ GotoXY(x+2, y+2);\r
+ printstring(str);\r
+ if (blink) printstring("_");\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef GUICOMP_INC\r
+#define GUICOMP_INC\r
+\r
+extern void stdwindow(int x1, int y1, int x2, int y2);\r
+extern void Window(int x1, int y1, int x2, int y2, char *title);\r
+extern void CheckBox(int x, int y, char checked);\r
+extern void Button(int x, int y, char *str);\r
+extern void BigButton(int x, int y, char *str);\r
+extern void ButtonPressed(int x, int y, char *str);\r
+extern void BigButtonPressed(int x, int y, char *str);\r
+extern void TextField(int x, int y, int width, char *str, char blink);\r
+\r
+#endif // GUICOMP_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(INTERINC)\r
+#define INTERINC\r
+\r
+#ifdef __WATCOMC__\r
+ #include <i86.h>\r
+ #define REGISTERS union REGS\r
+ #define SET_AX(r,v) (r).w.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).w.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).w.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).w.dx=(short)(v)\r
+ #define INTERRUPT(i,r) int386((i),&(r),&(r))\r
+#elif defined(__DJGPP__)\r
+ #include <dpmi.h>\r
+ #define REGISTERS __dpmi_regs\r
+ #define SET_AX(r,v) (r).x.ax=(short)(v)\r
+ #define SET_BX(r,v) (r).x.bx=(short)(v)\r
+ #define SET_CX(r,v) (r).x.cx=(short)(v)\r
+ #define SET_DX(r,v) (r).x.dx=(short)(v)\r
+ #define INTERRUPT(i,r) __dpmi_int((i),&(r))\r
+#endif // watcom | djgpp\r
+\r
+#endif // INTERINC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <conio.h>\r
+#include <dos.h>\r
+#include "timer.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+char key[128];\r
+char keycode,last_pressed=0;\r
+char codeBuffer[16];\r
+void (__interrupt __far *biosKeyboardHandler)();\r
+char handlerinstalled=0;\r
+\r
+unsigned char key_ascii_tbl[128] =\r
+{\r
+ 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8, 9,\r
+ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 13, 0, 'a', 's',\r
+ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 39, 0, 0, 92, 'z', 'x', 'c', 'v',\r
+ 'b', 'n', 'm', ',', '.', '/', 0, '*', 0, ' ', 0, 3, 3, 3, 3, 8,\r
+ 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 0, 127, 0, 0, 92, 3, 3, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+unsigned char key_shift_tbl[128] =\r
+{\r
+ 0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 126, 126,\r
+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 126, 0, 'A', 'S',\r
+ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', 34, 0, 0, '|', 'Z', 'X', 'C', 'V',\r
+ 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, 1, 0, 1, 1, 1, 1, 1,\r
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,\r
+ 0, 0, 1, 127, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,\r
+ 13, 0, '/', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', 0, 0, 0, 0, 0\r
+};\r
+\r
+// ================================= Data ====================================\r
+\r
+void __interrupt __far KeyboardHandler()\r
+{\r
+ keycode=inp(0x60);\r
+ if (keycode>128)\r
+ key[keycode-128]=0;\r
+ else\r
+ {\r
+ key[keycode]=1;\r
+ last_pressed=keycode;\r
+ }\r
+ idlect=0;\r
+ outp(0x20,0x20);\r
+}\r
+\r
+void InitKeyboard()\r
+{\r
+ if (handlerinstalled) return;\r
+\r
+ biosKeyboardHandler=_dos_getvect(0x09);\r
+ _dos_setvect(0x09, KeyboardHandler);\r
+ handlerinstalled=1;\r
+}\r
+\r
+void ShutdownKeyboard()\r
+{\r
+ if (handlerinstalled)\r
+ _dos_setvect(0x09, biosKeyboardHandler);\r
+ handlerinstalled=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef KEYBOARD_INC\r
+#define KEYBOARD_INC\r
+\r
+extern char key[128],last_pressed;\r
+extern unsigned char key_ascii_tbl[128];\r
+extern unsigned char key_shift_tbl[128];\r
+\r
+extern void InitKeyboard();\r
+extern void ShutdownKeyboard();\r
+\r
+/* Constants for keyboard scan-codes */\r
+\r
+#define SCAN_ESC 0x01\r
+#define SCAN_1 0x02\r
+#define SCAN_2 0x03\r
+#define SCAN_3 0x04\r
+#define SCAN_4 0x05\r
+#define SCAN_5 0x06\r
+#define SCAN_6 0x07\r
+#define SCAN_7 0x08\r
+#define SCAN_8 0x09\r
+#define SCAN_9 0x0a\r
+#define SCAN_0 0x0b\r
+#define SCAN_MINUS 0x0c\r
+#define SCAN_EQUALS 0x0d\r
+#define SCAN_BACKSP 0x0e\r
+#define SCAN_TAB 0x0f\r
+#define SCAN_Q 0x10\r
+#define SCAN_W 0x11\r
+#define SCAN_E 0x12\r
+#define SCAN_R 0x13\r
+#define SCAN_T 0x14\r
+#define SCAN_Y 0x15\r
+#define SCAN_U 0x16\r
+#define SCAN_I 0x17\r
+#define SCAN_O 0x18\r
+#define SCAN_P 0x19\r
+#define SCAN_LANGLE 0x1a\r
+#define SCAN_RANGLE 0x1b\r
+#define SCAN_ENTER 0x1c\r
+#define SCAN_CTRL 0x1d\r
+#define SCAN_A 0x1e\r
+#define SCAN_S 0x1f\r
+#define SCAN_D 0x20\r
+#define SCAN_F 0x21\r
+#define SCAN_G 0x22\r
+#define SCAN_H 0x23\r
+#define SCAN_J 0x24\r
+#define SCAN_K 0x25\r
+#define SCAN_L 0x26\r
+#define SCAN_SCOLON 0x27\r
+#define SCAN_QUOTA 0x28\r
+#define SCAN_RQUOTA 0x29\r
+#define SCAN_LSHIFT 0x2a\r
+#define SCAN_BSLASH 0x2b\r
+#define SCAN_Z 0x2c\r
+#define SCAN_X 0x2d\r
+#define SCAN_C 0x2e\r
+#define SCAN_V 0x2f\r
+#define SCAN_B 0x30\r
+#define SCAN_N 0x31\r
+#define SCAN_M 0x32\r
+#define SCAN_COMA 0x33\r
+#define SCAN_DOT 0x34\r
+#define SCAN_SLASH 0x35\r
+#define SCAN_RSHIFT 0x36\r
+#define SCAN_GREY_STAR 0x37\r
+#define SCAN_ALT 0x38\r
+#define SCAN_SPACE 0x39\r
+#define SCAN_CAPS 0x3a\r
+#define SCAN_F1 0x3b\r
+#define SCAN_F2 0x3c\r
+#define SCAN_F3 0x3d\r
+#define SCAN_F4 0x3e\r
+#define SCAN_F5 0x3f\r
+#define SCAN_F6 0x40\r
+#define SCAN_F7 0x41\r
+#define SCAN_F8 0x42\r
+#define SCAN_F9 0x43\r
+#define SCAN_F10 0x44\r
+#define SCAN_NUMLOCK 0x45\r
+#define SCAN_SCRLOCK 0x46\r
+#define SCAN_HOME 0x47\r
+#define SCAN_UP 0x48\r
+#define SCAN_PGUP 0x49\r
+#define SCAN_GREY_MINUS 0x4a\r
+#define SCAN_LEFT 0x4b\r
+#define SCAN_PAD_5 0x4c\r
+#define SCAN_RIGHT 0x4d\r
+#define SCAN_GREY_PLUS 0x4e\r
+#define SCAN_END 0x4f\r
+#define SCAN_DOWN 0x50\r
+#define SCAN_PGDN 0x51\r
+#define SCAN_INSERT 0x52\r
+#define SCAN_DEL 0x53\r
+#define SCAN_F11 0x57\r
+#define SCAN_F12 0x58\r
+\r
+#endif // KEYBOARD_INC\r
--- /dev/null
+# Use the C or C++ compiler\r
+Compiler = wcc386\r
+\r
+# compiler options\r
+#comp = /oneatx /zp4 /5 /d0\r
+comp = /bt=dos /oneatx /5 /fp5 /wx /d0\r
+\r
+Linker_options = option stack=60000\r
+\r
+# Compile using dos4g or pmodew\r
+#System = dos4g\r
+System = pmodew\r
+\r
+Exe_file = maped.exe\r
+\r
+Objs = maped.obj config.obj gui.obj guicomp.obj mode13h.obj modex.obj keyboard.obj &\r
+ minimap.obj mouse.obj render.obj smalfont.obj ssaver.obj tileed.obj &\r
+ tilesel.obj timer.obj vdriver.obj columns.obj a_memory.obj mikmod.lib\r
+\r
+####################\r
+\r
+maped.exe : $(Objs)\r
+\r
+ *wlink system $(System) $(Linker_Options) name maped.exe &\r
+ file {$<}\r
+# *pmwlite -c4 maped.exe\r
+\r
+.c.obj:\r
+ $(Compiler) $(comp) $<\r
+\r
+.asm.obj:\r
+ wasm -3pr $<\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+const char *const ME2_VERSION = "2.01a";\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <vecna, may 14>\r
+// + erased valloc(), replaced with a_memory.c\r
+// + added Log() -- output to MAPED.LOG\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+\r
+#include "config.h"\r
+#include "gui.h"\r
+#include "keyboard.h"\r
+#include "mikmod.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "ssaver.h"\r
+#include "smalfont.h"\r
+#include "tilesel.h"\r
+#include "minimap.h"\r
+#include "guicomp.h"\r
+#include "config.h"\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+// Includes for a_memory.c\r
+\r
+void *valloc(int amount, char *desc, int owner);\r
+void *qvalloc(int amount);\r
+int vfree(void *pointer);\r
+void qvfree(void *pointer);\r
+void FreeByOwner(int owner);\r
+void MemReport(void);\r
+void CheckCorruption(void);\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+ unsigned short start; // strand start\r
+ unsigned short finish; // strand end\r
+ unsigned short delay; // tile-switch delay\r
+ unsigned short mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+typedef struct\r
+{\r
+ char zonename[16]; // zone description\r
+ unsigned short int callevent; // event number to call\r
+ unsigned char percent; // chance (in 255) of event occurance\r
+ unsigned char delay; // step-delay before last occurance\r
+ unsigned char aaa; // accept adjacent activation\r
+ char savedesc[31]; // savegame description\r
+} oldzone;\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *moveofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct\r
+{\r
+ char t[200];\r
+} movescript;\r
+\r
+typedef struct\r
+{\r
+ unsigned short x; // xwc position\r
+ unsigned short y; // ywc position\r
+ unsigned char facing; // direction entity is facing\r
+ unsigned char moving; // direction entity is moving\r
+ unsigned char movcnt; // how far left to move in this tile\r
+ unsigned char framectr; // frame sequence counter\r
+ unsigned char specframe; // special-frame set thingo\r
+ unsigned char chrindex, movecode; // CHR index / movement pattern code\r
+ unsigned char activmode, obsmode; // activation mode, obstruction mode\r
+ unsigned char v1,v2,v3; // packing stuff.\r
+ unsigned int actscript, movescript; // script references\r
+ unsigned char speed, speedct; // entity speed, speedcount :)\r
+ unsigned short step, delay, // Misc data entries\r
+ data1, data2, // More misc data\r
+ data3, data4, // yet more crappy misc data.\r
+ delayct,adjactv; // yet more internal crap\r
+ unsigned short x1,y1,x2,y2; // bounding box coordinates\r
+ unsigned char curcmd, cmdarg; // Script commands/arguments\r
+ unsigned char *scriptofs; // offset in script parsing\r
+ unsigned char face,chasing, // face player when activated | chasing\r
+ chasespeed, chasedist; // chasing variables\r
+ unsigned short cx,cy; // current-tile pos (moving adjusted)\r
+ int expand1; // always room for improvement\r
+ char entitydesc[20]; // Editing description\r
+} oldent_r;\r
+\r
+zoneinfo zones[256]; // zone stuff.\r
+layer_r layer[6]; // Array of layer data\r
+vspanim_r vspanim[100]; // tile animation data\r
+unsigned short vadelay[100]; // Tile animation delay ctr\r
+oldzone tzone; // zone for oldmap-to-v2 converting\r
+entity_r entity[256]; // Entity records.\r
+oldent_r oldent; // entity for oldmap-to-v2 converting\r
+byte entities=0; // number of allocated entities.\r
+chrlist_r chrlist[100]; // Max. 100 CHRs per map.\r
+movescript ms[100]; // move scripts arrays\r
+byte nmchr=0; // number of active/loaded CHRs.\r
+byte nms=0; // number of movement scripts\r
+\r
+char mapname[60]; // MAP filename\r
+char vspname[60]; // VSP filemap\r
+char rstring[20]; // render-order string\r
+char musname[60]; // MAP default music\r
+char numlayers; // number of layers in map\r
+short xstart, ystart; // MAP start locations\r
+char *obstruct, *zone; // obstruction and zone buffers\r
+int numzones=0; // Number of active zones.\r
+unsigned short *layers[6]; // Raw layer data\r
+char wrap, soundokay=0;\r
+\r
+// -- vsp related data --\r
+\r
+unsigned short numtiles; // number of allocated tiles in VSP\r
+unsigned char *vsp; // VSP ptr\r
+char vsp_locked=0;\r
+char vsp_pw[8];\r
+\r
+// -- map compression\r
+\r
+char *cb,*csrc; // compression workspace buffer\r
+int bufsize; // how many bytes need to be written\r
+\r
+// -- editing related data --\r
+\r
+int xwin=0, ywin=0; // Editing viewplane\r
+short lt=0, rt=0; // left-button tile, right-button tile\r
+char curzone=0; // current zone.\r
+char scrollmode=0; // tile or pixel scroll modes.\r
+char mouse_scroll=1;\r
+char layertoggle[10]; // layer visible toggles\r
+char el=0; // current editing layer.\r
+char modified=0; // Current buffer modified or not.\r
+\r
+// -- music stuff --\r
+\r
+char is_playing=0;\r
+char cmname[60];\r
+UNIMOD *mf=0;\r
+\r
+// -- copy/paste & block fill --\r
+\r
+word *copybuf=0;\r
+int copybuf_wide=0,copybuf_deep=0;\r
+int selx1=0, sely1=0, selx2=0, sely2=0;\r
+int shifted=0, pasting=0;\r
+extern char curtrack;\r
+\r
+char vcedprog[80];\r
+byte* translucency_table; //zero\r
+\r
+int moving_up=0,moving_down=0,moving_left=0,moving_right=0; // aen\r
+\r
+// ================================= Code ====================================\r
+\r
+//added by zero\r
+void LoadTransTable()\r
+{\r
+ FILE *fp;\r
+\r
+ if (!translucency_table)\r
+ translucency_table=(byte *) valloc(65536,"trans tbl",0);\r
+\r
+ fp=fopen("trans.tbl","rb");\r
+ if (!fp)\r
+ {\r
+ vfree(translucency_table);\r
+ translucency_table=0;\r
+ return;\r
+ }\r
+\r
+ fread(translucency_table, 65536, 1, fp);\r
+ fclose(fp);\r
+}\r
+\r
+int Exist(char *fname)\r
+{ FILE *tempf;\r
+\r
+ tempf=fopen(fname,"rb");\r
+ if (tempf)\r
+ {\r
+ fclose(tempf);\r
+ return 1;\r
+ }\r
+ else return 0;\r
+}\r
+\r
+void err(char *str, ...)\r
+{\r
+ va_list argptr;\r
+ char msg[256];\r
+\r
+ va_start(argptr, str);\r
+ vsprintf(msg, str, argptr);\r
+ va_end(argptr);\r
+\r
+ ShutdownVideo();\r
+ ShutdownTimer();\r
+ ShutdownKeyboard();\r
+ //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
+ // Actually, Wat is by default case insensitive, so nyeh.;) <vec>\r
+ //if (curtrack != 1) //CD_Stop();\r
+\r
+ printf("%s \n",msg);\r
+ exit(-1);\r
+}\r
+\r
+void errf(char *str, char *str1)\r
+{\r
+ sprintf(strbuf,str,str1);\r
+ err(strbuf);\r
+}\r
+\r
+void errn(char *str, int n)\r
+{\r
+ sprintf(strbuf,str,n);\r
+ err(strbuf);\r
+}\r
+\r
+int random(int lo, int hi)\r
+{\r
+ int range=hi-lo+1;\r
+ int i=rand() % range;\r
+ return i+lo;\r
+}\r
+\r
+void PlayMusic(char *fname)\r
+{\r
+ if (!soundokay) return;\r
+ if (is_playing)\r
+ {\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+ is_playing=0;\r
+ }\r
+ mf=ML_LoadFN(fname);\r
+ if (!mf)\r
+ {\r
+ Message("Could not load specified music.",500);\r
+ return;\r
+ }\r
+ MP_Init(mf);\r
+ md_numchn=mf->numchn; mp_loop=1;\r
+ MD_PlayStart();\r
+ is_playing=1;\r
+}\r
+\r
+void StopMusic()\r
+{\r
+ if (!soundokay) return;\r
+ MD_PlayStop();\r
+ ML_Free(mf);\r
+ is_playing=0;\r
+}\r
+\r
+void LoadVSP(char *fname)\r
+{ FILE *f;\r
+ short ver;\r
+\r
+ if (!(f=fopen(fname,"rb")))\r
+ errf("VSP file %s not found.",fname);\r
+\r
+ fread(&ver, 1, 2, f);\r
+ if (ver!=2 && ver!=3)\r
+ errf("VSP file %s is not the correct VSP format.",fname);\r
+ if (ver==2)\r
+ {\r
+ fread(&pal, 1, 768, f);\r
+ set_intensity(63);\r
+ fread(&numtiles, 1, 2, f);\r
+ vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
+ fread(vsp, 256, numtiles, f);\r
+ fread(&vspanim, 8, 100, f);\r
+ fclose(f);\r
+ }\r
+ if (ver==3)\r
+ {\r
+ fread(&pal, 1, 768, f);\r
+ set_intensity(63);\r
+ fread(&numtiles, 1, 2, f);\r
+ vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
+ fread(&bufsize, 1, 4, f);\r
+ ReadCompressedLayer1(vsp, 256*numtiles, f);\r
+ fread(&vspanim, 8, 100, f);\r
+ fclose(f);\r
+ }\r
+}\r
+\r
+void SaveVSP(char *fname)\r
+{ FILE *f;\r
+ short ver;\r
+\r
+ f=fopen(fname,"wb");\r
+ ver=3;\r
+ fwrite(&ver, 1, 2, f);\r
+ fwrite(&pal, 1, 768, f);\r
+ fwrite(&numtiles, 1, 2, f);\r
+ cb=(char *) valloc(numtiles*256, "vsp tempbuf", 0);\r
+ bufsize=0;\r
+ WriteCompressedLayer1(vsp, numtiles*256);\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ //free(bufsize); // what the hell??? @_@\r
+ fwrite(&vspanim, 8, 100, f);\r
+ fclose(f);\r
+}\r
+\r
+void EmitC (char c)\r
+{\r
+ *csrc=c;\r
+ csrc++;\r
+ bufsize++;\r
+}\r
+\r
+void EmitW (short int w)\r
+{\r
+ char *ptr;\r
+\r
+ ptr=(char *)&w;\r
+ *csrc=*ptr;\r
+ csrc++;\r
+ ptr++;\r
+ *csrc=*ptr;\r
+ csrc++;\r
+ bufsize+=2;\r
+}\r
+\r
+void WriteCompressedLayer1(unsigned char *p, int len)\r
+{ int i;\r
+ unsigned char byt,samect;\r
+ unsigned char repcode;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<254 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect==2 && byt != 0xFF) { EmitC(byt); }\r
+ if (samect==3 && byt != 0xFF) { EmitC(byt); EmitC(byt); }\r
+ if (samect>3 || byt == 0xFF)\r
+ {\r
+ repcode=0xFF;\r
+ EmitC(repcode);\r
+ repcode=(char) samect;\r
+ EmitC(repcode);\r
+ }\r
+ EmitC(byt);\r
+ } while (i<len);\r
+}\r
+\r
+void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f)\r
+{ int j,n;\r
+ unsigned char run;\r
+ unsigned char w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ fread(&w, 1, 1, f);\r
+ if (w==0xFF)\r
+ {\r
+ fread(&run, 1, 1, f);\r
+ fread(&w, 1, 1, f);\r
+ for (j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while (n<len);\r
+}\r
+\r
+void WriteCompressedLayer2(unsigned short *p,int len)\r
+{ int i;\r
+ unsigned short byt,samect;\r
+ unsigned char repcode;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<255 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1)\r
+ {\r
+ repcode=(char) samect;\r
+ EmitC(repcode);\r
+ repcode=0xFF;\r
+ EmitC(repcode);\r
+ }\r
+ EmitW(byt);\r
+ } while (i<len);\r
+}\r
+\r
+void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f)\r
+{ int j,n;\r
+ unsigned char run;\r
+ unsigned short w;\r
+\r
+ n=0;\r
+ do\r
+ {\r
+ fread(&w, 1, 2, f);\r
+ if ((w & 0xFF00)==0xFF00)\r
+ {\r
+ run=(char) (w & 0x00FF);\r
+ fread(&w, 1, 2, f);\r
+ for (j=0; j<run; j++)\r
+ dest[n+j]=w;\r
+ n+=run;\r
+ }\r
+ else\r
+ {\r
+ dest[n]=w;\r
+ n++;\r
+ }\r
+ } while (n<len);\r
+}\r
+\r
+void CountUsedZones()\r
+{ int i;\r
+\r
+ i=255;\r
+ while (i)\r
+ {\r
+ if (zones[i].script) break;\r
+ if (zones[i].percent) break;\r
+ if (zones[i].delay) break;\r
+ if (zones[i].aaa) break;\r
+ if (zones[i].entityscript) break;\r
+ if (strlen(zones[i].name)) break;\r
+ i--;\r
+ }\r
+ numzones=i+1;\r
+}\r
+\r
+void CountMoveScripts()\r
+{ int i;\r
+\r
+ i=99;\r
+ while (i)\r
+ {\r
+ if (strlen(ms[i].t)) break;\r
+ i--;\r
+ }\r
+ nms=i+1;\r
+}\r
+\r
+void CountCHRs()\r
+{ int i;\r
+\r
+ i=99;\r
+ while (i)\r
+ {\r
+ if (strlen(chrlist[i].t)) break;\r
+ i--;\r
+ }\r
+ nmchr=i+1;\r
+}\r
+\r
+void SaveMAP(char *fname)\r
+{ FILE *f;\r
+ int i, ofstbl[100], ct, t;\r
+\r
+ memcpy(strbuf, "MAPù5", 6);\r
+ f=fopen(fname, "wb");\r
+ fwrite(strbuf, 1, 6, f);\r
+ fwrite(strbuf, 1, 4, f);\r
+ fwrite(vspname, 1, 60, f);\r
+ fwrite(musname, 1, 60, f);\r
+ fwrite(rstring, 1, 20, f);\r
+ fwrite(&xstart, 1, 2, f);\r
+ fwrite(&ystart, 1, 2, f);\r
+ fwrite(&wrap, 1, 1, f);\r
+ fwrite(strbuf, 1, 50, f);\r
+ fwrite(&numlayers, 1, 1, f);\r
+ for (i=0; i<numlayers; i++)\r
+ fwrite(&layer[i], 1, 12, f);\r
+\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ cb=(char *) valloc(layer[i].sizex*layer[i].sizey*2,"cmprs buf", 0);\r
+ WriteCompressedLayer2(layers[i],(layer[i].sizex*layer[i].sizey));\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ vfree(cb);\r
+ }\r
+ // Compress and write Obstruction data\r
+\r
+ cb=(char *) valloc(layer[0].sizex*layer[0].sizey*2, "cmprs buf", 0);\r
+ WriteCompressedLayer1(obstruct, (layer[0].sizex*layer[0].sizey));\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ WriteCompressedLayer1(zone, (layer[0].sizex*layer[0].sizey));\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ vfree(cb);\r
+\r
+ CountUsedZones();\r
+ fwrite(&numzones, 1, 4, f);\r
+ fwrite(&zones, numzones, 50, f);\r
+\r
+ CountCHRs();\r
+ fwrite(&nmchr, 1, 1, f);\r
+ fwrite(&chrlist, 60, nmchr, f);\r
+\r
+ fwrite(&entities, 1, 1, f);\r
+ fwrite(&entity, sizeof(entity)/256, entities, f);\r
+\r
+ CountMoveScripts();\r
+ fwrite(&nms, 1, 1, f); // Calc offset buffer\r
+ ct=0;\r
+ for (i=0; i<nms; i++)\r
+ {\r
+ ofstbl[i]=ct;\r
+ t=strlen(&ms[i].t)+1;\r
+ ct+=t;\r
+ }\r
+ fwrite(&ct, 1, 4, f); // string table length\r
+ fwrite(&ofstbl, nms, 4, f); // write offset buffer\r
+ for (i=0; i<nms; i++) // write string table\r
+ {\r
+ fwrite(&ms[i].t, 1, strlen(&ms[i].t)+1, f);\r
+ }\r
+\r
+ ct=0; // 0 Things\r
+ fwrite(&ct, 1, 4, f);\r
+ ct=ftell(f);\r
+\r
+ i=1; fwrite(&i, 1, 4, f);\r
+ i=0; fwrite(&i, 1, 4, f);\r
+ i=1; fwrite(&i, 1, 4, f);\r
+ i=9; fwrite(&i, 1, 1, f);\r
+\r
+ fseek(f,6,0);\r
+ fwrite(&ct, 1, 4, f);\r
+ fclose(f);\r
+}\r
+\r
+void LoadOldMAP(FILE *f)\r
+{ int i, j, ct, ofstbl[100];\r
+ char pm,pd,pc,c;\r
+\r
+ // Reads a VERGE 1 format version 4 MAP file.\r
+ fseek(f, 1, 0);\r
+ fread(&vspname, 1, 13, f);\r
+ fread(&musname, 1, 13, f);\r
+ fread(&pc, 1, 1, f); // }\r
+ fread(&pm, 1, 1, f); // } Parallax controls\r
+ fread(&pd, 1, 1, f); // }\r
+ fread(strbuf, 1, 32, f); // unused - misc\r
+ fread(&xstart, 1, 2, f);\r
+ fread(&ystart, 1, 2, f);\r
+ fread(strbuf, 1, 2, f); // unused - misc\r
+ fread(&layer[0].sizex, 1, 2, f);\r
+ fread(&layer[0].sizey, 1, 2, f);\r
+ layer[1].sizex=layer[0].sizex;\r
+ layer[1].sizey=layer[0].sizey;\r
+ fread(strbuf, 1, 28, f); // unused - header pad\r
+\r
+ layers[0]=(unsigned short *) valloc((layer[0].sizex*(layer[0].sizey+1)*2)+2, "layer data", 0);\r
+ layers[1]=(unsigned short *) valloc((layer[1].sizex*(layer[1].sizey+1)*2)+2, "layer data", 1);\r
+ obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "obstruct map", 0);\r
+ zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
+ cb=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "comprs buf", 0);\r
+\r
+ fread(layers[0], 2, layer[0].sizex * layer[0].sizey, f);\r
+ fread(layers[1], 2, layer[1].sizex * layer[1].sizey, f);\r
+ fread(cb, 1, layer[0].sizex * layer[0].sizey, f);\r
+\r
+ // Convert MAP Properties layer to respective Zone and Obstruction layers\r
+\r
+ for (j=0; j<layer[0].sizey; j++)\r
+ for (i=0; i<layer[0].sizex; i++)\r
+ {\r
+ if ((cb[(j*layer[0].sizex)+i] & 1)==1)\r
+ c=1; else c=0;\r
+ obstruct[(j*layer[0].sizex)+i]=c;\r
+ c=cb[(j*layer[0].sizex)+i] >> 1;\r
+ zone[(j*layer[0].sizex)+i]=c;\r
+ }\r
+ vfree(cb);\r
+\r
+ // Load and convert zone data records.\r
+\r
+ for (i=0; i<128; i++)\r
+ {\r
+ fread(&tzone, 1, sizeof tzone, f);\r
+ zones[i].script=tzone.callevent;\r
+ zones[i].percent=tzone.percent;\r
+ zones[i].delay=tzone.delay;\r
+ zones[i].aaa=tzone.aaa;\r
+ zones[i].entityscript=0;\r
+ memcpy(zones[i].name, tzone.zonename, 16);\r
+ }\r
+\r
+ for (i=0; i<100; i++) // Load and convert CHR list\r
+ fread(&chrlist[i].t, 1, 13, f);\r
+// DoCHRdealy();\r
+\r
+ fread(&entities, 1, 1, f); fseek(f, 3, 1);\r
+ memset(&entity, 0, sizeof entity);\r
+ for (i=0; i<entities; i++) // Load and convert entity records\r
+ {\r
+ fread(&oldent, 1, 88, f);\r
+ entity[i].x=oldent.x;\r
+ entity[i].y=oldent.y;\r
+ entity[i].chrindex=oldent.chrindex-5;\r
+ entity[i].obsmode1=oldent.obsmode^1;\r
+ entity[i].obsmode2=1;\r
+ entity[i].movecode=oldent.movecode;\r
+ if (entity[i].movecode==3) entity[i].movecode=2;\r
+ else if (entity[i].movecode==2) entity[i].movecode=3;\r
+ entity[i].speed=oldent.speed;\r
+ entity[i].face=oldent.face;\r
+ entity[i].actm=oldent.activmode;\r
+ entity[i].movescript=oldent.movescript;\r
+ entity[i].step=oldent.step;\r
+ entity[i].delay=oldent.delay;\r
+ entity[i].data2=0;\r
+ entity[i].data3=0;\r
+ entity[i].data5=0;\r
+ entity[i].data6=0;\r
+ entity[i].actscript=oldent.actscript;\r
+ if (entity[i].movecode==2) entity[i].data2=oldent.data3;\r
+ if (entity[i].movecode==3)\r
+ {\r
+ entity[i].data2=oldent.x1;\r
+ entity[i].data3=oldent.y1;\r
+ entity[i].data5=oldent.x2;\r
+ entity[i].data6=oldent.y2;\r
+ }\r
+ memcpy(entity[i].desc, oldent.entitydesc, 20);\r
+ }\r
+\r
+ fread(&nms, 1, 1, f);\r
+ fread(&ct, 1, 4, f);\r
+ fread(&ofstbl, nms, 4, f);\r
+ ofstbl[nms]=ct;\r
+ for (i=0; i<nms; i++)\r
+ fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
+ fclose(f);\r
+\r
+ numlayers=2;\r
+ layertoggle[0]=1; layertoggle[1]=1; layertoggle[2]=0; layertoggle[3]=0;\r
+ layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
+ memcpy(rstring,"1E2",3);\r
+ switch (pc)\r
+ {\r
+ case 0:\r
+ case 1: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
+ case 2: layer[0].pmultx=pm; layer[0].pmulty=pm; layer[0].pdivx=pd; layer[0].pdivy=pd;\r
+ layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
+ case 3: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[1].pmultx=pm; layer[1].pmulty=pm; layer[1].pdivx=pd; layer[1].pdivy=pd; break;\r
+ }\r
+\r
+ LoadVSP(vspname);\r
+ sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
+ Message(strbuf,700);\r
+ Message("Old VERGE format 4 MAP loaded.",300);\r
+ if (strlen(musname))\r
+ PlayMusic(musname);\r
+}\r
+\r
+void LoadMAP(char *fname)\r
+{ FILE *f;\r
+ int i, ct, ofstbl[100];\r
+\r
+ memcpy(strbuf, "MAPù5", 6);\r
+ if (!(f=fopen(fname, "rb"))) errf("Could not find %s.",fname);\r
+ fread(strbuf, 1, 6, f);\r
+ if (strcmp(strbuf,"MAPù5"))\r
+ {\r
+ if (strbuf[0]==4)\r
+ {\r
+ LoadOldMAP(f);\r
+ return;\r
+ }\r
+ errf("%s is not a recognized MAP file.",fname);\r
+ }\r
+\r
+ fread(&i, 1, 4, f);\r
+ fread(vspname, 1, 60, f);\r
+ fread(musname, 1, 60, f);\r
+ fread(rstring, 1, 20, f);\r
+ fread(&xstart, 1, 2, f);\r
+ fread(&ystart, 1, 2, f);\r
+ fread(&wrap, 1, 1, f);\r
+ fread(strbuf, 1, 50, f);\r
+ fread(&numlayers, 1, 1, f);\r
+ for (i=0; i<numlayers; i++)\r
+ fread(&layer[i], 1, 12, f);\r
+\r
+ for (i=0; i<numlayers; i++)\r
+ {\r
+ fread(&bufsize, 1, 4, f);\r
+ layers[i]=(unsigned short *) valloc(layer[i].sizex*(layer[i].sizey+2)*2, "layer data", i);\r
+ ReadCompressedLayer2(layers[i],(layer[i].sizex * layer[i].sizey),f);\r
+ layertoggle[i]=1;\r
+ }\r
+ while (i<10)\r
+ {\r
+ layertoggle[i]=0;\r
+ i++;\r
+ }\r
+ obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2),"obstruct map", 0);\r
+ zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
+\r
+ fread(&bufsize, 1, 4, f);\r
+ ReadCompressedLayer1(obstruct,(layer[0].sizex * layer[0].sizey), f);\r
+ fread(&bufsize, 1, 4, f);\r
+ ReadCompressedLayer1(zone,(layer[0].sizex * layer[0].sizey), f);\r
+\r
+ memset(&zones, 0, sizeof zones);\r
+ fread(&numzones, 1, 4, f);\r
+ fread(&zones, numzones, 50, f);\r
+\r
+ memset(&chrlist, 0, sizeof chrlist);\r
+ fread(&nmchr, 1, 1, f);\r
+ fread(&chrlist, 60, nmchr, f);\r
+// DoCHRdealy();\r
+\r
+ fread(&entities, 1, 1, f);\r
+ fread(&entity, sizeof(entity)/256, entities, f);\r
+\r
+ fread(&nms, 1, 1, f);\r
+ fread(&ct, 1, 4, f);\r
+ fread(&ofstbl, nms, 4, f);\r
+ ofstbl[nms]=ct;\r
+ for (i=0; i<nms; i++)\r
+ fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
+ fclose(f);\r
+\r
+ LoadVSP(vspname);\r
+ sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
+ Message(strbuf,700);\r
+ Message("V2 MAP loaded.",300);\r
+ if (strlen(musname))\r
+ PlayMusic(musname);\r
+}\r
+\r
+void InitTileIDX()\r
+{ short i;\r
+\r
+ memset(vadelay, 0, 200);\r
+ for (i=0; i<MAXTILES; i++)\r
+ tileidx[i]=i;\r
+}\r
+\r
+void CheckTimerStuff()\r
+{ static inss=0;\r
+\r
+ if (backupct>30000)\r
+ {\r
+ Message("Generating Auto-backup",150);\r
+ SaveMAP("$$BACKUP.MAP");\r
+ SaveVSP("$$BACKUP.VSP");\r
+ backupct=0;\r
+ }\r
+ if (idlect>8000 && !inss)\r
+ {\r
+ inss=1;\r
+ ScreenSaver();\r
+ idlect=0;\r
+ inss=0;\r
+ }\r
+}\r
+\r
+extern int difficulty;\r
+\r
+void SaveNewCFG()\r
+{ FILE *f;\r
+\r
+ f=fopen("maped.cfg","w");\r
+ //if (nocdaudio) fprintf(f,"nocdaudio\n");\r
+ fprintf(f,"vidmode %d \n", vm);\r
+ fprintf(f,"pad %d \n", pad);\r
+ fprintf(f,"scrollmode %d \n",scrollmode);\r
+ fprintf(f,"mouse_scroll %d \n",mouse_scroll&1); // aen\r
+ fprintf(f,"black %d \n",black);\r
+ fprintf(f,"white %d \n",brightw);\r
+ fprintf(f,"winbg %d \n",winbg);\r
+ fprintf(f,"shadow %d \n",darkw);\r
+ fprintf(f,"darkred %d \n",darkred);\r
+ fprintf(f,"titlebg %d \n",titlebg);\r
+ fprintf(f,"th %d \n", th);\r
+ fprintf(f,"mh %d \n", mh);\r
+ fprintf(f,"md_device %d \n", md_device==3?3:0);\r
+ fprintf(f,"amxofs %d \n",amxofs);\r
+ fprintf(f,"amyofs %d \n",amyofs);\r
+ fprintf(f,"mmxofs %d \n",mmxofs);\r
+ fprintf(f,"mmyofs %d \n",mmyofs);\r
+ fprintf(f,"cnxofs %d \n",cnxofs);\r
+ fprintf(f,"cnyofs %d \n",cnyofs);\r
+ fprintf(f,"lmxofs %d \n",lmxofs);\r
+ fprintf(f,"lmyofs %d \n",lmyofs);\r
+ fprintf(f,"lvxofs %d \n",lvxofs);\r
+ fprintf(f,"lvyofs %d \n",lvyofs);\r
+ fprintf(f,"mpxofs %d \n",mpxofs);\r
+ fprintf(f,"mpyofs %d \n",mpyofs);\r
+ fprintf(f,"vaxofs %d \n",vaxofs);\r
+ fprintf(f,"vayofs %d \n",vayofs);\r
+ fprintf(f,"zexofs %d \n",zexofs);\r
+ fprintf(f,"zeyofs %d \n",zeyofs);\r
+ fprintf(f,"exofs %d \n",exofs);\r
+ fprintf(f,"eyofs %d \n",eyofs);\r
+ fprintf(f,"prxofs %d \n",prxofs);\r
+ fprintf(f,"pryofs %d \n",pryofs);\r
+ fprintf(f,"rsxofs %d \n",rsxofs);\r
+ fprintf(f,"rsyofs %d \n",rsyofs);\r
+ fprintf(f,"vced %s \n",vcedprog);\r
+ fprintf(f,"difficulty %d \n",difficulty);\r
+ fclose(f);\r
+}\r
+\r
+#include "controls.c"\r
+\r
+void ShellToDOS()\r
+{\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ system("COMMAND.COM");\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellVERGE()\r
+{\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ system("VERGE");\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellMAP()\r
+{\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"verge %s",mapname);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellEditMAP()\r
+{\r
+ char fn[80],*p;\r
+\r
+ key[SCAN_ALT]=0;\r
+ key[SCAN_V]=0;\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(fn,"%s",mapname);\r
+ p=fn;\r
+ while (*p)\r
+ {\r
+ if (*p=='.') *p=0;\r
+ p++;\r
+ }\r
+ sprintf(strbuf,"%s %s.vc", vcedprog, fn);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+void ShellEditSystem()\r
+{\r
+ key[SCAN_ALT]=0;\r
+ key[SCAN_S]=0;\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"%s system.vc", vcedprog);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+ InitVideo(vm);\r
+ set_intensity(63);\r
+ InitMouse();\r
+ InitKeyboard();\r
+ InitTimer();\r
+}\r
+\r
+char s[256];\r
+\r
+void CompileAll()\r
+{\r
+ FILE *f;\r
+ char *p;\r
+\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"vcc all q",mapname);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+\r
+ if (!(f=fopen("error.txt","r")))\r
+ {\r
+ Message("All VC scripts sucessfully compiled.",300);\r
+ return;\r
+ }\r
+\r
+ fgets(s,99,f);\r
+ fclose(f);\r
+ p=s;\r
+ while (*p)\r
+ {\r
+ if (*p==13 || *p==10) *p=0;\r
+ p++;\r
+ }\r
+ VCNotify(s);\r
+}\r
+\r
+void CompileMAP()\r
+{\r
+ FILE *f;\r
+ char *p;\r
+\r
+ MD_PlayStop();\r
+ MD_Exit();\r
+\r
+ sprintf(strbuf,"vcc %s q",mapname);\r
+ system(strbuf);\r
+\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+ if (strlen(musname)) PlayMusic(musname);\r
+\r
+ if (!(f=fopen("error.txt","r"))) return;\r
+\r
+ fgets(s,99,f);\r
+ fclose(f);\r
+ p=s;\r
+ while (*p)\r
+ {\r
+ if (*p==13 || *p==10) *p=0;\r
+ p++;\r
+ }\r
+ VCNotify(s);\r
+}\r
+\r
+void tickhandler(void)\r
+{\r
+ MP_HandleTick();\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+void RenderHighlight()\r
+{ int zx, zy;\r
+ int xw, yw;\r
+\r
+ if (mh)\r
+ {\r
+ xw=xwin&15;\r
+ yw=ywin&15;\r
+ zx=((mx+xw)&~15)-xw;\r
+ zy=((my+yw)&~15)-yw;\r
+\r
+ DrawHighlight(zx-1, zy-1);\r
+ }\r
+}\r
+\r
+int EntityThere(int xw, int yw)\r
+{ int i;\r
+\r
+ for (i=0; i<entities; i++)\r
+ {\r
+ if (entity[i].x==xw && entity[i].y==yw) return i+1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void AllocateEntity(int xw, int yw)\r
+{\r
+ memset(&entity[entities], 0, sizeof(entity) / 256);\r
+ entity[entities].x=xw;\r
+ entity[entities].y=yw;\r
+ entities++;\r
+}\r
+\r
+void ProcessEntity(int xw, int yw)\r
+{ int a;\r
+\r
+ a=EntityThere(xw,yw);\r
+ if (!a)\r
+ {\r
+ AllocateEntity(xw,yw);\r
+ while (mb)\r
+ ReadMouse(); // har! this was readmouse() @_@ <aen, apr 21>\r
+ mb=0;\r
+ return;\r
+ }\r
+ EntityEditor(a-1);\r
+}\r
+\r
+void DeleteEntity(int xw, int yw)\r
+{ int i,a;\r
+ char t[60];\r
+\r
+ a=EntityThere(xw,yw)-1;\r
+ sprintf(t,"Delete entity %d?",a);\r
+ if (!Confirm(t)) return;\r
+ for (i=a; i<entities; i++)\r
+ {\r
+ entity[i]=entity[i+1];\r
+ }\r
+ entities--;\r
+}\r
+\r
+int bxsize=130, bysize=170;\r
+int bxofs=80, byofs=25;\r
+int bmode=0;\r
+\r
+void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest)\r
+{ struct find_t *f;\r
+ char i, *d, mode;\r
+ char *blah;\r
+ int fc=0, ofs=0, cfs=0, a, b;\r
+ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+ //int zx,zy,zw;\r
+ char dragging=0;\r
+\r
+ f=(struct find_t *) valloc(sizeof *f, "browse() tmp",0);\r
+ blah=(char *) valloc(13*256,"browse()tmp2", 0);\r
+ //memset(blah, 0, 13*256);\r
+ n++;\r
+\r
+ for (i=0; i<n; i++)\r
+ {\r
+ switch (i)\r
+ {\r
+ case 0: d="AJDLMMZZ.GAH"; mode=0xFF; break;\r
+ case 1: d=m1; mode=0xFF; break;\r
+ case 2: d=m2; mode=0xFF; break;\r
+ case 3: d=m3; mode=0xFF; break;\r
+ case 4: d=m4; mode=0xFF; break;\r
+ default: err("uhh..."); break;\r
+ }\r
+ if (_dos_findfirst(d, mode, f)) continue;\r
+ memcpy(blah+(fc*13), f->name, 13); fc++;\r
+ while (!_dos_findnext(f))\r
+ {\r
+ memcpy(blah+(fc*13), f->name, 13); fc++;\r
+ }\r
+ }\r
+ vfree(f);\r
+ last_pressed=0;\r
+ a=fc<22?117:2574/fc;\r
+// errn("%d",fc);\r
+ do\r
+ {\r
+ if (!bmode)\r
+ {\r
+ RenderMap();\r
+ RenderGUI();\r
+ }\r
+ else\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+ }\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ bxofs = (mx-mxo);\r
+ byofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (bxofs<16) bxofs = 16;\r
+ if (byofs<16) byofs = 16;\r
+ if (bxofs+bxsize>335) bxofs = 336-bxsize;\r
+ if (byofs+bysize>sy+16) byofs = (sy+16)-bysize;\r
+ }\r
+\r
+ Window(bxofs, byofs, bxofs+bxsize, byofs+bysize, "Browse");\r
+ Button(bxofs+65, byofs+157, "OK");\r
+ Button(bxofs+96, byofs+157, "Cancel");\r
+ FilledBox(bxofs+20, byofs+15, 80, 135, black);\r
+ FilledBox(bxofs+100, byofs+15, 10, 135, 2);\r
+ HLine(bxofs+20, byofs+15, 90, darkw);\r
+ VLine(bxofs+20, byofs+15, 135, darkw);\r
+ VLine(bxofs+99, byofs+16, 134, white);\r
+ VLine(bxofs+109, byofs+16, 134, white);\r
+ HLine(bxofs+21, byofs+149, 89, white);\r
+ stdwindow(bxofs+100, byofs+16, bxofs+109, byofs+25);\r
+ stdwindow(bxofs+100, byofs+140, bxofs+109, byofs+149);\r
+ b=byofs+24+(fc != 22 ? ((117-a)*ofs)/(fc-22) : 0);\r
+\r
+ //draws the drag box\r
+ stdwindow(bxofs+100, b, bxofs+109, b+a);\r
+\r
+ FilledBox(bxofs+21, byofs+((cfs-ofs)*6)+16, 78, 6, darkw);\r
+\r
+ // Render actual filename thingies\r
+ i=0;\r
+ while (1)\r
+ {\r
+ if (i+ofs<fc && i<22)\r
+ {\r
+ GotoXY(bxofs+22, byofs+17+(i*6));\r
+ printstring(blah+((i+ofs)*13));\r
+ }\r
+ else break;\r
+ i++;\r
+ }\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+\r
+ if(dragging&&!mb)\r
+ {\r
+ dragging=0;\r
+ }\r
+\r
+ if((mb==1&&mx>bxofs+100&&mx<bxofs+110&&my>byofs+25&&my<byofs+135)||dragging)\r
+ {\r
+ if(my>b&&my<b+a)\r
+ {\r
+ dragging=1;\r
+ }\r
+ else\r
+ {\r
+ if(my<b)\r
+ {\r
+ if (ofs<22) ofs=0;\r
+ else ofs-=22;\r
+ cfs=ofs;\r
+ }\r
+ if(my>b+a)\r
+ {\r
+ if (ofs+45>fc) ofs=fc-22;\r
+ else ofs+=22;\r
+ cfs=ofs;\r
+ }\r
+ }\r
+ }\r
+ if(!dragging)\r
+ {\r
+ if (mb==1 && mx>bxofs+20 && mx<bxofs+100 && my>byofs+15 && my<byofs+149)\r
+ {\r
+ i=(my-byofs-16)/6;\r
+ i+=ofs;\r
+ memcpy(dest,blah+(i*13),13);\r
+ done=1;\r
+ break;\r
+ }\r
+ if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+15 && my<byofs+25)\r
+ {\r
+ WaitRelease();\r
+ key[SCAN_UP]=1;\r
+ last_pressed=SCAN_UP;\r
+ }\r
+ if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+139 && my<byofs+149)\r
+ {\r
+ WaitRelease();\r
+ key[SCAN_DOWN]=1;\r
+ last_pressed=SCAN_DOWN;\r
+ }\r
+ if (mb==1 && mx>bxofs+65 && mx<bxofs+30+65 && my>byofs+157 && my<byofs+10+157 && !moving)\r
+ {\r
+ memcpy(dest, blah, 13); done=1;\r
+ ButtonPressed(bxofs+65, byofs+157, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>bxofs+96 && mx<bxofs+30+96 && my>byofs+157 && my<byofs+10+157 && !moving)\r
+ {\r
+ *dest=0; done=1;\r
+ ButtonPressed(bxofs+96, byofs+157, "Cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(bxofs+bxsize-9) && (mx<bxofs+bxsize-2)\r
+ && my>(byofs+1) && (my<byofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>bxofs && mx<bxofs+bxsize && my>byofs && my<(byofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-bxofs;\r
+ myo=my-byofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+ if (key[SCAN_PGUP])\r
+ {\r
+ if (ofs<22) ofs=0;\r
+ else ofs-=22;\r
+ cfs=ofs;\r
+ key[SCAN_PGUP]=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_PGDN])\r
+ {\r
+ if (ofs+45>fc) ofs=fc-22;\r
+ else ofs+=22;\r
+ if (fc<22) ofs=0;\r
+ cfs=ofs;\r
+ key[SCAN_PGDN]=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_UP])\r
+ {\r
+ if (cfs) cfs--;\r
+ if (ofs>cfs) ofs--;\r
+ key[SCAN_UP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ if (cfs<fc-1) cfs++;\r
+ if (cfs-ofs>21) ofs++;\r
+ key[SCAN_DOWN]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ memcpy(dest,blah+(cfs*13),13);\r
+ key[SCAN_ENTER]=0;\r
+ done=1;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB)\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ }\r
+ } while (!done);\r
+ vfree(blah);\r
+}\r
+\r
+#include "vergepal.h"\r
+#define LOGFILE "maped.log"\r
+\r
+void Log(char *text, ...)\r
+{\r
+ va_list argptr;\r
+ char msg[256];\r
+ FILE *logf;\r
+\r
+ va_start(argptr, text);\r
+ vsprintf(msg, text, argptr);\r
+ va_end(argptr);\r
+\r
+ logf=fopen(LOGFILE,"aw");\r
+ fprintf(logf,"%s\n",msg);\r
+ fflush(logf);\r
+ fclose(logf);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+\r
+ remove(LOGFILE);\r
+ md_mixfreq=44100;\r
+ md_dmabufsize=5000;\r
+ md_mode=DMODE_16BITS|DMODE_STEREO;\r
+ md_device=0;\r
+ memset(&chrs, 0, sizeof chrs);\r
+\r
+ Log("GetConfig");\r
+ GetConfig("maped.cfg");\r
+ Log("LoadTransTbl");\r
+ translucency_table=0; //zero\r
+ LoadTransTable(); //zero\r
+\r
+ Log("RegisterModLoaders");\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_xm);\r
+ ML_RegisterLoader(&load_uni);\r
+\r
+ Log("RegisterSndDrivers");\r
+ MD_RegisterDriver(&drv_nos);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+ MD_RegisterPlayer(tickhandler);\r
+ soundokay=1;\r
+ Log("Initialize snd lib");\r
+ if (!MD_Init())\r
+ {\r
+ printf("Couldn't initialize sound: %s.\n", myerr);\r
+ delay(500);\r
+ soundokay=0;\r
+ }\r
+\r
+ //Log("Initialize CD audio");\r
+ //CD_Init();\r
+\r
+ Log("Initialize timer");\r
+ InitTimer();\r
+ Log("Initialize video");\r
+ InitVideo(vm);\r
+ Log("Initialize mouse");\r
+ InitMouse();\r
+ Log("Initialize keyboard IRQ handler");\r
+ InitKeyboard();\r
+\r
+ Log("Initializing map data");\r
+ if (argc==1 && !Exist("untitled.map"))\r
+ {\r
+ SetPalette(vergepal);\r
+ memcpy(pal, vergepal, 768);\r
+ memcpy(mapname,"UNTITLED.MAP",13);\r
+ memcpy(vspname,"UNTITLED.VSP",13);\r
+ memcpy(rstring,"1E",2);\r
+ numlayers=1;\r
+\r
+ // aen: default newmap dimensions set to 100x100\r
+ layer[0].pmultx=1; layer[0].pmulty=1;\r
+ layer[0].pdivx=1; layer[0].pdivy=1;\r
+ layer[0].sizex=100; layer[0].sizey=100;\r
+ layer[0].trans=0; layer[0].hline=0;\r
+\r
+ layers[0]=(unsigned short *) valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
+ //memset(layers[0],0,(layer[0].sizex*layer[0].sizey)*2);\r
+ obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct map",0);\r
+ zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone map", 0);\r
+\r
+ // aen: default number of tiles set to 100\r
+ numtiles=100;\r
+ vsp=(char *) valloc(256 * numtiles,"vsp data", 0);\r
+ wrap=0; el=0; layertoggle[0]=1;\r
+ InitTileIDX();\r
+ }\r
+ else\r
+ {\r
+ if (argc==1) memcpy(mapname, "untitled.map",13);\r
+ else memcpy(mapname, argv[1], strlen(argv[1]));\r
+ LoadMAP(mapname);\r
+ InitTileIDX();\r
+ }\r
+Log("Entering main loop");\r
+thingy:\r
+ while (!(key[SCAN_ALT] && key[SCAN_X]))\r
+ {\r
+ ProcessControls();\r
+ while (tick)\r
+ {\r
+ tick--;\r
+ PollMovement();\r
+ }\r
+ RenderMap();\r
+ RenderHighlight();\r
+ RenderGUI();\r
+ ShowPage();\r
+ }\r
+ if (modified)\r
+ if (!Confirm("Lose unsaved changes?"))\r
+ {\r
+ key[SCAN_ALT]=0;\r
+ key[SCAN_X]=0;\r
+ goto thingy;\r
+ }\r
+\r
+ ShutdownVideo();\r
+ ShutdownKeyboard();\r
+ ShutdownTimer();\r
+ SaveNewCFG();\r
+ remove("$$BACKUP.MAP");\r
+ remove("$$BACKUP.VSP");\r
+\r
+ //if (curtrack != 1) CD_Stop();\r
+ //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
+ MD_PlayStop(); // Mordred\r
+ ML_Free(mf);\r
+\r
+ MD_Exit();\r
+ if (translucency_table)\r
+ vfree(translucency_table); //zero\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MAPED_INC\r
+#define MAPED_INC\r
+\r
+extern const char *const ME2_VERSION;\r
+\r
+#include <stdio.h>\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+typedef struct\r
+{\r
+ unsigned short start; // strand start\r
+ unsigned short finish; // strand end\r
+ unsigned short delay; // tile-switch delay\r
+ unsigned short mode; // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+ char pmultx,pdivx; // parallax multiplier/divisor for X\r
+ char pmulty,pdivy; // parallax multiplier/divisor for Y\r
+ unsigned short sizex, sizey; // layer dimensions.\r
+ unsigned char trans, hline; // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+ char name[40]; // zone name/desc\r
+ unsigned short script; // script to call thingy\r
+ unsigned short percent; // chance of executing\r
+ unsigned short delay; // step-delay\r
+ unsigned short aaa; // Accept Adjacent Activation\r
+ unsigned short entityscript; // script to call for entities\r
+} zoneinfo;\r
+\r
+typedef struct\r
+{\r
+ int x, y; // xwc, ywx position\r
+ word tx, ty; // xtc, ytc position\r
+ byte facing; // direction entity is facing\r
+ byte moving, movecnt; // direction entity is moving\r
+ byte frame; // bottom-line frame to display\r
+ byte specframe; // special-frame set thingo\r
+ byte chrindex, reset; // CHR index | Reset animation\r
+ byte obsmode1, obsmode2; // can be obstructed | Is an obstruction\r
+ byte speed, speedct; // entity speed, speedcount :)\r
+ byte delayct; // animation frame-delay\r
+ char *animofs, *moveofs; // anim script | move script\r
+ byte face, actm; // auto-face | activation mode\r
+ byte movecode, movescript; // movement type | movement script\r
+ byte ctr, mode; // sub-tile move ctr, mode flag (internal)\r
+ word step, delay; // step, delay\r
+ word stepctr, delayctr; // internal use counters\r
+ word data1, data2, data3; //\r
+ word data4, data5, data6; //\r
+ int actscript; // activation script\r
+ int expand1, expand2; //\r
+ int expand3, expand4; //\r
+ char desc[20]; // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+ char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct {\r
+ char t[200];\r
+} movescript;\r
+\r
+extern layer_r layer[4];\r
+extern vspanim_r vspanim[100];\r
+extern zoneinfo zones[256];\r
+extern unsigned short vadelay[100];\r
+extern entity_r entity[256]; // Entity records.\r
+extern byte entities; // number of allocated entities.\r
+extern chrlist_r chrlist[100];\r
+extern byte nmchr;\r
+extern movescript ms[100]; // move scripts arrays\r
+extern byte nms; // number of movement scripts\r
+\r
+extern char *obstruct, *zone, curzone;\r
+extern char numlayers, wrap;\r
+extern unsigned short *layers[6];\r
+extern char rstring[20];\r
+extern char mapname[60], vspname[60];\r
+extern char musname[60];\r
+extern short xstart, ystart;\r
+\r
+// -- vsp related data --\r
+\r
+extern unsigned short numtiles;\r
+extern unsigned char *vsp;\r
+\r
+// -- editing related data --\r
+\r
+extern int xwin, ywin, bmode;\r
+extern char mouse_scroll;\r
+extern short lt, rt;\r
+extern char layertoggle[10], el, modified;\r
+\r
+extern word *copybuf;\r
+extern int copybuf_wide,copybuf_deep;\r
+extern int selx1, sely1, selx2, sely2;\r
+extern int shifted, pasting;\r
+\r
+extern int numzones; // Number of active zones.\r
+\r
+extern int moving_up,moving_down,moving_left,moving_right;\r
+\r
+extern void LoadTransTable();\r
+extern int Exist(char *fname);\r
+extern void err(char *str, ...);\r
+extern void errf(char *str, char *str1);\r
+extern void errn(char *str, int n);\r
+extern int random(int min, int max);\r
+extern void PlayMusic(char *fname);\r
+extern void StopMusic();\r
+extern void LoadVSP(char *fname);\r
+extern void SaveVSP(char *fname);\r
+extern void EmitC (char c);\r
+extern void EmitW (short int w);\r
+extern void WriteCompressedLayer1(unsigned char *p, int len);\r
+extern void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f);\r
+extern void WriteCompressedLayer2(unsigned short *p,int len);\r
+extern void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f);\r
+extern void CountUsedZones();\r
+extern void CountMoveScripts();\r
+extern void CountCHRs();\r
+extern void SaveMAP(char *fname);\r
+extern void LoadOldMAP(FILE *f);\r
+extern void LoadMAP(char *fname);\r
+extern void InitTileIDX();\r
+extern void CheckTimerStuff();\r
+extern void SaveNewCFG();\r
+extern void ShellToDOS();\r
+extern void ShellVERGE();\r
+extern void ShellMAP();\r
+extern void ShellEditMAP();\r
+extern void ShellEditSystem();\r
+extern void CompileAll();\r
+extern void CompileMAP();\r
+extern void tickhandler(void);\r
+extern void RenderHighlight();\r
+extern int EntityThere(int xw, int yw);\r
+extern void AllocateEntity(int xw, int yw);\r
+extern void ProcessEntity(int xw, int yw);\r
+extern void DeleteEntity(int xw, int yw);\r
+extern void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest);\r
+\r
+// Includes for a_memory.c\r
+\r
+void *valloc(int amount, char *desc, int owner);\r
+void *qvalloc(int amount);\r
+int vfree(void *pointer);\r
+void qvfree(void *pointer);\r
+void FreeByOwner(int owner);\r
+void MemReport(void);\r
+void CheckCorruption(void);\r
+\r
+#define free ERROR_YEAH_REPLACE_THIS_WITH_VFREE\r
+\r
+#endif // MAPED_INC\r
--- /dev/null
+/*\r
+\r
+Name:\r
+MIKMOD.C\r
+\r
+Description:\r
+Modplaying example of mikmod.\r
+\r
+MSDOS: BC(y) Watcom(y) DJGPP(y)\r
+Win95: BC(y*)\r
+Os2: y\r
+Linux: n\r
+\r
+* console mode only\r
+(y) - yes\r
+(n) - no (not possible or not useful)\r
+(?) - may be possible, but not tested\r
+\r
+*/\r
+#ifdef __WIN32__\r
+#include <windows.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <conio.h>\r
+#include <string.h>\r
+\r
+#ifndef __OS2__\r
+#include <dos.h>\r
+#endif\r
+\r
+#include "wildfile.h"\r
+#include "mikmod.h"\r
+\r
+char helptext[]=\r
+\r
+"Available switches (CaSe SeNsItIvE!):\n"\r
+"\n"\r
+" /d x use device-driver #x for output (0 is autodetect). Default=0\n"\r
+" /ld List all available device-drivers\n"\r
+" /ll List all available loaders\n"\r
+" /x disables protracker extended speed\n"\r
+" /p disables panning effects (9fingers.mod)\n"\r
+" /v xx Sets volume from 0 (silence) to 100. Default=100\n"\r
+" /f xxxx Sets mixing frequency. Default=44100\n"\r
+" /m Force mono output (so sb-pro can mix at 44100)\n"\r
+" /8 Force 8 bit output\n"\r
+" /i Use interpolated mixing\n"\r
+" /r Restart a module when it's done playing";\r
+\r
+\r
+/*\r
+ declarations for boring old sys-v style getopt *yawn*:\r
+*/\r
+int getopt(int argc, char *argv[], char *optionS);\r
+extern char *optarg;\r
+extern int optind;\r
+extern int opterr;\r
+\r
+\r
+void tickhandler(void)\r
+{\r
+ MP_HandleTick(); /* play 1 tick of the module */\r
+ MD_SetBPM(mp_bpm);\r
+}\r
+\r
+\r
+int main(int argc,char *argv[])\r
+{\r
+ UNIMOD *mf;\r
+ int cmderr=0; /* error in commandline flag */\r
+ int morehelp=0; /* set if user wants more help */\r
+ int quit;\r
+ int t;\r
+ static int nargc;\r
+ static char **nargv;\r
+\r
+ puts(mikbanner);\r
+\r
+ /* Expand wildcards on commandline */\r
+\r
+ nargc=argc; nargv=argv;\r
+#ifndef __DJGPP__\r
+ MyGlob(&nargc,&nargv,0);\r
+#else\r
+ setvbuf(stdout, NULL, _IONBF, 0);\r
+ __djgpp_set_ctrl_c(0);\r
+#endif\r
+\r
+ /*\r
+ Initialize soundcard parameters.. you _have_ to do this\r
+ before calling MD_Init(), and it's illegal to change them\r
+ after you've called MD_Init()\r
+ */\r
+\r
+ md_mixfreq =44100; /* standard mixing freq */\r
+ md_dmabufsize =20000; /* standard dma buf size */\r
+ md_mode =DMODE_16BITS|DMODE_STEREO; /* standard mixing mode */\r
+ md_device =0; /* standard device: autodetect */\r
+\r
+ /*\r
+ Register the loaders we want to use..\r
+ */\r
+\r
+ ML_RegisterLoader(&load_m15); /* if you use m15load, register it as first! */\r
+ ML_RegisterLoader(&load_mod);\r
+ ML_RegisterLoader(&load_mtm);\r
+ ML_RegisterLoader(&load_s3m);\r
+ ML_RegisterLoader(&load_stm);\r
+ ML_RegisterLoader(&load_ult);\r
+ ML_RegisterLoader(&load_uni);\r
+ ML_RegisterLoader(&load_xm);\r
+\r
+ /*\r
+ Register the drivers we want to use:\r
+ */\r
+\r
+ MD_RegisterDriver(&drv_nos);\r
+#ifdef __OS2__\r
+ MD_RegisterDriver(&drv_os2);\r
+#elif defined(__WIN32__)\r
+ MD_RegisterDriver(&drv_w95);\r
+#else\r
+ MD_RegisterDriver(&drv_ss);\r
+ MD_RegisterDriver(&drv_sb);\r
+ MD_RegisterDriver(&drv_gus);\r
+#endif\r
+\r
+ MD_RegisterPlayer(tickhandler);\r
+\r
+ /* Parse option switches using standard getopt function: */\r
+\r
+ opterr=0;\r
+\r
+ while( !cmderr &&\r
+ (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){\r
+\r
+ switch(t){\r
+\r
+ case 'd':\r
+ md_device=atoi(optarg);\r
+ break;\r
+\r
+ case 'l':\r
+ if(optarg[0]=='d') MD_InfoDriver();\r
+ else if(optarg[0]=='l') ML_InfoLoader();\r
+ else{\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ exit(0);\r
+\r
+ case 'r':\r
+ mp_loop=1;\r
+ break;\r
+\r
+ case 'm':\r
+ md_mode&=~DMODE_STEREO;\r
+ break;\r
+\r
+ case '8':\r
+ md_mode&=~DMODE_16BITS;\r
+ break;\r
+\r
+ case 'i':\r
+ md_mode|=DMODE_INTERP;\r
+ break;\r
+\r
+ case 'x':\r
+ mp_extspd=0;\r
+ break;\r
+\r
+ case 'p':\r
+ mp_panning=0;\r
+ break;\r
+\r
+ case 'v':\r
+ if((mp_volume=atoi(optarg))>100) mp_volume=100;\r
+ break;\r
+\r
+ case 'f':\r
+ md_mixfreq=atol(optarg);\r
+ break;\r
+\r
+ case 'h':\r
+ morehelp=1;\r
+ cmderr=1;\r
+ break;\r
+\r
+ case '?':\r
+ puts("\07Invalid switch or option needs an argument\n");\r
+ cmderr=1;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(cmderr || optind>=nargc){\r
+\r
+ /*\r
+ there was an error in the commandline, or there were no true\r
+ arguments, so display a usage message\r
+ */\r
+\r
+ puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");\r
+\r
+ if(morehelp)\r
+ puts(helptext);\r
+ else\r
+ puts("Type MIKMOD /h for more help.");\r
+\r
+ exit(-1);\r
+ }\r
+\r
+ /* initialize soundcard */\r
+\r
+ if(!MD_Init()){\r
+ printf("Driver error: %s.\n",myerr);\r
+ return 0;\r
+ }\r
+\r
+ printf("Using %s for %d bit %s %s sound at %u Hz\n\n",\r
+ md_driver->Name,\r
+ (md_mode&DMODE_16BITS) ? 16:8,\r
+ (md_mode&DMODE_INTERP) ? "interpolated":"normal",\r
+ (md_mode&DMODE_STEREO) ? "stereo":"mono",\r
+ md_mixfreq);\r
+\r
+#ifdef __OS2__\r
+ DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );\r
+#endif\r
+\r
+ for(quit=0; !quit && optind<nargc; optind++){\r
+\r
+ printf("File : %s\n",nargv[optind]);\r
+\r
+ /* load the module */\r
+\r
+ mf=ML_LoadFN(nargv[optind]);\r
+\r
+ /* didn't work -> exit with errormsg. */\r
+\r
+ if(mf==NULL){\r
+ printf("MikMod Error: %s\n",myerr);\r
+ break;\r
+ }\r
+\r
+ /* initialize modplayer to play this module */\r
+\r
+ MP_Init(mf);\r
+\r
+ printf( "Songname: %s\n"\r
+ "Modtype : %s\n"\r
+ "Periods : %s,%s\n",\r
+ mf->songname,\r
+ mf->modtype,\r
+ (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",\r
+ (mf->flags&UF_LINEAR) ? "Linear" : "Log");\r
+\r
+ /*\r
+ set the number of voices to use.. you\r
+ could add extra channels here (e.g. md_numchn=mf->numchn+4; )\r
+ to use for your own soundeffects:\r
+ */\r
+\r
+ md_numchn=mf->numchn;\r
+\r
+ /* start playing the module: */\r
+\r
+ MD_PlayStart();\r
+\r
+ while(!MP_Ready()){\r
+\r
+ char c;\r
+\r
+ c=kbhit() ? getch() : 0;\r
+\r
+ if(c=='+')\r
+ MP_NextPosition();\r
+ else if(c=='-')\r
+ MP_PrevPosition();\r
+ else if(c==0x1b){\r
+ quit=1;\r
+ break;\r
+ }\r
+ else if(c==' ') break;\r
+\r
+ MD_Update();\r
+\r
+ /* wait a bit */\r
+\r
+#if defined(__OS2__)\r
+ DosSleep(40); /* hmmmm */\r
+#elif defined(__WIN32__)\r
+ Sleep(10);\r
+#elif defined(__DJGPP__)\r
+ /* no wait for djgpp ? */\r
+#else\r
+ delay(10);\r
+#endif\r
+ printf("\rsngpos:%d patpos:%d sngspd %d bpm %d ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);\r
+ }\r
+\r
+ MD_PlayStop(); /* stop playing */\r
+ ML_Free(mf); /* and free the module */\r
+ puts("\n");\r
+ }\r
+\r
+ MD_Exit();\r
+ return 0;\r
+}\r
--- /dev/null
+#ifndef MIKMOD_H\r
+#define MIKMOD_H\r
+\r
+#include <stdio.h>\r
+#include "mtypes.h" /* include atomic mikmod types */\r
+\r
+\r
+#define mikbanner \\r
+"=======================================================================\n" \\r
+"MIKMOD v2.10 - Portable version - Programmed by MikMak of HaRDCoDE '95\n" \\r
+"=======================================================================\n" \\r
+"This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \\r
+"E-Mail : mikmak@stack.urc.tue.nl\n"\r
+\r
+\r
+/*\r
+ error variables:\r
+ ===============\r
+*/\r
+\r
+extern char *ERROR_ALLOC_STRUCT;\r
+extern char *ERROR_LOADING_PATTERN;\r
+extern char *ERROR_LOADING_TRACK;\r
+extern char *ERROR_LOADING_HEADER;\r
+extern char *ERROR_NOT_A_MODULE;\r
+extern char *ERROR_LOADING_SAMPLEINFO;\r
+extern char *ERROR_OUT_OF_HANDLES;\r
+extern char *ERROR_SAMPLE_TOO_BIG;\r
+extern char *myerr;\r
+\r
+\r
+\r
+#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)\r
+int _mm_fseek(FILE *stream,long offset,int whence);\r
+void _mm_setiobase(long iobase);\r
+long _mm_ftell(FILE *stream);\r
+\r
+\r
+extern SBYTE _mm_read_SBYTE (FILE *fp);\r
+extern UBYTE _mm_read_UBYTE (FILE *fp);\r
+\r
+extern SWORD _mm_read_M_SWORD (FILE *fp);\r
+extern SWORD _mm_read_I_SWORD (FILE *fp);\r
+\r
+extern UWORD _mm_read_M_UWORD(FILE *fp);\r
+extern UWORD _mm_read_I_UWORD(FILE *fp);\r
+\r
+extern SLONG _mm_read_M_SLONG (FILE *fp);\r
+extern SLONG _mm_read_I_SLONG (FILE *fp);\r
+\r
+extern ULONG _mm_read_M_ULONG(FILE *fp);\r
+extern ULONG _mm_read_I_ULONG(FILE *fp);\r
+\r
+extern int _mm_read_str(char *str, int size, FILE *fp);\r
+\r
+extern int _mm_read_SBYTES (SBYTE *buffer, int number, FILE *fp);\r
+extern int _mm_read_UBYTES (UBYTE *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SWORDS (SWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SLONGS (SLONG *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+\r
+\r
+extern void _mm_write_SBYTE (SBYTE data,FILE *fp);\r
+extern void _mm_write_UBYTE (UBYTE data,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORD (SWORD data,FILE *fp);\r
+extern void _mm_write_I_SWORD (SWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORD (UWORD data,FILE *fp);\r
+extern void _mm_write_I_UWORD (UWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONG (SLONG data,FILE *fp);\r
+extern void _mm_write_I_SLONG (SLONG data,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONG (ULONG data,FILE *fp);\r
+extern void _mm_write_I_ULONG (ULONG data,FILE *fp);\r
+\r
+extern void _mm_write_SBYTES (SBYTE *data, int number,FILE *fp);\r
+extern void _mm_write_UBYTES (UBYTE *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORDS (SWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_SWORDS (SWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONGS (SLONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_SLONGS (SLONG *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp);\r
+\r
+\r
+/**************************************************************************\r
+****** Unitrack stuff: ****************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ prototypes:\r
+*/\r
+\r
+void UniSetRow(UBYTE *t);\r
+UBYTE UniGetByte(void);\r
+UBYTE *UniFindRow(UBYTE *t,UWORD row);\r
+void UniReset(void);\r
+void UniWrite(UBYTE data);\r
+void UniNewline(void);\r
+void UniInstrument(UBYTE ins);\r
+void UniNote(UBYTE note);\r
+void UniPTEffect(UBYTE eff,UBYTE dat);\r
+UBYTE *UniDup(void);\r
+void UniSkipOpcode(UBYTE op);\r
+BOOL UniInit(void);\r
+void UniCleanup(void);\r
+UWORD TrkLen(UBYTE *t);\r
+BOOL MyCmp(UBYTE *a,UBYTE *b,UWORD l);\r
+\r
+/*\r
+ all known effects:\r
+*/\r
+\r
+enum {\r
+ UNI_NOTE=1,\r
+ UNI_INSTRUMENT,\r
+ UNI_PTEFFECT0,\r
+ UNI_PTEFFECT1,\r
+ UNI_PTEFFECT2,\r
+ UNI_PTEFFECT3,\r
+ UNI_PTEFFECT4,\r
+ UNI_PTEFFECT5,\r
+ UNI_PTEFFECT6,\r
+ UNI_PTEFFECT7,\r
+ UNI_PTEFFECT8,\r
+ UNI_PTEFFECT9,\r
+ UNI_PTEFFECTA,\r
+ UNI_PTEFFECTB,\r
+ UNI_PTEFFECTC,\r
+ UNI_PTEFFECTD,\r
+ UNI_PTEFFECTE,\r
+ UNI_PTEFFECTF,\r
+ UNI_S3MEFFECTA,\r
+ UNI_S3MEFFECTD,\r
+ UNI_S3MEFFECTE,\r
+ UNI_S3MEFFECTF,\r
+ UNI_S3MEFFECTI,\r
+ UNI_S3MEFFECTQ,\r
+ UNI_S3MEFFECTT,\r
+ UNI_XMEFFECTA,\r
+ UNI_XMEFFECTG,\r
+ UNI_XMEFFECTH,\r
+ UNI_XMEFFECTP\r
+};\r
+\r
+\r
+/**************************************************************************\r
+****** mikmod types: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+/*\r
+ Sample format flags:\r
+*/\r
+\r
+#define SF_16BITS 1\r
+#define SF_SIGNED 2\r
+#define SF_DELTA 4\r
+#define SF_BIG_ENDIAN 8\r
+#define SF_LOOP 16\r
+#define SF_BIDI 32\r
+#define SF_OWNPAN 64\r
+#define SF_REVERSE 128\r
+\r
+\r
+/*\r
+ Envelope flags:\r
+*/\r
+\r
+#define EF_ON 1\r
+#define EF_SUSTAIN 2\r
+#define EF_LOOP 4\r
+\r
+\r
+/*\r
+ Unimod flags\r
+*/\r
+\r
+#define UF_XMPERIODS 1 /* if set use XM periods/finetuning */\r
+#define UF_LINEAR 2 /* if set use LINEAR periods */\r
+\r
+\r
+typedef struct ENVPT{\r
+ SWORD pos;\r
+ SWORD val;\r
+} ENVPT;\r
+\r
+\r
+typedef struct SAMPLE{\r
+ UWORD c2spd; /* finetune frequency */\r
+ SBYTE transpose; /* transpose value */\r
+ UBYTE volume; /* volume 0-64 */\r
+ UBYTE panning; /* panning */\r
+ ULONG length; /* length of sample (in samples!) */\r
+ ULONG loopstart; /* repeat position (relative to start, in samples) */\r
+ ULONG loopend; /* repeat end */\r
+ UWORD flags; /* sample format */\r
+ ULONG seekpos; /* seek position in file */\r
+ char *samplename; /* name of the sample */\r
+ SWORD handle; /* sample handle */\r
+} SAMPLE;\r
+\r
+\r
+typedef struct INSTRUMENT{\r
+ UBYTE numsmp;\r
+ UBYTE samplenumber[96];\r
+\r
+ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE volpts;\r
+ UBYTE volsus;\r
+ UBYTE volbeg;\r
+ UBYTE volend;\r
+ ENVPT volenv[12];\r
+\r
+ UBYTE panflg; /* bit 0: on 1: sustain 2: loop */\r
+ UBYTE panpts;\r
+ UBYTE pansus;\r
+ UBYTE panbeg;\r
+ UBYTE panend;\r
+ ENVPT panenv[12];\r
+\r
+ UBYTE vibtype;\r
+ UBYTE vibsweep;\r
+ UBYTE vibdepth;\r
+ UBYTE vibrate;\r
+\r
+ UWORD volfade;\r
+ char *insname;\r
+ SAMPLE *samples;\r
+} INSTRUMENT;\r
+\r
+\r
+/*\r
+ MikMod UNImod types:\r
+ ====================\r
+*/\r
+\r
+typedef struct UNIMOD{\r
+ UBYTE numchn; /* number of channels */\r
+ UWORD numpos; /* number of positions in this song */\r
+ UWORD reppos; /* restart position */\r
+ UWORD numpat; /* number of patterns in this song */\r
+ UWORD numtrk; /* number of tracks */\r
+ UWORD numins; /* number of samples */\r
+ UBYTE initspeed; /* */\r
+ UBYTE inittempo; /* */\r
+ UBYTE positions[256]; /* all positions */\r
+ UBYTE panning[32]; /* 32 panning positions */\r
+ UBYTE flags; /* */\r
+ char *songname; /* name of the song */\r
+ char *modtype; /* string type of module */\r
+ char *comment; /* module comments */\r
+ INSTRUMENT *instruments; /* all samples */\r
+ UWORD *patterns; /* array of PATTERN */\r
+ UWORD *pattrows; /* array of number of rows for each pattern */\r
+ UBYTE **tracks; /* array of pointers to tracks */\r
+} UNIMOD;\r
+\r
+\r
+/**************************************************************************\r
+****** Loader stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ loader structure:\r
+*/\r
+\r
+typedef struct LOADER{\r
+ struct LOADER *next;\r
+ char *type;\r
+ char *version;\r
+ BOOL (*Init)(void);\r
+ BOOL (*Test)(void);\r
+ BOOL (*Load)(void);\r
+ void (*Cleanup)(void);\r
+} LOADER;\r
+\r
+\r
+/*\r
+ public loader variables:\r
+*/\r
+\r
+extern UNIMOD of;\r
+extern FILE *modfp;\r
+extern UWORD finetune[16];\r
+\r
+\r
+/*\r
+ main loader prototypes:\r
+*/\r
+\r
+void ML_InfoLoader(void);\r
+void ML_RegisterLoader(LOADER *ldr);\r
+UNIMOD *ML_LoadFP(FILE *fp);\r
+UNIMOD *ML_LoadFN(char *filename);\r
+void ML_Free(UNIMOD *mf);\r
+\r
+\r
+/*\r
+ other loader prototypes: (used by the loader modules)\r
+*/\r
+\r
+BOOL InitTracks(void);\r
+void AddTrack(UBYTE *tr);\r
+BOOL ReadComment(UWORD len);\r
+BOOL AllocPatterns(void);\r
+BOOL AllocTracks(void);\r
+BOOL AllocInstruments(void);\r
+BOOL AllocSamples(INSTRUMENT *i);\r
+char *DupStr(char *s,UWORD len);\r
+void *MyMalloc(size_t size);\r
+void *MyCalloc(size_t nitems,size_t size);\r
+\r
+\r
+/*\r
+ Declare external loaders:\r
+*/\r
+extern LOADER load_uni;\r
+extern LOADER load_mod;\r
+extern LOADER load_m15;\r
+extern LOADER load_mtm;\r
+extern LOADER load_s3m;\r
+extern LOADER load_stm;\r
+extern LOADER load_ult;\r
+extern LOADER load_xm;\r
+\r
+\r
+/**************************************************************************\r
+****** Wavload stuff: *****************************************************\r
+**************************************************************************/\r
+\r
+SAMPLE *MW_LoadWavFP(FILE *fp);\r
+SAMPLE *MW_LoadWavFN(char *filename);\r
+void MW_FreeWav(SAMPLE *si);\r
+\r
+\r
+/**************************************************************************\r
+****** Driver stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+ max. number of handles a driver has to provide. (not strict)\r
+*/\r
+\r
+#define MAXSAMPLEHANDLES 128\r
+\r
+\r
+/*\r
+ possible mixing mode bits:\r
+*/\r
+\r
+#define DMODE_STEREO 1\r
+#define DMODE_16BITS 2\r
+#define DMODE_INTERP 4\r
+\r
+\r
+/*\r
+ driver structure:\r
+*/\r
+\r
+typedef struct DRIVER{\r
+ struct DRIVER *next;\r
+ char *Name;\r
+ char *Version;\r
+ BOOL (*IsPresent) (void);\r
+ SWORD (*SampleLoad) (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+ void (*SampleUnLoad) (SWORD handle);\r
+ BOOL (*Init) (void);\r
+ void (*Exit) (void);\r
+ void (*PlayStart) (void);\r
+ void (*PlayStop) (void);\r
+ void (*Update) (void);\r
+ void (*VoiceSetVolume) (UBYTE voice,UBYTE vol);\r
+ void (*VoiceSetFrequency) (UBYTE voice,ULONG frq);\r
+ void (*VoiceSetPanning) (UBYTE voice,UBYTE pan);\r
+ void (*VoicePlay) (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+} DRIVER;\r
+\r
+\r
+/*\r
+ public driver variables:\r
+*/\r
+\r
+extern DRIVER *md_driver;\r
+extern UWORD md_device;\r
+extern UWORD md_mixfreq;\r
+extern UWORD md_dmabufsize;\r
+extern UWORD md_mode;\r
+extern UBYTE md_numchn;\r
+extern UBYTE md_bpm;\r
+extern void (*md_player)(void);\r
+\r
+/*\r
+ main driver prototypes:\r
+*/\r
+\r
+void MD_InfoDriver(void);\r
+void MD_RegisterDriver(DRIVER *drv);\r
+void MD_RegisterPlayer(void (*plr)(void));\r
+SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void MD_SampleUnLoad(SWORD handle);\r
+BOOL MD_Init(void);\r
+void MD_Exit(void);\r
+void MD_PlayStart(void);\r
+void MD_PlayStop(void);\r
+void MD_SetBPM(UBYTE bpm);\r
+void MD_Update(void);\r
+void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);\r
+void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void MD_VoiceSetPanning(UBYTE voice,ULONG pan);\r
+void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);\r
+void SL_Load(void *buffer,ULONG length);\r
+\r
+/*\r
+ Declare external drivers:\r
+*/\r
+\r
+extern DRIVER drv_gus; /* gravis ultrasound driver */\r
+extern DRIVER drv_sb; /* soundblaster DSP driver */\r
+extern DRIVER drv_ss; /* ensoniq soundscape driver */\r
+extern DRIVER drv_nos; /* nosound driver */\r
+extern DRIVER drv_raw; /* file output driver */\r
+extern DRIVER drv_w95; /* win95 driver */\r
+extern DRIVER drv_awe; /* experimental SB-AWE driver */\r
+extern DRIVER drv_vox; /* linux voxware driver */\r
+extern DRIVER drv_af; /* Dec Alpha AudioFile driver */\r
+extern DRIVER drv_sun; /* Sun driver */\r
+extern DRIVER drv_os2; /* Os2 driver */\r
+extern DRIVER drv_tim; /* timing driver */\r
+\r
+/**************************************************************************\r
+****** Player stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+typedef struct ENVPR{\r
+ UBYTE flg; /* envelope flag */\r
+ UBYTE pts; /* number of envelope points */\r
+ UBYTE sus; /* envelope sustain index */\r
+ UBYTE beg; /* envelope loop begin */\r
+ UBYTE end; /* envelope loop end */\r
+ SWORD p; /* current envelope counter */\r
+ UWORD a; /* envelope index a */\r
+ UWORD b; /* envelope index b */\r
+ ENVPT *env; /* envelope points */\r
+} ENVPR;\r
+\r
+\r
+typedef struct AUDTMP{\r
+ INSTRUMENT *i;\r
+ SAMPLE *s;\r
+\r
+ UWORD fadevol; /* fading volume */\r
+\r
+ ENVPR venv;\r
+ ENVPR penv;\r
+\r
+ UBYTE keyon; /* if true=key is pressed. */\r
+ UBYTE kick; /* if true=sample has to be restarted */\r
+ UBYTE sample; /* which sample number (0-31) */\r
+ SWORD handle; /* which sample-handle */\r
+\r
+ ULONG start; /* The start byte index in the sample */\r
+\r
+ UBYTE panning; /* panning position */\r
+ UBYTE pansspd; /* panslide speed */\r
+\r
+ SBYTE volume; /* amiga volume (0 t/m 64) to play the sample at */\r
+ UWORD period; /* period to play the sample at */\r
+\r
+ /* You should not have to use the values\r
+ below in the player routine */\r
+\r
+ SBYTE transpose;\r
+\r
+ UBYTE note; /* */\r
+\r
+ SWORD ownper;\r
+ SWORD ownvol;\r
+\r
+ UBYTE *row; /* row currently playing on this channel */\r
+\r
+ SBYTE retrig; /* retrig value (0 means don't retrig) */\r
+ UWORD c2spd; /* what finetune to use */\r
+\r
+ SBYTE tmpvolume; /* tmp volume */\r
+\r
+ UWORD tmpperiod; /* tmp period */\r
+ UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */\r
+\r
+ UWORD slidespeed; /* */\r
+ UWORD portspeed; /* noteslide speed (toneportamento) */\r
+\r
+ UBYTE s3mtremor; /* s3m tremor (effect I) counter */\r
+ UBYTE s3mtronof; /* s3m tremor ontime/offtime */\r
+\r
+ UBYTE s3mvolslide; /* last used volslide */\r
+\r
+ UBYTE s3mrtgspeed; /* last used retrig speed */\r
+ UBYTE s3mrtgslide; /* last used retrig slide */\r
+\r
+ UBYTE glissando; /* glissando (0 means off) */\r
+ UBYTE wavecontrol; /* */\r
+\r
+ SBYTE vibpos; /* current vibrato position */\r
+ UBYTE vibspd; /* "" speed */\r
+ UBYTE vibdepth; /* "" depth */\r
+\r
+ SBYTE trmpos; /* current tremolo position */\r
+ UBYTE trmspd; /* "" speed */\r
+ UBYTE trmdepth; /* "" depth */\r
+\r
+ UWORD soffset; /* last used sample-offset (effect 9) */\r
+} AUDTMP;\r
+\r
+\r
+extern AUDTMP mp_audio[32]; /* max eight channels */\r
+extern UBYTE mp_bpm; /* beats-per-minute speed */\r
+extern UWORD mp_patpos; /* current row number (0-63) */\r
+extern SWORD mp_sngpos; /* current song position */\r
+extern UWORD mp_sngspd; /* current songspeed */\r
+\r
+extern BOOL mp_loop;\r
+extern BOOL mp_panning;\r
+extern BOOL mp_extspd;\r
+extern UBYTE mp_volume;\r
+\r
+/*\r
+ player prototypes:\r
+*/\r
+\r
+int MP_Ready(void);\r
+void MP_NextPosition(void);\r
+void MP_PrevPosition(void);\r
+void MP_SetPosition(UWORD pos);\r
+void MP_HandleTick(void);\r
+void MP_Init(UNIMOD *m);\r
+\r
+\r
+/**************************************************************************\r
+****** Virtual channel stuff: *********************************************\r
+**************************************************************************/\r
+\r
+BOOL VC_Init(void);\r
+void VC_Exit(void);\r
+\r
+void VC_PlayStart(void);\r
+void VC_PlayStop(void);\r
+\r
+SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void VC_SampleUnload(SWORD handle);\r
+\r
+void VC_WriteSamples(SBYTE *buf,UWORD todo);\r
+UWORD VC_WriteBytes(SBYTE *buf,UWORD todo);\r
+void VC_SilenceBytes(SBYTE *buf,UWORD todo);\r
+\r
+void VC_VoiceSetVolume(UBYTE voice,UBYTE vol);\r
+void VC_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void VC_VoiceSetPanning(UBYTE voice,UBYTE pan);\r
+void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "config.h"\r
+#include "keyboard.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "vdriver.h"\r
+\r
+// ============================ Data ============================\r
+\r
+unsigned char mvsp[2048]; // mini-VSP dominant color\r
+int xoff=0, yoff=0; // x-offset, y-offset\r
+\r
+// ============================ Code ============================\r
+/*\r
+FindDominantColor(int i)\r
+{ unsigned char *src;\r
+ int j,tally=0;\r
+\r
+ // This is a cheap-ass method. I have a more proper method in mind, but\r
+ // I'm going to do this for now b/c I'm lazy. Actually, the real reason is\r
+ // speed.\r
+\r
+ src=vsp+(i*256);\r
+\r
+ for (j=0; j<256; j++)\r
+ {\r
+ tally+=*src;\r
+ src++;\r
+ }\r
+ tally=tally/256;\r
+ mvsp[i]=(unsigned char) tally;\r
+}\r
+*/\r
+\r
+void FindDominantColor(int i)\r
+{ unsigned char *src, tally[256], tab;\r
+ int j;\r
+\r
+ src=vsp+(i*256);\r
+ memset(&tally, 0, 256);\r
+\r
+ for (j=0; j<256; j++)\r
+ {\r
+ tally[*src]++;\r
+ src++;\r
+ }\r
+ tab=0;\r
+ for (j=0; j<256; j++)\r
+ {\r
+ if (tally[j] > tab) tab=j;\r
+ }\r
+ mvsp[i]=(unsigned char) tab;\r
+}\r
+\r
+void GenerateMiniVSP()\r
+{ int i;\r
+\r
+ for (i=0; i<numtiles; i++)\r
+ FindDominantColor(i);\r
+}\r
+\r
+void MiniMAP()\r
+{ char *ptr,c;\r
+ int _x,_y,ct;\r
+ int i;\r
+\r
+ GenerateMiniVSP();\r
+ ptr=(char *) valloc(layer[0].sizex*layer[0].sizey,"minimap",0);\r
+ //memset(ptr,0,layer[0].sizex*layer[0].sizey);\r
+\r
+ // Now we "draw" the tiles into the buffer.\r
+\r
+ for (i=0; i<4; i++)\r
+ {\r
+ if (!layertoggle[i]) continue;\r
+ ct=0;\r
+ for (_y=0; _y<layer[i].sizey; _y++)\r
+ for (_x=0; _x<layer[i].sizex; _x++)\r
+ {\r
+ c=(unsigned char) mvsp[layers[i][(_y*layer[i].sizex)+_x]];\r
+ if (layers[i][(_y*layer[i].sizex)+_x]) ptr[ct]=c;\r
+ ct++;\r
+ }\r
+ }\r
+\r
+ while (!key[SCAN_ESC] && !mb)\r
+ {\r
+ ClearScreen();\r
+ CCopySprite(16-xoff, 16-yoff, layer[0].sizex, layer[0].sizey, ptr);\r
+ ReadMouse();\r
+ HLine(mx, my, 20, white);\r
+ VLine(mx, my, ty, white);\r
+ VLine(mx+19, my, ty, white);\r
+ HLine(mx, my+ty, 20, white);\r
+\r
+ ShowPage();\r
+\r
+ if (key[SCAN_LEFT] && xoff)\r
+ {\r
+ if (xoff > 0) xoff-=16;\r
+ key[SCAN_LEFT]=0;\r
+ }\r
+ if (key[SCAN_UP] && yoff)\r
+ {\r
+ if (yoff > 0) yoff-=16;\r
+ key[SCAN_UP]=0;\r
+ }\r
+ if (key[SCAN_DOWN])\r
+ {\r
+ if (yoff < layer[0].sizey)\r
+ yoff+=16;\r
+ key[SCAN_DOWN]=0;\r
+ }\r
+ if (key[SCAN_RIGHT])\r
+ {\r
+ if (xoff < layer[0].sizex)\r
+ xoff+=16;\r
+ key[SCAN_RIGHT]=0;\r
+ }\r
+ if (mb)\r
+ {\r
+ xwin=(xoff+mx-16)*16;\r
+ ywin=(yoff+my-16)*16;\r
+ if (xwin>=(layer[0].sizex*16)-320) xwin=(layer[0].sizex*16)-320;\r
+ if (ywin>=(layer[0].sizey*16)-tsy-15) ywin=(layer[0].sizey*16)-tsy-15;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+ }\r
+ key[SCAN_ESC]=0;\r
+ vfree(ptr);\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MINIMAP_INC\r
+#define MINIMAP_INC\r
+\r
+extern void FindDominantColor(int i);\r
+extern void GenerateMiniVSP();\r
+extern void MiniMAP();\r
+\r
+#endif // MINIMAP_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "mode13h.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+char *screenr; // realscr\r
+char startline=16; // virtual scroll around 240 vert. pixels\r
+extern unsigned char* translucency_table; //zero\r
+\r
+extern void *valloc(int amount, char*, int);\r
+extern int vfree(void *);\r
+extern void CheckTimerStuff(); // in maped.c\r
+\r
+// ================================= Code ====================================\r
+\r
+\r
+void SetMode(int mode)\r
+{\r
+ REGISTERS r;\r
+ SET_AX(r, mode);\r
+ INTERRUPT(0x10, r);\r
+}\r
+\r
+int Mode13hShutdown()\r
+{\r
+ SetMode(0x3);\r
+ vfree(screen);\r
+ screen=0;\r
+ return 0;\r
+}\r
+\r
+int Mode13hShowPage()\r
+{ int rows;\r
+ char *s,*d;\r
+\r
+ CheckTimerStuff();\r
+\r
+ s=screen+(16*tsx)+16;\r
+ d=screenr;\r
+ rows=sy;\r
+\r
+ for (; rows; rows--)\r
+ {\r
+ memcpy(d,s,sx);\r
+ s+=tsx;\r
+ d+=sx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ memcpy(d,src,width);\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+ char c;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src+(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hTCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+ char c;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ c=src[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopyTile(int x, int y, char *src)\r
+{ int h;\r
+ char *d;\r
+\r
+ h=16;\r
+ d=screen+(y*tsx)+x;\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d, src, 16);\r
+ src+=16;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hVLine(int x, int y, int length, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)\r
+ return 0;\r
+\r
+ if (y+length > cy2) length=cy2-y+1;\r
+ if (y<cy1) { length-=(cy1-y); y=cy1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; length; length--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hHLine(int x, int y, int width, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hFilledBox(int x, int y, int width, int height, char c)\r
+{\r
+ for (; height; height--,y++)\r
+ Mode13hHLine(x, y, width, c);\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hColorGrid(int x, int y, char c)\r
+{ char *d;\r
+\r
+ if (x<0 || x>336 || y<0 || y>256) return 0;\r
+ d=screen+(y*tsx)+x;\r
+ for (y=0; y<8; y++)\r
+ {\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx+1);\r
+\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx-1);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Mode13hClearScreen()\r
+{\r
+ memset(screen,0,76032);\r
+ return 0;\r
+}\r
+\r
+int Mode13hCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)\r
+{\r
+ int cx1,cy1,cx2,cy2;\r
+ unsigned char *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 1;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+ return 1;\r
+}\r
+\r
+void InitMode13h()\r
+{\r
+ SetMode(0x13);\r
+\r
+ screenr=(char *) 0xA0000;\r
+ screen=(char *) valloc(352*(216+16),"Screen",0);\r
+ //memset(screen,0,95744);\r
+\r
+ sx=320; sy=200;\r
+ tsx=352; tsy=216;\r
+ tx=20; ty=13;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo=&Mode13hShutdown;\r
+ ShowPage=&Mode13hShowPage;\r
+ CopySprite=&Mode13hCopySprite;\r
+ CCopySprite=&Mode13hCCopySprite;\r
+ TCCopySprite=&Mode13hTCCopySprite;\r
+ TCopySprite=&Mode13hTCopySprite;\r
+ CopyTile=&Mode13hCopyTile;\r
+ FilledBox=&Mode13hFilledBox;\r
+ VLine=&Mode13hVLine;\r
+ HLine=&Mode13hHLine;\r
+ ColorGrid=&Mode13hColorGrid;\r
+ ClearScreen=&Mode13hClearScreen;\r
+ CopySpriteLucentClip=&Mode13hCopySpriteLucentClip;\r
+\r
+ map_scroll_x =\r
+ map_scroll_y = 2;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MODE13H_INC\r
+#define MODE13H_INC\r
+\r
+extern void SetMode(int mode);\r
+extern int Mode13hShutdown();\r
+extern int Mode13hShowPage();\r
+extern int Mode13hCopySprite(int x, int y, int width, int height, char *src);\r
+extern int Mode13hCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int Mode13hTCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int Mode13hTCopySprite(int x, int y, int width, int height, char *src);\r
+extern int Mode13hCopyTile(int x, int y, char *src);\r
+extern int Mode13hVLine(int x, int y, int length, char color);\r
+extern int Mode13hHLine(int x, int y, int width, char color);\r
+extern int Mode13hFilledBox(int x, int y, int width, int height, char c);\r
+extern int Mode13hColorGrid(int x, int y, char c);\r
+extern int Mode13hClearScreen();\r
+extern int Mode13hCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src);\r
+extern void InitMode13h();\r
+\r
+#endif // MODE13H_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <conio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "mode13h.h" // SetMode()\r
+#include "modex.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#define SEQU_ADDR 0x3c4\r
+#define CRTC_ADDR 0x3d4\r
+#define MISC_OUTPUT 0x3c2\r
+\r
+char *screen1, *screen2; // page banks;\r
+char *screenx, curscr; // ptr to active page | page flip ctr\r
+char *screenbase; // ptr to A000:0000\r
+\r
+extern unsigned char* translucency_table; //zero\r
+\r
+extern void CheckTimerStuff();\r
+extern void *valloc(int amount,char*,int);\r
+extern int vfree(void *);\r
+\r
+// ================================= Code ====================================\r
+\r
+static void plane(char p)\r
+{\r
+ int hi=1<<p;\r
+ outpw(0x03c4, (hi<<8)|0x02);\r
+}\r
+\r
+extern void SetModeX(void);\r
+\r
+int ModeXShutdown()\r
+{\r
+ SetMode(0x3);\r
+ vfree(screen);\r
+ return 0;\r
+}\r
+\r
+int ModeXShowPage()\r
+{ char *s,*se,*d,*de;\r
+ int k;\r
+\r
+ CheckTimerStuff();\r
+\r
+ s=screen+(16*tsx)+16;\r
+ se=s+(sy*tsx);\r
+ d=screenx;\r
+\r
+ while (s<se)\r
+ {\r
+ for (k=0; k<4; k++)\r
+ {\r
+ plane(k);\r
+ de=d+(sx>>2);\r
+\r
+ while (d<de)\r
+ {\r
+ d[0]=s[k];\r
+ d[1]=s[k+4];\r
+ s+=8;\r
+ d+=2;\r
+ }\r
+\r
+ s-=sx;\r
+ d-=(sx>>2);\r
+ }\r
+\r
+ s+=tsx;\r
+ d+=(sx>>2);\r
+ }\r
+ return 0;\r
+}\r
+\r
+int ModeXCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ memcpy(d,src,width);\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ memcpy(d,s,xl);\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXTCCopySprite(int x,int y,int width,int height,char *src)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *s,*d;\r
+ int xl,yl,xs,ys;\r
+ char c;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 0;\r
+\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (xs+ys) s+=(ys*width)+xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXTCopySprite(int x, int y, int width, int height, char *src)\r
+{ char *d;\r
+ char c;\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; height; height--)\r
+ {\r
+ for (x=0; x<width; x++)\r
+ {\r
+ c=src[x];\r
+ if (c)\r
+ d[x]=c;\r
+ }\r
+ src+=width;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXCopyTile(int x, int y, char *src)\r
+{ int h;\r
+ char *d;\r
+\r
+ h=16;\r
+ d=screen+(y*tsx)+x;\r
+ for (; h; h--)\r
+ {\r
+ memcpy(d, src, 16);\r
+ src+=16;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXVLine(int x, int y, int length, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x<cx1 || y+length<cy1)\r
+ return 0;\r
+\r
+ if (y+length > cy2) length=cy2-y+1;\r
+ if (y<cy1) { length-=(cy1-y); y=cy1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ for (; length; length--)\r
+ {\r
+ *d=color;\r
+ d+=tsx;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXHLine(int x, int y, int width, char color)\r
+{ int cx1,cy1,cx2,cy2;\r
+ char *d;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ if (x>cx2 || y>cy2 || x+width<cx1 || y<cy1)\r
+ return 0;\r
+\r
+ if (x+width > cx2) width=cx2-x+1;\r
+ if (x<cx1) { width-=(cx1-x); x=cx1; }\r
+\r
+ d=screen+(y*tsx)+x;\r
+ memset(d,color,width);\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXFilledBox(int x, int y, int width, int height, char c)\r
+{\r
+ for (; height; height--,y++)\r
+ ModeXHLine(x, y, width, c);\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXColorGrid(int x, int y, char c)\r
+{ char *d;\r
+\r
+ if (x<0 || x>336 || y<0 || y>256) return 0;\r
+ d=screen+(y*tsx)+x;\r
+ for (y=0; y<8; y++)\r
+ {\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx+1);\r
+\r
+ d[0]=c; d[2]=c; d[4]=c; d[6]=c;\r
+ d[8]=c; d[10]=c; d[12]=c; d[14]=c;\r
+\r
+ d+=(tsx-1);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int ModeXClearScreen()\r
+{\r
+ memset(screen,0,90117);\r
+ return 0;\r
+}\r
+\r
+int ModeXCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src)\r
+{\r
+ int cx1,cy1,cx2,cy2;\r
+ unsigned char *s,*d,c;\r
+ int xl,yl,xs,ys;\r
+\r
+ cx1=0;\r
+ cy1=0;\r
+ cx2=tsx-1;\r
+ cy2=tsy-1;\r
+\r
+ xl=width;\r
+ yl=height;\r
+ xs=ys=0;\r
+ if (x>cx2 || y>cy2 || x+xl<cx1 || y+yl<cy1)\r
+ return 1;\r
+ if (x+xl > cx2) xl=cx2-x+1;\r
+ if (y+yl > cy2) yl=cy2-y+1;\r
+ if (x<cx1) { xs=cx1-x; xl-=xs; x=cx1; }\r
+ if (y<cy1) { ys=cy1-y; yl-=ys; y=cy1; }\r
+\r
+ s=src;\r
+ if (ys) s+=(ys*width); // only perform mul if necessary ;)\r
+ if (xs) s+=xs;\r
+ d=screen+(y*tsx)+x;\r
+\r
+ for (; yl; yl--)\r
+ {\r
+ for (x=0; x<xl; x++)\r
+ {\r
+ c=s[x];\r
+ if (c)\r
+ d[x]=translucency_table[d[x]|(c<<8)];\r
+ }\r
+ s+=width;\r
+ d+=tsx;\r
+ }\r
+ return 1;\r
+}\r
+\r
+\r
+void InitModeX()\r
+{ char in_byte;\r
+\r
+ SetMode(0x13);\r
+\r
+ outpw(SEQU_ADDR, 0x0604);\r
+ memset((unsigned char *)0xA0000, 0, 0x10000);\r
+ outpw(SEQU_ADDR, 0x0110);\r
+ outp(MISC_OUTPUT, 0xe3);\r
+ outpw(SEQU_ADDR, 0x0300);\r
+ outp(CRTC_ADDR, 0x11);\r
+ in_byte = inp((CRTC_ADDR+1));\r
+ in_byte = (in_byte && 0x7f);\r
+ outp((CRTC_ADDR+1), in_byte);\r
+ outpw(CRTC_ADDR, 0x0d06);\r
+ outpw(CRTC_ADDR, 0x3e07);\r
+ outpw(CRTC_ADDR, 0x4109);\r
+ outpw(CRTC_ADDR, 0xea10);\r
+ outpw(CRTC_ADDR, 0xac11);\r
+ outpw(CRTC_ADDR, 0xdf12);\r
+ outpw(CRTC_ADDR, 0x0014);\r
+ outpw(CRTC_ADDR, 0xe715);\r
+ outpw(CRTC_ADDR, 0x0616);\r
+ outpw(CRTC_ADDR, 0xe317);\r
+\r
+ //sx=320; sy=240;\r
+ //tsx=352; tsy=272;\r
+ //tx=20; ty=15;\r
+ //endcol=336; nextl=80;\r
+ //winofs=5632;\r
+\r
+ screenx=(char *) 0xA0000;\r
+ screen=(char *) valloc(352*(256+16),"screen",0);\r
+ //memset(screen,0,95744);\r
+ curscr=0;\r
+\r
+ sx=320; sy=240;\r
+ tsx=352; tsy=256;\r
+ tx=20; ty=15;\r
+\r
+ // Mode successfuly set, now lets set up the driver.\r
+ ShutdownVideo=&ModeXShutdown;\r
+ ShowPage=&ModeXShowPage;\r
+ CopySprite=&ModeXCopySprite;\r
+ CCopySprite=&ModeXCCopySprite;\r
+ TCCopySprite=&ModeXTCCopySprite;\r
+ TCopySprite=&ModeXTCopySprite;\r
+ CopyTile=&ModeXCopyTile;\r
+ FilledBox=&ModeXFilledBox;\r
+ HLine=&ModeXHLine;\r
+ VLine=&ModeXVLine;\r
+ ColorGrid=&ModeXColorGrid;\r
+ ClearScreen=&ModeXClearScreen;\r
+ CopySpriteLucentClip=&ModeXCopySpriteLucentClip;\r
+\r
+ map_scroll_x =\r
+ map_scroll_y = 2;\r
+}\r
+\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MODEX_INC\r
+#define MODEX_INC\r
+\r
+extern int ModeXShutdown();\r
+extern int ModeXShowPage();\r
+extern int ModeXCopySprite(int x, int y, int width, int height, char *src);\r
+extern int ModeXCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int ModeXTCCopySprite(int x,int y,int width,int height,char *src);\r
+extern int ModeXTCopySprite(int x, int y, int width, int height, char *src);\r
+extern int ModeXCopyTile(int x, int y, char *src);\r
+extern int ModeXVLine(int x, int y, int length, char color);\r
+extern int ModeXHLine(int x, int y, int width, char color);\r
+extern int ModeXFilledBox(int x, int y, int width, int height, char c);\r
+extern int ModeXColorGrid(int x, int y, char c);\r
+extern int ModeXClearScreen();\r
+extern int ModeXCopySpriteLucentClip(int x, int y, int width, int height, unsigned char *src);\r
+extern void InitModeX();\r
+\r
+#endif // MODEX_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <i86.h>\r
+#include <string.h>\r
+\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+extern char mousepic[]; // blah\r
+\r
+static union REGS regs;\r
+\r
+int mx=0,my=0,mb=0;\r
+int rb=0,wb=0;\r
+int lmx=0,lmy=0,lmb=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void PutMouse(int x, int y)\r
+{\r
+ lmx=mx; lmy=my; lmb=mb;\r
+ memset(®s, 0, sizeof regs);\r
+ regs.w.ax=4;\r
+ regs.w.cx=x*2;\r
+ regs.w.dx=y*2;\r
+ int386(0x33,®s,®s);\r
+\r
+ mx=x; my=y;\r
+}\r
+\r
+void InitMouse()\r
+{\r
+ memset(®s, 0, sizeof regs);\r
+ int386(0x33,®s,®s);\r
+\r
+ regs.w.ax=7;\r
+ regs.w.cx=0;\r
+ regs.w.dx=640; /*320;*/ /* -- ric:13/Jun/98 - fix horizontal jumps -- */\r
+ int386(0x33,®s,®s);\r
+\r
+ regs.w.ax=8;\r
+ regs.w.cx=0;\r
+ regs.w.dx=sy; // aen\r
+ int386(0x33,®s,®s);\r
+\r
+ PutMouse(sx/2,(sy/2) /2); // aen\r
+}\r
+\r
+void ReadMouse()\r
+{\r
+ lmx=mx; lmy=my; lmb=mb;\r
+ memset(®s, 0, sizeof regs);\r
+ regs.w.ax=3;\r
+ int386(0x33,®s,®s);\r
+\r
+ mx=((regs.w.cx)>>1)+16; /* -- ric:13/Jun/98 - fix horizontal jumps -- */\r
+ my=(regs.w.dx)+16;\r
+ rb=regs.w.bx;\r
+\r
+ if (rb && wb) { mb=0; return; }\r
+ if (wb && !rb) wb=0;\r
+ mb=rb;\r
+\r
+ if ((lmx!=mx) || (lmy!=my) || (lmb!=mb)) idlect=0;\r
+}\r
+\r
+void DrawMouse()\r
+{\r
+ ReadMouse();\r
+ TCopySprite(mx,my,4,5,mousepic);\r
+}\r
+\r
+void WaitRelease()\r
+{\r
+ wb=1;\r
+ mb=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef MOUSE_INC\r
+#define MOUSE_INC\r
+\r
+extern int mx,my,mb;\r
+extern int rb,wb;\r
+extern int lmx,lmy,lmb;\r
+\r
+extern void PutMouse(int x, int y);\r
+extern void InitMouse();\r
+extern void ReadMouse();\r
+extern void DrawMouse();\r
+extern void WaitRelease();\r
+\r
+#endif // MOUSE_INC\r
--- /dev/null
+#ifndef MTYPES_H\r
+#define MTYPES_H\r
+\r
+/*\r
+ MikMod atomic types:\r
+ ====================\r
+*/\r
+\r
+\r
+#ifdef __OS2__\r
+\r
+typedef signed char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+/* ULONG and BOOL are already defined in OS2.H */\r
+\r
+#elif defined(__alpha)\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+/* long is 8 bytes on dec alpha - RCA */\r
+typedef int SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned int ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#else\r
+\r
+typedef char SBYTE; /* has to be 1 byte signed */\r
+typedef unsigned char UBYTE; /* has to be 1 byte unsigned */\r
+typedef short SWORD; /* has to be 2 bytes signed */\r
+typedef unsigned short UWORD; /* has to be 2 bytes unsigned */\r
+typedef long SLONG; /* has to be 4 bytes signed */\r
+typedef unsigned long ULONG; /* has to be 4 bytes unsigned */\r
+typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */\r
+\r
+#endif\r
+\r
+\r
+#ifdef __OS2__\r
+#define INCL_DOS\r
+#define INCL_MCIOS2\r
+#define INCL_MMIOOS2\r
+#include <os2.h>\r
+#include <os2me.h>\r
+#include <mmio.h>\r
+#endif\r
+\r
+\r
+#ifdef __WATCOMC__\r
+#define inportb(x) inp(x)\r
+#define outportb(x,y) outp(x,y)\r
+#define inport(x) inpw(x)\r
+#define outport(x,y) outpw(x,y)\r
+#define disable() _disable()\r
+#define enable() _enable()\r
+#endif\r
+\r
+\r
+#ifdef __DJGPP__\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+#include <pc.h>\r
+#define inp inportw\r
+#define outport outportw\r
+#define inport inportw\r
+#define interrupt \r
+#endif\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include "timer.h"\r
+#include "vga.h"\r
+\r
+char manufacturer; // pcx header\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+short int xmin,ymin;\r
+short int xmax,ymax;\r
+short int hres;\r
+short int vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+short int bytes_per_line;\r
+short int palette_type;\r
+char filler[58];\r
+\r
+unsigned short int width,depth;\r
+unsigned short int bytes, i;\r
+unsigned char c, run, ss=0;\r
+unsigned int vidoffset, n=0;\r
+FILE *pcxf;\r
+\r
+void ReadPCXLine(unsigned char *dest)\r
+{ int j;\r
+ n=0;\r
+\r
+ do {\r
+ c=fgetc(pcxf) & 0xff;\r
+ if ((c & 0xc0)==0xc0) {\r
+ run=c & 0x3f;\r
+ c=fgetc(pcxf);\r
+ for (j=0; j<run; j++)\r
+ dest[vidoffset+n+j]=c;\r
+ n+=run; }\r
+ else { dest[vidoffset+n]=c;\r
+ n++; }\r
+ } while (n<bytes);\r
+ fread(strbuf, 1, bytes_per_line-width, pcxf);\r
+}\r
+\r
+void LoadPCXHeader(char *fname)\r
+{\r
+ if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ fseek(pcxf,-768L,SEEK_END);\r
+ fread(pal,1,768,pcxf);\r
+ fseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+ set_intensity(63);\r
+}\r
+\r
+void LoadPCXHeaderNP(char *fname)\r
+{\r
+ if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+}\r
+\r
+void loadpcx(char *fname, char *dest)\r
+{\r
+ LoadPCXHeader(fname);\r
+\r
+ for (i=0; i<depth; i++)\r
+ { vidoffset=5648+(i*352);\r
+ ReadPCXLine(dest); }\r
+\r
+ fclose(pcxf);\r
+}\r
+\r
+void WritePCXLine(unsigned char *p)\r
+{ int i;\r
+ unsigned char byte,samect,repcode;\r
+\r
+ i=0;\r
+ do\r
+ { byte=p[i++];\r
+ samect=1;\r
+ while (samect<(unsigned) 63 && i<320 && byte==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect>1 || (byte & 0xC0) != 0)\r
+ {\r
+ repcode=0xC0 | samect;\r
+ fwrite(&repcode,1,1,pcxf);\r
+ }\r
+ fwrite(&byte,1,1,pcxf);\r
+ } while (i<320);\r
+}\r
+\r
+void WritePalette()\r
+{ char b;\r
+ int i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] << 2;\r
+\r
+ b=12; fwrite(&b, 1, 1, pcxf);\r
+ fwrite(pal, 1, 768, pcxf);\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+}\r
+\r
+void ScreenShot()\r
+{ unsigned char b1;\r
+ unsigned short int w1;\r
+ char fnamestr[13];\r
+\r
+ // Takes a snapshot of the current screen.\r
+\r
+ dec_to_asciiz(ss,&fnamestr);\r
+ b1=strlen(&fnamestr);\r
+ fnamestr[b1++]='.';\r
+ fnamestr[b1++]='P';\r
+ fnamestr[b1++]='C';\r
+ fnamestr[b1++]='X';\r
+ fnamestr[b1++]=0;\r
+\r
+ pcxf=fopen(&fnamestr,"wb");\r
+ ss++;\r
+\r
+// Write PCX header\r
+\r
+ b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
+ b1=5; fwrite(&b1, 1, 1, pcxf); // version = 3.0, >16 colors\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // encoding always = 1\r
+ b1=8; fwrite(&b1, 1, 1, pcxf); // 8 bits per pixel, for 256 colors\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // xmin = 0;\r
+ w1=0; fwrite(&w1, 1, 2, pcxf); // ymin = 0;\r
+ w1=319; fwrite(&w1, 1, 2, pcxf); // xmax = 319;\r
+ w1=199; fwrite(&w1, 1, 2, pcxf); // ymax = 199;\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // hres = 320;\r
+ w1=200; fwrite(&w1, 1, 2, pcxf); // vres = 200;\r
+\r
+ fwrite(virscr,1,48,pcxf); // 16-color palette data. Who knows what's\r
+ // actually in here. It doesn't matter since\r
+ // the 256-color palette is stored elsewhere.\r
+\r
+ b1=0; fwrite(&b1, 1, 1, pcxf); // reserved always = 0.\r
+ b1=1; fwrite(&b1, 1, 1, pcxf); // number of color planes. Just 1 for 8bit.\r
+ w1=320; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
+\r
+ w1=0; fwrite(&w1, 1, 1, pcxf);\r
+ fwrite(virscr, 1, 59, pcxf); // filler\r
+\r
+ for (w1=0; w1<200; w1++)\r
+ WritePCXLine(screen+(w1*320));\r
+\r
+ WritePalette();\r
+ fclose(pcxf);\r
+ timer_count=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "config.h"\r
+#include "maped.h"\r
+#include "vdriver.h"\r
+\r
+#include "render.h" // MAXTILES\r
+\r
+// ================================= Data ====================================\r
+\r
+extern char stipple[256];\r
+\r
+int oxw=0, oyw=0;\r
+int xofs=0, yofs=0;\r
+int xtc=0, ytc=0;\r
+\r
+char curlayer=0;\r
+short tileidx[MAXTILES];\r
+char flipped[MAXTILES];\r
+\r
+// ------\r
+\r
+chri chrs[100];\r
+\r
+// ================================= Code ====================================\r
+\r
+void DoCHR(int i) // hee hee!\r
+{\r
+ FILE *f;\r
+ char b;\r
+ int q;\r
+ short numframes;\r
+\r
+// free(chrs[i].frame);\r
+// chrs[i].frame=0;\r
+// return;\r
+\r
+ if (!strlen(chrlist[i].t))\r
+ {\r
+ if (chrs[i].frame) vfree(chrs[i].frame);\r
+ chrs[i].frame=0;\r
+ chrs[i].fx=chrs[i].fy=0;\r
+ chrs[i].hx=chrs[i].hy=0;\r
+ return;\r
+ }\r
+ if (!(f=fopen(chrlist[i].t,"rb")))\r
+ {\r
+ if (chrs[i].frame) vfree(chrs[i].frame);\r
+ chrs[i].frame=0;\r
+ chrs[i].fx=chrs[i].fy=0;\r
+ chrs[i].hx=chrs[i].hy=0;\r
+ return;\r
+ }\r
+ if (chrs[i].frame) vfree(chrs[i].frame);\r
+ fread(&b, 1, 1, f);\r
+ if (b!=2)\r
+ {\r
+ // This should really not work with V1 CHRs, but..\r
+ chrs[i].frame=(char *) malloc(512);\r
+ fseek(f, 0, 0);\r
+ fread(chrs[i].frame, 1, 512, f);\r
+ fclose(f);\r
+ chrs[i].fx=16; chrs[i].fy=32;\r
+ chrs[i].hx=0; chrs[i].hy=16;\r
+ return;\r
+ }\r
+ chrs[i].fx=0; fread(&chrs[i].fx, 1, 2, f);\r
+ chrs[i].fy=0; fread(&chrs[i].fy, 1, 2, f);\r
+ chrs[i].hx=0; fread(&chrs[i].hx, 1, 2, f);\r
+ chrs[i].hy=0; fread(&chrs[i].hy, 1, 2, f);\r
+ fread(strbuf, 2, 2, f);\r
+ fread(&numframes, 1, 2, f);\r
+ chrs[i].frame=(char *) valloc(chrs[i].fx*chrs[i].fy*numframes,"chr preview",i);\r
+ fread(&q, 1, 4, f);\r
+\r
+ ReadCompressedLayer1(chrs[i].frame, chrs[i].fx*chrs[i].fy*numframes,f);\r
+\r
+ fclose(f);\r
+}\r
+\r
+void DoCHRdealy()\r
+{\r
+ int i;\r
+\r
+ for (i=0; i<100; i++)\r
+ DoCHR(i);\r
+}\r
+\r
+void BlitBackLayer(char l)\r
+{\r
+ int i,j;\r
+ //int a;\r
+ char *img;\r
+ //char *d;\r
+ unsigned short *lay;\r
+ //int v;\r
+ int mapx,mapy;\r
+ int x,y;\r
+ unsigned int tile;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ mapx = layer[l].sizex;\r
+ mapy = layer[l].sizey;\r
+ lay = layers[l];\r
+\r
+ // Adjust view\r
+ oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
+ oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
+ xofs = 16 - (oxw & 15);\r
+ yofs = 16 - (oyw & 15);\r
+ xtc = oxw / 16;\r
+ ytc = oyw / 16;\r
+\r
+ // Draw it, bitch!\r
+ for (i=0; i <= ty; i++)\r
+ {\r
+ for (j=0; j <= tx; j++)\r
+ {\r
+ x = xtc+j;\r
+ y = ytc+i;\r
+\r
+ // write better clipping sometime\r
+ if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
+ {\r
+ // what the HELL @_@\r
+ tile = lay[(y * mapx) + x];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+ tile = tileidx[tile];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+\r
+ img = &vsp[tile * 256];\r
+\r
+ x = (j * 16) + xofs;\r
+ y = (i * 16) + yofs;\r
+\r
+ //CopyTile(x, y, img);\r
+ CCopySprite(x, y, 16, 16, img);\r
+ }\r
+ }\r
+ }\r
+\r
+ curlayer++;\r
+}\r
+\r
+//zero\r
+extern char* translucency_table;\r
+void LucentBlitLayer(char l)\r
+{\r
+ int i,j;\r
+ //int a,b;\r
+ char *img;\r
+ //char *d;\r
+ unsigned short *lay;\r
+ //int v;\r
+ int mapx,mapy;\r
+ int x,y;\r
+ unsigned int tile;\r
+\r
+ if (!layertoggle[l]) return;\r
+ if(!translucency_table)\r
+ {\r
+ TransBlitlayer(l);\r
+ return;\r
+ }\r
+\r
+ mapx = layer[l].sizex;\r
+ mapy = layer[l].sizey;\r
+ lay = layers[l];\r
+\r
+ // Adjust view\r
+ oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
+ oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
+ xofs = 16 - (oxw & 15);\r
+ yofs = 16 - (oyw & 15);\r
+ xtc = oxw / 16;\r
+ ytc = oyw / 16;\r
+\r
+ // Draw it, bitch!\r
+ for (i=0; i <= ty; i++)\r
+ {\r
+ for (j=0; j <= tx; j++)\r
+ {\r
+ x = xtc+j;\r
+ y = ytc+i;\r
+\r
+ // write better clipping sometime\r
+ if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
+ {\r
+ // what the HELL @_@\r
+ tile = lay[(y * mapx) + x];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+ tile = tileidx[tile];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+\r
+ img = &vsp[tile * 256];\r
+ if (img != vsp)\r
+ {\r
+ x = (j * 16) + xofs;\r
+ y = (i * 16) + yofs;\r
+ CopySpriteLucentClip(x, y, 16, 16, img);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ curlayer++;\r
+}\r
+\r
+\r
+void TransBlitlayer(char l)\r
+{\r
+ int i,j;\r
+ //int a,b;\r
+ char *img;\r
+ //char *d;\r
+ unsigned short *lay;\r
+ //int v;\r
+ int mapx,mapy;\r
+ int x,y;\r
+ unsigned int tile;\r
+\r
+ if (!layertoggle[l]) return;\r
+\r
+ lay = layers[l];\r
+\r
+ mapx = layer[l].sizex;\r
+ mapy = layer[l].sizey;\r
+\r
+ // Adjust view\r
+ oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
+ oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
+ xofs = 16 - (oxw & 15);\r
+ yofs = 16 - (oyw & 15);\r
+ xtc = oxw / 16;\r
+ ytc = oyw / 16;\r
+\r
+ // Draw it, bitch!\r
+ for (i=0; i <= ty; i++)\r
+ {\r
+ for (j=0; j <= tx; j++)\r
+ {\r
+ x = xtc+j;\r
+ y = ytc+i;\r
+\r
+ // write better clipping sometime\r
+ if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
+ {\r
+ // what the HELL @_@\r
+ tile = lay[(y * mapx) + x];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+ tile = tileidx[tile];\r
+ if (tile >= numtiles) tile = numtiles-1;\r
+\r
+ img = &vsp[tile * 256];\r
+ if (img != vsp)\r
+ {\r
+ x = (j * 16) + xofs;\r
+ y = (i * 16) + yofs;\r
+ //TCopySprite(x, y, 16, 16, img);\r
+ TCCopySprite(x, y, 16, 16, img);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ curlayer++;\r
+}\r
+\r
+void BlitLayer(char c)\r
+{\r
+ if(layer[c].trans) { LucentBlitLayer(c); return; } //zero\r
+ if (curlayer) TransBlitLayer(c);\r
+ else BlitBackLayer(c);\r
+}\r
+\r
+void DrawObstructions()\r
+{ int i,j;\r
+ int mapx;\r
+\r
+ mapx = layer[0].sizex;\r
+\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=16-(oxw&15);\r
+ yofs=16-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ if (obstruct[((ytc+i)*mapx)+(xtc+j)])\r
+ {\r
+ TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
+ //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
+ }\r
+ }\r
+}\r
+\r
+void DrawZones()\r
+{ int i,j;\r
+ char z;\r
+ int mapx;\r
+\r
+ mapx = layer[0].sizex;\r
+ oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
+ oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
+ xofs=16-(oxw&15);\r
+ yofs=16-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ z=zone[((ytc+i)*mapx)+(xtc+j)];\r
+ if (z)\r
+ {\r
+ TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
+ //ColorGrid((j*16)+xofs,(i*16)+yofs,z);\r
+ }\r
+ }\r
+}\r
+\r
+void DrawEntities()\r
+{ int m;\r
+\r
+ for (m=0; m<entities; m++)\r
+ if ((entity[m].x>=(xwin/16)) && (entity[m].x<(xwin/16)+22) &&\r
+ (entity[m].y>=(ywin/16)) && (entity[m].y<(ywin/16)+ty+2))\r
+ {\r
+ if (chrs[entity[m].chrindex].frame)\r
+ TCCopySprite((entity[m].x*16)-xwin+16-chrs[entity[m].chrindex].hx,\r
+ (entity[m].y*16)-ywin+16-chrs[entity[m].chrindex].hy,\r
+ chrs[entity[m].chrindex].fx,\r
+ chrs[entity[m].chrindex].fy,\r
+ chrs[entity[m].chrindex].frame);\r
+ else\r
+ {\r
+ TCCopySprite(\r
+ (entity[m].x*16)-xwin+16,(entity[m].y*16)-ywin+16,16,16,stipple);\r
+ //ColorGrid((entity[m].x*16)-xwin+16,\r
+ // (entity[m].y*16)-ywin+16, 0);\r
+ }\r
+ }\r
+}\r
+\r
+// aen\r
+void DrawSelection()\r
+{ int i,j;\r
+ int x1,y1,x2,y2;\r
+\r
+ oxw=xwin*layer[el].pmultx/layer[el].pdivx;\r
+ oyw=ywin*layer[el].pmulty/layer[el].pdivy;\r
+ xofs=16-(oxw&15);\r
+ yofs=16-(oyw&15);\r
+ xtc=oxw>>4;\r
+ ytc=oyw>>4;\r
+\r
+ x1=selx1;\r
+ y1=sely1;\r
+ x2=selx2;\r
+ y2=sely2;\r
+\r
+ if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
+ if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
+\r
+ for (i=0; i<ty+1; i++)\r
+ for (j=0; j<tx+1; j++)\r
+ {\r
+ if (xtc+j >= x1 && xtc+j <= x2\r
+ && ytc+i >= y1 && ytc+i <= y2)\r
+ {\r
+ TCCopySprite((j*16)+xofs, (i*16)+yofs, 16,16, stipple);\r
+ //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
+ }\r
+ }\r
+}\r
+\r
+void RenderMap()\r
+{ char *src;\r
+ //char rs[2];\r
+\r
+ curlayer=0;\r
+ src=rstring;\r
+\r
+ /*\r
+ rs[1]=0; // aen\r
+ for (; *src; ++src)\r
+ {\r
+ rs[0]=*src;\r
+ BlitLayer(atoi(rs) -1);\r
+ }\r
+ */\r
+ while (*src)\r
+ {\r
+ switch (*src)\r
+ {\r
+ case '1': BlitLayer(0); break;\r
+ case '2': BlitLayer(1); break;\r
+ case '3': BlitLayer(2); break;\r
+ case '4': BlitLayer(3); break;\r
+ case '5': BlitLayer(4); break;\r
+ case '6': BlitLayer(5); break;\r
+ }\r
+ src++;\r
+ }\r
+\r
+ if (!curlayer) memset(screen+5648,0,84480);\r
+ if (layertoggle[6]) DrawObstructions();\r
+ if (layertoggle[7]) DrawZones();\r
+ if (layertoggle[8]) DrawEntities();\r
+ if (shifted) DrawSelection();\r
+}\r
+\r
+void AnimateTile(char i, int l)\r
+{\r
+ switch (vspanim[i].mode)\r
+ {\r
+ case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
+ else tileidx[l]=vspanim[i].start;\r
+ break;\r
+ case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
+ else tileidx[l]=vspanim[i].finish;\r
+ break;\r
+ case 2: tileidx[l]=random(vspanim[i].start,vspanim[i].finish);\r
+ break;\r
+ case 3: if (flipped[l])\r
+ {\r
+ if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
+ else { tileidx[l]++; flipped[l]=0; }\r
+ }\r
+ else\r
+ {\r
+ if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
+ else { tileidx[l]--; flipped[l]=1; }\r
+ }\r
+ }\r
+}\r
+\r
+void Animate(char i)\r
+{ static int l;\r
+\r
+ vadelay[i]=0;\r
+ for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
+ AnimateTile(i,l);\r
+}\r
+\r
+void CheckTileAnimation()\r
+{ static char i;\r
+\r
+ for (i=0; i<100; i++)\r
+ { if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
+ Animate(i);\r
+ vadelay[i]++; }\r
+}\r
+\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef RENDER_INC\r
+#define RENDER_INC\r
+\r
+#define MAXTILES 10240\r
+\r
+extern int oxw, oyw;\r
+extern int xofs, yofs;\r
+extern int xtc, ytc;\r
+\r
+extern char curlayer;\r
+extern short tileidx[MAXTILES];\r
+extern char flipped[MAXTILES];\r
+\r
+extern short tileidx[MAXTILES];\r
+\r
+typedef struct\r
+{\r
+ char *frame;\r
+ int fx, fy;\r
+ int hx, hy;\r
+} chri;\r
+\r
+extern chri chrs[100];\r
+\r
+extern void DoCHR(int i);\r
+extern void DoCHRdealy();\r
+extern void BlitBackLayer(char l);\r
+extern void LucentBlitLayer(char l);\r
+extern void TransBlitLayer(char l);\r
+extern void BlitLayer(char c);\r
+extern void DrawObstructions();\r
+extern void DrawZones();\r
+extern void DrawEntities();\r
+extern void DrawSelection();\r
+extern void RenderMap();\r
+extern void AnimateTile(char i, int l);\r
+extern void Animate(char i);\r
+extern void CheckTileAnimation();\r
+\r
+#endif // RENDER_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+\r
+#include "vdriver.h"\r
+\r
+#define xx 31\r
+\r
+int fontx=0;\r
+int fonty=0;\r
+\r
+char sbA[]={3,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssA[]={3,\r
+ 00,00,00,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx};\r
+\r
+char sbB[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00};\r
+\r
+char ssB[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char sbC[]={3,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ 00,xx,xx};\r
+\r
+char ssC[]={3,\r
+ 00,00,00,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ 00,xx,xx};\r
+\r
+char sbD[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,00};\r
+\r
+char ssD[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,00};\r
+\r
+char sbE[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char ssE[]={3,\r
+ 00,00,00,\r
+ xx,xx,xx,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char sbF[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,00,00};\r
+\r
+char ssF[]={3,\r
+ 00,00,00,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,00,00};\r
+\r
+char sbG[]={3,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,xx};\r
+\r
+char ssG[]={3,\r
+ 00,00,00,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ xx,00,xx,\r
+ 00,xx,xx};\r
+\r
+char sbH[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssH[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx};\r
+\r
+char sbI[]={1,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx};\r
+\r
+char ssI[]={1,\r
+ 00,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx};\r
+\r
+char sbJ[]={3,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char ssJ[]={3,\r
+ 00,00,00,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char sbK[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssK[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char sbL[]={3,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char ssL[]={3,\r
+ 00,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char sbM[]={5,\r
+ xx,00,00,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,00,00,00,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char ssM[]={5,\r
+ 00,00,00,00,00,\r
+ xx,00,00,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char sbN[]={4,\r
+ xx,00,00,xx,\r
+ xx,xx,00,xx,\r
+ xx,00,xx,xx,\r
+ xx,00,00,xx,\r
+ xx,00,00,xx};\r
+\r
+char ssN[]={4,\r
+ 00,00,00,00,\r
+ xx,00,00,xx,\r
+ xx,xx,00,xx,\r
+ xx,00,xx,xx,\r
+ xx,00,00,xx};\r
+\r
+char sbO[]={3,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char ssO[]={3,\r
+ 00,00,00,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char sbP[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,00,\r
+ xx,00,00};\r
+\r
+char ssP[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,00};\r
+\r
+char sbQ[]={4,\r
+ 00,xx,xx,00,\r
+ xx,00,00,xx,\r
+ xx,00,00,xx,\r
+ xx,00,xx,00,\r
+ 00,xx,00,xx};\r
+\r
+char ssQ[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ 00,xx,xx};\r
+\r
+char sbR[]={3,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssR[]={3,\r
+ 00,00,00,\r
+ xx,xx,00,\r
+ xx,00,xx,\r
+ xx,xx,00,\r
+ xx,00,xx};\r
+\r
+char sbS[]={3,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ 00,xx,00,\r
+ 00,00,xx,\r
+ xx,xx,00};\r
+\r
+char ssS[]={3,\r
+ 00,00,00,\r
+ 00,xx,xx,\r
+ xx,00,00,\r
+ 00,xx,xx,\r
+ xx,xx,00};\r
+\r
+char sbT[]={3,\r
+ xx,xx,xx,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char ssT[]={3,\r
+ 00,00,00,\r
+ xx,xx,xx,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char sbU[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char ssU[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char sbV[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char ssV[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00};\r
+\r
+char sbW[]={5,\r
+ xx,00,00,00,xx,\r
+ xx,00,00,00,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char ssW[]={5,\r
+ 00,00,00,00,00,\r
+ xx,00,00,00,xx,\r
+ xx,00,xx,00,xx,\r
+ xx,xx,00,xx,xx,\r
+ xx,00,00,00,xx};\r
+\r
+char sbX[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char ssX[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ xx,00,xx,\r
+ xx,00,xx};\r
+\r
+char sbY[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char ssY[]={3,\r
+ 00,00,00,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,xx,00,\r
+ 00,xx,00};\r
+\r
+char sbZ[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,xx,00,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char ssZ[]={2,\r
+ 00,00,\r
+ xx,xx,\r
+ 00,xx,\r
+ xx,00,\r
+ xx,xx};\r
+\r
+char s1[]={1,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ xx};\r
+\r
+char s2[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,xx};\r
+\r
+char s3[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s4[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,00,xx};\r
+\r
+char s5[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s6[]={3,\r
+ xx,xx,xx,\r
+ xx,00,00,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s7[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,00,xx};\r
+\r
+char s8[]={3,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s9[]={3,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ xx,xx,xx};\r
+\r
+char s0[]={3,\r
+ xx,xx,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ xx,xx,xx};\r
+\r
+char sQuote[]={3,\r
+ xx,00,xx,\r
+ xx,00,xx,\r
+ 00,00,00,\r
+ 00,00,00,\r
+ 00,00,00};\r
+\r
+char sYow[]={1,\r
+ xx,\r
+ xx,\r
+ xx,\r
+ 00,\r
+ xx};\r
+\r
+char sQuotes[]={1,\r
+ xx,\r
+ xx,\r
+ 00,\r
+ 00,\r
+ 00};\r
+\r
+\r
+char sComma[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,xx,\r
+ xx,00};\r
+char sPeriod[]={1,\r
+ 00,\r
+ 00,\r
+ 00,\r
+ 00,\r
+ xx};\r
+\r
+char sMinus[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ xx,xx,\r
+ 00,00,\r
+ 00,00};\r
+\r
+char sQuest[]={3,\r
+ xx,xx,xx,\r
+ 00,00,xx,\r
+ 00,xx,xx,\r
+ 00,00,00,\r
+ 00,xx,00};\r
+\r
+char sColon[]={1,\r
+ 00,\r
+ xx,\r
+ 00,\r
+ xx,\r
+ 00};\r
+\r
+char sch[]={3,\r
+ 00,xx,00,\r
+ xx,xx,xx,\r
+ xx,xx,xx,\r
+ xx,xx,xx,\r
+ 00,xx,00};\r
+\r
+char usc[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ xx,xx};\r
+\r
+char star[]={4,\r
+ 00,00,00,xx,\r
+ xx,00,xx,00,\r
+ 00,xx,00,00,\r
+ 00,00,00,00,\r
+ 00,00,00,00};\r
+\r
+char ss[]={2,\r
+ xx,xx,\r
+ xx,xx,\r
+ xx,xx,\r
+ xx,xx,\r
+ xx,xx};\r
+\r
+char sra[]={3,\r
+ xx,00,00,\r
+ xx,xx,00,\r
+ xx,xx,xx,\r
+ xx,xx,00,\r
+ xx,00,00};\r
+\r
+char slParen[]={2,\r
+ 00,xx,\r
+ xx,00,\r
+ xx,00,\r
+ xx,00,\r
+ 00,xx};\r
+\r
+char srParen[]={2,\r
+ xx,00,\r
+ 00,xx,\r
+ 00,xx,\r
+ 00,xx,\r
+ xx,00};\r
+\r
+char ssemic[]={2,\r
+ xx,xx,\r
+ 00,00,\r
+ xx,xx,\r
+ 00,xx,\r
+ xx,00};\r
+\r
+char sSlash[]={3,\r
+ 00,00,xx,\r
+ 00,00,xx,\r
+ 00,xx,00,\r
+ xx,00,00,\r
+ xx,00,00};\r
+\r
+char sBlank[]={2,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00,\r
+ 00,00};\r
+\r
+// ...\r
+char mousepic[] = { xx,00,00,00,\r
+ xx,xx,00,00,\r
+ xx,xx,xx,00,\r
+ xx,xx,xx,xx,\r
+ 00,00,xx,00,\r
+ 00,00,xx,00};\r
+\r
+char *smal_tbl[]=\r
+{ sBlank,\r
+ sYow, sQuote, ss, ss, ss, ss, sQuotes, slParen, // 40\r
+ srParen, star, ss, sComma, sMinus,sPeriod, sSlash, s0, // 48\r
+ s1, s2, s3, s4, s5, s6, s7, s8, // 56\r
+ s9, sColon, ssemic, ss, ss, sra, sQuest, ss, // 64\r
+ sbA, sbB, sbC, sbD, sbE, sbF, sbG, sbH, // 72\r
+ sbI, sbJ, sbK, sbL, sbM, sbN, sbO, sbP, // 80\r
+ sbQ, sbR, sbS, sbT, sbU, sbV, sbW, sbX, // 88\r
+ sbY, sbZ, ss, ss, ss, ss, usc, sch, // 96\r
+ ssA, ssB, ssC, ssD, ssE, ssF, ssG, ssH, // 102\r
+ ssI, ssJ, ssK, ssL, ssM, ssN, ssO, ssP, // 110\r
+ ssQ, ssR, ssS, ssT, ssU, ssV, ssW, ssX, // 118\r
+ ssY, ssZ }; // 120\r
+\r
+unsigned char lastcol=31;\r
+\r
+void GotoXY(int x1, int y1)\r
+{\r
+ fontx=x1;\r
+ fonty=y1;\r
+}\r
+\r
+void print_char(char c)\r
+{ char* img;\r
+\r
+ c-=32;\r
+ if (c>90) c=2;\r
+ img=smal_tbl[c];\r
+ TCopySprite(fontx,fonty,img[0],5,img+1);\r
+ fontx+=img[0]+1;\r
+}\r
+\r
+void printstring(char *str)\r
+{\r
+ for (; *str; ++str)\r
+ print_char(*str);\r
+}\r
+\r
+int pixels(char *str)\r
+{ int pix;\r
+\r
+ for (pix=0; *str; ++str)\r
+ pix += *smal_tbl[*str-32]+1;\r
+ return pix;\r
+}\r
+\r
+void dec_to_asciiz(int num, char *buf)\r
+{\r
+ sprintf(buf,"%d",num);\r
+}\r
+\r
+void TextColor(unsigned char newc)\r
+{ char *src;\r
+\r
+ src=sbA;\r
+ while ((int)src < (int) smal_tbl)\r
+ {\r
+ if (*src==lastcol) *src=newc;\r
+ src++;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef SMALFONT_INC\r
+#define SMALFONT_INC\r
+\r
+extern int fontx;\r
+extern int fonty;\r
+\r
+extern void GotoXY(int x1, int y1);\r
+extern void print_char(char c);\r
+extern void printstring(char *str);\r
+extern int pixels(char *str);\r
+extern void dec_to_asciiz(int num, char *buf);\r
+extern void TextColor(unsigned char newc);\r
+\r
+#endif // SMALFONT_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <math.h>\r
+#include <malloc.h>\r
+#include <string.h>\r
+\r
+#include "maped.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "mouse.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+static int *dmapx = NULL;\r
+static int *dmapy = NULL;\r
+static unsigned char *dscr = NULL;\r
+static int recalc_distort = 1;\r
+static long build = 0;\r
+\r
+// ================================= Code ====================================\r
+\r
+// aen\r
+static void init_distort(void)\r
+ {\r
+ int x = 0;\r
+ int y = 0;\r
+ int *dx = NULL;\r
+ int *dy = NULL;\r
+\r
+ if (dmapx) vfree(dmapx); dmapx=NULL;\r
+ if (dmapy) vfree(dmapy); dmapy=NULL;\r
+ if (dscr) vfree(dscr); dscr=NULL;\r
+\r
+ // allocate distort lookups\r
+ dmapx = (int *) valloc(tsx*tsy*4,"ssaver X",0);\r
+ dmapy = (int *) valloc(tsx*tsy*4,"ssaver Y",0);\r
+\r
+ // allocate distort image buffer\r
+ dscr = (unsigned char *) valloc(tsx*tsy,"ssaver scrn",0);\r
+\r
+ // copy viewport into distort buffer\r
+ memcpy(dscr, screen, tsx*tsy);\r
+\r
+ dx = dmapx;\r
+ dy = dmapy;\r
+\r
+ // generate distort lookups\r
+ for (y=0; y<tsy; ++y) {\r
+ for (x=0; x<tsx; ++x) {\r
+ *dx++ = sin(y*5*(360.0/tsy)*(3.14/180))*10;\r
+ *dy++ = sin(x*5*(360.0/tsx)*(3.14/180))*10;\r
+ }\r
+ }\r
+ }\r
+\r
+// aen\r
+static void do_distort(void)\r
+ {\r
+ unsigned char *ds=NULL;\r
+ int x=0;\r
+ int y=0;\r
+ static int xt=0;\r
+ static int yt=0;\r
+ int xx=0;\r
+ int yy=0;\r
+ static int thresh=0;\r
+\r
+ if (recalc_distort) {\r
+ init_distort();\r
+ recalc_distort=0;\r
+ }\r
+\r
+ ds=screen; //+(tsx*16)+16;\r
+\r
+ do {\r
+ yy = (y+thresh);\r
+ if (yy >= tsy) yy -= tsy;\r
+ xt += (dmapx[(yy*tsx)+x] * build) >> 16;\r
+\r
+ xx = (x+((thresh*tsx)/tsy));\r
+ if (xx >= tsx) xx -= tsx;\r
+ yt += (dmapy[(yy*tsx)+xx] * build) >> 16;\r
+\r
+ if (xt < 0) xt += tsx;\r
+ if (yt < 0) yt += tsy;\r
+ if (xt >= tsx) xt -= tsx;\r
+ if (yt >= tsy) yt -= tsy;\r
+\r
+ *ds++ = dscr[(yt*tsx)+xt];\r
+\r
+ ++x;\r
+ if (x >= tsx) {\r
+ x = 0;\r
+ ++y;\r
+ //ds+=32;\r
+ }\r
+\r
+ xt = x;\r
+ yt = y;\r
+\r
+ } while (y < tsy);\r
+\r
+ thresh += 2;\r
+ if (thresh >= tsy)\r
+ thresh -= tsy;\r
+\r
+ if (build < 85196) //1.5\r
+ build += 3276;\r
+ }\r
+\r
+void ScreenSaver(void)\r
+ {\r
+ while (idlect > 750)\r
+ {\r
+ ReadMouse();\r
+ do_distort();\r
+ ShowPage();\r
+ }\r
+ recalc_distort=1;\r
+ build = 0;\r
+ }\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef SSAVER_INC\r
+#define SSAVER_INC\r
+\r
+extern void ScreenSaver(void);\r
+\r
+#endif // SSAVER_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// ================================= Code ====================================\r
+\r
+void ScreenSaver()\r
+{\r
+ while (idlect>750)\r
+ {\r
+ ReadMouse();\r
+ ClearScreen();\r
+ ShowPage();\r
+ }\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// Additional code by Richard Lau (aka Ric)\r
+\r
+/* Date started: 08/Jul/98 */\r
+/* -- 29/Jul/98 --\r
+ * Heh, I've actually done quite a lot of work on this even though I intend\r
+ * to replace it. Oh well :)\r
+ *\r
+ * I've now made clicking on the mask indicator button (labelled with a small\r
+ * "m") drop back to draw mode if you're in select mode (since it makes no\r
+ * sense to select an area with the mask turned off). Holding down shift\r
+ * and dragging the mouse when you're in select mode will allow you to select\r
+ * a rectangle. The PgUp/PgDn colour shifters will now work in paste mode\r
+ * (affecting the image in the copy buffer).\r
+ *\r
+ * The fill routine is now in place and I've put a button in for the pick\r
+ * colour/eyedropper tool so that I don't get asked to put in a function for\r
+ * like I continuously did with ACE. Due to the extra buttons I've had to\r
+ * shift some of the other buttons around to make them all fit onto the\r
+ * screen. It's probably not the best arrangement but if anyone comes up with\r
+ * a better layout I'm open to suggestions.\r
+ *\r
+ * The wierd button labelling problem I had last time has been corrected - the\r
+ * problem was traced back to the pixels routine in SMALFONT.C. Aen pointed\r
+ * out that I wasn't allocating space for the NULL terminator for all the\r
+ * strings so that has now been fixed (by adding 1 to strlen).\r
+ *\r
+ * - Ric\r
+ */\r
+/*\r
+ * Keys:\r
+ * CTRL/S + mouse click - (over edit window) Pick up colour under mouse\r
+ * SHIFT+mb down+drag mouse - select rectangle (select mode only)\r
+ * SPACEBAR - toggle between draw mode and select mode\r
+ * CTRL+Z or U - one level undo\r
+ * CTRL+A - select all\r
+ * CTRL+U - unselect all\r
+ * CTRL+C - copy selected area\r
+ * CTRL+X - cut selected area\r
+ * CTRL+V - paste\r
+ * DEL - clears selected area\r
+ * CTRL+R - reverts the tile to the original (like undo in maped 1)\r
+ * (self note: modify to ask for confirmation)\r
+ * G - toggles grid on/off\r
+ * H - toggles hilight on/off\r
+ * M - toggles mask on/off\r
+ * I - inverts mask\r
+ * X - mirrors image\r
+ * Y - flips image\r
+ * L/R - Rotates tile 90 degrees anti-clockwise/clockwise\r
+ * Q/W - Steps through animation (in tile edit mode) if any\r
+ * A/Z and S/X - changes the left or right drawing colours\r
+ * PGUP/PGDN - Colour shift up/down\r
+ * [ and ] - toggle screen resolutions\r
+ * ALT+X - quits to DOS\r
+ */\r
+/* -- 26/Jul/98 --\r
+ * I've actually decided to start the editor over in a new file so that the\r
+ * code is a bit more elegant. As it stands some bits of this are messy but\r
+ * it currently works ;). Anyway I've decided that what I'll do is to in\r
+ * effect write two tile editors - continuing work on this one and working\r
+ * on the rewrite as a "side project". The eventual aim will be to replace\r
+ * this editor with the rewrite but if factors intervene preventing me from\r
+ * completing the rewrite then there'll always be this editor to fall back on.\r
+ *\r
+ * New in this release is a copy/cut/paste system. New buttons have been added.\r
+ * For some reason I haven't figured out yet I can't call the two rotate\r
+ * buttons "Rotate ACW" and "Rotate CW" (it causes MapEd to crash) so I've had\r
+ * to resort to calling them "Turn_L" and "Turn_R".\r
+ * - Ric\r
+ */\r
+\r
+#include <string.h>\r
+#include <malloc.h>\r
+\r
+#include "config.h"\r
+#include "guicomp.h"\r
+#include "keyboard.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "vdriver.h"\r
+\r
+#include "smalfont.h"\r
+\r
+#undef free\r
+\r
+#define TRUE 1\r
+#define FALSE 0\r
+// #define NULL ((void *)0)\r
+\r
+#define MOUSENONE 0 // No mouse buttons pressed\r
+#define MOUSERELEASE 1 // Mouse button released\r
+#define MOUSEPRESSED 2 // Mouse button held down\r
+#define MOUSECLICKED 4 // Mouse button pressed\r
+\r
+// Setup some defines for the regions/areas/windows where everything goes\r
+#define MAX_REGIONS 29 // Number of regions\r
+#define BASEREG 0 // Window coords + title\r
+#define HELPBAR 1 // Helpbar - put helpful messages here :)\r
+#define PALETTE 2 // The palette\r
+#define EDITREG 3 // Main edit window\r
+#define PREVIEW 4 // Preview of image being edited\r
+#define SCOLBOX 5 // Selected colour box\r
+#define SCTXTBX 6 // Text box to show info on the selected colours\r
+#define QUITBUT 7 // Quit button\r
+#define DRAWBUT 8 // Draw mode indicator\r
+#define FILLBUT 9 // Fill mode indicator\r
+#define PICKBUT 10 // Pick mode indicator\r
+#define MASKBUT 11 // Mask mode indicator\r
+#define PSTEBUT 12 // Paste mode indicator\r
+#define EDMDFRM 13 // Frame for edit mode radio buttons\r
+#define MASKIND 14 // Indicator showing if mask is shown\r
+#define GRIDIND 15 // Indicator showing if grid is shown\r
+#define ANIMIND 16 // Indicator showing if animations are shown\r
+#define PXHLIND 17 // Indicator showing if pixel highlight shown\r
+#define IND_FRM 18 // Frame for indicators (push buttons)\r
+#define BUT_FRM 19 // Frame for buttons\r
+#define UNDOBUT 20 // Undo button\r
+#define COPYBUT 21 // Copy button\r
+#define CUT_BUT 22 // Cut button\r
+#define CLR_BUT 23 // Clear button\r
+#define TOOLFRM 24 // Frame for tools\r
+#define FLIPBUT 25 // Flip image button\r
+#define MIRRBUT 26 // Mirror image button\r
+#define RIACBUT 27 // Rotate anticlockwise button\r
+#define RIC_BUT 28 // Rotate clockwise button\r
+\r
+// Define TEbitflags values\r
+#define TEQUITCUR 1\r
+#define TEANIMATE 2\r
+#define TEGRID 4\r
+#define TEHILIGHT 8\r
+#define TESHOWMSK 16\r
+\r
+// Define TEREGION->bitflags values\r
+#define REGVISIBLE 1\r
+#define REGACTIVE 2\r
+#define REGNOCLICK 4\r
+#define REGTWOCLICK 8 // wait for a second click\r
+\r
+// TEeditmode defs\r
+#define EDDRAW 1\r
+#define EDFILL 2\r
+#define EDPICK 4\r
+#define EDMASK 8\r
+#define EDPASTE 16\r
+\r
+// TEtype defs\r
+#define TEUNKNOWN 0\r
+#define TETILE 1\r
+\r
+// DATABUTTON buttontypes:\r
+#define CLICKBUTTON 1 // normal button\r
+#define PUSHBUTTON 2 // can be pushed in/out (toggle bit bitvalue)\r
+#define RADIOBUTTON 4 // for button banks (set *bitflag=bitvalue)\r
+\r
+// DATABASEREGION windowtypes:\r
+#define DBRSTDWINDOW 0 // window and title bar\r
+#define DBRPANEL 1 // no title bar\r
+\r
+// INFOTYPEs:\r
+#define DITREGION 1\r
+#define DITBASEREGION 2\r
+#define DITBUTTON 4\r
+#define DITEDITREG 8\r
+\r
+// Button flag action - has this button been clicked?\r
+#define BFANONE 0\r
+#define BFAUNDO 1\r
+#define BFACOPY 2\r
+#define BFACUT 4\r
+#define BFACLEAR 8\r
+#define BFARIAC 16\r
+#define BFARIC 32\r
+#define BFAMIRROR 64\r
+#define BFAFLIP 128\r
+\r
+// Variables\r
+typedef struct TEREGION\r
+ {\r
+ int infotype; // type of struct\r
+ unsigned int x1, x2, y1, y2; // bounding coordinates\r
+ char *caption; // helpbar text\r
+ int bitflags; // see defines above\r
+ void (*drawproc)(struct TEREGION *); // region's draw procedure\r
+ // - allows nice and short RenderTileEdit proc ;)\r
+ void *data; // extended information\r
+ } TEREGION;\r
+typedef struct DATABASEREGION\r
+ {\r
+ int infotype; // type of struct\r
+ int numofregs; // total number of regions (including base)\r
+ int windowtype; // type of window to draw\r
+ } DATABASEREGION;\r
+typedef struct DATABUTTON\r
+ {\r
+ int infotype; // type of struct\r
+ int *bitflag; // address of bitflag\r
+ char *text; // addition text (eg helptext)\r
+ int bitvalue; // 1st bit/value\r
+ int buttontype; // type\r
+ } DATABUTTON;\r
+typedef struct DATAEDITREG\r
+ {\r
+ int infotype; // type of struct\r
+ int firstx, firsty; // first coords for two-click operation\r
+ } DATAEDITREG;\r
+\r
+\r
+static TEREGION *TEregs=NULL; // pointer to the regions\r
+static unsigned char lcolor=255; // left mouse colour\r
+static unsigned char rcolor=0; // right mouse colour\r
+static TEREGION *TEOldReg=NULL;\r
+static unsigned int MBStatus[3]={MOUSENONE,MOUSENONE,MOUSENONE};\r
+static int TEanimstrand=0; // Animation strand\r
+static int TEbitflags=TEANIMATE; // Set default bitflags\r
+static int TEbfa=BFANONE; // Set default button action flags\r
+static int TEeditmode=EDDRAW; // Default edit region mode\r
+static int TExoffs=16; // X offset for region "windows"\r
+static int TEyoffs=16; // Y offset for region "windows"\r
+unsigned int TEtype=TEUNKNOWN; // type of graphic being edited\r
+unsigned int TEtile; // tile to edit - may possibly expand this to an array for simultaneous editing\r
+unsigned int TExsize=0; // width of graphic being edited\r
+unsigned int TEysize=0; // height of graphic being edited\r
+unsigned int TEcopyxsize=0; // width of copy buffer\r
+unsigned int TEcopyysize=0; // height of copy buffer\r
+unsigned char *TEsource=NULL; // pointer to original image being edited\r
+static unsigned char *TEimage=NULL; // pointer to image being edited\r
+static unsigned char *TEmask=NULL; // pointer to image mask\r
+static unsigned char *TEundo=NULL; // pointer to undo buffer\r
+static unsigned char *TEcopy=NULL; // pointer to copy buffer\r
+static unsigned char *TEcmsk=NULL; // pointer to copy mask\r
+static char TEtempstr[256]; // Temporary string buffer\r
+\r
+// Function prototypes\r
+static void *TEAlloc(unsigned long amount, char *whatfor);\r
+\r
+#define TEFree(ptr) if (ptr) free(ptr); ptr=NULL;\r
+#define TEFreeReg(ptr) DestroyRegions(&ptr); if (ptr) free(ptr); ptr=NULL;\r
+#define TENewText(text, whatfor) (char *) strcpy(TEAlloc(strlen(text)+1, whatfor), text);\r
+//static void TEFree(void *TETmpBuf);\r
+static void MBClickHandler(TEREGION *TEBaseReg);\r
+static void AboutTE(void);\r
+static void DestroyRegions(TEREGION **TEBaseReg);\r
+static void SetupRegions(void);\r
+static void InitTEImage(void);\r
+static void DeinitTEImage(void);\r
+static int MouseOverTEreg(TEREGION *TEr);\r
+static void RenderTileEdit(TEREGION *TEBaseReg);\r
+static void RestartTileEditor(void);\r
+static void SetCaption(TEREGION *TEr, char *helptext);\r
+static void TEDrawHilight(int x1, int y1, int width, int height, unsigned char colour);\r
+static void TEDrawCheckeredBox(int x1, int y1, int width, int height, unsigned char colour);\r
+static void TERegFill(TEREGION *TEr, int colour);\r
+static void TERegText(TEREGION *TEr, char *message);\r
+static void TEClearImage(void);\r
+static void TECopyImage(void);\r
+static void TEFlipImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TEMirrorImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TERotateImageAntiClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TERotateImageClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize);\r
+static void TEFillImage(char *TEFIimage, char *TEFImask, int TEFIxsize, int TEFIysize, int TEFIx, int TEFIy, char TEFIcolour);\r
+static void TERFillImage(char *TERFIimage, char *TERFImask, int TERFIxsize, int TERFIysize, int TERFIx, int TERFIy);\r
+static void TEShiftColours(char *TESCimage, char *TESCmask, int TESCxsize, int TESCysize, int amount);\r
+static void TEUndo(void);\r
+static void DrawButton(TEREGION *TEr);\r
+static void DrawEditReg(TEREGION *TEr);\r
+static void DrawHelpBar(TEREGION *TEr);\r
+static void DrawPalette(TEREGION *TEr);\r
+static void DrawPreview(TEREGION *TEr);\r
+static void DrawSColBox(TEREGION *TEr);\r
+static void DrawSCTxtBx(TEREGION *TEr);\r
+static void DrawSunkRegion(TEREGION *TEr);\r
+void TileEdit(void);\r
+\r
+\r
+static int MouseOverTEreg(TEREGION *TEr)\r
+ {\r
+ unsigned int testx=mx-TExoffs;\r
+ unsigned int testy=my-TEyoffs;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+ testx-=(TEr->x1);\r
+ testy-=(TEr->y1);\r
+\r
+ if (testx >= width || testy >= height) return FALSE;\r
+ return TRUE;\r
+ }\r
+\r
+static void DrawButton(TEREGION *TEr)\r
+// -- ric: 20/Jul/98 - generic button routine\r
+ {\r
+ unsigned int x=TEr->x1+TExoffs;\r
+ unsigned int y=TEr->y1+TEyoffs;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+\r
+ strcpy(TEtempstr,"Button data not declared.");\r
+ if (!TEr->data)\r
+ err(TEtempstr);\r
+ if (((struct DATABUTTON *)(TEr->data))->infotype!=DITBUTTON)\r
+ err(TEtempstr);\r
+\r
+ // draw raised button\r
+ stdwindow(x-1, y-1, x+width+1, y+height+1);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+(width-(pixels(TEr->caption)))/2, y+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ switch (((struct DATABUTTON *)(TEr->data))->buttontype)\r
+ {\r
+ case CLICKBUTTON:\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ if (((struct DATABUTTON *)(TEr->data))->text)\r
+ SetCaption(&TEregs[HELPBAR], (((struct DATABUTTON *)(TEr->data))->text));\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSEPRESSED)\r
+ {\r
+ // draw button down\r
+ FilledBox(x, y, width, height, winbg);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+1+(width-(pixels(TEr->caption)))/2, y+1+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ }\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSERELEASE)\r
+ {\r
+ *(((struct DATABUTTON *)(TEr->data))->bitflag)^=((struct DATABUTTON *)(TEr->data))->bitvalue;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ case PUSHBUTTON:\r
+ if (*(((struct DATABUTTON *)(TEr->data))->bitflag)&(((struct DATABUTTON *)(TEr->data))->bitvalue))\r
+ {\r
+ // draw button down\r
+ FilledBox(x, y, width, height, winbg);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+1+(width-(pixels(TEr->caption)))/2, y+1+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ }\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ if (((struct DATABUTTON *)(TEr->data))->text)\r
+ {\r
+ sprintf(TEtempstr, "Toggle %s on/off", ((struct DATABUTTON *)(TEr->data))->text);\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+ }\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED)\r
+ {\r
+ *(((struct DATABUTTON *)(TEr->data))->bitflag)^=((struct DATABUTTON *)(TEr->data))->bitvalue;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ case RADIOBUTTON:\r
+ if (*(((struct DATABUTTON *)(TEr->data))->bitflag)==((struct DATABUTTON *)(TEr->data))->bitvalue)\r
+ {\r
+ // draw button down\r
+ FilledBox(x, y, width, height, winbg);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ if (TEr->caption)\r
+ {\r
+ GotoXY(x+1+(width-(pixels(TEr->caption)))/2, y+1+(height-6)/2);\r
+ printstring(TEr->caption);\r
+ }\r
+ }\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ if (((struct DATABUTTON *)(TEr->data))->text)\r
+ SetCaption(&TEregs[HELPBAR], (((struct DATABUTTON *)(TEr->data))->text));\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED)\r
+ {\r
+ *(((struct DATABUTTON *)(TEr->data))->bitflag)=((struct DATABUTTON *)(TEr->data))->bitvalue;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+static void DrawSunkRegion(TEREGION *TEr)\r
+ {\r
+ unsigned int x=TEr->x1+TExoffs;\r
+ unsigned int y=TEr->y1+TEyoffs;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+\r
+// FilledBox(x, y, width, height, black);\r
+ HLine(x, y, width, darkw);\r
+ VLine(x, y, height, darkw);\r
+ HLine(x+1, y+height-1, width-1, brightw);\r
+ VLine(x+width-1, y+1, height-1, brightw);\r
+ }\r
+\r
+static void DrawEditReg(TEREGION *TEr)\r
+ {\r
+ int i,j,i2,j2,c;\r
+ int minx,miny,maxx,maxy;\r
+ int blocksize=8;\r
+ int visblocksize=blocksize;\r
+ char *img;\r
+ TEREGION tempr;\r
+ tempr.x1=TEr->x1+2;\r
+ tempr.x2=TEr->x2-2;\r
+ tempr.y1=TEr->y1+2;\r
+ tempr.y2=TEr->y2-2;\r
+\r
+ img=TEimage; //vsp+(256*TEtile);\r
+\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ FilledBox(TEr->x1+TExoffs+2, TEr->y1+TEyoffs+2, (blocksize<<4), (blocksize<<4), titlebg);\r
+\r
+ if (TEbitflags&TEGRID) visblocksize-=1;\r
+\r
+ for (j=0; j<TEysize; j++)\r
+ for (i=0; i<TExsize; i++)\r
+ {\r
+ FilledBox(TEr->x1+TExoffs+2+i*blocksize, TEr->y1+TEyoffs+2+j*blocksize, visblocksize, visblocksize, *img++);\r
+ if (TEbitflags&TESHOWMSK && !TEmask[j*TExsize+i])\r
+ TEDrawCheckeredBox(TEr->x1+TExoffs+2+i*blocksize, TEr->y1+TEyoffs+2+j*blocksize, visblocksize, visblocksize, titlebg);\r
+ }\r
+\r
+ img=TEimage;\r
+ if (TEr->bitflags®ACTIVE && !(MouseOverTEreg(&tempr)) && (MBStatus[0]|MBStatus[1])==MOUSERELEASE)\r
+ if (TEr->bitflags®TWOCLICK) TEr->bitflags^=REGTWOCLICK;\r
+ if (MouseOverTEreg(&tempr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ i=(mx-TExoffs-(tempr.x1))/blocksize;\r
+ j=(my-TEyoffs-(tempr.y1))/blocksize;\r
+ c=img[(j*TExsize)+i];\r
+ sprintf(TEtempstr, "Tile: %d, (%02d, %02d), Color: %03d (rgb: %03d/%03d/%03d)", TEtile, i, j, c, pal[(c*3)], pal[(c*3)+1], pal[(c*3)+2]);\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+ if (TEbitflags&TEHILIGHT)\r
+ TEDrawHilight(TExoffs+i*blocksize+tempr.x1, TEyoffs+j*blocksize+tempr.y1, visblocksize, visblocksize, white);\r
+\r
+ // if pasting draw the image being pasted\r
+ if (TEeditmode==EDPASTE)\r
+ {\r
+ for (j2=0; j2<TEcopyysize; j2++)\r
+ if ((j+j2)<TEysize)\r
+ for (i2=0; i2<TEcopyxsize; i2++)\r
+ if ((i+i2)<TExsize)\r
+ if (TEcmsk[j2*TEcopyxsize+i2])\r
+ if (!(TEbitflags&TESHOWMSK))\r
+ FilledBox(TEr->x1+TExoffs+2+(i+i2)*blocksize, TEr->y1+TEyoffs+2+(j+j2)*blocksize, visblocksize, visblocksize, TEcopy[j2*TEcopyxsize+i2]);\r
+ else\r
+ if (TEmask[(j+j2)*TExsize+i+i2])\r
+ FilledBox(TEr->x1+TExoffs+2+(i+i2)*blocksize, TEr->y1+TEyoffs+2+(j+j2)*blocksize, visblocksize, visblocksize, TEcopy[j2*TEcopyxsize+i2]);\r
+ }\r
+ if (TEeditmode==EDMASK)\r
+ {\r
+ // draw reg\r
+ if (TEr->bitflags®TWOCLICK)\r
+ for (j2=0; j2<TEysize; j2++)\r
+ for (i2=0; i2<TEysize; i2++)\r
+ if (((j2>=j && j2<=((struct DATAEDITREG *)(TEr->data))->firsty) ||\r
+ (j2>=((struct DATAEDITREG *)(TEr->data))->firsty && j2<=j)) &&\r
+ ((i2>=i && i2<=((struct DATAEDITREG *)(TEr->data))->firstx) ||\r
+ (i2>=((struct DATAEDITREG *)(TEr->data))->firstx && i2<=i)))\r
+ TEDrawCheckeredBox(TEr->x1+TExoffs+2+i2*blocksize, TEr->y1+TEyoffs+2+j2*blocksize, visblocksize, visblocksize, darkred);\r
+\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) && !(TEr->bitflags®TWOCLICK))\r
+ {\r
+ ((struct DATAEDITREG *)(TEr->data))->firstx=i;\r
+ ((struct DATAEDITREG *)(TEr->data))->firsty=j;\r
+ TEr->bitflags^=REGTWOCLICK;\r
+ }\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSERELEASE && TEr->bitflags®TWOCLICK)\r
+ {\r
+ if (MBStatus[1]==MOUSERELEASE) c=0x0;\r
+ else c=0xf;\r
+ miny=j;\r
+ maxy=((struct DATAEDITREG *)(TEr->data))->firsty;\r
+ minx=i;\r
+ maxx=((struct DATAEDITREG *)(TEr->data))->firstx;\r
+ if (j>((struct DATAEDITREG *)(TEr->data))->firsty)\r
+ {\r
+ maxy=j;\r
+ miny=((struct DATAEDITREG *)(TEr->data))->firsty;\r
+ }\r
+ if (i>((struct DATAEDITREG *)(TEr->data))->firstx)\r
+ {\r
+ maxx=i;\r
+ minx=((struct DATAEDITREG *)(TEr->data))->firstx;\r
+ }\r
+ for (j2=miny; j2<=maxy; j2++)\r
+ for (i2=minx; i2<=maxx; i2++)\r
+ TEmask[j2*TExsize+i2]=(char)c;\r
+ TEr->bitflags^=REGTWOCLICK;\r
+ }\r
+ }\r
+ // Handle mouse clicks\r
+\r
+#ifdef JUNK\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && (key[SCAN_CTRL]||key[SCAN_S]))\r
+ {\r
+ // put code to lock out draw mode here\r
+ }\r
+#endif\r
+ if (TEOldReg==TEr)\r
+ {\r
+ // Update undo buffer\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && TEeditmode!=EDMASK && TEeditmode!=EDPICK && !(key[SCAN_CTRL]||key[SCAN_S]))\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ if (MBStatus[0]==MOUSECLICKED && TEeditmode==EDFILL)\r
+ TEFillImage(TEimage, (TEbitflags&TESHOWMSK ? TEmask : NULL), TExsize, TEysize, i, j, lcolor);\r
+ if (MBStatus[1]==MOUSECLICKED && TEeditmode==EDFILL)\r
+ TEFillImage(TEimage, (TEbitflags&TESHOWMSK ? TEmask : NULL), TExsize, TEysize, i, j, rcolor);\r
+\r
+ // Draw\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSEPRESSED)\r
+ {\r
+ if (TEeditmode==EDPASTE)\r
+ {\r
+ for (j2=0; j2<TEcopyysize; j2++)\r
+ if ((j+j2)<TEysize)\r
+ for (i2=0; i2<TEcopyxsize; i2++)\r
+ if ((i+i2)<TExsize)\r
+ if (TEcmsk[j2*TEcopyxsize+i2])\r
+ if (!(TEbitflags&TESHOWMSK))\r
+ TEimage[(j+j2)*TExsize+i+i2]=TEcopy[j2*TEcopyxsize+i2];\r
+ else\r
+ if (TEmask[(j+j2)*TExsize+i+i2])\r
+ TEimage[(j+j2)*TExsize+i+i2]=TEcopy[j2*TEcopyxsize+i2];\r
+ }\r
+ }\r
+ if (MBStatus[0]==MOUSEPRESSED)\r
+ if (key[SCAN_CTRL]||key[SCAN_S]||(TEeditmode==EDPICK))\r
+ lcolor=TEimage[(j*TExsize)+i];\r
+ else\r
+ if ((TEeditmode==EDDRAW)&&!(TEbitflags&TESHOWMSK && !TEmask[j*TExsize+i]))\r
+ TEimage[(j*TExsize)+i]=lcolor;\r
+ else\r
+ if (TEeditmode==EDMASK && !(TEr->bitflags®TWOCLICK))\r
+ TEmask[(j*TExsize)+i]=0xf;\r
+ if (MBStatus[1]==MOUSEPRESSED)\r
+ if (key[SCAN_CTRL]||key[SCAN_S]||(TEeditmode==EDPICK))\r
+ rcolor=TEimage[(j*TExsize)+i];\r
+ else\r
+ if ((TEeditmode==EDDRAW)&&!(TEbitflags&TESHOWMSK && !TEmask[j*TExsize+i]))\r
+ TEimage[(j*TExsize)+i]=rcolor;\r
+ else\r
+ if (TEeditmode==EDMASK && !(TEr->bitflags®TWOCLICK))\r
+ TEmask[(j*TExsize)+i]=0x0;\r
+ }\r
+ }\r
+ }\r
+\r
+static void DrawHelpBar(TEREGION *TEr)\r
+ {\r
+ //int i, htext=0;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ if (TEr->caption) TERegText(TEr, TEr->caption);\r
+ TEFree(TEr->caption); // Blank caption\r
+ //TEr->caption=NULL; // why doesn't this work in TEFree?\r
+#ifdef JUNK\r
+ i=MAX_REGIONS;\r
+ do\r
+ {\r
+ i--;\r
+ if (MouseOverTEreg(&TEregs[i])) htext=i;\r
+ } while (i>0);\r
+ if (htext && TEregs[htext].helptext) TERegText(TEr, TEr->caption);\r
+#endif\r
+ }\r
+\r
+static void DrawPalette(TEREGION *TEr)\r
+ {\r
+ int i,j;\r
+ unsigned int width=(TEr->x2)-(TEr->x1);\r
+ unsigned int height=(TEr->y2)-(TEr->y1);\r
+ int xscale=(width-4)>>6;\r
+ int yscale=(height-4)>>2;\r
+ int x=(TEr->x1)+TExoffs;\r
+ int y=(TEr->y1)+TEyoffs;\r
+ TEREGION tempr;\r
+ tempr.x1=TEr->x1+2;\r
+ tempr.x2=TEr->x2-2;\r
+ tempr.y1=TEr->y1+2;\r
+ tempr.y2=TEr->y2-2;\r
+\r
+ x+=2;\r
+ y+=2;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ i=64;\r
+ do\r
+ {\r
+ i--;\r
+ FilledBox(x+(i*xscale), y, xscale, yscale, i);\r
+ FilledBox(x+(i*xscale), y+yscale, xscale, yscale, i+64);\r
+ FilledBox(x+(i*xscale), y+yscale*2, xscale, yscale, i+128);\r
+ FilledBox(x+(i*xscale), y+yscale*3, xscale, yscale, i+192);\r
+ } while (i>0);\r
+\r
+ i=lcolor&63;\r
+ j=lcolor>>6;\r
+ TEDrawHilight(x+i*xscale, y+j*yscale, xscale, yscale, titlebg);\r
+\r
+ i=rcolor&63;\r
+ j=rcolor>>6;\r
+ TEDrawHilight(x+i*xscale, y+j*yscale, xscale, yscale, titlebg);\r
+\r
+ if (MouseOverTEreg(&tempr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ i=(mx-TExoffs-(tempr.x1))/xscale;\r
+ j=(my-TExoffs-(tempr.y1))/yscale;\r
+ i+=(j<<6);\r
+ j=i*3;\r
+ sprintf(TEtempstr, "Color: %03d (rgb: %03d/%03d/%03d)", i, pal[j], pal[j+1], pal[j+2]);\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ {\r
+ if (MBStatus[0]==MOUSEPRESSED) lcolor=i;\r
+ if (MBStatus[1]==MOUSEPRESSED) rcolor=i;\r
+ }\r
+ }\r
+ }\r
+\r
+static void DrawPreview(TEREGION *TEr)\r
+ {\r
+ char *img;\r
+ int i;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+// img=vsp+(256*TEtile);\r
+ img=TEimage;\r
+ i=tileidx[TEtile];\r
+ if ((TEbitflags&TEANIMATE) && i!=TEtile) img=vsp+(256*i);\r
+ CopyTile(TEr->x1+TExoffs+2, TEr->y1+TEyoffs+2, img);\r
+\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ strcpy(TEtempstr, (TEbitflags&TEANIMATE ? "Click to halt animation" : "Click to animate tile"));\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && MouseOverTEreg(TEr))\r
+ TEbitflags^=TEANIMATE;\r
+ }\r
+ }\r
+\r
+static void DrawSColBox(TEREGION *TEr)\r
+// -- ric: 15/Jul/98 - Draw selected colour box\r
+ {\r
+ int halfwidth=TEr->x2-TEr->x1-4;\r
+ int height=TEr->y2-TEr->y1-4;\r
+ char DSCBtempcolor;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ FilledBox(TExoffs+2+TEr->x1, TEyoffs+2+TEr->y1, halfwidth, height, titlebg);\r
+ height-=2;\r
+ halfwidth-=2;\r
+ halfwidth>>=1;\r
+ FilledBox(TExoffs+3+TEr->x1, TEyoffs+3+TEr->y1, halfwidth, height, lcolor);\r
+ FilledBox(TExoffs+3+TEr->x1+halfwidth, TEyoffs+3+TEr->y1, halfwidth, height, rcolor);\r
+\r
+ if (MouseOverTEreg(TEr) && TEr->bitflags®ACTIVE)\r
+ {\r
+ strcpy(TEtempstr, "Click to swap colors");\r
+ SetCaption(&TEregs[HELPBAR], TEtempstr);\r
+\r
+ // Handle mouse clicks\r
+ if (TEOldReg==TEr)\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED && MouseOverTEreg(TEr))\r
+ {\r
+ DSCBtempcolor=lcolor;\r
+ lcolor=rcolor;\r
+ rcolor=DSCBtempcolor;\r
+ }\r
+ }\r
+ }\r
+\r
+static void DrawSCTxtBx(TEREGION *TEr)\r
+// -- ric: 15/Jul/98 - Draw selected colour text box\r
+ {\r
+// char DSCTBTextBuf[256];\r
+ int i;\r
+ int DSCTBx=TEr->x1+TExoffs+2;\r
+ int DSCTBy=TEr->y1+TEyoffs+2;\r
+ TERegFill(TEr, black);\r
+ DrawSunkRegion(TEr);\r
+ i=lcolor*3;\r
+ sprintf(TEtempstr, "Left: %03d (rgb: %03d/%03d/%03d)", lcolor, pal[i], pal[i+1], pal[i+2]);\r
+ GotoXY(DSCTBx, DSCTBy);\r
+ printstring(TEtempstr);\r
+ i=rcolor*3;\r
+ sprintf(TEtempstr, "Right: %03d (rgb: %03d/%03d/%03d)", rcolor, pal[i], pal[i+1], pal[i+2]);\r
+ GotoXY(DSCTBx, DSCTBy+7);\r
+ printstring(TEtempstr);\r
+ }\r
+\r
+static void SetCaption(TEREGION *TEr, char *helptext)\r
+ {\r
+ TEFree(TEr->caption);\r
+ TEr->caption=(char *)strcpy((char *)TEAlloc(strlen(helptext)+1,helptext), helptext);\r
+ }\r
+\r
+static void TEDrawHilight(int x1, int y1, int width, int height, unsigned char colour)\r
+// -- ric: 15/Jul/98 - Draws hilight around given rectangle\r
+ {\r
+ VLine(x1-1, y1, height, colour);\r
+ VLine(x1+width, y1, height, colour);\r
+ HLine(x1-1, y1-1, width+2, colour);\r
+ HLine(x1-1, y1+height, width+2, colour);\r
+ }\r
+\r
+static void TEDrawCheckeredBox(int x1, int y1, int width, int height, unsigned char colour)\r
+// -- ric: 17/Jul/98 - Draws a checkered box\r
+ {\r
+ int i,j;\r
+ unsigned char c;\r
+ for (j=0; j<height; j++)\r
+ {\r
+ c=(y1+j+1)&1;\r
+ if (c) c=colour;\r
+ for (i=0; i<width; i++)\r
+ {\r
+ if (c) screen[(y1+j)*tsx+x1+i]=c;\r
+ c^=colour;\r
+ }\r
+ }\r
+ }\r
+\r
+static void TERegFill(TEREGION *TEr, int colour)\r
+// -- ric: 20/Jul/98 - Fills region with colour (colour==-1 for transparent)\r
+ {\r
+ if (colour>-1)\r
+ FilledBox(TEr->x1+TExoffs, TEr->y1+TEyoffs, (TEr->x2)-(TEr->x1), (TEr->y2)-(TEr->y1), colour);\r
+ }\r
+\r
+static void TERegText(TEREGION *TEr, char *message)\r
+// Prints given message in the specified region\r
+ {\r
+ int tempx, tempy;\r
+ tempx=(TEr->x1)+TExoffs+2;\r
+\r
+ tempy=(TEr->y2)-(TEr->y1);\r
+ tempy>>=1;\r
+ tempy+=(TEr->y1)-3;\r
+\r
+ GotoXY(tempx,tempy+TEyoffs);\r
+ printstring(message);\r
+\r
+ }\r
+\r
+static void TEClearImage(void)\r
+// -- ric: 26/Jul/98 - clear selected image\r
+ {\r
+ int j;\r
+ if (TEbitflags&TESHOWMSK)\r
+ {\r
+ j=TEysize*TExsize;\r
+ memcpy(TEundo, TEimage, j); // backup image to undo buffer\r
+ do\r
+ {\r
+ j--;\r
+ if (*(TEmask+j)) *(TEimage+j)=rcolor;\r
+ } while (j>0);\r
+ }\r
+ }\r
+\r
+static void TECopyImage(void)\r
+// -- ric: 26/Jul/98 - copy selected image to copy buffer\r
+ {\r
+ int i, j, TECIxstart, TECIystart, TECIxsize, TECIysize;\r
+ if (TEbitflags&TESHOWMSK) // only makes sense if selected region is shown\r
+ {\r
+ TECIxstart=TExsize;\r
+ TECIystart=TEysize;\r
+ TECIxsize=-1;\r
+ TECIysize=-1;\r
+ // loop through image to find the starting and ending x and y coords\r
+ // of the image to copy\r
+ for (j=0; j<TEysize; j++)\r
+ for (i=0; i<TExsize; i++)\r
+ {\r
+ if (TEmask[j*TExsize+i]) // selected\r
+ {\r
+ if (i<TECIxstart) TECIxstart=i;\r
+ if (i>TECIxsize) TECIxsize=i;\r
+ if (j<TECIystart) TECIystart=j;\r
+ if (j>TECIysize) TECIysize=j;\r
+ }\r
+ }\r
+\r
+ TECIxsize-=TECIxstart-1;\r
+ TECIysize-=TECIystart-1;\r
+\r
+ if (TECIxsize>0 && TECIysize>0)\r
+ {\r
+ // free and create TEcopy and TEcmsk buffers\r
+ TEFree(TEcopy);\r
+ TEFree(TEcmsk);\r
+\r
+ // make copy buffer square (allows for rotation)\r
+ TEcopyxsize=TECIysize;\r
+ TEcopyysize=TECIysize;\r
+ if (TECIxsize>TECIysize)\r
+ {\r
+ TEcopyxsize=TECIxsize;\r
+ TEcopyysize=TECIxsize;\r
+ }\r
+ TEcopy=(char *)TEAlloc(TEcopyxsize*TEcopyysize, "copy buffer");\r
+ TEcmsk=(char *)TEAlloc(TEcopyxsize*TEcopyysize, "copy mask");\r
+\r
+ // copy image into buffer\r
+ for (j=0; j<TECIysize; j++)\r
+ for (i=0; i<TECIxsize; i++)\r
+ {\r
+ if (TEmask[(j+TECIystart)*TExsize+(i+TECIxstart)])\r
+ {\r
+ TEcopy[j*TEcopyxsize+i]=TEimage[(j+TECIystart)*TExsize+(i+TECIxstart)];\r
+ TEcmsk[j*TEcopyxsize+i]=0xf;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+static void TERotateImageAntiClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 15/Jul/98 - rotates image (must be square) 90 degrees anti-clockwise\r
+ {\r
+// unsigned char *TERILsrc=TEimage;\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ if (TERILxsize==TERILysize)\r
+ {\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TERotateImageAntiClockwise");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[(i*TERILxsize)+(TERILysize-1-j)];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+ }\r
+\r
+static void TERotateImageClockwise(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 16/Jul/98 - rotates image (must be square) 90 degrees clockwise\r
+ {\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ if (TERILxsize==TERILysize)\r
+ {\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TERotateImageClockwise");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[((TERILxsize-1-i)*TERILxsize)+(j)];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+ }\r
+\r
+static void TEFlipImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 15/Jul/98 - flips image\r
+ {\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TEFlipImage");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[((TERILysize-1-j)*TERILxsize)+i];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+\r
+static void TEMirrorImage(unsigned char *TERILsrc, int TERILxsize, int TERILysize)\r
+// -- ric: 15/Jul/98 - mirrors image\r
+ {\r
+ unsigned char *TERILimg=NULL;\r
+ int i, j, amount;\r
+ amount=TERILxsize*TERILysize;\r
+ TERILimg=(char *) TEAlloc(amount, "temporary image buffer for TEMirrorImage");\r
+ memcpy(TERILimg, TERILsrc, amount);\r
+ j=TERILysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TERILxsize;\r
+ do\r
+ {\r
+ i--;\r
+ TERILsrc[(j*TERILxsize)+i]=TERILimg[(j*TERILxsize)+(TERILxsize-1-i)];\r
+ } while (i>0);\r
+ } while (j>0);\r
+ TEFree(TERILimg);\r
+ }\r
+\r
+static void TEFillImage(char *TEFIimage, char *TEFImask, int TEFIxsize, int TEFIysize, int TEFIx, int TEFIy, char TEFIcolour)\r
+// -- ric: 29/Jul/98 - Fill procedure - sets up and calls recursive procedure below\r
+ {\r
+ int i,j;\r
+ unsigned char *TEFIfillmask=NULL; // will eventually contain 0 for ignore and 1 for fill\r
+ TEFIfillmask=(char *) TEAlloc(TEFIxsize*TEFIysize, "temporary fill buffer for TEFillImage");\r
+ TERFillImage(TEFIimage, TEFIfillmask, TEFIxsize, TEFIysize, TEFIx, TEFIy);\r
+\r
+ if (TEFImask)\r
+ for (j=0; j<TEFIysize; j++)\r
+ for (i=0; i<TEFIxsize; i++)\r
+ TEFIfillmask[j*TEFIxsize+i]&=TEFImask[j*TEFIxsize+i];\r
+\r
+ for (j=0; j<TEFIysize; j++)\r
+ for (i=0; i<TEFIxsize; i++)\r
+ if (TEFIfillmask[j*TEFIxsize+i]) TEFIimage[j*TEFIxsize+i]=TEFIcolour;\r
+ TEFree(TEFIfillmask);\r
+ }\r
+\r
+static void TERFillImage(char *TERFIimage, char *TERFImask, int TERFIxsize, int TERFIysize, int TERFIx, int TERFIy)\r
+// -- ric: 29/Jul/98 - Recursive fill procedure\r
+ {\r
+ int x,y;\r
+ char TERFIcc;\r
+ TERFImask[TERFIy*TERFIxsize+TERFIx]=0xf;\r
+ TERFIcc=TERFIimage[TERFIy*TERFIxsize+TERFIx];\r
+ x=TERFIx-1;\r
+ y=TERFIy;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ x=TERFIx;\r
+ y=TERFIy-1;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ x=TERFIx+1;\r
+ y=TERFIy;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ x=TERFIx;\r
+ y=TERFIy+1;\r
+ if (x>=0 && x<TERFIxsize && y>=0 && y<TERFIysize)\r
+ if (!(TERFImask[y*TERFIxsize+x]) && TERFIimage[y*TERFIxsize+x]==TERFIcc)\r
+ TERFillImage(TERFIimage, TERFImask, TERFIxsize, TERFIysize, x, y);\r
+ }\r
+\r
+static void TEShiftColours(char *TESCimage, char *TESCmask, int TESCxsize, int TESCysize, int amount)\r
+// -- ric: 17/Jul/98 - Colour shift idea by McGrue and Tarkuss\r
+ {\r
+ int i,j;\r
+ j=TESCysize;\r
+ do\r
+ {\r
+ j--;\r
+ i=TESCxsize;\r
+ do\r
+ {\r
+ i--;\r
+ if (!(TESCmask))\r
+ TESCimage[j*TESCxsize+i]+=amount;\r
+ else\r
+ if (TESCmask[j*TESCxsize+i])\r
+ TESCimage[j*TESCxsize+i]+=amount;\r
+ } while (i>0);\r
+ } while (j>0);\r
+ }\r
+\r
+\r
+static void TEUndo (void)\r
+ {\r
+ unsigned char *tempimg=TEimage;\r
+ TEimage=TEundo;\r
+ TEundo=tempimg;\r
+ }\r
+\r
+static void *TEAlloc(unsigned long amount, char *whatfor)\r
+// -- ric: 14/Jul/98 - TE's custom, error-handling memory allocation routine\r
+ {\r
+ char *TETmpBuf=NULL;\r
+\r
+ amount += 3; // aen\r
+ amount &= ~3;\r
+\r
+// static char DebugBuf[256];\r
+ TETmpBuf=(char *) malloc(amount);\r
+ if (!TETmpBuf)\r
+ {\r
+ sprintf(TEtempstr, "Unable to allocate %ld bytes for %s.", amount, whatfor);\r
+ err(TEtempstr);\r
+ }\r
+ memset(TETmpBuf,0, amount); // Clear allocated mem\r
+ /*\r
+ __asm { // aen\r
+ mov edi,TETmpBuf\r
+ mov ecx,amount\r
+ shr ecx,2\r
+ xor eax,eax\r
+ cld\r
+ rep stosd\r
+ } ;\r
+ */\r
+ return TETmpBuf;\r
+ }\r
+\r
+#ifdef JUNK\r
+static void TEFree(void *TETmpBuf)\r
+// -- ric: 14/Jul/98 - TE's custom memory freeing routine\r
+ {\r
+ if (TETmpBuf) free(TETmpBuf); // Only free memory if previously allocated\r
+ TETmpBuf=NULL; // Set freed memory to point to NULL\r
+ }\r
+#endif\r
+\r
+static void MBClickHandler(TEREGION *TEBaseReg)\r
+// -- ric: 20/Jul/98 - Mouse button click handler\r
+ {\r
+ int i,j;\r
+ ReadMouse();\r
+ if (TEBaseReg)\r
+ {\r
+ if (!TEBaseReg->data) err("No region data defined.");\r
+ if (((struct DATABASEREGION *)TEBaseReg->data)->infotype!=DITBASEREGION)\r
+ err("MBClickHandler called with invalid base region.");\r
+ }\r
+\r
+ for (i=0; i<3; ++i)\r
+ {\r
+ if (mb & (i+1))\r
+ {\r
+ if (MBStatus[i] == MOUSECLICKED)\r
+ MBStatus[i]=MOUSEPRESSED;\r
+ else if (MBStatus[i] == MOUSENONE)\r
+ {\r
+ MBStatus[i] = MOUSECLICKED;\r
+ if (TEBaseReg)\r
+ {\r
+ TEOldReg = NULL;\r
+ for (j=0; j<((struct DATABASEREGION *)TEBaseReg->data)->numofregs; ++j)\r
+ if (MouseOverTEreg(TEBaseReg+j)&&!((TEBaseReg+j)->bitflags®NOCLICK))\r
+ TEOldReg = TEBaseReg+j;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (MBStatus[i] <= MOUSERELEASE)\r
+ MBStatus[i] = MOUSENONE;\r
+ else if (MBStatus[i]>MOUSERELEASE)\r
+ MBStatus[i] = MOUSERELEASE;\r
+ }\r
+ }\r
+ }\r
+\r
+static void AboutTE (void)\r
+// Just here to test the mouse input loop - remove this later\r
+ {\r
+ TEREGION *TEr=NULL;\r
+ TEREGION *TEaboutwin=NULL;\r
+// int amxsize=150, amysize=82;\r
+ int amxofs=60, amyofs=60;\r
+ int i,i2,j,j2;\r
+ int QuitAW=FALSE;\r
+ int moving=FALSE;\r
+\r
+ // Allocate memory\r
+ TEaboutwin=(struct TEREGION *) TEAlloc((sizeof (struct TEREGION))*4,"about window regions");\r
+ TEr=TEaboutwin;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=amxofs;\r
+ TEr->x2=TEr->x1+150;\r
+ TEr->y1=amyofs;\r
+ TEr->y2=TEr->y1+82;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+// TEr->drawproc=NULL;\r
+ sprintf(strbuf, "About MapEd %s Tile Editor", ME2_VERSION);\r
+ TEr->caption=TENewText(strbuf, "About window");\r
+ TEr->data=(struct DATABASEREGION *) TEAlloc(sizeof (struct DATABASEREGION), "base region data");\r
+ ((struct DATABASEREGION *)(TEr->data))->infotype=DITBASEREGION;\r
+ ((struct DATABASEREGION *)(TEr->data))->numofregs=4;\r
+ ((struct DATABASEREGION *)(TEr->data))->windowtype=DBRSTDWINDOW;\r
+\r
+ TEr+=1;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=0;\r
+ TEr->x2=TEaboutwin->x2-TEaboutwin->x1-9;\r
+ TEr->y1=0;\r
+ TEr->y2=8;\r
+ TEr->bitflags=REGACTIVE;\r
+// TEr->drawproc=NULL;\r
+// TEr->caption=NULL;\r
+\r
+ TEr+=1;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEaboutwin->x2-TEaboutwin->x1-9;\r
+ TEr->x2=TEaboutwin->x2-TEaboutwin->x1-3;\r
+ TEr->y1=3;\r
+ TEr->y2=6;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+// TEr->caption=NULL;\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "quit button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=NULL;\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&QuitAW;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TRUE;\r
+\r
+ TEr+=1;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=60;\r
+ TEr->x2=90;\r
+ TEr->y1=62;\r
+ TEr->y2=72;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=TENewText("ok","ok button caption");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "quit button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=NULL;\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&QuitAW;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TRUE;\r
+ TEr=TEaboutwin+1; // point to title bar area\r
+\r
+ while (!QuitAW)\r
+ {\r
+ // Mouse button click handler routines\r
+ MBClickHandler(TEaboutwin);\r
+\r
+ amxofs=TEaboutwin->x1;\r
+ amyofs=TEaboutwin->y1;\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSERELEASE)\r
+ moving=FALSE;\r
+\r
+ // Draw loop\r
+ RenderTileEdit(TEregs);\r
+ RenderTileEdit(TEaboutwin);\r
+\r
+ sprintf(strbuf, "MapEd v.%s", ME2_VERSION);\r
+ GotoXY(amxofs+52, amyofs+16); printstring(strbuf);\r
+ GotoXY(amxofs+31, amyofs+22); printstring("Copyright (C) 1998 vecna");\r
+ GotoXY(amxofs+40, amyofs+28); printstring("All Rights Reserved");\r
+ sprintf(strbuf, "MapEd v.%s Tile Editor", ME2_VERSION);\r
+ GotoXY(amxofs+29, amyofs+41); printstring(strbuf);\r
+ GotoXY(amxofs+20, amyofs+47); printstring("Additional code by Richard Lau");\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ // Move window?\r
+ if (MouseOverTEreg(TEr) && TEOldReg==TEr)\r
+ {\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSECLICKED)\r
+ {\r
+ i2=TEaboutwin->x2-TEaboutwin->x1;\r
+ j2=TEaboutwin->y2-TEaboutwin->y1;\r
+ i=mx-TEaboutwin->x1;\r
+ j=my-TEaboutwin->y1;\r
+ moving=TRUE;\r
+ }\r
+ }\r
+ if ((MBStatus[0]|MBStatus[1])==MOUSEPRESSED && moving)\r
+ {\r
+ if (((mx-i)<16)) TEaboutwin->x1=16;\r
+ else if (((mx-i+i2)>=(16+sx))) TEaboutwin->x1=16+(sx-i2);\r
+ else TEaboutwin->x1=mx-i;\r
+ if (((my-j)<16)) TEaboutwin->y1=16;\r
+ else if (((my-j+j2)>=(16+sy))) TEaboutwin->y1=16+(sy-j2);\r
+ else TEaboutwin->y1=my-j;\r
+ TEaboutwin->x2=TEaboutwin->x1+i2;\r
+ TEaboutwin->y2=TEaboutwin->y1+j2;\r
+ }\r
+\r
+ if (key[SCAN_ESC])\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ QuitAW=TRUE;\r
+ }\r
+\r
+ }\r
+ // free TEaboutwin\r
+ TEFreeReg(TEaboutwin);\r
+ }\r
+\r
+static void RestartTileEditor(void)\r
+// -- ric: 17/Jul/98 - reinit the tile editor\r
+ {\r
+ int i,j, amount;\r
+ unsigned char *TERTEmask=NULL;\r
+\r
+ switch (TEtype)\r
+ {\r
+ case TETILE: // edit tile TEtile\r
+ i=TExsize;\r
+ j=TEysize;\r
+ amount=i*j;\r
+ TERTEmask=(unsigned char *) TEAlloc(amount, "tile editor mask backup buffer");\r
+\r
+ // backup mask\r
+ memcpy(TERTEmask, TEmask, amount);\r
+\r
+ // Restart editor\r
+ DeinitTEImage();\r
+ TEFreeReg(TEregs);\r
+ TEtype=TETILE;\r
+ TExsize=i;\r
+ TEysize=j;\r
+ TEsource=vsp+(256*TEtile);\r
+ InitTEImage();\r
+ SetupRegions();\r
+\r
+ // Restore mask\r
+ memcpy(TEmask, TERTEmask, amount);\r
+ TEFree(TERTEmask);\r
+ break;\r
+ }\r
+ }\r
+\r
+static void InitTEImage (void)\r
+// Copy the image data being edited and allocate memory for the image buffers\r
+ {\r
+ int i;\r
+ int amount=TExsize*TEysize;\r
+ if (TEtype==TEUNKNOWN) err("Unrecognised tile editor graphics type.");\r
+ if (!TEsource) err("Invalid input image.");\r
+ TEimage=(unsigned char *) TEAlloc(amount, "tile editor image buffer");\r
+ TEmask=(unsigned char *) TEAlloc(amount, "tile editor mask buffer");\r
+ TEundo=(unsigned char *) TEAlloc(amount, "tile editor undo buffer");\r
+// if (!TEimage || !TEundo) err("Cannot allocate memory for tile editor image buffers.");\r
+ memcpy(TEimage, TEsource, amount); // copy original image into edit buffer\r
+ memcpy(TEundo, TEimage, amount); // copy original image into undo buffer\r
+\r
+ // if editing tile find the animation strand (if any) tile belongs to\r
+ TEanimstrand=0; // Does not belong to an animation strand\r
+ if (TEtype==TETILE)\r
+ {\r
+ i=100;\r
+ do\r
+ {\r
+ i--;\r
+ if (vspanim[i].delay && TEtile<=vspanim[i].finish && TEtile>=vspanim[i].start)\r
+ TEanimstrand=i+1;\r
+ } while (i>0);\r
+ }\r
+ }\r
+\r
+static void DeinitTEImage(void)\r
+// Unallocate allocated image buffers - copy edited buffer into original\r
+ {\r
+ memcpy(TEsource, TEimage, (TExsize*TEysize));\r
+ TEFree(TEimage);\r
+ TEFree(TEmask);\r
+ TEFree(TEundo);\r
+ TEtype=TEUNKNOWN; // Clear type info for error checking purposes\r
+ TExsize=0;\r
+ TEysize=0;\r
+ }\r
+\r
+static void SetupRegions (void)\r
+ {\r
+ int temp;\r
+ TEREGION *TEr=NULL;\r
+\r
+ // Allocate memory\r
+ TEregs=(struct TEREGION *) TEAlloc((sizeof (struct TEREGION))*MAX_REGIONS,"tile edit regions");\r
+\r
+ TEr=TEregs+BASEREG;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=16;\r
+ TEr->x2=TEr->x1+sx;\r
+ TEr->y1=16;\r
+ TEr->y2=TEr->y1+sy;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=NULL;\r
+ TEr->caption=NULL;\r
+ switch (TEtype)\r
+ {\r
+ case TETILE:\r
+ sprintf(TEtempstr, "MapEd %s Tile Editor - Tile: %d", ME2_VERSION, TEtile);\r
+ if (TEanimstrand)\r
+ sprintf(TEtempstr, "MapEd %s Tile Editor - Tile: %d (anim strand: %d, frame: %d/%d)",\r
+ ME2_VERSION,\r
+ TEtile, TEanimstrand-1, TEtile-vspanim[TEanimstrand-1].start+1,\r
+ vspanim[TEanimstrand-1].finish-vspanim[TEanimstrand-1].start+1);\r
+ SetCaption(TEr, TEtempstr);\r
+ break;\r
+ }\r
+ TEr->data=(struct DATABASEREGION *) TEAlloc(sizeof (struct DATABASEREGION), "base region data");\r
+ ((struct DATABASEREGION *)(TEr->data))->infotype=DITBASEREGION;\r
+ ((struct DATABASEREGION *)(TEr->data))->numofregs=MAX_REGIONS;\r
+ ((struct DATABASEREGION *)(TEr->data))->windowtype=DBRSTDWINDOW;\r
+\r
+ TEr=TEregs+HELPBAR;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=3;\r
+ TEr->x2=TEregs->x2-TEregs->x1-3;\r
+ TEr->y1=TEregs->y2-TEregs->y1-13;\r
+ TEr->y2=TEregs->y2-TEregs->y1-3;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawHelpBar;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ temp=(((TEregs->x2-TEregs->x1-8)>>6)<<5)+2;\r
+ TEr=TEregs+PALETTE;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=((TEregs->x2-TEregs->x1)>>1)-temp;\r
+ TEr->x2=((TEregs->x2-TEregs->x1)>>1)+temp;\r
+ TEr->y1=TEregs->y2-TEregs->y1-36;\r
+ TEr->y2=TEregs->y2-TEregs->y1-16;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawPalette;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+EDITREG;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=3;\r
+ TEr->x2=3+128+4;\r
+ TEr->y1=10;\r
+ TEr->y2=10+128+4;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawEditReg;\r
+ TEr->caption=NULL;\r
+ TEr->data=(struct DATAEDITREG *) TEAlloc(sizeof (struct DATAEDITREG), "edit region data");\r
+ ((struct DATAEDITREG *)(TEr->data))->infotype=DITEDITREG;\r
+\r
+ TEr=TEregs+PREVIEW;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs->x2-TEregs->x1-23;\r
+ TEr->x2=TEregs->x2-TEregs->x1-3;\r
+ TEr->y1=10;\r
+ TEr->y2=10+20;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawPreview;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+SCOLBOX;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDITREG].x1;\r
+ TEr->x2=TEr->x1+20;\r
+ TEr->y1=TEregs[EDITREG].y2+2;\r
+ TEr->y2=TEr->y1+16;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawSColBox;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+SCTXTBX;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[SCOLBOX].x2+2;\r
+ TEr->x2=TEregs[EDITREG].x2;\r
+ TEr->y1=TEregs[SCOLBOX].y1;\r
+ TEr->y2=TEregs[SCOLBOX].y2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSCTxtBx;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+QUITBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs->x2-TEregs->x1-9;\r
+ TEr->x2=TEregs->x2-TEregs->x1-3;\r
+ TEr->y1=3;\r
+ TEr->y2=6;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "quit button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Exit", "quit button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEQUITCUR;\r
+\r
+ TEr=TEregs+EDMDFRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDITREG].x2+3;\r
+ TEr->x2=TEr->x1+34;\r
+ TEr->y1=TEregs[EDITREG].y1;\r
+ TEr->y2=TEr->y1+11*5+3; // 10*number of buttons\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+DRAWBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Draw");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "draw button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Draw mode", "draw button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDDRAW;\r
+\r
+ TEr=TEregs+FILLBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+11;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Fill");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "fill button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Fill mode", "fill button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDFILL;\r
+\r
+ TEr=TEregs+PICKBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+22;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Pick");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "pick button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Pick color mode", "pick button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDPICK;\r
+\r
+ TEr=TEregs+MASKBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+33;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Select");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "select button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Select mode", "select button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDMASK;\r
+\r
+ TEr=TEregs+PSTEBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1+2;\r
+ TEr->x2=TEregs[EDMDFRM].x2-2;\r
+ TEr->y1=TEregs[EDMDFRM].y1+2+44;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"Paste");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "paste button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Paste mode", "paste button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=RADIOBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEeditmode;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=EDPASTE;\r
+\r
+ TEr=TEregs+IND_FRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[SCTXTBX].x2+2;\r
+ TEr->x2=TEr->x1+12*4-1; // 10*number of buttons\r
+ TEr->y1=TEregs[SCTXTBX].y1;\r
+ TEr->y2=TEr->y1+13;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+MASKIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[IND_FRM].x1+2;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"m");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "mask indicator data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("mask", "mask indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TESHOWMSK;\r
+\r
+ TEr=TEregs+GRIDIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[MASKIND].x2+1;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"g");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "grid button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("grid", "grid indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEGRID;\r
+\r
+ TEr=TEregs+ANIMIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[GRIDIND].x2+1;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"a");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "animation button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("animation", "animation indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEANIMATE;\r
+\r
+ TEr=TEregs+PXHLIND;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[ANIMIND].x2+1;\r
+ TEr->x2=TEr->x1+10;\r
+ TEr->y1=TEregs[IND_FRM].y1+2;\r
+ TEr->y2=TEregs[IND_FRM].y2-2;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr,"h");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "highlight button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("pixel highlight", "highlight indicator text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=PUSHBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbitflags;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=TEHILIGHT;\r
+\r
+ TEr=TEregs+BUT_FRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[EDMDFRM].x1;\r
+ TEr->x2=TEregs[EDMDFRM].x2;\r
+ TEr->y1=TEregs[EDMDFRM].y2+2;\r
+ TEr->y2=TEr->y1+11*4+3; // 10*number of buttons\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+UNDOBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Undo");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "undo button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Undo last action", "undo button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFAUNDO;\r
+\r
+ TEr=TEregs+COPYBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2+11;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Copy");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "copy button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Copy selected area", "copy button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFACOPY;\r
+\r
+ TEr=TEregs+CUT_BUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2+22;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Cut");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "cut button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Cut selected area", "cut button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFACUT;\r
+\r
+ TEr=TEregs+CLR_BUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x1+2;\r
+ TEr->x2=TEregs[BUT_FRM].x2-2;\r
+ TEr->y1=TEregs[BUT_FRM].y1+2+33;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Clear");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "clear button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Clear selected area", "clear button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFACLEAR;\r
+\r
+ TEr=TEregs+TOOLFRM;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[BUT_FRM].x2+2;\r
+ TEr->x2=TEr->x1+34;\r
+ TEr->y1=TEregs[BUT_FRM].y1;\r
+ TEr->y2=TEr->y1+11*4+3; // 10*number of buttons\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE|REGNOCLICK;\r
+ TEr->drawproc=&DrawSunkRegion;\r
+ TEr->caption=NULL;\r
+ TEr->data=NULL;\r
+\r
+ TEr=TEregs+RIACBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Turn L");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "rotate button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Rotate anticlockwise", "rotate button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFARIAC;\r
+\r
+ TEr=TEregs+RIC_BUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2+11;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Turn R");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "rotate button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Rotate clockwise", "rotate button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFARIC;\r
+\r
+ TEr=TEregs+FLIPBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2+22;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Flip");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "flip button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Flip", "flip button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFAFLIP;\r
+\r
+ TEr=TEregs+MIRRBUT;\r
+ TEr->infotype=DITREGION;\r
+ TEr->x1=TEregs[TOOLFRM].x1+2;\r
+ TEr->x2=TEregs[TOOLFRM].x2-2;\r
+ TEr->y1=TEregs[TOOLFRM].y1+2+33;\r
+ TEr->y2=TEr->y1+10;\r
+ TEr->bitflags=REGACTIVE|REGVISIBLE;\r
+ TEr->drawproc=&DrawButton;\r
+ TEr->caption=NULL;\r
+ SetCaption(TEr, "Mirror");\r
+ TEr->data=(struct DATABUTTON *) TEAlloc(sizeof (struct DATABUTTON), "mirror button data");\r
+ ((struct DATABUTTON *)(TEr->data))->infotype=DITBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->text=TENewText("Mirror", "mirror button text");\r
+ ((struct DATABUTTON *)(TEr->data))->buttontype=CLICKBUTTON;\r
+ ((struct DATABUTTON *)(TEr->data))->bitflag=&TEbfa;\r
+ ((struct DATABUTTON *)(TEr->data))->bitvalue=BFAMIRROR;\r
+\r
+ }\r
+\r
+static void DestroyRegions (TEREGION **TEBaseReg)\r
+ {\r
+ TEREGION *TEr=NULL;\r
+ int i;\r
+ if (!(*TEBaseReg)->data) err("No region data defined.");\r
+ if (((struct DATABASEREGION *)(*TEBaseReg)->data)->infotype!=DITBASEREGION)\r
+ err("DestroyRegions called with invalid base region.");\r
+\r
+ i=((struct DATABASEREGION *)(*TEBaseReg)->data)->numofregs;\r
+ do\r
+ {\r
+ i--;\r
+ TEr=(*TEBaseReg)+i;\r
+ TEFree(TEr->caption);\r
+ if (TEr->data)\r
+ {\r
+ switch (((struct DATABASEREGION *)(TEr->data))->infotype)\r
+ {\r
+ case DITBASEREGION:\r
+ break;\r
+ case DITBUTTON:\r
+ TEFree(((struct DATABUTTON *)TEr->data)->text);\r
+ break;\r
+ }\r
+ }\r
+ TEFree(TEr->data);\r
+ } while (i>0);\r
+ TEFree(*TEBaseReg);\r
+// if (*TEBaseReg) err("Not freed");\r
+ }\r
+\r
+static void RenderTileEdit (TEREGION *TEBaseReg)\r
+// -- ric: 20/Jul/98 - updatedt to be a little more generic ;)\r
+ {\r
+ int i;\r
+ TExoffs=TEBaseReg->x1;\r
+ TEyoffs=TEBaseReg->y1;\r
+ if (!TEBaseReg->data) err("No region data defined.");\r
+ if (((struct DATABASEREGION *)TEBaseReg->data)->infotype!=DITBASEREGION)\r
+ err("RenderTileEdit called with invalid base region.");\r
+ switch (((struct DATABASEREGION *)TEBaseReg->data)->windowtype)\r
+ {\r
+ case DBRSTDWINDOW:\r
+ Window(TExoffs,TEyoffs,TEBaseReg->x2,TEBaseReg->y2, ((TEBaseReg->caption) ? TEBaseReg->caption : ""));\r
+ break;\r
+ case DBRPANEL:\r
+ stdwindow(TExoffs,TEyoffs,TEBaseReg->x2,TEBaseReg->y2);\r
+ break;\r
+ }\r
+\r
+ i=((struct DATABASEREGION *)TEBaseReg->data)->numofregs;\r
+ do\r
+ {\r
+ i--;\r
+ if ((TEBaseReg+i)->bitflags®VISIBLE) (TEBaseReg+i)->drawproc(TEBaseReg+i);\r
+ } while (i>1);\r
+ }\r
+\r
+void TileEdit (void)\r
+ {\r
+ int i,j;\r
+ int TEoldeditmode=EDDRAW;\r
+ if (TEbitflags&TEQUITCUR) TEbitflags^=TEQUITCUR;\r
+\r
+ InitTEImage();\r
+ SetupRegions();\r
+ TEeditmode=EDDRAW; // Default to drawing mode\r
+ if (TEbitflags&TESHOWMSK) TEbitflags^=TESHOWMSK;\r
+\r
+ while (!(TEbitflags&TEQUITCUR))\r
+ {\r
+ // Mouse button click handler routines\r
+ MBClickHandler(TEregs);\r
+\r
+ TEbfa=BFANONE; // Reset button action flag\r
+ if (TEeditmode==EDMASK && TEoldeditmode!=EDMASK) TEbitflags|=TESHOWMSK;\r
+ if (TEeditmode==EDMASK && TEoldeditmode==EDMASK && !(TEbitflags&TESHOWMSK))\r
+ TEeditmode=EDDRAW;\r
+ TEoldeditmode=TEeditmode;\r
+\r
+ // Draw loop\r
+ RenderTileEdit(TEregs);\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ if (key[SCAN_ESC])\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ TEbitflags|=TEQUITCUR;\r
+ }\r
+ if ((key[SCAN_CTRL] && key[SCAN_Z]) || (TEbfa&BFAUNDO) || (key[SCAN_U] && !(key[SCAN_CTRL])) && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_U]=0;\r
+ key[SCAN_Z]=0;\r
+ TEUndo();\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_R])\r
+ {\r
+ key[SCAN_R]=0;\r
+ memcpy(TEundo, TEimage, TExsize*TEysize); // copy image into undo buffer\r
+ memcpy(TEimage, TEsource, TExsize*TEysize); // copy original image into edit buffer\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_A])\r
+ {\r
+ key[SCAN_A]=0;\r
+ j=TEysize*TExsize;\r
+ memset(TEmask, 0xf, j);\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_U])\r
+ {\r
+ key[SCAN_U]=0;\r
+ j=TEysize*TExsize;\r
+ memset(TEmask, 0x0, j);\r
+ }\r
+ if ((TEbfa&BFACOPY) || (key[SCAN_CTRL] && key[SCAN_C]) && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_C]=0;\r
+ TECopyImage();\r
+ }\r
+ if ((TEbfa&BFACUT) || (key[SCAN_CTRL] && key[SCAN_X]) && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_X]=0;\r
+ TECopyImage();\r
+ TEClearImage();\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_V] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_V]=0;\r
+ TEeditmode=EDPASTE;\r
+ }\r
+ if ((TEbfa&BFACLEAR) || key[SCAN_DEL] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_DEL]=0;\r
+ TEClearImage();\r
+ }\r
+ if (key[SCAN_Q] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_Q]=0;\r
+ if (TEtype==TETILE && TEanimstrand)\r
+ {\r
+ if (TEtile>vspanim[TEanimstrand-1].start)\r
+ {\r
+ // Change tile index\r
+ TEtile-=1;\r
+ i=TExsize;\r
+ j=TEysize;\r
+\r
+ // Restart editor\r
+ RestartTileEditor();\r
+ }\r
+ }\r
+ }\r
+ if (key[SCAN_W] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_W]=0;\r
+ if (TEtype==TETILE && TEanimstrand)\r
+ {\r
+ if (TEtile<vspanim[TEanimstrand-1].finish)\r
+ {\r
+ // Change tile index\r
+ TEtile+=1;\r
+ i=TExsize;\r
+ j=TEysize;\r
+\r
+ // Restart editor\r
+ RestartTileEditor();\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((TEbfa&BFARIAC) || key[SCAN_L] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_L]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TERotateImageAntiClockwise(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TERotateImageAntiClockwise(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TERotateImageAntiClockwise(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TERotateImageAntiClockwise(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if ((TEbfa&BFARIC) || key[SCAN_R] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_R]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TERotateImageClockwise(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TERotateImageClockwise(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TERotateImageClockwise(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TERotateImageClockwise(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if ((TEbfa&BFAMIRROR) || key[SCAN_X] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_X]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TEMirrorImage(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TEMirrorImage(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TEMirrorImage(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TEMirrorImage(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if ((TEbfa&BFAFLIP) || key[SCAN_Y] && ((MBStatus[0]|MBStatus[1])==MOUSENONE))\r
+ {\r
+ key[SCAN_Y]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ TEFlipImage(TEimage, TExsize, TEysize);\r
+ break;\r
+ case EDMASK:\r
+ TEFlipImage(TEmask, TExsize, TEysize);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ {\r
+ TEFlipImage(TEcopy, TEcopyxsize, TEcopyysize);\r
+ TEFlipImage(TEcmsk, TEcopyxsize, TEcopyysize);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if (key[SCAN_F1])\r
+ {\r
+ key[SCAN_F1]=0;\r
+\r
+ // Deacitvate tile editor\r
+ for (i=0; i<MAX_REGIONS; i++)\r
+ if (TEregs[i].bitflags®ACTIVE) TEregs[i].bitflags^=REGACTIVE;\r
+\r
+ AboutTE();\r
+\r
+ // Reacitvate tile editor\r
+ for (i=0; i<MAX_REGIONS; i++)\r
+ TEregs[i].bitflags|=REGACTIVE;\r
+ }\r
+ if (key[SCAN_A])\r
+ {\r
+ key[SCAN_A]=0;\r
+ lcolor+=1;\r
+ lcolor&=255;\r
+ }\r
+ if (key[SCAN_D])\r
+ {\r
+ key[SCAN_D]=0;\r
+ rcolor+=1;\r
+ rcolor&=255;\r
+ }\r
+ if (key[SCAN_Z])\r
+ {\r
+ key[SCAN_Z]=0;\r
+ if (!lcolor) lcolor=255;\r
+ else lcolor-=1;\r
+ }\r
+ if (key[SCAN_C])\r
+ {\r
+ key[SCAN_C]=0;\r
+ if (!rcolor) rcolor=255;\r
+ else rcolor-=1;\r
+ }\r
+ if (key[SCAN_G])\r
+ {\r
+ key[SCAN_G]=0;\r
+ TEbitflags^=TEGRID;\r
+ }\r
+ if (key[SCAN_H])\r
+ {\r
+ key[SCAN_H]=0;\r
+ TEbitflags^=TEHILIGHT;\r
+ }\r
+ if (key[SCAN_I])\r
+ {\r
+ key[SCAN_I]=0;\r
+ j=TEysize*TExsize;\r
+ do\r
+ {\r
+ j--;\r
+ TEmask[j]^=0xf;\r
+ } while (j>0);\r
+ }\r
+ if (key[SCAN_M])\r
+ {\r
+ key[SCAN_M]=0;\r
+ if (TEeditmode==EDMASK)\r
+ TEeditmode=EDDRAW;\r
+ TEbitflags^=TESHOWMSK;\r
+ }\r
+ if (key[SCAN_SPACE])\r
+ {\r
+ key[SCAN_SPACE]=0;\r
+ if (TEeditmode==EDDRAW)\r
+ {\r
+ TEeditmode=EDMASK;\r
+ TEbitflags|=TESHOWMSK;\r
+ }\r
+ else\r
+ TEeditmode=EDDRAW;\r
+ }\r
+ if (key[SCAN_PGUP])\r
+ {\r
+ key[SCAN_PGUP]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ case EDMASK:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ if (TEbitflags&TESHOWMSK)\r
+ TEShiftColours(TEimage, TEmask, TExsize, TEysize, 1);\r
+ else\r
+ TEShiftColours(TEimage, NULL, TExsize, TEysize, 1);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ TEShiftColours(TEcopy, TEcmsk, TEcopyxsize, TEcopyysize, 1);\r
+ break;\r
+ }\r
+ }\r
+ if (key[SCAN_PGDN])\r
+ {\r
+ key[SCAN_PGDN]=0;\r
+ switch (TEeditmode)\r
+ {\r
+ case EDDRAW:\r
+ case EDMASK:\r
+ memcpy(TEundo, TEimage, TExsize*TEysize);\r
+ if (TEbitflags&TESHOWMSK)\r
+ TEShiftColours(TEimage, TEmask, TExsize, TEysize, -1);\r
+ else\r
+ TEShiftColours(TEimage, NULL, TExsize, TEysize, -1);\r
+ break;\r
+ case EDPASTE:\r
+ if (TEcopy)\r
+ TEShiftColours(TEcopy, TEcmsk, TEcopyxsize, TEcopyysize, -1);\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (key[SCAN_LANGLE])\r
+ {\r
+ key[SCAN_LANGLE]=0;\r
+ ShutdownVideo();\r
+ TEFreeReg(TEregs);\r
+ vm=0;\r
+ InitVideo(0);\r
+ SetupRegions();\r
+ set_intensity(63);\r
+ InitMouse();\r
+ }\r
+ if (key[SCAN_RANGLE])\r
+ {\r
+ key[SCAN_RANGLE]=0;\r
+ ShutdownVideo();\r
+ TEFreeReg(TEregs);\r
+ vm=1;\r
+ InitVideo(1);\r
+ SetupRegions();\r
+ set_intensity(63);\r
+ InitMouse();\r
+ }\r
+ }\r
+ DeinitTEImage();\r
+ TEFreeReg(TEregs);\r
+ }\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TILEED_INC\r
+#define TILEED_INC\r
+\r
+// TEtype defs\r
+#define TEUNKNOWN 0\r
+#define TETILE 1\r
+\r
+// external functions\r
+extern void TileEdit(void);\r
+\r
+// external variables\r
+extern unsigned int TEtype; // type of graphic being edited\r
+extern unsigned int TEtile; // tile to edit - may possibly expand this to an array for simultaneous editing\r
+extern unsigned int TExsize; // width of graphic being edited\r
+extern unsigned int TEysize; // height of graphic being edited\r
+extern unsigned char *TEsource; // pointer to original image being edited\r
+\r
+#endif\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+\r
+#include "config.h"\r
+#include "keyboard.h"\r
+#include "maped.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "tileed.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "smalfont.h"\r
+#include "guicomp.h"\r
+#include "gui.h"\r
+\r
+extern byte TileCmp(byte *one, byte *two); //zero\r
+\r
+// ================================= Data ====================================\r
+\r
+int selofs=0;\r
+char ttile[256], ttile2[256];\r
+char curastd=0;\r
+char curmode=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+int curtileptr(int row)\r
+{\r
+ int jumper,wide;\r
+ int x,y;\r
+\r
+ jumper=16+pad;\r
+ wide=320/jumper;\r
+\r
+ x=(mx-16)/jumper;\r
+ y=((my-16)/jumper)*wide;\r
+\r
+ return x+y+row;\r
+}\r
+\r
+void NormalButton(int x1, int y1, int x2, int y2, char *str)\r
+{\r
+ FilledBox(x1, y1, x2, y2, winbg);\r
+ HLine(x1, y1, x2, black);\r
+ VLine(x1, y1, y2, black);\r
+ HLine(x1+1, y1+y2-1, x2-1, black);\r
+ VLine(x1+x2-1, y1+1, y2-1, black);\r
+\r
+ HLine(x1+1, y1+1, x2-2, brightw);\r
+ VLine(x1+1, y1+1, y2-2, brightw);\r
+ HLine(x1+2, y1+y2-2, x2-3, darkw);\r
+ VLine(x1+x2-2, y1+2, y2-3, darkw);\r
+ GotoXY(x1+((x2-pixels(str))/2), y1+3);\r
+ printstring(str);\r
+}\r
+\r
+void PressdButton(int x1, int y1, int x2, int y2, char *str)\r
+{\r
+ FilledBox(x1, y1, x2, y2, winbg);\r
+ HLine(x1, y1, x2, black);\r
+ VLine(x1, y1, y2, black);\r
+ HLine(x1+1, y1+y2-1, x2-1, black);\r
+ VLine(x1+x2-1, y1+1, y2-1, black);\r
+\r
+ HLine(x1+1, y1+1, x2-2, darkw);\r
+ VLine(x1+1, y1+1, y2-2, darkw);\r
+ GotoXY(x1+((x2-pixels(str))/2)+1, y1+4);\r
+ printstring(str);\r
+}\r
+\r
+void RenderSelector()\r
+{ unsigned char *img,i,j;\r
+ int z;\r
+ int tskip=16+pad;\r
+ int twide=320/tskip;\r
+ int tdeep=((200+15)&~15)/tskip;\r
+\r
+ ClearScreen();\r
+\r
+ for (i=0; i<tdeep; ++i)\r
+ for (j=0; j<twide; ++j)\r
+ {\r
+ img=vsp+(256*((i*twide)+j+selofs));\r
+ if (((i*twide)+j+selofs)>=numtiles) img=vsp;\r
+ CopyTile((j*tskip)+16,(i*tskip)+16,img);\r
+ }\r
+ if (th)\r
+ {\r
+ if (my<(tsy-40))\r
+ DrawHighlight( ((mx/tskip)*tskip)-(1+pad),\r
+ ((my/tskip)*tskip)-(1+pad));\r
+ }\r
+ z=tsy-40;\r
+ sprintf(strbuf,"MapEd %s Tile Selector - Tile %d/%d",ME2_VERSION,curtileptr(selofs),numtiles);\r
+ Window(16,z,336,z+40,strbuf);\r
+ HLine(278, z+11, 53, darkw);\r
+ VLine(278, z+11, 25, darkw);\r
+ VLine(330, z+12, 24, brightw);\r
+ HLine(279, z+35, 51, brightw);\r
+ if (curmode==0) PressdButton(290, z+12, 40, 12, "Select");\r
+ else NormalButton(290, z+12, 40, 12, "Select");\r
+ if (curmode==1) PressdButton(290, z+23, 40, 12, "Edit");\r
+ else NormalButton(290, z+23, 40, 12, "Edit");\r
+ if (th) PressdButton(279, z+12, 12, 12, "H");\r
+ else NormalButton(279, z+12, 12, 12, "H");\r
+ if (pad) PressdButton(279, z+23, 12, 12, "P");\r
+ else NormalButton(279, z+23, 12, 12, "P");\r
+\r
+ HLine(219, z+11, 52, darkw);\r
+ VLine(219, z+11, 25, darkw);\r
+ VLine(270, z+12, 24, brightw);\r
+ HLine(220, z+35, 50, brightw);\r
+ NormalButton(220, z+12, 50, 12, "Import VSP");\r
+ NormalButton(220, z+23, 50, 12, "Import PCX");\r
+\r
+ HLine(160, z+11, 52, darkw);\r
+ VLine(160, z+11, 25, darkw);\r
+ VLine(211, z+12, 24, brightw);\r
+ HLine(161, z+35, 50, brightw);\r
+ NormalButton(161, z+12, 50, 12, "Add Tiles");\r
+ NormalButton(161, z+23, 50, 12, "Animation");\r
+\r
+ HLine(26, z+10, 20, darkw);\r
+ VLine(26, z+10, 20, darkw);\r
+ HLine(27, z+29, 19, brightw);\r
+ VLine(45, z+11, 19, brightw);\r
+ FilledBox(27, z+11, 18, 18, black);\r
+ CopyTile(28, z+12, ttile2);\r
+ GotoXY(20, z+32); printstring("Clipboard");\r
+}\r
+\r
+void FlipX(unsigned short edtile)\r
+{ int i,j;\r
+\r
+ key[SCAN_X]=0;\r
+ if (edtile>=numtiles) return;\r
+ memcpy(ttile,&vsp[edtile*256],256);\r
+ modified=1;\r
+\r
+ for (i=0;i<16;i++)\r
+ for (j=0;j<16;j++)\r
+ vsp[((edtile)*256)+(j*16)+i]=ttile[(j*16)+(15-i)];\r
+}\r
+\r
+void FlipY(unsigned short edtile)\r
+{ int i,j;\r
+\r
+ key[SCAN_Y]=0;\r
+ if (edtile>=numtiles) return;\r
+ memcpy(ttile,&vsp[edtile*256],256);\r
+ modified=1;\r
+\r
+ for (i=0;i<16;i++)\r
+ for (j=0;j<16;j++)\r
+ vsp[((edtile)*256)+(j*16)+i]=ttile[((15-j)*16)+i];\r
+}\r
+\r
+void FlipZ(unsigned short edtile)\r
+{ int i,j;\r
+\r
+ key[SCAN_Z]=0;\r
+ if (edtile>=numtiles) return;\r
+ memcpy(ttile,&vsp[edtile*256],256);\r
+ modified=1;\r
+\r
+ for (i=0;i<16;i++)\r
+ for (j=0;j<16;j++)\r
+ vsp[((edtile)*256)+(j*16)+i]=ttile[(i*16)+j];\r
+}\r
+\r
+void DrawHighlight(int x, int y)\r
+{\r
+ if (x<10 || y<10 || x>330 || y>sy+10) return;\r
+ HLine(x, y, 18, white);\r
+ HLine(x, y+17, 18, white);\r
+ VLine(x, y, 18, white);\r
+ VLine(x+17, y, 18, white);\r
+}\r
+\r
+void TileSelector()\r
+{ int z, ct, k,j,m;\r
+ char *s, *d;\r
+\r
+ int ms_down=0; // aen\r
+ int ms_up=0;\r
+\r
+ while (!key[SCAN_ESC])\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ ms_down=0;\r
+ ms_up=0;\r
+ if (mouse_scroll)\r
+ {\r
+ if (my>tsy-2) ms_down=1;\r
+ if (my<18) ms_up=1;\r
+ }\r
+\r
+ if ((key[SCAN_DOWN] || (ms_down && (!(systemtime%10)))) && selofs<65319)\r
+ {\r
+ if (!pad) selofs=selofs+20;\r
+ else selofs+=18;\r
+ key[SCAN_DOWN]=0;\r
+ systemtime++;\r
+ }\r
+ if ((key[SCAN_UP] || (ms_up && (!(systemtime%10)))) && selofs>17)\r
+ {\r
+ if (!pad) selofs-=20;\r
+ else selofs-=18;\r
+ key[SCAN_UP]=0;\r
+ systemtime++;\r
+ }\r
+ if (key[SCAN_P])\r
+ {\r
+ key[SCAN_P]=0;\r
+ pad=pad ^ 1;\r
+ selofs=0;\r
+ if (pad) Message("Tile padding enabled.",100);\r
+ else Message("Tile padding disabled.",100);\r
+ }\r
+ if (key[SCAN_H])\r
+ {\r
+ key[SCAN_H]=0;\r
+ th=th ^ 1;\r
+ if (th) Message("Tile Highlight enabled.",100);\r
+ else Message("Tile Highlight disabled.",100);\r
+ }\r
+\r
+ if (key[SCAN_X]) FlipX(curtileptr(selofs));\r
+ if (key[SCAN_Y]) FlipY(curtileptr(selofs));\r
+ if (key[SCAN_Z]) FlipZ(curtileptr(selofs));\r
+ if (key[SCAN_V]) VSPAnimDialog();\r
+ if (key[SCAN_CTRL] && key[SCAN_C])\r
+ {\r
+ memcpy(ttile2, (char *) (vsp+(256*curtileptr(selofs))), 256);\r
+ key[SCAN_C]=0;\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_S])\r
+ {\r
+ if (curtileptr(selofs) >= numtiles) return;\r
+ memcpy((char *) (vsp+(256*curtileptr(selofs))), ttile2, 256);\r
+ modified=1;\r
+ key[SCAN_S]=0;\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_T])\r
+ {\r
+ if (curtileptr(selofs) >= numtiles) return;\r
+ modified=1;\r
+ s=ttile2;\r
+ d=(char *) (vsp+(256*curtileptr(selofs)));\r
+ for (z=0; z<256; z++)\r
+ {\r
+ if (*s) *d=*s;\r
+ d++;\r
+ s++;\r
+ }\r
+ key[SCAN_T]=0;\r
+ }\r
+ if (key[SCAN_CTRL] && key[SCAN_D] && !key[SCAN_ALT])\r
+ {\r
+ key[SCAN_D]=0;\r
+ modified=1;\r
+ z=curtileptr(selofs);\r
+ if (z<numtiles)\r
+ {\r
+ memcpy(vsp+(z*256),vsp+((z+1)*256),((numtiles-z-1)*256));\r
+ numtiles--;\r
+ }\r
+ }\r
+// zero: Super Delete Mode!\r
+// wimpy delete irks me.\r
+ if (key[SCAN_CTRL] && key[SCAN_D] && key[SCAN_ALT])\r
+ {\r
+ key[SCAN_D]=0;\r
+ modified=1;\r
+ z=curtileptr(selofs);\r
+ if(ct<numtiles)\r
+ {\r
+ if(z<numtiles)\r
+ {\r
+ memcpy(vsp+(z*256),vsp+((z+1)*256),((numtiles-z-1)*256));\r
+ numtiles--;\r
+ for(k=0;k<numlayers;k++)\r
+ {\r
+ for(j=0; j<layer[k].sizey; j++)\r
+ {\r
+ for(m=0; m<layer[k].sizex; m++)\r
+ {\r
+ if(layers[k][j*layer[k].sizex+m]==z) layers[k][j*layer[k].sizex+m]=0;\r
+ if(layers[k][j*layer[k].sizex+m]>z) layers[k][j*layer[k].sizex+m]--;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+// zero: Super Insert Mode!\r
+// wimpy insert irks me.\r
+ if (key[SCAN_CTRL] && key[SCAN_I] && key[SCAN_ALT])\r
+ {\r
+ key[SCAN_I]=0;\r
+ ct=curtileptr(selofs);\r
+ if (ct <= numtiles)\r
+ {\r
+ modified=1;\r
+ s=(char *) valloc((numtiles+1)*256, "s_ins",0);\r
+ memcpy(s, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=s; s=0;\r
+ for (z=numtiles-1; z>=ct; z--)\r
+ memcpy(vsp+((z+1)*256),vsp+(z*256),256);\r
+ memset(vsp+(ct*256), 0, 256);\r
+ numtiles++;\r
+ }\r
+ for(k=0;k<numlayers;k++)\r
+ {\r
+ for(j=0; j<layer[k].sizey; j++)\r
+ {\r
+ for(m=0; m<layer[k].sizex; m++)\r
+ {\r
+ if(layers[k][j*layer[k].sizex+m]>=ct) layers[k][j*layer[k].sizex+m]++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (key[SCAN_CTRL] && key[SCAN_I] && !key[SCAN_ALT])\r
+ {\r
+ key[SCAN_I]=0;\r
+ ct=curtileptr(selofs);\r
+ if (ct <= numtiles)\r
+ {\r
+ modified=1;\r
+ s=(char *)valloc((numtiles+1)*256,"s_ins",0);\r
+ memcpy(s, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=s; s=0;\r
+ for (z=numtiles-1; z>=ct; z--)\r
+ memcpy(vsp+((z+1)*256),vsp+(z*256),256);\r
+ memset(vsp+(ct*256), 0, 256);\r
+ numtiles++;\r
+ }\r
+ }\r
+ if (key[SCAN_E])\r
+ {\r
+ modified=1;\r
+ TEtile=curtileptr(selofs); // middle tile initially\r
+ if (TEtile<numtiles)\r
+ {\r
+ TEtype=TETILE;\r
+ TEsource=vsp+(256*TEtile);\r
+ TExsize=16;\r
+ TEysize=16;\r
+ TileEdit();\r
+ }\r
+ }\r
+\r
+ if (mb==1 && my<(tsy-40) && !curmode)\r
+ {\r
+ if (curtileptr(selofs)<numtiles)\r
+ {\r
+ lt=curtileptr(selofs);\r
+ key[SCAN_ESC]=1;\r
+ }\r
+ WaitRelease();\r
+ }\r
+ if (mb==2 && my<(tsy-40) && !curmode)\r
+ {\r
+ if (curtileptr(selofs)<numtiles)\r
+ {\r
+ rt=curtileptr(selofs);\r
+ key[SCAN_ESC]=1;\r
+ }\r
+ WaitRelease();\r
+ }\r
+ if (mb && my<(tsy-40) && curmode)\r
+ {\r
+ WaitRelease();\r
+ TEtile=curtileptr(selofs); // middle tile initially\r
+ if (TEtile<numtiles)\r
+ {\r
+ modified=1;\r
+ TEtype=TETILE;\r
+ TEsource=vsp+(256*TEtile);\r
+ TExsize=16;\r
+ TEysize=16;\r
+ TileEdit();\r
+ }\r
+ }\r
+ z=tsy-40;\r
+ if (mb && mx>290 && mx<330 && my>z+12 && my<z+23)\r
+ {\r
+ curmode=0;\r
+ WaitRelease();\r
+ Message("Tile select mode.",100);\r
+ }\r
+ if (mb && mx>290 && mx<330 && my>z+23 && my<z+47)\r
+ {\r
+ curmode=1;\r
+ WaitRelease();\r
+ Message("Tile edit mode.",100);\r
+ }\r
+ if (mb && mx>278 && mx<289 && my>z+12 && my<z+23)\r
+ {\r
+ WaitRelease();\r
+ th=th ^ 1;\r
+ if (th) Message("Tile Highlight enabled.",100);\r
+ else Message("Tile Highlight disabled.",100);\r
+ mb=0;\r
+ }\r
+ if (mb && mx>278 && mx<289 && my>z+23 && my<z+47)\r
+ {\r
+ WaitRelease();\r
+ selofs=0;\r
+ pad=pad ^ 1;\r
+ if (pad) Message("Tile padding enabled.",100);\r
+ else Message("Tile padding disabled.",100);\r
+ mb=0;\r
+ }\r
+ if (mb && mx>161 && mx<210 && my>z+12 && my<z+23)\r
+ {\r
+ modified=1;\r
+ PressdButton(161, z+12, 50, 12, "Add Tiles");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ AddTilesDialog();\r
+ mb=0;\r
+ }\r
+ if (mb && mx>161 && mx<210 && my>z+23 && my<z+47)\r
+ {\r
+ PressdButton(161, z+23, 50, 12, "Animation");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ VSPAnimDialog();\r
+ mb=0;\r
+ }\r
+ if (mb && mx>220 && mx<270 && my>z+12 && my<z+24)\r
+ {\r
+ PressdButton(220, z+12, 50, 12, "Import VSP");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ ImportVSP();\r
+ modified=1;\r
+ mb=0;\r
+ }\r
+ if (mb && mx>220 && mx<270 && my>z+23 && my<z+47)\r
+ {\r
+ PressdButton(220, z+23, 50, 12, "Import PCX");\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ }\r
+ WaitRelease();\r
+ ImportPCX();\r
+ modified=1;\r
+ mb=0;\r
+ }\r
+ if (key[SCAN_F10])\r
+ {\r
+ key[SCAN_F10]=0;\r
+ SaveMAP(mapname);\r
+ SaveVSP(vspname);\r
+ Message("MAP/VSP saved.",100);\r
+ modified=0;\r
+ }\r
+ }\r
+ key[SCAN_ESC]=0;\r
+}\r
+\r
+int vaxsize=150, vaysize=66;\r
+int vaxofs=20, vayofs=20;\r
+\r
+void VSPAnimDialog()\r
+{ char done=0, moving=0, i=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str, bleh;\r
+ char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
+\r
+ bleh=th;\r
+ th=0;\r
+ i=curastd;\r
+ sprintf(nstr1, "%d", vspanim[i].start);\r
+ sprintf(nstr2, "%d", vspanim[i].finish);\r
+ sprintf(nstr3, "%d", vspanim[i].delay);\r
+ sprintf(nstr4, "%d", vspanim[i].mode);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ vaxofs = (mx-mxo);\r
+ vayofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (vaxofs<16) vaxofs = 16;\r
+ if (vayofs<16) vayofs = 16;\r
+ if (vaxofs+vaxsize>335) vaxofs = 336-vaxsize;\r
+ if (vayofs+vaysize>sy+16) vayofs = (sy+16)-vaysize;\r
+ }\r
+\r
+ Window(vaxofs, vayofs, vaxofs+vaxsize, vayofs+vaysize, "VSP Animation Editor");\r
+ CopyTile(vaxofs+110, vayofs+16, (char *) (vsp+(256*tileidx[vspanim[i].start])));\r
+ GotoXY(vaxofs+4, vayofs+12); printstring("Start");\r
+ TextField(vaxofs+25, vayofs+11, 60, nstr1, ctf == 1 ? cb : 0);\r
+ GotoXY(vaxofs+11, vayofs+22); printstring("End");\r
+ TextField(vaxofs+25, vayofs+21, 60, nstr2, ctf == 2 ? cb : 0);\r
+ GotoXY(vaxofs+4, vayofs+32); printstring("Delay");\r
+ TextField(vaxofs+25, vayofs+31, 60, nstr3, ctf == 3 ? cb : 0);\r
+ GotoXY(vaxofs+6, vayofs+42); printstring("Mode");\r
+ TextField(vaxofs+25, vayofs+41, 60, nstr4, ctf == 4 ? cb : 0);\r
+ GotoXY(vaxofs+2, vayofs+56); printstring("Strand");\r
+ GotoXY(vaxofs+104, vayofs+33); printstring("Preview");\r
+ HLine(vaxofs+1, vayofs+51, 148, white);\r
+ Button(vaxofs+85, vayofs+54, "OK");\r
+ Button(vaxofs+117, vayofs+54, "Update");\r
+ GotoXY(vaxofs+30, vayofs+56);\r
+ sprintf(strbuf, "%d", i); printstring(strbuf);\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+11 && my<vayofs+9+11 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+21 && my<vayofs+9+21 && !moving)\r
+ {\r
+ ctf=2; str=nstr2; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+31 && my<vayofs+9+31 && !moving)\r
+ {\r
+ ctf=3; str=nstr3; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+41 && my<vayofs+9+41 && !moving)\r
+ {\r
+ ctf=4; str=nstr4; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>vaxofs+85 && mx<vaxofs+30+85 && my>vayofs+54 && my<vayofs+10+54 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ ButtonPressed(vaxofs+85, vayofs+54, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs+117 && mx<vaxofs+30+117 && my>vayofs+54 && my<vayofs+10+54 && !moving)\r
+ {\r
+ // insert code for button "Update" here\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ InitTileIDX();\r
+ ButtonPressed(vaxofs+117, vayofs+54, "Update");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(vaxofs+vaxsize-9) && (mx<vaxofs+vaxsize-2)\r
+ && my>(vayofs+1) && (my<vayofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>vaxofs && mx<vaxofs+vaxsize && my>vayofs && my<(vayofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-vaxofs;\r
+ myo=my-vayofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_UP)\r
+ {\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ if (i<99) i++; else i=0;\r
+ last_pressed=0; key[SCAN_UP]=0;\r
+ sprintf(nstr1, "%d", vspanim[i].start);\r
+ sprintf(nstr2, "%d", vspanim[i].finish);\r
+ sprintf(nstr3, "%d", vspanim[i].delay);\r
+ sprintf(nstr4, "%d", vspanim[i].mode);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_DOWN)\r
+ {\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ if (i) i--; else i=99;\r
+ last_pressed=0; key[SCAN_DOWN]=0;\r
+ sprintf(nstr1, "%d", vspanim[i].start);\r
+ sprintf(nstr2, "%d", vspanim[i].finish);\r
+ sprintf(nstr3, "%d", vspanim[i].delay);\r
+ sprintf(nstr4, "%d", vspanim[i].mode);\r
+ continue;\r
+ }\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=2; str=nstr2; break;\r
+ case 2: ctf=3; str=nstr3; break;\r
+ case 3: ctf=4; str=nstr4; break;\r
+ case 4: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=4; str=nstr4; break;\r
+ case 1: ctf=0; str=0; break;\r
+ case 2: ctf=1; str=nstr1; break;\r
+ case 3: ctf=2; str=nstr2; break;\r
+ case 4: ctf=3; str=nstr3; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+// memset(&vadelay, 0, 100);\r
+// for (i=0; i<numtiles; i++)\r
+// tileidx[i]=i;\r
+ vspanim[i].start=atoi(nstr1);\r
+ vspanim[i].finish=atoi(nstr2);\r
+ vspanim[i].delay=atoi(nstr3);\r
+ vspanim[i].mode=atoi(nstr4);\r
+ curastd=i;\r
+ th=bleh;\r
+}\r
+\r
+int atxsize=150, atysize=39;\r
+int atxofs=80, atyofs=50;\r
+\r
+void AddTilesDialog()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink, at=0; //, i;\r
+ char ctf=0, cb=0, c, t, *str, bleh;\r
+ char nstr1[80];\r
+\r
+ bleh=th;\r
+ th=0;\r
+ sprintf(nstr1, "%d", at);\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ atxofs = (mx-mxo);\r
+ atyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (atxofs<16) atxofs = 16;\r
+ if (atyofs<16) atyofs = 16;\r
+ if (atxofs+atxsize>335) atxofs = 336-atxsize;\r
+ if (atyofs+atysize>sy+16) atyofs = (sy+16)-atysize;\r
+ }\r
+\r
+ Window(atxofs, atyofs, atxofs+atxsize, atyofs+atysize, "Allocate Additional Tiles");\r
+ GotoXY(atxofs+12, atyofs+15); printstring("Alloc Tiles:");\r
+ TextField(atxofs+56, atyofs+13, 80, nstr1, ctf == 1 ? cb : 0);\r
+ Button(atxofs+85, atyofs+26, "OK");\r
+ Button(atxofs+117, atyofs+26, "Cancel");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>atxofs+56 && mx<atxofs+80+56 && my>atyofs+13 && my<atyofs+9+13 && !moving)\r
+ {\r
+ ctf=1; str=nstr1; cb=1;\r
+ cursorblink=systemtime+40; continue;\r
+ }\r
+\r
+ if ((mb==1 && mx>atxofs+85 && mx<atxofs+30+85 && my>atyofs+26 && my<atyofs+10+26 && !moving) || (key[SCAN_ENTER] && !ctf))\r
+ {\r
+ // insert code for button "OK" here\r
+ done=1;\r
+ at=atoi(nstr1);\r
+ str=(char *) valloc((numtiles+at)*256,"vsp data",0);\r
+ memcpy(str,vsp,(numtiles*256));\r
+ vfree(vsp); vsp=str; str=0; ctf=0;\r
+ memset(vsp+(numtiles*256), 0, at*256);\r
+ numtiles+=at;\r
+ ButtonPressed(atxofs+85, atyofs+26, "OK");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>atxofs+117 && mx<atxofs+30+117 && my>atyofs+26 && my<atyofs+10+26 && !moving)\r
+ {\r
+ // insert code for button "Cancel" here\r
+ done=1;\r
+ ButtonPressed(atxofs+117, atyofs+26, "Cancel");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(atxofs+atxsize-9) && (mx<atxofs+atxsize-2)\r
+ && my>(atyofs+1) && (my<atyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>atxofs && mx<atxofs+atxsize && my>atyofs && my<(atyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-atxofs;\r
+ myo=my-atyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
+ {\r
+ switch (ctf)\r
+ {\r
+ case 0: ctf=1; str=nstr1; break;\r
+ case 1: ctf=0; str=0; break;\r
+ }\r
+ key[SCAN_TAB]=0;\r
+ last_pressed=0;\r
+ cb=1; cursorblink=systemtime+40;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+ at=atoi(nstr1);\r
+ th=bleh;\r
+// memset(&vadelay, 0, 100);\r
+// for (i=0; i<numtiles; i++)\r
+// tileidx[i]=i;\r
+}\r
+\r
+// ========================= Import *** Data/Code ============================\r
+\r
+char *ovsp, op, oh, openas;\r
+word ontiles;\r
+word sofs=0;\r
+word tilesrippedthissession;\r
+byte *implist; //zero\r
+\r
+void RenderImport()\r
+{ unsigned char *img,i,j;\r
+ int z, jumper,wide,deep;\r
+ int at;\r
+\r
+ jumper=16+pad;\r
+ wide=320/jumper;\r
+ deep=((200+15)&~15)/jumper;\r
+\r
+ ClearScreen();\r
+\r
+ for (i=0; i<deep; i++)\r
+ for (j=0; j<wide; j++)\r
+ {\r
+ at=(i*wide)+j+sofs;\r
+ img=ovsp+(256*at);\r
+ if (at>=ontiles) img=ovsp;\r
+ CopyTile((j*jumper)+16,(i*jumper)+16,img);\r
+ if(at<ontiles) if(implist[at]) ColorGrid((j*jumper)+16,(i*jumper)+16,7); //zero\r
+ }\r
+ if (th)\r
+ {\r
+ if (my<(tsy-40))\r
+ DrawHighlight(((mx/jumper)*jumper)-(1+pad),\r
+ ((my/jumper)*jumper)-(1+pad));\r
+ }\r
+ z=tsy-40;\r
+ sprintf(strbuf,"Import Tiles %d/%d",curtileptr(sofs),ontiles);\r
+ Window(16,z,336,z+40,strbuf);\r
+ sprintf(strbuf,"Tiles imported this session: %d",tilesrippedthissession);\r
+ GotoXY(176-(pixels(strbuf)/2),z+20); printstring(strbuf);\r
+}\r
+\r
+void ImportTiles()\r
+{ //int tp;\r
+ char *str;\r
+ int bloop1,bloop2;\r
+\r
+ op=pad; oh=th;\r
+ pad=1; th=1;\r
+ tilesrippedthissession=0;\r
+ implist=(byte *)malloc(ontiles); //zero\r
+ memset(implist,0,ontiles); //zero\r
+ while (!key[SCAN_ESC])\r
+ {\r
+ RenderImport();\r
+ RenderMessages();\r
+ DrawMouse();\r
+ ShowPage();\r
+\r
+ if (key[SCAN_DOWN] && sofs<65319)\r
+ {\r
+ if (!pad) sofs=sofs+20;\r
+ else sofs+=18;\r
+ key[SCAN_DOWN]=0;\r
+ }\r
+ if (key[SCAN_UP] && sofs>17)\r
+ {\r
+ if (!pad) sofs-=20;\r
+ else sofs-=18;\r
+ key[SCAN_UP]=0;\r
+ }\r
+/*all by zero here in this scan_b thing*/\r
+ if (key[SCAN_B])\r
+ {\r
+ key[SCAN_B]=0;\r
+ Message("Building duplicate import list",200);\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ for(bloop2=0; bloop2<numtiles; bloop2++)\r
+ {\r
+ if(TileCmp(vsp+bloop2*256,ovsp+bloop1*256))\r
+ {\r
+ implist[bloop1]=1;\r
+ bloop2=numtiles;\r
+ }\r
+ }\r
+ }\r
+ }\r
+//all by zero here in this scan_a thing\r
+ if (key[SCAN_A])\r
+ {\r
+ Message("Importing all tiles",200);\r
+ key[SCAN_A]=0;\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp+(bloop1*256), 256);\r
+ numtiles+=1;\r
+ }\r
+ goto DIE;\r
+ }\r
+\r
+//all by zero here in this scan_n thing\r
+ if (key[SCAN_N])\r
+ {\r
+ Message("Importing all new tiles",200);\r
+ key[SCAN_N]=0;\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ for(bloop2=0; bloop2<numtiles; bloop2++)\r
+ {\r
+ if(TileCmp(vsp+bloop2*256,ovsp+bloop1*256))\r
+ {\r
+ implist[bloop1]=1;\r
+ bloop2=numtiles;\r
+ }\r
+ }\r
+ }\r
+ for(bloop1=0; bloop1<ontiles; bloop1++)\r
+ {\r
+ if(!implist[bloop1])\r
+ {\r
+ str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp+(bloop1*256), 256);\r
+ numtiles+=1;\r
+ }\r
+ }\r
+ goto DIE;\r
+ }\r
+\r
+ if (mb==1 && my<(tsy-40) && curtileptr(sofs)<ontiles)\r
+ {\r
+ lt=curtileptr(sofs);\r
+ implist[lt]=1; //zero\r
+ str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
+ memcpy(str, vsp, (numtiles*256));\r
+ vfree(vsp); vsp=str; str=0;\r
+ memcpy(vsp+(numtiles*256), ovsp+(lt*256), 256);\r
+ numtiles+=1;\r
+ tilesrippedthissession++;\r
+ WaitRelease();\r
+ sprintf(strbuf,"Tile %d imported.",lt);\r
+ Message(strbuf, 200);\r
+ }\r
+ }\r
+ DIE: //zero\r
+ pad=op; th=oh;\r
+ vfree(implist); //zero\r
+}\r
+\r
+void ImportVSP()\r
+{ FILE *f;\r
+ word ver;\r
+ char fname[60];\r
+ int bsize;\r
+\r
+ memset(fname, 0, 60);\r
+ bmode=1; oh=th; th=0;\r
+ Browse(1,"*.vsp","","","",&fname);\r
+ if (strlen(fname)<3) return;\r
+ if (!(f=fopen(fname,"rb")))\r
+ errf("VSP file %s not found.",fname);\r
+ WaitRelease(); th=oh; bmode=0;\r
+\r
+ fread(&ver, 1, 2, f);\r
+ if (ver!=2 && ver!=3)\r
+ errf("VSP file %s is not the correct VSP format.",fname);\r
+ fread(strbuf, 1, 768, f);\r
+ fread(&ontiles, 1, 2, f);\r
+ ovsp=(char *) valloc(256*ontiles,"ovsp",0);\r
+\r
+ if (ver==2)\r
+ fread(ovsp, 256, ontiles, f);\r
+ if (ver==3)\r
+ {\r
+ fread(&bsize, 1, 4, f);\r
+ ReadCompressedLayer1(ovsp, 256*ontiles, f);\r
+ }\r
+\r
+ fclose(f);\r
+\r
+ ImportTiles();\r
+ vfree(ovsp);\r
+ key[SCAN_ESC]=0;\r
+\r
+}\r
+\r
+int OPxsize=100, OPysize=40;\r
+int OPxofs=100, OPyofs=70;\r
+\r
+void OpenPCXas()\r
+{ char done=0, moving=0;\r
+ int mxo, myo, cursorblink;\r
+ char ctf=0, cb=0, c, t, *str;\r
+\r
+ last_pressed=0;\r
+ do\r
+ {\r
+ RenderSelector();\r
+ RenderMessages();\r
+\r
+ if (ctf && systemtime >= cursorblink)\r
+ {\r
+ cb ^= 1;\r
+ cursorblink = systemtime+40;\r
+ }\r
+ if (moving)\r
+ {\r
+ OPxofs = (mx-mxo);\r
+ OPyofs = (my-myo);\r
+ if (!mb) moving=0;\r
+ if (OPxofs<16) OPxofs = 16;\r
+ if (OPyofs<16) OPyofs = 16;\r
+ if (OPxofs+OPxsize>335) OPxofs = 336-OPxsize;\r
+ if (OPyofs+OPysize>sy+16) OPyofs = (sy+16)-OPysize;\r
+ }\r
+\r
+ Window(OPxofs, OPyofs, OPxofs+OPxsize, OPyofs+OPysize, "Open PCX As");\r
+ Button(OPxofs+21, OPyofs+18, "Tileset");\r
+ Button(OPxofs+50, OPyofs+18, "Image");\r
+\r
+ DrawMouse();\r
+ ShowPage();\r
+ CheckTimerStuff();\r
+\r
+ // input phase\r
+ if (mb==1 && mx>OPxofs+21 && mx<OPxofs+30+21 && my>OPyofs+18 && my<OPyofs+10+18 && !moving)\r
+ {\r
+ // insert code for button "Tileset" here\r
+ ButtonPressed(OPxofs+21, OPyofs+18, "Tileset");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ openas=0; done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>OPxofs+50 && mx<OPxofs+30+50 && my>OPyofs+18 && my<OPyofs+10+18 && !moving)\r
+ {\r
+ // insert code for button "Image" here\r
+ ButtonPressed(OPxofs+50, OPyofs+18, "Image");\r
+ DrawMouse();\r
+ while (mb)\r
+ {\r
+ ReadMouse();\r
+ ShowPage();\r
+ ReadMouse();\r
+ }\r
+ openas=1; done=1;\r
+ WaitRelease(); continue;\r
+ }\r
+\r
+ if (mb==1 && mx>(OPxofs+OPxsize-9) && (mx<OPxofs+OPxsize-2)\r
+ && my>(OPyofs+1) && (my<OPyofs+8) && !moving)\r
+ {\r
+ done=1;\r
+ WaitRelease();\r
+ break;\r
+ }\r
+\r
+ if (mb==1 && mx>OPxofs && mx<OPxofs+OPxsize && my>OPyofs && my<(OPyofs+9) && !moving)\r
+ {\r
+ moving=1;\r
+ mxo=mx-OPxofs;\r
+ myo=my-OPyofs;\r
+ continue;\r
+ }\r
+\r
+ if (mb==1 && !moving)\r
+ {\r
+ ctf=0;\r
+ cb=0;\r
+ str=0;\r
+ WaitRelease();\r
+ }\r
+\r
+ if (last_pressed)\r
+ {\r
+ if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+ else c=key_ascii_tbl[last_pressed];\r
+\r
+ if (last_pressed==SCAN_ESC)\r
+ {\r
+ key[SCAN_ESC]=0;\r
+ done=1;\r
+ break;\r
+ }\r
+\r
+ if (last_pressed==SCAN_ENTER)\r
+ {\r
+ key[SCAN_ENTER]=0;\r
+ ctf=0;\r
+ str=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ if (!ctf)\r
+ continue;\r
+\r
+ if (last_pressed==SCAN_BACKSP && strlen(str))\r
+ {\r
+ str[strlen(str)-1]=0;\r
+ key[SCAN_BACKSP]=0;\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+ else if (last_pressed==SCAN_BACKSP)\r
+ {\r
+ last_pressed=0;\r
+ continue;\r
+ }\r
+\r
+ t=strlen(str);\r
+ str[t]=c;\r
+ str[t+1]=0;\r
+ last_pressed=0;\r
+ }\r
+ } while (!done);\r
+}\r
+\r
+char manufacturer;\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+short xmin,ymin;\r
+short xmax,ymax;\r
+short hres;\r
+short vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+short bytes_per_line;\r
+short palette_type;\r
+char filler[58];\r
+char *t;\r
+\r
+int width,depth;\r
+int bytes;\r
+int vidoffset;\r
+FILE *pcxf;\r
+\r
+void ReadPCXLine(unsigned char *dest)\r
+{ int i, n;\r
+ char c, run;\r
+\r
+ n=0;\r
+ do {\r
+ c=fgetc(pcxf) & 0xff;\r
+\r
+ if ((c & 0xc0)==0xc0)\r
+ { run=c & 0x3f;\r
+ c=fgetc(pcxf);\r
+ for (i=0; i<run; i++)\r
+ dest[vidoffset+n+i]=c;\r
+ n+=run;\r
+ }\r
+ else {\r
+ dest[vidoffset+n]=c;\r
+ n++;\r
+ }\r
+ } while (n<bytes);\r
+}\r
+\r
+void LoadPCXHeader(char *fname)\r
+{\r
+ int i;\r
+\r
+ if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ fseek(pcxf,-768L,SEEK_END);\r
+ fread(pal,1,768,pcxf);\r
+ fseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal[i]=pal[i] >> 2;\r
+ set_intensity(63);\r
+}\r
+\r
+void LoadPCXHeaderNP(char *fname)\r
+{\r
+ pcxf=fopen(fname,"rb");\r
+ if (!pcxf) err("Could not open specified PCX file.");\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+}\r
+\r
+// grabs a tile from the ovsp buffer (transit tile bay)\r
+int GrabTileAt(int x, int y, int z, int check_dup)\r
+{ int a;\r
+ char tvsp[256];\r
+ char *s;\r
+\r
+ s=t+(y*width)+x;\r
+\r
+ for (a=0; a<16; a++)\r
+ {\r
+ memcpy(tvsp+(a*16), s, 16);\r
+ s+=width;\r
+ }\r
+\r
+ if (check_dup)\r
+ {\r
+ for (a=0; a<z; a++)\r
+ if (!memcmp(tvsp, ovsp+(a*256), 256)) return 0;\r
+ }\r
+\r
+ memcpy(ovsp+(z*256), tvsp, 256);\r
+ return 1;\r
+}\r
+\r
+void ImportPCX()\r
+{ char fname[60];\r
+ int i,j,z;\r
+ int wide,deep; // grabbable x&y tiles\r
+ int add,jumper; // related to grab coords\r
+\r
+ bmode=1; oh=th; th=0;\r
+ Browse(1,"*.pcx","","","",fname);\r
+ WaitRelease();\r
+ if (strlen(fname)<3) return;\r
+ OpenPCXas();\r
+ th=oh; bmode=0;\r
+\r
+ add=!openas;\r
+ jumper=16+add;\r
+\r
+ LoadPCXHeader(fname);\r
+\r
+ // temp pcx buffer for grabs\r
+ t=(char *) valloc(width*depth,"pcx buf",0);\r
+\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=width*i;\r
+ ReadPCXLine(t);\r
+ }\r
+\r
+ fclose(pcxf);\r
+\r
+ deep=((depth&~15)+add)/jumper;\r
+ wide=(width+add)/jumper;\r
+\r
+ ontiles=wide*deep;\r
+ ovsp=(char *) valloc(ontiles*256,"ovsp",0); // temp tilebay\r
+\r
+ z=0;\r
+ for (i=0; i<deep; i++) // grab all tiles\r
+ for (j=0; j<wide; j++)\r
+ {\r
+ z+=GrabTileAt((j*jumper)+add, (i*jumper)+add, z, openas);\r
+ }\r
+\r
+ ontiles = z; // tiles successfully grabbed\r
+ vfree(t);\r
+\r
+ ImportTiles();\r
+ vfree(ovsp);\r
+ key[SCAN_ESC]=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TILESEL_INC\r
+#define TILESEL_INC\r
+\r
+extern int selofs;\r
+extern char ttile[256], ttile2[256];\r
+extern char curastd;\r
+extern char curmode;\r
+\r
+extern int curtileptr(int row);\r
+extern void NormalButton(int x1, int y1, int x2, int y2, char *str);\r
+extern void PressdButton(int x1, int y1, int x2, int y2, char *str);\r
+extern void RenderSelector();\r
+extern void FlipX(unsigned short edtile);\r
+extern void FlipY(unsigned short edtile);\r
+extern void FlipZ(unsigned short edtile);\r
+extern void DrawHighlight(int x, int y);\r
+extern void TileSelector();\r
+extern void VSPAnimDialog();\r
+extern void AddTilesDialog();\r
+extern void RenderImport();\r
+extern void ImportTiles();\r
+extern void ImportVSP();\r
+extern void OpenPCXas();\r
+\r
+extern void ReadPCXLine(unsigned char *dest);\r
+extern void LoadPCXHeader(char *fname);\r
+extern void LoadPCXHeaderNP(char *fname);\r
+extern int GrabTileAt(int x, int y, int z, int check_dup);\r
+extern void ImportPCX();\r
+\r
+#endif // TILESEL_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+#include <conio.h>\r
+\r
+#include "mikmod.h"\r
+\r
+#include "render.h"\r
+\r
+#define PIT0 0x40\r
+#define PIT1 0x41\r
+#define PIT2 0x42\r
+#define PITMODE 0x43\r
+#define PITCONST 1193180L\r
+\r
+#define OCR1 0x20\r
+#define IMR1 0x21\r
+\r
+#define OCR2 0xA0\r
+#define IMR2 0xA1\r
+\r
+// ================================= Data ====================================\r
+\r
+void (__interrupt __far *biosTimerHandler)();\r
+char timerinstalled=0;\r
+extern char soundokay;\r
+\r
+volatile unsigned int systemtime=0, timer_count=0, tick=0;\r
+volatile int backupct=0, idlect=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+#pragma aux disable =\\r
+ "cli";\r
+\r
+#pragma aux enable =\\r
+ "sti";\r
+\r
+static void SendEOI (unsigned char irqno)\r
+{\r
+ static unsigned char ocr;\r
+ static unsigned char eoi;\r
+\r
+ ocr=(irqno>7) ? OCR2 : OCR1;\r
+ eoi=0x60|(irqno&7);\r
+ outp(ocr,eoi);\r
+ if (irqno>7) outp(OCR1,0x20);\r
+}\r
+\r
+void __interrupt __far newhandler(void)\r
+{\r
+ systemtime++;\r
+ timer_count++;\r
+ tick++;\r
+ backupct++;\r
+ idlect++;\r
+ CheckTileAnimation();\r
+ if (soundokay) MD_Update();\r
+ SendEOI(0);\r
+}\r
+\r
+void SetHZ(unsigned int hz)\r
+{ unsigned int pit0_set, pit0_value;\r
+\r
+ disable();\r
+\r
+ outp(PITMODE, 0x34);\r
+ pit0_value=PITCONST / hz;\r
+ pit0_set=(pit0_value & 0x00ff);\r
+ outp(PIT0, pit0_set);\r
+ pit0_set=(pit0_value >> 8);\r
+ outp(PIT0, pit0_set);\r
+\r
+ enable();\r
+}\r
+\r
+void RestoreHZ()\r
+{\r
+ disable();\r
+ outp(PITMODE, 0x34);\r
+ outp(PIT0, 0x00);\r
+ outp(PIT0, 0x00);\r
+ enable();\r
+}\r
+\r
+void InitTimer()\r
+{\r
+ if (timerinstalled) return;\r
+\r
+ biosTimerHandler=_dos_getvect(0x08);\r
+ _dos_setvect(0x08, newhandler);\r
+ timerinstalled=1;\r
+ SetHZ(100);\r
+}\r
+\r
+void ShutdownTimer()\r
+{\r
+ if (!timerinstalled) return;\r
+\r
+ _dos_setvect(0x08, biosTimerHandler);\r
+ RestoreHZ();\r
+ timerinstalled=0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef TIMER_INC\r
+#define TIMER_INC\r
+\r
+extern unsigned int systemtime, timer_count, tick;\r
+extern int backupct, idlect;\r
+//extern int (*callback) (void); // ??? <aen, apr 21>\r
+\r
+extern void SetHZ(unsigned int hz);\r
+extern void RestoreHZ();\r
+extern void InitTimer();\r
+extern void ShutdownTimer();\r
+\r
+#endif // TIMER_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <conio.h>\r
+\r
+#include "mode13h.h"\r
+#include "modex.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// Driver function-pointers.\r
+int (*ShutdownVideo) (void);\r
+int (*ShowPage) (void);\r
+int (*CopySprite) (int x, int y, int width, int height, char *src);\r
+int (*CCopySprite) (int x, int y, int width, int height, char *src);\r
+int (*TCCopySprite) (int x, int y, int width, int height, char *src);\r
+int (*TCopySprite) (int x, int y, int width, int height, char *src);\r
+int (*CopyTile) (int x, int y, char *src);\r
+int (*FilledBox) (int x, int y, int width, int height, char c);\r
+int (*VLine) (int x, int y, int height, char color);\r
+int (*HLine) (int x, int y, int width, char color);\r
+int (*ColorGrid) (int x, int y, char c);\r
+int (*ClearScreen) (void);\r
+int (*CopySpriteLucentClip) (int x, int y, int width, int height, unsigned char *src);\r
+\r
+unsigned char pal[768], pal2[768];\r
+unsigned char *screen=0;\r
+\r
+int sx=0, sy=0;\r
+int tx=0, ty=0;\r
+int tsx=0, tsy=0;\r
+int map_scroll_x=1;\r
+int map_scroll_y=1;\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitVideo(int mode)\r
+{\r
+ switch (mode)\r
+ {\r
+ case 0: InitMode13h(); break;\r
+ case 1: InitModeX(); // 320x240\r
+ break;\r
+ }\r
+}\r
+\r
+void SetPalette(unsigned char *pall)\r
+{ unsigned int i;\r
+\r
+ outp(0x03c8,0);\r
+ for (i=0; i<768; i++)\r
+ outp(0x03c9,pall[i]);\r
+}\r
+\r
+void GetPalette(void)\r
+{ unsigned int i;\r
+\r
+ outp(0x03c7,0);\r
+ for (i=0; i<768; i++)\r
+ pal[i]=inp(0x03c9);\r
+}\r
+\r
+void set_intensity(unsigned int n)\r
+{ unsigned int i;\r
+\r
+ for (i=0; i<768; i++)\r
+ pal2[i]=(pal[i]*n)>>6;\r
+\r
+ SetPalette(pal2);\r
+}\r
+\r
+#define byte unsigned char\r
+int cx1=16, cy1=16, cx2=336, cy2=256;\r
+\r
+char stipple[256]={\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+ 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,\r
+ 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,\r
+};\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#ifndef VDRIVER_INC\r
+#define VDRIVER_INC\r
+\r
+#include "inter.h"\r
+\r
+extern int (*ShutdownVideo) (void);\r
+extern int (*ShowPage) (void);\r
+extern int (*CopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*CCopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*TCCopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*TCopySprite) (int x, int y, int width, int height, char *src);\r
+extern int (*CopySpriteLucentClip) (int x, int y, int width, int height, unsigned char *src);\r
+extern int (*CopyTile) (int x, int y, char *src);\r
+extern int (*FilledBox) (int x, int y, int width, int height, char c);\r
+extern int (*VLine) (int x, int y, int height, char color);\r
+extern int (*HLine) (int x, int y, int width, char color);\r
+extern int (*ColorGrid) (int x, int y, char c);\r
+extern int (*ClearScreen) (void);\r
+\r
+extern unsigned char pal[768], pal2[768];\r
+extern unsigned char *screen;\r
+\r
+extern int sx, sy, tx, ty, tsx, tsy;\r
+extern int map_scroll_x, map_scroll_y;\r
+\r
+extern void InitVideo(int mode);\r
+extern void SetPalette(unsigned char *pall);\r
+extern void GetPalette(void);\r
+extern void set_intensity(unsigned int n);\r
+\r
+extern int cx1, cy1, cx2, cy2;\r
+\r
+#endif // VDRIVER_INC\r
--- /dev/null
+/*
+Copyright (C) 1998 BJ Eirich (aka vecna)
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public Lic
+See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#define VERGEPAL_LEN 768
+
+ static unsigned char vergepal[]=
+ {
+ 0x00,0x00,0x00,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x05,0x05,0x07,
+ 0x07,0x07,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0e,0x0e,
+ 0x0e,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x13,0x13,0x13,0x15,0x15,0x15,
+ 0x16,0x16,0x16,0x18,0x18,0x18,0x1a,0x1a,0x1a,0x1c,0x1c,0x1c,0x1d,
+ 0x1d,0x1d,0x1f,0x1f,0x1f,0x21,0x21,0x21,0x22,0x22,0x22,0x24,0x24,
+ 0x24,0x26,0x26,0x26,0x28,0x28,0x28,0x29,0x29,0x29,0x2b,0x2b,0x2b,
+ 0x2e,0x2e,0x2e,0x31,0x31,0x31,0x34,0x34,0x34,0x36,0x36,0x36,0x39,
+ 0x39,0x39,0x3c,0x3c,0x3c,0x3f,0x00,0x00,0x3b,0x00,0x00,0x38,0x00,
+ 0x00,0x35,0x00,0x00,0x32,0x00,0x00,0x2f,0x00,0x00,0x2c,0x00,0x00,
+ 0x29,0x00,0x00,0x26,0x00,0x00,0x22,0x00,0x00,0x1f,0x00,0x00,0x1c,
+ 0x00,0x00,0x19,0x00,0x00,0x16,0x00,0x00,0x13,0x00,0x00,0x10,0x00,
+ 0x00,0x3f,0x36,0x36,0x3f,0x2e,0x2e,0x3f,0x27,0x27,0x3f,0x1f,0x1f,
+ 0x3f,0x17,0x17,0x3f,0x10,0x10,0x3f,0x08,0x08,0x3f,0x00,0x00,0x11,
+ 0x0b,0x06,0x13,0x0d,0x07,0x15,0x0f,0x09,0x17,0x11,0x0a,0x18,0x13,
+ 0x0b,0x1a,0x15,0x0c,0x1c,0x17,0x0e,0x1e,0x19,0x0f,0x3f,0x3f,0x36,
+ 0x3f,0x3f,0x2e,0x3f,0x3f,0x27,0x3f,0x3f,0x1f,0x3f,0x3e,0x17,0x3f,
+ 0x3d,0x10,0x3f,0x3d,0x08,0x3f,0x3d,0x00,0x39,0x36,0x00,0x33,0x31,
+ 0x00,0x2d,0x2b,0x00,0x27,0x27,0x00,0x21,0x21,0x00,0x1c,0x1b,0x00,
+ 0x16,0x15,0x00,0x10,0x10,0x00,0x34,0x3f,0x17,0x31,0x3f,0x10,0x2d,
+ 0x3f,0x08,0x28,0x3f,0x00,0x24,0x39,0x00,0x20,0x33,0x00,0x1d,0x2d,
+ 0x00,0x18,0x27,0x00,0x36,0x3f,0x36,0x2e,0x3d,0x2e,0x27,0x3b,0x27,
+ 0x1f,0x39,0x1f,0x17,0x36,0x17,0x0f,0x34,0x0f,0x08,0x32,0x08,0x00,
+ 0x30,0x00,0x00,0x2d,0x00,0x00,0x2b,0x00,0x00,0x28,0x00,0x00,0x26,
+ 0x00,0x00,0x23,0x00,0x00,0x21,0x00,0x00,0x1e,0x00,0x00,0x1c,0x00,
+ 0x00,0x19,0x00,0x00,0x17,0x00,0x00,0x14,0x00,0x00,0x12,0x00,0x00,
+ 0x0f,0x00,0x02,0x0d,0x02,0x03,0x0a,0x03,0x05,0x08,0x05,0x36,0x3f,
+ 0x3f,0x2e,0x3f,0x3f,0x27,0x3f,0x3f,0x1f,0x3f,0x3f,0x17,0x3f,0x3f,
+ 0x0f,0x3f,0x3f,0x08,0x3f,0x3f,0x00,0x3f,0x3f,0x00,0x39,0x39,0x00,
+ 0x33,0x33,0x00,0x2d,0x2d,0x00,0x27,0x27,0x00,0x22,0x22,0x00,0x1c,
+ 0x1c,0x00,0x16,0x16,0x00,0x10,0x10,0x17,0x2f,0x3f,0x10,0x2c,0x3f,
+ 0x08,0x2a,0x3f,0x00,0x27,0x3f,0x00,0x23,0x39,0x00,0x1f,0x33,0x00,
+ 0x1b,0x2d,0x00,0x17,0x27,0x36,0x36,0x3f,0x2e,0x2f,0x3f,0x27,0x27,
+ 0x3f,0x1f,0x20,0x3f,0x17,0x18,0x3f,0x10,0x10,0x3f,0x08,0x09,0x3f,
+ 0x00,0x01,0x3f,0x00,0x00,0x3f,0x00,0x00,0x3b,0x00,0x00,0x38,0x00,
+ 0x00,0x35,0x00,0x00,0x32,0x00,0x00,0x2f,0x00,0x00,0x2c,0x00,0x00,
+ 0x29,0x00,0x00,0x26,0x00,0x00,0x22,0x00,0x00,0x1f,0x00,0x00,0x1c,
+ 0x00,0x00,0x19,0x00,0x00,0x16,0x00,0x00,0x13,0x00,0x00,0x10,0x0d,
+ 0x08,0x00,0x0f,0x09,0x00,0x12,0x0a,0x00,0x14,0x0b,0x00,0x16,0x0c,
+ 0x00,0x19,0x0d,0x00,0x1b,0x0e,0x00,0x1e,0x0f,0x00,0x20,0x10,0x00,
+ 0x22,0x11,0x00,0x25,0x12,0x00,0x28,0x15,0x03,0x2c,0x18,0x06,0x2f,
+ 0x1b,0x09,0x32,0x1e,0x0c,0x35,0x21,0x0e,0x39,0x24,0x11,0x3c,0x27,
+ 0x14,0x3f,0x2a,0x17,0x3f,0x2e,0x1c,0x3f,0x31,0x22,0x3f,0x35,0x27,
+ 0x3f,0x38,0x2c,0x22,0x1c,0x12,0x25,0x1f,0x14,0x29,0x22,0x17,0x2c,
+ 0x25,0x19,0x2f,0x28,0x1c,0x32,0x2a,0x1e,0x36,0x2d,0x20,0x39,0x30,
+ 0x23,0x3c,0x33,0x25,0x3f,0x3a,0x37,0x3f,0x38,0x34,0x3f,0x36,0x31,
+ 0x3f,0x35,0x2f,0x3f,0x33,0x2c,0x3f,0x31,0x29,0x3f,0x2f,0x27,0x3f,
+ 0x2e,0x24,0x3f,0x2c,0x20,0x3f,0x29,0x1c,0x3f,0x27,0x18,0x3c,0x25,
+ 0x17,0x3a,0x23,0x16,0x37,0x22,0x15,0x34,0x20,0x14,0x32,0x1f,0x13,
+ 0x2f,0x1e,0x12,0x2d,0x1c,0x11,0x2a,0x1a,0x10,0x28,0x19,0x0f,0x27,
+ 0x18,0x0e,0x24,0x17,0x0d,0x22,0x16,0x0c,0x20,0x14,0x0b,0x1d,0x13,
+ 0x0a,0x1b,0x12,0x09,0x17,0x10,0x08,0x15,0x0f,0x07,0x12,0x0e,0x06,
+ 0x10,0x0c,0x06,0x0e,0x0b,0x05,0x0a,0x08,0x03,0x3f,0x00,0x00,0x3f,
+ 0x04,0x00,0x3f,0x08,0x00,0x3f,0x0d,0x00,0x3f,0x11,0x00,0x3f,0x15,
+ 0x00,0x3f,0x19,0x00,0x3f,0x1d,0x00,0x3f,0x22,0x00,0x3f,0x26,0x00,
+ 0x3f,0x2a,0x00,0x3f,0x2e,0x00,0x3f,0x32,0x00,0x3f,0x37,0x00,0x3f,
+ 0x3b,0x00,0x3f,0x3f,0x00,0x3f,0x2f,0x00,0x36,0x28,0x00,0x2d,0x22,
+ 0x00,0x24,0x1b,0x00,0x1b,0x14,0x00,0x12,0x0d,0x00,0x09,0x07,0x00,
+ 0x00,0x00,0x00,0x29,0x00,0x28,0x23,0x00,0x2b,0x1d,0x00,0x2f,0x17,
+ 0x00,0x32,0x12,0x00,0x35,0x0c,0x00,0x38,0x06,0x00,0x3c,0x3f,0x3f,
+ 0x3f,0x3f
+ };
+
--- /dev/null
+\r
+VERGE version 2.01a, Copyright (C) 1998 BJ Eirich (aka vecna)\r
+VERGE comes with ABSOLUTELY NO WARRANTY. This is free software,\r
+and you are welcome to redistribute it under certain conditions.\r
+For details refer to GNU.TXT.\r
+\r
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+>Jan 1, 2000<\r
+\r
+Hey Guys,\r
+\r
+This is the old source for V2 (DJGPP), along with the sources for the utils (mostly DJGPP), the VCC compiler (DJGPP; though it should compiler under Watcom), and MapEd 2 (Watcom). Just getting this out the door. The new source will be released and updated regularly a week or so from now, so you can futz around with this until that time.\r
+\r
+I'm not sure the main engine even runs in this build, as all I got from compiling and running it was a fistful of page faults. Sorry, I don't feel like trying to make it work. It's old and stinky (enjoy! ^_^). It may be VC incompatibilities with newer stuff, it may be some minor oversight on my part from tweaking it at some point, it could by anything.\r
+\r
+The utils and MapEd 2 seemed to be in working order, however. Didn't include all the util sources, because they're hidden somewhere on my hard drive. I'll find them later (like when I clean this cluttered mess of a hard drive).\r
+\r
+I removed the CD audio code, because of GPL issues and it was a shoddy interface to begin with. I didn't take the FLI code out, though I can't remember where I got it from. It's likely I nabbed it up from X2FTP or some similar archive. If you can figure out where it's from and if I'm violating the GPL by including it (though I hacked it up a bit), just send me some proof of its origin and license and I'll remove it.\r
+\r
+Otherwise, wham. There ya go. If you have any questions about it, just drop me a line and I'll see what I can do. Happy New Year, and have fun with it... Or possibly heaping gobs of frustration. :-)\r
+\r
+- aen\r
+\r
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+Pertaining to MikMod:\r
+\r
+Parts of the library (in playercode/mdulaw.c) are derived from the files\r
+libst.h and raw.c from an old version of the sox (SOund eXchange) package\r
+written by Lance Norskog and Jef Poskanzer. The following copyright notice\r
+applies to these parts:\r
+\r
+Copyright (C) 1989 by Jef Poskanzer.\r
+Permission to use, copy, modify, and distribute this software and its\r
+documentation for any purpose and without fee is hereby granted, provided\r
+that the above copyright notice appear in all copies and that both that\r
+copyright notice and this permission notice appear in supporting\r
+documentation. This software is provided "as is" without express or\r
+implied warranty.\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <malloc.h>\r
+\r
+char c[100];\r
+FILE *f;\r
+char *jalblkasd;\r
+char byte, *t;\r
+short word;\r
+int quad;\r
+\r
+int bufsize=0;\r
+unsigned char *csrc, *cb;\r
+\r
+void EmitC (unsigned char c)\r
+{\r
+ *csrc++=c;\r
+ bufsize++;\r
+}\r
+\r
+void Compress(unsigned char *p, int len)\r
+{\r
+ int i;\r
+ unsigned char byt,samect;\r
+ unsigned char repcode;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ { byt=p[i++];\r
+ samect=1;\r
+ while (samect<254 && i<len && byt==p[i])\r
+ {\r
+ samect++;\r
+ i++;\r
+ }\r
+ if (samect==2 && byt != 0xFF) { EmitC(byt); }\r
+ if (samect==3 && byt != 0xFF) { EmitC(byt); EmitC(byt); }\r
+ if (samect>3 || byt == 0xFF)\r
+ {\r
+ repcode=0xFF;\r
+ EmitC(repcode);\r
+ repcode=(char) samect;\r
+ EmitC(repcode);\r
+ }\r
+ EmitC(byt);\r
+ } while (i<len);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ int i;\r
+\r
+ printf("CHRCONV v.1.00 Copyright (C)1998 BJ Eirich \n");\r
+ if (argc==1)\r
+ {\r
+ printf("CHR filename: "); fflush(stdout);\r
+ scanf("%s",c);\r
+ f=fopen(c, "rb");\r
+ }\r
+ if (argc==2)\r
+ {\r
+ memcpy(c, argv[1], strlen(argv[1]));\r
+ printf("Converting %s.\n",c);\r
+ f=fopen(c, "rb");\r
+ }\r
+ if (!f)\r
+ {\r
+ printf("Invalid filename.\n");\r
+ exit(-1);\r
+ }\r
+ jalblkasd=(char *) malloc(15360);\r
+ fread(jalblkasd, 1, 15360, f);\r
+ fclose(f);\r
+\r
+ f=fopen(c,"wb");\r
+ byte=2; fwrite(&byte, 1, 1, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=32; fwrite(&word, 1, 2, f);\r
+ word=0; fwrite(&word, 1, 2, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=16; fwrite(&word, 1, 2, f);\r
+ word=30; fwrite(&word, 1, 2, f);\r
+\r
+ cb=(char *) malloc(512*30);\r
+ Compress(jalblkasd, 512*30);\r
+ free(jalblkasd);\r
+ fwrite(&bufsize, 1, 4, f);\r
+ fwrite(cb, 1, bufsize, f);\r
+ free(cb);\r
+\r
+ quad=15; fwrite(&quad, 1, 4, f);\r
+ quad=10; fwrite(&quad, 1, 4, f);\r
+ quad=5; fwrite(&quad, 1, 4, f);\r
+ quad=0; fwrite(&quad, 1, 4, f);\r
+\r
+ t="F16W10F17W10F16W10F15W10F18W10F19W10F18W10F15W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+ t="F11W10F12W10F11W10F10W10F13W10F14W10F13W10F10W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+ t="F6W10F7W10F6W10F5W10F8W10F9W10F8W10F5W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+ t="F1W10F2W10F1W10F0W10F3W10F4W10F3W10F0W10";\r
+ i=(strlen(t)+1); fwrite(&i, 1, 4, f); fwrite(t, 1, i, f);\r
+\r
+ fclose(f);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+chrconv.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: converts v1 chr -> v2 chr\r
+---\r
+Chrconv is a remarkably simple utility, and that is a shame, because eventually you won't use it much at all. But initially it will be of great value to everyone, because it converts from old v1 chrs to new v2 chrs.\r
+\r
+The v2 chr it creates will emulate the animation behavior of a v1 exactly, so it should look and operate like you're used to. This is useful, because writing animation strings and handling odd-shaped chrs may not be something that appeals to you just yet. For example, the default animation string used by chrconv for walking north is:F16W10F17W10F16W10F15W10F18W10F19W10F18W10F15W10.\r
+\r
+To use chrconv, simply execute it. It will ask for the filename of the source v1 chr, and will convert it to v2 format. NOTE: it will overwrite the old chr, so you may want to back it up first.\r
+\r
+enjoy!
\ No newline at end of file
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 chrconv.c -o chrconv.exe\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// CHRMAK.CC\r
+// V2 PCX to CHR converter w/ makefiles\r
+//\r
+// coded by aen\r
+// aen@verge-rpg.com\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+#include <string.h>\r
+#include <sys/stat.h>\r
+\r
+#include <conio.h>\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+typedef unsigned char byte;\r
+typedef unsigned short word;\r
+typedef unsigned long quad;\r
+\r
+static void fputw(word w, FILE *fp) { fwrite(&w,1,2,fp); }\r
+static void fputd(quad d, FILE *fp) { fwrite(&d,1,4,fp); }\r
+static word fgetw(FILE *fp) { word w; fread(&w,1,2,fp); return w; }\r
+quad fgetd(FILE *fp) { quad d; fread(&d,1,4,fp); return d; }\r
+\r
+// skips the number of bytes in the file; just seeks past them\r
+static void fskip(int bytes, FILE *fp)\r
+ { fseek(fp,bytes,SEEK_CUR); }\r
+\r
+static void fputraw(char *raw, int bytes, FILE *fp)\r
+ { fwrite(raw, 1,bytes, fp); }\r
+\r
+// writes a null-terminated string to the file\r
+void fputstrz(char *str, FILE *fp)\r
+ { fputraw(str, strlen(str)+1, fp); }\r
+\r
+// writes a string to the file (without the null-terminator), preceeded by\r
+// a quad length marker\r
+static void fputstrn(char *str, FILE *fp)\r
+ { int n=strlen(str)+1; fputd(n,fp); fputraw(str,n,fp); }\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+#define CHRMAK_VER_MAJ 0\r
+#define CHRMAK_VER_MIN 1\r
+#define CHRMAK_VER_STR "0.1b"\r
+#define CHRMAK_AUTHORS "aen"\r
+\r
+// parsing vars\r
+static char *mak_base=0;\r
+static char *makp=0;\r
+static int mak_bytes=0;\r
+static char mak_tok_ident[256];\r
+static char mak_tok_val[256];\r
+static int mak_tok_valn=0; // numeric val of mak_tok\r
+static int mak_line=0;\r
+\r
+// makefile vars\r
+static char chrmak_makefile[256];\r
+\r
+static char pcx_name[256]; static int got_pcx_name=0;\r
+static char chr_name[256]; static int got_chr_name=0;\r
+static int frame_w=0; static int got_frame_w=0;\r
+static int frame_h=0; static int got_frame_h=0;\r
+static int hot_x=0; static int got_hot_x=0;\r
+static int hot_y=0; static int got_hot_y=0;\r
+static int hot_w=0; static int got_hot_w=0;\r
+static int hot_h=0; static int got_hot_h=0;\r
+static int per_row=0; static int got_per_row=0;\r
+static int total_frames=0; static int got_total_frames=0;\r
+static int lidle=0; static int got_lidle=0;\r
+static int ridle=0; static int got_ridle=0;\r
+static int uidle=0; static int got_uidle=0;\r
+static int didle=0; static int got_didle=0;\r
+static char lscript[256]; static int got_lscript=0;\r
+static char rscript[256]; static int got_rscript=0;\r
+static char uscript[256]; static int got_uscript=0;\r
+static char dscript[256]; static int got_dscript=0;\r
+\r
+void warning(char *message, ...)\r
+{\r
+ static char buffer[256];\r
+ va_list args;\r
+\r
+ va_start(args, message);\r
+ vsprintf(buffer, message, args);\r
+ va_end(args);\r
+\r
+ printf("%s \n", buffer);\r
+}\r
+\r
+static void fatal(char *message, ...)\r
+{\r
+ static char buffer[256];\r
+ va_list args;\r
+\r
+ va_start(args, message);\r
+ vsprintf(buffer, message, args);\r
+ va_end(args);\r
+\r
+ printf("%s \n", buffer);\r
+\r
+ exit(0);\r
+}\r
+\r
+//#ifdef __DJGPP__\r
+// Watcom has one of these\r
+static int filelength(int handle)\r
+{\r
+ struct stat fileinfo;\r
+ if (-1 == fstat(handle, &fileinfo))\r
+ fatal("error fstating");\r
+ return fileinfo.st_size;\r
+}\r
+//#endif\r
+\r
+static int streq(char *a, char *b)\r
+{\r
+ while (*a)\r
+ {\r
+ if (*a++ != *b++)\r
+ return 0;\r
+ }\r
+ return !*b;\r
+}\r
+\r
+static void usage()\r
+{\r
+ printf("usage: chrmak <makefile> \n");\r
+ exit(0);\r
+}\r
+\r
+static void banner()\r
+{\r
+ printf("chrmak v%s \1e by %s \n", CHRMAK_VER_STR, CHRMAK_AUTHORS);\r
+}\r
+\r
+static void parse_args(int argc, char *argv[])\r
+{\r
+ if (argc != 2)\r
+ usage();\r
+\r
+ strcpy(chrmak_makefile, argv[1]);\r
+}\r
+\r
+static void skip_cpp_comment()\r
+{\r
+ makp+=2;\r
+ while (*makp && '\n'!=*makp)\r
+ makp++;\r
+ if (*makp)\r
+ makp++;\r
+}\r
+\r
+static void skip_c_comment()\r
+{\r
+ makp+=2;\r
+ while (*makp && ('*'!=makp[0] || '/'!=makp[1]))\r
+ {\r
+ if ('\n'==*makp)\r
+ mak_line++;\r
+ if ('/'==makp[0] && '*'==makp[1])\r
+ skip_c_comment();\r
+ else makp++;\r
+ }\r
+ if (*makp)\r
+ makp+=2;\r
+}\r
+\r
+static void parse_whitespace()\r
+{\r
+ do {\r
+ if (!*makp)\r
+ return;\r
+ if (isspace(*makp))\r
+ {\r
+ while (*makp && isspace(*makp))\r
+ {\r
+ if ('\n'==*makp)\r
+ mak_line++;\r
+ makp++;\r
+ }\r
+ continue;\r
+ }\r
+ if ('/'==makp[0] && '/'==makp[1])\r
+ { skip_cpp_comment(); continue; }\r
+ if ('/'==makp[0] && '*'==makp[1])\r
+ { skip_c_comment(); continue; }\r
+ break;\r
+ } while (1);\r
+}\r
+\r
+static void grab_ident()\r
+{\r
+ char *t=mak_tok_ident;\r
+ while (isalnum(*makp) || '_'==*makp)\r
+ *t++=*makp++;\r
+ *t=0;\r
+ strlwr(mak_tok_ident);\r
+}\r
+\r
+static void grab_val()\r
+{\r
+ char *t=mak_tok_val;\r
+ while (isalnum(*makp) || '_'==*makp)\r
+ *t++=*makp++;\r
+ *t=0;\r
+ mak_tok_valn=atoi(mak_tok_val);\r
+}\r
+\r
+static int ident_is(char *id) { return streq(mak_tok_ident,id); }\r
+\r
+static void do_assign()\r
+{\r
+ if (ident_is("pcx_name"))\r
+ { strcpy(pcx_name, mak_tok_val); got_pcx_name=1; return; }\r
+ else if (ident_is("chr_name"))\r
+ { strcpy(chr_name, mak_tok_val); got_chr_name=1; return; }\r
+ else if (ident_is("frame_w"))\r
+ { frame_w=mak_tok_valn; got_frame_w=1; return; }\r
+ else if (ident_is("frame_h"))\r
+ { frame_h=mak_tok_valn; got_frame_h=1; return; }\r
+ else if (ident_is("hot_x"))\r
+ { hot_x=mak_tok_valn; got_hot_x=1; return; }\r
+ else if (ident_is("hot_y"))\r
+ { hot_y=mak_tok_valn; got_hot_y=1; return; }\r
+ else if (ident_is("hot_w"))\r
+ { hot_w=mak_tok_valn; got_hot_w=1; return; }\r
+ else if (ident_is("hot_h"))\r
+ { hot_h=mak_tok_valn; got_hot_h=1; return; }\r
+ else if (ident_is("per_row"))\r
+ { per_row=mak_tok_valn; got_per_row=1; return; }\r
+ else if (ident_is("total_frames"))\r
+ { total_frames=mak_tok_valn; got_total_frames=1; return; }\r
+ else if (ident_is("lidle"))\r
+ { lidle=mak_tok_valn; got_lidle=1; return; }\r
+ else if (ident_is("ridle"))\r
+ { ridle=mak_tok_valn; got_ridle=1; return; }\r
+ else if (ident_is("uidle"))\r
+ { uidle=mak_tok_valn; got_uidle=1; return; }\r
+ else if (ident_is("didle"))\r
+ { didle=mak_tok_valn; got_didle=1; return; }\r
+ else if (ident_is("lscript"))\r
+ { strcpy(lscript, mak_tok_val); got_lscript=1; return; }\r
+ else if (ident_is("rscript"))\r
+ { strcpy(rscript, mak_tok_val); got_rscript=1; return; }\r
+ else if (ident_is("uscript"))\r
+ { strcpy(uscript, mak_tok_val); got_uscript=1; return; }\r
+ else if (ident_is("dscript"))\r
+ { strcpy(dscript, mak_tok_val); got_dscript=1; return; }\r
+\r
+ fatal("%s: unknown ident '%s' on line %i",\r
+ chrmak_makefile, mak_tok_ident, mak_line);\r
+}\r
+\r
+static int parse_assign()\r
+{\r
+ int last_line=0; // helper for error detection\r
+\r
+ parse_whitespace();\r
+ if (!*makp)\r
+ return 1;\r
+ else if (isalpha(*makp))\r
+ {\r
+ grab_ident(); // get ident\r
+ last_line=mak_line;\r
+\r
+ parse_whitespace(); // expect\r
+ if ('=' != *makp++)\r
+ fatal("%s: expected = on line %i", chrmak_makefile, last_line);\r
+\r
+ parse_whitespace(); // get val\r
+ grab_val();\r
+ last_line=mak_line;\r
+\r
+ do_assign();\r
+\r
+ parse_whitespace(); // expect\r
+ if (';' != *makp++)\r
+ fatal("%s: expected ; on line %i", chrmak_makefile, last_line);\r
+ else while (';'==*makp) makp++;\r
+\r
+ return 0;\r
+ }\r
+ fatal("%s: expected ident, got '%c' on line %i",\r
+ chrmak_makefile, *makp, mak_line);\r
+ return 1;\r
+}\r
+\r
+static void check_needs()\r
+{\r
+ if (!got_pcx_name) fatal("%s: pcx_name missing", chrmak_makefile);\r
+ if (!got_chr_name) fatal("%s: chr_name missing", chrmak_makefile);\r
+ if (!got_frame_w) fatal("%s: frame_w missing", chrmak_makefile);\r
+ if (!got_frame_h) fatal("%s: frame_h missing", chrmak_makefile);\r
+ if (!got_hot_x) fatal("%s: hot_x missing", chrmak_makefile);\r
+ if (!got_hot_y) fatal("%s: hot_y missing", chrmak_makefile);\r
+ if (!got_hot_w) fatal("%s: hot_w missing", chrmak_makefile);\r
+ if (!got_hot_h) fatal("%s: hot_h missing", chrmak_makefile);\r
+ if (!got_per_row) fatal("%s: per_row missing", chrmak_makefile);\r
+ if (!got_total_frames) fatal("%s: total_frames missing", chrmak_makefile);\r
+ if (!got_lidle) fatal("%s: lidle missing", chrmak_makefile);\r
+ if (!got_ridle) fatal("%s: ridle missing", chrmak_makefile);\r
+ if (!got_uidle) fatal("%s: uidle missing", chrmak_makefile);\r
+ if (!got_didle) fatal("%s: didle missing", chrmak_makefile);\r
+ if (!got_lscript) fatal("%s: lscript missing", chrmak_makefile);\r
+ if (!got_rscript) fatal("%s: rscript missing", chrmak_makefile);\r
+ if (!got_uscript) fatal("%s: uscript missing", chrmak_makefile);\r
+ if (!got_dscript) fatal("%s: dscript missing", chrmak_makefile);\r
+}\r
+\r
+static void parse_makefile()\r
+{\r
+ FILE *fp=0;\r
+\r
+ printf("ú parsing %s \r", chrmak_makefile);\r
+ fflush(stdout);\r
+\r
+ fp=fopen(chrmak_makefile, "rb");\r
+ if (!fp) fatal("unable to open %s", chrmak_makefile);\r
+\r
+ mak_bytes=filelength(fileno(fp)); // calc bytes\r
+ mak_base=new char [mak_bytes+1]; // alloc room\r
+ fread(mak_base,1,mak_bytes,fp); // read bytes\r
+ mak_base[mak_bytes]=0; // null-term\r
+ makp=mak_base; // setup cur byte ptr\r
+ mak_line=1;\r
+\r
+ while (!parse_assign())\r
+ ;\r
+\r
+ // got everything we need?\r
+ check_needs();\r
+\r
+ delete[]mak_base; mak_base=0;\r
+ makp=0;\r
+\r
+ fclose(fp);\r
+\r
+ printf("û \n");\r
+ fflush(stdout);\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+// PCX & COMPRESS STUFF ////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+static FILE *chrfp=0;\r
+static FILE *pcxfp=0;\r
+static byte *virscr=0;\r
+\r
+int manufacturer=0; // pcx header\r
+int version=0;\r
+int encoding=0;\r
+int bpp=0;\r
+int xmin=0,ymin=0;\r
+int xmax=0,ymax=0;\r
+int hres=0,vres=0;\r
+char palette[48];\r
+int reserved=0;\r
+int color_planes=0;\r
+int bpl=0;\r
+int palette_type=0;\r
+char filler[58];\r
+byte pal[768];\r
+\r
+int image_width=0,image_depth=0;\r
+quad vidoffset=0;\r
+\r
+void LoadPCXHeader()\r
+{\r
+ manufacturer = fgetc(pcxfp); // always 10\r
+ version = fgetc(pcxfp); // should be 5?\r
+ encoding = fgetc(pcxfp); // always 1\r
+ bpp = fgetc(pcxfp); // bits per pixel\r
+\r
+ xmin = fgetw(pcxfp); // grab window\r
+ ymin = fgetw(pcxfp);\r
+ xmax = fgetw(pcxfp);\r
+ ymax = fgetw(pcxfp);\r
+ image_width = xmax-xmin+1; // calc dims\r
+ image_depth = ymax-ymin+1;\r
+\r
+ hres = fgetw(pcxfp);\r
+ vres = fgetw(pcxfp);\r
+\r
+ fread(palette,1,48,pcxfp); // ega color map\r
+\r
+ reserved = fgetc(pcxfp);\r
+ color_planes = fgetc(pcxfp); // should be 1\r
+\r
+ bpl = fgetw(pcxfp); // bytes per line\r
+ palette_type = fgetw(pcxfp);\r
+\r
+ fread(filler,1,58,pcxfp); // nothing important here\r
+}\r
+\r
+void ReadPCXLine(byte *dest)\r
+{\r
+ int i=0,c=0,n=0,run=0;\r
+\r
+ // decode a row\r
+ for (n=0; n<image_width; n+=run)\r
+ {\r
+ // assume single pixel\r
+ run=1;\r
+ c=fgetc(pcxfp);\r
+ // is this a run?\r
+ if ((c&192)==192)\r
+ {\r
+ // calc run and grab color\r
+ run=c&63;\r
+ c=fgetc(pcxfp);\r
+ }\r
+ // now replicate run bytes\r
+ for (i=0; i<run; i++)\r
+ dest[vidoffset+n+i]=(byte)c;\r
+ }\r
+ // skip row padding, if any\r
+ fskip(bpl-image_width,pcxfp);\r
+}\r
+\r
+void LoadPCX(char *filename)\r
+{\r
+ int i=0;\r
+\r
+ // open file\r
+ if (pcxfp) fclose(pcxfp);\r
+ pcxfp=fopen(filename,"rb");\r
+ if (!pcxfp)\r
+ { printf("unable to open %s", filename);\r
+ exit(0);\r
+ }\r
+\r
+ // get info\r
+ LoadPCXHeader();\r
+\r
+ // allocate image data\r
+ if (virscr) { free(virscr); virscr=0; }\r
+ virscr=(byte *)malloc(image_width*image_depth);\r
+\r
+ // decompress image data\r
+ for (i=0; i<image_depth; i++)\r
+ { vidoffset=i*image_width;\r
+ ReadPCXLine(virscr);\r
+ }\r
+\r
+ // pal exists?\r
+ if (fgetc(pcxfp) == 12)\r
+ fread(pal,1,768,pcxfp);\r
+\r
+ // done\r
+ fclose(pcxfp);\r
+}\r
+\r
+static int bufsize=0;\r
+static byte *csrc=0, *cb=0;\r
+\r
+static void emitc(byte b) { *csrc++=b, bufsize++; }\r
+\r
+static void Compress(byte *p, int len)\r
+{\r
+ int i=0;\r
+ byte byt=0,samect=0;\r
+\r
+ csrc=cb;\r
+ i=0; bufsize=0;\r
+ do\r
+ {\r
+ byt=p[i++];\r
+ samect=1;\r
+ while (samect<254 && i<len && byt==p[i])\r
+ { samect++; i++; }\r
+\r
+ if (samect==2 && byt != 0xFF) { emitc(byt); }\r
+ if (samect==3 && byt != 0xFF) { emitc(byt); emitc(byt); }\r
+ if (samect>3 || byt == 0xFF)\r
+ {\r
+ emitc(0xFF);\r
+ emitc(samect);\r
+ }\r
+ emitc(byt);\r
+\r
+ } while (i<len);\r
+}\r
+\r
+static byte *raw=0,*r=0;\r
+\r
+static void dumpframe(int x, int y)\r
+{\r
+ byte *src=&virscr[(y*image_width)+x];\r
+\r
+ for (y=0; y<frame_h; y++)\r
+ {\r
+ for (x=0; x<frame_w; x++)\r
+ *r++=src[x];\r
+ src+=image_width;\r
+ }\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+static void WriteFrames(char *filename, FILE *dump)\r
+{\r
+ int i=0,j=0;\r
+ int raw_bytes=0;\r
+\r
+ printf(" ú reading image %s \r", pcx_name);\r
+ fflush(stdout);\r
+\r
+ LoadPCX(filename);\r
+\r
+ printf(" û \n");\r
+ fflush(stdout);\r
+\r
+ printf(" ú collecting frames \r");\r
+ fflush(stdout);\r
+\r
+ // setup bufs for raw data/compression\r
+ raw_bytes = total_frames * (frame_w*frame_h);\r
+ cb = (byte *)malloc(raw_bytes);\r
+ raw = (byte *)malloc(raw_bytes); r=raw;\r
+\r
+ // dump all frames in row major byte order into 'raw'\r
+ for (i=0; i<10; i++)\r
+ for (j=0; j<per_row; j++)\r
+ {\r
+ if ((i*per_row)+j<total_frames)\r
+ dumpframe(1+(j*(frame_w+1)), 1+(i*(frame_h+1)));\r
+ }\r
+\r
+ printf(" û \n");\r
+ fflush(stdout);\r
+\r
+ printf(" ú compressing \r");\r
+ fflush(stdout);\r
+\r
+ // smush the sucker\r
+ Compress(raw, raw_bytes);\r
+\r
+ fputd(bufsize,dump); // compressed data bytes\r
+ fputraw((char *)cb,bufsize,dump); // compressed data\r
+\r
+ printf(" û \n");\r
+ fflush(stdout);\r
+\r
+ // cleanup bufs\r
+ free(raw);\r
+ free(cb);\r
+}\r
+\r
+static void WriteInfo(FILE *dump)\r
+{\r
+ fputc(2, dump); // version\r
+ fputw((word)frame_w, dump); // frame dims\r
+ fputw((word)frame_h, dump);\r
+ fputw((word)hot_x, dump); // hotspot coords\r
+ fputw((word)hot_y, dump);\r
+ fputw((word)hot_w, dump); // hotspot dims\r
+ fputw((word)hot_h, dump);\r
+ fputw((word)total_frames, dump); // total frames\r
+}\r
+\r
+static void WriteScripts(FILE *fp)\r
+{\r
+ fputd(lidle,fp);\r
+ fputd(ridle,fp);\r
+ fputd(uidle,fp);\r
+ fputd(didle,fp);\r
+\r
+ fputstrn(lscript,fp);\r
+ fputstrn(rscript,fp);\r
+ fputstrn(uscript,fp);\r
+ fputstrn(dscript,fp);\r
+}\r
+\r
+static void write_chr()\r
+{\r
+ strcat(pcx_name, ".pcx");\r
+ strcat(chr_name, ".chr");\r
+\r
+ /*\r
+ // DEBUG\r
+ printf(" \n");\r
+ printf("pcx_name: %s \n", pcx_name);\r
+ printf("chr_name: %s \n", chr_name);\r
+ printf("frame_w: %i \n", frame_w);\r
+ printf("frame_h: %i \n", frame_h);\r
+ printf("hot_x: %i \n", hot_x);\r
+ printf("hot_y: %i \n", hot_y);\r
+ printf("hot_w: %i \n", hot_w);\r
+ printf("hot_h: %i \n", hot_h);\r
+ printf("per_row: %i \n", per_row);\r
+ printf("total_frames: %i \n", total_frames);\r
+ printf("lidle: %i \n", lidle);\r
+ printf("ridle: %i \n", ridle);\r
+ printf("uidle: %i \n", uidle);\r
+ printf("didle: %i \n", didle);\r
+ printf("lscript: %s \n", lscript);\r
+ printf("rscript: %s \n", rscript);\r
+ printf("uscript: %s \n", uscript);\r
+ printf("dscript: %s \n", dscript);\r
+ fflush(stdout);\r
+ getch();\r
+ */\r
+\r
+ printf("> dumping %s \n", chr_name);\r
+ fflush(stdout);\r
+\r
+ chrfp=fopen(chr_name, "wb");\r
+ if (!chrfp) fatal("unable to open %s", chr_name);\r
+\r
+ WriteInfo(chrfp);\r
+ WriteFrames(pcx_name,chrfp);\r
+ WriteScripts(chrfp);\r
+\r
+ fclose(chrfp);\r
+\r
+ printf("complete! \n");\r
+ fflush(stdout);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ banner();\r
+\r
+ parse_args(argc, argv);\r
+ parse_makefile();\r
+\r
+ write_chr();\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+chrmak.exe\r
+the utility with bloated code perpetrated by aen (aen@verge-rpg.com for hate mail)\r
+documentation\r
+by zeromus 5.8.99\r
+zermous@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 chr from pcx file\r
+---\r
+You'll use this bad boy a lot, unless you have one of those newfangled graphical chr editors. What we do here is have a character ready in the standard pcx-graphics format (that is, with a one-pixel buffer between frames), and give it to chrmak, along with a text file describing what characteristics the output v2 chr should have.\r
+\r
+to run chrmak, simply execute chrmak with the makefile, with extension (ex: vecna.mak) as the first and only argument. (ex: "chrmak vecna.mak")\r
+\r
+The characteristics file is technically called a make file, or .mak. it containst several variables, and what they should be. for example:\r
+\r
+/* comment */\r
+pcx_name=rath; //comment\r
+chr_name=rath;\r
+\r
+these variables can be scattered around anywhere in the mak file, so long as they have a semicolon after each command. you can stick comments anywhere like a c or vc file. here is a list of all the variables you need to set in the make file, what they are, and their typical values. In most cases, however, you should be able to just replace the values found in the samples rath.mak and vecna.mak with your own.\r
+\r
+---\r
+\r
+**pcx_name** the file name of the source pcx file, sans extension. note in the above examples or in the sampel .mak files it is not pcx_name = rath.pcx, only rath.\r
+**chr_name** the filename, sans extension, of the chr file to output. same as above in all other respects.\r
+\r
+**frame_w** the width of each frame of the chr (DEFAULT 16)\r
+**frame_h** the height of each frame (DEFAULT 32)\r
+\r
+**hot_x** the x-coord of the chr's hotspot. See appendix A for info on chr hotspots. (DEFAULT 0)\r
+**hot_y** the same, but y-coord (DEFAULT 16)\r
+**hot_w** the width of the obstructing region of the hotspot. (DEFAULT 16)\r
+**hot_h** the height of the obstructing region of the hotspot. (DEFAULT 16)\r
+\r
+**per_row** the number of frames per row in the pcx file. in old v1 chr/pcx files, this was 5. (DEFAULT 5)\r
+**total frames** total number of frames in the pcx file. (DEFAULT 20)\r
+\r
+**lidle** the frame to show when the chr is idling, facing the left (DEFAULT 10)\r
+**ridle** the frame to show when the chr is idling, facing the right (DEFAULT 15)\r
+**uidle** the frame to show when the chr is idling, facing up (DEFAULT 5)\r
+**didle** the frame to show when the chr is idling, facing down (DEFAULT 0)\r
+\r
+**lscript** the animation script for when the chr moves to the left. See appendix B for discussion of animation scripts. (DEFAULT F10W10F11W10F12W10F11W10F10W10F13W10F14W10F13W10)\r
+**rscript** the animation script for when the chr moves to the right. (DEFAULT F15W10F16W10F17W10F16W10F15W10F18W10F19W10F18W10)\r
+**uscript** the animation script for when the chr moves up (DEFAULT F5W10F6W10F7W10F6W10F5W10F8W10F9W10F8W10)\r
+**dscript** the animation script for when the chr moves down (DEFAULT F0W10F1W10F2W10F2W10F0W10F3W10F4W10F3W10)\r
+\r
+---\r
+\r
+APPENDIX A: Hotspots\r
+\r
+If a chr is located at coordinates (x,y) on the screen, then the pixel under the hotspot on the chr will be drawn at (x,y). \r
+\r
+You may think--"I tell a chr to go to (5,4) on the screen... but where exactly does it go? (4,4) from the middle, the left edge, or what?"\r
+Imagine three scenarios: a 4x4 sprite with the hotspot at top left, bottom left, and middle left, respectively:\r
+\r
+ Top Left Bottom Left Middle Left\r
+0123456789ABCDEF 0123456789ABCDEF 0123456789ABCEDEF\r
+1 1 **** 1\r
+2 +---hotspot 2 **** 2 ****\r
+3 \|/ 3 **** 3 \****\r
+4 @*** 4 @*** 4 +--@***\r
+5 **** 5 /|\ 5 | /****\r
+6 **** 6 +---hotspot 6 |\r
+7 **** 7 7 +---hotspot\r
+8 8 8\r
+\r
+So you can see how the hotspot determines how the sprite is oriented, relative to its current screen position.\r
+\r
+The default hotspot, (and its equivalent in v1) is at (0,16). That is, 0 to the right and 16 down from the upper-left corner of the sprite. Remember, default chr size is 16x32, and on computer, the (+,+) quadrant is quadrant IV. In other words\r
+\r
+ -32\r
+ -24\r
+ -16\r
+ -8\r
+-16 -12 -8 -4 0 4 8 12 16\r
+ 8 * * * *\r
+ 16 * * * * <--- sprite goes there. \r
+ 24 @ * * * @ is where hotspot would be\r
+ 32 * * * *\r
+\r
+Hotspots also have an obstruction width and height. This is the area of the chr that touches the ground, and cannot walk over things. In your game, you may want your head to be drawn on top of a wall, if your feet are against the bottom of the wall, right? But you don't want your feet drawn on top of the wall.\r
+\r
++----------------------+\r
+| |\r
+| |\r
+| |\r
+| |\r
+| +---+ |\r
+| |***| |\r
++------|@@@|-----------+\r
+ +---+\r
+\r
+The messy area is the chr; the @@@, and the --- beneath it, would be OBSTRUCTIVE. If the player tried to walk up, he couldnt--you would be walking into the wall. The *** and the --- above it would not be obstructive.\r
+\r
+Obstructive areas are defined by declaring their width and height, based from the chr's hotspot. the default values, a width and height of 16, would count over 16 and down 16 from the hotspot, effectively making the bottom 16x16 square of the 16x32 chr obstructive.\r
+\r
+Final example:\r
+A 32x64 giant might be defined like this:\r
+\r
+...\r
+hot_x=8;\r
+hot_y=48;\r
+hot_w=16;\r
+hot_h=16;\r
+...\r
+\r
+---\r
+\r
+APPENDIX B: Animation scripts\r
+\r
+Animation scripts are made of a string of no more than 255 characters. This string can contain any combination of COMMAND CODES, of which there are two.\r
+\r
+The two COMMAND CODES are F and W.\r
+\r
+**F** sets the current frame that should be shown. So, if you want your animation, when walking to go from frame 12 to 15, you would make the script: "F12F13F14F15F14F13F12". The F can have any number of digits after it, so you don't have to do F03F05, etc.. you can just do F3F5.\r
+\r
+**W** makes the animation string wait the specified number of milliseconds. If you peek at the default animation strings mentioned a ways up, you'll see that there is a Wxx between each frame. This pauses the frame so you can see it, effectively slowing the animation down. In fact, the animation we just maed an example of, "F12F13F14F15F14F13F12", would g oby *waaay* too fast. Now that we know the W command we can fix it: "F12W10F13W10F14W10F15W10F14W10F13W10F12W10".
\ No newline at end of file
--- /dev/null
+@echo off\r
+gxx -s -Wall -Werror -m486 -O3 chrmak.cc -o chrmak.exe\r
--- /dev/null
+@echo off\r
+wcl386 /bt=dos /l=pmodew /mf /os /5r /fp5 /wx /we chrmak.cc\r
--- /dev/null
+\r
+/* CHRMAK makefile\r
+ û aen */\r
+\r
+pcx_name=vecna; // image source\r
+chr_name=vecna; // output .CHR name\r
+\r
+frame_w=16; frame_h=32; // frame dims\r
+\r
+hot_x=0; hot_y=16; // hotspot coord\r
+hot_w=16; hot_h=16; // hotspot dims\r
+\r
+per_row=5; total_frames=20; // frames per row, total\r
+\r
+lidle=10; ridle=15;; // left/right idle frames\r
+uidle=5; didle=0; // up/down idle frames\r
+ \r
+lscript=F10W10F11W10F12W10F11W10F10W10F13W10F14W10F13W10; // movement scripts\r
+rscript=F15W10F16W10F17W10F16W10F15W10F18W10F19W10F18W10;\r
+uscript=F5W10F6W10F7W10F6W10F5W10F8W10F9W10F8W10;\r
+dscript=F0W10F1W10F2W10F2W10F0W10F3W10F4W10F3W10;\r
--- /dev/null
+\r
+ current version\r
+\r
+ chrmak.exe <aen, may 11; 12:01a> 0.1b\r
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 pack.c -o pack.exe\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#define byte unsigned char\r
+\r
+// ================================= Data ====================================\r
+\r
+FILE *pack;\r
+FILE *list;\r
+FILE *src;\r
+char *strbuf,*filebuf;\r
+int numfiles,curofs;\r
+char headertag[]="VRGPACK";\r
+\r
+typedef struct\r
+{\r
+ unsigned char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int count; // internal (engine-runtime) use\r
+ char extractable; // can UNPACK .. unpack it?\r
+ char override; // should the engine override it w/\r
+ // local files?\r
+} filestruct;\r
+\r
+filestruct filetbl[512];\r
+byte *ptr;\r
+\r
+// ================================= Code ====================================\r
+\r
+void CreatePackHeader()\r
+{ char a;\r
+\r
+ fwrite(&headertag, 1, 7, pack);\r
+ a=1; fwrite(&a, 1, 1, pack); // pack version 1\r
+ fwrite(&numfiles, 1, 4, pack); // number of files in archive\r
+\r
+ // Hmm.. that's it. What a boring header. :)\r
+}\r
+\r
+void EncryptHeader()\r
+{ byte lastvalue; //, precodebyte;\r
+\r
+ ptr=(byte *) filetbl;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) filetbl + (int) 5120)\r
+ {\r
+ (*ptr)+=lastvalue;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void DecryptHeader()\r
+{ byte lastvalue, precodebyte;\r
+\r
+ ptr=(byte *) filetbl;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) filetbl + (int) 5120)\r
+ {\r
+ precodebyte=*ptr;\r
+ (*ptr)-=lastvalue;\r
+ lastvalue=precodebyte;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void BuildFileTable()\r
+{ int i;\r
+\r
+ curofs=12+(numfiles*100);\r
+ memset(filetbl, 0, sizeof filetbl);\r
+\r
+ for (i=0; i<numfiles; i++)\r
+ {\r
+ fscanf(list,"%s",strbuf);\r
+ if (!(src=fopen(strbuf,"rb")))\r
+ {\r
+ printf("Could not open included file %s. \n",strbuf);\r
+ exit(-1);\r
+ }\r
+ memcpy(&filetbl[i].fname,strbuf,strlen(strbuf));\r
+ fseek(src,0,2);\r
+ filetbl[i].packofs=curofs;\r
+ filetbl[i].size=ftell(src);\r
+ curofs+=filetbl[i].size;\r
+ fscanf(list,"%s",strbuf); filetbl[i].extractable=atoi(strbuf);\r
+ fscanf(list,"%s",strbuf); filetbl[i].override=atoi(strbuf);\r
+ fclose(src);\r
+ }\r
+ EncryptHeader();\r
+ fwrite(&filetbl, numfiles, 100, pack);\r
+ DecryptHeader();\r
+}\r
+\r
+void DumpFiles()\r
+{ int i;\r
+\r
+ for (i=0; i<numfiles; i++)\r
+ {\r
+ filebuf=(char *) malloc(filetbl[i].size);\r
+ src=fopen(filetbl[i].fname, "rb");\r
+ printf("Packing file %s...\n", filetbl[i].fname);\r
+ fread(filebuf, 1, filetbl[i].size, src);\r
+ fwrite(filebuf, 1, filetbl[i].size, pack);\r
+ fclose(src);\r
+ free(filebuf);\r
+ }\r
+ printf("Done.\n");\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ printf("PACK v.0.1 Copyright (C)1997 BJ Eirich \n");\r
+ if (argc<2)\r
+ {\r
+ printf("USAGE: PACK <makefile> \n");\r
+ exit(-1);\r
+ }\r
+\r
+ if (!(list=fopen(argv[1],"r")))\r
+ {\r
+ printf("Unable to open file %s. \n",argv[1]);\r
+ exit(-1);\r
+ }\r
+\r
+ strbuf=(char *) malloc(100);\r
+ fscanf(list,"%s",strbuf);\r
+\r
+ if (!(pack=fopen(strbuf,"wb")))\r
+ {\r
+ printf("Unable to create file %s. \n",strbuf);\r
+ exit(0);\r
+ }\r
+ fscanf(list,"%d",&numfiles);\r
+\r
+ CreatePackHeader();\r
+ BuildFileTable();\r
+ DumpFiles();\r
+\r
+ fclose(list);\r
+ fclose(pack);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+pack.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 pakfile\r
+---\r
+v2 enjoys its own built-in pakfile system. v2 can use files in any number of pakfiles at the same time it can read files from your computer's regular directory structure. This allows for simplified distribution and management of v2 games, as well as adding a small measure of security to the data you worked so hard to create for your game--it will be a pain for losers to remove (read: rip) data from pakfiles, although we make no gurantees that your data is safe. This should help the situation some.\r
+\r
+To create a packfile, pack.exe takes a makefile of the following format:\r
+\r
+--- <--cut below this line :)\r
+pakfile_to_create.vrg\r
+number_of_files\r
+file_name_1 flag_extrractable flag_overrideable\r
+file_name_2 flag_extrractable flag_overrideable\r
+file_name_3 flag_extrractable flag_overrideable\r
+---\r
+\r
+Here it is with sample data.\r
+\r
+---\r
+test.vrg\r
+3\r
+pack.c 0 0\r
+test.mak 1 0\r
+test.obj 0 1\r
+---\r
+\r
+This would create test.vrg with three files: pack.c, neither overrideable nor extractable, test.mak, extractable, but not overrideable, and test.obj, only overrideable.\r
+\r
+Extractable means that the file will be extracted by unpack.exe. Files you want to keep secret should have a 0 for this. \r
+\r
+Overrideable files will be overridden by a file of the same name in the game directory. That means, if there is a file in the game directory, it will use that one instead of the one in the pakfile. Otherwise, the copy in the pakfile will always be used. You'll usually want this set to 1, as it facilitates patches, etc. For example, if battle.map had a bug in it, you could just distribute a copy of the corrected battle.map for users to chunk in the game directory, and v2 would use the corrected copy instead.\r
+\r
--- /dev/null
+test.vrg\r
+3\r
+pack.c 1 1\r
+pack.exe 1 1\r
+todo 1 1\r
--- /dev/null
+entity/entity, point makes contact w/entity, entity/bbox,b\r
+box/bbox,and a line intersect/entity and line intersect/bbox.\r
+sin,cos and tan() functions.\r
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 pcx2fnt.c -o pcx2fnt.exe\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <malloc.h>\r
+\r
+char fname1[100], fname2[100];\r
+int xs, ys, ns;\r
+FILE *fnt,*pcxf;\r
+char *virscr;\r
+\r
+char manufacturer; // pcx header\r
+char version;\r
+char encoding;\r
+char bits_per_pixel;\r
+short int xmin,ymin;\r
+short int xmax,ymax;\r
+short int hres;\r
+short int vres;\r
+char palette[48];\r
+char reserved;\r
+char color_planes;\r
+short int bytes_per_line;\r
+short int palette_type;\r
+char filler[58];\r
+unsigned char pal[768];\r
+\r
+unsigned short int width,depth;\r
+unsigned short int bytes;\r
+unsigned char c, run, ss=0;\r
+unsigned int vidoffset, n=0;\r
+\r
+void ReadPCXLine(unsigned char *dest)\r
+{\r
+ int j;\r
+ n=0;\r
+\r
+ do {\r
+ c=fgetc(pcxf) & 0xff;\r
+ if ((c & 0xc0)==0xc0) {\r
+ run=c & 0x3f;\r
+ c=fgetc(pcxf);\r
+ for (j=0; j<run; j++)\r
+ dest[vidoffset+n+j]=c;\r
+ n+=run; }\r
+ else { dest[vidoffset+n]=c;\r
+ n++; }\r
+ } while (n<bytes);\r
+}\r
+\r
+void LoadPCXHeader()\r
+{\r
+ fread(&manufacturer,1,1,pcxf);\r
+ fread(&version,1,1,pcxf);\r
+ fread(&encoding,1,1,pcxf);\r
+ fread(&bits_per_pixel,1,1,pcxf);\r
+ fread(&xmin,1,2,pcxf);\r
+ fread(&ymin,1,2,pcxf);\r
+ fread(&xmax,1,2,pcxf);\r
+ fread(&ymax,1,2,pcxf);\r
+ fread(&hres,1,2,pcxf);\r
+ fread(&vres,1,2,pcxf);\r
+ fread(&palette,1,48,pcxf);\r
+ fread(&reserved,1,1,pcxf);\r
+ fread(&color_planes,1,1,pcxf);\r
+ fread(&bytes_per_line,1,2,pcxf);\r
+ fread(&palette_type,1,2,pcxf);\r
+ fread(&filler,1,58,pcxf);\r
+ fseek(pcxf,-768L,SEEK_END);\r
+ fread(&pal,1,768,pcxf);\r
+ fseek(pcxf,128L,SEEK_SET);\r
+ width=xmax-xmin+1;\r
+ depth=ymax-ymin+1;\r
+ bytes=bytes_per_line;\r
+}\r
+\r
+void dumpframe(int x, int y)\r
+{ int i,j;\r
+ unsigned char c;\r
+\r
+ for (i=y; i<y+ys; i++)\r
+ for (j=x; j<x+xs; j++)\r
+ {\r
+ c=virscr[(i*width)+j];\r
+ fwrite(&c, 1, 1, fnt);\r
+ }\r
+}\r
+\r
+int main()\r
+{\r
+ int i,j,z;\r
+\r
+ printf("PCX2FNT v.3.00 Copyright (C)1998 BJ Eirich \n");\r
+ printf("PCX filename: "); fflush(stdout);\r
+ scanf("%s",fname1);\r
+ pcxf=fopen(fname1,"rb");\r
+ printf("FNT filename: "); fflush(stdout);\r
+ scanf("%s",fname2);\r
+ fnt=fopen(fname2, "wb");\r
+ printf("Width of font: "); fflush(stdout);\r
+ scanf("%d", &xs);\r
+ printf("Height of font: "); fflush(stdout);\r
+ scanf("%d", &ys);\r
+ printf("Number of subsets: "); fflush(stdout);\r
+ scanf("%d", &ns);\r
+\r
+ version=1;\r
+ fwrite(&version, 1, 1, fnt);\r
+ fwrite(&xs, 1, 2, fnt);\r
+ fwrite(&ys, 1, 2, fnt);\r
+ fwrite(&ns, 1, 2, fnt);\r
+\r
+ LoadPCXHeader();\r
+ virscr=(char *) malloc(width*depth);\r
+ for (i=0; i<depth; i++)\r
+ {\r
+ vidoffset=i*width;\r
+ ReadPCXLine(virscr);\r
+ }\r
+\r
+ for (z=0; z<ns; z++)\r
+ for (i=0; i<5; i++)\r
+ for (j=0; j<20; j++)\r
+ if ((i*20)+j<96) dumpframe((j*(xs+1))+1,(i*(ys+1))+(1+(ys+1)*(z*5)));\r
+\r
+// for (i=0; i<5; i++)\r
+// for (j=0; j<20; j++)\r
+// if ((i*20)+j<96) dumpframe((j*(xs+1))+1,(i*(ys+1))+(1+(ys+1)*5));\r
+\r
+ fclose(pcxf);\r
+ fclose(fnt);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+pcx2fnt.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 font file from pcx\r
+---\r
+If you need to make a custom font for your game, you're in luck: pcx2fnt is very easy to use. Simply run it. It will ask you for an input pcx file, which must be in the correct format (described below), the .fnt file to output, the height and width of the characters, and the number of subset fonts.\r
+\r
+The pcx format is simple: each font must be surrounded by a 1 pixel wide pad, with 20 characters per row. The characters of the font must be in the correct order for v2 to print strings correctly. The best thing you can do to figure out this format is look at the two examples. Everything will be perfectly clear then.\r
+\r
+Subsets are what you'll see if you look in font02b.pcx. Each font file can have many subsets potentially. These are most often used for different colors of letters, although they *could* be completely different fonts. The characters would have to be the same size, in that case. This explains why the subset system was designed for, and we have only used it to, make different colors of text.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 trans.c -o trans.exe\r
--- /dev/null
+gradients 16\r
+starts 0 ends 15 endspan\r
+starts 16 ends 31 endspan\r
+starts 32 ends 47 endspan\r
+starts 48 ends 63 endspan\r
+starts 64 ends 79 endspan\r
+starts 80 ends 95 endspan\r
+starts 96 ends 111 endspan\r
+starts 112 ends 127 endspan\r
+starts 128 ends 143 endspan\r
+starts 144 ends 159 endspan\r
+starts 160 ends 167 endspan\r
+starts 168 ends 175 endspan\r
+starts 176 ends 191 endspan\r
+starts 192 ends 207 endspan\r
+starts 208 ends 223 endspan\r
+starts 224 ends 239 endspan\r
+starts 240 ends 254 endspan\r
+end\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <strings.h>\r
+#include <stdlib.h>\r
+\r
+// ================================= Data ====================================\r
+\r
+struct span\r
+{\r
+ int begin, end; // begin & end location of span\r
+ int len, inverse; // lenth of span and inverse on/off\r
+};\r
+\r
+struct span spans[32]; // maximum of 32 spans.\r
+char numspans; // number of active spans in PDF\r
+\r
+unsigned char *transparencytbl; // full transparency table (64k)\r
+char outname[100]; // output filename\r
+char paldefname[100]; // palette definition filename\r
+char *strbuf; // generic string buffer\r
+\r
+char spanidx[256]; // Color -> Span xlat table\r
+\r
+// ================================= Code ====================================\r
+\r
+void ParsePaletteDefinition(FILE *f)\r
+{ int i;\r
+\r
+ fscanf(f,"%s",strbuf);\r
+ if (stricmp("gradients",strbuf))\r
+ {\r
+ printf("Not a valid PDF file. \n");\r
+ exit(-1);\r
+ }\r
+ fscanf(f,"%s",strbuf);\r
+ numspans=atoi(strbuf);\r
+\r
+ for (i=0; i<numspans; i++)\r
+ {\r
+ spans[i].inverse=0;\r
+\r
+ while (1)\r
+ {\r
+ fscanf(f,"%s",strbuf);\r
+ if (!stricmp("starts",strbuf))\r
+ { fscanf(f,"%s", strbuf);\r
+ spans[i].begin=atoi(strbuf);\r
+ continue; }\r
+ if (!stricmp("ends",strbuf))\r
+ { fscanf(f,"%s", strbuf);\r
+ spans[i].end=atoi(strbuf);\r
+ continue; }\r
+ if (!stricmp("inverse",strbuf))\r
+ { spans[i].inverse=1;\r
+ continue; }\r
+ if (!stricmp("endspan",strbuf))\r
+ { spans[i].len=abs(spans[i].end-spans[i].begin);\r
+ break; }\r
+ }\r
+ }\r
+ fclose(f);\r
+}\r
+\r
+void GenerateSpanIndex()\r
+{ int i,j;\r
+\r
+ for (i=0; i<numspans; i++)\r
+ {\r
+ for (j=spans[i].begin; j<=spans[i].end; j++)\r
+ spanidx[j]=i;\r
+ }\r
+}\r
+\r
+unsigned char MixColors(int i, int j)\r
+{ unsigned char in_i, in_j, in_m, f;\r
+\r
+ in_i=i-spans[(int)spanidx[i]].begin; // Get a intensity number from 0 to len\r
+ in_i=in_i*63/spans[(int)spanidx[i]].len; // Translate intensity to 0..63 range\r
+ if (spans[(int)spanidx[i]].inverse)\r
+ in_i=63-in_i; // If inverse, flip it.\r
+\r
+ // Now, repeat for j.\r
+\r
+ in_j=j-spans[(int)spanidx[j]].begin; // Get a intensity number from 0 to len\r
+ in_j=in_j*63/spans[(int)spanidx[j]].len; // Translate intensity to 0..63 range\r
+ if (spans[(int)spanidx[j]].inverse)\r
+ in_j=63-in_j; // If inverse, flip it.\r
+\r
+ in_m=(in_i+in_j)/2; // Average intensities.\r
+\r
+ // now find final color.\r
+\r
+ if (spans[(int)spanidx[i]].inverse) // If dest span is inverse,\r
+ in_m=63-in_m; // flip intensity_mixed\r
+ in_m=in_m*spans[(int)spanidx[i]].len/63; // Convert intensity to 0 .. len range\r
+\r
+ f=spans[(int)spanidx[i]].begin+in_m; // done!\r
+\r
+ return f;\r
+}\r
+\r
+void WriteTable(FILE *f)\r
+{ int i, j;\r
+\r
+ transparencytbl=(char *) malloc(65536);\r
+ memset(transparencytbl, 0, 65535);\r
+\r
+ for (i=0; i<256; i++)\r
+ for (j=0; j<256; j++)\r
+ transparencytbl[(i*256)+j]=MixColors(i, j);\r
+\r
+ fwrite(transparencytbl, 256, 256, f);\r
+ fclose(f);\r
+}\r
+\r
+int main ()\r
+{ FILE *f;\r
+\r
+ strbuf=(char *) malloc(2000);\r
+ printf("TRANS v.1.00 Transparency-table generator \n");\r
+ printf("Copyright (C)1998 vecna \n\n");\r
+\r
+ printf("Output table filename: ");\r
+ fflush(stdout); gets(outname);\r
+ printf("Palette definition filename: ");\r
+ fflush(stdout); gets(paldefname);\r
+\r
+ if (!(f=fopen(paldefname,"r")))\r
+ {\r
+ printf("Could not open palette definition file.\n");\r
+ exit(-1);\r
+ }\r
+\r
+ ParsePaletteDefinition(f);\r
+ GenerateSpanIndex();\r
+\r
+ f=fopen(outname,"wb");\r
+ WriteTable(f);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+trans.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates translucency table for use in v2\r
+---\r
+If you want to use translucency effects in v2, you'll need to have the appropriate trans.tbl file. This program will make it.\r
+\r
+Game palettes, unless you're elite like snes programmers, should be made up of a number of gradients. Trans.exe takes advantage of this by accepting a makefile (for amusement called Palette Definition File, conveniently extensioned .pdf. Our extension makes more sense than Adobe's, though.) consisting of a list of gradients found in the palette. This unique method of generating a translucency table does not need the actual palette--it only needs to know which indexes in the palette start and finish each gradient.\r
+\r
+The .pdf format looks like this (the x spots are where you'll fill in numbers):\r
+\r
+GRADIENTS x_num_times\r
+STARTS x ENDS x ENDSPAN\r
+STARTS x ENDS x ENDSPAN <--x_num_time entries\r
+STARTS x ENDS x ENDSPAN\r
+... etc\r
+\r
+With sample data:\r
+\r
+gradients 3\r
+starts 0 ends 128 endspan\r
+starts 129 ends 240 inverse endspan\r
+starts 141 ends 254 endspan\r
+\r
+Whats that inverse, stuck in there, you say? That just indicates that instead of gradient going from dark to light it goes from light to dark (that *is* what inverse means).\r
+\r
+Inspect the sample files for more info.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+gradients 16\r
+starts 0 ends 15 endspan\r
+starts 16 ends 32 endspan\r
+starts 33 ends 47 endspan\r
+starts 48 ends 63 endspan\r
+starts 64 ends 79 endspan\r
+starts 80 ends 95 endspan\r
+starts 96 ends 111 endspan\r
+starts 112 ends 127 endspan\r
+starts 128 ends 143 endspan\r
+starts 144 ends 159 endspan\r
+starts 160 ends 175 endspan\r
+starts 176 ends 191 endspan\r
+starts 192 ends 207 endspan\r
+starts 208 ends 223 endspan\r
+starts 224 ends 239 endspan\r
+starts 240 ends 255 endspan\r
--- /dev/null
+gradients 16\r
+starts 0 ends 31 endspan\r
+starts 32 ends 47 inverse endspan\r
+starts 48 ends 55 inverse endspan\r
+starts 56 ends 63 endspan\r
+starts 64 ends 79 inverse endspan\r
+starts 80 ends 87 inverse endspan\r
+starts 88 ends 111 inverse endspan\r
+starts 112 ends 127 inverse endspan\r
+starts 128 ends 135 inverse endspan\r
+starts 136 ends 159 inverse endspan\r
+starts 160 ends 182 endspan\r
+starts 183 ends 191 endspan\r
+starts 191 ends 223 inverse endspan\r
+starts 224 ends 239 endspan\r
+starts 240 ends 247 inverse endspan\r
+starts 248 ends 254 inverse endspan\r
--- /dev/null
+@echo off\r
+gcc -s -Wall -Werror -m486 -O3 unpack.c -o unpack.exe\r
--- /dev/null
+test.vrg\r
+3\r
+pack.c 1 1\r
+pack.exe 1 1\r
+todo 1 1\r
--- /dev/null
+entity/entity, point makes contact w/entity, entity/bbox,b\r
+box/bbox,and a line intersect/entity and line intersect/bbox.\r
+sin,cos and tan() functions.\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <malloc.h>\r
+\r
+#define byte unsigned char\r
+// ================================= Data ====================================\r
+\r
+FILE *pack;\r
+FILE *src;\r
+char strbuf[2048],*filebuf;\r
+int numfiles;\r
+char headertag[]={ 'V','R','G','P','A','C','K',0 };\r
+\r
+struct filestruct\r
+{\r
+ unsigned char fname[84]; // pathname thingo\r
+ int size; // size of the file\r
+ int packofs; // where the file can be found in PACK\r
+ int count; // internal (engine-runtime) use\r
+ char extractable; // can UNPACK .. unpack it?\r
+ char override; // should the engine override it w/\r
+ // local files?\r
+};\r
+\r
+struct filestruct filetbl[512];\r
+\r
+// ================================= Code ====================================\r
+\r
+void DecryptHeader()\r
+{ byte lastvalue, precodebyte, *ptr;\r
+\r
+ ptr=(byte *) filetbl;\r
+ lastvalue=*ptr;\r
+ ptr++;\r
+\r
+ while (ptr < (byte *) (int) filetbl + (int) 5120)\r
+ {\r
+ precodebyte=*ptr;\r
+ (*ptr)-=lastvalue;\r
+ lastvalue=precodebyte;\r
+ ptr++;\r
+ }\r
+}\r
+\r
+void CheckPackHeader()\r
+{ char a;\r
+\r
+ fread(strbuf, 1, 7, pack);\r
+ strbuf[8]=0;\r
+ if (strcmp(strbuf,headertag))\r
+ {\r
+ printf("*error* Not a valid VRG packfile. \n");\r
+ exit(-1);\r
+ }\r
+ fread(&a, 1, 1, pack);\r
+ if (a!=1)\r
+ {\r
+ printf("*error* Incorrect VRG packfile version. \n");\r
+ exit(-1);\r
+ }\r
+ fread(&numfiles, 1, 4, pack);\r
+ fread(&filetbl, 100, numfiles, pack);\r
+ DecryptHeader();\r
+}\r
+\r
+void DumpFiles()\r
+{ int i;\r
+\r
+ printf("UNPACK v.0.1 Copyright (C)1997 BJ Eirich\n");\r
+ for (i=0; i<numfiles; i++)\r
+ {\r
+ filebuf=(char *) malloc(filetbl[i].size);\r
+ fread(filebuf, 1, filetbl[i].size, pack);\r
+ if (filetbl[i].extractable)\r
+ {\r
+ src=fopen(filetbl[i].fname, "wb");\r
+ printf("File: %s \n",filetbl[i].fname);\r
+ fwrite(filebuf, 1, filetbl[i].size, src);\r
+ fclose(src);\r
+ }\r
+ else printf("File: %s unexctractable.\n",filetbl[i].fname);\r
+ free(filebuf);\r
+ }\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ if (argc<2)\r
+ {\r
+ printf("UNPACK v.0.1 Copyright (C)1997 BJ Eirich \n");\r
+ printf("USAGE: UNPACK <VRG packfile> \n");\r
+ exit(-1);\r
+ }\r
+\r
+ if (!(pack=fopen(argv[1],"rb")))\r
+ {\r
+ printf("Unable to open file %s. \n",argv[1]);\r
+ exit(-1);\r
+ }\r
+\r
+ CheckPackHeader();\r
+ DumpFiles();\r
+\r
+ fclose(pack);\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+unpack.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: extracts files from v2 pakfile\r
+---\r
+It doesnt get any better than this. type unpack followed by the name of the packfile you want to unpack. if you can't get that right, unpack.exe will give you even more explicit instructions. unpack.exe will then dump all the files contained in the pakfile with their extractable flags set into the directory you ran unpack.exe from.\r
+\r
+Use this only if the author of a demo/game gives you permission to use his stuff, or else we'll hunt you down and break your legs.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+@echo off\r
+if exist *.obj del *.obj\r
+if exist *.o del *.o\r
+if exist *.err del *.err\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__CODE_INC)\r
+#define __CODE_INC\r
+\r
+// Single-byte opcode descriptors\r
+\r
+#define EXEC 1\r
+#define VAR0_ASSIGN 2\r
+#define VAR1_ASSIGN 3\r
+#define VAR2_ASSIGN 4\r
+#define GENERAL_IF 5\r
+#define ELSE 6\r
+#define GOTO 7\r
+#define FOR_LOOP0 8\r
+#define FOR_LOOP1 9\r
+#define SWITCH 10\r
+#define CASE 11\r
+#define ENDSCRIPT 255\r
+\r
+// Single-byte operand descriptors\r
+\r
+#define OP_IMMEDIATE 1\r
+#define OP_VAR0 2\r
+#define OP_VAR1 3\r
+#define OP_VAR2 4\r
+#define OP_GROUP 5\r
+\r
+// Single-byte IF handler parameters\r
+\r
+#define ZERO 0\r
+#define NONZERO 1\r
+#define EQUALTO 2\r
+#define NOTEQUAL 3\r
+#define GREATERTHAN 4\r
+#define GREATERTHANOREQUAL 5\r
+#define LESSTHAN 6\r
+#define LESSTHANOREQUAL 7\r
+\r
+// Single byte assignment descriptors\r
+\r
+#define SET 1\r
+#define INCREMENT 2\r
+#define DECREMENT 3\r
+#define INCSET 4\r
+#define DECSET 5\r
+\r
+// Operand combination descriptors\r
+#define ADD 1\r
+#define SUB 2\r
+#define MULT 3\r
+#define DIV 4\r
+#define MOD 5\r
+#define OP_END 255\r
+\r
+#endif // __CODE_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Code Generation module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "funclib.h"\r
+#include "vcc.h"\r
+#include "vccode.h"\r
+#include "lexical.h"\r
+#include "preproc.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+#define LETTER 1\r
+#define SPECIAL 3\r
+\r
+// -- Function arguements type defs\r
+\r
+#define VOID 1\r
+#define INT 1\r
+#define CHARPTR 2\r
+#define STRING 3\r
+\r
+unsigned char *source, *src;\r
+unsigned char *outbuf, *code;\r
+unsigned char inevent=0;\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[20];\r
+ int numargs, numlocals;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+funcdecl funcs[700];\r
+int numfuncs=0;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+vardecl vars[500];\r
+int curstartofs=0;\r
+int numvars=0;\r
+int varidx;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int vsofs;\r
+ int arraylen;\r
+} strdecl;\r
+\r
+strdecl str[300];\r
+int sstartofs=0;\r
+int numstr=0;\r
+\r
+int vctype; // 0 / 1 :: map / system\r
+\r
+// -- local function parameters --\r
+\r
+char larg[20][40];\r
+\r
+// -- MAP vc stuff --\r
+\r
+char *functbl[512];\r
+int mfuncs=0;\r
+\r
+// ================================= Code ====================================\r
+\r
+void HandleString();\r
+void HandleFunction();\r
+void HandleUserFunction();\r
+void HandleFunctionType();\r
+void EmitOperand();\r
+\r
+void EmitC (char c)\r
+{\r
+ if (locate && locate == (int)(code - outbuf))\r
+ vcerr("Located.");\r
+\r
+ *code++ = c;\r
+}\r
+\r
+void EmitW (short w)\r
+{\r
+ short *c=(short *)code;\r
+\r
+ if (locate && locate == (int)(code - outbuf))\r
+ vcerr("Located.");\r
+\r
+ *c=w; code+=2;\r
+}\r
+\r
+void EmitD (int d)\r
+{\r
+ long *c=(long *)code;\r
+\r
+ if (locate && locate == (int)(code - outbuf))\r
+ vcerr("Located.");\r
+\r
+ *c=d; code+=4;\r
+}\r
+\r
+void EmitString(char *str)\r
+ { while ((*code++ = *str++)) ; }\r
+\r
+void HandleStringOperand()\r
+{\r
+ if (NextIs("\""))\r
+ {\r
+ EmitC(s_IMMEDIATE);\r
+ GetString();\r
+ EmitString(token);\r
+ return;\r
+ }\r
+ GetToken();\r
+ if (token_type==IDENTIFIER && varcategory==op_STRING)\r
+ {\r
+ EmitC(s_GLOBAL);\r
+ EmitW(str[varidx].vsofs);\r
+ return;\r
+ }\r
+ if (token_type==IDENTIFIER && varcategory==op_SARRAY)\r
+ {\r
+ EmitC(s_ARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ return;\r
+ }\r
+ if (token_type==IDENTIFIER && varcategory==op_SLOCAL)\r
+ {\r
+ EmitC(s_LOCAL);\r
+ EmitC((char) varidx);\r
+ return;\r
+ }\r
+ if (TokenIs("str"))\r
+ {\r
+ EmitC(s_NUMSTR);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("left"))\r
+ {\r
+ EmitC(s_LEFT);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("right"))\r
+ {\r
+ EmitC(s_RIGHT);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("mid"))\r
+ {\r
+ EmitC(s_MID);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (TokenIs("chr"))\r
+ {\r
+ EmitC(s_CHR);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ else vcerr("Unknown string operand. ");\r
+}\r
+\r
+void HandleString()\r
+{\r
+ while (1)\r
+ {\r
+ HandleStringOperand();\r
+ if (NextIs("+"))\r
+ {\r
+ EmitC(s_ADD);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ EmitC(s_END);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void EmitOperand();\r
+void DoSomething();\r
+\r
+void HandleOperand()\r
+{\r
+ GetToken();\r
+ if (token_type==DIGIT)\r
+ {\r
+ EmitC(op_IMMEDIATE);\r
+ EmitD(token_nvalue);\r
+ return;\r
+ }\r
+ if (token_type==IDENTIFIER)\r
+ {\r
+ if (varcategory==op_UVAR)\r
+ {\r
+ EmitC(op_UVAR);\r
+ EmitD(vars[varidx].varstartofs);\r
+ return;\r
+ }\r
+ if (varcategory==op_UVARRAY)\r
+ {\r
+ EmitC(op_UVARRAY);\r
+ EmitD(vars[varidx].varstartofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ return;\r
+ }\r
+ if (varcategory==op_LVAR)\r
+ {\r
+ EmitC(op_LVAR);\r
+ EmitC((char) varidx);\r
+ return;\r
+ }\r
+ if (varcategory==op_HVAR0)\r
+ {\r
+ EmitC(op_HVAR0);\r
+ EmitC((char) varidx);\r
+ return;\r
+ }\r
+ if (varcategory==op_HVAR1)\r
+ {\r
+ EmitC(op_HVAR1);\r
+ EmitC((char) varidx);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ return;\r
+ }\r
+ }\r
+ if (token_type==FUNCTION && token_subtype==op_BFUNC)\r
+ {\r
+ if (!returntypes[funcidx])\r
+ {\r
+ vcerr("%s() does not return a vlue.", token);\r
+ }\r
+ EmitC(op_BFUNC);\r
+ HandleFunction();\r
+ return;\r
+ }\r
+ if (token_type==FUNCTION && token_subtype==op_UFUNC)\r
+ {\r
+ if (!funcs[funcidx].returntype)\r
+ {\r
+ vcerr("%s() does not return a vlue.", token);\r
+ }\r
+ EmitC(op_UFUNC);\r
+ HandleUserFunction();\r
+ return;\r
+ }\r
+ vcerr("Unknown token.");\r
+}\r
+\r
+void EmitOperand()\r
+{\r
+ while (1) // Modifier-process loop.\r
+ {\r
+ if (NextIs("("))\r
+ {\r
+ EmitC(op_GROUP);\r
+ GetToken();\r
+ EmitOperand();\r
+ Expect(")");\r
+ }\r
+ else HandleOperand();\r
+\r
+ if (NextIs("+"))\r
+ {\r
+ EmitC(op_ADD);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("-"))\r
+ {\r
+ EmitC(op_SUB);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("/"))\r
+ {\r
+ EmitC(op_DIV);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("*"))\r
+ {\r
+ EmitC(op_MULT);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("%"))\r
+ {\r
+ EmitC(op_MOD);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs(">>"))\r
+ {\r
+ EmitC(op_SHR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("<<"))\r
+ {\r
+ EmitC(op_SHL);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("&"))\r
+ {\r
+ EmitC(op_AND);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("|"))\r
+ {\r
+ EmitC(op_OR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("^"))\r
+ {\r
+ EmitC(op_XOR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ EmitC(op_END);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void HandleFunction()\r
+{\r
+ switch (funcidx)\r
+ {\r
+ case 0: vcfunc_Exit(); break;\r
+ case 1: Message(); break;\r
+ case 2: GenericFunc(3,1); break;\r
+ case 3: GenericFunc(4,1); break;\r
+ case 4: GenericFunc(5,1); break;\r
+ case 5: vc_loadimage(); break;\r
+ case 6: GenericFunc(7,5); break;\r
+ case 7: GenericFunc(8,5); break;\r
+ case 8: GenericFunc(9,0); break;\r
+ case 9: GenericFunc(10,0); break;\r
+ case 10: vc_AllocateEntity(); break;\r
+ case 11: GenericFunc(12,1); break;\r
+ case 12: vc_Map(); break;\r
+ case 13: vc_LoadFont(); break;\r
+ case 14: vc_PlayFLI(); break;\r
+ case 15: GenericFunc(16,2); break;\r
+ case 16: vc_PrintString(); break;\r
+ case 17: vc_LoadRaw(); break;\r
+ case 18: GenericFunc(19,4); break;\r
+ case 19: GenericFunc(20,1); break;\r
+ case 20: GenericFunc(21,7); break;\r
+ case 21: GenericFunc(22,0); break;\r
+ case 22: GenericFunc(23,0); break;\r
+ case 23: GenericFunc(24,1); break;\r
+ case 24: vc_EntityMove(); break;\r
+ case 25: GenericFunc(26,4); break;\r
+ case 26: GenericFunc(27,4); break;\r
+ case 27: GenericFunc(28,5); break;\r
+ case 28: GenericFunc(29,4); break;\r
+ case 29: GenericFunc(30,4); break;\r
+ case 30: GenericFunc(31,5); break;\r
+ case 31: GenericFunc(32,5); break;\r
+ case 32: vc_strlen(); break;\r
+ case 33: vc_strcmp(); break;\r
+ case 34: GenericFunc(35,0); break;\r
+ case 35: GenericFunc(36,1); break;\r
+ case 36: GenericFunc(37,1); break;\r
+ case 37: GenericFunc(38,1); break;\r
+ case 38: GenericFunc(39,3); break;\r
+ case 39: GenericFunc(40,2); break;\r
+ case 40: GenericFunc(41,1); break;\r
+ case 41: GenericFunc(42,1); break;\r
+ case 42: GenericFunc(43,3); break;\r
+ case 43: vc_HookRetrace(); break;\r
+ case 44: vc_HookTimer(); break;\r
+ case 45: GenericFunc(46,2); break;\r
+ case 46: vc_SetRString(); break;\r
+ case 47: GenericFunc(48,4); break;\r
+ case 48: GenericFunc(49,3); break;\r
+ case 49: GenericFunc(50,0); break;\r
+ case 50: vc_PartyMove(); break;\r
+ case 51: GenericFunc(52,1); break;\r
+ case 52: GenericFunc(53,1); break;\r
+ case 53: GenericFunc(54,1); break;\r
+ case 54: GenericFunc(55,0); break;\r
+ case 55: GenericFunc(56,1); break;\r
+ case 56: GenericFunc(57,1); break;\r
+ case 57: GenericFunc(58,5); break;\r
+ case 58: GenericFunc(59,5); break;\r
+ case 59: GenericFunc(60,2); break;\r
+ case 60: vc_HookKey(); break;\r
+ case 61: vc_PlayMusic(); break;\r
+ case 62: GenericFunc(63,0); break;\r
+ case 63: GenericFunc(64,5); break;\r
+ case 64: vc_OpenFile(); break;\r
+ case 65: GenericFunc(66,1); break;\r
+ case 66: vc_QuickRead(); break;\r
+ case 67: GenericFunc(68,1); break;\r
+ case 68: GenericFunc(69,1); break;\r
+ case 69: GenericFunc(70,0); break;\r
+ case 70: GenericFunc(71,0); break;\r
+ case 71: GenericFunc(72,7); break;\r
+ case 72: GenericFunc(73,15); break;\r
+ case 73: vc_CacheSound(); break;\r
+ case 74: GenericFunc(75,0); break;\r
+ case 75: GenericFunc(76,3); break;\r
+ case 76: GenericFunc(77,7); break;\r
+ case 77: GenericFunc(78,4); break;\r
+ case 78: GenericFunc(79,4); break;\r
+ case 79: vc_val(); break;\r
+ case 80: GenericFunc(81,7); break;\r
+ case 81: GenericFunc(82,5); break;\r
+ case 82: vc_Log(); break;\r
+ case 83: GenericFunc(84,2); break;\r
+ case 84: GenericFunc(85,2); break;\r
+ case 85: GenericFunc(86,3); break;\r
+ case 86: GenericFunc(87,1); break;\r
+ case 87: GenericFunc(88,1); break;\r
+ case 88: GenericFunc(89,1); break;\r
+ case 89: vc_fgetline(); break;\r
+ case 90: vc_fgettoken(); break;\r
+ case 91: vc_fwritestring(); break;\r
+ case 92: GenericFunc(93, 3); break;\r
+ case 93: vc_frename(); break;\r
+ case 94: vc_fdelete(); break;\r
+ case 95: vc_fwopen(); break;\r
+ case 96: GenericFunc(97, 1); break;\r
+ case 97: GenericFunc(98, 3); break;\r
+ case 98: GenericFunc(99, 3); break;\r
+ case 99: GenericFunc(100, 6); break;\r
+ case 100: GenericFunc(101, 0); break;\r
+ case 101: GenericFunc(102, 7); break;\r
+ case 102: GenericFunc(103, 1); break;\r
+ case 103: GenericFunc(104, 1); break;\r
+ case 104: GenericFunc(105, 1); break;\r
+ case 105: vc_asc(); break;\r
+ case 106: GenericFunc(107, 1); break;\r
+ case 107: vc_NumForScript(); break;\r
+ case 108: vc_FileSize(); break;\r
+ case 109: GenericFunc(110, 1); break;\r
+ case 110: GenericFunc(111, 0); break;\r
+ default: vcerr("Internal error. Unknown standard function.");\r
+ }\r
+}\r
+\r
+void HandleUserFunction()\r
+{\r
+ int i, idx;\r
+\r
+ idx=funcidx;\r
+ EmitW((short) idx);\r
+ Expect("(");\r
+ for (i=0; i<funcs[idx].numargs; i++)\r
+ {\r
+ if (i) Expect(",");\r
+ if (funcs[idx].argtype[i]==INT) EmitOperand();\r
+ if (funcs[idx].argtype[i]==STRING) HandleString();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void HandleFunctionType()\r
+{\r
+ if (token_subtype==op_BFUNC)\r
+ {\r
+ EmitC(opEXEC_STDLIB);\r
+ HandleFunction();\r
+ }\r
+ else\r
+ if (token_subtype==op_UFUNC)\r
+ {\r
+ EmitC(opEXEC_EXTERNFUNC);\r
+ HandleUserFunction();\r
+ }\r
+}\r
+\r
+void HandleIfComponent()\r
+{ char ot=0;\r
+\r
+ if (NextIs("!"))\r
+ {\r
+ ot=i_ZERO;\r
+ GetToken();\r
+ }\r
+ EmitOperand();\r
+\r
+ if (NextIs("=")) { ot=i_EQUALTO; GetToken(); }\r
+ if (NextIs("!=")) { ot=i_NOTEQUAL; GetToken(); }\r
+ if (NextIs(">")) { ot=i_GREATERTHAN; GetToken(); }\r
+ if (NextIs(">=")) { ot=i_GREATERTHANOREQUAL; GetToken(); }\r
+ if (NextIs("<")) { ot=i_LESSTHAN; GetToken(); }\r
+ if (NextIs("<=")) { ot=i_LESSTHANOREQUAL; GetToken(); }\r
+\r
+ if (!ot) EmitC(i_NONZERO);\r
+ else if (ot==i_ZERO) EmitC(i_ZERO);\r
+ else\r
+ {\r
+ EmitC(ot);\r
+ EmitOperand();\r
+ }\r
+}\r
+\r
+void HandleIfGroup()\r
+{\r
+ while (1)\r
+ {\r
+ HandleIfComponent();\r
+\r
+ if (NextIs("&&"))\r
+ {\r
+ EmitC(i_AND);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else if (NextIs("||"))\r
+ {\r
+ EmitC(i_OR);\r
+ GetToken();\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ GetToken();\r
+ if (!TokenIs(")") && !TokenIs(";"))\r
+ vcerr("Syntax error.");\r
+ EmitC(i_UNGROUP);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void ProcessIf()\r
+{\r
+ char *falseofs = 0;\r
+ char *elseofs = 0;\r
+ char *b = 0;\r
+\r
+ EmitC(opIF);\r
+ Expect("(");\r
+ HandleIfGroup();\r
+\r
+ falseofs=code;\r
+ EmitD(0); // We'll come back to this and fix it up.\r
+\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ if (NextIs("else"))\r
+ {\r
+ EmitC(opGOTO);\r
+ elseofs=code;\r
+ EmitD(0);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ if (NextIs("else"))\r
+ {\r
+ EmitC(opGOTO);\r
+ elseofs=code;\r
+ EmitD(0);\r
+ }\r
+ }\r
+\r
+ b=code; // Put correct false-execution offset thingy.\r
+ code=falseofs;\r
+ EmitD((int) b - (int) outbuf);\r
+ code=b;\r
+\r
+ if (NextIs("else"))\r
+ {\r
+ GetToken();\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ }\r
+ b=code; // Put correct else-execution offset thingy.\r
+ code=elseofs;\r
+ EmitD((int) b - (int) outbuf);\r
+ code=b;\r
+ }\r
+}\r
+\r
+void ProcessWhile()\r
+{ char *falseofs, *top, *b;\r
+\r
+ top=code;\r
+ EmitC(opIF);\r
+ Expect("(");\r
+ HandleIfGroup();\r
+\r
+ falseofs=code;\r
+ EmitD(0); // We'll come back to this and fix it up.\r
+\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ EmitC(opGOTO);\r
+ EmitD((int) top - (int) outbuf);\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ EmitC(opGOTO);\r
+ EmitD((int) top - (int) outbuf);\r
+ }\r
+\r
+ b=code; // Put correct false-execution offset thingy.\r
+ code=falseofs;\r
+ EmitD((int) b - (int) outbuf);\r
+ code=b;\r
+}\r
+\r
+void ProcessFor()\r
+{ char *src1, *src2, *loopstartpos, *srctmp;\r
+\r
+ Expect("(");\r
+ while (!TokenIs(";"))\r
+ DoSomething(); // Emit initialization code.\r
+\r
+ src1=src; // Store position of loop conditional\r
+ while (!NextIs(";")) GetToken(); GetToken();\r
+ src2=src; // Store position of end-of-loop code\r
+\r
+ while (!NextIs(")")) GetToken(); GetToken();\r
+ loopstartpos=(char *) (int) code - (int) outbuf;\r
+\r
+ if (!NextIs("{"))\r
+ {\r
+ DoSomething();\r
+ }\r
+ else\r
+ {\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ }\r
+ srctmp=src;\r
+ src=src2;\r
+ while (!TokenIs(")"))\r
+ DoSomething();\r
+ src=src1;\r
+ EmitC(opIF);\r
+ HandleIfGroup();\r
+ EmitD((int) code - (int) outbuf +9);\r
+ EmitC(opGOTO);\r
+ EmitD((int) loopstartpos);\r
+\r
+ src=srctmp;\r
+}\r
+\r
+void HandleAssign()\r
+{\r
+ int vc;\r
+\r
+ vc=varcategory;\r
+ EmitC(opASSIGN);\r
+ if (vc==op_UVAR)\r
+ {\r
+ EmitC(op_UVAR);\r
+ EmitD(vars[varidx].varstartofs);\r
+ }\r
+ else if (vc==op_UVARRAY)\r
+ {\r
+ EmitC(op_UVARRAY);\r
+ EmitD(vars[varidx].varstartofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ }\r
+ else if (vc==op_LVAR)\r
+ {\r
+ EmitC(op_LVAR);\r
+ EmitC((char) varidx);\r
+ }\r
+ else if (vc==op_HVAR0)\r
+ {\r
+ EmitC(op_HVAR0);\r
+ EmitC((char) varidx);\r
+ }\r
+ else if (vc==op_HVAR1)\r
+ {\r
+ EmitC(op_HVAR1);\r
+ EmitC((char) varidx);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ }\r
+ else if (vc==op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW((short) str[varidx].vsofs);\r
+ }\r
+ else if (vc==op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW((short) str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ }\r
+ else if (vc==op_SLOCAL)\r
+ {\r
+ EmitC(op_SLOCAL);\r
+ EmitW((short) varidx);\r
+ }\r
+ GetToken();\r
+ if (TokenIs("++")) { EmitC(a_INC); GetToken(); return; } else\r
+ if (TokenIs("--")) { EmitC(a_DEC); GetToken(); return; } else\r
+ if (TokenIs("+=")) { EmitC(a_INCSET); } else\r
+ if (TokenIs("-=")) { EmitC(a_DECSET); } else\r
+ if (TokenIs("=")) { EmitC(a_SET); } else\r
+ vcerr("Invalid assignment operator.");\r
+ if (vc==op_STRING) HandleString();\r
+ else if (vc==op_SARRAY) HandleString();\r
+ else if (vc==op_SLOCAL) HandleString();\r
+ else EmitOperand();\r
+ GetToken();\r
+}\r
+\r
+int c=0;\r
+\r
+void HandleReturn()\r
+{\r
+ if (!vctype)\r
+ {\r
+ Expect(";");\r
+ EmitC(opRETURN);\r
+ return;\r
+ }\r
+ if (!funcs[c].returntype)\r
+ {\r
+ Expect(";");\r
+ EmitC(opRETURN);\r
+ return;\r
+ }\r
+ if (funcs[c].returntype==1)\r
+ {\r
+ EmitC(opSETRETVAL);\r
+ EmitOperand();\r
+ Expect(";");\r
+ EmitC(opRETURN);\r
+ return;\r
+ }\r
+}\r
+\r
+void ProcessSwitch()\r
+{ char *buf,*retrptr;\r
+\r
+ EmitC(opSWITCH);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ Expect("{");\r
+\r
+ // case .. option loop\r
+\r
+ while (!NextIs("}"))\r
+ {\r
+ Expect("case");\r
+ EmitC(opCASE);\r
+ EmitOperand();\r
+ Expect(":");\r
+ retrptr=code;\r
+ EmitD(0);\r
+ while (!NextIs("case") && !NextIs("}")) DoSomething();\r
+ EmitC(opRETURN);\r
+ buf=code;\r
+ code=retrptr;\r
+ EmitD((int) buf - (int) outbuf);\r
+ code=buf;\r
+ }\r
+ Expect("}");\r
+ EmitC(opRETURN);\r
+}\r
+\r
+void DoSomething(void)\r
+{\r
+ GetToken();\r
+ if (TokenIs("return")) { HandleReturn(); return; }\r
+ if (token_type==FUNCTION) { HandleFunctionType(); Expect(";"); return; }\r
+ if (token_type==IDENTIFIER) { HandleAssign(); return; }\r
+ if (TokenIs("if")) { ProcessIf(); return; }\r
+ if (TokenIs("while")) { ProcessWhile(); return; }\r
+ if (TokenIs("for")) { ProcessFor(); return; }\r
+ if (TokenIs("switch")) { ProcessSwitch(); return; }\r
+ vcerr("Unknown token.");\r
+}\r
+\r
+void DumpSystemIdx()\r
+{ FILE *f;\r
+\r
+ vprint("Dumping system.idx index file.");\r
+ f=fopen("system.idx","wb");\r
+\r
+ fwrite(&numvars, 1, 4, f);\r
+ fwrite(&vars, sizeof vars / 500, numvars, f);\r
+ fwrite(&numfuncs, 1, 4, f);\r
+ fwrite(&funcs, sizeof funcs / 700, numfuncs, f);\r
+ fwrite(&numstr, 1, 4, f);\r
+ fwrite(&str, sizeof str / 300, numstr, f);\r
+ fclose(f);\r
+}\r
+\r
+void ReadSystemIdx()\r
+{ FILE *f;\r
+\r
+ if (!(f=fopen("system.idx","rb")))\r
+ err("Could not access system.idx.");\r
+\r
+ fread(&numvars, 1, 4, f);\r
+ fread(&vars, sizeof vars / 500, numvars, f);\r
+ fread(&numfuncs, 1, 4, f);\r
+ fread(&funcs, sizeof funcs / 700, numfuncs, f);\r
+ fread(&numstr, 1, 4, f);\r
+ fread(&str, sizeof str / 300, numstr, f);\r
+ fclose(f);\r
+}\r
+\r
+void DoLocalVariables(int c)\r
+{\r
+ int na;\r
+\r
+ na=funcs[c].numargs;\r
+ while (NextIs("int") || NextIs("string"))\r
+ {\r
+ GetToken();\r
+ if (TokenIs("int"))\r
+ {\r
+ funcs[c].argtype[na]=INT;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ while (!NextIs(";"))\r
+ {\r
+ Expect(",");\r
+ funcs[c].argtype[na]=INT;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ }\r
+ Expect(";");\r
+ }\r
+ if (TokenIs("string"))\r
+ {\r
+ funcs[c].argtype[na]=STRING;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ while (!NextIs(";"))\r
+ {\r
+ Expect(",");\r
+ funcs[c].argtype[na]=STRING;\r
+ GetToken();\r
+ memcpy(larg[na++], token, 40);\r
+ }\r
+ Expect(";");\r
+ }\r
+ }\r
+ funcs[c].numlocals=na;\r
+}\r
+\r
+void CompileMAP(char *fname)\r
+{ FILE *f;\r
+ int i;\r
+\r
+ // Compiles a map-based VC.\r
+ i=strlen(fname);\r
+ memcpy(strbuf, fname, i);\r
+ strbuf[i]='.';\r
+ strbuf[i+1]='V';\r
+ strbuf[i+2]='C';\r
+ strbuf[i+3]=0;\r
+\r
+ PreProcess(strbuf);\r
+\r
+ source=(char *) malloc(1000000);\r
+ memset(source, 0, 1000000);\r
+ outbuf=(char *) malloc(1000000);\r
+ memset(outbuf, 0, 1000000);\r
+ if (!(f=fopen("vcctemp.$$$","rb")))\r
+ err("Could not open source file.");\r
+ fread(source, 1, 1000000, f);\r
+ fclose(f);\r
+\r
+ ReadSystemIdx();\r
+\r
+ src=source;\r
+ code=outbuf;\r
+ vctype=0;\r
+\r
+ while (*src)\r
+ {\r
+ functbl[mfuncs]=(char *) (int) code - (int) outbuf;\r
+ mfuncs++;\r
+ Expect("event");\r
+ Expect("{");\r
+ while (!NextIs("}")) DoSomething();\r
+ Expect("}");\r
+ EmitC(opRETURN);\r
+ ParseWhitespace();\r
+ }\r
+ dprint("%s.vc (%i lines)", fname, lines);\r
+}\r
+\r
+void SkipBrackets()\r
+{\r
+ while (!NextIs("}"))\r
+ {\r
+ if (!*src)\r
+ err("No matching bracket.");\r
+ GetToken();\r
+ if (TokenIs("{")) SkipBrackets();\r
+ }\r
+ GetToken();\r
+}\r
+\r
+void CheckDup()\r
+{\r
+ int i=0; // bitch!\r
+\r
+ while (i<numhardfuncs)\r
+ {\r
+ if (!strcmp(hardfuncs[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardfuncs)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numhardvar0)\r
+ {\r
+ if (!strcmp(hardvar0[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar0)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numhardvar1)\r
+ {\r
+ if (!strcmp(hardvar1[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar1)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numfuncs)\r
+ {\r
+ if (!strcmp(funcs[i].fname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numfuncs)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+\r
+ i=0;\r
+ while (i<numvars)\r
+ {\r
+ if (!strcmp(vars[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numvars)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+ i=0;\r
+ while (i<numstr)\r
+ {\r
+ if (!strcmp(str[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numstr)\r
+ {\r
+ vcerr("%s: Duplicate identifier.", token);\r
+ }\r
+}\r
+\r
+void CompileSystem()\r
+{\r
+ FILE *f = 0;\r
+ int na = 0;\r
+ int type = 0;\r
+ int i = 0;\r
+\r
+ // Compiles a map-based VC.\r
+\r
+ PreProcess("system.vc");\r
+\r
+ source = (char *) malloc(1000000);\r
+ memset(source, 0, 1000000);\r
+ outbuf = (char *) malloc(1000000);\r
+ memset(outbuf, 0, 1000000);\r
+\r
+ if (!(f=fopen("vcctemp.$$$","rb")))\r
+ err("Could not open source file.");\r
+\r
+ fread(source, 1, 1000000, f);\r
+\r
+ fclose(f);\r
+\r
+ src=source;\r
+ code=outbuf;\r
+\r
+ vprint("First pass...");\r
+ vctype=1; tlines=0;\r
+ while (*src)\r
+ {\r
+ // system.vc is compiled in a two-pass system. The first pass simply\r
+ // goes through the system.vc file and sets up declarations for all\r
+ // global variables and function declarations. So system.vc won't\r
+ // have to worry about forward declarations or anything.\r
+\r
+ na=(int) src;\r
+ GetToken();\r
+ if (TokenIs("string"))\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ CheckDup();\r
+ memcpy(str[numstr].vname, token, strlen(token));\r
+ str[numstr].vsofs=sstartofs;\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ str[numstr].arraylen=token_nvalue;\r
+ Expect("]");\r
+ }\r
+ else str[numstr].arraylen=1;\r
+ sstartofs+=str[numstr].arraylen;\r
+ vprint("Decl %s of type string, size %i. [%i]",\r
+ str[numstr].vname, str[numstr].arraylen, str[numstr].vsofs);\r
+ numstr++;\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ if (TokenIs("int"))\r
+ {\r
+ GetToken();\r
+ if (NextIs("(")) type=0; else type=1;\r
+ src=(char *) na;\r
+ GetToken();\r
+ }\r
+ if (TokenIs("void") || (TokenIs("int") && !type))\r
+ {\r
+ if (TokenIs("void")) funcs[numfuncs].returntype=0;\r
+ if (TokenIs("int")) funcs[numfuncs].returntype=1;\r
+ GetToken();\r
+ CheckDup();\r
+ memcpy(funcs[numfuncs].fname,token,strlen(token));\r
+ funcs[numfuncs].numargs=0;\r
+ Expect("(");\r
+ while (!NextIs(")"))\r
+ {\r
+ GetToken();\r
+ na=funcs[numfuncs].numargs;\r
+ if (TokenIs("int")) { funcs[numfuncs].argtype[na]=INT; } else\r
+ if (TokenIs("string")) { funcs[numfuncs].argtype[na]=STRING; }\r
+ else vcerr("Invalid arguement declaration.");\r
+ GetToken();\r
+ if (NextIs(",")) GetToken();\r
+ funcs[numfuncs].numargs++;\r
+ }\r
+ Expect(")");\r
+ Expect("{");\r
+ SkipBrackets();\r
+ vprint("Found %s declaration for %s, %i parameters.",\r
+ funcs[numfuncs].returntype ? "int" : "void",\r
+ funcs[numfuncs].fname, funcs[numfuncs].numargs);\r
+ numfuncs++;\r
+ }\r
+ if (TokenIs("int") && type)\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ CheckDup();\r
+ memcpy(vars[numvars].vname, token, strlen(token));\r
+ vars[numvars].varstartofs=curstartofs;\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ vars[numvars].arraylen=token_nvalue;\r
+ Expect("]");\r
+ }\r
+ else vars[numvars].arraylen=1;\r
+ curstartofs+=vars[numvars].arraylen;\r
+ vprint("Decl %s of type int, size %i. [%i]", vars[numvars].vname,\r
+ vars[numvars].arraylen, vars[numvars].varstartofs);\r
+ numvars++;\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ }\r
+ dprint("system.vc: %i ints, %i strings, %i functions",\r
+ numvars, numstr, numfuncs);\r
+\r
+ vprint("Second pass...");\r
+ src=source; tlines=0;\r
+ while (*src)\r
+ {\r
+ // Everything in system.vc will either be a global var decl or\r
+ // a function definition.\r
+\r
+ na=(int) src;\r
+ GetToken();\r
+ if (TokenIs("string"))\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ Expect("]");\r
+ }\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ if (TokenIs("int"))\r
+ {\r
+ GetToken();\r
+ if (NextIs("(")) type=0; else type=1;\r
+ src=(char *) na;\r
+ GetToken();\r
+ }\r
+ if (TokenIs("void") || (TokenIs("int") && !type))\r
+ {\r
+ funcs[c].syscodeofs=(int) code - (int) outbuf;\r
+ GetToken();\r
+ Expect("(");\r
+ i=0;\r
+ memset(&larg, 0, 480);\r
+ while (!NextIs(")"))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ memcpy(larg[i], token, 40);\r
+ if (NextIs(",")) GetToken();\r
+ i++;\r
+ }\r
+ Expect(")");\r
+ Expect("{");\r
+ DoLocalVariables(c);\r
+ while (!NextIs("}")) DoSomething();\r
+ EmitC(opRETURN);\r
+ Expect("}");\r
+ c++;\r
+ }\r
+ if (TokenIs("int") && type)\r
+ {\r
+ while (1)\r
+ {\r
+ GetToken();\r
+ if (NextIs("["))\r
+ {\r
+ GetToken();\r
+ GetToken();\r
+ Expect("]");\r
+ }\r
+ if (!NextIs(",")) break;\r
+ GetToken();\r
+ }\r
+ Expect(";");\r
+ }\r
+ }\r
+ dprint("system.vc (%i lines, %i total)", lines, tlines);\r
+\r
+ DumpSystemIdx();\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__COMPILE_INC)\r
+#define __COMPILE_INC\r
+\r
+#define VOID 1\r
+#define INT 1\r
+#define CHARPTR 2\r
+#define STRING 3\r
+\r
+extern unsigned char *source, *src;\r
+extern unsigned char *outbuf, *code;\r
+extern unsigned char inevent;\r
+\r
+typedef struct\r
+{\r
+ char fname[40];\r
+ char argtype[20];\r
+ int numargs, numlocals;\r
+ int returntype;\r
+ int syscodeofs;\r
+} funcdecl;\r
+\r
+extern funcdecl funcs[300];\r
+extern int numfuncs;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int vsofs;\r
+ int arraylen;\r
+} strdecl;\r
+\r
+extern strdecl str[300];\r
+extern int sstartofs;\r
+extern int numstr;\r
+\r
+typedef struct\r
+{\r
+ char vname[40];\r
+ int varstartofs;\r
+ int arraylen;\r
+} vardecl;\r
+\r
+extern vardecl vars[300];\r
+extern int curstartofs;\r
+extern int numvars;\r
+extern int varidx, startsyscript;\r
+extern char larg[12][40];\r
+extern int c;\r
+\r
+extern char *functbl[512];\r
+extern int mfuncs;\r
+\r
+extern void CompileMAP(char *fname);\r
+extern void CompileSystem();\r
+extern void Expect(char *str);\r
+\r
+extern void EmitC(char c);\r
+extern void EmitW(short int w);\r
+extern void EmitD(int w);\r
+extern void EmitOperand();\r
+extern void EmitString(char *str);\r
+extern void HandleString();\r
+\r
+#endif // __COMPILE_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Standard Function Library module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "compile.h"\r
+#include "funclib.h"\r
+#include "vcc.h"\r
+#include "vccode.h"\r
+#include "lexical.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// ================================= Code ====================================\r
+\r
+void vcfunc_Exit()\r
+{\r
+ EmitC(1);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void Message()\r
+{\r
+ EmitC(2);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+}\r
+\r
+void vc_loadimage()\r
+{\r
+ EmitC(6);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_AllocateEntity()\r
+{\r
+ EmitC(11);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_Map()\r
+{\r
+ EmitC(13);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_LoadFont()\r
+{\r
+ EmitC(14);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PlayFLI()\r
+{\r
+ EmitC(15);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PrintString()\r
+{\r
+ EmitC(17);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_LoadRaw()\r
+{\r
+ EmitC(18);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_EntityMove()\r
+{\r
+ EmitC(25);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_strlen()\r
+{\r
+ EmitC(33);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_strcmp()\r
+{\r
+ EmitC(34);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_SetRString()\r
+{\r
+ EmitC(47);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PartyMove()\r
+{\r
+ EmitC(51);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_PlayMusic()\r
+{\r
+ EmitC(62);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_OpenFile()\r
+{\r
+ EmitC(65);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_HookRetrace()\r
+{\r
+ char *na;\r
+\r
+ EmitC(44);\r
+ Expect("(");\r
+ na=src;\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ {\r
+ EmitC(2);\r
+ EmitD(funcidx);\r
+ }\r
+ else\r
+ {\r
+ src=na;\r
+ EmitC(1);\r
+ EmitOperand();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void vc_HookTimer()\r
+{\r
+ char *na;\r
+\r
+ EmitC(45);\r
+ Expect("(");\r
+ na=src;\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ {\r
+ EmitC(2);\r
+ EmitD(funcidx);\r
+ }\r
+ else\r
+ {\r
+ src=na;\r
+ EmitC(1);\r
+ EmitOperand();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void vc_HookKey()\r
+{\r
+ char *na;\r
+\r
+ EmitC(61);\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(",");\r
+ na=src;\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ {\r
+ EmitC(2);\r
+ EmitD(funcidx);\r
+ }\r
+ else\r
+ {\r
+ src=na;\r
+ EmitC(1);\r
+ EmitOperand();\r
+ }\r
+ Expect(")");\r
+}\r
+\r
+void vc_QuickRead()\r
+{\r
+ EmitC(67);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ GetToken();\r
+ if (varcategory == op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (varcategory == op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ vcerr("String variable expected.");\r
+}\r
+\r
+void vc_CacheSound()\r
+{\r
+ EmitC(74);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_val()\r
+{\r
+ EmitC(80);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_Log()\r
+{\r
+ EmitC(83);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_fgetline()\r
+{\r
+ EmitC(90);\r
+ Expect("(");\r
+ GetToken();\r
+ if (varcategory == op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (varcategory == op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ vcerr("String variable expected.");\r
+}\r
+\r
+void vc_fgettoken()\r
+{\r
+ EmitC(91);\r
+ Expect("(");\r
+ GetToken();\r
+ if (varcategory == op_STRING)\r
+ {\r
+ EmitC(op_STRING);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (varcategory == op_SARRAY)\r
+ {\r
+ EmitC(op_SARRAY);\r
+ EmitW(str[varidx].vsofs);\r
+ Expect("[");\r
+ EmitOperand();\r
+ Expect("]");\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ vcerr("String variable expected.");\r
+}\r
+\r
+void vc_fwritestring()\r
+{\r
+ EmitC(92);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ EmitOperand();\r
+ Expect(")");\r
+}\r
+\r
+void vc_frename()\r
+{\r
+ EmitC(94);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(",");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_fdelete()\r
+{\r
+ EmitC(95);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_fwopen()\r
+{\r
+ EmitC(96);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_asc()\r
+{\r
+ EmitC(106);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void vc_NumForScript()\r
+{\r
+ EmitC(108);\r
+ Expect("(");\r
+ GetToken();\r
+ if (token_subtype == op_UFUNC)\r
+ EmitD(funcidx);\r
+ else vcerr("system script expected.");\r
+ Expect(")");\r
+}\r
+\r
+void vc_FileSize()\r
+{\r
+ EmitC(109);\r
+ Expect("(");\r
+ HandleString();\r
+ Expect(")");\r
+}\r
+\r
+void GenericFunc(unsigned char idcode, int numargs)\r
+{ char i;\r
+\r
+ EmitC(idcode);\r
+ if (!numargs)\r
+ {\r
+ Expect("(");\r
+ Expect(")");\r
+ return;\r
+ }\r
+ if (numargs==1)\r
+ {\r
+ Expect("(");\r
+ EmitOperand();\r
+ Expect(")");\r
+ return;\r
+ }\r
+ Expect("(");\r
+ for (i=1; i<numargs; i++)\r
+ {\r
+ EmitOperand();\r
+ Expect(",");\r
+ }\r
+ EmitOperand();\r
+ Expect(")");\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__FUNCLIB_INC)\r
+#define __FUNCLIB_INC\r
+\r
+extern void vcfunc_Exit();\r
+extern void Message();\r
+extern void vc_loadimage();\r
+extern void vc_AllocateEntity();\r
+extern void vc_Map();\r
+extern void vc_LoadFont();\r
+extern void vc_PlayFLI();\r
+extern void vc_PrintString();\r
+extern void vc_LoadRaw();\r
+extern void vc_EntityMove();\r
+extern void vc_strlen();\r
+extern void vc_strcmp();\r
+extern void vc_SetRString();\r
+extern void vc_PartyMove();\r
+extern void vc_PlayMusic();\r
+extern void vc_OpenFile();\r
+extern void vc_HookRetrace();\r
+extern void vc_HookTimer();\r
+extern void vc_HookKey();\r
+extern void vc_QuickRead();\r
+extern void vc_CacheSound();\r
+extern void vc_val();\r
+extern void vc_Log();\r
+extern void vc_fgetline();\r
+extern void vc_fgettoken();\r
+extern void vc_fwritestring();\r
+extern void vc_frename();\r
+extern void vc_fdelete();\r
+extern void vc_fwopen();\r
+extern void vc_asc();\r
+extern void vc_NumForScript();\r
+extern void vc_FileSize();\r
+extern void GenericFunc(unsigned char funcid, int numargs);\r
+\r
+#endif // __FUNCLIB_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Lexical Parser ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <aen, may 16>\r
+// + ConvHexToDec() was severely screwed (would not return correct values at\r
+// *all*; own fault)--fixed\r
+// <aen, may 14>\r
+// + fixed some problems with tick mark parsing. didn't like certain chars.\r
+// <aen, may 9>\r
+// + fixed floating point exception crash in ConvHexToDec(), which occured\r
+// when using very large hex numbers (i think; like $ffffffff). was due to\r
+// use of pow()\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <math.h>\r
+#include "compile.h"\r
+#include "vcc.h"\r
+#include "vccode.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// Character types\r
+\r
+#define LETTER 1\r
+#define DIGIT 2\r
+#define SPECIAL 3\r
+\r
+// ---------------\r
+\r
+char token[2000]; // Token buffer\r
+int token_nvalue; // int value of token if it's type DIGIT\r
+char token_type; // type of current token.\r
+char token_subtype; // This is just crap.\r
+unsigned char chr_table[256]; // Character type table.\r
+\r
+int lines, tlines; // current line number being processed in\r
+char *source_file; // the current source file\r
+\r
+// ----------------\r
+\r
+char *hardfuncs[]=\r
+{\r
+ // A\r
+ "exit", "message", "malloc",\r
+ "free", "pow", "loadimage",\r
+ "copysprite", "tcopysprite", "render",\r
+ "showpage", "entityspawn", "setplayer",\r
+ "map", "loadfont", "playfli",\r
+\r
+ // B\r
+ "gotoxy", "printstring", "loadraw",\r
+ "settile", "allowconsole", "scalesprite",\r
+ "processentities", "updatecontrols", "unpress",\r
+ "entitymove", "hline", "vline",\r
+ "line", "circle", "circlefill", // 30\r
+\r
+ // C\r
+ "rect", "rectfill", "strlen",\r
+ "strcmp", "cd_stop", "cd_play",\r
+ "fontwidth", "fontheight", "setpixel",\r
+ "getpixel", "entityonscreen", "random",\r
+ "gettile", "hookretrace", "hooktimer",\r
+\r
+ // D\r
+ "setresolution", "setrstring", "setcliprect",\r
+ "setrenderdest", "restorerendersettings","partymove",\r
+ "sin", "cos", "tan",\r
+ "readmouse", "setclip", "setlucent",\r
+ "wrapblit", "twrapblit", "setmousepos", // 60\r
+\r
+ // E\r
+ "hookkey", "playmusic", "stopmusic",\r
+ "palettemorph", "fopen", "fclose",\r
+ "quickread", "addfollower", "killfollower",\r
+ "killallfollowers", "resetfollowers", "flatpoly",\r
+ "tmappoly", "cachesound", "freeallsounds",\r
+\r
+ // F\r
+ "playsound", "rotscale", "mapline",\r
+ "tmapline", "val", "tscalesprite",\r
+ "grabregion", "log", "fseekline",\r
+ "fseekpos", "fread", "fgetbyte",\r
+ "fgetword", "fgetquad", "fgetline", // 90\r
+\r
+ // G\r
+ "fgettoken", "fwritestring", "fwrite",\r
+ "frename", "fdelete", "fwopen",\r
+ "fwclose", "memcpy", "memset",\r
+ "silhouette", "initmosaictable", "mosaic",\r
+ "writevars", "readvars", "callevent", // 105\r
+\r
+ // H\r
+ "asc", "callscript", "numforscript",\r
+ "filesize", "ftell", "checkcorrupt"\r
+ };\r
+\r
+char returntypes[]=\r
+{\r
+ // A\r
+ 0, 0, 1,\r
+ 0, 1, 1,\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 1, 0,\r
+\r
+ // B\r
+ 0, 0, 1,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+\r
+ // C\r
+ 0, 0, 1,\r
+ 1, 0, 0,\r
+ 1, 1, 0,\r
+ 1, 1, 1,\r
+ 1, 0, 0,\r
+\r
+ // D\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 1, 1, 1,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+\r
+ // E\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+\r
+ // F\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 0, 0,\r
+ 0, 0, 1,\r
+ 1, 1, 0,\r
+\r
+ // G\r
+ 0, 0, 0,\r
+ 0, 0, 1,\r
+ 0, 0, 0,\r
+ 0, 1, 0,\r
+ 0, 0, 0,\r
+\r
+ // H\r
+ 1, 0, 1,\r
+ 1, 1, 0\r
+};\r
+\r
+char *hardvar0[]=\r
+{\r
+ "xwin", "ywin", "cameratracking",\r
+ "timer", "up", "down",\r
+ "left", "right", "b1",\r
+ "b2", "b3", "b4",\r
+ "screenx", "screeny", "player", // 15\r
+\r
+ "numentsonscreen", "tracker", "mx",\r
+ "my", "mb", "vctrace",\r
+ "image_width", "image_height", "music_volume", // 24\r
+ "vsp", "lastent", "last_pressed"\r
+};\r
+\r
+char *hardvar1[]=\r
+{\r
+ "screen", "entity.x", "entity.y",\r
+ "entity.tx", "entity.ty", "entity.facing",\r
+ "entity.moving", "entity.specframe", "entity.speed",\r
+ "entity.movecode", "entsonscreen", "key",\r
+ "layer.hline", "byte", "word", // 15\r
+\r
+ "quad", "pal", "sbyte",\r
+ "sword", "squad"\r
+};\r
+\r
+int funcidx = 0;\r
+int varcategory = 0;\r
+\r
+int numhardfuncs = 111;\r
+int numhardvar0 = 27;\r
+int numhardvar1 = 20;\r
+\r
+// ================================= Code ====================================\r
+\r
+int streq(char *a, char *b)\r
+{\r
+ while (*a)\r
+ {\r
+ if (*a++ != *b++)\r
+ return 0;\r
+ }\r
+ return (*b==0);\r
+}\r
+\r
+char TokenIs(char *str)\r
+ { return streq(str,token); }\r
+\r
+void ParseWhitespace(void)\r
+{\r
+ while (1)\r
+ {\r
+ while (*src<=' ' && *src>2)\r
+ if (!*src++)\r
+ return;\r
+\r
+ if (src[0]=='/' && src[1]=='/')\r
+ {\r
+ while (*src && (*src != '\n'))\r
+ src++;\r
+ continue;\r
+ }\r
+\r
+ if (src[0]=='/' && src[1]=='*')\r
+ {\r
+ while (!(src[0]=='*' && src[1]=='/'))\r
+ {\r
+ src++;\r
+ if (!*src)\r
+ return;\r
+ if (*src == 1)\r
+ {\r
+ src++;\r
+ source_file = src;\r
+ while (*src++);\r
+ tlines++;\r
+ continue;\r
+ }\r
+ if (*src==2)\r
+ {\r
+ src++;\r
+ lines = (int) *(int *)src;\r
+ src += 4;\r
+ continue;\r
+ }\r
+ }\r
+ src+=2;\r
+ continue;\r
+ }\r
+\r
+ if (*src == 1)\r
+ {\r
+ src++;\r
+ source_file = src;\r
+ while (*src++);\r
+ continue;\r
+ }\r
+ if (*src==2)\r
+ {\r
+ src++;\r
+ lines = (int) *(int *)src;\r
+ src += 4;\r
+ tlines++;\r
+ continue;\r
+ }\r
+ break;\r
+ }\r
+}\r
+\r
+int GetStringIdx(char i)\r
+{\r
+ int j, k=0;\r
+\r
+ for (j=0; j<i; j++)\r
+ {\r
+ if (funcs[c].argtype[j]==STRING) k++;\r
+ }\r
+ return k;\r
+}\r
+\r
+void CheckLibFunc()\r
+{ int i;\r
+\r
+ token_nvalue=0;\r
+ token_type=0;\r
+\r
+ if (TokenIs("if") || TokenIs("else") || TokenIs("for") ||\r
+ TokenIs("while") || TokenIs("switch") || TokenIs("case") ||\r
+ TokenIs("goto"))\r
+ {\r
+ token_type=RESERVED;\r
+ return;\r
+ }\r
+ if (TokenIs("and"))\r
+ {\r
+ token_type=CONTROL;\r
+ token[0]='&'; token[1]='&'; token[2]=0;\r
+ return;\r
+ }\r
+ if (TokenIs("or"))\r
+ {\r
+ token_type=CONTROL;\r
+ token[0]='|'; token[1]='|'; token[2]=0;\r
+ return;\r
+ }\r
+ i=0;\r
+ while (i<numhardfuncs)\r
+ {\r
+ if (!strcmp(hardfuncs[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardfuncs)\r
+ {\r
+ token_type=FUNCTION;\r
+ token_subtype=op_BFUNC;\r
+ funcidx=i;\r
+ }\r
+ i=0;\r
+ while (i<numhardvar0)\r
+ {\r
+ if (!strcmp(hardvar0[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar0)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varcategory=op_HVAR0;\r
+ varidx=i;\r
+ }\r
+ i=0;\r
+ while (i<numhardvar1)\r
+ {\r
+ if (!strcmp(hardvar1[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<numhardvar1)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varcategory=op_HVAR1;\r
+ varidx=i;\r
+ }\r
+\r
+ i=0;\r
+ while (i<numfuncs)\r
+ {\r
+ if (!strcmp(funcs[i].fname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numfuncs)\r
+ {\r
+ token_type=FUNCTION;\r
+ token_subtype=op_UFUNC;\r
+ funcidx=i;\r
+ }\r
+\r
+ i=0;\r
+ while (i<numvars)\r
+ {\r
+ if (!strcmp(vars[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numvars)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varidx=i;\r
+ varcategory=op_UVAR;\r
+ if (vars[varidx].arraylen>1) varcategory=op_UVARRAY;\r
+ }\r
+ i=0;\r
+ while (i<funcs[c].numlocals)\r
+ {\r
+ if (!strcmp(larg[i], token)) break;\r
+ i++;\r
+ }\r
+ if (i<funcs[c].numlocals)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varidx=i;\r
+ switch (funcs[c].argtype[varidx])\r
+ {\r
+ case INT: varcategory=op_LVAR; break;\r
+ case STRING: varcategory=op_SLOCAL;\r
+ varidx=GetStringIdx(varidx);\r
+ break;\r
+ default: vcerr("um.");\r
+ }\r
+ }\r
+ i=0;\r
+ while (i<numstr)\r
+ {\r
+ if (!strcmp(str[i].vname, token)) break;\r
+ i++;\r
+ }\r
+ if (i<numstr)\r
+ {\r
+ token_type=IDENTIFIER;\r
+ varidx=i;\r
+ varcategory=op_STRING;\r
+ if (str[i].arraylen>1) varcategory=op_SARRAY;\r
+ }\r
+}\r
+\r
+void GetIdentifier(void)\r
+{\r
+ int i;\r
+\r
+ i=0;\r
+ while ((chr_table[*src] == LETTER) || (chr_table[*src] == DIGIT))\r
+ token[i++] = *src++;\r
+ token[i]=0;\r
+ strlwr(token);\r
+ CheckLibFunc();\r
+}\r
+\r
+void ConvHexToDec()\r
+{\r
+ static const char *const hextbl="0123456789abcdef\0";\r
+ static int pow_lut[]={1,16,256,4096,65536,1048576,16777216,268435456};\r
+ int i=0, pos=0, z=0;\r
+ unsigned int j=0;\r
+\r
+ if (strlen(token)>9)\r
+ vcerr("Hex number exceeds 8 digit maximum.");\r
+\r
+ strlwr(token);\r
+ i=strlen(token)-1;\r
+ token_nvalue=0;\r
+ for (pos=0; i>0; pos++,i--)\r
+ {\r
+ z=token[i];\r
+ for (j=0; j<16; j++)\r
+ if (hextbl[j]==z) break;\r
+ if (j>=16)\r
+ vcerr("Invalid hex number.");\r
+ token_nvalue += (j * pow_lut[pos]);\r
+ }\r
+}\r
+\r
+void DoTickMarks()\r
+{\r
+ token_nvalue=token[1];\r
+}\r
+\r
+void GetNumber()\r
+{\r
+ int i;\r
+\r
+ if ('\'' == *src)\r
+ {\r
+ token[0]=*src++;\r
+ token[1]=*src++;\r
+ token[2]=*src++;\r
+ token[3]=0;\r
+ }\r
+ else\r
+ {\r
+ i=0;\r
+ while (chr_table[*src] != SPECIAL)\r
+ token[i++]=*src++;\r
+ token[i]=0;\r
+ }\r
+ if (token[0]=='$') ConvHexToDec();\r
+ else if (token[0]=='\'') DoTickMarks();\r
+ else token_nvalue=atoi(token);\r
+}\r
+\r
+void GetPunctuation()\r
+{ char c;\r
+\r
+ c=*src;\r
+ switch (c)\r
+ {\r
+ case '(': token[0]='('; token[1]=0; src++; break;\r
+ case ')': token[0]=')'; token[1]=0; src++; break;\r
+ case '{': token[0]='{'; token[1]=0; src++; break;\r
+ case '}': token[0]='}'; token[1]=0; src++; break;\r
+ case '[': token[0]='['; token[1]=0; src++; break;\r
+ case ']': token[0]=']'; token[1]=0; src++; break;\r
+ case ',': token[0]=','; token[1]=0; src++; break;\r
+ case ':': token[0]=':'; token[1]=0; src++; break;\r
+ case ';': token[0]=';'; token[1]=0; src++; break;\r
+ case '/': token[0]='/'; token[1]=0; src++; break;\r
+ case '*': token[0]='*'; token[1]=0; src++; break;\r
+ case '^': token[0]='^'; token[1]=0; src++; break;\r
+ case '%': token[0]='%'; token[1]=0; src++; break;\r
+ case '\"': token[0]='\"'; token[1]=0; src++; break;\r
+ case '+' : token[0]='+';\r
+ src++;\r
+ if (*src=='+')\r
+ { token[1]='+';\r
+ src++; }\r
+ else if (*src=='=')\r
+ { token[1]='=';\r
+ src++; }\r
+ else token[1]=0;\r
+ token[2]=0;\r
+ break;\r
+ case '-' : token[0]='-';\r
+ src++;\r
+ if (*src=='-')\r
+ { token[1]='-';\r
+ src++; }\r
+ else if (*src=='=')\r
+ { token[1]='=';\r
+ src++; }\r
+ else token[1]=0;\r
+ token[2]=0;\r
+ break;\r
+ case '>' : token[0]='>';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]='=';\r
+ token[2]=0;\r
+ src++; break; }\r
+ if (*src=='>')\r
+ { token[1]='>';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '<': token[0]='<';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]='=';\r
+ token[2] = 0;\r
+ src++; break; }\r
+ if (*src=='<')\r
+ { token[1]='<';\r
+ token[2] = 0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '!': token[0]='!';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]='=';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '=': token[0]='=';\r
+ src++;\r
+ if (*src=='=')\r
+ { token[1]=0;\r
+ src++; }\r
+ else token[1]=0;\r
+ break;\r
+ case '&': token[0]='&';\r
+ src++;\r
+ if (*src=='&')\r
+ { token[1]='&';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ case '|': token[0]='|';\r
+ src++;\r
+ if (*src=='|')\r
+ { token[1]='|';\r
+ token[2]=0;\r
+ src++; break; }\r
+ token[1]=0;\r
+ break;\r
+ default: src++; // This should be an error.\r
+ }\r
+}\r
+\r
+void GetString(void)\r
+{\r
+ int i;\r
+\r
+ // Expects a "quoted" string. Places the contents of the string in\r
+ // token[] but does not include the quotes.\r
+\r
+ Expect("\"");\r
+ i=0;\r
+ while (*src!='\"')\r
+ {\r
+ token[i++]=*src++;\r
+ if (i>250)\r
+ vcerr("String exceeds 250 character maximum.");\r
+ }\r
+ src++;\r
+ token[i]=0;\r
+}\r
+\r
+void GetToken(void)\r
+{\r
+ int i;\r
+\r
+ // Simply reads in the next statement and places it in the\r
+ // token buffer.\r
+\r
+ ParseWhitespace();\r
+ i=0;\r
+\r
+ switch (chr_table[*src])\r
+ {\r
+ case LETTER: { token_type = IDENTIFIER; GetIdentifier(); break; }\r
+ case DIGIT: { token_type = DIGIT; GetNumber(); break; }\r
+ case SPECIAL: { token_type = CONTROL; GetPunctuation(); break; }\r
+ }\r
+\r
+ if (!*src && inevent)\r
+ err("Unexpected end of file");\r
+}\r
+\r
+void Expect(char *str)\r
+{\r
+ GetToken();\r
+ if (TokenIs(str)) return;\r
+ vcerr("error: %s expected, %s got", str, token);\r
+}\r
+\r
+int ExpectNumber()\r
+{\r
+ GetToken();\r
+ if (token_type!=DIGIT) err("error: Numerical value expected");\r
+ return token_nvalue;\r
+}\r
+\r
+void InitCompileSystem()\r
+{ int i;\r
+\r
+ vprint("Building chr_table[].");\r
+ for (i=0; i<256; i++) chr_table[i]=SPECIAL;\r
+ for (i='0'; i<='9'; i++) chr_table[i]=DIGIT;\r
+ for (i='A'; i<='Z'; i++) chr_table[i]=LETTER;\r
+ for (i='a'; i<='z'; i++) chr_table[i]=LETTER;\r
+\r
+ chr_table[10]=0;\r
+ chr_table[13]=0;\r
+ chr_table[' ']=0;\r
+ chr_table['_']=LETTER;\r
+ chr_table['.']=LETTER;\r
+ chr_table['$']=DIGIT;\r
+ chr_table[39]=DIGIT;\r
+}\r
+\r
+char lasttoken[2048];\r
+\r
+int NextIs(char *str)\r
+{ char *ptr,tt,tst;\r
+ int i,nv;\r
+\r
+ ptr=src;\r
+ tt=token_type;\r
+ tst=token_subtype;\r
+ nv=token_nvalue;\r
+ memcpy(lasttoken, token, 2048);\r
+ GetToken();\r
+ src=ptr;\r
+ token_nvalue=nv;\r
+ tst=token_subtype;\r
+ tt=token_type;\r
+ //if (!strcmp(str,token)) i=1; else i=0;\r
+ i=streq(str,token);\r
+ memcpy(token, lasttoken, 2048);\r
+ return i;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__LEXICAL_INC)\r
+#define __LEXICAL_INC\r
+\r
+extern void ParseWhitespace();\r
+extern void GetNumber();\r
+extern void GetToken();\r
+extern void InitCompileSystem();\r
+extern int NextIs(char *str);\r
+\r
+extern void GetString(void);\r
+\r
+extern char token[2000]; // Token buffer\r
+extern unsigned int token_nvalue; // int value of token if it's type DIGIT\r
+extern char token_type; // type of current token.\r
+extern char token_subtype; // This is just crap.\r
+extern unsigned char chr_table[256]; // Character type table.\r
+extern char returntypes[];\r
+extern int lines, tlines;\r
+extern char *source_file;\r
+\r
+extern char TokenIs(char *str);\r
+extern void Expect(char *str);\r
+\r
+extern int numhardfuncs, funcidx;\r
+extern int varcategory, numhardvar0;\r
+extern int numhardvar1;\r
+extern char *hardfuncs[];\r
+extern char *hardvar0[];\r
+extern char *hardvar1[];\r
+\r
+#endif // __LEXICAL_INC\r
--- /dev/null
+@echo off\r
+if exist vcc.exe del vcc.exe\r
+gcc -s -Wall -Werror -m486 -O3 vcc.c preproc.c lexical.c compile.c funclib.c -o dj\vcc.exe\r
+rem gcc -Wall -Werror -pg vcc.c preproc.c lexical.c compile.c funclib.c -o dj\vcc\r
+if not exist dj\vcc.exe goto end\r
+if exist ..\djp.exe djp dj\vcc.exe\r
+:end\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler version 2.01 ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Pre Processor module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <aen, may 14>\r
+// + fixed incorrect file markers and last character omission.\r
+// + one more incorrect file marker fix; was not restoring correctly after\r
+// #included files.\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#ifdef __WATCOMC__\r
+#include <io.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+\r
+#include "vcc.h"\r
+#include "lexical.h"\r
+\r
+int pp_dump;\r
+int pp_nomark;\r
+static int pp_tempct = 0;\r
+\r
+typedef struct\r
+ {\r
+ char *sym;\r
+ int sym_len;\r
+\r
+ char *resolve;\r
+ int resolve_len;\r
+\r
+ } pp_def;\r
+\r
+typedef struct\r
+ {\r
+ char *filename;\r
+ char *data;\r
+\r
+ } pp_include;\r
+\r
+void Process(char *filename);\r
+char *pp_token(char *p);\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+// DATA ////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+pp_def *pp_defarr = NULL;\r
+\r
+int pp_num_defs = 0;\r
+int pp_defs_allocated = 0;\r
+int PP_DEFS_BLOCK = 25;\r
+\r
+pp_include pp_incarr[100];\r
+//pp_include *pp_icur = NULL; // get rid of this\r
+char *cur_filename=0;\r
+char *last_filename=0;\r
+\r
+int pp_num_includes = 0;\r
+\r
+int pp_line = 0;\r
+int pp_total_lines = 0;\r
+\r
+const int EOF_CHAR = 0x00;\r
+\r
+char pp_chr_table[256];\r
+\r
+enum\r
+ {\r
+ PP_ERROR,\r
+ PP_WHITE,\r
+ PP_PUNC,\r
+ PP_DIGIT,\r
+ PP_LETTER,\r
+ PP_QUOTE,\r
+ PP_DIRECTIVE,\r
+ PP_NEWLINE,\r
+ PP_EOF\r
+ };\r
+\r
+FILE *pp_out = NULL;\r
+\r
+char pp_tok[1024];\r
+int pp_toktype = 0;\r
+\r
+int pp_last_delim = 1;\r
+\r
+////////////////////////////////////////////////////////////////////////////\r
+// CODE ////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+int logging=1;\r
+void log(char *str)\r
+{\r
+ if (logging)\r
+ {\r
+ FILE *fp = fopen("error.log", "a");\r
+ fprintf(fp, str);\r
+ fflush(fp);\r
+ fclose(fp);\r
+ }\r
+}\r
+\r
+void init_pp_chr_table()\r
+{\r
+ int x;\r
+\r
+ memset(pp_chr_table, PP_ERROR, 256);\r
+\r
+ pp_chr_table[EOF_CHAR] = PP_EOF;\r
+\r
+ for (x='A'; x<='Z'; x++) pp_chr_table[x] = PP_LETTER;\r
+ for (x='a'; x<='z'; x++) pp_chr_table[x] = PP_LETTER;\r
+ pp_chr_table['_'] = PP_LETTER;\r
+ pp_chr_table['.'] = PP_LETTER;\r
+\r
+ for (x='0'; x<='9'; x++) pp_chr_table[x] = PP_DIGIT;\r
+ pp_chr_table['$'] = PP_DIGIT;\r
+ pp_chr_table['\''] = PP_DIGIT;\r
+\r
+ pp_chr_table['+'] = pp_chr_table['-'] = PP_PUNC;\r
+ pp_chr_table['*'] = pp_chr_table['/'] = PP_PUNC;\r
+ pp_chr_table['%'] = PP_PUNC;\r
+ pp_chr_table['|'] = pp_chr_table['&'] = PP_PUNC;\r
+ pp_chr_table['='] = pp_chr_table['^'] = PP_PUNC;\r
+ pp_chr_table[','] = PP_PUNC;\r
+ pp_chr_table['<'] = pp_chr_table['>'] = PP_PUNC;\r
+ pp_chr_table['('] = pp_chr_table[')'] = PP_PUNC;\r
+ pp_chr_table['['] = pp_chr_table[']'] = PP_PUNC;\r
+ pp_chr_table['{'] = pp_chr_table['}'] = PP_PUNC;\r
+ pp_chr_table[':'] = pp_chr_table[';'] = PP_PUNC;\r
+ pp_chr_table['\\'] = pp_chr_table['!'] = PP_PUNC;\r
+\r
+ pp_chr_table[' '] = pp_chr_table['\t'] = PP_WHITE;\r
+ pp_chr_table['\r'] = PP_WHITE;\r
+\r
+ pp_chr_table['\n'] = PP_NEWLINE;\r
+\r
+ pp_chr_table['\"'] = PP_QUOTE;\r
+\r
+ pp_chr_table['#'] = PP_DIRECTIVE;\r
+}\r
+\r
+void pp_line_marker()\r
+{\r
+ if (pp_nomark) return;\r
+\r
+ fputc(2, pp_out);\r
+ fwrite(&pp_line, 1, 4, pp_out);\r
+}\r
+\r
+void pp_file_marker()\r
+{\r
+ if (pp_nomark) return;\r
+\r
+ fputc(1, pp_out);\r
+ fwrite(cur_filename, 1, strlen(cur_filename)+1, pp_out);\r
+}\r
+\r
+void pp_error(const char *error, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ va_start (lst, error);\r
+ vsprintf (string, error, lst);\r
+ va_end (lst);\r
+\r
+ printf ("*preproc error* ");\r
+ err (string);\r
+}\r
+\r
+void pp_line_error(const char *error, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ va_start (lst, error);\r
+ vsprintf (string, error, lst);\r
+ va_end (lst);\r
+\r
+ printf ("%s(%d) ", cur_filename, pp_line);\r
+ pp_error (string);\r
+}\r
+\r
+int pp_is_punc(int c)\r
+ { return (PP_PUNC == pp_chr_table[c]); }\r
+\r
+int pp_is_letter(int c)\r
+ { return (PP_LETTER == pp_chr_table[c]); }\r
+\r
+int pp_is_digit(int c)\r
+ { return (PP_DIGIT == pp_chr_table[c]); }\r
+\r
+int pp_is_ident(int c)\r
+ { return (pp_is_letter(c) || pp_is_digit(c)); }\r
+\r
+int pp_is_white(int c)\r
+ { return (PP_WHITE == pp_chr_table[c]); }\r
+\r
+int pp_is_directive(int c)\r
+ { return (PP_DIRECTIVE == pp_chr_table[c]); }\r
+\r
+int pp_is_eof(int c)\r
+ { return (PP_EOF == pp_chr_table[c]); }\r
+\r
+pp_def *pp_def_add(char *sym, char *resolve)\r
+{\r
+ pp_def *pp = NULL;\r
+ pp_def *p = NULL;\r
+\r
+ if (!(pp_defs_allocated % PP_DEFS_BLOCK))\r
+ {\r
+ pp_defs_allocated += PP_DEFS_BLOCK;\r
+\r
+ p = (pp_def *)realloc(\r
+ pp_defarr, pp_defs_allocated * sizeof(pp_def));\r
+ if (!p) pp_error("unable to grow #define list");\r
+\r
+ pp_defarr = p;\r
+ }\r
+\r
+ pp = &pp_defarr[pp_num_defs];\r
+ ++pp_num_defs;\r
+\r
+ pp->sym = (char *)malloc(strlen(sym) +1);\r
+ if (!pp->sym)\r
+ pp_error("memory exhausted");\r
+ strcpy(pp->sym, sym);\r
+ pp->sym_len = strlen(sym);\r
+\r
+ pp->resolve = (char *)malloc(strlen(resolve) +1);\r
+ if (!pp->resolve)\r
+ pp_error("memory exhausted");\r
+ strcpy(pp->resolve, resolve);\r
+ pp->resolve_len = strlen(resolve);\r
+\r
+ return pp;\r
+}\r
+\r
+pp_include *pp_include_add(char *filename)\r
+{\r
+ FILE *in = NULL;\r
+ pp_include *pp = NULL;\r
+ int z = 0;\r
+\r
+ if (pp_num_includes)\r
+ {\r
+ int i;\r
+ for (i=0; i<pp_num_includes; i++)\r
+ {\r
+ if (!stricmp(pp_incarr[i].filename, pp_tok))\r
+ pp_error("circular dependencies");\r
+ }\r
+ }\r
+\r
+ // alias\r
+ pp = &pp_incarr[pp_num_includes++];\r
+\r
+ in = fopen(filename, "rb");\r
+ if (!in) pp_error("unable to open %s", filename);\r
+\r
+ // filelength\r
+ fseek(in, 0, SEEK_END);\r
+ z = ftell(in);\r
+ fseek(in, 0, SEEK_SET);\r
+\r
+ // cache file\r
+ pp->data = (char *)malloc((z +2) * sizeof(char));\r
+ if (!pp->data) pp_error("memory exhausted");\r
+ fread(pp->data, 1, z, in);\r
+ fclose(in);\r
+\r
+ pp->data[z++] = 32; // <aen, may 12>\r
+ pp->data[z] = EOF_CHAR;\r
+\r
+ pp->filename = (char *)malloc(strlen(filename) +1);\r
+ if (!pp->filename) pp_error("memory exhausted");\r
+ strcpy(pp->filename, filename);\r
+ cur_filename=pp->filename;\r
+\r
+ return pp;\r
+}\r
+\r
+char *pp_skip_c_comment(char *p)\r
+{\r
+ p += 2;\r
+ while (*p && ('*' != *p || '/' != p[1]))\r
+ {\r
+ if ('\n' == *p)\r
+ {\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ }\r
+ if ('/' == *p && '*' == p[1])\r
+ p = pp_skip_c_comment(p);\r
+ else ++p;\r
+ }\r
+ if (*p) p += 2;\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_skip_cpp_comment(char *p)\r
+{\r
+ p += 2;\r
+ while (*p && '\n' != *p)\r
+ ++p;\r
+ if (*p)\r
+ {\r
+ ++p;\r
+\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_skipwhite(char *p)\r
+{\r
+ for (;;)\r
+ {\r
+ while (*p && PP_WHITE == pp_chr_table[(int) *p])\r
+ ++p;\r
+\r
+ if ('\n' == *p)\r
+ {\r
+ ++p;\r
+\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ continue;\r
+ }\r
+\r
+ // skip comments\r
+ if ('/' == *p)\r
+ {\r
+ switch (p[1])\r
+ {\r
+ case '/': p = pp_skip_cpp_comment(p); continue;\r
+ case '*': p = pp_skip_c_comment(p); continue;\r
+ }\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_punc(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ do {\r
+ *s++ = *p++;\r
+ } while (*p && pp_is_punc(*p));\r
+ *s = 0;\r
+\r
+ return p;\r
+}\r
+\r
+/*\r
+int is_hex(int c)\r
+{\r
+ return (\r
+ (c >= '0' && c <= '9')\r
+ || (c >= 'A' && c <= 'F')\r
+ || (c >= 'a' && c <= 'f'));\r
+}\r
+*/\r
+\r
+char *pp_token_digit(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ if ('\'' == *p)\r
+ {\r
+ *s++ = *p++;\r
+ if (!*p) return NULL;\r
+ *s++ = *p++;\r
+ if (!*p) return NULL;\r
+ *s++ = *p++;\r
+ if (!*p) return NULL;\r
+ *s = 0;\r
+ }\r
+ else\r
+ {\r
+ do {\r
+ *s++ = *p++;\r
+ } while (*p && pp_is_digit(*p));\r
+ if (*p) *s = 0;\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_letter(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ do {\r
+ *s++ = *p++;\r
+ } while (*p && pp_is_ident(*p));\r
+ if (*p) *s = 0;\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_directive(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ ++p; // skip #\r
+\r
+ // directive name\r
+ do {\r
+ *s++ = *p++;\r
+ } while (pp_is_ident(*p));\r
+ *s = 0;\r
+\r
+ // #include\r
+ if (!strcmp(pp_tok, "include"))\r
+ {\r
+ // boogly boogly boogly!\r
+ int l = 0;\r
+ char *e = NULL;\r
+\r
+ //printf("#include detected \n");\r
+\r
+ // any whitespace after 'include'\r
+ p = pp_skipwhite(p);\r
+\r
+ // skip, but don't expect, a "\r
+ if ('\"' == *p) ++p;\r
+\r
+ // grab the filename\r
+ e = pp_tok;\r
+ while (*p && '\"' != *p)\r
+ *e++ = *p++;\r
+ // if we didn't hit eof...?\r
+ if (*p)\r
+ {\r
+ // zero term filename\r
+ *e = 0;\r
+ // skip closing "\r
+ ++p;\r
+\r
+ last_filename=cur_filename; // <aen, may 14>\r
+ l = pp_line; // save\r
+ Process(pp_tok);\r
+ pp_line = l; // restore\r
+ cur_filename=last_filename; // <aen, may 14>\r
+ // reset file marker\r
+ pp_file_marker();\r
+\r
+ // disregard rest of line\r
+ while (*p && '\n' != *p)\r
+ ++p;\r
+ // if we didn't hit eof...?\r
+ if (*p)\r
+ {\r
+ // skip newline char\r
+ ++p;\r
+\r
+ // update line\r
+ ++pp_line;\r
+ pp_line_marker();\r
+\r
+ // dump null token... writes nothing i think...\r
+ pp_tok[0]='\0';\r
+ }\r
+ //else pp_error("screw you!");\r
+ }\r
+ }\r
+ // #define\r
+ else if (!strcmp(pp_tok, "define"))\r
+ {\r
+ char *e = NULL;\r
+ char sym[256];\r
+ char resolve[1024];\r
+\r
+ // find start of symbol\r
+ while (' ' == *p || '\t' == *p)\r
+ ++p;\r
+\r
+ // parse symbol\r
+ e = sym;\r
+ while (pp_is_ident(*p))\r
+ { *e++ = *p++; }\r
+ *e = 0;\r
+\r
+ // check for duplicate #defines\r
+ if (pp_num_defs)\r
+ {\r
+ int i;\r
+ int z = strlen(sym);\r
+ for (i=0; i<pp_num_defs; i++)\r
+ {\r
+ if (z == pp_defarr[i].sym_len)\r
+ {\r
+ if (!stricmp(pp_defarr[i].sym, sym))\r
+ pp_error("duplicate #define symbol");\r
+ }\r
+ }\r
+ }\r
+\r
+ // find start of argument list (if any), or resolve\r
+ while (' ' == *p || '\t' == *p)\r
+ ++p;\r
+\r
+ // found argument list; discard for now\r
+ if ('(' == *p)\r
+ {\r
+ ++p;\r
+ while (')' != *p)\r
+ ++p;\r
+ ++p;\r
+\r
+ // find start of resolve\r
+ while (' ' == *p || '\t' == *p)\r
+ ++p;\r
+ }\r
+\r
+ pp_last_delim = 1;\r
+ e = resolve;\r
+ // parse resolve\r
+ while ('\n' != *p)\r
+ {\r
+ // whitespace\r
+ if (' ' == *p || '\t' == *p)\r
+ {\r
+ do {\r
+ ++p;\r
+ } while (' ' == *p || '\t' == *p);\r
+ }\r
+\r
+ // continuation? (multiple lines)\r
+ if ('\\' == *p)\r
+ {\r
+ ++p;\r
+ while (*p && '\n' != *p)\r
+ ++p;\r
+ // if not eof\r
+ if (*p)\r
+ {\r
+ ++p;\r
+\r
+ ++pp_line;\r
+ pp_line_marker();\r
+ }\r
+ continue;\r
+ }\r
+\r
+ // special case for 'x' chars\r
+ if ('\'' == *p)\r
+ {\r
+ *e++ = *p++;\r
+ do {\r
+ *e++ = *p++;\r
+ } while (*p && '\'' != *p);\r
+ *e++ = *p++;\r
+\r
+ pp_last_delim = 1;\r
+ continue;\r
+ }\r
+\r
+ // special case for string literals\r
+ if ('\"' == *p)\r
+ {\r
+ do {\r
+ *e++ = *p++;\r
+ } while (*p && '\"' != *p);\r
+ if (*p)\r
+ *e++ = *p++;\r
+\r
+ pp_last_delim = 1;\r
+ continue;\r
+ }\r
+\r
+ // this is just the preprocessor, so i don't need\r
+ // to get punctuation or digits in their correct form, i just\r
+ // have to copy them over as i see them.\r
+ if (pp_is_punc(*p) || pp_is_digit(*p))\r
+ {\r
+ do {\r
+ // d'oh!\r
+ if ('\'' == *p || '\\' == *p)\r
+ break;\r
+\r
+ *e++ = *p++;\r
+ } while (pp_is_punc(*p) || pp_is_digit(*p));\r
+\r
+ pp_last_delim = 1;\r
+ continue;\r
+ }\r
+\r
+ if (pp_is_letter(*p))\r
+ {\r
+ if (!pp_last_delim)\r
+ *e++ = ' ';\r
+\r
+ do {\r
+ *e++ = *p++;\r
+ } while (pp_is_ident(*p));\r
+\r
+ pp_last_delim = 0;\r
+ continue;\r
+ }\r
+\r
+ ++p; // unknown?\r
+ }\r
+ *e = 0;\r
+\r
+ // update define list\r
+ pp_def_add(sym, resolve);\r
+\r
+ pp_tok[0]='\0';\r
+ }\r
+ // #???\r
+ else pp_error("unknown preprocessor directive");\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token_quote(char *p)\r
+{\r
+ char *s = pp_tok;\r
+\r
+ *s++ = *p++;\r
+\r
+ while (*p && '\"' != *p)\r
+ *s++ = *p++;\r
+ // if not eof\r
+ if (*p)\r
+ {\r
+ *s++ = *p++;\r
+ *s = 0;\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+char *pp_token(char *p)\r
+{\r
+ p = pp_skipwhite(p);\r
+ if (!*p)\r
+ {\r
+ pp_tok[0] = '\0'; // gotta have this! (fixes last sym replication bug)\r
+ return p;\r
+ }\r
+\r
+ pp_toktype = pp_chr_table[(int) *p];\r
+\r
+ switch (pp_toktype)\r
+ {\r
+ case PP_PUNC: p = pp_token_punc(p); break;\r
+ case PP_DIGIT: p = pp_token_digit(p); break;\r
+ case PP_LETTER: p = pp_token_letter(p); break;\r
+\r
+ case PP_QUOTE: p = pp_token_quote(p); break;\r
+\r
+ case PP_DIRECTIVE:\r
+ p = pp_token_directive(p);\r
+ break;\r
+\r
+ case PP_EOF:\r
+ break;\r
+\r
+ case PP_ERROR:\r
+ pp_line_error("unknown character <%c:%i>", *p, *p);\r
+ }\r
+\r
+ return p;\r
+}\r
+\r
+void Process(char *filename)\r
+{\r
+ char *s = NULL;\r
+ pp_include *ppi = NULL;\r
+\r
+ // starts fresh for each #include file\r
+ pp_line = 1;\r
+ //pp_line_marker(); // hmm... did this kill the wat ver? i forget..\r
+\r
+ // push file\r
+ ppi = pp_include_add(filename);\r
+ s = ppi->data;\r
+\r
+ pp_file_marker();\r
+\r
+ pp_last_delim = 1;\r
+ s = pp_token(s);\r
+\r
+ // loop until we hit an EOF token\r
+ while (*s && PP_EOF != pp_toktype)\r
+ {\r
+ // for compactor; this is absolutely required for the parsing to\r
+ // work correctly for hex numbers\r
+ if (PP_LETTER == pp_toktype || PP_DIGIT == pp_toktype)\r
+ {\r
+ if (!pp_last_delim)\r
+ fputc(' ', pp_out);\r
+ }\r
+\r
+ if (pp_num_defs)\r
+ {\r
+ // #define replacement\r
+ if (PP_LETTER == pp_toktype)\r
+ {\r
+ pp_def *ppd = NULL;\r
+ int pp_token_len = strlen(pp_tok);\r
+ int i = 0;\r
+\r
+ for (i=0; i<pp_num_defs; i++)\r
+ {\r
+ ppd = pp_defarr + i;\r
+ // first see if the lengths match, for possible quick discard\r
+ if (ppd->sym_len == pp_token_len)\r
+ {\r
+ // lengths match, compare bytes\r
+ if (!stricmp(pp_tok, ppd->sym))\r
+ {\r
+ // match! overwrite token with resolve\r
+ memcpy(pp_tok, ppd->resolve, strlen(ppd->resolve)+1);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // write whatever we got\r
+ fwrite(pp_tok, 1, strlen(pp_tok), pp_out);\r
+\r
+ pp_last_delim = (PP_LETTER != pp_toktype);\r
+ s = pp_token(s);\r
+ }\r
+\r
+ // pop file\r
+ free(ppi->data);\r
+ free(ppi->filename);\r
+ --pp_num_includes;\r
+ //pp_icur = &pp_incarr[pp_num_includes]; // oops! :-)\r
+\r
+ pp_total_lines += pp_line;\r
+}\r
+\r
+void pp_dump_output()\r
+{\r
+ char strx[1024];\r
+\r
+ sprintf(strx, "copy vcctemp.$$$ vcc%i.$$$", pp_tempct);\r
+ ++pp_tempct;\r
+\r
+ system(strx);\r
+}\r
+\r
+void PreProcess(char *filename)\r
+{\r
+ pp_num_includes = 0;\r
+ init_pp_chr_table();\r
+\r
+ pp_out = fopen("VCCTEMP.$$$", "wb");\r
+ if (!pp_out) pp_error("unable to open VCCTEMP.$$$");\r
+\r
+ Process(filename);\r
+\r
+ fclose(pp_out);\r
+\r
+ // dump preproc output?\r
+ if (0 != pp_dump)\r
+ pp_dump_output();\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__PREPROC_INC)\r
+#define __PREPROC_INC\r
+\r
+extern void PreProcess(char *fname);\r
+extern void Process(char *fname);\r
+\r
+#endif // __PREPROC_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+// ³ The VergeC Compiler ³\r
+// ³ Copyright (C)1998 BJ Eirich (aka vecna) ³\r
+// ³ Main module ³\r
+// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+#define VERSION "2.01c"\r
+\r
+#ifdef __DJGPP__\r
+#define BUILD_TAG "DJGPP V2\0"\r
+#endif\r
+\r
+#ifdef __WATCOMC__\r
+#define BUILD_TAG "Watcom 11.0\0"\r
+#endif\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+\r
+#include "compile.h"\r
+#include "lexical.h"\r
+\r
+extern int pp_dump;\r
+extern int pp_nomark;\r
+\r
+// ================================= Data ====================================\r
+\r
+char outmode, cmode;\r
+char fname[80];\r
+char quiet, verbose;\r
+char *strbuf;\r
+int locate=0;\r
+\r
+// -- locals --\r
+\r
+//FILE *f;\r
+//int i;\r
+//struct find_t *ft;\r
+\r
+// ================================= Code ====================================\r
+\r
+void dprint(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ if (quiet) return;\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ printf ("%s \n", string);\r
+}\r
+\r
+void vprint(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ if (!verbose) return;\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ printf ("%s \n", string);\r
+}\r
+\r
+void err(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ if (quiet)\r
+ {\r
+ FILE *efile = fopen("ERROR.TXT", "w");\r
+\r
+ fprintf(efile, "%s \n", string);\r
+ fclose(efile);\r
+ }\r
+ else\r
+ {\r
+ printf("%s \n", string);\r
+ }\r
+\r
+ remove("vcctemp.$$$");\r
+ exit(-1);\r
+}\r
+\r
+void vcerr(char *message, ...)\r
+{\r
+ va_list lst;\r
+ char string[1024];\r
+\r
+ // compose message\r
+ va_start (lst, message);\r
+ vsprintf (string, message, lst);\r
+ va_end (lst);\r
+\r
+ err("%s(%d) %s", source_file, lines, string);\r
+}\r
+\r
+void vcc_compile_mode_map(char *filename)\r
+{\r
+ FILE *o=0;\r
+ FILE *f=0;\r
+ char *x=0;\r
+ int z=0;\r
+\r
+ x = filename;\r
+ while ('.' != *x) ++x;\r
+ *x = 0;\r
+\r
+ CompileMAP(filename);\r
+\r
+ sprintf(strbuf, "%s.map", filename);\r
+ f = fopen(strbuf, "rb+");\r
+ if (!f)\r
+ err("unable to open %s.", strbuf);\r
+\r
+ fread(strbuf, 1, 6, f);\r
+ fread(&z, 1, 4, f);\r
+ fseek(f, 0, 0);\r
+\r
+ o = fopen("outtemp.$$$", "wb");\r
+ if (!o)\r
+ err("unable to open outtemp.$$$");\r
+ x = (char *) malloc(z);\r
+ fread(x, 1, z, f);\r
+ fwrite(x, 1, z, o);\r
+ fclose(f);\r
+\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(&functbl, 4, mfuncs, o);\r
+ mfuncs = (int) code - (int) outbuf;\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(outbuf, 1, code-outbuf, o);\r
+ fclose(o);\r
+\r
+ // remove existing map file\r
+ sprintf(strbuf,"%s.map", filename); remove(strbuf);\r
+ // rename temp file to map file name\r
+ rename("outtemp.$$$", strbuf);\r
+}\r
+\r
+void vcc_compile_mode_system()\r
+{\r
+ FILE *dump=0;\r
+\r
+ CompileSystem();\r
+\r
+ dump = fopen("system.vcs", "wb");\r
+ if (!dump) err("unable to open system.vcs");\r
+\r
+ fwrite(&numfuncs, 1, 4, dump);\r
+ fwrite(&curstartofs, 1, 4, dump);\r
+ fwrite(&sstartofs, 1, 4, dump);\r
+ fwrite(outbuf, 1, code-outbuf, dump);\r
+ fputc(255, dump);\r
+\r
+ fclose(dump);\r
+}\r
+\r
+void vcc_compile_mode_all()\r
+{\r
+ FILE *o=0;\r
+ FILE *f=0;\r
+ char *x=0;\r
+ int z=0;\r
+ struct find_t fileinfo;\r
+\r
+ CompileSystem();\r
+ f=fopen("system.vcs","wb");\r
+ fwrite(&numfuncs, 1, 4, f);\r
+ fwrite(&curstartofs, 1, 4, f);\r
+ fwrite(&sstartofs, 1, 4, f);\r
+ fwrite(outbuf, 1, code-outbuf, f);\r
+ fputc(255, f);\r
+ fclose(f);\r
+ free(source);\r
+ free(outbuf);\r
+\r
+ if (_dos_findfirst("*.MAP", _A_NORMAL, &fileinfo))\r
+ err("No mapfiles found.");\r
+\r
+ while (1)\r
+ {\r
+ int i;\r
+ memcpy(fname, fileinfo.name, 13);\r
+\r
+ i=0;\r
+ while (fname[i]!='.') i++;\r
+ fname[i]=0;\r
+\r
+ strlwr(fname);\r
+ mfuncs=0;\r
+\r
+ CompileMAP(fname);\r
+\r
+ sprintf(strbuf,"%s.map", fname);\r
+ f=fopen(strbuf,"rb+");\r
+ fread(strbuf, 1, 6, f);\r
+ fread(&z, 1, 4, f);\r
+ fseek(f, 0, 0);\r
+\r
+ o=fopen("outtemp.$$$","wb");\r
+ x=(char *) malloc(z);\r
+ fread(x, 1, z, f);\r
+ fwrite(x, 1, z, o);\r
+ fclose(f);\r
+ free(x);\r
+\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(&functbl, 4, mfuncs, o);\r
+ mfuncs=(int) code - (int) outbuf;\r
+ fwrite(&mfuncs, 1, 4, o);\r
+ fwrite(outbuf, 1, code-outbuf, o);\r
+ fclose(o);\r
+\r
+ sprintf(strbuf,"%s.map", fname);\r
+ remove(strbuf);\r
+ rename("outtemp.$$$",strbuf);\r
+\r
+ free(source);\r
+ free(outbuf);\r
+\r
+ if (!_dos_findnext(&fileinfo))\r
+ continue;\r
+\r
+ break;\r
+ }\r
+\r
+ dprint("%i total VC lines compiled.", tlines);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ int loop = 0;\r
+ char c = 0;\r
+ char *argstr = 0;\r
+\r
+ strbuf= (char *) malloc(2000);\r
+\r
+ cmode = 0;\r
+ pp_dump = 0;\r
+ pp_nomark = 0;\r
+\r
+ for (loop = 1; loop < argc; loop++)\r
+ {\r
+ // point to argument string\r
+ argstr = &loop[argv][0];\r
+\r
+ c = *argstr;\r
+ // skip leading punctuators, if any\r
+ if ('-' == c || '+' == c || '/' == c)\r
+ ++argstr;\r
+\r
+ if (!stricmp(argstr, "v"))\r
+ { verbose = 1; continue; }\r
+\r
+ if (!stricmp(argstr, "q"))\r
+ { quiet = 1; continue; }\r
+\r
+ // compile SYSTEM.VC only\r
+ if (!stricmp(argstr, "system"))\r
+ { cmode = 2; continue; }\r
+\r
+ // compile all available .VC files\r
+ if (!stricmp(argstr, "all"))\r
+ { cmode = 3; continue; }\r
+\r
+ // disable line/#include markers\r
+ if (!stricmp(argstr, "ppnomark"))\r
+ { pp_nomark = 1; continue; }\r
+\r
+ // dump preprocessor output to temp files\r
+ if (!stricmp(argstr, "ppdump"))\r
+ { pp_dump = 1; continue; }\r
+\r
+ // debug locator option\r
+ if ('.' == *argstr)\r
+ { locate = atoi(argstr+1); continue; }\r
+\r
+ // at this point, the argument is assumed to be a file\r
+\r
+ if (strlen(argstr) > 79)\r
+ { printf("filename '%s' too long!", argstr); argstr[79] = 0; }\r
+ memcpy(fname, argstr, strlen(argstr)+1);\r
+\r
+ cmode = 1;\r
+ continue;\r
+ }\r
+\r
+ dprint("vcc v.%s Copyright (C)1998 Benjamin Eirich. All rights reserved.", VERSION);\r
+ vprint("%s build %s on %s %s", BUILD_TAG, __FILE__, __DATE__, __TIME__);\r
+\r
+ if (!cmode)\r
+ err("No input files.");\r
+\r
+ InitCompileSystem();\r
+\r
+ switch (cmode)\r
+ {\r
+ case 1: vcc_compile_mode_map(fname); break;\r
+ case 2: vcc_compile_mode_system(); break;\r
+ case 3: vcc_compile_mode_all(); break;\r
+\r
+ default: err("you have now entered the twilight zone.");\r
+ }\r
+\r
+ remove("vcctemp.$$$");\r
+ remove("ERROR.TXT");\r
+\r
+ return 0;\r
+}\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#if !defined(__VCC_INC)\r
+#define __VCC_INC\r
+\r
+#define QUIET 0\r
+#define DEFAULT 1\r
+#define VERBOSE 2\r
+\r
+#define CONTROL 1\r
+#define DIGIT 2\r
+#define IDENTIFIER 3\r
+#define RESERVED 4\r
+#define FUNCTION 5\r
+\r
+extern char *strbuf;\r
+extern int locate;\r
+\r
+extern void err(char *message, ...);\r
+extern void vcerr(char *message, ...);\r
+extern void dprint(char *message, ...);\r
+extern void vprint(char *message, ...);\r
+\r
+#endif // __VCC_INC\r
--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+// We never use zero as a tag. This makes it easier to track down misbehaving\r
+// VC code, since zero is commonly come-by when going off into uncharted\r
+// depths of memory.\r
+\r
+#define ERROR 0\r
+\r
+// Opcode values.\r
+\r
+#define opEXEC_STDLIB 1\r
+#define opEXEC_LOCALFUNC 2\r
+#define opEXEC_EXTERNFUNC 3\r
+#define opIF 4\r
+#define opELSE 5\r
+#define opGOTO 6\r
+#define opSWITCH 7\r
+#define opCASE 8\r
+#define opRETURN 9\r
+#define opASSIGN 10\r
+#define opSETRETVAL 11\r
+#define opSETLOCALSTACK 12\r
+\r
+// Operand types.\r
+\r
+#define op_IMMEDIATE 1\r
+#define op_HVAR0 2\r
+#define op_HVAR1 3\r
+#define op_UVAR 4\r
+#define op_UVARRAY 5\r
+#define op_LVAR 6\r
+#define op_BFUNC 7\r
+#define op_UFUNC 8\r
+#define op_GROUP 9\r
+#define op_STRING 10\r
+#define op_SARRAY 11\r
+#define op_SLOCAL 12\r
+\r
+// Variable types.\r
+\r
+#define v_IMMEDIATE 1 // is this necessary?\r
+#define v_CHAR 2\r
+#define v_PTR 3\r
+#define v_INT 4\r
+\r
+// IF relational operators.\r
+\r
+#define i_ZERO 1\r
+#define i_NONZERO 2\r
+#define i_EQUALTO 3\r
+#define i_NOTEQUAL 4\r
+#define i_GREATERTHAN 5\r
+#define i_LESSTHAN 6\r
+#define i_GREATERTHANOREQUAL 7\r
+#define i_LESSTHANOREQUAL 8\r
+#define i_GROUP 9\r
+#define i_UNGROUP 10\r
+#define i_AND 11\r
+#define i_OR 12\r
+\r
+// Assignment operators.\r
+\r
+#define a_SET 1\r
+#define a_INC 2\r
+#define a_DEC 3\r
+#define a_INCSET 4\r
+#define a_DECSET 5\r
+#define a_MULTSET 6\r
+#define a_DIVSET 7\r
+\r
+// Operand combination operators.\r
+\r
+#define op_ADD 1\r
+#define op_SUB 2\r
+#define op_MULT 3\r
+#define op_DIV 4\r
+#define op_MOD 5\r
+#define op_SHL 6\r
+#define op_SHR 7\r
+#define op_AND 8\r
+#define op_OR 9\r
+#define op_XOR 10\r
+#define op_END 11\r
+\r
+// String components\r
+\r
+#define s_IMMEDIATE 1\r
+#define s_GLOBAL 2\r
+#define s_ARRAY 3\r
+#define s_NUMSTR 4\r
+#define s_LEFT 5\r
+#define s_RIGHT 6\r
+#define s_MID 7\r
+#define s_LOCAL 8\r
+#define s_ADD 9\r
+#define s_CHR 10\r
+#define s_END 11\r
--- /dev/null
+GNU GENERAL PUBLIC LICENSE\r
+Version 2, June 1991 \r
+\r
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. \r
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\r
+\r
+Everyone is permitted to copy and distribute verbatim copies\r
+of this license document, but changing it is not allowed.\r
+Preamble\r
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. \r
+\r
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. \r
+\r
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. \r
+\r
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. \r
+\r
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. \r
+\r
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. \r
+\r
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. \r
+\r
+The precise terms and conditions for copying, distribution and modification follow. \r
+\r
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". \r
+\r
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. \r
+\r
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. \r
+\r
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. \r
+\r
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: \r
+\r
+\r
+a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \r
+\r
+b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. \r
+\r
+c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) \r
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. \r
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. \r
+\r
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. \r
+\r
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: \r
+\r
+a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \r
+\r
+b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \r
+\r
+c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) \r
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. \r
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. \r
+\r
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \r
+\r
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. \r
+\r
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. \r
+\r
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. \r
+\r
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. \r
+\r
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. \r
+\r
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \r
+\r
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. \r
+\r
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. \r
+\r
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. \r
+\r
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. \r
+\r
+NO WARRANTY\r
+\r
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \r
+\r
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \r
+\r
+\r
+END OF TERMS AND CONDITIONS\r
--- /dev/null
+log\r
+startmap start.map\r
+vidmode 320 240\r
+sound_device 0\r
+end\r
--- /dev/null
+V2 startup. Logfile initialized. \r
+Sys: Initializing keyboard handler.... OK \r
+Sys: Initializing timer. Set 100hz.... OK \r
+Sys: Initializing CD Audio.... OK \r
+Sys: Initializing music system.... OK \r
+Sys: Initializing 320x240 (ModeX, planar).... OK \r
+Initialize console.... OK \r
+Initializing VC interpreter \r
+system vclib init: 0 funcs, 0 ints (0 bytes), 0 strings (0 bytes) \r
+Loading MAP start.map. [1] ... OK \r
--- /dev/null
+event //autoexec\r
+{\r
+ palettemorph(0,0,0,0,64); //get proper palette going\r
+ entityspawn(4,4,"vecna.chr"); //first chr will be index 0\r
+ setplayer(0); //set the control focus to entity index 0\r
+}\r
+ \r
--- /dev/null
+chrconv.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: converts v1 chr -> v2 chr\r
+---\r
+Chrconv is a remarkably simple utility, and that is a shame, because eventually you won't use it much at all. But initially it will be of great value to everyone, because it converts from old v1 chrs to new v2 chrs.\r
+\r
+The v2 chr it creates will emulate the animation behavior of a v1 exactly, so it should look and operate like you're used to. This is useful, because writing animation strings and handling odd-shaped chrs may not be something that appeals to you just yet. For example, the default animation string used by chrconv for walking north is:F16W10F17W10F16W10F15W10F18W10F19W10F18W10F15W10.\r
+\r
+To use chrconv, simply execute it. It will ask for the filename of the source v1 chr, and will convert it to v2 format. NOTE: it will overwrite the old chr, so you may want to back it up first.\r
+\r
+enjoy!
\ No newline at end of file
--- /dev/null
+chrmak.exe\r
+the utility with bloated code perpetrated by aen (aen@verge-rpg.com for hate mail)\r
+documentation\r
+by zeromus 5.8.99\r
+zermous@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 chr from pcx file\r
+---\r
+You'll use this bad boy a lot, unless you have one of those newfangled graphical chr editors. What we do here is have a character ready in the standard pcx-graphics format (that is, with a one-pixel buffer between frames), and give it to chrmak, along with a text file describing what characteristics the output v2 chr should have.\r
+\r
+to run chrmak, simply execute chrmak with the makefile, with extension (ex: vecna.mak) as the first and only argument. (ex: "chrmak vecna.mak")\r
+\r
+The characteristics file is technically called a make file, or .mak. it containst several variables, and what they should be. for example:\r
+\r
+/* comment */\r
+pcx_name=rath; //comment\r
+chr_name=rath;\r
+\r
+these variables can be scattered around anywhere in the mak file, so long as they have a semicolon after each command. you can stick comments anywhere like a c or vc file. here is a list of all the variables you need to set in the make file, what they are, and their typical values. In most cases, however, you should be able to just replace the values found in the samples rath.mak and vecna.mak with your own.\r
+\r
+---\r
+\r
+**pcx_name** the file name of the source pcx file, sans extension. note in the above examples or in the sampel .mak files it is not pcx_name = rath.pcx, only rath.\r
+**chr_name** the filename, sans extension, of the chr file to output. same as above in all other respects.\r
+\r
+**frame_w** the width of each frame of the chr (DEFAULT 16)\r
+**frame_h** the height of each frame (DEFAULT 32)\r
+\r
+**hot_x** the x-coord of the chr's hotspot. See appendix A for info on chr hotspots. (DEFAULT 0)\r
+**hot_y** the same, but y-coord (DEFAULT 16)\r
+**hot_w** the width of the obstructing region of the hotspot. (DEFAULT 16)\r
+**hot_h** the height of the obstructing region of the hotspot. (DEFAULT 16)\r
+\r
+**per_row** the number of frames per row in the pcx file. in old v1 chr/pcx files, this was 5. (DEFAULT 5)\r
+**total frames** total number of frames in the pcx file. (DEFAULT 20)\r
+\r
+**lidle** the frame to show when the chr is idling, facing the left (DEFAULT 10)\r
+**ridle** the frame to show when the chr is idling, facing the right (DEFAULT 15)\r
+**uidle** the frame to show when the chr is idling, facing up (DEFAULT 5)\r
+**didle** the frame to show when the chr is idling, facing down (DEFAULT 0)\r
+\r
+**lscript** the animation script for when the chr moves to the left. See appendix B for discussion of animation scripts. (DEFAULT F10W10F11W10F12W10F11W10F10W10F13W10F14W10F13W10)\r
+**rscript** the animation script for when the chr moves to the right. (DEFAULT F15W10F16W10F17W10F16W10F15W10F18W10F19W10F18W10)\r
+**uscript** the animation script for when the chr moves up (DEFAULT F5W10F6W10F7W10F6W10F5W10F8W10F9W10F8W10)\r
+**dscript** the animation script for when the chr moves down (DEFAULT F0W10F1W10F2W10F2W10F0W10F3W10F4W10F3W10)\r
+\r
+---\r
+\r
+APPENDIX A: Hotspots\r
+\r
+If a chr is located at coordinates (x,y) on the screen, then the pixel under the hotspot on the chr will be drawn at (x,y). \r
+\r
+You may think--"I tell a chr to go to (5,4) on the screen... but where exactly does it go? (4,4) from the middle, the left edge, or what?"\r
+Imagine three scenarios: a 4x4 sprite with the hotspot at top left, bottom left, and middle left, respectively:\r
+\r
+ Top Left Bottom Left Middle Left\r
+0123456789ABCDEF 0123456789ABCDEF 0123456789ABCEDEF\r
+1 1 **** 1\r
+2 +---hotspot 2 **** 2 ****\r
+3 \|/ 3 **** 3 \****\r
+4 @*** 4 @*** 4 +--@***\r
+5 **** 5 /|\ 5 | /****\r
+6 **** 6 +---hotspot 6 |\r
+7 **** 7 7 +---hotspot\r
+8 8 8\r
+\r
+So you can see how the hotspot determines how the sprite is oriented, relative to its current screen position.\r
+\r
+The default hotspot, (and its equivalent in v1) is at (0,16). That is, 0 to the right and 16 down from the upper-left corner of the sprite. Remember, default chr size is 16x32, and on computer, the (+,+) quadrant is quadrant IV. In other words\r
+\r
+ -32\r
+ -24\r
+ -16\r
+ -8\r
+-16 -12 -8 -4 0 4 8 12 16\r
+ 8 * * * *\r
+ 16 * * * * <--- sprite goes there. \r
+ 24 @ * * * @ is where hotspot would be\r
+ 32 * * * *\r
+\r
+Hotspots also have an obstruction width and height. This is the area of the chr that touches the ground, and cannot walk over things. In your game, you may want your head to be drawn on top of a wall, if your feet are against the bottom of the wall, right? But you don't want your feet drawn on top of the wall.\r
+\r
++----------------------+\r
+| |\r
+| |\r
+| |\r
+| |\r
+| +---+ |\r
+| |***| |\r
++------|@@@|-----------+\r
+ +---+\r
+\r
+The messy area is the chr; the @@@, and the --- beneath it, would be OBSTRUCTIVE. If the player tried to walk up, he couldnt--you would be walking into the wall. The *** and the --- above it would not be obstructive.\r
+\r
+Obstructive areas are defined by declaring their width and height, based from the chr's hotspot. the default values, a width and height of 16, would count over 16 and down 16 from the hotspot, effectively making the bottom 16x16 square of the 16x32 chr obstructive.\r
+\r
+Final example:\r
+A 32x64 giant might be defined like this:\r
+\r
+...\r
+hot_x=8;\r
+hot_y=48;\r
+hot_w=16;\r
+hot_h=16;\r
+...\r
+\r
+---\r
+\r
+APPENDIX B: Animation scripts\r
+\r
+Animation scripts are made of a string of no more than 255 characters. This string can contain any combination of COMMAND CODES, of which there are two.\r
+\r
+The two COMMAND CODES are F and W.\r
+\r
+**F** sets the current frame that should be shown. So, if you want your animation, when walking to go from frame 12 to 15, you would make the script: "F12F13F14F15F14F13F12". The F can have any number of digits after it, so you don't have to do F03F05, etc.. you can just do F3F5.\r
+\r
+**W** makes the animation string wait the specified number of milliseconds. If you peek at the default animation strings mentioned a ways up, you'll see that there is a Wxx between each frame. This pauses the frame so you can see it, effectively slowing the animation down. In fact, the animation we just maed an example of, "F12F13F14F15F14F13F12", would g oby *waaay* too fast. Now that we know the W command we can fix it: "F12W10F13W10F14W10F15W10F14W10F13W10F12W10".
\ No newline at end of file
--- /dev/null
+pack.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 pakfile\r
+---\r
+v2 enjoys its own built-in pakfile system. v2 can use files in any number of pakfiles at the same time it can read files from your computer's regular directory structure. This allows for simplified distribution and management of v2 games, as well as adding a small measure of security to the data you worked so hard to create for your game--it will be a pain for losers to remove (read: rip) data from pakfiles, although we make no gurantees that your data is safe. This should help the situation some.\r
+\r
+To create a packfile, pack.exe takes a makefile of the following format:\r
+\r
+--- <--cut below this line :)\r
+pakfile_to_create.vrg\r
+number_of_files\r
+file_name_1 flag_extrractable flag_overrideable\r
+file_name_2 flag_extrractable flag_overrideable\r
+file_name_3 flag_extrractable flag_overrideable\r
+---\r
+\r
+Here it is with sample data.\r
+\r
+---\r
+test.vrg\r
+3\r
+pack.c 0 0\r
+test.mak 1 0\r
+test.obj 0 1\r
+---\r
+\r
+This would create test.vrg with three files: pack.c, neither overrideable nor extractable, test.mak, extractable, but not overrideable, and test.obj, only overrideable.\r
+\r
+Extractable means that the file will be extracted by unpack.exe. Files you want to keep secret should have a 0 for this. \r
+\r
+Overrideable files will be overridden by a file of the same name in the game directory. That means, if there is a file in the game directory, it will use that one instead of the one in the pakfile. Otherwise, the copy in the pakfile will always be used. You'll usually want this set to 1, as it facilitates patches, etc. For example, if battle.map had a bug in it, you could just distribute a copy of the corrected battle.map for users to chunk in the game directory, and v2 would use the corrected copy instead.\r
+\r
--- /dev/null
+pcx2fnt.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates v2 font file from pcx\r
+---\r
+If you need to make a custom font for your game, you're in luck: pcx2fnt is very easy to use. Simply run it. It will ask you for an input pcx file, which must be in the correct format (described below), the .fnt file to output, the height and width of the characters, and the number of subset fonts.\r
+\r
+The pcx format is simple: each font must be surrounded by a 1 pixel wide pad, with 20 characters per row. The characters of the font must be in the correct order for v2 to print strings correctly. The best thing you can do to figure out this format is look at the two examples. Everything will be perfectly clear then.\r
+\r
+Subsets are what you'll see if you look in font02b.pcx. Each font file can have many subsets potentially. These are most often used for different colors of letters, although they *could* be completely different fonts. The characters would have to be the same size, in that case. This explains why the subset system was designed for, and we have only used it to, make different colors of text.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+trans.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: creates translucency table for use in v2\r
+---\r
+If you want to use translucency effects in v2, you'll need to have the appropriate trans.tbl file. This program will make it.\r
+\r
+Game palettes, unless you're elite like snes programmers, should be made up of a number of gradients. Trans.exe takes advantage of this by accepting a makefile (for amusement called Palette Definition File, conveniently extensioned .pdf. Our extension makes more sense than Adobe's, though.) consisting of a list of gradients found in the palette. This unique method of generating a translucency table does not need the actual palette--it only needs to know which indexes in the palette start and finish each gradient.\r
+\r
+The .pdf format looks like this (the x spots are where you'll fill in numbers):\r
+\r
+GRADIENTS x_num_times\r
+STARTS x ENDS x ENDSPAN\r
+STARTS x ENDS x ENDSPAN <--x_num_time entries\r
+STARTS x ENDS x ENDSPAN\r
+... etc\r
+\r
+With sample data:\r
+\r
+gradients 3\r
+starts 0 ends 128 endspan\r
+starts 129 ends 240 inverse endspan\r
+starts 141 ends 254 endspan\r
+\r
+Whats that inverse, stuck in there, you say? That just indicates that instead of gradient going from dark to light it goes from light to dark (that *is* what inverse means).\r
+\r
+Inspect the sample files for more info.\r
+\r
+That is all.
\ No newline at end of file
--- /dev/null
+unpack.exe\r
+documentation\r
+by zeromus 5.8.99\r
+zeromus@verge-rpg.com\r
+(be sure word wrap is on)\r
+---\r
+USE: extracts files from v2 pakfile\r
+---\r
+It doesnt get any better than this. type unpack followed by the name of the packfile you want to unpack. if you can't get that right, unpack.exe will give you even more explicit instructions. unpack.exe will then dump all the files contained in the pakfile with their extractable flags set into the directory you ran unpack.exe from.\r
+\r
+Use this only if the author of a demo/game gives you permission to use his stuff, or else we'll hunt you down and break your legs.\r
+\r
+That is all.
\ No newline at end of file
c2e.convert_special: 0
e2c.convert_num: 0
openfiles: /dos/z/16/doc/project.txt:60:0:0:
-openfiles: /dos/z/16/scroll.c:9765:9708:0:
+openfiles: /dos/z/16/scroll.c:1853:1382:1:
openfiles: /dos/z/16/modex16.c:6319:6141:0:
openfiles: /dos/z/16/modex16.h:1057:344:0:
openfiles: /dos/z/16/pcxtest.c:795:442:0:
openfiles: /dos/z/16/lib/lib_head.h:1738:1443:0:
openfiles: /dos/z/16/README:744:0:0:
openfiles: /dos/z/16/makefile:181:0:0:
-openfiles: /dos/z/keen-src/id_mm.c:1835:1591:0:
-openfiles: /dos/z/keen-src/id_mm.h:0:0:0:
-openfiles: /dos/z/keen-src/id_rf.c:46629:47612:1:
+openfiles: /dos/z/keen-src/id_mm.c:1835:14849:0:
+openfiles: /dos/z/keen-src/id_mm.h:0:1424:0:
+openfiles: /dos/z/keen-src/id_rf.c:46629:47657:0:
openfiles: /dos/z/keen-src/id_rf.h:0:0:0:
-openfiles: /dos/z/keen-src/id_rf_a.asm:1555:3465:0:
+openfiles: /dos/z/keen-src/id_rf_a.asm:3987:3375:0:
+openfiles: /dos/z/16/types.h:154:0:0:
snr_recursion_level: 0
convertcolumn_horizontally: 0
adv_open_matchname: 0
default_mime_type: text/plain
e2c.convert_xml: 1
c2e.convert_iso: 0
-opendir: file:///dos/z/keen-src
+opendir: file:///dos/z/16
wrap_text_default: 0
bookmarks_filename_mode: 1
-ssearch_text: cols
+ssearch_text: mapDrawTile
snr_casesens: 1
view_blocks: 1
name: project 16
e2c.convert_iso: 0
ssearch_casesens: 0
charmap_block: 1
-recent_files: file:///dos/z/16/16/modex16/MODEX16.H
recent_files: file:///dos/z/16/16/modex16/MODEX16.C
recent_files: file:///dos/z/4x4_16/w_modex/MODEX.CPP
recent_files: file:///dos/z/16/16/TYPES.H
recent_files: file:///dos/z/16/16/modex16/dos_kb.h
recent_files: file:///dos/z/16/doc/16.16
recent_files: file:///dos/z/16/doc/16story.txt
-recent_files: file:///dos/z/keen-src/id_mm.c
+recent_files: file:///dos/z/keen-src/id_rf.c
recent_files: file:///dos/z/16/doc/project.txt
-recent_files: file:///dos/z/16/scroll.c
-recent_files: file:///dos/z/16/README
-recent_files: file:///dos/z/16/dos_kb.c
recent_files: file:///dos/z/16/dos_kb.h
+recent_files: file:///dos/z/16/dos_kb.c
recent_files: file:///dos/z/16/lib/lib_head.h
-recent_files: file:///dos/z/16/makefile
recent_files: file:///dos/z/16/modex16.h
recent_files: file:///dos/z/16/pcxtest.c
recent_files: file:///dos/z/16/modex16.c
+recent_files: file:///dos/z/16/scroll.c
+recent_files: file:///dos/z/16/README
+recent_files: file:///dos/z/16/makefile
recent_files: file:///dos/z/keen-src/id_mm.h
recent_files: file:///dos/z/keen-src/id_rf.h
+recent_files: file:///dos/z/keen-src/id_mm.c
recent_files: file:///dos/z/keen-src/id_rf_a.asm
-recent_files: file:///dos/z/keen-src/id_rf.c
+recent_files: file:///dos/z/16/types.h
snr_replacetype: 0
savedir: file:///dos/z/16
spell_check_default: 1
htmlbar_view: 0
spell_lang: en
ssearch_dotmatchall: 0
-searchlist: mapDrawTile
searchlist: draw
searchlist: return
searchlist: enter
searchlist: cols
searchlist: MAPY/2
searchlist: MAPX/2
+searchlist: mapDrawTile
autocomplete: 1
outputb_show_all_output: 0
bookmarks_show_mode: 0
-/*
-
-hey pngwen! draw half of the rows and colums instread of the whole thing at once
-or try to optimized it~
-
-*/
#include "modex16.h"
#include <stdio.h>
#include <stdlib.h>
void mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y);
void mapDrawRow(map_view_t *mv, int tx, int ty, word y);
void mapDrawCol(map_view_t *mv, int tx, int ty, word x);
-void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */word d1, word d2, int x, int y, word ls, word lp, bitmap_t *bmp);
+void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp);
#define TILEWH 16
#define QUADWH (TILEWH/4)
//#define SWAP(a, b) tmp=a; a=b; b=tmp;
void main() {
bitmap_t ptmp; // player sprite
- word q=1;
+ int q=1;
static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */
page_t screen, screen2, screen3;
map_t map;
}
void
-animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */word d1, word d2, int x, int y, word ls, word lp, bitmap_t *bmp)
+animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp)
{
- word dire=32*d1;
- word qq;
+ short dire=32*d1;
+ short qq;
if(d2==0) qq = 0;
else qq = ((lp)*SPEED);