Texture replacement

The texture replacement file is a file named like the romset ended in .pat in the SCRIPTS folder (ex: daytona.pat)
Each line of the file indicates a texture replacement. The format is

ID1 ID2 Format Filename

ID1 and ID2 are the ID pair used to identify the texture to replace
Format is 
	0 if you replace the texture with a grayscale texture, so it's handled through the model2 coloring pipeline (like original ones)
	1 if your texture is already colored. Then only lighting will be applied (linearly) to the texture
	There is no restriction to the size of the new texture (apart from your videoram)
Filename is the name of the file to use as texture (.png). Alpha transparency is supported for Format 1 (colored) textures.

In order to make a texture replacement, you need to know the ID pair of the texture you want to replace. To know the
ID pair, first dump the texture cache from a running game using the Game menu option "Dump texture cache".
This will dump the cached textures in png format to the TEXCACHE folder. The file name of the dumped files is ID1_ID2.png
that way you can get the IDs and the corresponding texture as base for replacement.
The .pat files are read on game load, so you need to re-load a game to see the new textures.

You can start a line with // indicating a commented line,and it will not be processed


LUA Scripts

The emulator will load a script named the same than the romset, ended in .lua in the SCRIPTS folder (ex: daytona.lua)

Each script can add some functions that will be called by the emulator:

Init()
	Called when the game has been loaded and is about to start

Reset()
	Called when the game has been reset (not on first reset, use Init for the first reset)

Frame()
	Called right after emulating a frame, and before starting video rendering

PostDraw()
	Called right after rendering the frame, and before blitting the frame to the screen (so you can add text 
	and other images to the rendered image

End()
	Called when the emulator is about to terminate the emulation (use for cleanup or data persistence)

Inside the LUA scripts you can access the emulator by using some helper functions provided by the emulator:


Bit helper functions

int AND(value,value2)
	Performs bitwise (value AND value2)

int OR(value1,value2)
	Performs bitwise (value OR value2)

int XOR(value,value2)
	Performs bitwise (value XOR value2)

int NOT(value)
	Performs bitwise (NOT value)

int SHL(value,shift)
	Performs a left shift of "value" by "shift" bits

int SHR(value,shift)
	Performs a right shift of "value" by "shift" bits



ROM Access functions

int Romset_ReadByte(int area,int offset)
int Romset_ReadWord(int area,int offset)
int Romset_ReadDWord(int area,int offset)
	Read byte/word/dword from rom files at specified area and offset 

Romset_PatchByte(int area,int offset,int data)
Romset_PatchWord(int area,int offset,int data)
Romset_PatchDWord(int area,int offset,int data)
	Write byte/word/dword to rom files at specified area and offset

Romset areas depend on the driver. for model 2 they are:
	0 - I960 program roms (word interleaved)
	1 - Data roms (word interleaved)
	2 - Coprocessor roms (word interleaved)
	3 - Polygon data (word interleaved)
	4 - Texture data (word interleaved)
	5 - Sound program roms (byteswapped)
	6 - Sample roms (linear)
	7 - DSB program roms (byteswapped if it's DSB2)
	8 - DSB sound roms (linear)
	9 - Comm board rom
	10 - Main board roms (word interleaved)
	11 - Video board roms (word interleaved)

The rom area data is not exactly the same than the roms, as they can be interleaved or swapped for faster access.

Video access functions

Video_DrawText(x,y,text,color)
	Write text to string in the given color (R8G8B8. 0xFFFFFF=white) at the x,y position

int Video_CreateFont(fontname,size,bold)
	Create a font for text output with the given params (ex: "Arial",20,0)
	Returns a font for use in RelaseFont and DrawTextWithFont

Video_ReleaseFont(font)
	Release the given font (usually on emulator exit)

Video_DrawTextWithFont(font,x,y,text,color)
	Write text to string in the given color (R8G8B8. 0xFFFFFF=white) at the x,y position with the given font
	
int Video_CreateSurfaceFromFile(filename)
	Loads a image file (.png) as surface
	Returns a surface to use with ReleaseSurface and DrawSurface

Video_DrawSurface(surface,x,y)
	Draws a surface to the given position

Video_ReleaseSurface(surface)
	Release a loaded surface

Video_GetScreenSize()
	Returns screen size (width,height) pair

Input keys access

int Input_IsKeyPressed(key)
	For a keyboard, key is the DIK_ value of directinput (check dinput.h in directx sdk)
	For a joystick, key is JOYx+Button (check common.lua for the values: ex: JOY1+BUTTON1  JOY1+LEFT)
	returns 1 if the key/button is pressed in the current frame (will return 1 till it's released)

Model 2 specific functions

int I960_ReadByte(int)
	Read a byte (8 bits) from the i960 memory map

int I960_ReadWord(int)
	Read a word (16 bits) from the i960 memory map

int I960_ReadDWord(int)
	Read a dword (32 bits) from the i960 memory map

I960_WriteByte(int addr,int data)
	Write byte "data" to the address "addr"

I960_WriteWord(int addr,int data)
	Write word "data" to the address "addr"

I960_WriteDWord(int addr,int data)
	Write dword "data" to the address "addr"

int I960_GetRamPtr(int addr)
	Get the memory address pointer (in emulator address space) of the given model2 memory offset (only works for RAM areas,
	retrieving memory mapped peripheral data will return 0). Useful to pass the value to a cheat find engine like Renegade.

Model2_SetWideScreen(int)
	Enable (1) or disable (0) 3D transforms to output widescreen data

Model2_SetStretchALow(int)
	Enable (1) or disable (0) stretching to all visible area of the A tilemap when set in background mode

Model2_SetStretchBLow(int)
	Enable (1) or disable (0) stretching to all visible area of the B tilemap when set in background mode

Model2_SetStretchAHigh(int)
	Enable (1) or disable (0) stretching to all visible area of the A tilemap when set in foreground mode

Model2_SetStretchBHigh(int)
	Enable (1) or disable (0) stretching to all visible area of the B tilemap when set in foreground mode

Options and cheats

You can export named options and cheats that the user can activate from the Game Menu. To do so, create a structure in the LUA
file with this format:

Options =
{
	cheat1={name="Cheat 1",values={"Off","On"},runfunc=cheat1func,changefunc=cheat1change},
	cheat2={name="Cheat 2",values={"Off","On"},runfunc=cheat2func,changefunc=cheat2change}
}

cheat1 is the cheat variable used to access its value. Inside a lua script access is as Options.cheat1.value.
name is the text that appears in the game menu
values is the name of the different values (the first one corresponds to value 0). if not specified, the values are "Off","On"
runfunc is a function called when the cheat value is not 0. This function receives the current value as parameter
changefunc is a function called when the user changes the value in the Game menu. It receives the new value as parameter.

runfunc and changefunc are optional.

