the cutting room mirror

Midtown Madness 3

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.

Unused Vehicles#

Several unused vehicles are referred to by text in prototype versions of the game, as well as released versions, including:

  • BMW
  • Citroen 2CV
  • Ford Mustang GT Bullitt
  • Mercedes-Benz SL 600
  • Nissan 350Z
  • Peugeot 206 2.0 GTI
  • Smart Cabrio
  • Smart fortwo

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.

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