We just released a prototype of the cancelled SNES port of Puggsy! Take a look!
As always, thank you for supporting The Cutting Room Floor on Patreon!

Midtown Madness 3

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Midtown Madness 3

Developer: Digital Illusions CE
Publisher: Microsoft Game Studios
Platform: Xbox
Released in US: June 17, 2003
Released in EU: June 27, 2003


CodeIcon.png This game has unused code.
SourceIcon.png This game has uncompiled source code.
DevTextIcon.png This game has hidden development-related text.
GraphicsIcon.png This game has unused graphics.
DebugIcon.png This game has debugging material.
RegionIcon.png This game has regional differences.


The sequel of Midtown Madness 2, Midtown Madness 3 has been released only on Xbox. This sequel takes the player around two cities, Paris and Washington D.C., with 40 cars from both France and the United States. With multiplayer support and DLC, the game fully took advantage of Xbox Live.

Uncompiled Code

Data\Data_hd\Scripts

"Data\Data_hd\Scripts" contains 49 files with debugging features, complete game-mode scripts and other interesting stuff like E3 settings.

Note: Out of respect and to avoid copyright issues, the main files are not posted here (i.e. full game-mode scripts...).

aidebug.lua

-----------------------------------------------------------------------------------------------------------------------
--
-- Debug script for AI
--
--
-----------------------------------------------------------------------------------------------------------------------

function onInit()
	--setPedDebugFlags()
	--doAiTest()
	--debugPedestrians()
	--doSearchForStartSlowdown()
	--doTestSpawner()
	--doTestCinematicPeds()

	doSearchForAmbientCarLeak()
end

function loadCurves()

	setLogLevel( "projects/mmx/main/game/profiletools", "info" )
	loadModule( "profiletools" )


	profilerGraphAddCurve( "Main_update/ai", 255,255,255 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects",0,255,0 )
--	profilerGraphAddCurve( "Main_update/ai/SphereOfInterest", 0,0,255 )
	profilerGraphAddCurve( "Main_update/ai/UpdateWeb", 226,6,209 )							-- purple

--	profilerGraphAddCurve( "Main_update/ai/UpdateWeb/postUpdate/populateContainers", 0,215,232 )		-- light seablue


--	profilerGraphAddCurve( "Main_update/ai/ExternalTestLine", 255,0,0 )
--	profilerGraphAddCurve( "Main_update/ai/InternalTestLine", 0,255,0 )

	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdatePedestrians",226,133,5 )		-- yellow
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars",176,225,6 )		-- green 
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateSubwayCars",72,159,126 )		-- light window green/blue


	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdatePedestrians/LocomotionUpdate",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdatePedestrians/LocomotionUpdate/advancePoint",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdatePedestrians/LocomotionUpdate/checkDrift",0,0,0 )

	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateLocomotion",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateLocomotion/adjustLocalVelocity",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateLocomotion/advancePoint",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateGraphics",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateCollisionTransform",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateSound",0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/UpdateAmbientCars/onPulse",0,0,0 )


	profilerCounterToggle()
	profilerCounterAdd( "Main_update/ai/UpdateWeb" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdatePedestrians" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateSubwayCars" )

	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdatePedestrians/LocomotionUpdate" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdatePedestrians/LocomotionUpdate/advancePoint" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdatePedestrians/LocomotionUpdate/checkDrift" )

	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateLocomotion" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateLocomotion/adjustLocalVelocity" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateLocomotion/advancePoint" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateGraphics" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateCollisionTransform" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/UpdateSound" )
	profilerCounterAdd( "Main_update/ai/UpdateObjects/UpdateAmbientCars/onPulse" )

end

function enablePulseUpdate()

	aiSetVariable( "objects::m_ambientCarUpdateFreq", 0.5 )
	aiSetVariable( "objects::m_pedestrianUpdateFreq", 0.5 )

end

function disablePulseUpdate()
	aiSetVariable( "objects::m_ambientCarUpdateFreq", 1 )
	aiSetVariable( "objects::m_pedestrianUpdateFreq", 1 )
end

function disableGroundAdjusts()
	
	-- Disable the ambient car reset stuff
	aiSetVariable( "ac::m_cameraAdjustRadius", -1 )
	aiSetVariable( "ac::m_useHeightReset", 0 )

	aiSetVariable( "ped::m_pedUseHeightReset", 0 )

end

function enableGroundAdjusts()
	
	aiSetVariable( "ac::m_cameraAdjustRadius", 30 )
	aiSetVariable( "ac::m_useHeightReset", 1 )

	aiSetVariable( "ped::m_pedUseHeightReset", 1 )
end


function enableOccluders()
	aiSetVariable( "web::m_useOccluders", 1 )
	aiSetVariable( "web::m_useLazyOcclusion", 0 )
	
end

function doSplitScreen()
    job           = 0
    city          = 0
    weather       = 0
    timeOfDay     = 1
    race          = 0
    opponentCount = 4
    playType      = 1 -- SinglePlayer = 0, SplitScreen = 1, Client = 2, Host = 3

	startCruiseRace(city, weather, timeOfDay, playType)
end



function setPedDebugFlags()
	--aiSetVariable( "ped::m_maxAngleSpeed", 100 )
	--aiSetVariable( "ped::m_avoidanceDistance", 150 )
	--aiSetVariable( "system::m_cameraSphereRadius", 150 )

	setLogLevel( "projects/mmx/main/shared/ai/engine/objects/pedestrian", "all" )

	aiDebugSetPedestrianCount(1)
	setFixedDeltaTime( 33 )
	aiTogglePedestrianInfo()
	aiSetFixedDeltaTime( 0.001 )
	unloadModule( "dof" )

end

function doAiTest()

	loadModule( "profiletools" )
	unloadModule( "dof" )

	toggleFps(1);
	--aiTogglePopulationInfo()
	profilerGraphSetSampleCount(128)
	profilerGraphSetYScale(200.0)
	setFixedDeltaTime(33)
	deviceSetFlipSync(0)

	profilerGraphSetSampleCount(128)
	profilerGraphAddCurve( "Main_update/ai", 255,255,255 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects",0,255,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateWeb", 226,6,209 )					-- purple
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/pedestrians",226,133,5 )	-- yellow
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/ambientcars",0,0,255 )		-- green 

--	renderSetViewDistance( 2000 )
--	aiSetVariable( "web::m_innerSphereRadius", 250 )
--	aiSetVariable( "web::m_maxContainerDistance", 400 )
--	aiSetVariable( "web::m_maxContainerPercentPopulatePerFrame", 0.2 )
--	aiSetVariable( "web::m_maxObjectSpawnedPerFrame", 3 )

end

function debugPedestrians()
	memeDebug()

	aiDebugSetPedestrianCount(1)
	aiSetVariable( "ped::m_minorThreatFrequency", 1 )
	aiSetVariable( "ped::m_majorThreatFrequency", 0.1 )

end

function doSearchForStartSlowdown()
	
	loadModule( "profiletools" )
	unloadModule( "dof" )

	toggleFps(1);
	--aiTogglePopulationInfo()
	profilerGraphSetSampleCount(128)
	profilerGraphSetYScale(200.0)
	--setFixedDeltaTime(33)
	deviceSetFlipSync(0)

	profilerGraphSetSampleCount(128)
	profilerGraphAddCurve( "Main_update/ai", 0,0,0 )
	profilerGraphAddCurve( "Main_update/ai/UpdateObjects",0,0,0 )
--	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/ambientcars",255,100,100 )
--	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/ambientcars/onPulse",0,10,255 )
--	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/ambientcars/Update",0,255,10 )
--	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/ambientcars/UpdateObjectCache",255,255,255 )

	profilerGraphAddCurve( "Main_update/ai/UpdateObjects/pedestrians",0,0,0 )

end

function doTestSpawner()
	
	setFixedDeltaTime(33)
	memeDebug()
	aiToggleCameraInfo(1)
	aiToggleContainerSortingInfo(1)
	aiToggleAmbientCarInfo(1)
	aiToggleAmbientCarStateInfo(1)
		
	aiToggleUpdateWebInfo(1)
	aiToggleContainerSortingInfo(1)

	renderSetViewDistance( 1000 )
	aiSetVariable( "dbg::m_cameraRenderScale", 0.2 )

	aiDebugSetPlayerCarPos(2075,29,556)
	aiSetVariable( "web::m_trailingPopulateThresholdSpeed", -1 )

end

function doTestCinematicPeds()

	setFixedDeltaTime(33)
	memeDebug()
	
	aiSetVariable( "level::m_disablePedInterpolate", 1 )

	aiSetVariable( "cin::m_defaultGridSize",0.5 )

	aiSetVariable( "cin::m_defaultGridWidth", 10 )
	aiSetVariable( "cin::m_defaultGridExtraExtend", 10 )

	aiTogglePedestrianInfo(1)

end

function doSearchForAmbientCarLeak()
	cameraBindToPlayer( 1, "Comp--1", 0 )
	aiTogglePopulationInfo(1)
end

broadcasters.lua

With most of the file commented out, these functions were probably shown as part of an early version.

function onInit()
-- Creating services mail

mailRadius   = 10
mailDuration = 5

aiCreateBroadCaster( 1332.65827 ,61.67926 - 1.811, 1258.69892 , mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1274.43449 ,61.6671  - 1.811, 1162.96391 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1226.28601 ,61.68954 - 1.811, 1260.2383 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1141.48446 ,55.22907 - 1.811, 1204.47642 , mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1112.94561 ,52.8401  - 1.811, 1275.65365 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1272.41749 ,56.79825 - 1.811, 1350.84961 , mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1048.79726 ,35.29428 - 1.811, 1444.6209 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 936.49465 ,33.27933  - 1.811, 1399.15838 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 744.93696 ,32.29973  - 1.811, 1353.62178 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1028.98182 ,52.8028  - 1.811, 1243.46753 ,  mailRadius, mailDuration, 'mail' ) 
--aiCreateBroadCaster( 1059.20696 ,46.5964  - 1.811, 1171.77081 ,  mailRadius, mailDuration, 'mail' ) 

-- Creating services trash
trashRadius   = 10
trashDuration = 2

aiCreateBroadCaster( 1168.38237 ,47.44184 , 1123.81628 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1142.65054 ,53.70776 , 1187.22191 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1120.24458 ,53.69802 , 1195.90994 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1052.22699 ,45.20135 , 1175.18068 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1026.6599 ,51.37973 , 1237.63743 ,  trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1092.24607 ,51.42217 , 1266.99937 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1097.926 ,51.08131 , 1296.06835 ,   trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1211.73156 ,55.40998 , 1327.74428 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1234.65614 ,60.28755 , 1239.43479 , trashRadius, trashDuration, 'trash' ) 
--aiCreateBroadCaster( 1253.72558 ,60.30076 , 1163.34658 , trashRadius, trashDuration, 'trash' ) 

-- Creating services rest
--aiCreateBroadCaster( 1128.53097 ,33.12035 ,-1030.56577 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1143.24641 ,33.32184 ,-1035.80347 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1160.74997 ,33.51633 ,-1042.40397 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1173.67495 ,33.64051 ,-1047.77536 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1085.17152 ,40.10253 ,-1111.47153 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1113.56825 ,52.10391 ,-1163.78372 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1291.76677 ,54.3735 ,-1130.81722 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1330.27836 ,54.38406 ,-1147.96944 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1328.47942 ,46.11142 ,-1126.74483 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1308.34283 ,46.13301 ,-1117.97723 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1320.17179 ,36.89738 ,-1090.53882 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1340.61473 ,36.89738 ,-1099.61113 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1076.94821 ,51.38193 ,-1282.39252 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1073.29597 ,51.39886 ,-1293.20315 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1069.20546 ,51.41205 ,-1306.35121 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 589.25034 ,26.31558 ,-1147.28401 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 588.75196 ,25.03382 ,-1121.76616 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 588.04408 ,24.63449 ,-1113.18482 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 642.19163 ,31.93389 ,-1263.42969 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 652.26072 ,31.93389 ,-1263.42969 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 631.8763 ,31.93389 ,-1275.5048 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 631.8763 ,31.93389 ,-1283.10207 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 631.8763 ,30.6975 ,-1319.81102 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 631.8763 ,30.83273 ,-1312.21375 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 679.75364 ,31.93389 ,-1263.42969 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 669.68455 ,31.93389 ,-1263.42969 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 713.613 ,31.93389 ,-1263.42969 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 703.54391 ,31.93389 ,-1263.42969 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1170.13041 ,28.47486 ,-975.24921 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1170.13041 ,28.95063 ,-988.15536 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1910.40571 ,19.067 ,-816.97786 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1918.75099 ,19.12645 ,-830.88665 , 10, 120, 'rest' ) 
--aiCreateBroadCaster( 1930.26073 ,19.22818 ,-847.19211 , 10, 120, 'rest' ) 
end

dopeddebug.lua

Used for debug pedestrians.


function onInit()

	doReloadPed()

end

function doReloadPed()

    local pedCount       = 1
    local pedFile        = "+Animation/Woman_Generic2/Woman_Generic2.mod"
    local pedPersonality = "Paris_Woman_Generic1"
    local pedFrequency   = 1

	aiClearCityProperties()
	aiAddCityPropPededstrian( pedFile, pedPersonality, pedFrequency )
	aiDebugSetPedestrianCount( pedCount )

end

E3settings.lua

Settings for E3! Unfortunately, there isn't much to see here.

function onInit()

	gameLog("E3settings\n")

	renderSetCityLodZones(80, 100, 350)
	renderSetFov(62)
	renderFacadeSetMaxFloors(2)
	soundEnableStreamingSounds(1)

	gameLog("End E3settings\n")
end

logic_events.lua

-- ********************************************************************************
-- ********************************************************************************
-- * Midtown Madness X                                                            *
-- * Event script                                                                 *
-- * OBS: No modifications should be made to this file!!!                         *
-- ********************************************************************************
-- ********************************************************************************


-- ********************************************************************************
-- * Variables                                                                    *
-- ********************************************************************************
event_prev_id = -1
event_obj_ids = 0
events = 4

-- ********************************************************************************
-- * Functions                                                                    *
-- ********************************************************************************
-- Run the commands on startup of the race
function randomNewEvent()
	local new_id
	repeat
		new_id = rand(events)
	until not event_prev_id == new_id
	event_prev_id = new_id
	
	if new_id == 0 then
		eventAmbulance()
	end
end

function eventAmbulance()
end

function eventFiretruck()
end

function eventPoliceHunt()
end

function eventSpeeders()
end

function endEvents()
	for i = 0, event_obj_ids, 1 do
		endEvent(id)
	end
end

function endEvent()
end

logic_events.lua

Note: This starts from line 702. All lines before that contain the main part of the game, so these aren't shown.

-- ********************************************************************************
-- * Debug functions (should be removed in final version!)                        *
-- ********************************************************************************
function addTime() -- DEBUG
	timerChangeDelta("race_timer", 60) -- DEBUG
	gameLog("Added 60s to the counter ... enjoy!") -- DEBUG
end -- DEBUG

function setTime(new_time) -- DEBUG
	timerChange("race_timer", new_time) -- DEBUG
	gameLog("Set counter to " .. new_time .. "s ... enjoy!") -- DEBUG
end -- DEBUG

function forceWin() -- DEBUG
	career_result = 1
	for i = 0, players_human_amount - 1, 1 do -- DEBUG
		raceFinish(1, ply_HUMAN_subname .. i) -- DEBUG
	end -- DEBUG
	if players_human_amount < players then -- DEBUG
		for i = 0, players - players_human_amount - 1, 1 do -- DEBUG
			raceFinish(0, ply_AI_subname .. i) -- DEBUG
		end -- DEBUG
	end -- DEBUG
	raceFinish(1) -- DEBUG
end -- DEBUG

function forceLose() -- DEBUG
	career_result = 0
	for i = 0, players_human_amount - 1, 1 do -- DEBUG
		raceFinish(0, ply_HUMAN_subname .. i) -- DEBUG
	end -- DEBUG
	if players_human_amount < players then -- DEBUG
		for i = 0, players - players_human_amount - 1, 1 do -- DEBUG
			raceFinish(1, ply_AI_subname .. i) -- DEBUG
		end -- DEBUG
	end -- DEBUG
	raceFinish(0) -- DEBUG
end -- DEBUG

logic_multi_client.lua

-- ********************************************************************************
-- ********************************************************************************
-- * Midtown Madness X                                                            *
-- * Generic multiplayer : Cruise                                                 *
-- * OBS: No modifications should be made to this file!!!                         *
-- ********************************************************************************
-- ********************************************************************************

-- Only InitAmbience() should be called in this script

gameLoadScript("logic_general.lua")

-- ********************************************************************************
-- * Startup functions                                                            *
-- ********************************************************************************

function generalOnRaceStart(player, view, timeLeft)
	local timer_in = 0.15
	local timer_out = 0
	local timer_show = (timeLeft/6) - timer_in - timer_out
	local timer_sound = 0
	local timer_wait = (timeLeft/6) - timer_sound

	if (timeLeft > 1) then
		stack(0, "cameraPreRaceSweep(" .. view .. ", " .. (timeLeft/2) .. ")")
		stack(timeLeft/2, "gameCountDownStart(3, " .. timer_in .. ", " .. timer_show .. ", " .. timer_out .. ")")
		stack(timer_sound, "soundPlayEffect('321')")
		stack(timer_wait, "gameCountDownStart(2, " .. timer_in .. ", " .. timer_show .. ", " .. timer_out .. ")")
		stack(timer_sound, "soundPlayEffect('321')")
		stack(timer_wait, "gameCountDownStart(1, " .. timer_in .. ", " .. timer_show .. ", " .. timer_out .. ")")
		stack(timer_sound, "soundPlayEffect('321')")
		stack(timer_wait, "gameCountDownStart(0, " .. timer_in .. ", " .. timer_show .. ", " .. timer_out .. ")")
		stack(timer_sound, "soundPlayEffect('go')")
		stack(timer_sound, "playerEnableInput('" .. player .. "')")
		stack(timer_sound, "raceStart()")
	else
		gameLog("Quick countdown")
		sweepTime = 2
		stack(0, "cameraPreRaceSweep(" .. view .. ", " .. sweepTime .. ")")
		stack(sweepTime, "playerEnableInput('" .. player .. "')")
		stack(timer_sound, "raceStart()")
	end

	stackRun()
end

logic_multi_spawnlocations_paris.lua

This file contains all multiplayer spawn locations for the Paris map.

-- ********************************************************************************
-- ********************************************************************************
-- * Midtown Madness X                                                            *
-- * Multiplayer Paris spawn-locations                                            *
-- ********************************************************************************
-- ********************************************************************************


-- ********************************************************************************
-- * Variables                                                                    *
-- ********************************************************************************
multi_spawn_location								= {}
	-- Arc de Triumph
	multi_spawn_location[1]							= {}
		multi_spawn_location[1]["constrain"]			= {-703.014038,28.599976,885.903259, 525;}
		multi_spawn_location[1][1]					= {-729.062622,28.860729,824.705627, 0.425785;}
		multi_spawn_location[1][2]					= {-677.116394,28.857939,949.094666, 3.571365;}
		multi_spawn_location[1][3]					= {-641.333069,28.863956,860.687378, 5.155476;}
		multi_spawn_location[1][4]					= {-766.623108,28.857964,912.715942, 1.978534;}
		multi_spawn_location[1][5]					= {-676.919922,28.857769,823.593689, 5.871404;}
		multi_spawn_location[1][6]					= {-728.254639,28.857880,948.912903, 2.760859;}
		multi_spawn_location[1][7]					= {-767.676270,28.857950,859.173645, 1.161324;}
		multi_spawn_location[1][8]					= {-638.290466,28.857740,913.429626, 4.350385;}
		multi_spawn_location[1]["hunter"]				= {-981.388855,23.768562,1018.33545, 2.041837;}
	-- Madelene
	multi_spawn_location[2]							= {}
		multi_spawn_location[2]["constrain"]			= {422.957336,17.246643,612.156738, 525;}
		multi_spawn_location[2][1]					= {322.972992,16.837706,347.575134, 5.907536;}
		multi_spawn_location[2][2]					= {334.735931,16.837709,373.062439, 5.909806;}
		multi_spawn_location[2][3]					= {353.446503,16.837776,415.699432, 4.431984;}
		multi_spawn_location[2][4]					= {366.081696,16.837925,443.371582, 4.377823;}
		multi_spawn_location[2][5]					= {333.614349,16.837883,457.941254, 2.809117;}
		multi_spawn_location[2][6]					= {321.175781,16.837658,430.809875, 2.794186;}
		multi_spawn_location[2][7]					= {302.376709,16.837711,388.463440, 1.236599;}
		multi_spawn_location[2][8]					= {289.608276,16.837986,361.928284, 1.226411;}
		multi_spawn_location[2]["hunter"]				= {439.119110,17.847754,647.673523, 3.564979;}
	-- Sacre Coeur
	multi_spawn_location[3]							= {}
		multi_spawn_location[3]["constrain"]			= {1325.210571,59.870087,1250.398804, 425;}
		multi_spawn_location[3][1]					= {1313.419067,60.337944,1194.342896, 3.189455;}
		multi_spawn_location[3][2]					= {1317.712891,60.337757,1194.975830, 2.936446;}
		multi_spawn_location[3][3]					= {1322.614136,60.337952,1196.053589, 2.857661;}
		multi_spawn_location[3][4]					= {1327.407104,60.337914,1197.515991, 2.719390;}
		multi_spawn_location[3][5]					= {1332.121338,60.337757,1200.257446, 2.714844;}
		multi_spawn_location[3][6]					= {1336.138672,60.337765,1203.317993, 2.504399;}
		multi_spawn_location[3][7]					= {1339.617676,60.337688,1207.518433, 2.518405;}
		multi_spawn_location[3][8]					= {1342.158447,60.337975,1211.277466, 2.424995;}
		multi_spawn_location[3]["hunter"]				= {1290.744629,60.334320,1284.734375, 2.759937;}
	-- Eleftower
	multi_spawn_location[4]							= {}
		multi_spawn_location[4]["constrain"]			= {-696.029297,18.000000,-49.686310, 425;}
		multi_spawn_location[4][1]					= {-719.329651,18.447693,-26.505781, 2.349847;}
		multi_spawn_location[4][2]					= {-695.599915,18.447969,-15.732449, 3.137931;}
		multi_spawn_location[4][3]					= {-671.047241,18.447758,-25.033384, 3.931411;}
		multi_spawn_location[4][4]					= {-661.050720,18.448000,-50.882565, 4.715195;}
		multi_spawn_location[4][5]					= {-671.032288,18.447788,-74.669556, 5.502910;}
		multi_spawn_location[4][6]					= {-694.474854,18.447910,-83.900726, 0.000088;}
		multi_spawn_location[4][7]					= {-719.453979,18.447958,-74.749634, 0.810257;}
		multi_spawn_location[4][8]					= {-729.589783,18.447727,-50.130402, 1.580507;}
		multi_spawn_location[4]["hunter"]				= {-848.239014,18.347912,97.422989, 2.379388;}
	-- Ivalides
	multi_spawn_location[5]							= {}
		multi_spawn_location[5]["constrain"]			= {28.115973,18.720947,-79.843658, 425;}
		multi_spawn_location[5][1]					= {69.609177,16.347717,54.545708, 3.918060;}
		multi_spawn_location[5][2]					= {46.931175,16.347748,54.368378, 3.826791;}
		multi_spawn_location[5][3]					= {6.487767,16.347996,54.640152, 2.510480;}
		multi_spawn_location[5][4]					= {-14.708457,16.347748,54.839447, 2.419253;}
		multi_spawn_location[5][5]					= {-14.491766,17.847687,-37.188122, 0.761890;}
		multi_spawn_location[5][6]					= {4.228920,17.847748,-36.878803, 0.687307;}
		multi_spawn_location[5][7]					= {49.918549,17.847965,-37.113750, 5.566256;}
		multi_spawn_location[5][8]					= {68.750893,17.847935,-36.856266, 5.562202;}
		multi_spawn_location[5]["hunter"]				= {27.721218,16.347717,331.313538, 3.157137;}
	-- City Isle
	multi_spawn_location[6]							= {}
		multi_spawn_location[6]["constrain"]			= {1448.582764,16.400024,-313.651245, 450;}
		multi_spawn_location[6][1]					= {1393.877075,16.847881,-366.040558, 5.947467;}
		multi_spawn_location[6][2]					= {1402.866943,16.847683,-346.525665, 5.948645;}
		multi_spawn_location[6][3]					= {1419.379883,16.847746,-308.096161, 4.345691;}
		multi_spawn_location[6][4]					= {1410.813599,16.847914,-328.220581, 4.377406;}
		multi_spawn_location[6][5]					= {1348.520874,16.847792,-271.827545, 2.714844;}
		multi_spawn_location[6][6]					= {1341.157715,16.847725,-289.324158, 2.694270;}
		multi_spawn_location[6][7]					= {1333.005249,16.847767,-308.282532, 1.321308;}
		multi_spawn_location[6][8]					= {1323.927490,16.897749,-327.855591, 1.248204;}
		multi_spawn_location[6]["hunter"]				= {1166.150391,16.847935,-231.310135, 2.371164;}

	-- Unlimited
	multi_spawn_location[7]							= {}
		multi_spawn_location[7][1]					= {1313.419067,60.337944,1194.342896, 3.189455;}
		multi_spawn_location[7][2]					= {1317.712891,60.337757,1194.975830, 2.936446;}
		multi_spawn_location[7][3]					= {1322.614136,60.337952,1196.053589, 2.857661;}
		multi_spawn_location[7][4]					= {1327.407104,60.337914,1197.515991, 2.719390;}
		multi_spawn_location[7][5]					= {1332.121338,60.337757,1200.257446, 2.714844;}
		multi_spawn_location[7][6]					= {1336.138672,60.337765,1203.317993, 2.504399;}
		multi_spawn_location[7][7]					= {1339.617676,60.337688,1207.518433, 2.518405;}
		multi_spawn_location[7][8]					= {1342.158447,60.337975,1211.277466, 2.424995;}
		multi_spawn_location[7]["hunter"]				= {1290.744629,60.334320,1284.734375, 2.759937;}

	-- Cruise
	multi_spawn_location[8]							= {}
		multi_spawn_location[8][1]					= {180.986481,16.655756,58.177841, 1.593299;}
		multi_spawn_location[8][2]					= {-615.324341,21.842503,412.393097, 3.931410;}
		multi_spawn_location[8][3]					= {-1128.711670,24.289661,883.728882, 3.074329;}
		multi_spawn_location[8][4]					= {54.421188,23.347857,1386.962402, 3.079253;}
		multi_spawn_location[8][5]					= {1406.147461,53.851055,1266.255249, 1.336572;}
		multi_spawn_location[8][6]					= {1861.869995,19.371660,630.421021, 5.883550;}
		multi_spawn_location[8][7]					= {1497.211548,16.847780,-250.838928, 2.021087;}
		multi_spawn_location[8][8]					= {1539.080200,16.937584,-566.287537, 4.717976;}

	-- Gold
	multi_spawn_location["gold"]			= {}
		multi_spawn_location["gold"][1]	= {27.619831,15.899979,151.004028;} -- 16
		multi_spawn_location["gold"][2]	= {510.128723,17.399979,802.096802;} -- 38
		multi_spawn_location["gold"][3]	= {637.825623,16.899979,439.395630;} -- 29
		multi_spawn_location["gold"][4]	= {70.373413,15.899979,594.340332;} -- 30
		multi_spawn_location["gold"][5]	= {325.681641,16.899979,-120.995880;} -- 17
		multi_spawn_location["gold"][6]	= {-137.839081,17.299988,729.480713;} -- 48
		multi_spawn_location["gold"][7]	= {613.216919,16.899979,-5.279836;} -- 23
		multi_spawn_location["gold"][8]	= {600.029785,17.310059,-145.191147;} -- 46
		multi_spawn_location["gold"][9]	= {-1555.703369,28.399979,-37.747147;}
		multi_spawn_location["gold"][10]	= {-1022.544434,15.399979,-559.657471;}
		multi_spawn_location["gold"][11]	= {-1355.485352,15.899979,-426.604187;}
		multi_spawn_location["gold"][12]	= {-800.916809,17.899963,51.394344;}
		multi_spawn_location["gold"][13]	= {-485.074951,17.899979,-451.198364;}
		multi_spawn_location["gold"][14]	= {-748.948853,16.399979,-715.916992;}
		multi_spawn_location["gold"][15]	= {-373.973633,16.899979,-5.527623;}
		multi_spawn_location["gold"][16]	= {-1070.768311,21.899979,1061.608154;}
		multi_spawn_location["gold"][17]	= {116.333023,17.899979,954.202881;}
		multi_spawn_location["gold"][18]	= {305.166138,19.899979,-622.457764;}
		multi_spawn_location["gold"][19]	= {49.180462,18.150024,-810.410339;}
		multi_spawn_location["gold"][20]	= {1261.429932,26.899979,-676.699585;}
		multi_spawn_location["gold"][21]	= {970.703003,21.899979,-359.442871;}
		multi_spawn_location["gold"][22]	= {1095.965698,16.400055,-113.556137;}
		multi_spawn_location["gold"][23]	= {-858.444824,28.899979,553.948975;}
		multi_spawn_location["gold"][24]	= {1624.031372,16.399963,-386.684357;}
		multi_spawn_location["gold"][25]	= {1481.129150,17.399979,77.869461;}
		multi_spawn_location["gold"][26]	= {1824.858643,16.899979,32.501091;}
		multi_spawn_location["gold"][27]	= {1876.052246,16.899979,442.743164;}
		multi_spawn_location["gold"][28]	= {1617.268066,18.399979,644.669800;}
		multi_spawn_location["gold"][29]	= {-437.763275,19.900024,1446.560913;}
		multi_spawn_location["gold"][30]	= {66.243362,22.899979,1338.643799;}
		multi_spawn_location["gold"][31]	= {772.134155,17.399979,846.217041;}
		multi_spawn_location["gold"][32]	= {1102.542725,18.899979,566.972046;}
		multi_spawn_location["gold"][33]	= {728.954590,31.899979,1194.063232;}
		multi_spawn_location["gold"][34]	= {1132.948730,53.274979,1195.590088;}
		multi_spawn_location["gold"][35]	= {1490.349609,35.900024,1392.827515;}
		multi_spawn_location["gold"][36]	= {1047.189331,51.008362,1298.597046;}
		multi_spawn_location["gold"][37]	= {361.496674,25.000000,1243.686157;}
		multi_spawn_location["gold"][38]	= {-702.358643,18.899979,1179.706787;}
		multi_spawn_location["gold"][39]	= {1630.941650,20.027954,838.434143;}
		multi_spawn_location["gold"][40]	= {1170.390991,17.495758,227.624176;}
		multi_spawn_location["gold"][41]	= {1516.652954,16.520050,-110.829979;}
		multi_spawn_location["gold"][42]	= {1917.501221,17.861328,-129.258087;}
		multi_spawn_location["gold"][43]	= {1703.364624,16.954834,-639.585083;}
		multi_spawn_location["gold"][44]	= {960.939392,22.020508,-624.539551;}
		multi_spawn_location["gold"][45]	= {543.715515,22.261963,-637.169373;}
		multi_spawn_location["gold"][46]	= {-1155.555908,36.899979,238.722473;}
		multi_spawn_location["gold"][47]	= {324.604584,16.499939,395.158051;}
		multi_spawn_location["gold"][48]	= {-85.309006,16.399979,820.480103;}
		multi_spawn_location["gold"][49]	= {-585.378174,21.987091,381.403778;}
		multi_spawn_location["gold"][50]	= {-325.806000,18.100006,-415.904602;}
		multi_spawn_location["gold"][51]	= {-695.418823,18.000000,-50.609802;}
		multi_spawn_location["gold"][52]	= {-968.724731,15.863190,-365.412994;}
		multi_spawn_location["gold"][53]	= {-1595.606934,28.481140,345.600647;}
		multi_spawn_location["gold"][54]	= {-1205.456787,27.510010,524.623840;}
		multi_spawn_location["gold"][55]	= {-964.912415,25.684845,884.870483;}

logic_multi_spawnlocations_washington.lua

This file contains all mutiplayer spawn locations for the Washington D.C. map.

-- ********************************************************************************
-- ********************************************************************************
-- * Midtown Madness X                                                            *
-- * Multiplayer Paris spawn-locations                                            *
-- ********************************************************************************
-- ********************************************************************************


-- ********************************************************************************
-- * Variables                                                                    *
-- ********************************************************************************
multi_spawn_location								= {}
	-- Georgetown
	multi_spawn_location[1]							= {}
		multi_spawn_location[1]["constrain"]			= {-2406.284912,28.233459,257.859772, 457.336243;}
		multi_spawn_location[1][1]					= {-2312.196289,27.857698,273.762787, 6.264912;}
		multi_spawn_location[1][2]					= {-2312.310303,29.223230,331.034180, 6.269712;}
		multi_spawn_location[1][3]					= {-2298.087891,29.189545,346.298798, 1.559112;}
		multi_spawn_location[1][4]					= {-2256.141602,27.876236,346.296539, 1.591613;}
		multi_spawn_location[1][5]					= {-2241.240479,27.543348,331.015015, 3.143258;}
		multi_spawn_location[1][6]					= {-2241.197510,26.403000,275.176086, 3.113431;}
		multi_spawn_location[1][7]					= {-2255.969727,26.360155,259.507538, 4.702484;}
		multi_spawn_location[1][8]					= {-2297.729004,27.643274,258.402679, 4.682470;}
		multi_spawn_location[1]["hunter"]				= {-2148.211914,24.730377,306.304413, 4.709475;}
	-- Foggy Bottom
	multi_spawn_location[2]							= {}
		multi_spawn_location[2]["constrain"]			= {-1274.151245,25.806458,237.514755, 525;}
		multi_spawn_location[2][1]					= {-1210.474854,26.254444,139.140472, 3.204724;}
		multi_spawn_location[2][2]					= {-1142.356934,26.254408,67.950684, 1.648010;}
		multi_spawn_location[2][3]					= {-1074.679199,26.254335,139.959030, 6.201978;}
		multi_spawn_location[2][4]					= {-1142.934937,26.254213,201.887405, 4.776656;}
		multi_spawn_location[2][5]					= {-1178.864380,26.254211,97.344765, 2.349544;}
		multi_spawn_location[2][6]					= {-1101.678711,26.254206,101.780121, 0.628363;}
		multi_spawn_location[2][7]					= {-1104.268799,26.254423,171.039917, 5.606558;}
		multi_spawn_location[2][8]					= {-1175.988281,26.254255,175.927887, 4.012073;}
		multi_spawn_location[2]["hunter"]				= {-906.435181,27.766840,346.279297, 4.008389;}
	-- Old Downtown
	multi_spawn_location[3]							= {}
		multi_spawn_location[3]["constrain"]			= {154.533295,13.246826,-604.300781, 425;}
		multi_spawn_location[3][1]					= {253.174438,12.832956,-458.188568, 6.254433;}
		multi_spawn_location[3][2]					= {254.085526,13.595224,-362.554382, 6.261364;}
		multi_spawn_location[3][3]					= {212.474258,14.834875,-313.326752, 4.657073;}
		multi_spawn_location[3][4]					= {126.169525,18.095253,-312.895813, 4.667452;}
		multi_spawn_location[3][5]					= {86.928024,18.104650,-353.726746, 3.119173;}
		multi_spawn_location[3][6]					= {87.669640,13.472976,-459.261383, 3.092720;}
		multi_spawn_location[3][7]					= {123.060104,12.538389,-504.920013, 1.522342;}
		multi_spawn_location[3][8]					= {215.124588,12.538510,-504.384888, 1.566956;}
		multi_spawn_location[3]["hunter"]				= {399.824646,13.452885,-391.600189, 4.711599;}
	-- Tidal Basin
	multi_spawn_location[4]							= {}
		multi_spawn_location[4]["constrain"]			= {-1751.606079,5.042877,-1244.110840, 425;}
		multi_spawn_location[4][1]					= {-1844.580811,4.047687,-1274.358765, 6.138587;}
		multi_spawn_location[4][2]					= {-1855.360107,4.968145,-1188.194336, 0.014566;}
		multi_spawn_location[4][3]					= {-1855.978149,6.616273,-997.628235, 3.269839;}
		multi_spawn_location[4][4]					= {-1864.538940,4.926413,-1075.166870, 3.184719;}
		multi_spawn_location[4][5]					= {-1728.561890,5.654915,-1138.595337, 4.932168;}
		multi_spawn_location[4][6]					= {-1777.593872,7.935446,-1127.870850, 4.845860;}
		multi_spawn_location[4][7]					= {-2000.258423,6.316060,-1142.433838, 1.308180;}
		multi_spawn_location[4][8]					= {-1916.541382,8.947168,-1134.218872, 1.522468;}
		multi_spawn_location[4]["hunter"]				= {-1554.485474,5.528229,-1138.989624, 4.696843;}
	-- The Mall
	multi_spawn_location[5]							= {}
		multi_spawn_location[5]["constrain"]			= {-53.649681,68.835258,-1095.499878, 425;}
		multi_spawn_location[5][1]					= {-193.962738,9.486697,-745.444397, 1.572119;}
		multi_spawn_location[5][2]					= {-57.936405,7.360875,-730.081665, 4.676148;}
		multi_spawn_location[5][3]					= {-98.880318,7.730098,-735.058594, 4.718804;}
		multi_spawn_location[5][4]					= {-158.140762,8.988713,-740.526245, 1.529459;}
		multi_spawn_location[5][5]					= {-193.222382,7.961590,-811.556213, 1.561941;}
		multi_spawn_location[5][6]					= {-63.259972,6.446536,-796.941040, 4.710402;}
		multi_spawn_location[5][7]					= {-96.747589,6.737310,-801.879333, 4.681288;}
		multi_spawn_location[5][8]					= {-159.718521,7.662846,-806.645325, 1.571498;}
		multi_spawn_location[5]["hunter"]				= {197.416855,6.171320,-939.905396, 5.213995;}
	-- Capitol Hill
	multi_spawn_location[6]							= {}
		multi_spawn_location[6]["constrain"]			= {979.961731,23.781250,-1375.919434, 450;}
		multi_spawn_location[6][1]					= {788.779358,5.832767,-1473.733887, 4.093361;}
		multi_spawn_location[6][2]					= {756.3,5.832571,-1496.8, 4.108547;}
		multi_spawn_location[6][3]					= {723.821838,5.832766,-1520.122192, 4.072991;}
		multi_spawn_location[6][4]					= {696.873413,5.832688,-1551.566040, 4.103737;}
		multi_spawn_location[6][5]					= {789.430298,5.832827,-1297.911377, 5.217075;}
		multi_spawn_location[6][6]					= {760.426453,5.832639,-1269.318604, 5.222821;}
		multi_spawn_location[6][7]					= {721.383362,5.832563,-1257.920898, 5.265994;}
		multi_spawn_location[6][8]					= {692.771240,5.832766,-1228.780396, 5.229215;}
		multi_spawn_location[6]["hunter"]				= {1035.887573,13.826936,-1613.959839, 4.726848;}

	-- Unlimited
	multi_spawn_location[7]							= {}
		multi_spawn_location[7][1]					= {-193.962738,9.486697,-745.444397, 1.572119;}
		multi_spawn_location[7][2]					= {-57.936405,7.360875,-730.081665, 4.676148;}
		multi_spawn_location[7][3]					= {-98.880318,7.730098,-735.058594, 4.718804;}
		multi_spawn_location[7][4]					= {-158.140762,8.988713,-740.526245, 1.529459;}
		multi_spawn_location[7][5]					= {-193.222382,7.961590,-811.556213, 1.561941;}
		multi_spawn_location[7][6]					= {-63.259972,6.446536,-796.941040, 4.710402;}
		multi_spawn_location[7][7]					= {-96.747589,6.737310,-801.879333, 4.681288;}
		multi_spawn_location[7][8]					= {-159.718521,7.662846,-806.645325, 1.571498;}
		multi_spawn_location[7]["hunter"]				= {197.416855,6.171320,-939.905396, 5.213995;}

	-- Cruise
	multi_spawn_location[8]							= {}
		multi_spawn_location[8][1]					= {1086.434570,13.006753,-691.295715, 3.161417;}
		multi_spawn_location[8][2]					= {97.657379,6.513629,-1028.308838, 0.000000;}
		multi_spawn_location[8][3]					= {-120.714798,21.335129,-308.182770, 4.716100;}
		multi_spawn_location[8][4]					= {-1267.814575,18.625660,-112.020821, 3.145168;}
		multi_spawn_location[8][5]					= {-2057.449219,28.237991,329.260193, 3.097996;}
		multi_spawn_location[8][6]					= {-2654.936035,9.911852,-257.709259, 1.567365;}
		multi_spawn_location[8][7]					= {-2086.356689,4.125021,-1158.038940, 2.287669;}
		multi_spawn_location[8][8]					= {-622.063171,3.861327,-2366.347168, 3.278423;}

	multi_spawn_location["gold"]						= {}
		multi_spawn_location["gold"][1]	= {-823.757080,9.042435,-807.373047;} -- 18
		multi_spawn_location["gold"][2]	= {-215.927460,5.376343,-1149.390381;} -- 11
		multi_spawn_location["gold"][3]	= {-560.312073,11.648438,-1416.510498;} -- 45
		multi_spawn_location["gold"][4]	= {-823.286560,3.797882,-1383.062256;} -- 17
		multi_spawn_location["gold"][5]	= {-1152.007813,7.518433,-994.587402;} -- 25
		multi_spawn_location["gold"][6]	= {-915.442261,16.482178,-500.939667;} -- 47
		multi_spawn_location["gold"][7]	= {1331.952271,25.035522,-1378.985352;} -- 18
		multi_spawn_location["gold"][8]	= {252.642960,13.614441,-315.798004;}
		multi_spawn_location["gold"][9]	= {90.469711,9.042435,-737.973389;}
		multi_spawn_location["gold"][10]	= {-204.500488,24.282425,-123.829163;}
		multi_spawn_location["gold"][11]	= {1226.847412,16.662430,-887.609253;}
		multi_spawn_location["gold"][12]	= {90.463791,7.518433,-1619.827637;}
		multi_spawn_location["gold"][13]	= {-373.016968,2.946426,-1915.495361;}
		multi_spawn_location["gold"][14]	= {-881.556641,2.946472,-2382.582275;}
		multi_spawn_location["gold"][15]	= {-1248.853638,2.946442,-1815.185059;}
		multi_spawn_location["gold"][16]	= {-1692.629150,3.556030,-1651.590576;}
		multi_spawn_location["gold"][17]	= {899.436768,11.898163,-1382.999512;}
		multi_spawn_location["gold"][18]	= {850.169312,13.614441,-469.590607;}
		multi_spawn_location["gold"][19]	= {-475.943298,16.662430,-460.694519;}
		multi_spawn_location["gold"][20]	= {-744.277466,18.186417,-189.698212;}
		multi_spawn_location["gold"][21]	= {-908.473938,26.092407,138.648117;}
		multi_spawn_location["gold"][22]	= {-569.073975,27.025635,331.281403;}
		multi_spawn_location["gold"][23]	= {-1409.874390,33.426453,592.885437;}
		multi_spawn_location["gold"][24]	= {-1259.039673,19.710449,-314.376343;}
		multi_spawn_location["gold"][25]	= {405.971344,7.017456,-1315.076416;}
		multi_spawn_location["gold"][26]	= {-1565.794678,19.710449,-605.743774;}
		multi_spawn_location["gold"][27]	= {-1812.878418,3.246796,-681.379578;}
		multi_spawn_location["gold"][28]	= {-1893.446777,9.278564,-1126.059570;}
		multi_spawn_location["gold"][29]	= {-2190.589844,4.420425,-426.005554;}
		multi_spawn_location["gold"][30]	= {-2379.901123,2.943787,-454.653198;}
		multi_spawn_location["gold"][31]	= {-2315.466309,15.419510,-60.655846;}
		multi_spawn_location["gold"][32]	= {-1689.187744,18.186417,-55.506271;}
		multi_spawn_location["gold"][33]	= {-2438.995605,33.426407,348.999146;}
		multi_spawn_location["gold"][34]	= {-2735.429443,54.762451,850.812134;}
		multi_spawn_location["gold"][35]	= {-1776.693481,22.532410,541.993652;}
		multi_spawn_location["gold"][36]	= {-2337.846680,30.378448,1067.245850;}
		multi_spawn_location["gold"][37]	= {-2147.818848,24.282425,305.503845;}
		multi_spawn_location["gold"][38]	= {-2820.763672,2.992188,-292.342377;}
		multi_spawn_location["gold"][39]	= {-1693.137329,20.848450,-313.710663;}
		multi_spawn_location["gold"][40]	= {-1769.080933,14.698730,-667.219421;}
		multi_spawn_location["gold"][41]	= {-1994.677490,16.113220,-994.193909;}
		multi_spawn_location["gold"][42]	= {-1550.736328,4.171875,-1445.967041;}
		multi_spawn_location["gold"][43]	= {-1006.503418,2.946411,-1639.946655;}
		multi_spawn_location["gold"][44]	= {-592.787354,3.231445,-2198.611328;}
		multi_spawn_location["gold"][45]	= {828.365845,6.604019,-1141.348633;}
		multi_spawn_location["gold"][46]	= {-593.308411,6.437500,-989.502014;}
		multi_spawn_location["gold"][47]	= {575.737183,12.040436,-871.566895;}
		multi_spawn_location["gold"][48]	= {-1185.986938,28.467407,473.999695;}
		multi_spawn_location["gold"][49]	= {-785.597656,24.601379,81.120331;}
		multi_spawn_location["gold"][50]	= {-498.295013,19.783508,-218.474136;}
		multi_spawn_location["gold"][51]	= {159.620483,5.681335,-1033.451904;}
		multi_spawn_location["gold"][52]	= {454.527954,12.440735,-684.490051;}
		multi_spawn_location["gold"][53]	= {1244.252930,12.734436,-694.813843;}
		multi_spawn_location["gold"][54]	= {1331.838745,25.806427,-1707.602295;}
		multi_spawn_location["gold"][55]	= {709.055664,5.384827,-1732.383423;}

PedDebugSetup.lua

Another file for debugging pedestrians.

function peddebug()

	objectCreate(1,"pedDebugTarget")
	objectSetPos( 355, 16.40, 369 )
	objectEnable( "pedDebugTarget" )
	objectShow( "pedDebugTarget" )

	objectCreate(6,"myPed")
	objectSetParam( "Cinematic Pedestrian1" )
	objectSetPos( 269, 16.40, 377 )
	objectEnable( "myPed" )
	objectShow( "myPed" )
	objectUpdateAdd( "myPed" )

	objectSetActive( "myPed" )
	pedGoTo( "pedDebugTarget" )
end

unlockallskins.lua

--
-- Unlocks all the skins.
--

function onInit()
	local mytable = {
	  {"Ambulance", 2 },
	  {"ArmoredCar", 2 },
	  {"AudiTT", 2 },
	  --{"Avalanche", 0 },
	  {"Avant", 3 },
	  {"Cement", 2 },
	  {"ChevySSR", 3 },
	  {"Corvette", 2 },
	  {"Crossfire", 2 },
	  {"DCBus", 2 },
	  {"Escalade", 2 },
	  {"FireTruck", 2 },
	  {"Freightliner", 2 },
	  {"Garbage", 2 },
	  {"HummerH2", 2 },
	  {"Koenigsegg", 2 },
	  {"Limo", 2 },
	  {"Lotus", 2 },
	  {"MFastBack", 3 },
	  {"Microcar", 2 },
	  {"mini", 2 },
	  {"mv_badguy", 2 },
	  {"NewBeetle", 2 },
	  {"Opel_Astra", 0 },
	  {"ParisBus", 2 },
	  {"ParisPolice", 2 },
	  {"ParisTaxi", 2 },
	  {"Pt", 2 },
	  {"Renault5", 2 },
	  {"Saab93", 2 },
	  --{"SerpentMk2", 0 },
	  {"Seville", 2 },
	  {"WashingtonPolice", 2 },
	  {"WashingtonTaxi", 2 },
	  {"Viper", 0 },
	}

	local index = 0

	for i,v in mytable do
		index = 1
		while index <= v[2] do
			playerProfileAddKey( v[1] .. "." .. index )
			index = index + 1
		end
	end

	playerProfileAddKey( "Avalanche" )
	playerProfileAddKey( "SerpentMk2" )

end

user.lua

A basic initialization routine.

function onInit()
	gameLog("running user init...\n")

	cityAdd("Paris", "d:\\Data\\Shared\\Paris\\Paris", "d:\\Data\\Shared\\Paris\\ParisSplit") 

	cityAdd("Washington", "d:\\Data\\Shared\\Washington\\Washington", "d:\\Data\\Shared\\Washington\\WashingtonSplit") 

	gameLog("exiting user init...\n")

	-- Moved to E3settings.lua
	-- renderSetFov(65) -- 56
end

userSetup.lua

-- Description:
--   Configure the game settings per user.
--
-- Dependencies:
--   [Which scripts / modules / states must be set/run/ok]
--
--
function onInit()
	gameLog("running user setup...\n")

	--
	-- Disable some loglevels...
	--
	if queryBuildMode() == 1 then
	-- NDEBUG
		setLogLevel("", "warning")
	else
		setLogLevel("", "warning")
	end

	gameLog("exiting user setup...\n")
end

Data\Data_hd\Scripts\Test

This folder and the AI subfolder contain seven files.

test_Base.lua

-- callbacks that can be overloaded by other test scripts

function test_onEnterFrontEndFirstTime()
end

function test_onEnterFrontEnd()
end

function test_onStartRace()
end

function test_onFinishRace()
end

function test_onUpdate(deltaTime, state)
end

-- utility functions used by other test scripts

function test_exitToMenu()
	input("s2dara")
end

test_CarsParisBlitz.lua

test_isFirstTime = 0

function test_onEnterFrontEnd()
	if (test_isFirstTime == 0) then
		input("sdadaa2ra")
		input("20la")
		test_isFirstTime = 1
	else
		input("2ara")
	end
end

function test_onStartRace()
	input("s2da")
end

test_ParisCruise.lua

test_isFirstTime = 0

function test_onEnterFrontEnd()
	if (test_isFirstTime == 0) then
		input("ad5a")
		test_isFirstTime = 1
	else
		input("2a")
	end
end

function test_onStartRace()
	input("s2da")
end

test_RestartParisCruise.lua

function test_onEnterFrontEndFirstTime()
	input("ad6a")
end

test_firstTime = 0

function test_onStartRace()
	if (firstTime == 0) then
		input("sdala")
		test_firstTime = 1
	else
		input("ala")
	end
end

test_SwitchCity.lua

test_isFirstTime = 0
test_city = 0

function test_onEnterFrontEndFirstTime()
	input("ad5a")
end

function test_onEnterFrontEnd()
	if (test_city == 0) then
		input("br3a")
		test_city = 1
	else
		input("bl3a")
		test_city = 0
	end
end

function test_onStartRace()
	test_exitToMenu()
end

\AI\test_CruiseParis.lua

test_haveRun = nil

function test_onEnterFrontEnd()
	
	if( not test_haveRun ) then

		command = ""
		
		-- Enter profile menu
		command = command .. "s"

		-- Select default profile
		command = command .. "a"

		-- Enter single race
		command = command .. "da"

		-- Select cruise 
		command = command .. "a"

		-- Select paris city
		command = command .. "a"

		-- Select the parameters (just accept the default)
		command = command .. "a"

		-- Select car and transmission (just take the default)
		command = command .. "a" 

		-- Send command to MEME.
		input( command );

		-- Set flag to true
		test_haveRun = 1
	else

		-- Restart race directly
		-- input( "aaa" )
	end
end

function test_onStartRace()
	--	input("s2da")
end

\AI\test_TaxiCareer0103.lua

test_haveRun = nil

function test_onEnterFrontEnd()
	gameLog( "Automatic AI test script - starting taxi race" )
	
	if( not test_haveRun ) then

		command = ""
		
		-- Enter main menu
		command = command .. "s"

		-- Enter career sub menu
		command = command .. "a"

		-- Select paris city
		command = command .. "a"

		-- This doesn't work ???
			-- Skip movie
			-- command = command .. "a"

			-- Choose taxi
			command = command .. "da"

		-- Chose race 4
		command = command .. "ddda"

		-- Choose transmission automatic
		command = command .. "a"

		-- Send command to MEME.
		input( command );

		-- Set flag to true
		test_haveRun = 1
	else

		-- Restart race directly
		-- input( "aaa" )
	end
end

function test_onStartRace()
	--	input("s2da")
end

Debug Leftovers

In 'Data\Data_hd\Menu' , there are two folders named 'Debug' and 'DebugHUD'. In 'Debug', a single file named DebugMenu is present. Inside 'DebugHUD', a file called DebugHUD is present.

DebugHUD

DebugHud loaded

The debug HUD shows car speed, RPM, gear, position (in X, Y and Z); brake, engine, gear and suspension damage; camera positions (in X, Y, Z and angle).
However, the final version only has engine damage. Gear, suspension and brake damage were probably present in an early version.

DebugMenu

The debugMenu file can be loaded and we can extract the strings, that indicates the available options. This debug menu can change level-of-detail (draw distance), anti-aliasing, V-sync and AI options; Enable/Disable traffic, debug HUD, peds, skybox and a wireframe mode but in-game it is broken you only can select the options but they don't do anything.

DebugMenu loaded.
dice::meme::NameNode
dice::meme::TabstopManagerNode
dice::meme::CullEventActionNode"dice::meme::TransitionalEffectNode
dice::meme::TransformNode
dice::meme::TextNode
variables/varFogLength
dice::meme::IntData
styles/styleDebugValue
dice::meme::Style
dice::meme::FocusEffectNode
dice::meme::TabstopNode dice::meme::ModifyVariableAction
dice::meme::ButtonEvent
dice::meme::WstringData
styles/styleDebugItem
dice::meme::RightAlignedStyle
dice::meme::ColorEffect
variables/varFarClip
variables/varLODFar
options/optionLODFar
variables/varLODNear
options/optionLODNear
dice::meme::IndexDataData
dice::meme::DataListData
variables/varAliasMode
options/optionAliasing
variables/enableVSync
dice::meme::BoolData dice::meme::ToggleVariableAction
options/optionVSync
variables/paintAiAmbientDebug
options/optionAiAmbientDebug
variables/paintAiGraph
options/optionAiGraph&variables/enableTrafficLightIndicators$options/optionTrafficLightIndicators
variables/enableDebugHud
options/optionDebugHud
ariables/enableTraffic
options/optionTraffic
variables/enablePeds
options/optionPedsvariables/enableWireframe
options/optionWireframe
variables/enableSkyBox
options/optionSkyBox
styles/styleDebugTitle
dice::meme::CenterAlignedStyle
dice::meme::EffectNode
dice::meme::PictureNode
dice::meme::AlphaFadeEffect
dice::meme::SetTabstopAction
optionsTab
dice::meme::TypeEvent

Strange Folder

'Data\Data_dvd\Constrain' contains two files, 'MatrixCode.cdds' and 'Secret.cdds' and one subfolder 'bak' containing what appears to be an early version of 'MatrixCode.cdds', because both files have the same name.

Secret.cdds
MatrixCode.cdds

Regional Differences

'Data\Data_dvd\Menu\Gfx' contains error messages for dirty/damaged DVDs. 'badgamedisc.tga' contains an early version of this screen in English, with an edit date of February ‎23, ‎2003, compared to May 9, 2003 in the final version. The only change is that the small text blurb saying "Press A to continue" was removed. However, the file used for the Japanese version, 'BadGameDiscJapanese.tga', is a copy of the early version!

Early/Japan Final
Midtown Madness 3 BadDisc Early Version.png Midtown Madness 3 BadDisc Final Version.png