From 2d2283e0dbfb6faccc8c7ad3f74038efee7e00e7 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Fri, 31 Jul 2020 20:41:51 +0300 Subject: [PATCH 001/112] submodules? --- librw | 2 +- ogg | 2 +- opus | 2 +- opusfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/librw b/librw index 99c15d5e..162c2d20 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 99c15d5ed78cc112e1055cc89452dd57df28da58 +Subproject commit 162c2d203577e7e8ca727e699da33f7d54d76257 diff --git a/ogg b/ogg index 1e8d7cce..0bbcba4e 160000 --- a/ogg +++ b/ogg @@ -1 +1 @@ -Subproject commit 1e8d7cce266df61afc9d35db0283bbacc0237aba +Subproject commit 0bbcba4e7cf32324170470569c4527ffd0002870 diff --git a/opus b/opus index 8aa77672..484af258 160000 --- a/opus +++ b/opus @@ -1 +1 @@ -Subproject commit 8aa7767207b1e3633004c26aecbb67d1c5118485 +Subproject commit 484af2580b82dffd695fcd0841fc34a9dc5f7293 diff --git a/opusfile b/opusfile index eb252537..a55c164e 160000 --- a/opusfile +++ b/opusfile @@ -1 +1 @@ -Subproject commit eb252537f374e30f7b68b84223c5a2303c05eca2 +Subproject commit a55c164e9891a9326188b7d4d216ec9a88373739 From 99d8e12207ee08e8727d0e20e9d81d77aef80d61 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Wed, 5 Aug 2020 14:28:12 +0200 Subject: [PATCH 002/112] added partial bsd support (FreeBSD) --- premake5.lua | 632 ++++++++++++++++++++++++++------------------------- 1 file changed, 326 insertions(+), 306 deletions(-) diff --git a/premake5.lua b/premake5.lua index c8190e15..dc64956d 100644 --- a/premake5.lua +++ b/premake5.lua @@ -1,308 +1,328 @@ -newoption { - trigger = "glewdir", - value = "PATH", - description = "Directory of GLEW", - default = "glew-2.1.0" -} - -newoption { - trigger = "glfwdir64", - value = "PATH", - description = "Directory of glfw", - default = "glfw-3.3.2.bin.WIN64", -} - -newoption { - trigger = "glfwdir32", - value = "PATH", - description = "Directory of glfw", - default = "glfw-3.3.2.bin.WIN32", -} - -newoption { - trigger = "with-librw", - description = "Build and use librw from this solution" -} - -newoption { - trigger = "with-opus", - description = "Build with opus" -} - -if(_OPTIONS["with-librw"]) then - Librw = "librw" -else - Librw = os.getenv("LIBRW") or "librw" -end - -function getsys(a) - if a == 'windows' then - return 'win' - end - return a -end - -function getarch(a) - if a == 'x86_64' then - return 'amd64' - elseif a == 'ARM' then - return 'arm' - end - return a -end - -workspace "re3" - language "C++" - configurations { "Debug", "Release" } - location "build" - symbols "Full" - staticruntime "off" - - filter { "system:windows" } - platforms { - "win-x86-RW33_d3d8-mss", - "win-x86-librw_d3d9-mss", - "win-x86-librw_gl3_glfw-mss", - "win-x86-RW33_d3d8-oal", - "win-x86-librw_d3d9-oal", - "win-x86-librw_gl3_glfw-oal", - "win-amd64-librw_d3d9-oal", - "win-amd64-librw_gl3_glfw-oal", - } - - filter { "system:linux" } - platforms { - "linux-x86-librw_gl3_glfw-oal", - "linux-amd64-librw_gl3_glfw-oal", - "linux-arm-librw_gl3_glfw-oal", - } - - filter "configurations:Debug" - defines { "DEBUG" } - - filter "configurations:Release" - defines { "NDEBUG" } - optimize "On" - - filter { "platforms:win*" } - system "windows" - - filter { "platforms:linux*" } - system "linux" - - filter { "platforms:*x86*" } - architecture "x86" - - filter { "platforms:*amd64*" } - architecture "amd64" - - filter { "platforms:*arm*" } - architecture "ARM" - - filter { "platforms:*librw_d3d9*" } - defines { "RW_D3D9" } - if(not _OPTIONS["with-librw"]) then - libdirs { path.join(Librw, "lib/win-%{getarch(cfg.architecture)}-d3d9/%{cfg.buildcfg}") } - end - - filter "platforms:*librw_gl3_glfw*" - defines { "RW_GL3" } - includedirs { path.join(_OPTIONS["glewdir"], "include") } - if(not _OPTIONS["with-librw"]) then - libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") } - end - - filter "platforms:*x86-librw_gl3_glfw*" - includedirs { path.join(_OPTIONS["glfwdir32"], "include") } - - filter "platforms:*amd64-librw_gl3_glfw*" - includedirs { path.join(_OPTIONS["glfwdir64"], "include") } - - filter "platforms:win*librw_gl3_glfw*" - defines { "GLEW_STATIC" } - - filter {} - - function setpaths (gamepath, exepath, scriptspath) - scriptspath = scriptspath or "" - if (gamepath) then - postbuildcommands { - '{COPY} "%{cfg.buildtarget.abspath}" "' .. gamepath .. scriptspath .. '%{cfg.buildtarget.name}"' - } - debugdir (gamepath) - if (exepath) then - -- Used VS variable $(TargetFileName) because it doesn't accept premake tokens. Does debugcommand even work outside VS?? - debugcommand (gamepath .. "$(TargetFileName)") - dir, file = exepath:match'(.*/)(.*)' - debugdir (gamepath .. (dir or "")) - end - end - --targetdir ("bin/%{prj.name}/" .. scriptspath) - end - -if(_OPTIONS["with-librw"]) then -project "librw" - kind "StaticLib" - targetname "rw" - targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}" - files { path.join(Librw, "src/*.*") } - files { path.join(Librw, "src/*/*.*") } - filter "platforms:*RW33*" - flags { "ExcludeFromBuild" } - filter {} -end - -local function addSrcFiles( prefix ) - return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" -end - -project "re3" - kind "WindowedApp" - targetname "re3" - targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" - - files { addSrcFiles("src") } - files { addSrcFiles("src/animation") } +newoption { + trigger = "glewdir", + value = "PATH", + description = "Directory of GLEW", + default = "glew-2.1.0" +} + +newoption { + trigger = "glfwdir64", + value = "PATH", + description = "Directory of glfw", + default = "glfw-3.3.2.bin.WIN64", +} + +newoption { + trigger = "glfwdir32", + value = "PATH", + description = "Directory of glfw", + default = "glfw-3.3.2.bin.WIN32", +} + +newoption { + trigger = "with-librw", + description = "Build and use librw from this solution" +} + +newoption { + trigger = "with-opus", + description = "Build with opus" +} + +if(_OPTIONS["with-librw"]) then + Librw = "librw" +else + Librw = os.getenv("LIBRW") or "librw" +end + +function getsys(a) + if a == 'windows' then + return 'win' + end + return a +end + +function getarch(a) + if a == 'x86_64' then + return 'amd64' + elseif a == 'ARM' then + return 'arm' + end + return a +end + +workspace "re3" + language "C++" + configurations { "Debug", "Release" } + location "build" + symbols "Full" + staticruntime "off" + + filter { "system:windows" } + platforms { + "win-x86-RW33_d3d8-mss", + "win-x86-librw_d3d9-mss", + "win-x86-librw_gl3_glfw-mss", + "win-x86-RW33_d3d8-oal", + "win-x86-librw_d3d9-oal", + "win-x86-librw_gl3_glfw-oal", + "win-amd64-librw_d3d9-oal", + "win-amd64-librw_gl3_glfw-oal", + } + + filter { "system:linux" } + platforms { + "linux-x86-librw_gl3_glfw-oal", + "linux-amd64-librw_gl3_glfw-oal", + "linux-arm-librw_gl3_glfw-oal", + } + filter { "system:bsd" } + platforms { + "bsd-amd64-librw_gl3_glfw-oal" + } + + filter "configurations:Debug" + defines { "DEBUG" } + + filter "configurations:Release" + defines { "NDEBUG" } + optimize "On" + + filter { "platforms:win*" } + system "windows" + + filter { "platforms:linux*" } + system "linux" + + filter { "platforms:bsd*" } + system "bsd" + + filter { "platforms:*x86*" } + architecture "x86" + + filter { "platforms:*amd64*" } + architecture "amd64" + + filter { "platforms:*arm*" } + architecture "ARM" + + filter { "platforms:*librw_d3d9*" } + defines { "RW_D3D9" } + if(not _OPTIONS["with-librw"]) then + libdirs { path.join(Librw, "lib/win-%{getarch(cfg.architecture)}-d3d9/%{cfg.buildcfg}") } + end + + filter "platforms:*librw_gl3_glfw*" + defines { "RW_GL3" } + includedirs { path.join(_OPTIONS["glewdir"], "include") } + if(not _OPTIONS["with-librw"]) then + libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") } + end + + filter "platforms:*x86-librw_gl3_glfw*" + includedirs { path.join(_OPTIONS["glfwdir32"], "include") } + + filter "platforms:*amd64-librw_gl3_glfw*" + includedirs { path.join(_OPTIONS["glfwdir64"], "include") } + + filter "platforms:win*librw_gl3_glfw*" + defines { "GLEW_STATIC" } + + filter {} + + function setpaths (gamepath, exepath, scriptspath) + scriptspath = scriptspath or "" + if (gamepath) then + postbuildcommands { + '{COPY} "%{cfg.buildtarget.abspath}" "' .. gamepath .. scriptspath .. '%{cfg.buildtarget.name}"' + } + debugdir (gamepath) + if (exepath) then + -- Used VS variable $(TargetFileName) because it doesn't accept premake tokens. Does debugcommand even work outside VS?? + debugcommand (gamepath .. "$(TargetFileName)") + dir, file = exepath:match'(.*/)(.*)' + debugdir (gamepath .. (dir or "")) + end + end + --targetdir ("bin/%{prj.name}/" .. scriptspath) + end + +if(_OPTIONS["with-librw"]) then +project "librw" + kind "StaticLib" + targetname "rw" + targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}" + files { path.join(Librw, "src/*.*") } + files { path.join(Librw, "src/*/*.*") } + + filter "platforms:bsd*" + includedirs { "/usr/local/include" } + libdirs { "/usr/local/lib" } + + filter "platforms:*RW33*" + flags { "ExcludeFromBuild" } + filter {} +end + +local function addSrcFiles( prefix ) + return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" +end + +project "re3" + kind "WindowedApp" + targetname "re3" + targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + + files { addSrcFiles("src") } + files { addSrcFiles("src/animation") } files { addSrcFiles("src/audio") } - files { addSrcFiles("src/audio/eax") } - files { addSrcFiles("src/audio/oal") } - files { addSrcFiles("src/control") } - files { addSrcFiles("src/core") } - files { addSrcFiles("src/entities") } - files { addSrcFiles("src/math") } - files { addSrcFiles("src/modelinfo") } - files { addSrcFiles("src/objects") } - files { addSrcFiles("src/peds") } - files { addSrcFiles("src/render") } - files { addSrcFiles("src/rw") } - files { addSrcFiles("src/save") } - files { addSrcFiles("src/skel") } - files { addSrcFiles("src/skel/glfw") } - files { addSrcFiles("src/text") } - files { addSrcFiles("src/vehicles") } - files { addSrcFiles("src/weapons") } - files { addSrcFiles("src/extras") } - - includedirs { "src" } - includedirs { "src/animation" } + files { addSrcFiles("src/audio/eax") } + files { addSrcFiles("src/audio/oal") } + files { addSrcFiles("src/control") } + files { addSrcFiles("src/core") } + files { addSrcFiles("src/entities") } + files { addSrcFiles("src/math") } + files { addSrcFiles("src/modelinfo") } + files { addSrcFiles("src/objects") } + files { addSrcFiles("src/peds") } + files { addSrcFiles("src/render") } + files { addSrcFiles("src/rw") } + files { addSrcFiles("src/save") } + files { addSrcFiles("src/skel") } + files { addSrcFiles("src/skel/glfw") } + files { addSrcFiles("src/text") } + files { addSrcFiles("src/vehicles") } + files { addSrcFiles("src/weapons") } + files { addSrcFiles("src/extras") } + + includedirs { "src" } + includedirs { "src/animation" } includedirs { "src/audio" } - includedirs { "src/audio/eax" } - includedirs { "src/audio/oal" } - includedirs { "src/control" } - includedirs { "src/core" } - includedirs { "src/entities" } - includedirs { "src/math" } - includedirs { "src/modelinfo" } - includedirs { "src/objects" } - includedirs { "src/peds" } - includedirs { "src/render" } - includedirs { "src/rw" } - includedirs { "src/save/" } - includedirs { "src/skel/" } - includedirs { "src/skel/glfw" } - includedirs { "src/text" } - includedirs { "src/vehicles" } - includedirs { "src/weapons" } - includedirs { "src/extras" } - - if _OPTIONS["with-opus"] then - includedirs { "ogg/include" } - includedirs { "opus/include" } - includedirs { "opusfile/include" } - end - - filter "platforms:*mss" - defines { "AUDIO_MSS" } - includedirs { "sdk/milessdk/include" } - libdirs { "sdk/milessdk/lib" } - - if _OPTIONS["with-opus"] then - filter "platforms:win*" - libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" } - libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" } - libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" } - filter {} - defines { "AUDIO_OPUS" } - end - - filter "platforms:*oal" - defines { "AUDIO_OAL" } - - filter {} - if(os.getenv("GTA_III_RE_DIR")) then - setpaths("$(GTA_III_RE_DIR)/", "%(cfg.buildtarget.name)", "") - end - - filter "platforms:win*" - files { addSrcFiles("src/skel/win") } - includedirs { "src/skel/win" } - linkoptions "/SAFESEH:NO" - characterset ("MBCS") - targetextension ".exe" - - filter "platforms:win-x86*oal" - includedirs { "openal-soft/include" } - includedirs { "libsndfile.32/include" } - includedirs { "mpg123.32/include" } - libdirs { "mpg123.32/lib" } - libdirs { "libsndfile.32/lib" } - libdirs { "openal-soft/libs/Win32" } - - filter "platforms:win-amd64*oal" - includedirs { "openal-soft/include" } - includedirs { "libsndfile.64/include" } - includedirs { "mpg123.64/include" } - libdirs { "mpg123.64/lib" } - libdirs { "libsndfile.64/lib" } - libdirs { "openal-soft/libs/Win64" } - - filter "platforms:linux*oal" - links { "openal", "mpg123", "sndfile", "pthread" } - - if _OPTIONS["with-opus"] then - filter {} - links { "libogg" } - links { "opus" } - links { "opusfile" } - end - - filter "platforms:*RW33*" - staticruntime "on" - includedirs { "sdk/rwsdk/include/d3d8" } - libdirs { "sdk/rwsdk/lib/d3d8/release" } - links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" } - defines { "RWLIBS" } - linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text" - - filter "platforms:*librw*" - defines { "LIBRW" } - files { addSrcFiles("src/fakerw") } - includedirs { "src/fakerw" } - includedirs { Librw } - if(_OPTIONS["with-librw"]) then - libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } - end - links { "rw" } - - filter "platforms:*d3d9*" - links { "d3d9" } - - filter "platforms:*x86*d3d*" - includedirs { "sdk/dx8sdk/include" } - libdirs { "sdk/dx8sdk/lib" } - - filter "platforms:*amd64*d3d9*" - defines { "USE_D3D9" } - - filter "platforms:win-x86*gl3_glfw*" - libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } - libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } - links { "opengl32", "glew32s", "glfw3" } - - filter "platforms:win-amd64*gl3_glfw*" - libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/x64") } - libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } - links { "opengl32", "glew32s", "glfw3" } - - filter "platforms:linux*gl3_glfw*" - links { "GL", "GLEW", "glfw" } + includedirs { "src/audio/eax" } + includedirs { "src/audio/oal" } + includedirs { "src/control" } + includedirs { "src/core" } + includedirs { "src/entities" } + includedirs { "src/math" } + includedirs { "src/modelinfo" } + includedirs { "src/objects" } + includedirs { "src/peds" } + includedirs { "src/render" } + includedirs { "src/rw" } + includedirs { "src/save/" } + includedirs { "src/skel/" } + includedirs { "src/skel/glfw" } + includedirs { "src/text" } + includedirs { "src/vehicles" } + includedirs { "src/weapons" } + includedirs { "src/extras" } + + if _OPTIONS["with-opus"] then + includedirs { "ogg/include" } + includedirs { "opus/include" } + includedirs { "opusfile/include" } + end + + filter "platforms:*mss" + defines { "AUDIO_MSS" } + includedirs { "sdk/milessdk/include" } + libdirs { "sdk/milessdk/lib" } + + if _OPTIONS["with-opus"] then + filter "platforms:win*" + libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" } + libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" } + libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" } + filter {} + defines { "AUDIO_OPUS" } + end + + filter "platforms:*oal" + defines { "AUDIO_OAL" } + + filter {} + if(os.getenv("GTA_III_RE_DIR")) then + setpaths("$(GTA_III_RE_DIR)/", "%(cfg.buildtarget.name)", "") + end + + filter "platforms:win*" + files { addSrcFiles("src/skel/win") } + includedirs { "src/skel/win" } + linkoptions "/SAFESEH:NO" + characterset ("MBCS") + targetextension ".exe" + + filter "platforms:win-x86*oal" + includedirs { "openal-soft/include" } + includedirs { "libsndfile.32/include" } + includedirs { "mpg123.32/include" } + libdirs { "mpg123.32/lib" } + libdirs { "libsndfile.32/lib" } + libdirs { "openal-soft/libs/Win32" } + + filter "platforms:win-amd64*oal" + includedirs { "openal-soft/include" } + includedirs { "libsndfile.64/include" } + includedirs { "mpg123.64/include" } + libdirs { "mpg123.64/lib" } + libdirs { "libsndfile.64/lib" } + libdirs { "openal-soft/libs/Win64" } + + filter "platforms:linux*oal" + links { "openal", "mpg123", "sndfile", "pthread" } + + filter "platforms:linux*oal" + links { "openal", "mpg123", "sndfile", "pthread" } + + if _OPTIONS["with-opus"] then + filter {} + links { "libogg" } + links { "opus" } + links { "opusfile" } + end + + filter "platforms:*RW33*" + staticruntime "on" + includedirs { "sdk/rwsdk/include/d3d8" } + libdirs { "sdk/rwsdk/lib/d3d8/release" } + links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" } + defines { "RWLIBS" } + linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text" + + filter "platforms:*librw*" + defines { "LIBRW" } + files { addSrcFiles("src/fakerw") } + includedirs { "src/fakerw" } + includedirs { Librw } + if(_OPTIONS["with-librw"]) then + libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } + end + links { "rw" } + + filter "platforms:*d3d9*" + links { "d3d9" } + + filter "platforms:*x86*d3d*" + includedirs { "sdk/dx8sdk/include" } + libdirs { "sdk/dx8sdk/lib" } + + filter "platforms:*amd64*d3d9*" + defines { "USE_D3D9" } + + filter "platforms:win-x86*gl3_glfw*" + libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } + libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } + links { "opengl32", "glew32s", "glfw3" } + + filter "platforms:win-amd64*gl3_glfw*" + libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/x64") } + libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } + links { "opengl32", "glew32s", "glfw3" } + + filter "platforms:linux*gl3_glfw*" + links { "GL", "GLEW", "glfw" } + + filter "platforms:bsd*gl3_glfw*" + links { "GL", "GLEW", "glfw", "sysinfo" } + includedirs { "/usr/local/include" } + libdirs { "/usr/local/lib" } From 7a7b3527932d4ef5ff7d1676f8af022ae28cbdf5 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Wed, 5 Aug 2020 14:32:37 +0200 Subject: [PATCH 003/112] added FreeBSD support --- src/core/CdStreamPosix.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/core/CdStreamPosix.cpp b/src/core/CdStreamPosix.cpp index 45fd9832..ff36c18f 100644 --- a/src/core/CdStreamPosix.cpp +++ b/src/core/CdStreamPosix.cpp @@ -150,9 +150,11 @@ CdStreamInit(int32 numChannels) ASSERT(0); return; } - +#ifdef __linux__ _gdwCdStreamFlags = O_RDONLY | O_NOATIME; - +#elif __FreeBSD__ + _gdwCdStreamFlags = O_RDONLY; +#endif // People say it's slower /* if ( fsInfo.f_bsize <= CDSTREAM_SECTOR_SIZE ) @@ -400,9 +402,12 @@ void *CdStreamThread(void *param) if (gCdStreamThreadStatus == 0){ gCdStreamThreadStatus = 1; #endif + +#ifdef __linux__ pid_t tid = syscall(SYS_gettid); int ret = setpriority(PRIO_PROCESS, tid, getpriority(PRIO_PROCESS, getpid()) + 1); - } +#endif + } // spurious wakeup or we sent interrupt signal for flushing if(pChannel->nSectorsToRead == 0) From c4f9bfdc441fb0a0d6bfde208cd1f8192bacc880 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Wed, 5 Aug 2020 14:33:50 +0200 Subject: [PATCH 004/112] added FreeBSD support --- src/skel/glfw/glfw.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index a1170c61..643a9e64 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -209,7 +209,11 @@ double psTimer(void) { struct timespec start; +#ifdef __linux__ clock_gettime(CLOCK_MONOTONIC_RAW, &start); +#elif __FreeBSD__ + clock_gettime(CLOCK_MONOTONIC, &start); +#endif return start.tv_sec * 1000.0 + start.tv_nsec/1000000.0; } #endif From 56ea53a5db82887163eb76388ad936f71788490e Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Wed, 5 Aug 2020 14:35:24 +0200 Subject: [PATCH 005/112] clang throws an error if fixed comparisons are against NULL --- src/audio/sampman_oal.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index 0e173152..5e4b5aba 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -587,16 +587,16 @@ cSampleManager::Initialise(void) } nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] = (uintptr)malloc(nSampleBankSize[SAMPLEBANK_MAIN]); - ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] != NULL); + ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] != 0); - if ( nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] == NULL ) + if ( nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] == 0 ) { Terminate(); return false; } nSampleBankMemoryStartAddress[SAMPLEBANK_PED] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX); - ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] != NULL); + ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] != 0); } From 47b7d4a53ab2dd824ce71e12aaf07d4cc595f091 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Wed, 5 Aug 2020 14:40:56 +0200 Subject: [PATCH 006/112] Update premake5.lua --- premake5.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/premake5.lua b/premake5.lua index dc64956d..8f5e9ad9 100644 --- a/premake5.lua +++ b/premake5.lua @@ -271,7 +271,7 @@ project "re3" filter "platforms:linux*oal" links { "openal", "mpg123", "sndfile", "pthread" } - filter "platforms:linux*oal" + filter "platforms:bsd*oal" links { "openal", "mpg123", "sndfile", "pthread" } if _OPTIONS["with-opus"] then From 21e1e7a474a3be5f08faff1b84e62a064065efd9 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Wed, 5 Aug 2020 23:29:53 +0200 Subject: [PATCH 007/112] Update premake5.lua From 658f94f15591b6cb4c73f51ec5e2f7e3e99462e7 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 7 Aug 2020 13:13:04 +0200 Subject: [PATCH 008/112] little emergecy fix for shadows with librw --- src/peds/Ped.cpp | 8 +++----- src/render/Shadows.cpp | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 4e1c3c6d..be39f26e 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -2788,14 +2788,12 @@ CPed::SetModelIndex(uint32 mi) // This is a mistake by R*, velocity is CVector, whereas m_vecAnimMoveDelta is CVector2D. (*RPANIMBLENDCLUMPDATA(m_rwObject))->velocity = (CVector*) &m_vecAnimMoveDelta; -#ifdef PED_SKIN if(modelInfo->GetHitColModel() == nil) modelInfo->CreateHitColModelSkinned(GetClump()); - if (IsClumpSkinned(GetClump())) // condition isn't there in VC - UpdateRpHAnim(); -#endif -#if 1 + UpdateRpHAnim(); + +#ifndef LIBRW if (!m_pRTShadow) { m_pRTShadow = new CCutsceneShadow; diff --git a/src/render/Shadows.cpp b/src/render/Shadows.cpp index 9b864d27..0ee63b9a 100644 --- a/src/render/Shadows.cpp +++ b/src/render/Shadows.cpp @@ -853,7 +853,7 @@ CShadows::StoreShadowForPed(CPed *pPed, float fDisplacementX, float fDisplacemen { if ( CTimeCycle::GetShadowStrength() != 0 ) { - #if 1 + #ifndef LIBRW CCutsceneShadow *pShadow = pPed->m_pRTShadow; if (pShadow) From 9eaa7a0707f84fd3ac5346e9d051dd2add408b48 Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Fri, 7 Aug 2020 17:14:11 +0200 Subject: [PATCH 009/112] Create basic config for github actions (windows) --- .github/workflows/msvc_amd64.yml | 67 +++++++++++++++++++++++++++++++ .github/workflows/msvc_x86.yml | 68 ++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 .github/workflows/msvc_amd64.yml create mode 100644 .github/workflows/msvc_x86.yml diff --git a/.github/workflows/msvc_amd64.yml b/.github/workflows/msvc_amd64.yml new file mode 100644 index 00000000..9f8a2803 --- /dev/null +++ b/.github/workflows/msvc_amd64.yml @@ -0,0 +1,67 @@ +name: msvc_amd64 + +on: + pull_request: + push: + release: + types: published +env: + GLEW_VER: "2.1.0" + GLFW_VER: "3.3.2" + GLEW_BASE: "glew-2.1.0" + GLFW_BASE: "glfw-3.3.2.bin.WIN64" + GLEW_FILE: "glew-2.1.0-win32.zip" + GLFW_FILE: "glfw-3.3.2.bin.WIN64.zip" + GLEW_URL: "https://github.com/nigels-com/glew/releases/download/glew-2.1.0/glew-2.1.0-win32.zip" + GLFW_URL: "https://github.com/glfw/glfw/releases/download/3.3.2/glfw-3.3.2.bin.WIN64.zip" +jobs: + build: + runs-on: windows-2019 + strategy: + matrix: + platform: [win-amd64-librw_d3d9-oal, win-amd64-librw_gl3_glfw-oal] + buildtype: [Debug, Release] + steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.1 + - uses: actions/checkout@v2 + with: + submodules: 'true' + - if: ${{ matrix.platform }} == "win-amd64-librw_gl3_glfw-mss" + name: Download glew + uses: carlosperate/download-file-action@v1.0.3 + with: + file-url: ${{env.GLEW_URL}} + - if: ${{ matrix.platform }} == "win-amd64-librw_gl3_glfw-mss" + name: Download glfw + uses: carlosperate/download-file-action@v1.0.3 + with: + file-url: ${{env.GLFW_URL}} + - if: ${{ matrix.platform }} == "win-amd64-librw_gl3_glfw-mss" + name: Unpack archives + run: | + 7z x ${{env.GLEW_FILE}} + 7z x ${{env.GLFW_FILE}} + - name: Configure build + run: | + ./premake5 vs2019 --with-librw --glewdir=${{env.GLEW_BASE}} --glfwdir64=${{env.GLFW_BASE}} + - name: Build + run: | + msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} + - name: Pack artifacts + run: | + 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* + - name: Upload artifact to actions + uses: actions/upload-artifact@v2 + with: + name: re3_${{matrix.buildtype}}_${{matrix.platform}} + path: ./bin/${{matrix.platform}}/${{matrix.buildtype}} +# - name: Upload artifact to Bintray +# uses: hpcsc/upload-bintray-docker-action@v1 +# with: +# repository: re3 +# package: ${{matrix.buildtype}}_${{matrix.platform}} +# version: 1.0-$(echo ${GITHUB_SHA} +# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}} +# username: gtamodding +# apiKey: ${{secrets.BINTRAY_API_KEY}} diff --git a/.github/workflows/msvc_x86.yml b/.github/workflows/msvc_x86.yml new file mode 100644 index 00000000..cecf7103 --- /dev/null +++ b/.github/workflows/msvc_x86.yml @@ -0,0 +1,68 @@ +name: msvc_x86 + +on: + pull_request: + push: + release: + types: published +env: + GLEW_VER: "2.1.0" + GLFW_VER: "3.3.2" + GLEW_BASE: "glew-2.1.0" + GLFW_BASE: "glfw-3.3.2.bin.WIN32" + GLEW_FILE: "glew-2.1.0-win32.zip" + GLFW_FILE: "glfw-3.3.2.bin.WIN32.zip" + GLEW_URL: "https://github.com/nigels-com/glew/releases/download/glew-2.1.0/glew-2.1.0-win32.zip" + GLFW_URL: "https://github.com/glfw/glfw/releases/download/3.3.2/glfw-3.3.2.bin.WIN32.zip" +jobs: + build: + runs-on: windows-2019 + strategy: + matrix: + platform: [win-x86-librw_d3d9-mss, win-x86-librw_gl3_glfw-mss, win-x86-librw_d3d9-oal, win-x86-librw_gl3_glfw-oal] + buildtype: [Debug, Release] + steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.1 + - uses: actions/checkout@v2 + with: + submodules: 'true' + - if: ${{ matrix.platform }} == "win-x86-librw_gl3_glfw-mss" + name: Download glew + uses: carlosperate/download-file-action@v1.0.3 + with: + file-url: ${{env.GLEW_URL}} + - if: ${{ matrix.platform }} == "win-x86-librw_gl3_glfw-mss" + name: Download glfw + uses: carlosperate/download-file-action@v1.0.3 + with: + file-url: ${{env.GLFW_URL}} + - if: ${{ matrix.platform }} == "win-x86-librw_gl3_glfw-mss" + name: Unpack archives + run: | + 7z x ${{env.GLEW_FILE}} + 7z x ${{env.GLFW_FILE}} + - name: Configure build + run: | + ./premake5 vs2019 --with-librw --glewdir=${{env.GLEW_BASE}} --glfwdir32=${{env.GLFW_BASE}} + - name: Build + run: | + msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} + - name: Pack artifacts + run: | + 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* + - name: Upload artifact to actions + uses: actions/upload-artifact@v2 + with: + name: re3_${{matrix.buildtype}}_${{matrix.platform}} + path: re3_${{matrix.buildtype}}_${{matrix.platform}}.zip +# - name: Upload artifact to Bintray +# uses: hpcsc/upload-bintray-docker-action@v1 +# with: +# repository: re3 +# package: ${{matrix.buildtype}}_${{matrix.platform}} +# version: 1.0-$(echo ${GITHUB_SHA} +# sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}} +# username: gtamodding +# apiKey: ${{secrets.BINTRAY_API_KEY}} + From 16ab30576acefc21f15fe5e7a621ec2efc67b47a Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Fri, 7 Aug 2020 17:34:29 +0200 Subject: [PATCH 010/112] Rename files to avoid conflict with revc --- .github/workflows/{msvc_amd64.yml => re3_msvc_amd64.yml} | 2 +- .github/workflows/{msvc_x86.yml => re3_msvc_x86.yml} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{msvc_amd64.yml => re3_msvc_amd64.yml} (99%) rename .github/workflows/{msvc_x86.yml => re3_msvc_x86.yml} (99%) diff --git a/.github/workflows/msvc_amd64.yml b/.github/workflows/re3_msvc_amd64.yml similarity index 99% rename from .github/workflows/msvc_amd64.yml rename to .github/workflows/re3_msvc_amd64.yml index 9f8a2803..07b793ba 100644 --- a/.github/workflows/msvc_amd64.yml +++ b/.github/workflows/re3_msvc_amd64.yml @@ -1,4 +1,4 @@ -name: msvc_amd64 +name: re3_msvc_amd64 on: pull_request: diff --git a/.github/workflows/msvc_x86.yml b/.github/workflows/re3_msvc_x86.yml similarity index 99% rename from .github/workflows/msvc_x86.yml rename to .github/workflows/re3_msvc_x86.yml index cecf7103..34e892cf 100644 --- a/.github/workflows/msvc_x86.yml +++ b/.github/workflows/re3_msvc_x86.yml @@ -1,4 +1,4 @@ -name: msvc_x86 +name: re3_msvc_x86 on: pull_request: From 4b6cc0188bcbfa0469d2d1d7ed674945e243b5cb Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Fri, 7 Aug 2020 17:51:15 +0200 Subject: [PATCH 011/112] Update CdStreamPosix.cpp --- src/core/CdStreamPosix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/CdStreamPosix.cpp b/src/core/CdStreamPosix.cpp index ff36c18f..e114a29a 100644 --- a/src/core/CdStreamPosix.cpp +++ b/src/core/CdStreamPosix.cpp @@ -152,7 +152,7 @@ CdStreamInit(int32 numChannels) } #ifdef __linux__ _gdwCdStreamFlags = O_RDONLY | O_NOATIME; -#elif __FreeBSD__ +#else _gdwCdStreamFlags = O_RDONLY; #endif // People say it's slower From 8392b9ad2fc578fd42dc9b5fa27a5da175bf92f5 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Fri, 7 Aug 2020 17:51:43 +0200 Subject: [PATCH 012/112] Update glfw.cpp --- src/skel/glfw/glfw.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 643a9e64..ed442348 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -211,7 +211,7 @@ psTimer(void) struct timespec start; #ifdef __linux__ clock_gettime(CLOCK_MONOTONIC_RAW, &start); -#elif __FreeBSD__ +#else clock_gettime(CLOCK_MONOTONIC, &start); #endif return start.tv_sec * 1000.0 + start.tv_nsec/1000000.0; From ce0633a0c2370ad0e075ca5ae0a65bc7061cc65d Mon Sep 17 00:00:00 2001 From: withmorten Date: Fri, 7 Aug 2020 18:21:05 +0200 Subject: [PATCH 013/112] remove CoUninitialize calls for FIX_BUGS (fixes PIX crash) and don't check return value for CoInitialize --- src/skel/win/win.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index 5c5c7ece..6d44ce80 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -1851,7 +1851,11 @@ void PlayMovieInWindow(int cmdShow, const char* szFile) MultiByteToWideChar(CP_ACP, 0, szFile, -1, wFileName, sizeof(wFileName) - 1); // Initialize COM +#ifdef FIX_BUGS // will also return S_FALSE if it has already been inited in the same thread + CoInitialize(nil); +#else JIF(CoInitialize(nil)); +#endif // Get the interface for DirectShow's GraphBuilder JIF(CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, @@ -2225,7 +2229,9 @@ WinMain(HINSTANCE instance, { CloseClip(); - CoUninitialize(); +#ifndef FIX_BUGS + CoUninitialize(); // CoUninitialize should only be called at the shutdown of a program, and by then it doesn't matter +#endif if ( CMenuManager::OS_Language == LANG_FRENCH || CMenuManager::OS_Language == LANG_GERMAN ) PlayMovieInWindow(cmdShow, "movies\\GTAtitlesGER.mpg"); @@ -2260,7 +2266,9 @@ WinMain(HINSTANCE instance, case GS_INIT_ONCE: { CloseClip(); - CoUninitialize(); +#ifndef FIX_BUGS + CoUninitialize(); // CoUninitialize should only be called at the shutdown of a program, and by then it doesn't matter +#endif #ifdef FIX_BUGS // draw one frame because otherwise we'll end up looking at black screen for a while if vsync is on From b5cd52b9b304e9a1f3c30d4d4146ceb92535f534 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 7 Aug 2020 19:58:21 +0300 Subject: [PATCH 014/112] rename for reVC --- .github/workflows/{re3_msvc_amd64.yml => reVC_msvc_amd64.yml} | 0 .github/workflows/{re3_msvc_x86.yml => reVC_msvc_x86.yml} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{re3_msvc_amd64.yml => reVC_msvc_amd64.yml} (100%) rename .github/workflows/{re3_msvc_x86.yml => reVC_msvc_x86.yml} (100%) diff --git a/.github/workflows/re3_msvc_amd64.yml b/.github/workflows/reVC_msvc_amd64.yml similarity index 100% rename from .github/workflows/re3_msvc_amd64.yml rename to .github/workflows/reVC_msvc_amd64.yml diff --git a/.github/workflows/re3_msvc_x86.yml b/.github/workflows/reVC_msvc_x86.yml similarity index 100% rename from .github/workflows/re3_msvc_x86.yml rename to .github/workflows/reVC_msvc_x86.yml From 2d9b89827123a37db756b0b629201efcf95c4d87 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 7 Aug 2020 19:59:32 +0300 Subject: [PATCH 015/112] more rename for reVC --- .github/workflows/reVC_msvc_amd64.yml | 2 +- .github/workflows/reVC_msvc_x86.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reVC_msvc_amd64.yml b/.github/workflows/reVC_msvc_amd64.yml index 07b793ba..e699b512 100644 --- a/.github/workflows/reVC_msvc_amd64.yml +++ b/.github/workflows/reVC_msvc_amd64.yml @@ -1,4 +1,4 @@ -name: re3_msvc_amd64 +name: reVC_msvc_amd64 on: pull_request: diff --git a/.github/workflows/reVC_msvc_x86.yml b/.github/workflows/reVC_msvc_x86.yml index 34e892cf..93a86a05 100644 --- a/.github/workflows/reVC_msvc_x86.yml +++ b/.github/workflows/reVC_msvc_x86.yml @@ -1,4 +1,4 @@ -name: re3_msvc_x86 +name: reVC_msvc_x86 on: pull_request: From 0328cb04d73dc9ce07aef4c9d1f870f4ae3e0204 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 7 Aug 2020 20:07:57 +0300 Subject: [PATCH 016/112] build fix --- .github/workflows/reVC_msvc_amd64.yml | 8 ++++---- .github/workflows/reVC_msvc_x86.yml | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/reVC_msvc_amd64.yml b/.github/workflows/reVC_msvc_amd64.yml index e699b512..23e7644f 100644 --- a/.github/workflows/reVC_msvc_amd64.yml +++ b/.github/workflows/reVC_msvc_amd64.yml @@ -47,19 +47,19 @@ jobs: ./premake5 vs2019 --with-librw --glewdir=${{env.GLEW_BASE}} --glfwdir64=${{env.GLFW_BASE}} - name: Build run: | - msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} + msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} - name: Pack artifacts run: | - 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* + 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* - name: Upload artifact to actions uses: actions/upload-artifact@v2 with: - name: re3_${{matrix.buildtype}}_${{matrix.platform}} + name: reVC_${{matrix.buildtype}}_${{matrix.platform}} path: ./bin/${{matrix.platform}}/${{matrix.buildtype}} # - name: Upload artifact to Bintray # uses: hpcsc/upload-bintray-docker-action@v1 # with: -# repository: re3 +# repository: reVC # package: ${{matrix.buildtype}}_${{matrix.platform}} # version: 1.0-$(echo ${GITHUB_SHA} # sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}} diff --git a/.github/workflows/reVC_msvc_x86.yml b/.github/workflows/reVC_msvc_x86.yml index 93a86a05..9b1c939c 100644 --- a/.github/workflows/reVC_msvc_x86.yml +++ b/.github/workflows/reVC_msvc_x86.yml @@ -47,19 +47,19 @@ jobs: ./premake5 vs2019 --with-librw --glewdir=${{env.GLEW_BASE}} --glfwdir32=${{env.GLFW_BASE}} - name: Build run: | - msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} + msbuild -m build/reVC.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}} - name: Pack artifacts run: | - 7z a re3_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* + 7z a reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip ./bin/${{matrix.platform}}/${{matrix.buildtype}}/* - name: Upload artifact to actions uses: actions/upload-artifact@v2 with: - name: re3_${{matrix.buildtype}}_${{matrix.platform}} - path: re3_${{matrix.buildtype}}_${{matrix.platform}}.zip + name: reVC_${{matrix.buildtype}}_${{matrix.platform}} + path: reVC_${{matrix.buildtype}}_${{matrix.platform}}.zip # - name: Upload artifact to Bintray # uses: hpcsc/upload-bintray-docker-action@v1 # with: -# repository: re3 +# repository: reVC # package: ${{matrix.buildtype}}_${{matrix.platform}} # version: 1.0-$(echo ${GITHUB_SHA} # sourcePath: ./bin/${{matrix.platform}}/${{matrix.buildtype}} From db406e3c8201f751166c919e8ed2ce6f2cf3de18 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 8 Aug 2020 13:07:55 +0300 Subject: [PATCH 017/112] submodules --- librw | 2 +- ogg | 2 +- opus | 2 +- opusfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/librw b/librw index 99c15d5e..d92996c6 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 99c15d5ed78cc112e1055cc89452dd57df28da58 +Subproject commit d92996c66d7938092218b42fc9197bd181606958 diff --git a/ogg b/ogg index 1e8d7cce..0bbcba4e 160000 --- a/ogg +++ b/ogg @@ -1 +1 @@ -Subproject commit 1e8d7cce266df61afc9d35db0283bbacc0237aba +Subproject commit 0bbcba4e7cf32324170470569c4527ffd0002870 diff --git a/opus b/opus index 8aa77672..484af258 160000 --- a/opus +++ b/opus @@ -1 +1 @@ -Subproject commit 8aa7767207b1e3633004c26aecbb67d1c5118485 +Subproject commit 484af2580b82dffd695fcd0841fc34a9dc5f7293 diff --git a/opusfile b/opusfile index eb252537..6452e838 160000 --- a/opusfile +++ b/opusfile @@ -1 +1 @@ -Subproject commit eb252537f374e30f7b68b84223c5a2303c05eca2 +Subproject commit 6452e838e68e8f4fc0b3599523c760ac6276ce89 From 2c8e1de610aacbba7cacc72a107d61a3ccbc423a Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 8 Aug 2020 13:09:05 +0300 Subject: [PATCH 018/112] submodules --- librw | 2 +- opusfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/librw b/librw index 162c2d20..d92996c6 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 162c2d203577e7e8ca727e699da33f7d54d76257 +Subproject commit d92996c66d7938092218b42fc9197bd181606958 diff --git a/opusfile b/opusfile index a55c164e..6452e838 160000 --- a/opusfile +++ b/opusfile @@ -1 +1 @@ -Subproject commit a55c164e9891a9326188b7d4d216ec9a88373739 +Subproject commit 6452e838e68e8f4fc0b3599523c760ac6276ce89 From 2af22cfabc6656c3278ab4eeb473eb4af57fe5f2 Mon Sep 17 00:00:00 2001 From: blingu <36486731+blingu@users.noreply.github.com> Date: Sat, 8 Aug 2020 12:49:38 +0200 Subject: [PATCH 019/112] Update premake5.lua --- premake5.lua | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/premake5.lua b/premake5.lua index 8f5e9ad9..f05a016d 100644 --- a/premake5.lua +++ b/premake5.lua @@ -76,10 +76,6 @@ workspace "re3" "linux-amd64-librw_gl3_glfw-oal", "linux-arm-librw_gl3_glfw-oal", } - filter { "system:bsd" } - platforms { - "bsd-amd64-librw_gl3_glfw-oal" - } filter "configurations:Debug" defines { "DEBUG" } @@ -93,9 +89,6 @@ workspace "re3" filter { "platforms:linux*" } system "linux" - - filter { "platforms:bsd*" } - system "bsd" filter { "platforms:*x86*" } architecture "x86" @@ -154,11 +147,6 @@ project "librw" targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}" files { path.join(Librw, "src/*.*") } files { path.join(Librw, "src/*/*.*") } - - filter "platforms:bsd*" - includedirs { "/usr/local/include" } - libdirs { "/usr/local/lib" } - filter "platforms:*RW33*" flags { "ExcludeFromBuild" } filter {} @@ -271,9 +259,6 @@ project "re3" filter "platforms:linux*oal" links { "openal", "mpg123", "sndfile", "pthread" } - filter "platforms:bsd*oal" - links { "openal", "mpg123", "sndfile", "pthread" } - if _OPTIONS["with-opus"] then filter {} links { "libogg" } @@ -321,8 +306,3 @@ project "re3" filter "platforms:linux*gl3_glfw*" links { "GL", "GLEW", "glfw" } - - filter "platforms:bsd*gl3_glfw*" - links { "GL", "GLEW", "glfw", "sysinfo" } - includedirs { "/usr/local/include" } - libdirs { "/usr/local/lib" } From c50160a992237d5031c730d1048c9cef4d9ac611 Mon Sep 17 00:00:00 2001 From: Blingu Date: Sat, 8 Aug 2020 13:07:55 +0200 Subject: [PATCH 020/112] fixed line formatting --- premake5.lua | 633 ++++++++++++++++++++++++++------------------------- 1 file changed, 327 insertions(+), 306 deletions(-) diff --git a/premake5.lua b/premake5.lua index f05a016d..a84d8ff4 100644 --- a/premake5.lua +++ b/premake5.lua @@ -1,308 +1,329 @@ -newoption { - trigger = "glewdir", - value = "PATH", - description = "Directory of GLEW", - default = "glew-2.1.0" -} - -newoption { - trigger = "glfwdir64", - value = "PATH", - description = "Directory of glfw", - default = "glfw-3.3.2.bin.WIN64", -} - -newoption { - trigger = "glfwdir32", - value = "PATH", - description = "Directory of glfw", - default = "glfw-3.3.2.bin.WIN32", -} - -newoption { - trigger = "with-librw", - description = "Build and use librw from this solution" -} - -newoption { - trigger = "with-opus", - description = "Build with opus" -} - -if(_OPTIONS["with-librw"]) then - Librw = "librw" -else - Librw = os.getenv("LIBRW") or "librw" -end - -function getsys(a) - if a == 'windows' then - return 'win' - end - return a -end - -function getarch(a) - if a == 'x86_64' then - return 'amd64' - elseif a == 'ARM' then - return 'arm' - end - return a -end - -workspace "re3" - language "C++" - configurations { "Debug", "Release" } - location "build" - symbols "Full" - staticruntime "off" - - filter { "system:windows" } - platforms { - "win-x86-RW33_d3d8-mss", - "win-x86-librw_d3d9-mss", - "win-x86-librw_gl3_glfw-mss", - "win-x86-RW33_d3d8-oal", - "win-x86-librw_d3d9-oal", - "win-x86-librw_gl3_glfw-oal", - "win-amd64-librw_d3d9-oal", - "win-amd64-librw_gl3_glfw-oal", - } - - filter { "system:linux" } - platforms { - "linux-x86-librw_gl3_glfw-oal", - "linux-amd64-librw_gl3_glfw-oal", - "linux-arm-librw_gl3_glfw-oal", - } - - filter "configurations:Debug" - defines { "DEBUG" } - - filter "configurations:Release" - defines { "NDEBUG" } - optimize "On" - - filter { "platforms:win*" } - system "windows" - - filter { "platforms:linux*" } - system "linux" - - filter { "platforms:*x86*" } - architecture "x86" - - filter { "platforms:*amd64*" } - architecture "amd64" - - filter { "platforms:*arm*" } - architecture "ARM" - - filter { "platforms:*librw_d3d9*" } - defines { "RW_D3D9" } - if(not _OPTIONS["with-librw"]) then - libdirs { path.join(Librw, "lib/win-%{getarch(cfg.architecture)}-d3d9/%{cfg.buildcfg}") } - end - - filter "platforms:*librw_gl3_glfw*" - defines { "RW_GL3" } - includedirs { path.join(_OPTIONS["glewdir"], "include") } - if(not _OPTIONS["with-librw"]) then - libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") } - end - - filter "platforms:*x86-librw_gl3_glfw*" - includedirs { path.join(_OPTIONS["glfwdir32"], "include") } - - filter "platforms:*amd64-librw_gl3_glfw*" - includedirs { path.join(_OPTIONS["glfwdir64"], "include") } - - filter "platforms:win*librw_gl3_glfw*" - defines { "GLEW_STATIC" } - - filter {} - - function setpaths (gamepath, exepath, scriptspath) - scriptspath = scriptspath or "" - if (gamepath) then - postbuildcommands { - '{COPY} "%{cfg.buildtarget.abspath}" "' .. gamepath .. scriptspath .. '%{cfg.buildtarget.name}"' - } - debugdir (gamepath) - if (exepath) then - -- Used VS variable $(TargetFileName) because it doesn't accept premake tokens. Does debugcommand even work outside VS?? - debugcommand (gamepath .. "$(TargetFileName)") - dir, file = exepath:match'(.*/)(.*)' - debugdir (gamepath .. (dir or "")) - end - end - --targetdir ("bin/%{prj.name}/" .. scriptspath) - end - -if(_OPTIONS["with-librw"]) then -project "librw" - kind "StaticLib" - targetname "rw" - targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}" - files { path.join(Librw, "src/*.*") } - files { path.join(Librw, "src/*/*.*") } - filter "platforms:*RW33*" - flags { "ExcludeFromBuild" } - filter {} -end - -local function addSrcFiles( prefix ) - return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" -end - -project "re3" - kind "WindowedApp" - targetname "re3" - targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" - - files { addSrcFiles("src") } - files { addSrcFiles("src/animation") } +newoption { + trigger = "glewdir", + value = "PATH", + description = "Directory of GLEW", + default = "glew-2.1.0" +} + +newoption { + trigger = "glfwdir64", + value = "PATH", + description = "Directory of glfw", + default = "glfw-3.3.2.bin.WIN64", +} + +newoption { + trigger = "glfwdir32", + value = "PATH", + description = "Directory of glfw", + default = "glfw-3.3.2.bin.WIN32", +} + +newoption { + trigger = "with-librw", + description = "Build and use librw from this solution" +} + +newoption { + trigger = "with-opus", + description = "Build with opus" +} + +if(_OPTIONS["with-librw"]) then + Librw = "librw" +else + Librw = os.getenv("LIBRW") or "librw" +end + +function getsys(a) + if a == 'windows' then + return 'win' + end + return a +end + +function getarch(a) + if a == 'x86_64' then + return 'amd64' + elseif a == 'ARM' then + return 'arm' + end + return a +end + +workspace "re3" + language "C++" + configurations { "Debug", "Release" } + location "build" + symbols "Full" + staticruntime "off" + + filter { "system:windows" } + platforms { + "win-x86-RW33_d3d8-mss", + "win-x86-librw_d3d9-mss", + "win-x86-librw_gl3_glfw-mss", + "win-x86-RW33_d3d8-oal", + "win-x86-librw_d3d9-oal", + "win-x86-librw_gl3_glfw-oal", + "win-amd64-librw_d3d9-oal", + "win-amd64-librw_gl3_glfw-oal", + } + + filter { "system:linux" } + platforms { + "linux-x86-librw_gl3_glfw-oal", + "linux-amd64-librw_gl3_glfw-oal", + "linux-arm-librw_gl3_glfw-oal", + } + + filter { "system:bsd" } + platforms { + "bsd-amd64-librw_gl3_glfw-oal" + } + + filter "configurations:Debug" + defines { "DEBUG" } + + filter "configurations:Release" + defines { "NDEBUG" } + optimize "On" + + filter { "platforms:win*" } + system "windows" + + filter { "platforms:linux*" } + system "linux" + + filter { "platforms:bsd*" } + system "bsd" + + filter { "platforms:*x86*" } + architecture "x86" + + filter { "platforms:*amd64*" } + architecture "amd64" + + filter { "platforms:*arm*" } + architecture "ARM" + + filter { "platforms:*librw_d3d9*" } + defines { "RW_D3D9" } + if(not _OPTIONS["with-librw"]) then + libdirs { path.join(Librw, "lib/win-%{getarch(cfg.architecture)}-d3d9/%{cfg.buildcfg}") } + end + + filter "platforms:*librw_gl3_glfw*" + defines { "RW_GL3" } + includedirs { path.join(_OPTIONS["glewdir"], "include") } + if(not _OPTIONS["with-librw"]) then + libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") } + end + + filter "platforms:*x86-librw_gl3_glfw*" + includedirs { path.join(_OPTIONS["glfwdir32"], "include") } + + filter "platforms:*amd64-librw_gl3_glfw*" + includedirs { path.join(_OPTIONS["glfwdir64"], "include") } + + filter "platforms:win*librw_gl3_glfw*" + defines { "GLEW_STATIC" } + + filter {} + + function setpaths (gamepath, exepath, scriptspath) + scriptspath = scriptspath or "" + if (gamepath) then + postbuildcommands { + '{COPY} "%{cfg.buildtarget.abspath}" "' .. gamepath .. scriptspath .. '%{cfg.buildtarget.name}"' + } + debugdir (gamepath) + if (exepath) then + -- Used VS variable $(TargetFileName) because it doesn't accept premake tokens. Does debugcommand even work outside VS?? + debugcommand (gamepath .. "$(TargetFileName)") + dir, file = exepath:match'(.*/)(.*)' + debugdir (gamepath .. (dir or "")) + end + end + --targetdir ("bin/%{prj.name}/" .. scriptspath) + end + +if(_OPTIONS["with-librw"]) then +project "librw" + kind "StaticLib" + targetname "rw" + targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}" + files { path.join(Librw, "src/*.*") } + files { path.join(Librw, "src/*/*.*") } + + filter "platforms:bsd*" + includedirs { "/usr/local/include" } + libdirs { "/usr/local/lib" } + + filter "platforms:*RW33*" + flags { "ExcludeFromBuild" } + filter {} +end + +local function addSrcFiles( prefix ) + return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" +end + +project "re3" + kind "WindowedApp" + targetname "re3" + targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + + files { addSrcFiles("src") } + files { addSrcFiles("src/animation") } files { addSrcFiles("src/audio") } - files { addSrcFiles("src/audio/eax") } - files { addSrcFiles("src/audio/oal") } - files { addSrcFiles("src/control") } - files { addSrcFiles("src/core") } - files { addSrcFiles("src/entities") } - files { addSrcFiles("src/math") } - files { addSrcFiles("src/modelinfo") } - files { addSrcFiles("src/objects") } - files { addSrcFiles("src/peds") } - files { addSrcFiles("src/render") } - files { addSrcFiles("src/rw") } - files { addSrcFiles("src/save") } - files { addSrcFiles("src/skel") } - files { addSrcFiles("src/skel/glfw") } - files { addSrcFiles("src/text") } - files { addSrcFiles("src/vehicles") } - files { addSrcFiles("src/weapons") } - files { addSrcFiles("src/extras") } - - includedirs { "src" } - includedirs { "src/animation" } + files { addSrcFiles("src/audio/eax") } + files { addSrcFiles("src/audio/oal") } + files { addSrcFiles("src/control") } + files { addSrcFiles("src/core") } + files { addSrcFiles("src/entities") } + files { addSrcFiles("src/math") } + files { addSrcFiles("src/modelinfo") } + files { addSrcFiles("src/objects") } + files { addSrcFiles("src/peds") } + files { addSrcFiles("src/render") } + files { addSrcFiles("src/rw") } + files { addSrcFiles("src/save") } + files { addSrcFiles("src/skel") } + files { addSrcFiles("src/skel/glfw") } + files { addSrcFiles("src/text") } + files { addSrcFiles("src/vehicles") } + files { addSrcFiles("src/weapons") } + files { addSrcFiles("src/extras") } + + includedirs { "src" } + includedirs { "src/animation" } includedirs { "src/audio" } - includedirs { "src/audio/eax" } - includedirs { "src/audio/oal" } - includedirs { "src/control" } - includedirs { "src/core" } - includedirs { "src/entities" } - includedirs { "src/math" } - includedirs { "src/modelinfo" } - includedirs { "src/objects" } - includedirs { "src/peds" } - includedirs { "src/render" } - includedirs { "src/rw" } - includedirs { "src/save/" } - includedirs { "src/skel/" } - includedirs { "src/skel/glfw" } - includedirs { "src/text" } - includedirs { "src/vehicles" } - includedirs { "src/weapons" } - includedirs { "src/extras" } - - if _OPTIONS["with-opus"] then - includedirs { "ogg/include" } - includedirs { "opus/include" } - includedirs { "opusfile/include" } - end - - filter "platforms:*mss" - defines { "AUDIO_MSS" } - includedirs { "sdk/milessdk/include" } - libdirs { "sdk/milessdk/lib" } - - if _OPTIONS["with-opus"] then - filter "platforms:win*" - libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" } - libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" } - libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" } - filter {} - defines { "AUDIO_OPUS" } - end - - filter "platforms:*oal" - defines { "AUDIO_OAL" } - - filter {} - if(os.getenv("GTA_III_RE_DIR")) then - setpaths("$(GTA_III_RE_DIR)/", "%(cfg.buildtarget.name)", "") - end - - filter "platforms:win*" - files { addSrcFiles("src/skel/win") } - includedirs { "src/skel/win" } - linkoptions "/SAFESEH:NO" - characterset ("MBCS") - targetextension ".exe" - - filter "platforms:win-x86*oal" - includedirs { "openal-soft/include" } - includedirs { "libsndfile.32/include" } - includedirs { "mpg123.32/include" } - libdirs { "mpg123.32/lib" } - libdirs { "libsndfile.32/lib" } - libdirs { "openal-soft/libs/Win32" } - - filter "platforms:win-amd64*oal" - includedirs { "openal-soft/include" } - includedirs { "libsndfile.64/include" } - includedirs { "mpg123.64/include" } - libdirs { "mpg123.64/lib" } - libdirs { "libsndfile.64/lib" } - libdirs { "openal-soft/libs/Win64" } - - filter "platforms:linux*oal" - links { "openal", "mpg123", "sndfile", "pthread" } - - if _OPTIONS["with-opus"] then - filter {} - links { "libogg" } - links { "opus" } - links { "opusfile" } - end - - filter "platforms:*RW33*" - staticruntime "on" - includedirs { "sdk/rwsdk/include/d3d8" } - libdirs { "sdk/rwsdk/lib/d3d8/release" } - links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" } - defines { "RWLIBS" } - linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text" - - filter "platforms:*librw*" - defines { "LIBRW" } - files { addSrcFiles("src/fakerw") } - includedirs { "src/fakerw" } - includedirs { Librw } - if(_OPTIONS["with-librw"]) then - libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } - end - links { "rw" } - - filter "platforms:*d3d9*" - links { "d3d9" } - - filter "platforms:*x86*d3d*" - includedirs { "sdk/dx8sdk/include" } - libdirs { "sdk/dx8sdk/lib" } - - filter "platforms:*amd64*d3d9*" - defines { "USE_D3D9" } - - filter "platforms:win-x86*gl3_glfw*" - libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } - libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } - links { "opengl32", "glew32s", "glfw3" } - - filter "platforms:win-amd64*gl3_glfw*" - libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/x64") } - libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } - links { "opengl32", "glew32s", "glfw3" } - - filter "platforms:linux*gl3_glfw*" - links { "GL", "GLEW", "glfw" } + includedirs { "src/audio/eax" } + includedirs { "src/audio/oal" } + includedirs { "src/control" } + includedirs { "src/core" } + includedirs { "src/entities" } + includedirs { "src/math" } + includedirs { "src/modelinfo" } + includedirs { "src/objects" } + includedirs { "src/peds" } + includedirs { "src/render" } + includedirs { "src/rw" } + includedirs { "src/save/" } + includedirs { "src/skel/" } + includedirs { "src/skel/glfw" } + includedirs { "src/text" } + includedirs { "src/vehicles" } + includedirs { "src/weapons" } + includedirs { "src/extras" } + + if _OPTIONS["with-opus"] then + includedirs { "ogg/include" } + includedirs { "opus/include" } + includedirs { "opusfile/include" } + end + + filter "platforms:*mss" + defines { "AUDIO_MSS" } + includedirs { "sdk/milessdk/include" } + libdirs { "sdk/milessdk/lib" } + + if _OPTIONS["with-opus"] then + filter "platforms:win*" + libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" } + libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" } + libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" } + filter {} + defines { "AUDIO_OPUS" } + end + + filter "platforms:*oal" + defines { "AUDIO_OAL" } + + filter {} + if(os.getenv("GTA_III_RE_DIR")) then + setpaths("$(GTA_III_RE_DIR)/", "%(cfg.buildtarget.name)", "") + end + + filter "platforms:win*" + files { addSrcFiles("src/skel/win") } + includedirs { "src/skel/win" } + linkoptions "/SAFESEH:NO" + characterset ("MBCS") + targetextension ".exe" + + filter "platforms:win-x86*oal" + includedirs { "openal-soft/include" } + includedirs { "libsndfile.32/include" } + includedirs { "mpg123.32/include" } + libdirs { "mpg123.32/lib" } + libdirs { "libsndfile.32/lib" } + libdirs { "openal-soft/libs/Win32" } + + filter "platforms:win-amd64*oal" + includedirs { "openal-soft/include" } + includedirs { "libsndfile.64/include" } + includedirs { "mpg123.64/include" } + libdirs { "mpg123.64/lib" } + libdirs { "libsndfile.64/lib" } + libdirs { "openal-soft/libs/Win64" } + + filter "platforms:linux*oal" + links { "openal", "mpg123", "sndfile", "pthread" } + + filter "platforms:bsd*oal" + links { "openal", "mpg123", "sndfile", "pthread" } + + if _OPTIONS["with-opus"] then + filter {} + links { "libogg" } + links { "opus" } + links { "opusfile" } + end + + filter "platforms:*RW33*" + staticruntime "on" + includedirs { "sdk/rwsdk/include/d3d8" } + libdirs { "sdk/rwsdk/lib/d3d8/release" } + links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" } + defines { "RWLIBS" } + linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text" + + filter "platforms:*librw*" + defines { "LIBRW" } + files { addSrcFiles("src/fakerw") } + includedirs { "src/fakerw" } + includedirs { Librw } + if(_OPTIONS["with-librw"]) then + libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } + end + links { "rw" } + + filter "platforms:*d3d9*" + links { "d3d9" } + + filter "platforms:*x86*d3d*" + includedirs { "sdk/dx8sdk/include" } + libdirs { "sdk/dx8sdk/lib" } + + filter "platforms:*amd64*d3d9*" + defines { "USE_D3D9" } + + filter "platforms:win-x86*gl3_glfw*" + libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } + libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } + links { "opengl32", "glew32s", "glfw3" } + + filter "platforms:win-amd64*gl3_glfw*" + libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/x64") } + libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) } + links { "opengl32", "glew32s", "glfw3" } + + filter "platforms:linux*gl3_glfw*" + links { "GL", "GLEW", "glfw" } + + filter "platforms:bsd*gl3_glfw*" + links { "GL", "GLEW", "glfw", "sysinfo" } + includedirs { "/usr/local/include" } + libdirs { "/usr/local/lib" } From 24a1644b2a1f4cd0b20385fd29acd7be9808e027 Mon Sep 17 00:00:00 2001 From: withmorten Date: Sat, 8 Aug 2020 17:12:23 +0200 Subject: [PATCH 021/112] don't CoUninitialize for NO_MOVIES --- src/skel/win/win.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index 6d44ce80..cf4749b1 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -2227,10 +2227,9 @@ WinMain(HINSTANCE instance, case GS_INIT_INTRO_MPEG: { +#ifndef NO_MOVIES CloseClip(); - -#ifndef FIX_BUGS - CoUninitialize(); // CoUninitialize should only be called at the shutdown of a program, and by then it doesn't matter + CoUninitialize(); #endif if ( CMenuManager::OS_Language == LANG_FRENCH || CMenuManager::OS_Language == LANG_GERMAN ) @@ -2265,9 +2264,9 @@ WinMain(HINSTANCE instance, case GS_INIT_ONCE: { +#ifndef NO_MOVIES CloseClip(); -#ifndef FIX_BUGS - CoUninitialize(); // CoUninitialize should only be called at the shutdown of a program, and by then it doesn't matter + CoUninitialize(); #endif #ifdef FIX_BUGS From 1a7270190352d23bc7c8a9ea1952b1cf606ad37b Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Sat, 8 Aug 2020 18:14:01 +0300 Subject: [PATCH 022/112] Revert "little emergecy fix for shadows with librw" This reverts commit 658f94f15591b6cb4c73f51ec5e2f7e3e99462e7. --- src/peds/Ped.cpp | 8 +++++--- src/render/Shadows.cpp | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index be39f26e..4e1c3c6d 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -2788,12 +2788,14 @@ CPed::SetModelIndex(uint32 mi) // This is a mistake by R*, velocity is CVector, whereas m_vecAnimMoveDelta is CVector2D. (*RPANIMBLENDCLUMPDATA(m_rwObject))->velocity = (CVector*) &m_vecAnimMoveDelta; +#ifdef PED_SKIN if(modelInfo->GetHitColModel() == nil) modelInfo->CreateHitColModelSkinned(GetClump()); - UpdateRpHAnim(); - -#ifndef LIBRW + if (IsClumpSkinned(GetClump())) // condition isn't there in VC + UpdateRpHAnim(); +#endif +#if 1 if (!m_pRTShadow) { m_pRTShadow = new CCutsceneShadow; diff --git a/src/render/Shadows.cpp b/src/render/Shadows.cpp index 0ee63b9a..9b864d27 100644 --- a/src/render/Shadows.cpp +++ b/src/render/Shadows.cpp @@ -853,7 +853,7 @@ CShadows::StoreShadowForPed(CPed *pPed, float fDisplacementX, float fDisplacemen { if ( CTimeCycle::GetShadowStrength() != 0 ) { - #ifndef LIBRW + #if 1 CCutsceneShadow *pShadow = pPed->m_pRTShadow; if (pShadow) From d2d8bea51e5b5903fa4106a94a61f07717c48f42 Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Sun, 9 Aug 2020 01:30:57 +0300 Subject: [PATCH 023/112] rem pobj assert --- src/objects/ParticleObject.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/objects/ParticleObject.cpp b/src/objects/ParticleObject.cpp index b2a77bc5..6ed74214 100644 --- a/src/objects/ParticleObject.cpp +++ b/src/objects/ParticleObject.cpp @@ -124,8 +124,6 @@ CParticleObject::AddObject(uint16 type, CVector const &pos, CVector const &targe { CParticleObject *pobj = pUnusedListHead; - ASSERT(pobj != nil); - if ( pobj == nil ) { printf("Error: No particle objects available!\n"); From 5dc7ff98f2b14985693524a7a660990268f30095 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 13:17:05 +0200 Subject: [PATCH 024/112] corona fixes --- src/render/Coronas.cpp | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/render/Coronas.cpp b/src/render/Coronas.cpp index 5bf89403..d2d229f9 100644 --- a/src/render/Coronas.cpp +++ b/src/render/Coronas.cpp @@ -255,7 +255,10 @@ CCoronas::Render(void) CVector spriteCoors; float spritew, spriteh; - if(CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){ + if(!CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){ + aCoronas[i].offScreen = true; + aCoronas[i].sightClear = false; + }else{ aCoronas[i].offScreen = false; if(spriteCoors.x < 0.0f || spriteCoors.y < 0.0f || @@ -289,10 +292,7 @@ CCoronas::Render(void) } - if(aCoronas[i].fadeAlpha == 0) - continue; - - if(spriteCoors.z < aCoronas[i].drawDist){ + if(aCoronas[i].fadeAlpha && spriteCoors.z < aCoronas[i].drawDist){ float recipz = 1.0f/spriteCoors.z; float fadeDistance = aCoronas[i].drawDist / 2.0f; float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance; @@ -367,9 +367,6 @@ CCoronas::Render(void) recipz, 255); } } - }else{ - aCoronas[i].offScreen = true; - aCoronas[i].sightClear = false; } } } @@ -390,23 +387,24 @@ CCoronas::Render(void) if(!aCoronas[i].hasValue[j] || !aCoronas[i].hasValue[j+1]) continue; - int mod1 = (float)(6 - j) / 6 * 128; - int mod2 = (float)(6 - (j+1)) / 6 * 128; + int alpha1 = (float)(6 - j) / 6 * 128; + int alpha2 = (float)(6 - (j+1)) / 6 * 128; RwIm2DVertexSetScreenX(&vertexbufferX[0], aCoronas[i].prevX[j]); RwIm2DVertexSetScreenY(&vertexbufferX[0], aCoronas[i].prevY[j]); - RwIm2DVertexSetIntRGBA(&vertexbufferX[0], aCoronas[i].prevRed[j] * mod1 / 256, aCoronas[i].prevGreen[j] * mod1 / 256, aCoronas[i].prevBlue[j] * mod1 / 256, 255); + RwIm2DVertexSetIntRGBA(&vertexbufferX[0], aCoronas[i].prevRed[j] * alpha1 / 256, aCoronas[i].prevGreen[j] * alpha1 / 256, aCoronas[i].prevBlue[j] * alpha1 / 256, 255); RwIm2DVertexSetScreenX(&vertexbufferX[1], aCoronas[i].prevX[j+1]); RwIm2DVertexSetScreenY(&vertexbufferX[1], aCoronas[i].prevY[j+1]); - RwIm2DVertexSetIntRGBA(&vertexbufferX[1], aCoronas[i].prevRed[j+1] * mod2 / 256, aCoronas[i].prevGreen[j+1] * mod2 / 256, aCoronas[i].prevBlue[j+1] * mod2 / 256, 255); + RwIm2DVertexSetIntRGBA(&vertexbufferX[1], aCoronas[i].prevRed[j+1] * alpha2 / 256, aCoronas[i].prevGreen[j+1] * alpha2 / 256, aCoronas[i].prevBlue[j+1] * alpha2 / 256, 255); - // BUG: game doesn't do this +#ifdef FIX_BUGS RwIm2DVertexSetScreenZ(&vertexbufferX[0], RwIm2DGetNearScreenZ()); RwIm2DVertexSetCameraZ(&vertexbufferX[0], RwCameraGetNearClipPlane(Scene.camera)); RwIm2DVertexSetRecipCameraZ(&vertexbufferX[0], 1.0f/RwCameraGetNearClipPlane(Scene.camera)); RwIm2DVertexSetScreenZ(&vertexbufferX[1], RwIm2DGetNearScreenZ()); RwIm2DVertexSetCameraZ(&vertexbufferX[1], RwCameraGetNearClipPlane(Scene.camera)); RwIm2DVertexSetRecipCameraZ(&vertexbufferX[1], 1.0f/RwCameraGetNearClipPlane(Scene.camera)); +#endif RwIm2DRenderLine(vertexbufferX, 2, 0, 1); } @@ -425,6 +423,10 @@ CCoronas::RenderReflections(void) CEntity *entity; if(CWeather::WetRoads > 0.0f){ +#ifdef FIX_BUGS + CSprite::InitSpriteBuffer(); +#endif + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); @@ -435,7 +437,8 @@ CCoronas::RenderReflections(void) for(i = 0; i < NUMCORONAS; i++){ if(aCoronas[i].id == 0 || - aCoronas[i].fadeAlpha == 0 && aCoronas[i].alpha == 0) + aCoronas[i].fadeAlpha == 0 && aCoronas[i].alpha == 0 || + aCoronas[i].reflection == 0) continue; // check if we want a reflection on this corona @@ -450,11 +453,8 @@ CCoronas::RenderReflections(void) } } - if(!aCoronas[i].renderReflection) - continue; - // Don't draw if reflection is too high - if(aCoronas[i].heightAboveRoad < 20.0f){ + if(aCoronas[i].renderReflection && aCoronas[i].heightAboveRoad < 20.0f){ // don't draw if camera is below road if(CCoronas::aCoronas[i].coors.z - aCoronas[i].heightAboveRoad > TheCamera.GetPosition().z) continue; @@ -466,13 +466,14 @@ CCoronas::RenderReflections(void) float spritew, spriteh; if(CSprite::CalcScreenCoors(coors, spriteCoors, &spritew, &spriteh, true)){ float drawDist = 0.75f * aCoronas[i].drawDist; - drawDist = Min(drawDist, 50.0f); + drawDist = Min(drawDist, 55.0f); if(spriteCoors.z < drawDist){ float fadeDistance = drawDist / 2.0f; float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance; distanceFade = clamp(distanceFade, 0.0f, 1.0f); float recipz = 1.0f/RwCameraGetNearClipPlane(Scene.camera); - int intensity = (20.0f - aCoronas[i].heightAboveRoad) * 230.0 * distanceFade*CWeather::WetRoads * 0.05f; + float heightFade = (20.0f - aCoronas[i].heightAboveRoad)/20.0f; + int intensity = distanceFade*heightFade * 230.0 * CWeather::WetRoads; CSprite::RenderBufferedOneXLUSprite( spriteCoors.x, spriteCoors.y, RwIm2DGetNearScreenZ(), From b02c7cdc442af117659df6cd5fc39f9184279c0d Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 13:17:48 +0200 Subject: [PATCH 025/112] coronas done --- src/core/main.cpp | 2 +- src/render/Coronas.cpp | 188 +++++++++++++++++++++++++++++++++++------ src/render/Coronas.h | 26 +++--- 3 files changed, 177 insertions(+), 39 deletions(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index d4ef8c4b..83d4b66e 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -852,7 +852,7 @@ RenderScene(void) CRenderer::RenderFadingInEntities(); RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE); CWeather::RenderRainStreaks(); - // CCoronas::RenderSunReflection + CCoronas::RenderSunReflection(); } void diff --git a/src/render/Coronas.cpp b/src/render/Coronas.cpp index efe486fe..df5dfadb 100644 --- a/src/render/Coronas.cpp +++ b/src/render/Coronas.cpp @@ -2,6 +2,7 @@ #include "main.h" #include "General.h" +#include "RenderBuffer.h" #include "TxdStore.h" #include "Camera.h" #include "Sprite.h" @@ -12,6 +13,8 @@ #include "Timecycle.h" #include "Coronas.h" +//--MIAMI: file done + struct FlareDef { float position; @@ -130,13 +133,21 @@ void CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, const CVector &coors, float size, float drawDist, RwTexture *tex, int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle, - bool longDist, float nearDist) + bool useNearDist, float nearDist) { int i; if(sq(drawDist) < (TheCamera.GetPosition() - coors).MagnitudeSqr2D()) return; + if(useNearDist){ + float dist = (TheCamera.GetPosition() - coors).Magnitude(); + if(dist < 35.0f) + return; + if(dist < 50.0f) + alpha *= (dist - 35.0f)/(50.0f - 35.0f); + } + for(i = 0; i < NUMCORONAS; i++) if(aCoronas[i].id == id) break; @@ -189,17 +200,19 @@ CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 al aCoronas[i].reflection = reflection; aCoronas[i].LOScheck = LOScheck; aCoronas[i].drawStreak = drawStreak; + aCoronas[i].useNearDist = useNearDist; + aCoronas[i].nearDist = nearDist; } void CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, const CVector &coors, float size, float drawDist, uint8 type, int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle, - bool longDist, float nearDist) + bool useNearDist, float nearDist) { RegisterCorona(id, red, green, blue, alpha, coors, size, drawDist, gpCoronaTexture[type], flareType, reflection, LOScheck, drawStreak, someAngle, - longDist, nearDist); + useNearDist, nearDist); } void @@ -258,7 +271,10 @@ CCoronas::Render(void) CVector spriteCoors; float spritew, spriteh; - if(CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){ + if(!CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){ + aCoronas[i].offScreen = true; + aCoronas[i].sightClear = false; + }else{ aCoronas[i].offScreen = false; if(spriteCoors.x < 0.0f || spriteCoors.y < 0.0f || @@ -292,10 +308,7 @@ CCoronas::Render(void) } - if(aCoronas[i].fadeAlpha == 0) - continue; - - if(spriteCoors.z < aCoronas[i].drawDist){ + if(aCoronas[i].fadeAlpha && spriteCoors.z < aCoronas[i].drawDist){ float recipz = 1.0f/spriteCoors.z; float fadeDistance = aCoronas[i].drawDist / 2.0f; float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance; @@ -312,7 +325,7 @@ CCoronas::Render(void) if(CCoronas::aCoronas[i].id == SUN_CORE) spriteCoors.z = 0.95f * RwCameraGetFarClipPlane(Scene.camera); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(aCoronas[i].texture)); - spriteCoors.z -= 1.5f; + spriteCoors.z -= aCoronas[i].nearDist; if(aCoronas[i].texture == gpCoronaTexture[8]){ // what's this? @@ -370,14 +383,11 @@ CCoronas::Render(void) recipz, 255); } } - }else{ - aCoronas[i].offScreen = true; - aCoronas[i].sightClear = false; } } } - RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE); @@ -393,23 +403,24 @@ CCoronas::Render(void) if(!aCoronas[i].hasValue[j] || !aCoronas[i].hasValue[j+1]) continue; - int mod1 = (float)(6 - j) / 6 * 128; - int mod2 = (float)(6 - (j+1)) / 6 * 128; + int alpha1 = (float)(6 - j) / 6 * 128; + int alpha2 = (float)(6 - (j+1)) / 6 * 128; RwIm2DVertexSetScreenX(&vertexbufferX[0], aCoronas[i].prevX[j]); RwIm2DVertexSetScreenY(&vertexbufferX[0], aCoronas[i].prevY[j]); - RwIm2DVertexSetIntRGBA(&vertexbufferX[0], aCoronas[i].prevRed[j] * mod1 / 256, aCoronas[i].prevGreen[j] * mod1 / 256, aCoronas[i].prevBlue[j] * mod1 / 256, 255); + RwIm2DVertexSetIntRGBA(&vertexbufferX[0], aCoronas[i].prevRed[j] * alpha1 / 256, aCoronas[i].prevGreen[j] * alpha1 / 256, aCoronas[i].prevBlue[j] * alpha1 / 256, 255); RwIm2DVertexSetScreenX(&vertexbufferX[1], aCoronas[i].prevX[j+1]); RwIm2DVertexSetScreenY(&vertexbufferX[1], aCoronas[i].prevY[j+1]); - RwIm2DVertexSetIntRGBA(&vertexbufferX[1], aCoronas[i].prevRed[j+1] * mod2 / 256, aCoronas[i].prevGreen[j+1] * mod2 / 256, aCoronas[i].prevBlue[j+1] * mod2 / 256, 255); + RwIm2DVertexSetIntRGBA(&vertexbufferX[1], aCoronas[i].prevRed[j+1] * alpha2 / 256, aCoronas[i].prevGreen[j+1] * alpha2 / 256, aCoronas[i].prevBlue[j+1] * alpha2 / 256, 255); - // BUG: game doesn't do this +#ifdef FIX_BUGS RwIm2DVertexSetScreenZ(&vertexbufferX[0], RwIm2DGetNearScreenZ()); RwIm2DVertexSetCameraZ(&vertexbufferX[0], RwCameraGetNearClipPlane(Scene.camera)); RwIm2DVertexSetRecipCameraZ(&vertexbufferX[0], 1.0f/RwCameraGetNearClipPlane(Scene.camera)); RwIm2DVertexSetScreenZ(&vertexbufferX[1], RwIm2DGetNearScreenZ()); RwIm2DVertexSetCameraZ(&vertexbufferX[1], RwCameraGetNearClipPlane(Scene.camera)); RwIm2DVertexSetRecipCameraZ(&vertexbufferX[1], 1.0f/RwCameraGetNearClipPlane(Scene.camera)); +#endif RwIm2DRenderLine(vertexbufferX, 2, 0, 1); } @@ -428,6 +439,8 @@ CCoronas::RenderReflections(void) CEntity *entity; if(CWeather::WetRoads > 0.0f){ + CSprite::InitSpriteBuffer(); + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); @@ -438,7 +451,8 @@ CCoronas::RenderReflections(void) for(i = 0; i < NUMCORONAS; i++){ if(aCoronas[i].id == 0 || - aCoronas[i].fadeAlpha == 0 && aCoronas[i].alpha == 0) + aCoronas[i].fadeAlpha == 0 && aCoronas[i].alpha == 0 || + aCoronas[i].reflection == 0) continue; // check if we want a reflection on this corona @@ -453,11 +467,8 @@ CCoronas::RenderReflections(void) } } - if(!aCoronas[i].renderReflection) - continue; - // Don't draw if reflection is too high - if(aCoronas[i].heightAboveRoad < 20.0f){ + if(aCoronas[i].renderReflection && aCoronas[i].heightAboveRoad < 20.0f){ // don't draw if camera is below road if(CCoronas::aCoronas[i].coors.z - aCoronas[i].heightAboveRoad > TheCamera.GetPosition().z) continue; @@ -469,13 +480,14 @@ CCoronas::RenderReflections(void) float spritew, spriteh; if(CSprite::CalcScreenCoors(coors, spriteCoors, &spritew, &spriteh, true)){ float drawDist = 0.75f * aCoronas[i].drawDist; - drawDist = Min(drawDist, 50.0f); + drawDist = Min(drawDist, 55.0f); if(spriteCoors.z < drawDist){ float fadeDistance = drawDist / 2.0f; float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance; distanceFade = clamp(distanceFade, 0.0f, 1.0f); float recipz = 1.0f/RwCameraGetNearClipPlane(Scene.camera); - int intensity = (20.0f - aCoronas[i].heightAboveRoad) * 230.0 * distanceFade*CWeather::WetRoads * 0.05f; + float heightFade = (20.0f - aCoronas[i].heightAboveRoad)/20.0f; + int intensity = distanceFade*heightFade * 230.0 * CWeather::WetRoads; CSprite::RenderBufferedOneXLUSprite( spriteCoors.x, spriteCoors.y, RwIm2DGetNearScreenZ(), @@ -504,6 +516,130 @@ CCoronas::RenderReflections(void) } } +void +CCoronas::RenderSunReflection(void) +{ + float sunZDir = CTimeCycle::GetSunDirection().z; + if(sunZDir > -0.05f){ + float intensity = (0.3f - Abs(sunZDir - 0.25f))/0.3f * + (1.0f - CWeather::CloudCoverage) * + (1.0f - CWeather::Foggyness) * + (1.0f - CWeather::Wind); + if(intensity > 0.0f){ + int r = (CTimeCycle::GetSunCoreRed() + CTimeCycle::GetSunCoronaRed())*intensity*0.25f; + int g = (CTimeCycle::GetSunCoreGreen() + CTimeCycle::GetSunCoronaGreen())*intensity*0.25f; + int b = (CTimeCycle::GetSunCoreBlue() + CTimeCycle::GetSunCoronaBlue())*intensity*0.25f; + + CVector sunPos = 40.0f*CTimeCycle::GetSunDirection() + TheCamera.GetPosition(); + sunPos.z = 0.5f*CWeather::Wind + 6.1f; + CVector sunDir = CTimeCycle::GetSunDirection(); + sunDir.z = 0.0; + sunDir.Normalise(); + + TempBufferIndicesStored = 6; + TempBufferRenderIndexList[0] = 2; + TempBufferRenderIndexList[1] = 1; + TempBufferRenderIndexList[2] = 0; + TempBufferRenderIndexList[3] = 2; + TempBufferRenderIndexList[4] = 3; + TempBufferRenderIndexList[5] = 1; + + // 60 unit square in sun direction + TempBufferVerticesStored = 4; + RwIm3DVertexSetRGBA(&TempBufferRenderVertices[0], r, g, b, 255); + RwIm3DVertexSetPos(&TempBufferRenderVertices[0], + sunPos.x + 30.0f*sunDir.y, + sunPos.y - 30.0f*sunDir.x, + sunPos.z); + RwIm3DVertexSetRGBA(&TempBufferRenderVertices[1], r, g, b, 255); + RwIm3DVertexSetPos(&TempBufferRenderVertices[1], + sunPos.x - 30.0f*sunDir.y, + sunPos.y + 30.0f*sunDir.x, + sunPos.z); + RwIm3DVertexSetRGBA(&TempBufferRenderVertices[2], r, g, b, 255); + RwIm3DVertexSetPos(&TempBufferRenderVertices[2], + sunPos.x + 60.0f*sunDir.x + 30.0f*sunDir.y, + sunPos.y + 60.0f*sunDir.y - 30.0f*sunDir.x, + sunPos.z); + RwIm3DVertexSetRGBA(&TempBufferRenderVertices[3], r, g, b, 255); + RwIm3DVertexSetPos(&TempBufferRenderVertices[3], + sunPos.x + 60.0f*sunDir.x - 30.0f*sunDir.y, + sunPos.y + 60.0f*sunDir.y + 30.0f*sunDir.x, + sunPos.z); + + RwIm3DVertexSetU(&TempBufferRenderVertices[0], 0.0f); + RwIm3DVertexSetV(&TempBufferRenderVertices[0], 1.0f); + RwIm3DVertexSetU(&TempBufferRenderVertices[1], 1.0f); + RwIm3DVertexSetV(&TempBufferRenderVertices[1], 1.0f); + RwIm3DVertexSetU(&TempBufferRenderVertices[2], 0.0f); + RwIm3DVertexSetV(&TempBufferRenderVertices[2], 0.5f); + RwIm3DVertexSetU(&TempBufferRenderVertices[3], 1.0f); + RwIm3DVertexSetV(&TempBufferRenderVertices[3], 0.5f); + + int timeInc = 0; + int sideInc = 0; + int fwdInc = 0; + for(int i = 0; i < 20; i++){ + TempBufferRenderIndexList[TempBufferIndicesStored + 0] = TempBufferVerticesStored; + TempBufferRenderIndexList[TempBufferIndicesStored + 1] = TempBufferVerticesStored-1; + TempBufferRenderIndexList[TempBufferIndicesStored + 2] = TempBufferVerticesStored-2; + TempBufferRenderIndexList[TempBufferIndicesStored + 3] = TempBufferVerticesStored; + TempBufferRenderIndexList[TempBufferIndicesStored + 4] = TempBufferVerticesStored+1; + TempBufferRenderIndexList[TempBufferIndicesStored + 5] = TempBufferVerticesStored-1; + TempBufferIndicesStored += 6; + + // What a weird way to do it... + float fwdLen = fwdInc/20 + 60; + float sideLen = sideInc/20 + 30; + sideLen += 10.0f*Sin((float)(CTimer::GetTimeInMilliseconds()+timeInc & 0x7FF)/0x800*TWOPI); + timeInc += 900; + sideInc += 970; + fwdInc += 1440; + + RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored+0], r, g, b, 255); + RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored+0], + sunPos.x + fwdLen*sunDir.x + sideLen*sunDir.y, + sunPos.y + fwdLen*sunDir.y - sideLen*sunDir.x, + sunPos.z); + + RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored+1], r, g, b, 255); + RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored+1], + sunPos.x + fwdLen*sunDir.x - sideLen*sunDir.x, + sunPos.y + fwdLen*sunDir.y + sideLen*sunDir.y, + sunPos.z); + + RwIm3DVertexSetU(&TempBufferRenderVertices[TempBufferVerticesStored+0], 0.0f); + RwIm3DVertexSetV(&TempBufferRenderVertices[TempBufferVerticesStored+0], 0.5f); + RwIm3DVertexSetU(&TempBufferRenderVertices[TempBufferVerticesStored+1], 1.0f); + RwIm3DVertexSetV(&TempBufferRenderVertices[TempBufferVerticesStored+1], 0.5f); + TempBufferVerticesStored += 2; + } + + + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATEFOGTYPE, (void*)rwFOGTYPELINEAR); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[4])); + if(RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, nil, rwIM3D_VERTEXUV)){ + RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored); + RwIm3DEnd(); + } + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); + TempBufferVerticesStored = 0; + TempBufferIndicesStored = 0; + } + } +} + void CCoronas::DoSunAndMoon(void) { @@ -520,7 +656,7 @@ CCoronas::DoSunAndMoon(void) 255, sunCoors, size, 999999.88f, TYPE_STAR, FLARE_NONE, REFLECTION_OFF, LOSCHECK_OFF, STREAK_OFF, 0.0f); - if(CTimeCycle::GetSunDirection().z > 0.0f) + if(CTimeCycle::GetSunDirection().z > 0.0f && !CGame::IsInInterior()) RegisterCorona(SUN_CORONA, CTimeCycle::GetSunCoronaRed(), CTimeCycle::GetSunCoronaGreen(), CTimeCycle::GetSunCoronaBlue(), 255, sunCoors, 25.0f * CTimeCycle::GetSunSize(), diff --git a/src/render/Coronas.h b/src/render/Coronas.h index cb4e8583..45f027d8 100644 --- a/src/render/Coronas.h +++ b/src/render/Coronas.h @@ -4,19 +4,21 @@ extern RwTexture *gpCoronaTexture[9]; struct CRegisteredCorona { + CVector coors; uint32 id; uint32 lastLOScheck; RwTexture *texture; + float size; + float someAngle; + float drawDist; + float nearDist; + float heightAboveRoad; uint8 red; uint8 green; uint8 blue; uint8 alpha; // alpha when fully visible uint8 fadeAlpha; // actual value used for rendering, faded - CVector coors; - float size; - float someAngle; bool registeredThisFrame; - float drawDist; int8 flareType; int8 reflection; @@ -25,12 +27,11 @@ struct CRegisteredCorona uint8 firstUpdate : 1; uint8 drawStreak : 1; uint8 sightClear : 1; + uint8 useNearDist : 1; + uint8 renderReflection : 1; - bool renderReflection; - float heightAboveRoad; - - float prevX[6]; - float prevY[6]; + int16 prevX[6]; + int16 prevY[6]; uint8 prevRed[6]; uint8 prevGreen[6]; uint8 prevBlue[6]; @@ -39,7 +40,7 @@ struct CRegisteredCorona void Update(void); }; -VALIDATE_SIZE(CRegisteredCorona, 0x80); +VALIDATE_SIZE(CRegisteredCorona, 0x68); class CCoronas { @@ -91,13 +92,14 @@ public: static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, const CVector &coors, float size, float drawDist, RwTexture *tex, int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle, - bool longDist = false, float nearClip = 1.5f); + bool useNearDist = false, float nearDist = 1.5f); static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, const CVector &coors, float size, float drawDist, uint8 type, int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle, - bool longDist = false, float nearClip = 1.5f); + bool useNearDist = false, float nearDist = 1.5f); static void UpdateCoronaCoors(uint32 id, const CVector &coors, float drawDist, float someAngle); static void Render(void); static void RenderReflections(void); + static void RenderSunReflection(void); static void DoSunAndMoon(void); }; From 6514bc6b39faf5cfd6ecb1d45370e2c9c50e8f43 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 15:45:38 +0200 Subject: [PATCH 026/112] pointlights done --- src/render/Fluff.cpp | 5 ++- src/render/PointLights.cpp | 68 ++++++++++++++++++++++++++++++-------- src/render/PointLights.h | 5 +++ 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/render/Fluff.cpp b/src/render/Fluff.cpp index 5d8ccf47..14c80a63 100644 --- a/src/render/Fluff.cpp +++ b/src/render/Fluff.cpp @@ -7,6 +7,7 @@ #include "Camera.h" #include "Sprite.h" #include "Coronas.h" +#include "PointLights.h" #include "Rubbish.h" #include "Timecycle.h" #include "General.h" @@ -391,7 +392,7 @@ void CMovingThings::Init() CPlaneTrails::Init(); CSmokeTrails::Init(); CPlaneBanners::Init(); - CEscalators::Init(); + CPointLights::Init(); StartCloseList.m_pNext = &CMovingThings::EndCloseList; StartCloseList.m_pPrev = nil; @@ -399,6 +400,8 @@ void CMovingThings::Init() EndCloseList.m_pPrev = &CMovingThings::StartCloseList; Num = 0; + CEscalators::Init(); + #ifndef MIAMI // something is still used here actually // Initialize scroll bars aScrollBars[0].Init(CVector( 228.3f, -669.0f, 39.0f ), SCROLL_BUSINESS, 0.0f, 0.5f, 0.5f, 255, 128, 0, 0.3f); diff --git a/src/render/PointLights.cpp b/src/render/PointLights.cpp index 88b9aaea..b09b07bd 100644 --- a/src/render/PointLights.cpp +++ b/src/render/PointLights.cpp @@ -1,6 +1,7 @@ #include "common.h" #include "main.h" +#include "CutsceneMgr.h" #include "Lights.h" #include "Camera.h" #include "Weather.h" @@ -10,8 +11,23 @@ #include "Timer.h" #include "PointLights.h" +//--MIAMI: file done + int16 CPointLights::NumLights; CRegisteredPointLight CPointLights::aLights[NUMPOINTLIGHTS]; +CVector CPointLights::aCachedMapReads[32]; +float CPointLights::aCachedMapReadResults[32]; +int32 CPointLights::NextCachedValue; + +void +CPointLights::Init(void) +{ + for(int i = 0; i < ARRAY_SIZE(aCachedMapReads); i++){ + aCachedMapReads[i] = CVector(0.0f, 0.0f, 0.0f); + aCachedMapReadResults[i] = 0.0f; + } + NextCachedValue = 0; +} void CPointLights::InitPerFrame(void) @@ -86,12 +102,11 @@ CPointLights::GenerateLightsAffectingObject(Const CVector *objCoors) ret *= distNorm; }else{ float intensity; + // distance fade if(distNorm < 0.5f) - // near enough intensity = 1.0f; else - // attenuate - intensity = 1.0f - (distNorm - 0.5f)*2.0f; + intensity = 1.0f - (distNorm - 0.5f)/(1.0f - 0.5f); if(distance != 0.0f){ CVector dir = dist / distance; @@ -143,17 +158,22 @@ CPointLights::RenderFogEffect(void) CVector spriteCoors; float spritew, spriteh; + if(CCutsceneMgr::IsRunning()) + return; + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpPointlightRaster); + CSprite::InitSpriteBuffer(); + for(i = 0; i < NumLights; i++){ if(aLights[i].fogType != FOG_NORMAL && aLights[i].fogType != FOG_ALWAYS) continue; - fogginess = aLights[i].fogType == FOG_ALWAYS ? 1.0f : CWeather::Foggyness; + fogginess = aLights[i].fogType == FOG_NORMAL ? CWeather::Foggyness : 1.0f; if(fogginess == 0.0f) continue; @@ -198,7 +218,7 @@ CPointLights::RenderFogEffect(void) float distsq = sq(dx) + sq(dy); float linedistsq = distsq - sq(dot); if(dot > 0.0f && dot < FOG_AREA_LENGTH && linedistsq < sq(FOG_AREA_WIDTH)){ - CVector fogcoors(xi, yi, aLights[i].coors.z + 1.0f); + CVector fogcoors(xi, yi, aLights[i].coors.z + 10.0f); if(CWorld::ProcessVerticalLine(fogcoors, fogcoors.z - 20.0f, point, entity, true, false, false, false, true, false, nil)){ // Now same check again in xyz @@ -220,9 +240,9 @@ CPointLights::RenderFogEffect(void) intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH); if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){ - float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x1FFF; + float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x2000; float size = FogSizes[r>>1]; - CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z, + CSprite::RenderBufferedOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z, spritew * size, spriteh * size, aLights[i].red * intensity, aLights[i].green * intensity, aLights[i].blue * intensity, intensity, 1/spriteCoors.z, rotation, 255); @@ -234,9 +254,8 @@ CPointLights::RenderFogEffect(void) } }else if(aLights[i].type == LIGHT_POINT || aLights[i].type == LIGHT_FOGONLY || aLights[i].type == LIGHT_FOGONLY_ALWAYS){ - if(CWorld::ProcessVerticalLine(aLights[i].coors, aLights[i].coors.z - 20.0f, - point, entity, true, false, false, false, true, false, nil)){ - + float groundZ; + if(ProcessVerticalLineUsingCache(aLights[i].coors, &groundZ)){ xmin = aLights[i].coors.x - FOG_AREA_RADIUS; ymin = aLights[i].coors.y - FOG_AREA_RADIUS; xmax = aLights[i].coors.x + FOG_AREA_RADIUS; @@ -267,11 +286,11 @@ CPointLights::RenderFogEffect(void) // more intensity the closer to light source intensity *= 1.0f - sq(lightdist / FOG_AREA_RADIUS); - CVector fogcoors(xi, yi, point.point.z + 1.6f); + CVector fogcoors(xi, yi, groundZ + 1.6f); if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){ - float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x3FFF; + float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x4000; float size = FogSizes[r>>1]; - CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z, + CSprite::RenderBufferedOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z, spritew * size, spriteh * size, aLights[i].red * intensity, aLights[i].green * intensity, aLights[i].blue * intensity, intensity, 1/spriteCoors.z, rotation, 255); @@ -283,4 +302,27 @@ CPointLights::RenderFogEffect(void) } } } + + CSprite::FlushSpriteBuffer(); +} + +bool +CPointLights::ProcessVerticalLineUsingCache(CVector coors, float *groundZ) +{ + for(int i = 0; i < ARRAY_SIZE(aCachedMapReads); i++) + if(aCachedMapReads[i] == coors){ + *groundZ = aCachedMapReadResults[i]; + return true; + } + + CColPoint point; + CEntity *entity; + if(CWorld::ProcessVerticalLine(coors, coors.z - 20.0f, point, entity, true, false, false, false, true, false, nil)){ + aCachedMapReads[NextCachedValue] = coors; + aCachedMapReadResults[NextCachedValue] = point.point.z; + NextCachedValue = (NextCachedValue+1) % ARRAY_SIZE(aCachedMapReads); + *groundZ = point.point.z; + return true; + } + return false; } diff --git a/src/render/PointLights.h b/src/render/PointLights.h index 9e94328f..827200b9 100644 --- a/src/render/PointLights.h +++ b/src/render/PointLights.h @@ -20,6 +20,9 @@ class CPointLights public: static int16 NumLights; static CRegisteredPointLight aLights[NUMPOINTLIGHTS]; + static CVector aCachedMapReads[32]; + static float aCachedMapReadResults[32]; + static int32 NextCachedValue; enum { LIGHT_POINT, @@ -37,9 +40,11 @@ public: FOG_ALWAYS }; + static void Init(void); static void InitPerFrame(void); static void AddLight(uint8 type, CVector coors, CVector dir, float radius, float red, float green, float blue, uint8 fogType, bool castExtraShadows); static float GenerateLightsAffectingObject(Const CVector *objCoors); static void RemoveLightsAffectingObject(void); static void RenderFogEffect(void); + static bool ProcessVerticalLineUsingCache(CVector coors, float *groundZ); }; From 59d25d3ad8271ec46326a8e69e692e231a4eb076 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 15:45:54 +0200 Subject: [PATCH 027/112] pointlight fixes --- src/render/PointLights.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/render/PointLights.cpp b/src/render/PointLights.cpp index 88b9aaea..0713dc6d 100644 --- a/src/render/PointLights.cpp +++ b/src/render/PointLights.cpp @@ -86,12 +86,11 @@ CPointLights::GenerateLightsAffectingObject(Const CVector *objCoors) ret *= distNorm; }else{ float intensity; + // distance fade if(distNorm < 0.5f) - // near enough intensity = 1.0f; else - // attenuate - intensity = 1.0f - (distNorm - 0.5f)*2.0f; + intensity = 1.0f - (distNorm - 0.5f)/(1.0f - 0.5f); if(distance != 0.0f){ CVector dir = dist / distance; @@ -153,7 +152,7 @@ CPointLights::RenderFogEffect(void) if(aLights[i].fogType != FOG_NORMAL && aLights[i].fogType != FOG_ALWAYS) continue; - fogginess = aLights[i].fogType == FOG_ALWAYS ? 1.0f : CWeather::Foggyness; + fogginess = aLights[i].fogType == FOG_NORMAL ? CWeather::Foggyness : 1.0f; if(fogginess == 0.0f) continue; @@ -198,7 +197,7 @@ CPointLights::RenderFogEffect(void) float distsq = sq(dx) + sq(dy); float linedistsq = distsq - sq(dot); if(dot > 0.0f && dot < FOG_AREA_LENGTH && linedistsq < sq(FOG_AREA_WIDTH)){ - CVector fogcoors(xi, yi, aLights[i].coors.z + 1.0f); + CVector fogcoors(xi, yi, aLights[i].coors.z + 10.0f); if(CWorld::ProcessVerticalLine(fogcoors, fogcoors.z - 20.0f, point, entity, true, false, false, false, true, false, nil)){ // Now same check again in xyz @@ -220,7 +219,7 @@ CPointLights::RenderFogEffect(void) intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH); if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){ - float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x1FFF; + float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x2000; float size = FogSizes[r>>1]; CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z, spritew * size, spriteh * size, @@ -269,7 +268,7 @@ CPointLights::RenderFogEffect(void) CVector fogcoors(xi, yi, point.point.z + 1.6f); if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){ - float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x3FFF; + float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x4000; float size = FogSizes[r>>1]; CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z, spritew * size, spriteh * size, From 0bb46f3f8c3db1d378a2f7f87de1519576e26d1d Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 16:49:15 +0200 Subject: [PATCH 028/112] rubbish done --- src/core/Stats.cpp | 1 + src/core/Stats.h | 1 + src/render/Antennas.cpp | 2 ++ src/render/Rubbish.cpp | 67 +++++++++++++++++------------------------ 4 files changed, 32 insertions(+), 39 deletions(-) diff --git a/src/core/Stats.cpp b/src/core/Stats.cpp index 2e3a27b2..29087b34 100644 --- a/src/core/Stats.cpp +++ b/src/core/Stats.cpp @@ -61,6 +61,7 @@ int32 CStats::FastestTimes[CStats::TOTAL_FASTEST_TIMES]; int32 CStats::HighestScores[CStats::TOTAL_HIGHEST_SCORES]; int32 CStats::BestPositions[CStats::TOTAL_BEST_POSITIONS]; int32 CStats::PropertyDestroyed; +int32 CStats::PamphletMissionPassed; int32 CStats::Sprayings; float CStats::AutoPaintingBudget; diff --git a/src/core/Stats.h b/src/core/Stats.h index 7dd527ea..e6b8df6a 100644 --- a/src/core/Stats.h +++ b/src/core/Stats.h @@ -65,6 +65,7 @@ public: static int32 HighestScores[TOTAL_HIGHEST_SCORES]; static int32 BestPositions[TOTAL_BEST_POSITIONS]; static int32 PropertyDestroyed; + static int32 PamphletMissionPassed; static int32 Sprayings; static float AutoPaintingBudget; static int32 NoMoreHurricanes; diff --git a/src/render/Antennas.cpp b/src/render/Antennas.cpp index 452069a0..b9da95cb 100644 --- a/src/render/Antennas.cpp +++ b/src/render/Antennas.cpp @@ -2,6 +2,8 @@ #include "Antennas.h" +//--MIAMI: file done + CAntenna CAntennas::aAntennas[NUMANTENNAS]; void diff --git a/src/render/Rubbish.cpp b/src/render/Rubbish.cpp index bfd50c07..dada2439 100644 --- a/src/render/Rubbish.cpp +++ b/src/render/Rubbish.cpp @@ -8,17 +8,18 @@ #include "World.h" #include "Vehicle.h" #include "ZoneCull.h" +#include "Stats.h" #include "TxdStore.h" #include "RenderBuffer.h" #include "Rubbish.h" -#define RUBBISH_MAX_DIST (18.0f) -#define RUBBISH_FADE_DIST (16.5f) +//--MIAMI: file done + +#define RUBBISH_MAX_DIST (23.0f) +#define RUBBISH_FADE_DIST (20.0f) RwTexture *gpRubbishTexture[4]; RwImVertexIndex RubbishIndexList[6]; -RwImVertexIndex RubbishIndexList2[6]; // unused -RwIm3DVertex RubbishVertices[4]; bool CRubbish::bRubbishInvisible; int CRubbish::RubbishVisibility; COneSheet CRubbish::aSheets[NUM_RUBBISH_SHEETS]; @@ -52,12 +53,16 @@ CRubbish::Render(void) { int type; + if(RubbishVisibility == 0) + return; + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); for(type = 0; type < 4; type++){ - RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpRubbishTexture[type])); + if(type < 3 || CStats::PamphletMissionPassed) + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpRubbishTexture[type])); TempBufferIndicesStored = 0; TempBufferVerticesStored = 0; @@ -69,7 +74,7 @@ CRubbish::Render(void) if(sheet->m_state == 0) continue; - uint32 alpha = 128; + uint32 alpha = 100; CVector pos; if(sheet->m_state == 1){ pos = sheet->m_basePos; @@ -82,7 +87,7 @@ CRubbish::Render(void) float t = (float)(CTimer::GetTimeInMilliseconds() - sheet->m_moveStart)/sheet->m_moveDuration; float f1 = sheet->m_isVisible ? 1.0f-t : 0.0f; float f2 = sheet->m_targetIsVisible ? t : 0.0f; - alpha = 128 * (f1+f2); + alpha = 100 * (f1+f2); } } @@ -92,17 +97,27 @@ CRubbish::Render(void) alpha -= alpha*(camDist-RUBBISH_FADE_DIST)/(RUBBISH_MAX_DIST-RUBBISH_FADE_DIST); alpha = (RubbishVisibility*alpha)/256; - float vx = Sin(sheet->m_angle) * 0.4f; - float vy = Cos(sheet->m_angle) * 0.4f; + float vx1, vy1, vx2, vy2; + if(type == 0 || type == 1){ + vx1 = 0.9f*Sin(sheet->m_angle); + vy1 = 0.9f*Cos(sheet->m_angle); + vx2 = 0.3f*Cos(sheet->m_angle); + vy2 = -0.3f*Sin(sheet->m_angle); + }else{ + vx1 = 0.3f*Sin(sheet->m_angle); + vy1 = 0.3f*Cos(sheet->m_angle); + vx2 = 0.3f*Cos(sheet->m_angle); + vy2 = -0.3f*Sin(sheet->m_angle); + } int v = TempBufferVerticesStored; - RwIm3DVertexSetPos(&TempBufferRenderVertices[v+0], pos.x + vx, pos.y + vy, pos.z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[v+0], pos.x + vx1 + vx2, pos.y + vy1 + vy2, pos.z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[v+1], pos.x + vx1 - vx2, pos.y + vy1 - vy2, pos.z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[v+2], pos.x - vx1 + vx2, pos.y - vy1 + vy2, pos.z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[v+3], pos.x - vx1 - vx2, pos.y - vy1 - vy2, pos.z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+0], 255, 255, 255, alpha); - RwIm3DVertexSetPos(&TempBufferRenderVertices[v+1], pos.x - vy, pos.y + vx, pos.z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+1], 255, 255, 255, alpha); - RwIm3DVertexSetPos(&TempBufferRenderVertices[v+2], pos.x + vy, pos.y - vx, pos.z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+2], 255, 255, 255, alpha); - RwIm3DVertexSetPos(&TempBufferRenderVertices[v+3], pos.x - vx, pos.y - vy, pos.z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+3], 255, 255, 255, alpha); RwIm3DVertexSetU(&TempBufferRenderVertices[v+0], 0.0f); RwIm3DVertexSetV(&TempBufferRenderVertices[v+0], 0.0f); @@ -373,24 +388,6 @@ CRubbish::Init(void) EndMoversList.m_next = nil; EndMoversList.m_prev = &StartMoversList; - // unused - RwIm3DVertexSetU(&RubbishVertices[0], 0.0f); - RwIm3DVertexSetV(&RubbishVertices[0], 0.0f); - RwIm3DVertexSetU(&RubbishVertices[1], 1.0f); - RwIm3DVertexSetV(&RubbishVertices[1], 0.0f); - RwIm3DVertexSetU(&RubbishVertices[2], 0.0f); - RwIm3DVertexSetV(&RubbishVertices[2], 1.0f); - RwIm3DVertexSetU(&RubbishVertices[3], 1.0f); - RwIm3DVertexSetV(&RubbishVertices[3], 1.0f); - - // unused - RubbishIndexList2[0] = 0; - RubbishIndexList2[1] = 2; - RubbishIndexList2[2] = 1; - RubbishIndexList2[3] = 1; - RubbishIndexList2[4] = 2; - RubbishIndexList2[5] = 3; - RubbishIndexList[0] = 0; RubbishIndexList[1] = 1; RubbishIndexList[2] = 2; @@ -414,19 +411,11 @@ void CRubbish::Shutdown(void) { RwTextureDestroy(gpRubbishTexture[0]); -#ifdef GTA3_1_1_PATCH gpRubbishTexture[0] = nil; -#endif RwTextureDestroy(gpRubbishTexture[1]); -#ifdef GTA3_1_1_PATCH gpRubbishTexture[1] = nil; -#endif RwTextureDestroy(gpRubbishTexture[2]); -#ifdef GTA3_1_1_PATCH gpRubbishTexture[2] = nil; -#endif RwTextureDestroy(gpRubbishTexture[3]); -#ifdef GTA3_1_1_PATCH gpRubbishTexture[3] = nil; -#endif } From 4118d2aa5552223c02ff094e7d4e9f103daaac94 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 17:14:24 +0200 Subject: [PATCH 029/112] finished skidmarks --- src/render/Skidmarks.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/render/Skidmarks.cpp b/src/render/Skidmarks.cpp index efd88387..f2a66db1 100644 --- a/src/render/Skidmarks.cpp +++ b/src/render/Skidmarks.cpp @@ -6,6 +6,8 @@ #include "Replay.h" #include "Skidmarks.h" +//--MIAMI: file done + CSkidmark CSkidmarks::aSkidmarks[NUMSKIDMARKS]; RwImVertexIndex SkidmarkIndexList[SKIDMARK_LENGTH * 6]; @@ -37,13 +39,6 @@ CSkidmarks::Init(void) SkidmarkIndexList[i*6+5] = ix+3; ix += 2; } - - for(i = 0; i < SKIDMARK_LENGTH; i++){ - RwIm3DVertexSetU(&SkidmarkVertices[i*2 + 0], 0.0f); - RwIm3DVertexSetV(&SkidmarkVertices[i*2 + 0], i*5.01f); - RwIm3DVertexSetU(&SkidmarkVertices[i*2 + 1], 1.0f); - RwIm3DVertexSetV(&SkidmarkVertices[i*2 + 1], i*5.01f); - } } void @@ -141,8 +136,12 @@ CSkidmarks::Render(void) p2.y -= aSkidmarks[i].m_sideY[j]; RwIm3DVertexSetRGBA(&SkidmarkVertices[j*2+0], color.red, color.green, color.blue, alpha); RwIm3DVertexSetPos(&SkidmarkVertices[j*2+0], p1.x, p1.y, p1.z+0.1f); + RwIm3DVertexSetU(&SkidmarkVertices[j*2+0], 0.0f); + RwIm3DVertexSetV(&SkidmarkVertices[j*2+0], j*5.01f); RwIm3DVertexSetRGBA(&SkidmarkVertices[j*2+1], color.red, color.green, color.blue, alpha); RwIm3DVertexSetPos(&SkidmarkVertices[j*2+1], p2.x, p2.y, p2.z+0.1f); + RwIm3DVertexSetU(&SkidmarkVertices[j*2+1], 1.0f); + RwIm3DVertexSetV(&SkidmarkVertices[j*2+1], j*5.01f); } LittleTest(); From 43bf8543741e6c153cb8ddc9fc5f1594b332e9d8 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 19:11:44 +0200 Subject: [PATCH 030/112] timecycle done --- src/control/Script.cpp | 4 +- src/core/re3.cpp | 24 ++- src/render/Timecycle.cpp | 323 +++++++++++++++++++++++++++------------ src/render/Timecycle.h | 238 +++++++++++++++-------------- src/render/Weather.h | 4 +- 5 files changed, 377 insertions(+), 216 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index eb950464..9508677b 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -12709,13 +12709,13 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_EXTRA_COLOURS: { CollectParameters(&m_nIp, 2); - debug("SET_EXTRA_COLOURS not implemented, skipping\n"); + CTimeCycle::StartExtraColour(ScriptParams[0]-1, ScriptParams[1] != 0); return 0; } case COMMAND_CLEAR_EXTRA_COLOURS: { CollectParameters(&m_nIp, 1); - debug("CLEAR_EXTRA_COLOURS not implemented, skipping\n"); + CTimeCycle::StopExtraColour(ScriptParams[0]); return 0; } //case COMMAND_CLOSE_CAR_BOOT: diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 10f0e032..e9c643ac 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -7,6 +7,7 @@ #include "Credits.h" #include "Camera.h" #include "Weather.h" +#include "Timecycle.h" #include "Clock.h" #include "World.h" #include "Vehicle.h" @@ -406,6 +407,26 @@ DebugMenuPopulate(void) static const char *weathers[] = { "Sunny", "Cloudy", "Rainy", "Foggy", "Extrasunny", "Stormy" }; + static const char *extracols[] = { + "1 - Malibu club", + "2 - Strib club", + "3 - Hotel", + "4 - Bank", + "5 - Police HQ", + "6 - Mall", + "7 - Rifle Range", + "8 - Mansion", + "9 - Dirt ring", + "10 - Blood ring", + "11 - Hot ring", + "12 - Concert hall", + "13 - Auntie Poulets", + "14 - Intro at docks", + "15 - Biker bar", + "16 - Intro cafe", + "17 - Studio", + "18", "19", "20", "21", "22", "23", "24" + }; DebugMenuEntry *e; e = DebugMenuAddVar("Time & Weather", "Current Hour", &CClock::GetHoursRef(), nil, 1, 0, 23, nil); DebugMenuEntrySetWrap(e, true); @@ -416,7 +437,8 @@ DebugMenuPopulate(void) DebugMenuEntrySetWrap(e, true); e = DebugMenuAddVar("Time & Weather", "New Weather", (int16*)&CWeather::NewWeatherType, nil, 1, 0, 5, weathers); DebugMenuEntrySetWrap(e, true); - DebugMenuAddVar("Time & Weather", "Wind", (float*)&CWeather::Wind, nil, 0.1f, 0.0f, 1.0f); + DebugMenuAddVarBool8("Time & Weather", "Extracolours On", &CTimeCycle::m_bExtraColourOn, nil); + DebugMenuAddVar("Time & Weather", "Extracolour", &CTimeCycle::m_ExtraColour, nil, 1, 0, 23, extracols); DebugMenuAddVar("Time & Weather", "Time scale", (float*)&CTimer::GetTimeScale(), nil, 0.1f, 0.0f, 10.0f); DebugMenuAddCmd("Cheats", "Weapon set 1", WeaponCheat1); diff --git a/src/render/Timecycle.cpp b/src/render/Timecycle.cpp index fe898412..7e8ad5e5 100644 --- a/src/render/Timecycle.cpp +++ b/src/render/Timecycle.cpp @@ -10,60 +10,60 @@ #include "FileMgr.h" #include "Timecycle.h" -// TODO(MIAMI): change some of the types here +//--MIAMI: done -int CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; -short CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS]; -short CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; -short CTimeCycle::m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fWaterRed[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fWaterGreen[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fWaterBlue[NUMHOURS][NUMWEATHERS]; -float CTimeCycle::m_fWaterAlpha[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; +int8 CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS]; +int8 CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS]; +int8 CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS]; +int16 CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS]; +int16 CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fWaterRed[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fWaterGreen[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fWaterBlue[NUMHOURS][NUMWEATHERS]; +uint8 CTimeCycle::m_fWaterAlpha[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fCurrentAmbientRed; @@ -81,36 +81,36 @@ float CTimeCycle::m_fCurrentAmbientBlue_Obj_Bl; float CTimeCycle::m_fCurrentDirectionalRed; float CTimeCycle::m_fCurrentDirectionalGreen; float CTimeCycle::m_fCurrentDirectionalBlue; -int CTimeCycle::m_nCurrentSkyTopRed; -int CTimeCycle::m_nCurrentSkyTopGreen; -int CTimeCycle::m_nCurrentSkyTopBlue; -int CTimeCycle::m_nCurrentSkyBottomRed; -int CTimeCycle::m_nCurrentSkyBottomGreen; -int CTimeCycle::m_nCurrentSkyBottomBlue; -int CTimeCycle::m_nCurrentSunCoreRed; -int CTimeCycle::m_nCurrentSunCoreGreen; -int CTimeCycle::m_nCurrentSunCoreBlue; -int CTimeCycle::m_nCurrentSunCoronaRed; -int CTimeCycle::m_nCurrentSunCoronaGreen; -int CTimeCycle::m_nCurrentSunCoronaBlue; +int32 CTimeCycle::m_nCurrentSkyTopRed; +int32 CTimeCycle::m_nCurrentSkyTopGreen; +int32 CTimeCycle::m_nCurrentSkyTopBlue; +int32 CTimeCycle::m_nCurrentSkyBottomRed; +int32 CTimeCycle::m_nCurrentSkyBottomGreen; +int32 CTimeCycle::m_nCurrentSkyBottomBlue; +int32 CTimeCycle::m_nCurrentSunCoreRed; +int32 CTimeCycle::m_nCurrentSunCoreGreen; +int32 CTimeCycle::m_nCurrentSunCoreBlue; +int32 CTimeCycle::m_nCurrentSunCoronaRed; +int32 CTimeCycle::m_nCurrentSunCoronaGreen; +int32 CTimeCycle::m_nCurrentSunCoronaBlue; float CTimeCycle::m_fCurrentSunSize; float CTimeCycle::m_fCurrentSpriteSize; float CTimeCycle::m_fCurrentSpriteBrightness; -int CTimeCycle::m_nCurrentShadowStrength; -int CTimeCycle::m_nCurrentLightShadowStrength; -int CTimeCycle::m_nCurrentPoleShadowStrength; +int32 CTimeCycle::m_nCurrentShadowStrength; +int32 CTimeCycle::m_nCurrentLightShadowStrength; +int32 CTimeCycle::m_nCurrentPoleShadowStrength; float CTimeCycle::m_fCurrentFogStart; float CTimeCycle::m_fCurrentFarClip; float CTimeCycle::m_fCurrentLightsOnGroundBrightness; -int CTimeCycle::m_nCurrentLowCloudsRed; -int CTimeCycle::m_nCurrentLowCloudsGreen; -int CTimeCycle::m_nCurrentLowCloudsBlue; -int CTimeCycle::m_nCurrentFluffyCloudsTopRed; -int CTimeCycle::m_nCurrentFluffyCloudsTopGreen; -int CTimeCycle::m_nCurrentFluffyCloudsTopBlue; -int CTimeCycle::m_nCurrentFluffyCloudsBottomRed; -int CTimeCycle::m_nCurrentFluffyCloudsBottomGreen; -int CTimeCycle::m_nCurrentFluffyCloudsBottomBlue; +int32 CTimeCycle::m_nCurrentLowCloudsRed; +int32 CTimeCycle::m_nCurrentLowCloudsGreen; +int32 CTimeCycle::m_nCurrentLowCloudsBlue; +int32 CTimeCycle::m_nCurrentFluffyCloudsTopRed; +int32 CTimeCycle::m_nCurrentFluffyCloudsTopGreen; +int32 CTimeCycle::m_nCurrentFluffyCloudsTopBlue; +int32 CTimeCycle::m_nCurrentFluffyCloudsBottomRed; +int32 CTimeCycle::m_nCurrentFluffyCloudsBottomGreen; +int32 CTimeCycle::m_nCurrentFluffyCloudsBottomBlue; float CTimeCycle::m_fCurrentBlurRed; float CTimeCycle::m_fCurrentBlurGreen; float CTimeCycle::m_fCurrentBlurBlue; @@ -118,13 +118,16 @@ float CTimeCycle::m_fCurrentWaterRed; float CTimeCycle::m_fCurrentWaterGreen; float CTimeCycle::m_fCurrentWaterBlue; float CTimeCycle::m_fCurrentWaterAlpha; -int CTimeCycle::m_nCurrentFogColourRed; -int CTimeCycle::m_nCurrentFogColourGreen; -int CTimeCycle::m_nCurrentFogColourBlue; +int32 CTimeCycle::m_nCurrentFogColourRed; +int32 CTimeCycle::m_nCurrentFogColourGreen; +int32 CTimeCycle::m_nCurrentFogColourBlue; -int CTimeCycle::m_FogReduction; +int32 CTimeCycle::m_FogReduction; +bool CTimeCycle::m_bExtraColourOn; +int32 CTimeCycle::m_ExtraColour; +float CTimeCycle::m_ExtraColourInter; -int CTimeCycle::m_CurrentStoredValue; +int32 CTimeCycle::m_CurrentStoredValue; CVector CTimeCycle::m_VectorToSun[16]; float CTimeCycle::m_fShadowFrontX[16]; float CTimeCycle::m_fShadowFrontY[16]; @@ -133,7 +136,6 @@ float CTimeCycle::m_fShadowSideY[16]; float CTimeCycle::m_fShadowDisplacementX[16]; float CTimeCycle::m_fShadowDisplacementY[16]; - void CTimeCycle::Initialise(void) { @@ -233,15 +235,15 @@ CTimeCycle::Initialise(void) m_nSunCoronaRed[h][w] = sunCoronaR; m_nSunCoronaGreen[h][w] = sunCoronaG; m_nSunCoronaBlue[h][w] = sunCoronaB; - m_fSunSize[h][w] = sunSz; - m_fSpriteSize[h][w] = sprSz; - m_fSpriteBrightness[h][w] = sprBght; + m_fSunSize[h][w] = sunSz * 10.0f; + m_fSpriteSize[h][w] = sprSz * 10.0f; + m_fSpriteBrightness[h][w] = sprBght * 10.0f; m_nShadowStrength[h][w] = shad; m_nLightShadowStrength[h][w] = lightShad; m_nPoleShadowStrength[h][w] = poleShad; m_fFarClip[h][w] = farClp; m_fFogStart[h][w] = fogSt; - m_fLightsOnGroundBrightness[h][w] = lightGnd; + m_fLightsOnGroundBrightness[h][w] = lightGnd * 10.0f; m_nLowCloudsRed[h][w] = cloudR; m_nLowCloudsGreen[h][w] = cloudG; m_nLowCloudsBlue[h][w] = cloudB; @@ -265,6 +267,51 @@ CTimeCycle::Initialise(void) debug("CTimeCycle ready\n"); } +static float interp_c0, interp_c1, interp_c2, interp_c3; + +float CTimeCycle::Interpolate(int8 *a, int8 *b) +{ + return a[CWeather::OldWeatherType] * interp_c0 + + b[CWeather::OldWeatherType] * interp_c1 + + a[CWeather::NewWeatherType] * interp_c2 + + b[CWeather::NewWeatherType] * interp_c3; +} + +float CTimeCycle::Interpolate(uint8 *a, uint8 *b) +{ + return a[CWeather::OldWeatherType] * interp_c0 + + b[CWeather::OldWeatherType] * interp_c1 + + a[CWeather::NewWeatherType] * interp_c2 + + b[CWeather::NewWeatherType] * interp_c3; +} + +float CTimeCycle::Interpolate(int16 *a, int16 *b) +{ + return a[CWeather::OldWeatherType] * interp_c0 + + b[CWeather::OldWeatherType] * interp_c1 + + a[CWeather::NewWeatherType] * interp_c2 + + b[CWeather::NewWeatherType] * interp_c3; +} + +void +CTimeCycle::StartExtraColour(int32 c, bool fade) +{ + m_bExtraColourOn = true; + m_ExtraColour = c; + if(fade) + m_ExtraColourInter = 0.0f; + else + m_ExtraColourInter = 1.0f; +} + +void +CTimeCycle::StopExtraColour(bool fade) +{ + m_bExtraColourOn = false; + if(!fade) + m_ExtraColourInter = 0.0f; +} + void CTimeCycle::Update(void) { @@ -274,12 +321,12 @@ CTimeCycle::Update(void) int w2 = CWeather::NewWeatherType; float timeInterp = (CClock::GetMinutes() + CClock::GetSeconds()/60.0f)/60.0f; // coefficients for a bilinear interpolation - float c0 = (1.0f-timeInterp) * (1.0f-CWeather::InterpolationValue); - float c1 = timeInterp * (1.0f-CWeather::InterpolationValue); - float c2 = (1.0f-timeInterp) * CWeather::InterpolationValue; - float c3 = timeInterp * CWeather::InterpolationValue; + interp_c0 = (1.0f-timeInterp) * (1.0f-CWeather::InterpolationValue); + interp_c1 = timeInterp * (1.0f-CWeather::InterpolationValue); + interp_c2 = (1.0f-timeInterp) * CWeather::InterpolationValue; + interp_c3 = timeInterp * CWeather::InterpolationValue; -#define INTERP(v) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3; +#define INTERP(v) Interpolate(v[h1], v[h2]) m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed); m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen); @@ -317,15 +364,15 @@ CTimeCycle::Update(void) m_nCurrentSunCoronaGreen = INTERP(m_nSunCoronaGreen); m_nCurrentSunCoronaBlue = INTERP(m_nSunCoronaBlue); - m_fCurrentSunSize = INTERP(m_fSunSize); - m_fCurrentSpriteSize = INTERP(m_fSpriteSize); - m_fCurrentSpriteBrightness = INTERP(m_fSpriteBrightness); + m_fCurrentSunSize = INTERP(m_fSunSize)/10.0f; + m_fCurrentSpriteSize = INTERP(m_fSpriteSize)/10.0f; + m_fCurrentSpriteBrightness = INTERP(m_fSpriteBrightness)/10.0f; m_nCurrentShadowStrength = INTERP(m_nShadowStrength); m_nCurrentLightShadowStrength = INTERP(m_nLightShadowStrength); m_nCurrentPoleShadowStrength = INTERP(m_nPoleShadowStrength); m_fCurrentFarClip = INTERP(m_fFarClip); m_fCurrentFogStart = INTERP(m_fFogStart); - m_fCurrentLightsOnGroundBrightness = INTERP(m_fLightsOnGroundBrightness); + m_fCurrentLightsOnGroundBrightness = INTERP(m_fLightsOnGroundBrightness)/10.0f; m_nCurrentLowCloudsRed = INTERP(m_nLowCloudsRed); m_nCurrentLowCloudsGreen = INTERP(m_nLowCloudsGreen); @@ -347,6 +394,7 @@ CTimeCycle::Update(void) m_fCurrentWaterGreen = INTERP(m_fWaterGreen); m_fCurrentWaterBlue = INTERP(m_fWaterBlue); m_fCurrentWaterAlpha = INTERP(m_fWaterAlpha); +#undef INTERP if(m_FogReduction != 0) m_fCurrentFarClip = Max(m_fCurrentFarClip, m_FogReduction/64.0f * 650.0f); @@ -360,7 +408,88 @@ CTimeCycle::Update(void) sunPos.z = 0.2f - Cos(sunAngle); sunPos.Normalise(); - // TODO(MIAMI): extra colours + if(m_bExtraColourOn) + m_ExtraColourInter = Min(1.0f, m_ExtraColourInter + CTimer::GetTimeStep()/120.0f); + else + m_ExtraColourInter = Max(-.0f, m_ExtraColourInter - CTimer::GetTimeStep()/120.0f); + if(m_ExtraColourInter > 0.0f){ +#define INTERP(extra,cur) (m_ExtraColourInter*extra[m_ExtraColour][WEATHER_EXTRACOLOURS] + (1.0f-m_ExtraColourInter)*cur) +#define INTERPscl(extra,scl,cur) (m_ExtraColourInter*extra[m_ExtraColour][WEATHER_EXTRACOLOURS]/scl + (1.0f-m_ExtraColourInter)*cur) + if(m_nSkyTopRed[m_ExtraColour][WEATHER_EXTRACOLOURS] != 0 || + m_nSkyTopGreen[m_ExtraColour][WEATHER_EXTRACOLOURS] != 0 || + m_nSkyTopBlue[m_ExtraColour][WEATHER_EXTRACOLOURS] != 0){ + m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed,m_nCurrentSkyTopRed); + m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen,m_nCurrentSkyTopGreen); + m_nCurrentSkyTopBlue = INTERP(m_nSkyTopBlue,m_nCurrentSkyTopBlue); + + m_nCurrentSkyBottomRed = INTERP(m_nSkyBottomRed,m_nCurrentSkyBottomRed); + m_nCurrentSkyBottomGreen = INTERP(m_nSkyBottomGreen,m_nCurrentSkyBottomGreen); + m_nCurrentSkyBottomBlue = INTERP(m_nSkyBottomBlue,m_nCurrentSkyBottomBlue); + + m_nCurrentSunCoreRed = INTERP(m_nSunCoreRed,m_nCurrentSunCoreRed); + m_nCurrentSunCoreGreen = INTERP(m_nSunCoreGreen,m_nCurrentSunCoreGreen); + m_nCurrentSunCoreBlue = INTERP(m_nSunCoreBlue,m_nCurrentSunCoreBlue); + + m_nCurrentSunCoronaRed = INTERP(m_nSunCoronaRed,m_nCurrentSunCoronaRed); + m_nCurrentSunCoronaGreen = INTERP(m_nSunCoronaGreen,m_nCurrentSunCoronaGreen); + m_nCurrentSunCoronaBlue = INTERP(m_nSunCoronaBlue,m_nCurrentSunCoronaBlue); + + m_fCurrentSunSize = INTERPscl(m_fSunSize,10.0f,m_fCurrentSunSize); + + m_nCurrentLowCloudsRed = INTERP(m_nLowCloudsRed,m_nCurrentLowCloudsRed); + m_nCurrentLowCloudsGreen = INTERP(m_nLowCloudsGreen,m_nCurrentLowCloudsGreen); + m_nCurrentLowCloudsBlue = INTERP(m_nLowCloudsBlue,m_nCurrentLowCloudsBlue); + + m_nCurrentFluffyCloudsTopRed = INTERP(m_nFluffyCloudsTopRed,m_nCurrentFluffyCloudsTopRed); + m_nCurrentFluffyCloudsTopGreen = INTERP(m_nFluffyCloudsTopGreen,m_nCurrentFluffyCloudsTopGreen); + m_nCurrentFluffyCloudsTopBlue = INTERP(m_nFluffyCloudsTopBlue,m_nCurrentFluffyCloudsTopBlue); + + m_nCurrentFluffyCloudsBottomRed = INTERP(m_nFluffyCloudsBottomRed,m_nCurrentFluffyCloudsBottomRed); + m_nCurrentFluffyCloudsBottomGreen = INTERP(m_nFluffyCloudsBottomGreen,m_nCurrentFluffyCloudsBottomGreen); + m_nCurrentFluffyCloudsBottomBlue = INTERP(m_nFluffyCloudsBottomBlue,m_nCurrentFluffyCloudsBottomBlue); + + m_fCurrentWaterRed = INTERP(m_fWaterRed,m_fCurrentWaterRed); + m_fCurrentWaterGreen = INTERP(m_fWaterGreen,m_fCurrentWaterGreen); + m_fCurrentWaterBlue = INTERP(m_fWaterBlue,m_fCurrentWaterBlue); + m_fCurrentWaterAlpha = INTERP(m_fWaterAlpha,m_fCurrentWaterAlpha); + } + + m_fCurrentAmbientRed = INTERP(m_nAmbientRed,m_fCurrentAmbientRed); + m_fCurrentAmbientGreen = INTERP(m_nAmbientGreen,m_fCurrentAmbientGreen); + m_fCurrentAmbientBlue = INTERP(m_nAmbientBlue,m_fCurrentAmbientBlue); + + m_fCurrentAmbientRed_Obj = INTERP(m_nAmbientRed_Obj,m_fCurrentAmbientRed_Obj); + m_fCurrentAmbientGreen_Obj = INTERP(m_nAmbientGreen_Obj,m_fCurrentAmbientGreen_Obj); + m_fCurrentAmbientBlue_Obj = INTERP(m_nAmbientBlue_Obj,m_fCurrentAmbientBlue_Obj); + + m_fCurrentAmbientRed_Bl = INTERP(m_nAmbientRed_Bl,m_fCurrentAmbientRed_Bl); + m_fCurrentAmbientGreen_Bl = INTERP(m_nAmbientGreen_Bl,m_fCurrentAmbientGreen_Bl); + m_fCurrentAmbientBlue_Bl = INTERP(m_nAmbientBlue_Bl,m_fCurrentAmbientBlue_Bl); + + m_fCurrentAmbientRed_Obj_Bl = INTERP(m_nAmbientRed_Obj_Bl,m_fCurrentAmbientRed_Obj_Bl); + m_fCurrentAmbientGreen_Obj_Bl = INTERP(m_nAmbientGreen_Obj_Bl,m_fCurrentAmbientGreen_Obj_Bl); + m_fCurrentAmbientBlue_Obj_Bl = INTERP(m_nAmbientBlue_Obj_Bl,m_fCurrentAmbientBlue_Obj_Bl); + + m_fCurrentDirectionalRed = INTERP(m_nDirectionalRed,m_fCurrentDirectionalRed); + m_fCurrentDirectionalGreen = INTERP(m_nDirectionalGreen,m_fCurrentDirectionalGreen); + m_fCurrentDirectionalBlue = INTERP(m_nDirectionalBlue,m_fCurrentDirectionalBlue); + + m_fCurrentSpriteSize = INTERPscl(m_fSpriteSize,10.0f,m_fCurrentSpriteSize); + m_fCurrentSpriteBrightness = INTERPscl(m_fSpriteBrightness,10.0f,m_fCurrentSpriteBrightness); + m_nCurrentShadowStrength = INTERP(m_nShadowStrength,m_nCurrentShadowStrength); + m_nCurrentLightShadowStrength = INTERP(m_nLightShadowStrength,m_nCurrentLightShadowStrength); + m_nCurrentPoleShadowStrength = INTERP(m_nPoleShadowStrength,m_nCurrentPoleShadowStrength); + m_fCurrentFarClip = INTERP(m_fFarClip,m_fCurrentFarClip); + m_fCurrentFogStart = INTERP(m_fFogStart,m_fCurrentFogStart); + m_fCurrentLightsOnGroundBrightness = INTERPscl(m_fLightsOnGroundBrightness,10.0f,m_fCurrentLightsOnGroundBrightness); + + m_fCurrentBlurRed = INTERP(m_fBlurRed,m_fCurrentBlurRed); + m_fCurrentBlurGreen = INTERP(m_fBlurGreen,m_fCurrentBlurGreen); + m_fCurrentBlurBlue = INTERP(m_fBlurBlue,m_fCurrentBlurBlue); + +#undef INTERP +#undef INTERPscl + } if(TheCamera.m_BlurType == MOTION_BLUR_NONE || TheCamera.m_BlurType == MOTION_BLUR_LIGHT_SCENE) TheCamera.SetMotionBlur(m_fCurrentBlurRed, m_fCurrentBlurGreen, m_fCurrentBlurBlue, 5, MOTION_BLUR_LIGHT_SCENE); diff --git a/src/render/Timecycle.h b/src/render/Timecycle.h index 832b36e2..ad079a95 100644 --- a/src/render/Timecycle.h +++ b/src/render/Timecycle.h @@ -2,58 +2,58 @@ class CTimeCycle { - static int m_nAmbientRed[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS]; - static int m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; - static int m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; - static int m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; - static int m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; - static int m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; - static float m_fSunSize[NUMHOURS][NUMWEATHERS]; - static float m_fSpriteSize[NUMHOURS][NUMWEATHERS]; - static float m_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; - static short m_nShadowStrength[NUMHOURS][NUMWEATHERS]; - static short m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; - static short m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS]; - static float m_fFogStart[NUMHOURS][NUMWEATHERS]; - static float m_fFarClip[NUMHOURS][NUMWEATHERS]; - static float m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; - static int m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; - static int m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; - static int m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; - static float m_fBlurRed[NUMHOURS][NUMWEATHERS]; - static float m_fBlurGreen[NUMHOURS][NUMWEATHERS]; - static float m_fBlurBlue[NUMHOURS][NUMWEATHERS]; - static float m_fWaterRed[NUMHOURS][NUMWEATHERS]; - static float m_fWaterGreen[NUMHOURS][NUMWEATHERS]; - static float m_fWaterBlue[NUMHOURS][NUMWEATHERS]; - static float m_fWaterAlpha[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS]; + static uint8 m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS]; + static uint8 m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; + static int8 m_fSunSize[NUMHOURS][NUMWEATHERS]; + static int8 m_fSpriteSize[NUMHOURS][NUMWEATHERS]; + static int8 m_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; + static uint8 m_nShadowStrength[NUMHOURS][NUMWEATHERS]; + static uint8 m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; + static uint8 m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS]; + static int16 m_fFogStart[NUMHOURS][NUMWEATHERS]; + static int16 m_fFarClip[NUMHOURS][NUMWEATHERS]; + static uint8 m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; + static uint8 m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_fBlurRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_fBlurGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_fBlurBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_fWaterRed[NUMHOURS][NUMWEATHERS]; + static uint8 m_fWaterGreen[NUMHOURS][NUMWEATHERS]; + static uint8 m_fWaterBlue[NUMHOURS][NUMWEATHERS]; + static uint8 m_fWaterAlpha[NUMHOURS][NUMWEATHERS]; static float m_fCurrentAmbientRed; static float m_fCurrentAmbientGreen; @@ -70,36 +70,36 @@ class CTimeCycle static float m_fCurrentDirectionalRed; static float m_fCurrentDirectionalGreen; static float m_fCurrentDirectionalBlue; - static int m_nCurrentSkyTopRed; - static int m_nCurrentSkyTopGreen; - static int m_nCurrentSkyTopBlue; - static int m_nCurrentSkyBottomRed; - static int m_nCurrentSkyBottomGreen; - static int m_nCurrentSkyBottomBlue; - static int m_nCurrentSunCoreRed; - static int m_nCurrentSunCoreGreen; - static int m_nCurrentSunCoreBlue; - static int m_nCurrentSunCoronaRed; - static int m_nCurrentSunCoronaGreen; - static int m_nCurrentSunCoronaBlue; + static int32 m_nCurrentSkyTopRed; + static int32 m_nCurrentSkyTopGreen; + static int32 m_nCurrentSkyTopBlue; + static int32 m_nCurrentSkyBottomRed; + static int32 m_nCurrentSkyBottomGreen; + static int32 m_nCurrentSkyBottomBlue; + static int32 m_nCurrentSunCoreRed; + static int32 m_nCurrentSunCoreGreen; + static int32 m_nCurrentSunCoreBlue; + static int32 m_nCurrentSunCoronaRed; + static int32 m_nCurrentSunCoronaGreen; + static int32 m_nCurrentSunCoronaBlue; static float m_fCurrentSunSize; static float m_fCurrentSpriteSize; static float m_fCurrentSpriteBrightness; - static int m_nCurrentShadowStrength; - static int m_nCurrentLightShadowStrength; - static int m_nCurrentPoleShadowStrength; + static int32 m_nCurrentShadowStrength; + static int32 m_nCurrentLightShadowStrength; + static int32 m_nCurrentPoleShadowStrength; static float m_fCurrentFogStart; static float m_fCurrentFarClip; static float m_fCurrentLightsOnGroundBrightness; - static int m_nCurrentLowCloudsRed; - static int m_nCurrentLowCloudsGreen; - static int m_nCurrentLowCloudsBlue; - static int m_nCurrentFluffyCloudsTopRed; - static int m_nCurrentFluffyCloudsTopGreen; - static int m_nCurrentFluffyCloudsTopBlue; - static int m_nCurrentFluffyCloudsBottomRed; - static int m_nCurrentFluffyCloudsBottomGreen; - static int m_nCurrentFluffyCloudsBottomBlue; + static int32 m_nCurrentLowCloudsRed; + static int32 m_nCurrentLowCloudsGreen; + static int32 m_nCurrentLowCloudsBlue; + static int32 m_nCurrentFluffyCloudsTopRed; + static int32 m_nCurrentFluffyCloudsTopGreen; + static int32 m_nCurrentFluffyCloudsTopBlue; + static int32 m_nCurrentFluffyCloudsBottomRed; + static int32 m_nCurrentFluffyCloudsBottomGreen; + static int32 m_nCurrentFluffyCloudsBottomBlue; static float m_fCurrentBlurRed; static float m_fCurrentBlurGreen; static float m_fCurrentBlurBlue; @@ -107,14 +107,17 @@ class CTimeCycle static float m_fCurrentWaterGreen; static float m_fCurrentWaterBlue; static float m_fCurrentWaterAlpha; - static int m_nCurrentFogColourRed; - static int m_nCurrentFogColourGreen; - static int m_nCurrentFogColourBlue; + static int32 m_nCurrentFogColourRed; + static int32 m_nCurrentFogColourGreen; + static int32 m_nCurrentFogColourBlue; - static int m_FogReduction; + static int32 m_FogReduction; public: - static int m_CurrentStoredValue; + static bool m_bExtraColourOn; + static int32 m_ExtraColour; + static float m_ExtraColourInter; + static int32 m_CurrentStoredValue; static CVector m_VectorToSun[16]; static float m_fShadowFrontX[16]; static float m_fShadowFrontY[16]; @@ -138,51 +141,56 @@ public: static float GetDirectionalRed(void) { return m_fCurrentDirectionalRed; } static float GetDirectionalGreen(void) { return m_fCurrentDirectionalGreen; } static float GetDirectionalBlue(void) { return m_fCurrentDirectionalBlue; } - static int GetSkyTopRed(void) { return m_nCurrentSkyTopRed; } - static int GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; } - static int GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; } - static int GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; } - static int GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; } - static int GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; } - static int GetSunCoreRed(void) { return m_nCurrentSunCoreRed; } - static int GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; } - static int GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; } - static int GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; } - static int GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; } - static int GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; } + static int32 GetSkyTopRed(void) { return m_nCurrentSkyTopRed; } + static int32 GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; } + static int32 GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; } + static int32 GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; } + static int32 GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; } + static int32 GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; } + static int32 GetSunCoreRed(void) { return m_nCurrentSunCoreRed; } + static int32 GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; } + static int32 GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; } + static int32 GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; } + static int32 GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; } + static int32 GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; } static float GetSunSize(void) { return m_fCurrentSunSize; } static float GetSpriteBrightness(void) { return m_fCurrentSpriteBrightness; } static float GetSpriteSize(void) { return m_fCurrentSpriteSize; } - static int GetShadowStrength(void) { return m_nCurrentShadowStrength; } - static int GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; } + static int32 GetShadowStrength(void) { return m_nCurrentShadowStrength; } + static int32 GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; } static float GetLightOnGroundBrightness(void) { return m_fCurrentLightsOnGroundBrightness; } static float GetFarClip(void) { return m_fCurrentFarClip; } static float GetFogStart(void) { return m_fCurrentFogStart; } - static int GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; } - static int GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; } - static int GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; } - static int GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; } - static int GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; } - static int GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; } - static int GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; } - static int GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; } - static int GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; } - static int GetFogRed(void) { return m_nCurrentFogColourRed; } - static int GetFogGreen(void) { return m_nCurrentFogColourGreen; } - static int GetFogBlue(void) { return m_nCurrentFogColourBlue; } - static int GetFogReduction(void) { return m_FogReduction; } + static int32 GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; } + static int32 GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; } + static int32 GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; } + static int32 GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; } + static int32 GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; } + static int32 GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; } + static int32 GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; } + static int32 GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; } + static int32 GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; } + static int32 GetFogRed(void) { return m_nCurrentFogColourRed; } + static int32 GetFogGreen(void) { return m_nCurrentFogColourGreen; } + static int32 GetFogBlue(void) { return m_nCurrentFogColourBlue; } + static int32 GetFogReduction(void) { return m_FogReduction; } - static int GetBlurRed(void) { return m_fCurrentBlurRed; } - static int GetBlurGreen(void) { return m_fCurrentBlurGreen; } - static int GetBlurBlue(void) { return m_fCurrentBlurBlue; } - static int GetWaterRed(void) { return m_fCurrentWaterRed; } - static int GetWaterGreen(void) { return m_fCurrentWaterGreen; } - static int GetWaterBlue(void) { return m_fCurrentWaterBlue; } - static int GetWaterAlpha(void) { return m_fCurrentWaterAlpha; } + static int32 GetBlurRed(void) { return m_fCurrentBlurRed; } + static int32 GetBlurGreen(void) { return m_fCurrentBlurGreen; } + static int32 GetBlurBlue(void) { return m_fCurrentBlurBlue; } + static int32 GetWaterRed(void) { return m_fCurrentWaterRed; } + static int32 GetWaterGreen(void) { return m_fCurrentWaterGreen; } + static int32 GetWaterBlue(void) { return m_fCurrentWaterBlue; } + static int32 GetWaterAlpha(void) { return m_fCurrentWaterAlpha; } static void Initialise(void); static void Update(void); + static float Interpolate(int8 *a, int8 *b); + static float Interpolate(uint8 *a, uint8 *b); + static float Interpolate(int16 *a, int16 *b); + static void StartExtraColour(int32 c, bool fade); + static void StopExtraColour(bool fade); static CVector &GetSunDirection(void) { return m_VectorToSun[m_CurrentStoredValue]; } static float GetShadowFrontX(void) { return m_fShadowFrontX[m_CurrentStoredValue]; } static float GetShadowFrontY(void) { return m_fShadowFrontY[m_CurrentStoredValue]; } diff --git a/src/render/Weather.h b/src/render/Weather.h index ae09e5d1..809bb787 100644 --- a/src/render/Weather.h +++ b/src/render/Weather.h @@ -6,7 +6,9 @@ enum { WEATHER_FOGGY, WEATHER_EXTRA_SUNNY, WEATHER_HURRICANE, - WEATHER_TOTAL + WEATHER_TOTAL, + + WEATHER_EXTRACOLOURS = 6 }; class CWeather From a149d9d511e432fbaa36382407fd14a8524c9e59 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 19:32:32 +0200 Subject: [PATCH 031/112] little timecycle cleanup --- src/render/Timecycle.cpp | 120 +++++++++++++-------------- src/render/Timecycle.h | 172 +++++++++++++++++++-------------------- 2 files changed, 146 insertions(+), 146 deletions(-) diff --git a/src/render/Timecycle.cpp b/src/render/Timecycle.cpp index 162983dd..0d94dbd6 100644 --- a/src/render/Timecycle.cpp +++ b/src/render/Timecycle.cpp @@ -10,42 +10,42 @@ #include "FileMgr.h" #include "Timecycle.h" -int CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; -short CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS]; -short CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; -short CTimeCycle::m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS]; +int16 CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS]; +int16 CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; +int16 CTimeCycle::m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; -int CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; +int32 CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS]; float CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS]; @@ -57,47 +57,47 @@ float CTimeCycle::m_fCurrentAmbientBlue; float CTimeCycle::m_fCurrentDirectionalRed; float CTimeCycle::m_fCurrentDirectionalGreen; float CTimeCycle::m_fCurrentDirectionalBlue; -int CTimeCycle::m_nCurrentSkyTopRed; -int CTimeCycle::m_nCurrentSkyTopGreen; -int CTimeCycle::m_nCurrentSkyTopBlue; -int CTimeCycle::m_nCurrentSkyBottomRed; -int CTimeCycle::m_nCurrentSkyBottomGreen; -int CTimeCycle::m_nCurrentSkyBottomBlue; -int CTimeCycle::m_nCurrentSunCoreRed; -int CTimeCycle::m_nCurrentSunCoreGreen; -int CTimeCycle::m_nCurrentSunCoreBlue; -int CTimeCycle::m_nCurrentSunCoronaRed; -int CTimeCycle::m_nCurrentSunCoronaGreen; -int CTimeCycle::m_nCurrentSunCoronaBlue; +int32 CTimeCycle::m_nCurrentSkyTopRed; +int32 CTimeCycle::m_nCurrentSkyTopGreen; +int32 CTimeCycle::m_nCurrentSkyTopBlue; +int32 CTimeCycle::m_nCurrentSkyBottomRed; +int32 CTimeCycle::m_nCurrentSkyBottomGreen; +int32 CTimeCycle::m_nCurrentSkyBottomBlue; +int32 CTimeCycle::m_nCurrentSunCoreRed; +int32 CTimeCycle::m_nCurrentSunCoreGreen; +int32 CTimeCycle::m_nCurrentSunCoreBlue; +int32 CTimeCycle::m_nCurrentSunCoronaRed; +int32 CTimeCycle::m_nCurrentSunCoronaGreen; +int32 CTimeCycle::m_nCurrentSunCoronaBlue; float CTimeCycle::m_fCurrentSunSize; float CTimeCycle::m_fCurrentSpriteSize; float CTimeCycle::m_fCurrentSpriteBrightness; -int CTimeCycle::m_nCurrentShadowStrength; -int CTimeCycle::m_nCurrentLightShadowStrength; -int CTimeCycle::m_nCurrentTreeShadowStrength; +int32 CTimeCycle::m_nCurrentShadowStrength; +int32 CTimeCycle::m_nCurrentLightShadowStrength; +int32 CTimeCycle::m_nCurrentTreeShadowStrength; float CTimeCycle::m_fCurrentFogStart; float CTimeCycle::m_fCurrentFarClip; float CTimeCycle::m_fCurrentLightsOnGroundBrightness; -int CTimeCycle::m_nCurrentLowCloudsRed; -int CTimeCycle::m_nCurrentLowCloudsGreen; -int CTimeCycle::m_nCurrentLowCloudsBlue; -int CTimeCycle::m_nCurrentFluffyCloudsTopRed; -int CTimeCycle::m_nCurrentFluffyCloudsTopGreen; -int CTimeCycle::m_nCurrentFluffyCloudsTopBlue; -int CTimeCycle::m_nCurrentFluffyCloudsBottomRed; -int CTimeCycle::m_nCurrentFluffyCloudsBottomGreen; -int CTimeCycle::m_nCurrentFluffyCloudsBottomBlue; +int32 CTimeCycle::m_nCurrentLowCloudsRed; +int32 CTimeCycle::m_nCurrentLowCloudsGreen; +int32 CTimeCycle::m_nCurrentLowCloudsBlue; +int32 CTimeCycle::m_nCurrentFluffyCloudsTopRed; +int32 CTimeCycle::m_nCurrentFluffyCloudsTopGreen; +int32 CTimeCycle::m_nCurrentFluffyCloudsTopBlue; +int32 CTimeCycle::m_nCurrentFluffyCloudsBottomRed; +int32 CTimeCycle::m_nCurrentFluffyCloudsBottomGreen; +int32 CTimeCycle::m_nCurrentFluffyCloudsBottomBlue; float CTimeCycle::m_fCurrentBlurRed; float CTimeCycle::m_fCurrentBlurGreen; float CTimeCycle::m_fCurrentBlurBlue; float CTimeCycle::m_fCurrentBlurAlpha; -int CTimeCycle::m_nCurrentFogColourRed; -int CTimeCycle::m_nCurrentFogColourGreen; -int CTimeCycle::m_nCurrentFogColourBlue; +int32 CTimeCycle::m_nCurrentFogColourRed; +int32 CTimeCycle::m_nCurrentFogColourGreen; +int32 CTimeCycle::m_nCurrentFogColourBlue; -int CTimeCycle::m_FogReduction; +int32 CTimeCycle::m_FogReduction; -int CTimeCycle::m_CurrentStoredValue; +int32 CTimeCycle::m_CurrentStoredValue; CVector CTimeCycle::m_VectorToSun[16]; float CTimeCycle::m_fShadowFrontX[16]; float CTimeCycle::m_fShadowFrontY[16]; @@ -227,7 +227,7 @@ CTimeCycle::Update(void) float c2 = (1.0f-timeInterp) * CWeather::InterpolationValue; float c3 = timeInterp * CWeather::InterpolationValue; -#define INTERP(v) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3; +#define INTERP(v) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3 m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed); m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen); diff --git a/src/render/Timecycle.h b/src/render/Timecycle.h index 0cb02b67..d5d7b67a 100644 --- a/src/render/Timecycle.h +++ b/src/render/Timecycle.h @@ -2,42 +2,42 @@ class CTimeCycle { - static int m_nAmbientRed[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; - static int m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; - static int m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; - static int m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; - static int m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; - static int m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; - static int m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; - static int m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nAmbientRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nAmbientGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nAmbientBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nDirectionalRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nDirectionalGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nDirectionalBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nSkyTopRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nSkyTopGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nSkyTopBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nSkyBottomRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nSunCoreRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nSunCoreGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nSunCoreBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nSunCoronaRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS]; static float m_fSunSize[NUMHOURS][NUMWEATHERS]; static float m_fSpriteSize[NUMHOURS][NUMWEATHERS]; static float m_fSpriteBrightness[NUMHOURS][NUMWEATHERS]; - static short m_nShadowStrength[NUMHOURS][NUMWEATHERS]; - static short m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; - static short m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS]; + static int16 m_nShadowStrength[NUMHOURS][NUMWEATHERS]; + static int16 m_nLightShadowStrength[NUMHOURS][NUMWEATHERS]; + static int16 m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS]; static float m_fFogStart[NUMHOURS][NUMWEATHERS]; static float m_fFarClip[NUMHOURS][NUMWEATHERS]; static float m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS]; - static int m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; - static int m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; - static int m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; - static int m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nLowCloudsRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS]; + static int32 m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS]; + static int32 m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS]; + static int32 m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS]; static float m_fBlurRed[NUMHOURS][NUMWEATHERS]; static float m_fBlurGreen[NUMHOURS][NUMWEATHERS]; static float m_fBlurBlue[NUMHOURS][NUMWEATHERS]; @@ -49,48 +49,48 @@ class CTimeCycle static float m_fCurrentDirectionalRed; static float m_fCurrentDirectionalGreen; static float m_fCurrentDirectionalBlue; - static int m_nCurrentSkyTopRed; - static int m_nCurrentSkyTopGreen; - static int m_nCurrentSkyTopBlue; - static int m_nCurrentSkyBottomRed; - static int m_nCurrentSkyBottomGreen; - static int m_nCurrentSkyBottomBlue; - static int m_nCurrentSunCoreRed; - static int m_nCurrentSunCoreGreen; - static int m_nCurrentSunCoreBlue; - static int m_nCurrentSunCoronaRed; - static int m_nCurrentSunCoronaGreen; - static int m_nCurrentSunCoronaBlue; + static int32 m_nCurrentSkyTopRed; + static int32 m_nCurrentSkyTopGreen; + static int32 m_nCurrentSkyTopBlue; + static int32 m_nCurrentSkyBottomRed; + static int32 m_nCurrentSkyBottomGreen; + static int32 m_nCurrentSkyBottomBlue; + static int32 m_nCurrentSunCoreRed; + static int32 m_nCurrentSunCoreGreen; + static int32 m_nCurrentSunCoreBlue; + static int32 m_nCurrentSunCoronaRed; + static int32 m_nCurrentSunCoronaGreen; + static int32 m_nCurrentSunCoronaBlue; static float m_fCurrentSunSize; static float m_fCurrentSpriteSize; static float m_fCurrentSpriteBrightness; - static int m_nCurrentShadowStrength; - static int m_nCurrentLightShadowStrength; - static int m_nCurrentTreeShadowStrength; + static int32 m_nCurrentShadowStrength; + static int32 m_nCurrentLightShadowStrength; + static int32 m_nCurrentTreeShadowStrength; static float m_fCurrentFogStart; static float m_fCurrentFarClip; static float m_fCurrentLightsOnGroundBrightness; - static int m_nCurrentLowCloudsRed; - static int m_nCurrentLowCloudsGreen; - static int m_nCurrentLowCloudsBlue; - static int m_nCurrentFluffyCloudsTopRed; - static int m_nCurrentFluffyCloudsTopGreen; - static int m_nCurrentFluffyCloudsTopBlue; - static int m_nCurrentFluffyCloudsBottomRed; - static int m_nCurrentFluffyCloudsBottomGreen; - static int m_nCurrentFluffyCloudsBottomBlue; + static int32 m_nCurrentLowCloudsRed; + static int32 m_nCurrentLowCloudsGreen; + static int32 m_nCurrentLowCloudsBlue; + static int32 m_nCurrentFluffyCloudsTopRed; + static int32 m_nCurrentFluffyCloudsTopGreen; + static int32 m_nCurrentFluffyCloudsTopBlue; + static int32 m_nCurrentFluffyCloudsBottomRed; + static int32 m_nCurrentFluffyCloudsBottomGreen; + static int32 m_nCurrentFluffyCloudsBottomBlue; static float m_fCurrentBlurRed; static float m_fCurrentBlurGreen; static float m_fCurrentBlurBlue; static float m_fCurrentBlurAlpha; - static int m_nCurrentFogColourRed; - static int m_nCurrentFogColourGreen; - static int m_nCurrentFogColourBlue; + static int32 m_nCurrentFogColourRed; + static int32 m_nCurrentFogColourGreen; + static int32 m_nCurrentFogColourBlue; - static int m_FogReduction; + static int32 m_FogReduction; public: - static int m_CurrentStoredValue; + static int32 m_CurrentStoredValue; static CVector m_VectorToSun[16]; static float m_fShadowFrontX[16]; static float m_fShadowFrontY[16]; @@ -105,40 +105,40 @@ public: static float GetDirectionalRed(void) { return m_fCurrentDirectionalRed; } static float GetDirectionalGreen(void) { return m_fCurrentDirectionalGreen; } static float GetDirectionalBlue(void) { return m_fCurrentDirectionalBlue; } - static int GetSkyTopRed(void) { return m_nCurrentSkyTopRed; } - static int GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; } - static int GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; } - static int GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; } - static int GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; } - static int GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; } - static int GetSunCoreRed(void) { return m_nCurrentSunCoreRed; } - static int GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; } - static int GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; } - static int GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; } - static int GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; } - static int GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; } + static int32 GetSkyTopRed(void) { return m_nCurrentSkyTopRed; } + static int32 GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; } + static int32 GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; } + static int32 GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; } + static int32 GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; } + static int32 GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; } + static int32 GetSunCoreRed(void) { return m_nCurrentSunCoreRed; } + static int32 GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; } + static int32 GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; } + static int32 GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; } + static int32 GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; } + static int32 GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; } static float GetSunSize(void) { return m_fCurrentSunSize; } static float GetSpriteBrightness(void) { return m_fCurrentSpriteBrightness; } static float GetSpriteSize(void) { return m_fCurrentSpriteSize; } - static int GetShadowStrength(void) { return m_nCurrentShadowStrength; } - static int GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; } + static int32 GetShadowStrength(void) { return m_nCurrentShadowStrength; } + static int32 GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; } static float GetLightOnGroundBrightness(void) { return m_fCurrentLightsOnGroundBrightness; } static float GetFarClip(void) { return m_fCurrentFarClip; } static float GetFogStart(void) { return m_fCurrentFogStart; } - static int GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; } - static int GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; } - static int GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; } - static int GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; } - static int GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; } - static int GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; } - static int GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; } - static int GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; } - static int GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; } - static int GetFogRed(void) { return m_nCurrentFogColourRed; } - static int GetFogGreen(void) { return m_nCurrentFogColourGreen; } - static int GetFogBlue(void) { return m_nCurrentFogColourBlue; } - static int GetFogReduction(void) { return m_FogReduction; } + static int32 GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; } + static int32 GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; } + static int32 GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; } + static int32 GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; } + static int32 GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; } + static int32 GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; } + static int32 GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; } + static int32 GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; } + static int32 GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; } + static int32 GetFogRed(void) { return m_nCurrentFogColourRed; } + static int32 GetFogGreen(void) { return m_nCurrentFogColourGreen; } + static int32 GetFogBlue(void) { return m_nCurrentFogColourBlue; } + static int32 GetFogReduction(void) { return m_FogReduction; } static void Initialise(void); static void Update(void); From e57d4508098a9a930724d018a2132a4e704b1cf1 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 9 Aug 2020 19:51:16 +0200 Subject: [PATCH 032/112] drunk blur done --- src/render/MBlur.cpp | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/render/MBlur.cpp b/src/render/MBlur.cpp index 568a0bc1..4c805d25 100644 --- a/src/render/MBlur.cpp +++ b/src/render/MBlur.cpp @@ -255,6 +255,11 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u #endif } +static uint8 DrunkBlurRed = 128; +static uint8 DrunkBlurGreen = 128; +static uint8 DrunkBlurBlue = 128; +static int32 DrunkBlurIncrement = 1; + void CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type, int32 bluralpha) { @@ -367,7 +372,36 @@ CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type, } } - // TODO(MIAMI): drunkness + int DrunkBlurAlpha = 175.0f * Drunkness; + if(DrunkBlurAlpha != 0){ + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + if(BlurOn){ + RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, DrunkBlurAlpha); + RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, DrunkBlurAlpha); + RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, DrunkBlurAlpha); + RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, DrunkBlurAlpha); + }else{ + RwIm2DVertexSetIntRGBA(&Vertex[0], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha); + RwIm2DVertexSetIntRGBA(&Vertex[1], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha); + RwIm2DVertexSetIntRGBA(&Vertex[2], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha); + RwIm2DVertexSetIntRGBA(&Vertex[3], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha); + if(DrunkBlurIncrement){ + if(DrunkBlurRed < 255) DrunkBlurRed++; + if(DrunkBlurGreen < 255) DrunkBlurGreen++; + if(DrunkBlurBlue < 255) DrunkBlurBlue++; + if(DrunkBlurRed == 255) + DrunkBlurIncrement = 0; + }else{ + if(DrunkBlurRed > 128) DrunkBlurRed--; + if(DrunkBlurGreen > 128) DrunkBlurGreen--; + if(DrunkBlurBlue > 128) DrunkBlurBlue--; + if(DrunkBlurRed == 128) + DrunkBlurIncrement = 1; + } + } + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); + } // TODO(MIAMI): OverlayRenderFx From b73b6b8e130a545687aad4024465fc977e3f01ee Mon Sep 17 00:00:00 2001 From: majestic Date: Tue, 4 Aug 2020 19:11:42 -0700 Subject: [PATCH 033/112] CWindModifiers --- src/core/Game.cpp | 2 + src/peds/Ped.cpp | 72 ++++++++++++++++++++++++++++++++++++ src/render/WindModifiers.cpp | 44 ++++++++++++++++++++-- src/render/WindModifiers.h | 7 +++- 4 files changed, 120 insertions(+), 5 deletions(-) diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 7700d321..6573ac22 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -89,6 +89,7 @@ #include "Occlusion.h" #include "debugmenu.h" #include "Ropes.h" +#include "WindModifiers.h" eLevelName CGame::currLevel; int32 CGame::currArea; @@ -693,6 +694,7 @@ void CGame::Process(void) if (!CCutsceneMgr::IsCutsceneProcessing() && !CTimer::GetIsCodePaused()) FrontEndMenuManager.Process(); CStreaming::Update(); + CWindModifiers::Number = 0; if (!CTimer::GetIsPaused()) { CTheZones::Update(); diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 53c2b2c2..f6624c1f 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -63,6 +63,7 @@ #include "Debug.h" #include "GameLogic.h" #include "Bike.h" +#include "WindModifiers.h" #define CAN_SEE_ENTITY_ANGLE_THRESHOLD DEGTORAD(60.0f) @@ -16414,6 +16415,77 @@ CPed::PreRender(void) } #endif + bool bIsWindModifierTurnedOn = false; + float fAnyDirectionShift = 1.0f; + if (IsPlayer() && CWindModifiers::FindWindModifier(GetPosition(), &fAnyDirectionShift, &fAnyDirectionShift) + && !CCullZones::PlayerNoRain() && GetPedState() != PED_DRIVING) + bIsWindModifierTurnedOn = true; + + bool bIsPlayerDrivingBikeOrOpenTopCar = false; + if (GetPedState() == PED_DRIVING && m_pMyVehicle) { + if (m_pMyVehicle->m_vehType == VEHICLE_TYPE_BIKE + || (m_pMyVehicle->m_vehType == VEHICLE_TYPE_CAR && m_pMyVehicle->IsOpenTopCar())) + bIsPlayerDrivingBikeOrOpenTopCar = true; + } + + if (bIsWindModifierTurnedOn || bIsPlayerDrivingBikeOrOpenTopCar) { + float fWindMult = 0.0f; + if (bIsPlayerDrivingBikeOrOpenTopCar) { + fWindMult = DotProduct(m_pMyVehicle->m_vecMoveSpeed, GetForward()); + if (fWindMult > 0.4f) { + float volume = (fWindMult - 0.4f) / 0.6f; + DMAudio.PlayOneShot(m_audioEntityId, SOUND_SET_202, volume); //TODO(MIAMI): revise when audio is done + } + } + + if (bIsWindModifierTurnedOn) + fWindMult = Min(fWindMult, Abs(fAnyDirectionShift - 1.0f)); + + RpHAnimHierarchy* hier = GetAnimHierarchyFromSkinClump(GetClump()); + int32 idx; + RwV3d scale; + float fScaleOffset; + + fScaleOffset = fWindMult * 0.2f; + scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + + idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_NECK)); + RwMatrix* neck = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwMatrixScale(neck, &scale, rwCOMBINEPRECONCAT); + + fScaleOffset = fWindMult * 0.1f; + scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + + idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_CLAVICLEL)); + RwMatrix* clavicleL = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwMatrixScale(clavicleL, &scale, rwCOMBINEPRECONCAT); + + idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_CLAVICLER)); + RwMatrix* clavicleR = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwMatrixScale(clavicleR, &scale, rwCOMBINEPRECONCAT); + + idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_MID)); + RwMatrix* mid = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwMatrixScale(mid, &scale, rwCOMBINEPRECONCAT); + + fScaleOffset = fWindMult * 0.2f; + scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset); + + idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_UPPERARML)); + RwMatrix* upperArmL = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwMatrixScale(upperArmL, &scale, rwCOMBINEPRECONCAT); + + idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_UPPERARMR)); + RwMatrix* upperArmR = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwMatrixScale(upperArmR, &scale, rwCOMBINEPRECONCAT); + } + if (bBodyPartJustCameOff && bIsPedDieAnimPlaying && m_bodyPartBleeding != -1 && (CTimer::GetFrameCounter() & 7) > 3) { CVector bloodDir(0.0f, 0.0f, 0.0f); CVector bloodPos(0.0f, 0.0f, 0.0f); diff --git a/src/render/WindModifiers.cpp b/src/render/WindModifiers.cpp index 49e7c96a..2061df6a 100644 --- a/src/render/WindModifiers.cpp +++ b/src/render/WindModifiers.cpp @@ -1,13 +1,51 @@ #include "common.h" #include "WindModifiers.h" +#include "Camera.h" +#include "General.h" + +#define MAX_HEIGHT_DIST 40.0f +#define MIN_FADE_DIST 20.0f +#define MAX_FADE_DIST 50.0f + +CWindModifiers Array[16]; +int32 CWindModifiers::Number; void -CWindModifiers::RegisterOne(CVector pos, int32 unk) +CWindModifiers::RegisterOne(CVector pos, int32 type = 1) { + if (CWindModifiers::Number < 16 && (pos - TheCamera.GetPosition()).Magnitude() < 100.0f) { + Array[Number].m_pos = pos; + Array[Number].m_type = type; + Number++; + } } -int32 +bool CWindModifiers::FindWindModifier(CVector pos, float *x, float *y) { - return 0; + bool bWasWindModifierFound = false; + CVector2D dir; + for (int i = 0; i < Number; i++) { + if (Array[i].m_type == 1) { + float zDist = Abs(15.0f + pos.z - Array[i].m_pos.z); + + if (zDist < MAX_HEIGHT_DIST) { + float dist = (pos - Array[i].m_pos).Magnitude(); + if (dist < MAX_FADE_DIST) { + float distFade = dist < MIN_FADE_DIST ? 1.0f : 1.0f - (dist - MIN_FADE_DIST) / (MAX_FADE_DIST - MIN_FADE_DIST); + float heightFade = 1.0f - zDist / MAX_HEIGHT_DIST; + dir = (pos - Array[i].m_pos) * heightFade / dist; + bWasWindModifierFound = true; + } + } + } + } + + if (bWasWindModifierFound) { + float directionMult = ((CGeneral::GetRandomNumber() & 0x1F) - 16) * 0.0035f + 1.0f; + *x += dir.x * directionMult; + *y += dir.y * directionMult; + } + + return bWasWindModifierFound; } diff --git a/src/render/WindModifiers.h b/src/render/WindModifiers.h index c42e185d..7c2e57bd 100644 --- a/src/render/WindModifiers.h +++ b/src/render/WindModifiers.h @@ -2,7 +2,10 @@ class CWindModifiers { + CVector m_pos; + int32 m_type; public: - static void RegisterOne(CVector pos, int32 unk); - static int32 FindWindModifier(CVector pos, float *x, float *y); + static int32 Number; + static void RegisterOne(CVector pos, int32 windSourceType); + static bool FindWindModifier(CVector pos, float *x, float *y); }; From 2f987e315e11ee1d93b5f3c2cda3f593c254b373 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 10 Aug 2020 17:04:57 +0200 Subject: [PATCH 034/112] update librw (shadows are working now) --- librw | 2 +- src/render/ShadowCamera.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/librw b/librw index 99c15d5e..113d76cf 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 99c15d5ed78cc112e1055cc89452dd57df28da58 +Subproject commit 113d76cfaaf064447ac936f79d91ea04788fca24 diff --git a/src/render/ShadowCamera.cpp b/src/render/ShadowCamera.cpp index ae94f8ac..f69c234f 100644 --- a/src/render/ShadowCamera.cpp +++ b/src/render/ShadowCamera.cpp @@ -160,7 +160,7 @@ CShadowCamera::SetCenter(RwV3d *center) ASSERT(m_pCamera != nil); RwFrame *camFrame = RwCameraGetFrame(m_pCamera); - RwMatrix *camMatrix = RwFrameGetMatrix(camFrame); + RwMatrix *camMatrix = RwFrameGetMatrix(camFrame); *RwMatrixGetPos(camMatrix) = *center; @@ -188,7 +188,7 @@ CShadowCamera::Update(RpClump *clump) if ( RwCameraBeginUpdate(m_pCamera) ) { - geometry = GetFirstAtomic(clump)->geometry; + geometry = RpAtomicGetGeometry(GetFirstAtomic(clump)); ASSERT(geometry != nil); flags = RpGeometryGetFlags(geometry); From e29e911302ddf8bd4274bd707e73a70122de9d79 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 10 Aug 2020 17:05:34 +0200 Subject: [PATCH 035/112] update librw --- librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librw b/librw index 99c15d5e..113d76cf 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 99c15d5ed78cc112e1055cc89452dd57df28da58 +Subproject commit 113d76cfaaf064447ac936f79d91ea04788fca24 From 2d1b48267dde282489a612c074d7326107c4af83 Mon Sep 17 00:00:00 2001 From: majestic Date: Mon, 10 Aug 2020 14:04:33 -0700 Subject: [PATCH 036/112] improved mission switcher --- src/core/re3.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index e9c643ac..9d10193d 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -556,7 +556,30 @@ DebugMenuPopulate(void) DebugMenuAddVarBool8("Debug", "Show Timebars", &gbShowTimebars, nil); #endif #ifdef MISSION_SWITCHER - DebugMenuAddInt8("Debug", "Select mission no", &nextMissionToSwitch, nil, 1, 0, 96, nil); + DebugMenuEntry *missionEntry; + static const char* missions[] = { + "Initial", "Intro", "An Old Friend", "The Party", "Back Alley Brawl", "Jury Fury", "Riot", + "Treacherous Swine", "Mall Shootout", "Guardian Angels", "Sir, Yes Sir!", "All Hands On Deck!", + "The Chase", "Phnom Penh '86", "The Fastest Boat", "Supply & Demand", "Rub Out", "Death Row", + "Four Iron", "Demolition Man", "Two Bit Hit", "No Escape?", "The Shootist", "The Driver", + "The Job", "Gun Runner", "Boomshine Saigon", "Recruitment Drive", "Dildo Dodo", "Martha's Mug Shot", + "G-spotlight", "Shakedown", "Bar Brawl", "Cop Land", "Spilling the Beans", "Hit the Courier", + "Printworks Buy", "Sunshine Autos", "Interglobal Films Buy", "Cherry Popper Icecreams Buy", + "Kaufman Cabs Buy", "Malibu Club Buy", "The Boatyard Buy", "Pole Position Club Buy", "El Swanko Casa Buy", + "Links View Apartment Buy", "Hyman Condo Buy", "Ocean Heighs Aprt. Buy", "1102 Washington Street Buy", + "Vice Point Buy", "Skumole Shack Buy", "Cap the Collector", "Keep your Friends Close...", + "Alloy Wheels of Steel", "Messing with the Man", "Hog Tied", "Stunt Boat Challenge", "Cannon Fodder", + "Naval Engagement", "Trojan Voodoo", "Juju Scramble", "Bombs Away!", "Dirty Lickin's", "Love Juice", + "Psycho Killer", "Publicity Tour", "Weapon Range", "Road Kill", "Waste the Wife", "Autocide", + "Check Out at the Check In", "Loose Ends", "V.I.P.", "Friendly Rivalry", "Cabmaggedon", "TAXI DRIVER", + "PARAMEDIC", "FIREFIGHTER", "VIGILANTE", "HOTRING", "BLOODRING", "DIRTRING", "Sunshine Autos Races", + "Distribution", "Downtown Chopper Checkpoint", "Ocean Beach Chopper Checkpoint", "Vice Point Chopper Checkpoint", + "Little Haiti Chopper Checkpoint", "Trial by Dirt", "Test Track", "PCJ Playground", "Cone Crazy", + "PIZZA BOY", "RC Raider Pickup", "RC Bandit Race", "RC Baron Race", "Checkpoint Charlie" + }; + + missionEntry = DebugMenuAddVar("Debug", "Select mission", &nextMissionToSwitch, nil, 1, 0, 96, missions); + DebugMenuEntrySetWrap(missionEntry, true); DebugMenuAddCmd("Debug", "Start selected mission ", SwitchToMission); #endif extern bool PrintDebugCode; From b468d010a8a185bd04cdb1fb41810a189971e583 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 11 Aug 2020 18:39:53 +0200 Subject: [PATCH 037/112] implemented extended postfx --- src/core/Camera.cpp | 5 + src/core/Game.cpp | 4 + src/core/config.h | 1 + src/core/re3.cpp | 11 + src/extras/postfx.cpp | 516 +++++++++++++++++++ src/extras/postfx.h | 45 ++ src/extras/shaders/Makefile | 16 + src/extras/shaders/colourfilterVC.frag | 28 + src/extras/shaders/colourfilterVC_PS.cso | Bin 0 -> 648 bytes src/extras/shaders/colourfilterVC_PS.hlsl | 23 + src/extras/shaders/colourfilterVC_PS.inc | 56 ++ src/extras/shaders/colourfilterVC_fs_gl3.inc | 30 ++ src/extras/shaders/contrast.frag | 18 + src/extras/shaders/contrastPS.cso | Bin 0 -> 344 bytes src/extras/shaders/contrastPS.hlsl | 21 + src/extras/shaders/contrastPS.inc | 31 ++ src/extras/shaders/contrast_fs_gl3.inc | 20 + src/extras/shaders/im2d.vert | 21 + src/extras/shaders/im2d_gl3.inc | 23 + src/extras/shaders/make.cmd | 3 + src/extras/shaders/makeinc.sh | 5 + src/peds/Ped.cpp | 1 + src/render/MBlur.cpp | 32 +- src/rw/Lights.cpp | 11 +- 24 files changed, 909 insertions(+), 12 deletions(-) create mode 100644 src/extras/postfx.cpp create mode 100644 src/extras/postfx.h create mode 100644 src/extras/shaders/Makefile create mode 100644 src/extras/shaders/colourfilterVC.frag create mode 100644 src/extras/shaders/colourfilterVC_PS.cso create mode 100644 src/extras/shaders/colourfilterVC_PS.hlsl create mode 100644 src/extras/shaders/colourfilterVC_PS.inc create mode 100644 src/extras/shaders/colourfilterVC_fs_gl3.inc create mode 100644 src/extras/shaders/contrast.frag create mode 100644 src/extras/shaders/contrastPS.cso create mode 100644 src/extras/shaders/contrastPS.hlsl create mode 100644 src/extras/shaders/contrastPS.inc create mode 100644 src/extras/shaders/contrast_fs_gl3.inc create mode 100644 src/extras/shaders/im2d.vert create mode 100644 src/extras/shaders/im2d_gl3.inc create mode 100644 src/extras/shaders/make.cmd create mode 100644 src/extras/shaders/makeinc.sh diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index 2f977a20..df778815 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -514,7 +514,12 @@ CCamera::Process(void) int tableIndex = (int)(DEGTORAD(DrunkAngle)/TWOPI * CParticle::SIN_COS_TABLE_SIZE) & CParticle::SIN_COS_TABLE_SIZE-1; DrunkAngle += 5.0f; +#ifndef FIX_BUGS + // This just messes up interpolation, probably not what they intended + // and multiplying the interpolated FOV is also a bit extreme + // so let's not do any of this nonsense Cams[ActiveCam].FOV *= (1.0f + CMBlur::Drunkness); +#endif CamSource.x += -0.02f*CMBlur::Drunkness * CParticle::m_CosTable[tableIndex]; CamSource.y += -0.02f*CMBlur::Drunkness * CParticle::m_SinTable[tableIndex]; diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 7b113d89..ce2194a0 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -90,6 +90,7 @@ #include "debugmenu.h" #include "Ropes.h" #include "WindModifiers.h" +#include "postfx.h" eLevelName CGame::currLevel; int32 CGame::currArea; @@ -152,6 +153,9 @@ CGame::InitialiseOnceBeforeRW(void) CFileMgr::Initialise(); CdStreamInit(MAX_CDCHANNELS); ValidateVersion(); +#ifdef EXTENDED_COLOURFILTER + CPostFX::InitOnce(); +#endif return true; } diff --git a/src/core/config.h b/src/core/config.h index 469f9017..eadbc307 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -225,6 +225,7 @@ enum Config { //#define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH +//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) // Water & Particle #define PC_PARTICLE diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 9d10193d..34fbb428 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -33,6 +33,8 @@ #include "WaterLevel.h" #include "main.h" #include "Script.h" +#include "MBlur.h" +#include "postfx.h" #ifndef _WIN32 #include "assert.h" @@ -515,6 +517,15 @@ DebugMenuPopulate(void) DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil); DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil); DebugMenuAddVar("Render", "Max FPS", &RsGlobal.maxFPS, nil, 1, 1, 1000, nil); +#ifdef EXTENDED_COLOURFILTER + static const char *filternames[] = { "None", "Simple", "Normal", "Mobile" }; + e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_MOBILE, filternames); + DebugMenuEntrySetWrap(e, true); + DebugMenuAddVar("Render", "Intensity", &CPostFX::Intensity, nil, 0.05f, 0, 10.0f); + DebugMenuAddVarBool8("Render", "Blur", &CPostFX::BlurOn, nil); + DebugMenuAddVarBool8("Render", "Motion Blur", &CPostFX::MotionBlurOn, nil); +#endif + DebugMenuAddVar("Render", "Drunkness", &CMBlur::Drunkness, nil, 0.05f, 0, 1.0f); DebugMenuAddVarBool8("Render", "Occlusion debug", &bDisplayOccDebugStuff, nil); DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil); diff --git a/src/extras/postfx.cpp b/src/extras/postfx.cpp new file mode 100644 index 00000000..e8cd4bc4 --- /dev/null +++ b/src/extras/postfx.cpp @@ -0,0 +1,516 @@ +#define WITHWINDOWS +#define WITH_D3D +#include "common.h" + +#ifdef EXTENDED_COLOURFILTER + +#ifndef LIBRW +#error "Need librw for EXTENDED_COLOURFILTER" +#endif + +#include "RwHelper.h" +#include "Camera.h" +#include "MBlur.h" +#include "postfx.h" + +RwRaster *CPostFX::pFrontBuffer; +RwRaster *CPostFX::pBackBuffer; +bool CPostFX::bJustInitialised; +int CPostFX::EffectSwitch = POSTFX_NORMAL; +bool CPostFX::BlurOn = false; +bool CPostFX::MotionBlurOn = false; + +static RwIm2DVertex Vertex[4]; +static RwIm2DVertex Vertex2[4]; +static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 }; + +#ifdef RW_D3D9 +void *colourfilterVC_PS; +void *contrast_PS; +#endif +#ifdef RW_OPENGL +int32 u_blurcolor; +int32 u_contrastAdd; +int32 u_contrastMult; +rw::gl3::Shader *colourFilterVC; +rw::gl3::Shader *contrast; +#endif + +void +CPostFX::InitOnce(void) +{ +#ifdef RW_OPENGL + u_blurcolor = rw::gl3::registerUniform("u_blurcolor"); + u_contrastAdd = rw::gl3::registerUniform("u_contrastAdd"); + u_contrastMult = rw::gl3::registerUniform("u_contrastMult"); +#endif +} + +void +CPostFX::Open(RwCamera *cam) +{ + uint32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1); + uint32 height = Pow(2.0f, int32(log2(RwRasterGetHeight(RwCameraGetRaster(cam))))+1); + uint32 depth = RwRasterGetDepth(RwCameraGetRaster(cam)); + pFrontBuffer = RwRasterCreate(width, height, depth, rwRASTERTYPECAMERATEXTURE); + pBackBuffer = RwRasterCreate(width, height, depth, rwRASTERTYPECAMERATEXTURE); + bJustInitialised = true; + + float zero, xmax, ymax; + + if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){ + zero = HALFPX; + xmax = width + HALFPX; + ymax = height + HALFPX; + }else{ + zero = -HALFPX; + xmax = width - HALFPX; + ymax = height - HALFPX; + } + + RwIm2DVertexSetScreenX(&Vertex[0], zero); + RwIm2DVertexSetScreenY(&Vertex[0], zero); + RwIm2DVertexSetScreenZ(&Vertex[0], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[0], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[0], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex[1], zero); + RwIm2DVertexSetScreenY(&Vertex[1], ymax); + RwIm2DVertexSetScreenZ(&Vertex[1], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[1], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[1], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex[2], xmax); + RwIm2DVertexSetScreenY(&Vertex[2], ymax); + RwIm2DVertexSetScreenZ(&Vertex[2], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[2], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[2], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex[3], xmax); + RwIm2DVertexSetScreenY(&Vertex[3], zero); + RwIm2DVertexSetScreenZ(&Vertex[3], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[3], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[3], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255); + + + RwIm2DVertexSetScreenX(&Vertex2[0], zero + 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[0], zero + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[0], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[0], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[0], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[0], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex2[1], 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[1], ymax + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[1], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[1], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[1], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[1], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex2[2], xmax + 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[2], ymax + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[2], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[2], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[2], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[2], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex2[3], xmax + 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[3], zero + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[3], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[3], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[3], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[3], 255, 255, 255, 255); + + +#ifdef RW_D3D9 +#include "shaders/colourfilterVC_PS.inc" + colourfilterVC_PS = rw::d3d::createPixelShader(colourfilterVC_PS_cso); +#include "shaders/contrastPS.inc" + contrast_PS = rw::d3d::createPixelShader(contrastPS_cso); +#endif +#ifdef RW_OPENGL + using namespace rw::gl3; +// AllocConsole(); +// freopen("CONIN$", "r", stdin); +// freopen("CONOUT$", "w", stdout); +// freopen("CONOUT$", "w", stderr); + + + { +#ifdef RW_GLES2 +#include "gl2_shaders/im2d_gl2.inc" +#include "gl2_shaders/colourfilterVC_fs_gl2.inc" +#else +#include "shaders/im2d_gl3.inc" +#include "shaders/colourfilterVC_fs_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, colourfilterVC_frag_src, nil }; + colourFilterVC = Shader::create(vs, fs); + assert(colourFilterVC); + } + + { +#ifdef RW_GLES2 +#include "gl2_shaders/im2d_gl2.inc" +#include "gl2_shaders/contrast_fs_gl2.inc" +#else +#include "shaders/im2d_gl3.inc" +#include "shaders/contrast_fs_gl3.inc" + const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, contrast_frag_src, nil }; + contrast = Shader::create(vs, fs); + assert(contrast); +#endif + } + +#endif +} + +void +CPostFX::Close(void) +{ + if(pFrontBuffer){ + RwRasterDestroy(pFrontBuffer); + pFrontBuffer = nil; + } + if(pBackBuffer){ + RwRasterDestroy(pBackBuffer); + pBackBuffer = nil; + } +#ifdef RW_D3D9 + if(colourfilterVC_PS){ + rw::d3d::destroyPixelShader(colourfilterVC_PS); + colourfilterVC_PS = nil; + } + if(contrast_PS){ + rw::d3d::destroyPixelShader(contrast_PS); + contrast_PS = nil; + } +#endif +#ifdef RW_OPENGL + if(colourFilterVC){ + colourFilterVC->destroy(); + colourFilterVC = nil; + } + if(contrast){ + contrast->destroy(); + contrast = nil; + } +#endif +} + +void +CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + + RwIm2DVertexSetIntRGBA(&Vertex[0], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex[1], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex[2], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex[3], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex2[0], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex2[1], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex2[2], r*2, g*2, b*2, 30); + RwIm2DVertexSetIntRGBA(&Vertex2[3], r*2, g*2, b*2, 30); + + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurOn ? Vertex2 : Vertex, 4, Index, 6); + + + RwIm2DVertexSetIntRGBA(&Vertex2[0], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex2[1], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex2[2], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex2[3], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a); + + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurOn ? Vertex2 : Vertex, 4, Index, 6); +} + +void +CPostFX::RenderOverlaySniper(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + + RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, 80); + RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, 80); + RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, 80); + RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, 80); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +} + +float CPostFX::Intensity = 1.0f; + +void +CPostFX::RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pBackBuffer); + + if(EffectSwitch == POSTFX_MOBILE){ + float mult[3], add[3]; + mult[0] = (r-64)/256.0f + 1.4f; + mult[1] = (g-64)/256.0f + 1.4f; + mult[2] = (b-64)/256.0f + 1.4f; + add[0] = r/1536.f - 0.05f; + add[1] = g/1536.f - 0.05f; + add[2] = b/1536.f - 0.05f; +#ifdef RW_D3D9 + rw::d3d::d3ddevice->SetPixelShaderConstantF(10, mult, 1); + rw::d3d::d3ddevice->SetPixelShaderConstantF(11, add, 1); + + rw::d3d::im2dOverridePS = contrast_PS; +#endif +#ifdef RW_OPENGL + rw::gl3::im2dOverrideShader = contrast; + contrast->use(); + glUniform3fv(contrast->uniformLocations[u_contrastMult], 1, mult); + glUniform3fv(contrast->uniformLocations[u_contrastAdd], 1, add); +#endif + }else{ + float f = Intensity; + float blurcolors[4]; + blurcolors[0] = r*f/255.0f; + blurcolors[1] = g*f/255.0f; + blurcolors[2] = b*f/255.0f; + blurcolors[3] = 30/255.0f; +#ifdef RW_D3D9 + rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1); + +/* + float blurcolors[NUMAVERAGE*4]; + int j = Next; + for(int i = NUMAVERAGE-1; i >= 0; i--){ + j = (j+NUMAVERAGE-1)%NUMAVERAGE; +// blurcolors[i*4+0] = PrevRed[j]/255.0f; +// blurcolors[i*4+1] = PrevGreen[j]/255.0f; +// blurcolors[i*4+2] = PrevBlue[j]/255.0f; +// blurcolors[i*4+3] = Intensity/255.0f; + + blurcolors[i*4+0] = r/255.0f; + blurcolors[i*4+1] = g/255.0f; + blurcolors[i*4+2] = b/255.0f; + blurcolors[i*4+3] = Intensity/255.0f; + } + rw::d3d::d3ddevice->SetPixelShaderConstantF(15, blurcolors, NUMAVERAGE); +*/ + + rw::d3d::im2dOverridePS = colourfilterVC_PS; +#endif +#ifdef RW_OPENGL + rw::gl3::im2dOverrideShader = colourFilterVC; + colourFilterVC->use(); + glUniform4fv(colourFilterVC->uniformLocations[u_blurcolor], 1, blurcolors); +#endif + } + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +#ifdef RW_D3D9 + rw::d3d::im2dOverridePS = nil; +#endif +#ifdef RW_OPENGL + rw::gl3::im2dOverrideShader = nil; +#endif +} + +void +CPostFX::RenderMotionBlur(RwCamera *cam, uint32 blur) +{ + if(blur == 0) + return; + + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, blur); + RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, blur); + RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, blur); + RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, blur); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +} + +bool +CPostFX::NeedBackBuffer(void) +{ + // Current frame -- needed for non-blur effect + switch(EffectSwitch){ + case POSTFX_OFF: + case POSTFX_SIMPLE: + // no actual rendering here + return false; + case POSTFX_NORMAL: + if(MotionBlurOn) + return false; + else + return true; + case POSTFX_MOBILE: + return true; + } + return false; +} + +bool +CPostFX::NeedFrontBuffer(int32 type) +{ + // Last frame -- needed for motion blur + if(CMBlur::Drunkness > 0.0f) + return true; + if(type == MOTION_BLUR_SNIPER) + return true; + + switch(EffectSwitch){ + case POSTFX_OFF: + case POSTFX_SIMPLE: + // no actual rendering here + return false; + case POSTFX_NORMAL: + if(MotionBlurOn) + return true; + else + return false; + case POSTFX_MOBILE: + return false; + } + return false; +} + +void +CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha) +{ + if(pFrontBuffer == nil) + Open(cam); + assert(pFrontBuffer); + assert(pBackBuffer); + + if(type == MOTION_BLUR_LIGHT_SCENE){ + SmoothColor(red, green, blue, blur); + red = AvgRed; + green = AvgGreen; + blue = AvgBlue; + blur = AvgAlpha; + } + + if(NeedBackBuffer()){ + RwRasterPushContext(pBackBuffer); + RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0); + RwRasterPopContext(); + } + + DefinedState(); + + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST); + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); + + if(type == MOTION_BLUR_SNIPER){ + if(!bJustInitialised) + RenderOverlaySniper(cam, red, green, blue, blur); + }else switch(EffectSwitch){ + case POSTFX_OFF: + case POSTFX_SIMPLE: + // no actual rendering here + break; + case POSTFX_NORMAL: + if(MotionBlurOn){ + if(!bJustInitialised) + RenderOverlayBlur(cam, red, green, blue, blur); + }else{ + RenderOverlayShader(cam, red, green, blue, blur); + } + break; + case POSTFX_MOBILE: + RenderOverlayShader(cam, red, green, blue, blur); + break; + } + + if(!bJustInitialised) + RenderMotionBlur(cam, 175.0f * CMBlur::Drunkness); + + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + if(NeedFrontBuffer(type)){ + RwRasterPushContext(pFrontBuffer); + RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0); + RwRasterPopContext(); + bJustInitialised = false; + }else + bJustInitialised = true; +} + +int CPostFX::PrevRed[NUMAVERAGE], CPostFX::AvgRed; +int CPostFX::PrevGreen[NUMAVERAGE], CPostFX::AvgGreen; +int CPostFX::PrevBlue[NUMAVERAGE], CPostFX::AvgBlue; +int CPostFX::PrevAlpha[NUMAVERAGE], CPostFX::AvgAlpha; +int CPostFX::Next; +int CPostFX::NumValues; + +// This is rather annoying...the blur color can flicker slightly +// which becomes very visible when amplified by the shader +void +CPostFX::SmoothColor(uint32 red, uint32 green, uint32 blue, uint32 alpha) +{ + PrevRed[Next] = red; + PrevGreen[Next] = green; + PrevBlue[Next] = blue; + PrevAlpha[Next] = alpha; + Next = (Next+1) % NUMAVERAGE; + NumValues = Min(NumValues+1, NUMAVERAGE); + + AvgRed = 0; + AvgGreen = 0; + AvgBlue = 0; + AvgAlpha = 0; + for(int i = 0; i < NumValues; i++){ + AvgRed += PrevRed[i]; + AvgGreen += PrevGreen[i]; + AvgBlue += PrevBlue[i]; + AvgAlpha += PrevAlpha[i]; + } + AvgRed /= NumValues; + AvgGreen /= NumValues; + AvgBlue /= NumValues; + AvgAlpha /= NumValues; +} + +#endif diff --git a/src/extras/postfx.h b/src/extras/postfx.h new file mode 100644 index 00000000..ace2e4a8 --- /dev/null +++ b/src/extras/postfx.h @@ -0,0 +1,45 @@ +#pragma once + +#ifdef EXTENDED_COLOURFILTER + +class CPostFX +{ +public: + enum { + POSTFX_OFF, + POSTFX_SIMPLE, + POSTFX_NORMAL, + POSTFX_MOBILE + }; + static RwRaster *pFrontBuffer; + static RwRaster *pBackBuffer; + static bool bJustInitialised; + static int EffectSwitch; + static bool BlurOn; // or use CMblur for that? + static bool MotionBlurOn; // or use CMblur for that? + static float Intensity; + + // smooth blur color + enum { NUMAVERAGE = 20 }; + static int PrevRed[NUMAVERAGE], AvgRed; + static int PrevGreen[NUMAVERAGE], AvgGreen; + static int PrevBlue[NUMAVERAGE], AvgBlue; + static int PrevAlpha[NUMAVERAGE], AvgAlpha; + static int Next; + static int NumValues; + + static void InitOnce(void); + static void Open(RwCamera *cam); + static void Close(void); + static void RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderOverlaySniper(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderMotionBlur(RwCamera *cam, uint32 blur); + static void Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha); + static void SmoothColor(uint32 red, uint32 green, uint32 blue, uint32 alpha); + static bool NeedBackBuffer(void); + static bool NeedFrontBuffer(int32 type); + static bool UseBlurColours(void) { return EffectSwitch != POSTFX_SIMPLE; } +}; + +#endif diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile new file mode 100644 index 00000000..effb6afc --- /dev/null +++ b/src/extras/shaders/Makefile @@ -0,0 +1,16 @@ +all: im2d_gl3.inc colourfilterVC_fs_gl3.inc contrast_fs_gl3.inc + +im2d_gl3.inc: im2d.vert + (echo 'const char *im2d_vert_src =';\ + sed 's/..*/"&\\n"/' im2d.vert;\ + echo ';') >im2d_gl3.inc + +colourfilterVC_fs_gl3.inc: colourfilterVC.frag + (echo 'const char *colourfilterVC_frag_src =';\ + sed 's/..*/"&\\n"/' colourfilterVC.frag;\ + echo ';') >colourfilterVC_fs_gl3.inc + +contrast_fs_gl3.inc: contrast.frag + (echo 'const char *contrast_frag_src =';\ + sed 's/..*/"&\\n"/' contrast.frag;\ + echo ';') >contrast_fs_gl3.inc diff --git a/src/extras/shaders/colourfilterVC.frag b/src/extras/shaders/colourfilterVC.frag new file mode 100644 index 00000000..e19a8600 --- /dev/null +++ b/src/extras/shaders/colourfilterVC.frag @@ -0,0 +1,28 @@ +uniform sampler2D tex0; +uniform vec4 u_blurcolor; + +in vec4 v_color; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + float a = u_blurcolor.a; + + vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); + vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec4 prev = dst; + for(int i = 0; i < 5; i++){ +// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); + vec4 tmp = dst*(1.0-a) + prev*doublec*a; + tmp += prev*u_blurcolor; + tmp += prev*u_blurcolor; + prev = clamp(tmp, 0.0, 1.0); + } + color.rgb = prev.rgb; + color.a = 1.0f; +} + diff --git a/src/extras/shaders/colourfilterVC_PS.cso b/src/extras/shaders/colourfilterVC_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..4b0e9f3fa72d0277834a8d66b592c49aa159ce0c GIT binary patch literal 648 zcmd5(%Syvg6rAKn3_%FEaU+#cGSSd~Fo-aXdc8^=wk+^Za!Y?B5;)SLrAXMsH6q(=r(5 z@5L-*l7w**CZ}x7f6xSQr9f64eD4Ls`iwM9%V_Y9T8}tI3wP1MWVZ@~DA)+A_1U&Y zQjAH`F7dQ)Q)a?)E-|H3enK|Z=k lp50(%3IEqMRO1@5qzrIZl^1JNolN Date: Tue, 11 Aug 2020 18:42:21 +0200 Subject: [PATCH 038/112] update librw --- librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librw b/librw index 113d76cf..5e299fb1 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 113d76cfaaf064447ac936f79d91ea04788fca24 +Subproject commit 5e299fb12e0ab85b5a32032544f58480a93a4a32 From a9935dcd452a309ab6a9f38b978ba794784b5d33 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 11 Aug 2020 19:42:08 +0200 Subject: [PATCH 039/112] tiny postfx cleanup --- src/extras/postfx.cpp | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/extras/postfx.cpp b/src/extras/postfx.cpp index e8cd4bc4..7e9df4e7 100644 --- a/src/extras/postfx.cpp +++ b/src/extras/postfx.cpp @@ -150,11 +150,6 @@ CPostFX::Open(RwCamera *cam) #endif #ifdef RW_OPENGL using namespace rw::gl3; -// AllocConsole(); -// freopen("CONIN$", "r", stdin); -// freopen("CONOUT$", "w", stdout); -// freopen("CONOUT$", "w", stderr); - { #ifdef RW_GLES2 @@ -309,25 +304,6 @@ CPostFX::RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) blurcolors[3] = 30/255.0f; #ifdef RW_D3D9 rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1); - -/* - float blurcolors[NUMAVERAGE*4]; - int j = Next; - for(int i = NUMAVERAGE-1; i >= 0; i--){ - j = (j+NUMAVERAGE-1)%NUMAVERAGE; -// blurcolors[i*4+0] = PrevRed[j]/255.0f; -// blurcolors[i*4+1] = PrevGreen[j]/255.0f; -// blurcolors[i*4+2] = PrevBlue[j]/255.0f; -// blurcolors[i*4+3] = Intensity/255.0f; - - blurcolors[i*4+0] = r/255.0f; - blurcolors[i*4+1] = g/255.0f; - blurcolors[i*4+2] = b/255.0f; - blurcolors[i*4+3] = Intensity/255.0f; - } - rw::d3d::d3ddevice->SetPixelShaderConstantF(15, blurcolors, NUMAVERAGE); -*/ - rw::d3d::im2dOverridePS = colourfilterVC_PS; #endif #ifdef RW_OPENGL From 878ffa8998f7fc78064d0e38795f26ee0de57688 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 12 Aug 2020 10:48:00 +0200 Subject: [PATCH 040/112] sun reflection fix --- src/render/Coronas.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render/Coronas.cpp b/src/render/Coronas.cpp index df5dfadb..2d621d18 100644 --- a/src/render/Coronas.cpp +++ b/src/render/Coronas.cpp @@ -604,8 +604,8 @@ CCoronas::RenderSunReflection(void) RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored+1], r, g, b, 255); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored+1], - sunPos.x + fwdLen*sunDir.x - sideLen*sunDir.x, - sunPos.y + fwdLen*sunDir.y + sideLen*sunDir.y, + sunPos.x + fwdLen*sunDir.x - sideLen*sunDir.y, + sunPos.y + fwdLen*sunDir.y + sideLen*sunDir.x, sunPos.z); RwIm3DVertexSetU(&TempBufferRenderVertices[TempBufferVerticesStored+0], 0.0f); From 2034d7b2aebdeb3759efb150a1d09c586f5d2ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Thu, 13 Aug 2020 01:29:34 +0300 Subject: [PATCH 041/112] Register start button for real --- src/core/ControllerConfig.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp index 6a5080e5..fe1821c2 100644 --- a/src/core/ControllerConfig.cpp +++ b/src/core/ControllerConfig.cpp @@ -633,6 +633,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonDown(int32 button, } AffectControllerStateOn_ButtonDown_AllStates(button, type, *state); + +#ifdef REGISTER_START_BUTTON + if (button == 12) + state->Start = 255; +#endif } } } @@ -1036,6 +1041,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonUp(int32 button, eC { if (FrontEndMenuManager.GetIsMenuActive()) AffectControllerStateOn_ButtonUp_All_Player_States(button, type, *state); + +#ifdef REGISTER_START_BUTTON + if (button == 12) + state->Start = 0; +#endif } } } From f0503edf62ff0263ae3e55b3a7916e03b2152b7a Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 13 Aug 2020 16:29:42 +0200 Subject: [PATCH 042/112] fix render poly bug --- src/render/Renderer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 717021a7..7ae29a2f 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -836,8 +836,13 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL a2 = i; } } +#ifdef FIX_BUGS + y = Floor(miny); + yend = Floor(maxy); +#else y = miny; yend = maxy; +#endif // Go left in poly to find first edge b b2 = a2; @@ -875,8 +880,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL while(y <= yend && y < NUMSECTORS_Y){ // scan one x-line if(y >= 0 && xstart < NUMSECTORS_X) - for(x = xstart; x <= xend; x++) - if(x >= 0 && x != NUMSECTORS_X) + for(x = xstart; x <= xend && x != NUMSECTORS_X; x++) + if(x >= 0) scanfunc(CWorld::GetSector(x, y)->m_lists); // advance one scan line From 0d8fcb41eec5da54ef0ec9e4c861f5281794b0a9 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 13 Aug 2020 16:29:42 +0200 Subject: [PATCH 043/112] fix render poly bug --- src/render/Renderer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 03ef1064..66c12dd9 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -908,8 +908,13 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL a2 = i; } } +#ifdef FIX_BUGS + y = Floor(miny); + yend = Floor(maxy); +#else y = miny; yend = maxy; +#endif // Go left in poly to find first edge b b2 = a2; @@ -947,8 +952,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL while(y <= yend && y < NUMSECTORS_Y){ // scan one x-line if(y >= 0 && xstart < NUMSECTORS_X) - for(x = xstart; x <= xend; x++) - if(x >= 0 && x != NUMSECTORS_X) + for(x = xstart; x <= xend && x != NUMSECTORS_X; x++) + if(x >= 0) scanfunc(CWorld::GetSector(x, y)->m_lists); // advance one scan line From afed831aeda5415f1d99612d0f14541fdd34720f Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 13 Aug 2020 18:14:24 +0200 Subject: [PATCH 044/112] extended postfx and sniper hud fix --- src/core/Game.cpp | 4 + src/core/config.h | 1 + src/core/re3.cpp | 9 + src/extras/postfx.cpp | 475 ++++++++++++++++++ src/extras/postfx.h | 35 ++ src/extras/shaders/Makefile | 16 + src/extras/shaders/colourfilterIII.frag | 28 ++ src/extras/shaders/colourfilterIII_PS.cso | Bin 0 -> 452 bytes src/extras/shaders/colourfilterIII_PS.hlsl | 15 + src/extras/shaders/colourfilterIII_PS.inc | 40 ++ src/extras/shaders/colourfilterIII_fs_gl3.inc | 30 ++ src/extras/shaders/contrast.frag | 18 + src/extras/shaders/contrastPS.cso | Bin 0 -> 344 bytes src/extras/shaders/contrastPS.hlsl | 21 + src/extras/shaders/contrastPS.inc | 31 ++ src/extras/shaders/contrast_fs_gl3.inc | 20 + src/extras/shaders/im2d.vert | 21 + src/extras/shaders/im2d_gl3.inc | 23 + src/extras/shaders/make.cmd | 3 + src/extras/shaders/makeinc.sh | 5 + src/render/Hud.cpp | 57 ++- src/render/MBlur.cpp | 16 +- src/render/Sprite2d.cpp | 17 +- 23 files changed, 851 insertions(+), 34 deletions(-) create mode 100644 src/extras/postfx.cpp create mode 100644 src/extras/postfx.h create mode 100644 src/extras/shaders/Makefile create mode 100644 src/extras/shaders/colourfilterIII.frag create mode 100644 src/extras/shaders/colourfilterIII_PS.cso create mode 100644 src/extras/shaders/colourfilterIII_PS.hlsl create mode 100644 src/extras/shaders/colourfilterIII_PS.inc create mode 100644 src/extras/shaders/colourfilterIII_fs_gl3.inc create mode 100644 src/extras/shaders/contrast.frag create mode 100644 src/extras/shaders/contrastPS.cso create mode 100644 src/extras/shaders/contrastPS.hlsl create mode 100644 src/extras/shaders/contrastPS.inc create mode 100644 src/extras/shaders/contrast_fs_gl3.inc create mode 100644 src/extras/shaders/im2d.vert create mode 100644 src/extras/shaders/im2d_gl3.inc create mode 100644 src/extras/shaders/make.cmd create mode 100644 src/extras/shaders/makeinc.sh diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 08623c65..d5b376f6 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -87,6 +87,7 @@ #include "Zones.h" #include "debugmenu.h" #include "frontendoption.h" +#include "postfx.h" eLevelName CGame::currLevel; bool CGame::bDemoMode = true; @@ -148,6 +149,9 @@ CGame::InitialiseOnceBeforeRW(void) CFileMgr::Initialise(); CdStreamInit(MAX_CDCHANNELS); ValidateVersion(); +#ifdef EXTENDED_COLOURFILTER + CPostFX::InitOnce(); +#endif return true; } diff --git a/src/core/config.h b/src/core/config.h index 43fc54fa..bb6adce6 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -208,6 +208,7 @@ enum Config { //#define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH +//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) // Particle //#define PC_PARTICLE diff --git a/src/core/re3.cpp b/src/core/re3.cpp index f9be4b51..9edd9497 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -29,6 +29,8 @@ #include "Text.h" #include "WaterLevel.h" #include "main.h" +#include "MBlur.h" +#include "postfx.h" #ifndef _WIN32 #include "assert.h" @@ -461,6 +463,13 @@ DebugMenuPopulate(void) DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil); DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil); DebugMenuAddVar("Render", "Max FPS", &RsGlobal.maxFPS, nil, 1, 1, 1000, nil); +#ifdef EXTENDED_COLOURFILTER + static const char *filternames[] = { "None", "Simple", "Normal", "Mobile" }; + e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_MOBILE, filternames); + DebugMenuEntrySetWrap(e, true); + DebugMenuAddVar("Render", "Intensity", &CPostFX::Intensity, nil, 0.05f, 0, 10.0f); + DebugMenuAddVarBool8("Render", "Motion Blur", &CPostFX::MotionBlurOn, nil); +#endif DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Path Links", &gbShowCarPathsLinks, nil); diff --git a/src/extras/postfx.cpp b/src/extras/postfx.cpp new file mode 100644 index 00000000..6355dfb1 --- /dev/null +++ b/src/extras/postfx.cpp @@ -0,0 +1,475 @@ +#define WITHWINDOWS +#define WITH_D3D +#include "common.h" + +#ifdef EXTENDED_COLOURFILTER + +#ifndef LIBRW +#error "Need librw for EXTENDED_COLOURFILTER" +#endif + +#include "RwHelper.h" +#include "Camera.h" +#include "MBlur.h" +#include "postfx.h" + +RwRaster *CPostFX::pFrontBuffer; +RwRaster *CPostFX::pBackBuffer; +bool CPostFX::bJustInitialised; +int CPostFX::EffectSwitch = POSTFX_NORMAL; +bool CPostFX::MotionBlurOn = false; + +static RwIm2DVertex Vertex[4]; +static RwIm2DVertex Vertex2[4]; +static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 }; + +#ifdef RW_D3D9 +void *colourfilterIII_PS; +void *contrast_PS; +#endif +#ifdef RW_OPENGL +int32 u_blurcolor; +int32 u_contrastAdd; +int32 u_contrastMult; +rw::gl3::Shader *colourFilterIII; +rw::gl3::Shader *contrast; +#endif + +void +CPostFX::InitOnce(void) +{ +#ifdef RW_OPENGL + u_blurcolor = rw::gl3::registerUniform("u_blurcolor"); + u_contrastAdd = rw::gl3::registerUniform("u_contrastAdd"); + u_contrastMult = rw::gl3::registerUniform("u_contrastMult"); +#endif +} + +void +CPostFX::Open(RwCamera *cam) +{ + uint32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1); + uint32 height = Pow(2.0f, int32(log2(RwRasterGetHeight(RwCameraGetRaster(cam))))+1); + uint32 depth = RwRasterGetDepth(RwCameraGetRaster(cam)); + pFrontBuffer = RwRasterCreate(width, height, depth, rwRASTERTYPECAMERATEXTURE); + pBackBuffer = RwRasterCreate(width, height, depth, rwRASTERTYPECAMERATEXTURE); + bJustInitialised = true; + + float zero, xmax, ymax; + + if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){ + zero = HALFPX; + xmax = width + HALFPX; + ymax = height + HALFPX; + }else{ + zero = -HALFPX; + xmax = width - HALFPX; + ymax = height - HALFPX; + } + + RwIm2DVertexSetScreenX(&Vertex[0], zero); + RwIm2DVertexSetScreenY(&Vertex[0], zero); + RwIm2DVertexSetScreenZ(&Vertex[0], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[0], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[0], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex[1], zero); + RwIm2DVertexSetScreenY(&Vertex[1], ymax); + RwIm2DVertexSetScreenZ(&Vertex[1], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[1], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[1], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex[2], xmax); + RwIm2DVertexSetScreenY(&Vertex[2], ymax); + RwIm2DVertexSetScreenZ(&Vertex[2], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[2], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[2], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex[3], xmax); + RwIm2DVertexSetScreenY(&Vertex[3], zero); + RwIm2DVertexSetScreenZ(&Vertex[3], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex[3], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex[3], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255); + + + RwIm2DVertexSetScreenX(&Vertex2[0], zero + 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[0], zero + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[0], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[0], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[0], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[0], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex2[1], 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[1], ymax + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[1], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[1], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[1], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[1], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex2[2], xmax + 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[2], ymax + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[2], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[2], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[2], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[2], 255, 255, 255, 255); + + RwIm2DVertexSetScreenX(&Vertex2[3], xmax + 2.0f); + RwIm2DVertexSetScreenY(&Vertex2[3], zero + 2.0f); + RwIm2DVertexSetScreenZ(&Vertex2[3], RwIm2DGetNearScreenZ()); + RwIm2DVertexSetCameraZ(&Vertex2[3], RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetRecipCameraZ(&Vertex2[3], 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetU(&Vertex2[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetV(&Vertex2[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam)); + RwIm2DVertexSetIntRGBA(&Vertex2[3], 255, 255, 255, 255); + + +#ifdef RW_D3D9 +#include "shaders/colourfilterIII_PS.inc" + colourfilterIII_PS = rw::d3d::createPixelShader(colourfilterIII_PS_cso); +#include "shaders/contrastPS.inc" + contrast_PS = rw::d3d::createPixelShader(contrastPS_cso); +#endif +#ifdef RW_OPENGL + using namespace rw::gl3; + { +#ifdef RW_GLES2 +#include "gl2_shaders/im2d_gl2.inc" +#include "gl2_shaders/colourfilterIII_fs_gl2.inc" +#else +#include "shaders/im2d_gl3.inc" +#include "shaders/colourfilterIII_fs_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, colourfilterIII_frag_src, nil }; + colourFilterIII = Shader::create(vs, fs); + assert(colourFilterIII); + } + + { +#ifdef RW_GLES2 +#include "gl2_shaders/im2d_gl2.inc" +#include "gl2_shaders/contrast_fs_gl2.inc" +#else +#include "shaders/im2d_gl3.inc" +#include "shaders/contrast_fs_gl3.inc" + const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, contrast_frag_src, nil }; + contrast = Shader::create(vs, fs); + assert(contrast); +#endif + } + +#endif +} + +void +CPostFX::Close(void) +{ + if(pFrontBuffer){ + RwRasterDestroy(pFrontBuffer); + pFrontBuffer = nil; + } + if(pBackBuffer){ + RwRasterDestroy(pBackBuffer); + pBackBuffer = nil; + } +#ifdef RW_D3D9 + if(colourfilterIII_PS){ + rw::d3d::destroyPixelShader(colourfilterIII_PS); + colourfilterIII_PS = nil; + } + if(contrast_PS){ + rw::d3d::destroyPixelShader(contrast_PS); + contrast_PS = nil; + } +#endif +#ifdef RW_OPENGL + if(colourFilterIII){ + colourFilterIII->destroy(); + colourFilterIII = nil; + } + if(contrast){ + contrast->destroy(); + contrast = nil; + } +#endif +} + +void +CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + + RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a); + + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +} + +void +CPostFX::RenderOverlaySimple(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + + r *= 0.6f; + g *= 0.6f; + b *= 0.6f; + a *= 0.6f; + + RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a); + RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a); + + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +} + +void +CPostFX::RenderOverlaySniper(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + + RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, 80); + RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, 80); + RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, 80); + RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, 80); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +} + +float CPostFX::Intensity = 1.0f; + +void +CPostFX::RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a) +{ + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pBackBuffer); + + if(EffectSwitch == POSTFX_MOBILE){ + float mult[3], add[3]; + mult[0] = (r-64)/384.0f + 1.14f; + mult[1] = (g-64)/384.0f + 1.14f; + mult[2] = (b-64)/384.0f + 1.14f; + add[0] = r/1536.f; + add[1] = g/1536.f; + add[2] = b/1536.f; +#ifdef RW_D3D9 + rw::d3d::d3ddevice->SetPixelShaderConstantF(10, mult, 1); + rw::d3d::d3ddevice->SetPixelShaderConstantF(11, add, 1); + + rw::d3d::im2dOverridePS = contrast_PS; +#endif +#ifdef RW_OPENGL + rw::gl3::im2dOverrideShader = contrast; + contrast->use(); + glUniform3fv(contrast->uniformLocations[u_contrastMult], 1, mult); + glUniform3fv(contrast->uniformLocations[u_contrastAdd], 1, add); +#endif + }else{ + float f = Intensity; + float blurcolors[4]; + blurcolors[0] = r/255.0f; + blurcolors[1] = g/255.0f; + blurcolors[2] = b/255.0f; + blurcolors[3] = a*f/255.0f; +#ifdef RW_D3D9 + rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1); + rw::d3d::im2dOverridePS = colourfilterIII_PS; +#endif +#ifdef RW_OPENGL + rw::gl3::im2dOverrideShader = colourFilterIII; + colourFilterIII->use(); + glUniform4fv(colourFilterIII->uniformLocations[u_blurcolor], 1, blurcolors); +#endif + } + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +#ifdef RW_D3D9 + rw::d3d::im2dOverridePS = nil; +#endif +#ifdef RW_OPENGL + rw::gl3::im2dOverrideShader = nil; +#endif +} + +void +CPostFX::RenderMotionBlur(RwCamera *cam, uint32 blur) +{ + if(blur == 0) + return; + + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, blur); + RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, blur); + RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, blur); + RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, blur); + + RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6); +} + +bool +CPostFX::NeedBackBuffer(void) +{ + // Current frame -- needed for non-blur effect + switch(EffectSwitch){ + case POSTFX_OFF: + // no actual rendering here + return false; + case POSTFX_SIMPLE: + return false; + case POSTFX_NORMAL: + if(MotionBlurOn) + return false; + else + return true; + case POSTFX_MOBILE: + return true; + } + return false; +} + +bool +CPostFX::NeedFrontBuffer(int32 type) +{ + // Last frame -- needed for motion blur + if(MotionBlurOn) + return true; + if(type == MOTION_BLUR_SNIPER) + return true; + + return false; +} + +void +CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha) +{ + switch(type) + { + case MOTION_BLUR_SECURITY_CAM: + red = 0; + green = 255; + blue = 0; + blur = 128; + break; + case MOTION_BLUR_INTRO: + red = 100; + green = 220; + blue = 230; + blur = 158; + break; + case MOTION_BLUR_INTRO2: + red = 80; + green = 255; + blue = 230; + blur = 138; + break; + case MOTION_BLUR_INTRO3: + red = 255; + green = 60; + blue = 60; + blur = 200; + break; + case MOTION_BLUR_INTRO4: + red = 255; + green = 180; + blue = 180; + blur = 128; + break; + } + + if(pFrontBuffer == nil) + Open(cam); + assert(pFrontBuffer); + assert(pBackBuffer); + + if(NeedBackBuffer()){ + RwRasterPushContext(pBackBuffer); + RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0); + RwRasterPopContext(); + } + + DefinedState(); + + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST); + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); + + if(type == MOTION_BLUR_SNIPER){ + if(!bJustInitialised) + RenderOverlaySniper(cam, red, green, blue, blur); + }else switch(EffectSwitch){ + case POSTFX_OFF: + // no actual rendering here + break; + case POSTFX_SIMPLE: + RenderOverlaySimple(cam, red, green, blue, blur); + break; + case POSTFX_NORMAL: + if(MotionBlurOn){ + if(!bJustInitialised) + RenderOverlayBlur(cam, red, green, blue, blur); + }else{ + RenderOverlayShader(cam, red, green, blue, blur); + } + break; + case POSTFX_MOBILE: + RenderOverlayShader(cam, red, green, blue, blur); + break; + } + + // TODO? maybe we want this even without motion blur on sometimes? + if(MotionBlurOn) + if(!bJustInitialised) + RenderMotionBlur(cam, bluralpha); + + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + + if(NeedFrontBuffer(type)){ + RwRasterPushContext(pFrontBuffer); + RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0); + RwRasterPopContext(); + bJustInitialised = false; + }else + bJustInitialised = true; +} + +#endif diff --git a/src/extras/postfx.h b/src/extras/postfx.h new file mode 100644 index 00000000..658c2d88 --- /dev/null +++ b/src/extras/postfx.h @@ -0,0 +1,35 @@ +#pragma once + +#ifdef EXTENDED_COLOURFILTER + +class CPostFX +{ +public: + enum { + POSTFX_OFF, + POSTFX_SIMPLE, + POSTFX_NORMAL, + POSTFX_MOBILE + }; + static RwRaster *pFrontBuffer; + static RwRaster *pBackBuffer; + static bool bJustInitialised; + static int EffectSwitch; + static bool MotionBlurOn; // or use CMblur for that? + static float Intensity; + + static void InitOnce(void); + static void Open(RwCamera *cam); + static void Close(void); + static void RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderOverlaySimple(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderOverlaySniper(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a); + static void RenderMotionBlur(RwCamera *cam, uint32 blur); + static void Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha); + static bool NeedBackBuffer(void); + static bool NeedFrontBuffer(int32 type); + static bool UseBlurColours(void) { return EffectSwitch != POSTFX_SIMPLE; } +}; + +#endif diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile new file mode 100644 index 00000000..87be011e --- /dev/null +++ b/src/extras/shaders/Makefile @@ -0,0 +1,16 @@ +all: im2d_gl3.inc colourfilterIII_fs_gl3.inc contrast_fs_gl3.inc + +im2d_gl3.inc: im2d.vert + (echo 'const char *im2d_vert_src =';\ + sed 's/..*/"&\\n"/' im2d.vert;\ + echo ';') >im2d_gl3.inc + +colourfilterIII_fs_gl3.inc: colourfilterIII.frag + (echo 'const char *colourfilterIII_frag_src =';\ + sed 's/..*/"&\\n"/' colourfilterIII.frag;\ + echo ';') >colourfilterIII_fs_gl3.inc + +contrast_fs_gl3.inc: contrast.frag + (echo 'const char *contrast_frag_src =';\ + sed 's/..*/"&\\n"/' contrast.frag;\ + echo ';') >contrast_fs_gl3.inc diff --git a/src/extras/shaders/colourfilterIII.frag b/src/extras/shaders/colourfilterIII.frag new file mode 100644 index 00000000..e19a8600 --- /dev/null +++ b/src/extras/shaders/colourfilterIII.frag @@ -0,0 +1,28 @@ +uniform sampler2D tex0; +uniform vec4 u_blurcolor; + +in vec4 v_color; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + float a = u_blurcolor.a; + + vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); + vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec4 prev = dst; + for(int i = 0; i < 5; i++){ +// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); + vec4 tmp = dst*(1.0-a) + prev*doublec*a; + tmp += prev*u_blurcolor; + tmp += prev*u_blurcolor; + prev = clamp(tmp, 0.0, 1.0); + } + color.rgb = prev.rgb; + color.a = 1.0f; +} + diff --git a/src/extras/shaders/colourfilterIII_PS.cso b/src/extras/shaders/colourfilterIII_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..cc41bcecdbe4f6ba923ce659c433607b86209dd8 GIT binary patch literal 452 zcmd5&&1%9x7@TaB1}Ox3@lt4x{y=CV9&(bZ2M_Vk>QT_v9}J`=cj&ha^UdtH%j`lZbx~c6=5NDi0KWw236j<@fRr>Q1R9hbgxY5<2$L|lvm)#I zihr_o64Nt@8gZ+`_DJnN8JB?yC zf$Ilu(D&V*=XrPs>VPeQVsO8zq8A;JCR3g7{Rx&WhgD3QetCvfN**>1JZN1sP|7Eu hCeUQBq(M*ne>38r%<#{IfW>TJM!wUs3!P0V;0j=6S9$;d literal 0 HcmV?d00001 diff --git a/src/extras/shaders/colourfilterIII_PS.hlsl b/src/extras/shaders/colourfilterIII_PS.hlsl new file mode 100644 index 00000000..27f099ef --- /dev/null +++ b/src/extras/shaders/colourfilterIII_PS.hlsl @@ -0,0 +1,15 @@ +sampler2D tex : register(s0); +float4 blurcol : register(c10); + +float4 main(in float2 texcoord : TEXCOORD0) : COLOR0 +{ + float a = blurcol.a; + float4 dst = tex2D(tex, texcoord.xy); + float4 prev = dst; + for(int i = 0; i < 5; i++){ + float4 tmp = dst*(1-a) + prev*blurcol*a; + prev = saturate(tmp); + } + prev.a = 1.0f; + return prev; +} diff --git a/src/extras/shaders/colourfilterIII_PS.inc b/src/extras/shaders/colourfilterIII_PS.inc new file mode 100644 index 00000000..db49de6c --- /dev/null +++ b/src/extras/shaders/colourfilterIII_PS.inc @@ -0,0 +1,40 @@ +static unsigned char colourfilterIII_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x2b, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x00, + 0x01, 0x00, 0x2a, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6c, 0x75, 0x72, + 0x63, 0x6f, 0x6c, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, + 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, + 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, + 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xb0, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, + 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, + 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/colourfilterIII_fs_gl3.inc b/src/extras/shaders/colourfilterIII_fs_gl3.inc new file mode 100644 index 00000000..f57b9cdd --- /dev/null +++ b/src/extras/shaders/colourfilterIII_fs_gl3.inc @@ -0,0 +1,30 @@ +const char *colourfilterIII_frag_src = +"uniform sampler2D tex0;\n" +"uniform vec4 u_blurcolor;\n" + +"in vec4 v_color;\n" +"in vec2 v_tex0;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" float a = u_blurcolor.a;\n" + +" vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n" +" vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" vec4 prev = dst;\n" +" for(int i = 0; i < 5; i++){\n" +"// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n" +" vec4 tmp = dst*(1.0-a) + prev*doublec*a;\n" +" tmp += prev*u_blurcolor;\n" +" tmp += prev*u_blurcolor;\n" +" prev = clamp(tmp, 0.0, 1.0);\n" +" }\n" +" color.rgb = prev.rgb;\n" +" color.a = 1.0f;\n" +"}\n" + +; diff --git a/src/extras/shaders/contrast.frag b/src/extras/shaders/contrast.frag new file mode 100644 index 00000000..d6dec478 --- /dev/null +++ b/src/extras/shaders/contrast.frag @@ -0,0 +1,18 @@ +uniform sampler2D tex0; +uniform vec3 u_contrastAdd; +uniform vec3 u_contrastMult; + +in vec4 v_color; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + color.rgb = dst.rgb*u_contrastMult + u_contrastAdd; + color.a = 1.0f; +} + diff --git a/src/extras/shaders/contrastPS.cso b/src/extras/shaders/contrastPS.cso new file mode 100644 index 0000000000000000000000000000000000000000..a87c48d787046a393b0093c906f6d0714d199153 GIT binary patch literal 344 zcmY+8F^j@L5QSf&Vo)J}K)958MKBSIREOGFXyIvborqBs)JU=ima)6?%Ii#@#vhg6 z;ojRA1ZVd#v)|j<9q3ZtWe>x7f6xSQr9f64eD4Ls`iwM9%V_Y9T8}tI3wP1MWVZ@~DA)+A_1U&Y zQjAH`F7dQ)Q)a?)E-|H3enK|Z=k lp50(%3IEqMRO1@5qzrIZl^1JNolN Date: Thu, 13 Aug 2020 18:47:39 +0200 Subject: [PATCH 045/112] fixes to HUD and sprite2d --- src/render/Hud.cpp | 56 +++++----- src/render/Sprite2d.cpp | 234 +++++++++++++++++----------------------- src/render/Sprite2d.h | 3 +- 3 files changed, 133 insertions(+), 160 deletions(-) diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index 10408355..cbf3c7f2 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -205,7 +205,8 @@ void CHud::Draw() rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.6f); rect.bottom = f3rdY + SCREEN_SCALE_Y(32.0f * 0.6f); - Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); } else { rect.left = f3rdX - SCREEN_SCALE_X(32.0f * 0.4f); @@ -213,7 +214,8 @@ void CHud::Draw() rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.4f); rect.bottom = f3rdY + SCREEN_SCALE_Y(32.0f * 0.4f); - Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); } } else { if (Mode == CCam::MODE_M16_1STPERSON || @@ -223,7 +225,8 @@ void CHud::Draw() rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(32.0f); rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f); rect.bottom = (SCREEN_HEIGHT / 2) + SCREEN_SCALE_Y(32.0f); - Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); } else if (Mode == CCam::MODE_1STPERSON_RUNABOUT) { rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(32.0f * 0.7f); @@ -231,7 +234,8 @@ void CHud::Draw() rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f * 0.7f); rect.bottom = (SCREEN_HEIGHT / 2) + SCREEN_SCALE_Y(32.0f * 0.7f); - Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); } else if (Mode == CCam::MODE_ROCKETLAUNCHER || Mode == CCam::MODE_ROCKETLAUNCHER_RUNABOUT) { RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE); @@ -248,29 +252,33 @@ void CHud::Draw() // TODO(Miami) // Sniper - rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(210.0f); - rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f); - rect.right = SCREEN_WIDTH / 2; - rect.bottom = SCREEN_HEIGHT / 2; - Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + rect.left = SCREEN_WIDTH/2 - SCREEN_SCALE_X(210.0f); + rect.top = SCREEN_HEIGHT/2 - SCREEN_SCALE_Y(210.0f); + rect.right = SCREEN_WIDTH/2; + rect.bottom = SCREEN_HEIGHT/2; + Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.01f, 0.01f, 1.0f, 0.0f, 0.01f, 1.0f, 1.0f, 1.0f); - rect.right = (SCREEN_WIDTH / 2); - rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f); - rect.left = SCREEN_SCALE_X(210.0f) + (SCREEN_WIDTH / 2); - rect.bottom = SCREEN_HEIGHT / 2; - Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + rect.left = SCREEN_WIDTH/2; + rect.top = SCREEN_HEIGHT/2 - SCREEN_SCALE_Y(210.0f); + rect.right = SCREEN_WIDTH/2 + SCREEN_SCALE_X(210.0f); + rect.bottom = SCREEN_HEIGHT/2; + Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.99f, 0.0f, 0.01f, 0.01f, 0.99f, 1.0f, 0.01f, 1.0f); - rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(210.0f); - rect.bottom = (SCREEN_HEIGHT / 2); - rect.right = (SCREEN_WIDTH / 2); - rect.top = SCREEN_SCALE_Y(210.0f) + (SCREEN_HEIGHT / 2); - Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + rect.left = SCREEN_WIDTH/2 - SCREEN_SCALE_X(210.0f); + rect.top = SCREEN_HEIGHT/2; + rect.right = SCREEN_WIDTH/2; + rect.bottom = SCREEN_HEIGHT/2 + SCREEN_SCALE_Y(210.0f); + Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.01f, 0.99f, 1.0f, 0.99f, 0.01f, 0.01f, 1.0f, 0.01f); - rect.right = (SCREEN_WIDTH / 2); - rect.bottom = (SCREEN_HEIGHT / 2); - rect.left = SCREEN_SCALE_X(210.0f) + (SCREEN_WIDTH / 2); - rect.top = SCREEN_SCALE_Y(210.0f) + (SCREEN_HEIGHT / 2); - Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255)); + rect.left = SCREEN_WIDTH/2; + rect.top = SCREEN_HEIGHT/2; + rect.right = SCREEN_WIDTH/2 + SCREEN_SCALE_X(210.0f); + rect.bottom = SCREEN_HEIGHT/2 + SCREEN_SCALE_Y(210.0f); + Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255), + 0.99f, 0.99f, 0.01f, 0.99f, 0.99f, 0.01f, 0.1f, 0.01f); } } RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA); diff --git a/src/render/Sprite2d.cpp b/src/render/Sprite2d.cpp index cba64e7a..7dcedb26 100644 --- a/src/render/Sprite2d.cpp +++ b/src/render/Sprite2d.cpp @@ -9,6 +9,7 @@ float CSprite2d::RecipNearClip; float CSprite2d::NearScreenZ; +float CSprite2d::NearCamZ; int CSprite2d::nextBufferVertex; int CSprite2d::nextBufferIndex; RwIm2DVertex CSprite2d::maVertices[8]; @@ -26,6 +27,9 @@ CSprite2d::InitPerFrame(void) nextBufferIndex = 0; RecipNearClip = 1.0f / RwCameraGetNearClipPlane(Scene.camera); NearScreenZ = RwIm2DGetNearScreenZ(); + // not original but you're supposed to set camera z too + // wrapping all this in FIX_BUGS is too ugly + NearCamZ = RwCameraGetNearClipPlane(Scene.camera); } void CSprite2d::Delete(void) @@ -71,7 +75,7 @@ CSprite2d::SetRenderState(void) void CSprite2d::Draw(float x, float y, float w, float h, const CRGBA &col) { - SetVertices(CRect(x, y, x + w, y + h), col, col, col, col, 0); + SetVertices(CRect(x, y, x + w, y + h), col, col, col, col); SetRenderState(); RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4); } @@ -79,7 +83,7 @@ CSprite2d::Draw(float x, float y, float w, float h, const CRGBA &col) void CSprite2d::Draw(const CRect &rect, const CRGBA &col) { - SetVertices(rect, col, col, col, col, 0); + SetVertices(rect, col, col, col, col); SetRenderState(); RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4); } @@ -96,7 +100,7 @@ CSprite2d::Draw(const CRect &rect, const CRGBA &col, void CSprite2d::Draw(const CRect &rect, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3) { - SetVertices(rect, c0, c1, c2, c3, 0); + SetVertices(rect, c0, c1, c2, c3); SetRenderState(); RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4); } @@ -114,178 +118,149 @@ CSprite2d::Draw(float x1, float y1, float x2, float y2, float x3, float y3, floa // | | // 0---1 void -CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, uint32 far) +CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3) { - float screenz, z, recipz; - - if(far){ - screenz = RwIm2DGetFarScreenZ(); - z = RwCameraGetFarClipPlane(Scene.camera); - }else{ - screenz = NearScreenZ; - z = 1.0f/RecipNearClip; - } - recipz = 1.0f/z; - // This is what we draw: // 0---1 // | / | // 3---2 RwIm2DVertexSetScreenX(&maVertices[0], r.left); RwIm2DVertexSetScreenY(&maVertices[0], r.top); - RwIm2DVertexSetScreenZ(&maVertices[0], screenz); - RwIm2DVertexSetCameraZ(&maVertices[0], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz); + RwIm2DVertexSetScreenZ(&maVertices[0], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a); - RwIm2DVertexSetU(&maVertices[0], 0.0f, recipz); - RwIm2DVertexSetV(&maVertices[0], 0.0f, recipz); + RwIm2DVertexSetU(&maVertices[0], 0.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[0], 0.0f, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[1], r.right); RwIm2DVertexSetScreenY(&maVertices[1], r.top); - RwIm2DVertexSetScreenZ(&maVertices[1], screenz); - RwIm2DVertexSetCameraZ(&maVertices[1], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz); + RwIm2DVertexSetScreenZ(&maVertices[1], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a); - RwIm2DVertexSetU(&maVertices[1], 1.0f, recipz); - RwIm2DVertexSetV(&maVertices[1], 0.0f, recipz); + RwIm2DVertexSetU(&maVertices[1], 1.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[1], 0.0f, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[2], r.right); RwIm2DVertexSetScreenY(&maVertices[2], r.bottom); - RwIm2DVertexSetScreenZ(&maVertices[2], screenz); - RwIm2DVertexSetCameraZ(&maVertices[2], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz); + RwIm2DVertexSetScreenZ(&maVertices[2], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a); - RwIm2DVertexSetU(&maVertices[2], 1.0f, recipz); - RwIm2DVertexSetV(&maVertices[2], 1.0f, recipz); + RwIm2DVertexSetU(&maVertices[2], 1.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[2], 1.0f, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[3], r.left); RwIm2DVertexSetScreenY(&maVertices[3], r.bottom); - RwIm2DVertexSetScreenZ(&maVertices[3], screenz); - RwIm2DVertexSetCameraZ(&maVertices[3], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz); + RwIm2DVertexSetScreenZ(&maVertices[3], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a); - RwIm2DVertexSetU(&maVertices[3], 0.0f, recipz); - RwIm2DVertexSetV(&maVertices[3], 1.0f, recipz); + RwIm2DVertexSetU(&maVertices[3], 0.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[3], 1.0f, RecipNearClip); } void CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, float u0, float v0, float u1, float v1, float u3, float v3, float u2, float v2) { - float screenz, z, recipz; - - screenz = NearScreenZ; - z = 1.0f/RecipNearClip; - recipz = 1.0f/z; - // This is what we draw: // 0---1 // | / | // 3---2 RwIm2DVertexSetScreenX(&maVertices[0], r.left); RwIm2DVertexSetScreenY(&maVertices[0], r.top); - RwIm2DVertexSetScreenZ(&maVertices[0], screenz); - RwIm2DVertexSetCameraZ(&maVertices[0], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz); + RwIm2DVertexSetScreenZ(&maVertices[0], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a); - RwIm2DVertexSetU(&maVertices[0], u0, recipz); - RwIm2DVertexSetV(&maVertices[0], v0, recipz); + RwIm2DVertexSetU(&maVertices[0], u0, RecipNearClip); + RwIm2DVertexSetV(&maVertices[0], v0, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[1], r.right); RwIm2DVertexSetScreenY(&maVertices[1], r.top); - RwIm2DVertexSetScreenZ(&maVertices[1], screenz); - RwIm2DVertexSetCameraZ(&maVertices[1], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz); + RwIm2DVertexSetScreenZ(&maVertices[1], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a); - RwIm2DVertexSetU(&maVertices[1], u1, recipz); - RwIm2DVertexSetV(&maVertices[1], v1, recipz); + RwIm2DVertexSetU(&maVertices[1], u1, RecipNearClip); + RwIm2DVertexSetV(&maVertices[1], v1, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[2], r.right); RwIm2DVertexSetScreenY(&maVertices[2], r.bottom); - RwIm2DVertexSetScreenZ(&maVertices[2], screenz); - RwIm2DVertexSetCameraZ(&maVertices[2], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz); + RwIm2DVertexSetScreenZ(&maVertices[2], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a); - RwIm2DVertexSetU(&maVertices[2], u2, recipz); - RwIm2DVertexSetV(&maVertices[2], v2, recipz); + RwIm2DVertexSetU(&maVertices[2], u2, RecipNearClip); + RwIm2DVertexSetV(&maVertices[2], v2, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[3], r.left); RwIm2DVertexSetScreenY(&maVertices[3], r.bottom); - RwIm2DVertexSetScreenZ(&maVertices[3], screenz); - RwIm2DVertexSetCameraZ(&maVertices[3], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz); + RwIm2DVertexSetScreenZ(&maVertices[3], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a); - RwIm2DVertexSetU(&maVertices[3], u3, recipz); - RwIm2DVertexSetV(&maVertices[3], v3, recipz); + RwIm2DVertexSetU(&maVertices[3], u3, RecipNearClip); + RwIm2DVertexSetV(&maVertices[3], v3, RecipNearClip); } void CSprite2d::SetVertices(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3) { - float screenz, recipz; - float z = RwCameraGetNearClipPlane(Scene.camera); // not done by game - - screenz = NearScreenZ; - recipz = RecipNearClip; - RwIm2DVertexSetScreenX(&maVertices[0], x3); RwIm2DVertexSetScreenY(&maVertices[0], y3); - RwIm2DVertexSetScreenZ(&maVertices[0], screenz); - RwIm2DVertexSetCameraZ(&maVertices[0], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz); + RwIm2DVertexSetScreenZ(&maVertices[0], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a); - RwIm2DVertexSetU(&maVertices[0], 0.0f, recipz); - RwIm2DVertexSetV(&maVertices[0], 0.0f, recipz); + RwIm2DVertexSetU(&maVertices[0], 0.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[0], 0.0f, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[1], x4); RwIm2DVertexSetScreenY(&maVertices[1], y4); - RwIm2DVertexSetScreenZ(&maVertices[1], screenz); - RwIm2DVertexSetCameraZ(&maVertices[1], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz); + RwIm2DVertexSetScreenZ(&maVertices[1], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a); - RwIm2DVertexSetU(&maVertices[1], 1.0f, recipz); - RwIm2DVertexSetV(&maVertices[1], 0.0f, recipz); + RwIm2DVertexSetU(&maVertices[1], 1.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[1], 0.0f, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[2], x2); RwIm2DVertexSetScreenY(&maVertices[2], y2); - RwIm2DVertexSetScreenZ(&maVertices[2], screenz); - RwIm2DVertexSetCameraZ(&maVertices[2], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz); + RwIm2DVertexSetScreenZ(&maVertices[2], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a); - RwIm2DVertexSetU(&maVertices[2], 1.0f, recipz); - RwIm2DVertexSetV(&maVertices[2], 1.0f, recipz); + RwIm2DVertexSetU(&maVertices[2], 1.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[2], 1.0f, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[3], x1); RwIm2DVertexSetScreenY(&maVertices[3], y1); - RwIm2DVertexSetScreenZ(&maVertices[3], screenz); - RwIm2DVertexSetCameraZ(&maVertices[3], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz); + RwIm2DVertexSetScreenZ(&maVertices[3], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a); - RwIm2DVertexSetU(&maVertices[3], 0.0f, recipz); - RwIm2DVertexSetV(&maVertices[3], 1.0f, recipz); + RwIm2DVertexSetU(&maVertices[3], 0.0f, RecipNearClip); + RwIm2DVertexSetV(&maVertices[3], 1.0f, RecipNearClip); } void CSprite2d::SetVertices(int n, float *positions, float *uvs, const CRGBA &col) { int i; - float screenz, recipz, z; - - screenz = NearScreenZ; - recipz = RecipNearClip; - z = RwCameraGetNearClipPlane(Scene.camera); // not done by game - for(i = 0; i < n; i++){ RwIm2DVertexSetScreenX(&maVertices[i], positions[i*2 + 0]); RwIm2DVertexSetScreenY(&maVertices[i], positions[i*2 + 1]); - RwIm2DVertexSetScreenZ(&maVertices[i], screenz + 0.0001f); - RwIm2DVertexSetCameraZ(&maVertices[i], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[i], recipz); + RwIm2DVertexSetScreenZ(&maVertices[i], NearScreenZ + 0.0001f); + RwIm2DVertexSetCameraZ(&maVertices[i], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[i], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[i], col.r, col.g, col.b, col.a); - RwIm2DVertexSetU(&maVertices[i], uvs[i*2 + 0], recipz); - RwIm2DVertexSetV(&maVertices[i], uvs[i*2 + 1], recipz); + RwIm2DVertexSetU(&maVertices[i], uvs[i*2 + 0], RecipNearClip); + RwIm2DVertexSetV(&maVertices[i], uvs[i*2 + 1], RecipNearClip); } } @@ -293,18 +268,13 @@ void CSprite2d::SetMaskVertices(int n, float *positions) { int i; - float screenz, recipz, z; - - screenz = NearScreenZ; - recipz = RecipNearClip; - z = RwCameraGetNearClipPlane(Scene.camera); // not done by game for(i = 0; i < n; i++){ RwIm2DVertexSetScreenX(&maVertices[i], positions[i*2 + 0]); RwIm2DVertexSetScreenY(&maVertices[i], positions[i*2 + 1]); - RwIm2DVertexSetScreenZ(&maVertices[i], screenz); - RwIm2DVertexSetCameraZ(&maVertices[i], z); - RwIm2DVertexSetRecipCameraZ(&maVertices[i], recipz); + RwIm2DVertexSetScreenZ(&maVertices[i], NearScreenZ); + RwIm2DVertexSetCameraZ(&maVertices[i], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&maVertices[i], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[i], 255, 255, 255, 255); // 0, 0, 0, 0 on PC } } @@ -313,53 +283,47 @@ void CSprite2d::SetVertices(RwIm2DVertex *verts, const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, float u0, float v0, float u1, float v1, float u3, float v3, float u2, float v2) { - float screenz, recipz, z; - - screenz = NearScreenZ; - recipz = RecipNearClip; - z = RwCameraGetNearClipPlane(Scene.camera); // not done by game - RwIm2DVertexSetScreenX(&verts[0], r.left); RwIm2DVertexSetScreenY(&verts[0], r.top); - RwIm2DVertexSetScreenZ(&verts[0], screenz); - RwIm2DVertexSetCameraZ(&verts[0], z); - RwIm2DVertexSetRecipCameraZ(&verts[0], recipz); + RwIm2DVertexSetScreenZ(&verts[0], NearScreenZ); + RwIm2DVertexSetCameraZ(&verts[0], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&verts[0], RecipNearClip); RwIm2DVertexSetIntRGBA(&verts[0], c2.r, c2.g, c2.b, c2.a); - RwIm2DVertexSetU(&verts[0], u0, recipz); - RwIm2DVertexSetV(&verts[0], v0, recipz); + RwIm2DVertexSetU(&verts[0], u0, RecipNearClip); + RwIm2DVertexSetV(&verts[0], v0, RecipNearClip); RwIm2DVertexSetScreenX(&verts[1], r.right); RwIm2DVertexSetScreenY(&verts[1], r.top); - RwIm2DVertexSetScreenZ(&verts[1], screenz); - RwIm2DVertexSetCameraZ(&verts[1], z); - RwIm2DVertexSetRecipCameraZ(&verts[1], recipz); + RwIm2DVertexSetScreenZ(&verts[1], NearScreenZ); + RwIm2DVertexSetCameraZ(&verts[1], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&verts[1], RecipNearClip); RwIm2DVertexSetIntRGBA(&verts[1], c3.r, c3.g, c3.b, c3.a); - RwIm2DVertexSetU(&verts[1], u1, recipz); - RwIm2DVertexSetV(&verts[1], v1, recipz); + RwIm2DVertexSetU(&verts[1], u1, RecipNearClip); + RwIm2DVertexSetV(&verts[1], v1, RecipNearClip); RwIm2DVertexSetScreenX(&verts[2], r.right); RwIm2DVertexSetScreenY(&verts[2], r.bottom); - RwIm2DVertexSetScreenZ(&verts[2], screenz); - RwIm2DVertexSetCameraZ(&verts[2], z); - RwIm2DVertexSetRecipCameraZ(&verts[2], recipz); + RwIm2DVertexSetScreenZ(&verts[2], NearScreenZ); + RwIm2DVertexSetCameraZ(&verts[2], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&verts[2], RecipNearClip); RwIm2DVertexSetIntRGBA(&verts[2], c1.r, c1.g, c1.b, c1.a); - RwIm2DVertexSetU(&verts[2], u2, recipz); - RwIm2DVertexSetV(&verts[2], v2, recipz); + RwIm2DVertexSetU(&verts[2], u2, RecipNearClip); + RwIm2DVertexSetV(&verts[2], v2, RecipNearClip); RwIm2DVertexSetScreenX(&verts[3], r.left); RwIm2DVertexSetScreenY(&verts[3], r.bottom); - RwIm2DVertexSetScreenZ(&verts[3], screenz); - RwIm2DVertexSetCameraZ(&verts[3], z); - RwIm2DVertexSetRecipCameraZ(&verts[3], recipz); + RwIm2DVertexSetScreenZ(&verts[3], NearScreenZ); + RwIm2DVertexSetCameraZ(&verts[3], NearCamZ); + RwIm2DVertexSetRecipCameraZ(&verts[3], RecipNearClip); RwIm2DVertexSetIntRGBA(&verts[3], c0.r, c0.g, c0.b, c0.a); - RwIm2DVertexSetU(&verts[3], u3, recipz); - RwIm2DVertexSetV(&verts[3], v3, recipz); + RwIm2DVertexSetU(&verts[3], u3, RecipNearClip); + RwIm2DVertexSetV(&verts[3], v3, RecipNearClip); } void CSprite2d::DrawRect(const CRect &r, const CRGBA &col) { - SetVertices(r, col, col, col, col, false); + SetVertices(r, col, col, col, col); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); RwRenderStateSet(rwRENDERSTATESHADEMODE, (void*)rwSHADEMODEFLAT); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); @@ -374,7 +338,7 @@ CSprite2d::DrawRect(const CRect &r, const CRGBA &col) void CSprite2d::DrawRect(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3) { - SetVertices(r, c0, c1, c2, c3, false); + SetVertices(r, c0, c1, c2, c3); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); @@ -387,7 +351,7 @@ CSprite2d::DrawRect(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGB void CSprite2d::DrawRectXLU(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3) { - SetVertices(r, c0, c1, c2, c3, false); + SetVertices(r, c0, c1, c2, c3); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); diff --git a/src/render/Sprite2d.h b/src/render/Sprite2d.h index 1adb5d49..5abd8d71 100644 --- a/src/render/Sprite2d.h +++ b/src/render/Sprite2d.h @@ -4,6 +4,7 @@ class CSprite2d { static float RecipNearClip; static float NearScreenZ; + static float NearCamZ; // not original static int nextBufferVertex; static int nextBufferIndex; static RwIm2DVertex maVertices[8]; @@ -27,7 +28,7 @@ public: void Draw(const CRect &rect, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3); void Draw(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, const CRGBA &col); - static void SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, uint32 far); + static void SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3); static void SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, float u0, float v0, float u1, float v1, float u3, float v3, float u2, float v2); static void SetVertices(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, From b54bb62c944f8f3e8d85501fbb762915fdc6569b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Thu, 13 Aug 2020 23:39:55 +0300 Subject: [PATCH 046/112] Stats(except displaying), PlayerInfo, marker fix --- src/audio/AudioLogic.cpp | 1 - src/audio/audio_enums.h | 3 +- src/control/GameLogic.cpp | 6 +- src/control/Script.cpp | 40 +-- src/core/Cam.cpp | 22 +- src/core/Frontend.cpp | 46 ++- src/core/Frontend_PS2.cpp | 27 +- src/core/Pad.cpp | 22 +- src/core/Pad.h | 1 + src/core/PlayerInfo.cpp | 365 +++++++++++++++++---- src/core/PlayerInfo.h | 25 +- src/core/Radar.h | 2 +- src/core/Stats.cpp | 539 ++++++++++++++++++++++++-------- src/core/Stats.h | 80 +++-- src/core/Wanted.cpp | 13 +- src/core/re3.cpp | 2 +- src/peds/Ped.cpp | 6 +- src/render/SpecialFX.cpp | 40 ++- src/render/SpecialFX.h | 1 + src/render/Timecycle.cpp | 2 +- src/render/Timecycle.h | 2 +- src/save/GenericGameStorage.cpp | 19 +- src/skel/glfw/glfw.cpp | 2 +- src/weapons/BulletInfo.cpp | 2 +- src/weapons/Weapon.cpp | 15 +- 25 files changed, 952 insertions(+), 331 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index b814d58c..98ebf0d8 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2756,7 +2756,6 @@ cAudioManager::ProcessPlane(cVehicleParams *params) ProcessCesna(params); break; default: - debug("Plane Model Id is %d\n, ", params->m_pVehicle->GetModelIndex()); break; } } diff --git a/src/audio/audio_enums.h b/src/audio/audio_enums.h index 1f13521b..375c4a70 100644 --- a/src/audio/audio_enums.h +++ b/src/audio/audio_enums.h @@ -12,7 +12,8 @@ enum eRadioStation EMOTION, WAVE, USERTRACK, - POLICE_RADIO, + NUM_RADIOS = 10, + POLICE_RADIO = 10, //TAXI_RADIO, RADIO_OFF, }; diff --git a/src/control/GameLogic.cpp b/src/control/GameLogic.cpp index 2af9464c..f4e4fdd4 100644 --- a/src/control/GameLogic.cpp +++ b/src/control/GameLogic.cpp @@ -28,6 +28,7 @@ #include "Particle.h" #include "ColStore.h" #include "Automobile.h" +#include "MBlur.h" uint8 CGameLogic::ActivePlayers; uint8 CGameLogic::ShortCutState; @@ -343,7 +344,10 @@ CGameLogic::RestorePlayerStuffDuringResurrection(CPlayerPed *pPlayerPed, CVector pPlayerPed->bIsVisible = true; pPlayerPed->m_bloodyFootprintCountOrDeathTime = 0; pPlayerPed->bDoBloodyFootprints = false; - //TODO(MIAMI): clear drunk stuff + pPlayerPed->m_nDrunkenness = 0; + pPlayerPed->m_nFadeDrunkenness = 0; + CMBlur::ClearDrunkBlur(); + pPlayerPed->m_nDrunkCountdown = 0; pPlayerPed->ClearAdrenaline(); pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina; if (pPlayerPed->m_pFire) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 9508677b..69b8ee4f 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -1806,7 +1806,7 @@ void CMissionCleanup::Process() // TODO(MIAMI) //CSpecialFX::bLiftCam = false; //CSpecialFX::bVideoCam = false; - //CTimeCycle::StopExtraColour(0); + CTimeCycle::StopExtraColour(0); for (int i = 0; i < MISSION_AUDIO_SLOTS; i++) DMAudio.ClearMissionAudio(i); CWeather::ReleaseWeather(); @@ -1822,8 +1822,11 @@ void CMissionCleanup::Process() CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByCops = false; CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByEveryone = false; CWorld::Players[0].MakePlayerSafe(false); - //TODO(MIAMI): drunkenness, enable drive by - //DMAudio::ShutUpPlayerTalking(0); + CWorld::Players[0].m_pPed->m_nFadeDrunkenness = 1; + CWorld::Players[0].m_pPed->m_nDrunkCountdown = 0; + // CPad::GetPad(0)->SetDrunkInputDelay(0); // TODO(Miami) + CWorld::Players[0].m_bDriveByAllowed = true; + // DMAudio::ShutUpPlayerTalking(0); // TODO(Miami) CVehicle::bDisableRemoteDetonation = false; CVehicle::bDisableRemoteDetonationOnContact = false; CGameLogic::ClearShortCut(); @@ -5353,7 +5356,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetCoordBlip(BLIP_COORD, pos, 2, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetCoordBlip(BLIP_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); ScriptParams[0] = handle; StoreParameters(&m_nIp, 1); @@ -9792,7 +9795,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) CVector pos = *(CVector*)&ScriptParams[0]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - C3dMarkers::PlaceMarkerSet((uintptr)this + m_nIp, 4, pos, *(float*)&ScriptParams[3], + C3dMarkers::PlaceMarkerSet((uintptr)this + m_nIp, MARKERTYPE_CYLINDER, pos, *(float*)&ScriptParams[3], SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, SPHERE_MARKER_A, SPHERE_MARKER_PULSE_PERIOD, SPHERE_MARKER_PULSE_FRACTION, 0); return 0; @@ -13008,11 +13011,11 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) //case COMMAND_IS_MISSION_AUDIO_LOADING: case COMMAND_ADD_MONEY_SPENT_ON_WEAPONS: CollectParameters(&m_nIp, 1); - debug("ADD_MONEY_SPENT_ON_WEAPON not implemented\n"); // TODO(MIAMI) + CStats::MoneySpentOnWeapons(ScriptParams[0]); return 0; case COMMAND_ADD_MONEY_SPENT_ON_PROPERTY: CollectParameters(&m_nIp, 1); - debug("ADD_MONEY_SPENT_ON_PROPERTY not implemented\n"); // TODO(MIAMI) + CStats::MoneySpentOnProperty(ScriptParams[0]); return 0; //case COMMAND_ADD_MONEY_SPENT_ON_AUTO_PAINTING: case COMMAND_SET_CHAR_ANSWERING_MOBILE: @@ -13041,21 +13044,21 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) //case COMMAND_ADD_LOAN_SHARK_VISITS: case COMMAND_ADD_STORES_KNOCKED_OFF: CollectParameters(&m_nIp, 1); - debug("ADD_STORES_KNOCKED_OFF not implemented\n"); // TODO(MIAMI) + CStats::NumOfStoresKnockedOff(ScriptParams[0]); return 0; //case COMMAND_ADD_MOVIE_STUNTS: case COMMAND_ADD_NUMBER_OF_ASSASSINATIONS: CollectParameters(&m_nIp, 1); - debug("ADD_NUMBER_OF_ASSASSINATIONS not implemented\n"); // TODO(MIAMI) + CStats::NumOfAssassinations(ScriptParams[0]); return 0; case COMMAND_ADD_PIZZAS_DELIVERED: CollectParameters(&m_nIp, 1); - debug("ADD_PIZZAS_DELIVERED not implemented\n"); // TODO(MIAMI) + CStats::NumOfPizzasDelivered(ScriptParams[0]); return 0; //case COMMAND_ADD_GARBAGE_PICKUPS: case COMMAND_ADD_ICE_CREAMS_SOLD: CollectParameters(&m_nIp, 1); - debug("ADD_ICE_CREAMS_SOLD not implemented\n"); // TODO(MIAMI) + CStats::NumOfIceCreamSold(ScriptParams[0]); return 0; //case COMMAND_SET_TOP_SHOOTING_RANGE_SCORE: //case COMMAND_ADD_SHOOTING_RANGE_RANK: @@ -13137,15 +13140,15 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) } case COMMAND_SET_PROPERTY_AS_OWNED: CollectParameters(&m_nIp, 1); - debug("SET_PROPERTY_AS_OWNED not implemented\n"); // TODO(MIAMI) + CStats::AddPropertyAsOwned(ScriptParams[0]); return 0; case COMMAND_ADD_BLOOD_RING_KILLS: CollectParameters(&m_nIp, 1); - debug("ADD_BLOOD_RING_KILLS not implemented\n"); // TODO(MIAMI) + CStats::AddNumBloodRingKills(ScriptParams[0]); return 0; case COMMAND_SET_LONGEST_TIME_IN_BLOOD_RING: CollectParameters(&m_nIp, 1); - debug("SET_LONGEST_TIME_IN_BLOOD_RING not implemented\n"); // TODO(MIAMI) + CStats::LongestTimeInBloodRing(ScriptParams[0]); return 0; case COMMAND_REMOVE_EVERYTHING_FOR_HUGE_CUTSCENE: { @@ -13271,7 +13274,8 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) //case COMMAND_SET_CHAR_OBJ_GOTO_CAR_ON_FOOT: //case COMMAND_GET_CLOSEST_WATER_NODE: case COMMAND_ADD_PORN_LEAFLET_TO_RUBBISH: - debug("ADD_PORN_LEAFLET_TO_RUBBISH is not implemented\n"); // TODO(MIAMI) + CollectParameters(&m_nIp, 1); + CStats::PamphletMissionPassed = ScriptParams[0]; return 0; case COMMAND_CREATE_CLOTHES_PICKUP: { @@ -13541,7 +13545,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) switch (command) { case COMMAND_REGISTER_VIGILANTE_LEVEL: CollectParameters(&m_nIp, 1); - debug("REGISTER_VIGILANTE_LEVEL not implemented\n"); // TODO(MIAMI) + CStats::RegisterLevelVigilanteMission(ScriptParams[0]); return 0; case COMMAND_CLEAR_ALL_CHAR_ANIMS: { @@ -13854,7 +13858,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } case COMMAND_REGISTER_FIRE_LEVEL: CollectParameters(&m_nIp, 1); - debug("REGISTER_FIRE_LEVEL not implemented\n"); // TODO(MIAMI) + CStats::RegisterLevelFireMission(ScriptParams[0]); return 0; case COMMAND_IS_AUSTRALIAN_GAME: UpdateCompareFlag(false); // should we make some check? @@ -14007,7 +14011,7 @@ void CTheScripts::DrawScriptSpheres() { for (int i = 0; i < MAX_NUM_SCRIPT_SPHERES; i++) { if (ScriptSphereArray[i].m_bInUse) - C3dMarkers::PlaceMarkerSet(ScriptSphereArray[i].m_Id, 4, ScriptSphereArray[i].m_vecCenter, ScriptSphereArray[i].m_fRadius, + C3dMarkers::PlaceMarkerSet(ScriptSphereArray[i].m_Id, MARKERTYPE_CYLINDER, ScriptSphereArray[i].m_vecCenter, ScriptSphereArray[i].m_fRadius, SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, SPHERE_MARKER_A, SPHERE_MARKER_PULSE_PERIOD, SPHERE_MARKER_PULSE_FRACTION, 0); } } diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp index 375e9d5b..b996e77f 100644 --- a/src/core/Cam.cpp +++ b/src/core/Cam.cpp @@ -4894,11 +4894,6 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation, if (ResetStatics) { FOV = DefaultFOV; - - // TODO(Miami): Remove that when cam is done! - // GTA 3 has this in veh. camera - if (TheCamera.m_bIdleOn) - TheCamera.m_uiTimeWeEnteredIdle = CTimer::GetTimeInMilliseconds(); } else { if (isCar || isBike) { // 0.4f: CAR_FOV_START_SPEED @@ -4933,18 +4928,13 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation, Rotating = false; m_bCollisionChecksOn = true; - - // TODO(Miami): Uncomment that when cam is done! - - // Garage exit cam is not working well in III... - // if (!TheCamera.m_bJustCameOutOfGarage) - // { - Alpha = 0.0f; - Beta = car->GetForward().Heading() - HALFPI; - if (TheCamera.m_bCamDirectlyInFront) { - Beta += PI; + if (!TheCamera.m_bJustCameOutOfGarage) { + Alpha = 0.0f; + Beta = car->GetForward().Heading() - HALFPI; + if (TheCamera.m_bCamDirectlyInFront) { + Beta += PI; + } } - // } BetaSpeed = 0.0; AlphaSpeed = 0.0; diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index ccb89fbd..93061fd0 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -36,6 +36,7 @@ #include "Stats.h" #include "Messages.h" #include "FileLoader.h" +#include "User.h" // TODO(Miami): Remove that!! That was my map implementation for III, instead use MAP_ENHACEMENTS on some places #define CUSTOM_MAP @@ -5226,9 +5227,13 @@ CMenuManager::SwitchMenuOnAndOff() Initialise(); LoadAllTextures(); - // TODO(Miami): Cheat warning - m_nCurrScreen = MENUPAGE_CHOOSE_SAVE_SLOT; - m_nCurrOption = 8; + if (CPad::bHasPlayerCheated) { + m_nCurrScreen = MENUPAGE_SAVE_CHEAT_WARNING; + m_nCurrOption = 0; + } else { + m_nCurrScreen = MENUPAGE_CHOOSE_SAVE_SLOT; + m_nCurrOption = 8; + } } m_bStartUpFrontEndRequested = false; @@ -5262,7 +5267,7 @@ CMenuManager::UnloadTextures() m_bSpritesLoaded = false; } m_OnlySaveMenu = false; - // TODO(Miami): Place name thing + CUserDisplay::PlaceName.ProcessAfterFrontEndShutDown(); } void @@ -5565,27 +5570,6 @@ CMenuManager::ConstructStatLine(int rowIdx) STAT_LINE("DED_CRI", &(nTemp = CStats::PedsKilledOfThisType[PEDTYPE_CRIMINAL]), false, nil); STAT_LINE("HEL_DST", &CStats::HelisDestroyed, false, nil); STAT_LINE("KGS_EXP", &CStats::KgsOfExplosivesUsed, false, nil); - STAT_LINE("ACCURA", &(nTemp = (CStats::InstantHitsFiredByPlayer == 0 ? 0 : - CStats::InstantHitsHitByPlayer * 100.0f / CStats::InstantHitsFiredByPlayer)), false, nil); - - if (CStats::ElBurroTime > 0) { - STAT_LINE("ELBURRO", &CStats::ElBurroTime, false, nil); - } - if (CStats::Record4x4One > 0) { - STAT_LINE("FEST_R1", &CStats::Record4x4One, false, nil); - } - if (CStats::Record4x4Two > 0) { - STAT_LINE("FEST_R2", &CStats::Record4x4Two, false, nil); - } - if (CStats::Record4x4Three > 0) { - STAT_LINE("FEST_R3", &CStats::Record4x4Three, false, nil); - } - if (CStats::Record4x4Mayhem > 0) { - STAT_LINE("FEST_RM", &CStats::Record4x4Mayhem, false, nil); - } - if (CStats::TimeTakenDefuseMission > 0) { - STAT_LINE("FEST_BD", &CStats::TimeTakenDefuseMission, false, nil); - } if (CStats::HighestScores[0] > 0) { STAT_LINE("FEST_BB", nil, false, nil); @@ -5612,7 +5596,11 @@ CMenuManager::ConstructStatLine(int rowIdx) #ifndef USE_MEASUREMENTS_IN_METERS float fTemp; STAT_LINE("FEST_DF", &(fTemp = CStats::DistanceTravelledOnFoot * MILES_IN_METER), true, nil); - STAT_LINE("FEST_DC", &(fTemp = CStats::DistanceTravelledInVehicle * MILES_IN_METER), true, nil); + STAT_LINE("FEST_DC", &(fTemp = CStats::DistanceTravelledByCar * MILES_IN_METER), true, nil); + STAT_LINE("DISTBIK", &(fTemp = CStats::DistanceTravelledByBike * MILES_IN_METER), true, nil); + STAT_LINE("DISTBOA", &(fTemp = CStats::DistanceTravelledByBoat * MILES_IN_METER), true, nil); + STAT_LINE("DISTGOL", &(fTemp = CStats::DistanceTravelledByGolfCart * MILES_IN_METER), true, nil); + STAT_LINE("DISTHEL", &(fTemp = CStats::DistanceTravelledByHelicoptor * MILES_IN_METER), true, nil); STAT_LINE("MXCARD", &(fTemp = CStats::MaximumJumpDistance * FEET_IN_METER), true, nil); STAT_LINE("MXCARJ", &(fTemp = CStats::MaximumJumpHeight * FEET_IN_METER), true, nil); break; @@ -5627,7 +5615,11 @@ CMenuManager::ConstructStatLine(int rowIdx) case LANGUAGE_JAPANESE: #endif STAT_LINE("FESTDFM", &CStats::DistanceTravelledOnFoot, true, nil); - STAT_LINE("FESTDCM", &CStats::DistanceTravelledInVehicle, true, nil); + STAT_LINE("FESTDCM", &CStats::DistanceTravelledByCar, true, nil); + STAT_LINE("DISTBIM", &CStats::DistanceTravelledByBike, true, nil); + STAT_LINE("DISTBOM", &CStats::DistanceTravelledByBoat, true, nil); + STAT_LINE("DISTGOM", &CStats::DistanceTravelledByGolfCart, true, nil); + STAT_LINE("DISTHEM", &CStats::DistanceTravelledByHelicoptor, true, nil); STAT_LINE("MXCARDM", &CStats::MaximumJumpDistance, true, nil); STAT_LINE("MXCARJM", &CStats::MaximumJumpHeight, true, nil); break; diff --git a/src/core/Frontend_PS2.cpp b/src/core/Frontend_PS2.cpp index 8e604978..d9eff445 100644 --- a/src/core/Frontend_PS2.cpp +++ b/src/core/Frontend_PS2.cpp @@ -1179,30 +1179,9 @@ CMenuManager::InitialiseMenuContents(void) STAT_LINE("KGS_EXP", &CStats::KgsOfExplosivesUsed, 0, nil); - nTemp = (CStats::InstantHitsFiredByPlayer == 0 ? 0 : CStats::InstantHitsHitByPlayer * 100.0f / CStats::InstantHitsFiredByPlayer); - STAT_LINE("ACCURA", &nTemp, 0, nil); - - if (CStats::ElBurroTime > 0) - STAT_LINE("ELBURRO", &CStats::ElBurroTime, 0, nil); - - if (CStats::Record4x4One > 0) - STAT_LINE("FEST_R1", &CStats::Record4x4One, 0, nil); - - if (CStats::Record4x4Two > 0) - STAT_LINE("FEST_R2", &CStats::Record4x4Two, 0, nil); - - if (CStats::Record4x4Three > 0) - STAT_LINE("FEST_R3", &CStats::Record4x4Three, 0, nil); - - if (CStats::Record4x4Mayhem > 0) - STAT_LINE("FEST_RM", &CStats::Record4x4Mayhem, 0, nil); - if (CStats::LongestFlightInDodo > 0) STAT_LINE("FEST_LF", &CStats::LongestFlightInDodo, 0, nil); - if (CStats::TimeTakenDefuseMission > 0) - STAT_LINE("FEST_BD", &CStats::TimeTakenDefuseMission, 0, nil); - STAT_LINE("CAR_CRU", &CStats::CarsCrushed, 0, nil); if (CStats::HighestScores[0] > 0) @@ -1231,7 +1210,11 @@ CMenuManager::InitialiseMenuContents(void) STAT_LINE("FEST_H4", &CStats::HighestScores[4], 0, nil); STAT_LINE("FESTDFM", &CStats::DistanceTravelledOnFoot, 0, nil); - STAT_LINE("FESTDCM", &CStats::DistanceTravelledInVehicle, 0, nil); + STAT_LINE("FESTDCM", &CStats::DistanceTravelledByCar, 0, nil); + STAT_LINE("DISTBIM", &CStats::DistanceTravelledByBike, 0, nil); + STAT_LINE("DISTBOM", &CStats::DistanceTravelledByBoat, 0, nil); + STAT_LINE("DISTGOM", &CStats::DistanceTravelledByGolfCart, 0, nil); + STAT_LINE("DISTHEM", &CStats::DistanceTravelledByHelicoptor, 0, nil); STAT_LINE("MMRAIN", &CStats::mmRain, 0, nil); nTemp = (int32)CStats::MaximumJumpDistance; STAT_LINE("MXCARDM", &nTemp, 0, nil); diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index c1016bdd..6d6c30e4 100644 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -41,6 +41,7 @@ #include "Fluff.h" #include "Gangs.h" #include "platform.h" +#include "Stats.h" #ifdef GTA_PS2 #include "eetypes.h" @@ -59,6 +60,7 @@ bool CPad::bDisplayNoControllerMessage; bool CPad::bObsoleteControllerMessage; bool CPad::bOldDisplayNoControllerMessage; bool CPad::m_bMapPadOneToPadTwo; +bool CPad::bHasPlayerCheated; #ifdef GTA_PS2 unsigned char act_direct[6]; unsigned char act_align[6]; @@ -228,6 +230,8 @@ void VehicleCheat(bool something, int model) CWorld::Add(vehicle); } } + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } void BlowUpCarsCheat() @@ -287,6 +291,8 @@ void MayhemCheat() PED_FLAG_GANG2 | PED_FLAG_GANG3 | PED_FLAG_GANG4 | PED_FLAG_GANG5 | PED_FLAG_GANG6 | PED_FLAG_GANG7 | PED_FLAG_GANG8 | PED_FLAG_GANG9 | PED_FLAG_EMERGENCY | PED_FLAG_PROSTITUTE | PED_FLAG_CRIMINAL | PED_FLAG_SPECIAL ); + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } void EverybodyAttacksPlayerCheat() @@ -294,12 +300,17 @@ void EverybodyAttacksPlayerCheat() CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); for (int i = PEDTYPE_CIVMALE; i < PEDTYPE_SPECIAL; i++) CPedType::AddThreat(i, PED_FLAG_PLAYER1); + + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } void WeaponsForAllCheat() { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CPopulation::ms_bGivePedsWeapons = !CPopulation::ms_bGivePedsWeapons; + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } void FastTimeCheat() @@ -380,19 +391,24 @@ void OnlyRenderWheelsCheat() { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CVehicle::bWheelsOnlyCheat = !CVehicle::bWheelsOnlyCheat; + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } - void ChittyChittyBangBangCheat() { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CVehicle::bAllDodosCheat = !CVehicle::bAllDodosCheat; + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } void StrongGripCheat() { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CVehicle::bCheat3 = !CVehicle::bCheat3; + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } void NastyLimbsCheat() @@ -404,6 +420,7 @@ void FannyMagnetCheat() { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CPed::bFannyMagnetCheat = !CPed::bFannyMagnetCheat; + CPad::bHasPlayerCheated = true; } void BlackCarsCheat() @@ -437,6 +454,7 @@ void BackToTheFuture(void) { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); CVehicle::bHoverCheat = !CVehicle::bHoverCheat; + CPad::bHasPlayerCheated = true; } void SuicideCheat(void) { @@ -453,6 +471,8 @@ void DoChicksWithGunsCheat(void) { CStreaming::RemoveCurrentZonesModels(); CGangs::SetGangPedModels(GANG_PLAYER, MI_HFYBE, MI_WFYBE); CGangs::SetGangWeapons(GANG_PLAYER, WEAPONTYPE_M4, WEAPONTYPE_M4); + CStats::CheatedCount += 1000; + CPad::bHasPlayerCheated = true; } ////////////////////////////////////////////////////////////////////////// diff --git a/src/core/Pad.h b/src/core/Pad.h index 2a0bb7d3..4374bc1a 100644 --- a/src/core/Pad.h +++ b/src/core/Pad.h @@ -171,6 +171,7 @@ public: static bool bObsoleteControllerMessage; static bool bOldDisplayNoControllerMessage; static bool m_bMapPadOneToPadTwo; + static bool bHasPlayerCheated; static CKeyboardState OldKeyState; static CKeyboardState NewKeyState; diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index 3c01a176..f5f6a684 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -30,7 +30,13 @@ #include "World.h" #include "ZoneCull.h" #include "main.h" +#include "Bike.h" +#include "Automobile.h" +#include "GameLogic.h" +CVector lastPlayerPos; + +// --MIAMI: Done void CPlayerInfo::SetPlayerSkin(char *skin) { @@ -38,6 +44,7 @@ CPlayerInfo::SetPlayerSkin(char *skin) LoadPlayerSkin(); } +// --MIAMI: Done const CVector & CPlayerInfo::GetPos() { @@ -50,16 +57,16 @@ CPlayerInfo::GetPos() return m_pPed->GetPosition(); } +// --MIAMI: Done void CPlayerInfo::LoadPlayerSkin() { DeletePlayerSkin(); m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName); - if (!m_pSkinTexture) - m_pSkinTexture = CPlayerSkin::GetSkinTexture(DEFAULT_SKIN_NAME); } +// --MIAMI: Done void CPlayerInfo::DeletePlayerSkin() { @@ -69,6 +76,7 @@ CPlayerInfo::DeletePlayerSkin() } } +// --MIAMI: Done void CPlayerInfo::KillPlayer() { @@ -81,6 +89,7 @@ CPlayerInfo::KillPlayer() CStats::TimesDied++; } +// --MIAMI: Done void CPlayerInfo::ArrestPlayer() { @@ -88,11 +97,13 @@ CPlayerInfo::ArrestPlayer() m_WBState = WBSTATE_BUSTED; m_nWBTime = CTimer::GetTimeInMilliseconds(); + m_nBustedAudioStatus = BUSTEDAUDIO_NONE; CDarkel::ResetOnPlayerDeath(); CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2); CStats::TimesArrested++; } +// --MIAMI: Done bool CPlayerInfo::IsPlayerInRemoteMode() { @@ -109,6 +120,7 @@ CPlayerInfo::PlayerFailedCriticalMission() CDarkel::ResetOnPlayerDeath(); } +// --MIAMI: Done void CPlayerInfo::Clear(void) { @@ -125,6 +137,8 @@ CPlayerInfo::Clear(void) m_nTrafficMultiplier = 0; m_fRoadDensity = 1.0f; m_bInRemoteMode = false; + field_D5 = false; + field_D6 = false; m_bUnusedTaxiThing = false; m_nUnusedTaxiTimer = 0; m_nCollectedPackages = 0; @@ -136,10 +150,25 @@ CPlayerInfo::Clear(void) m_nSexFrequency = 0; m_pHooker = nil; m_nTimeTankShotGun = 0; - field_248 = 0; + field_EC = 0; m_nUpsideDownCounter = 0; + m_nTimeCarSpentOnTwoWheels = 0; + m_nDistanceCarTravelledOnTwoWheels = 0; + m_nTimeNotFullyOnGround = 0; + m_nTimeSpentOnWheelie = 0; + m_nDistanceTravelledOnWheelie = 0.0f; + m_nTimeSpentOnStoppie = 0; + m_nDistanceTravelledOnStoppie = 0.0f; + m_nCancelWheelStuntTimer = 0; + m_nPrevTimeCarSpentOnTwoWheels = 0; + m_nPrevDistanceCarTravelledOnTwoWheels = 0; + m_nPrevTimeSpentOnWheelie = 0; + m_nPrevDistanceTravelledOnWheelie = 0; + m_nPrevTimeSpentOnStoppie = 0; + m_nPrevDistanceTravelledOnStoppie = 0; m_bInfiniteSprint = false; m_bFastReload = false; + m_bFireproof = false; m_nMaxHealth = m_nMaxArmour = 100; m_bGetOutOfJailFree = false; m_bGetOutOfHospitalFree = false; @@ -147,11 +176,12 @@ CPlayerInfo::Clear(void) m_nPreviousTimeRewardedForExplosion = 0; m_nExplosionsSinceLastReward = 0; m_nHavocLevel = 0; - m_fMediaAttention = 0; + m_fMediaAttention = 0.0f; m_nCurrentBustedAudio = 1; m_nBustedAudioStatus = BUSTEDAUDIO_NONE; } +// --MIAMI: Done void CPlayerInfo::BlowUpRCBuggy(bool actually) { @@ -163,6 +193,7 @@ CPlayerInfo::BlowUpRCBuggy(bool actually) m_pRemoteVehicle->BlowUpCar(FindPlayerPed()); } +// --MIAMI: Done void CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car) { @@ -174,6 +205,7 @@ CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car) m_pPed->ClearObjective(); } +// --MIAMI: Done void CPlayerInfo::MakePlayerSafe(bool toggle) { @@ -198,8 +230,7 @@ CPlayerInfo::MakePlayerSafe(bool toggle) CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f); CReplay::DisableReplays(); - } - else { + } else { m_pPed->m_pWanted->m_bIgnoredByEveryone = false; CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO); m_pPed->bBulletProof = false; @@ -214,18 +245,21 @@ CPlayerInfo::MakePlayerSafe(bool toggle) } } +// --MIAMI: Done bool CPlayerInfo::IsRestartingAfterDeath() { return m_WBState == WBSTATE_WASTED; } +// --MIAMI: Done bool CPlayerInfo::IsRestartingAfterArrest() { return m_WBState == WBSTATE_BUSTED; } +// --MIAMI: Done // lastCloseness is passed to other calls of this function void CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput) @@ -250,32 +284,7 @@ CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoun } } -// There is something unfinished in here... Sadly all IDBs we have have it unfinished. -void -CPlayerInfo::AwardMoneyForExplosion(CVehicle *wreckedCar) -{ - if (CTimer::GetTimeInMilliseconds() - m_nPreviousTimeRewardedForExplosion < 6000) - ++m_nExplosionsSinceLastReward; - else - m_nExplosionsSinceLastReward = 1; - - m_nPreviousTimeRewardedForExplosion = CTimer::GetTimeInMilliseconds(); - int award = wreckedCar->pHandling->nMonetaryValue * 0.002f; - sprintf(gString, "$%d", award); -#ifdef MONEY_MESSAGES - // This line is a leftover from PS2, I don't know what it was meant to be. - // CVector sth(TheCamera.GetPosition() * 4.0f); - - CMoneyMessages::RegisterOne(wreckedCar->GetPosition() + CVector(0.0f, 0.0f, 2.0f), gString, 0, 255, 0, 2.0f, 0.5f); -#endif - CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award; - - for (int i = m_nExplosionsSinceLastReward; i > 1; --i) { - CGeneral::GetRandomNumber(); - CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award; - } -} - +// --MIAMI: Done void CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size) { @@ -293,12 +302,19 @@ CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size) CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages); CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint); CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour); CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree); CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed); CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio); #undef CopyToBuf } +// --MIAMI: Done void CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size) { @@ -313,12 +329,19 @@ CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size) CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages); CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint); CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour); CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree); CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree); - CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName) + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio) #undef CopyFromBuf } +// --MIAMI: Done void CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput) { @@ -333,7 +356,7 @@ CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, && (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) { CVector carCentre = car->GetBoundCentre(); - if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f) { + if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f || car->IsCar() && carCentre.z < ped->GetPosition().z && ped->GetPosition().z - 4.f < carCentre.z) { float dist = (ped->GetPosition() - carCentre).Magnitude2D(); if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) { EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput); @@ -367,6 +390,157 @@ CPlayerInfo::Process(void) if (startTaxiTimer) m_nUnusedTaxiTimer = CTimer::GetTimeInMilliseconds(); + if (!m_pPed->InVehicle()) { + m_nTimeCarSpentOnTwoWheels = 0; + m_nTimeNotFullyOnGround = 0; + m_nTimeSpentOnWheelie = 0; + m_nTimeSpentOnStoppie = 0; + m_nCancelWheelStuntTimer = 0; + } else if (m_pPed->m_pMyVehicle->IsCar()) { + CAutomobile *car = (CAutomobile*)m_pPed->m_pMyVehicle; + + if (car->m_nWheelsOnGround < 3) + m_nTimeNotFullyOnGround += CTimer::GetTimeInMilliseconds(); + else + m_nTimeNotFullyOnGround = 0; + + if (car->m_aSuspensionSpringRatioPrev[2] == 1.f && car->m_aSuspensionSpringRatioPrev[3] == 1.f) { + if (car->m_aSuspensionSpringRatioPrev[0] < 1.0f && car->m_aSuspensionSpringRatioPrev[1] < 1.0f && car->m_fDamageImpulse == 0.0f) { + m_nTimeCarSpentOnTwoWheels += CTimer::GetTimeStepInMilliseconds(); + m_nDistanceCarTravelledOnTwoWheels += car->m_fDistanceTravelled; + m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.5f); + + } else { + if (m_nTimeCarSpentOnTwoWheels != 0 && m_nCancelWheelStuntTimer < 500) { + m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); + } else { + if (m_nTimeCarSpentOnTwoWheels >= 2000) { + m_nPrevTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; + m_nPrevDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; + if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000) + CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000; + if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels) + CStats::Longest2WheelDist = m_nDistanceCarTravelledOnTwoWheels; + } + m_nTimeCarSpentOnTwoWheels = 0; + m_nDistanceCarTravelledOnTwoWheels = 0; + m_nCancelWheelStuntTimer = 0; + } + } + } else if (car->m_aSuspensionSpringRatioPrev[0] == 1.0f && car->m_aSuspensionSpringRatioPrev[1] == 1.0f) { +#ifdef FIX_BUGS + if (car->m_aSuspensionSpringRatioPrev[2] < 1.f +#else + if (car->m_aSuspensionSpringRatioPrev[1] < 1.f +#endif + && car->m_aSuspensionSpringRatioPrev[3] < 1.f && 0.0f == car->m_fDamageImpulse) { + m_nTimeCarSpentOnTwoWheels += CTimer::GetTimeStepInMilliseconds(); + m_nDistanceCarTravelledOnTwoWheels += car->m_fDistanceTravelled; + m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.2f); + + } else if (m_nTimeCarSpentOnTwoWheels != 0 && m_nCancelWheelStuntTimer < 500) { + m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); + + } else { + if (m_nTimeCarSpentOnTwoWheels >= 2000) { + m_nPrevTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; + m_nPrevDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; + if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000) + CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000; + if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels) + CStats::Longest2WheelDist = m_nDistanceCarTravelledOnTwoWheels; + } + m_nTimeCarSpentOnTwoWheels = 0; + m_nDistanceCarTravelledOnTwoWheels = 0; + m_nCancelWheelStuntTimer = 0; + } + } else if (m_nTimeCarSpentOnTwoWheels != 0) { + if (m_nTimeCarSpentOnTwoWheels >= 2000) { + m_nPrevTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; + m_nPrevDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; + if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000) + CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000; + if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels) + CStats::Longest2WheelDist = m_nDistanceCarTravelledOnTwoWheels; + } + m_nTimeCarSpentOnTwoWheels = 0; + m_nDistanceCarTravelledOnTwoWheels = 0; + m_nCancelWheelStuntTimer = 0; + } + m_nTimeSpentOnWheelie = 0; + m_nTimeSpentOnStoppie = 0; + } else if (m_pPed->m_pMyVehicle->IsBike()) { + CBike *bike = (CBike*)m_pPed->m_pMyVehicle; + if (bike->m_aSuspensionSpringRatioPrev[0] == 1.0f && bike->m_aSuspensionSpringRatioPrev[1] == 1.0f) { + if (bike->m_aSuspensionSpringRatioPrev[2] < 1.0f + || (bike->m_aSuspensionSpringRatioPrev[3] < 1.0f && 0.0f == bike->m_fDamageImpulse)) { + m_nTimeSpentOnWheelie += CTimer::GetTimeStepInMilliseconds(); + m_nDistanceTravelledOnWheelie += bike->m_fDistanceTravelled; + m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.2f); + + } else { + if (m_nTimeSpentOnWheelie != 0 && m_nCancelWheelStuntTimer < 500) { + m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); + } else { + if (m_nTimeSpentOnWheelie >= 5000) { + m_nPrevTimeSpentOnWheelie = m_nTimeSpentOnWheelie; + m_nPrevDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie; + if (CStats::LongestWheelie < m_nTimeSpentOnWheelie / 1000) + CStats::LongestWheelie = m_nTimeSpentOnWheelie / 1000; + if (CStats::LongestWheelieDist < m_nDistanceTravelledOnWheelie) + CStats::LongestWheelieDist = m_nDistanceTravelledOnWheelie; + } + m_nTimeSpentOnWheelie = 0; + m_nDistanceTravelledOnWheelie = 0; + m_nCancelWheelStuntTimer = 0; + } + } + } else if (m_nTimeSpentOnWheelie != 0) { + if (m_nTimeSpentOnWheelie >= 5000) { + m_nPrevTimeSpentOnWheelie = m_nTimeSpentOnWheelie; + m_nPrevDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie; + if (CStats::LongestWheelie < m_nTimeSpentOnWheelie / 1000) + CStats::LongestWheelie = m_nTimeSpentOnWheelie / 1000; + if (CStats::LongestWheelieDist < m_nDistanceTravelledOnWheelie) + CStats::LongestWheelieDist = m_nDistanceTravelledOnWheelie; + } + m_nTimeSpentOnWheelie = 0; + m_nDistanceTravelledOnWheelie = 0; + m_nCancelWheelStuntTimer = 0; + + } else if (bike->m_aSuspensionSpringRatioPrev[2] == 1.0f && bike->m_aSuspensionSpringRatioPrev[3] == 1.0f + && 0.0f == bike->m_fDamageImpulse) { + m_nTimeSpentOnStoppie += CTimer::GetTimeStepInMilliseconds(); + m_nDistanceTravelledOnStoppie += bike->m_fDistanceTravelled; + m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.2f); + + } else { + if (m_nTimeSpentOnStoppie != 0 && m_nCancelWheelStuntTimer < 500) { + m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); + } else { + if (m_nTimeSpentOnStoppie >= 2000) { + m_nPrevTimeSpentOnStoppie = m_nTimeSpentOnStoppie; + m_nPrevDistanceTravelledOnStoppie = m_nDistanceTravelledOnStoppie; + if (CStats::LongestStoppie < m_nTimeSpentOnStoppie / 1000) + CStats::LongestStoppie = m_nTimeSpentOnStoppie / 1000; + if (CStats::LongestStoppieDist < m_nDistanceTravelledOnStoppie) + CStats::LongestStoppieDist = m_nDistanceTravelledOnStoppie; + } + m_nTimeSpentOnStoppie = 0; + m_nDistanceTravelledOnStoppie = 0; + m_nCancelWheelStuntTimer = 0; + } + } + m_nTimeCarSpentOnTwoWheels = 0; + m_nTimeNotFullyOnGround = 0; + } else { + m_nTimeCarSpentOnTwoWheels = 0; + m_nTimeNotFullyOnGround = 0; + m_nTimeSpentOnWheelie = 0; + m_nTimeSpentOnStoppie = 0; + m_nCancelWheelStuntTimer = 0; + } + // The effect that makes money counter does while earning/losing money if (m_nVisibleMoney != m_nMoney) { int diff = m_nMoney - m_nVisibleMoney; @@ -395,7 +569,7 @@ CPlayerInfo::Process(void) m_fRoadDensity = ThePaths.CalcRoadDensity(playerPos.x, playerPos.y); } - m_fRoadDensity = clamp(m_fRoadDensity, 0.4f, 1.45f); + m_fRoadDensity = clamp(m_fRoadDensity, 0.5f, 1.45f); // Because vehicle enter/exit use same key binding. bool enterOrExitVeh; @@ -404,39 +578,31 @@ CPlayerInfo::Process(void) else enterOrExitVeh = CPad::GetPad(0)->GetExitVehicle(); - if (enterOrExitVeh && m_pPed->m_nPedState != PED_SNIPER_MODE && m_pPed->m_nPedState != PED_ROCKET_MODE) { + if (enterOrExitVeh && m_pPed->m_nPedState != PED_ANSWER_MOBILE && m_pPed->m_nPedState != PED_SNIPER_MODE && m_pPed->m_nPedState != PED_ROCKET_MODE) { if (m_pPed->bInVehicle) { if (!m_pRemoteVehicle) { CEntity *surfaceBelowVeh = m_pPed->m_pMyVehicle->m_pCurGroundEntity; if (!surfaceBelowVeh || !CBridge::ThisIsABridgeObjectMovingUp(surfaceBelowVeh->GetModelIndex())) { CVehicle *veh = m_pPed->m_pMyVehicle; if (!veh->IsBoat() || veh->m_nDoorLock == CARLOCK_LOCKED_PLAYER_INSIDE) { - - // This condition will always return true, else block was probably WIP Miami code. - if (veh->m_vehType != VEHICLE_TYPE_BIKE || veh->m_nDoorLock == CARLOCK_LOCKED_PLAYER_INSIDE) { - if (veh->GetStatus() != STATUS_WRECKED && veh->GetStatus() != STATUS_TRAIN_MOVING && veh->m_nDoorLock != CARLOCK_LOCKED_PLAYER_INSIDE) { - if (veh->m_vecMoveSpeed.Magnitude() < 0.17f && CTimer::GetTimeScale() >= 0.5f && !veh->bIsInWater) { - m_pPed->SetObjective(OBJECTIVE_LEAVE_CAR, veh); - } + if (veh->GetStatus() != STATUS_WRECKED && veh->GetStatus() != STATUS_TRAIN_MOVING && veh->m_nDoorLock != CARLOCK_LOCKED_PLAYER_INSIDE) { + bool canJumpOff = false; + if (veh->m_vehType == VEHICLE_TYPE_BIKE) { + canJumpOff = veh->CanPedJumpOffBike(); + } else if (veh->pDriver == m_pPed) { + canJumpOff = veh->CanPedJumpOutCar(); } - } else { - CVector sth = 0.7f * veh->GetRight() + veh->GetPosition(); - bool found = false; - float groundZ = CWorld::FindGroundZFor3DCoord(sth.x, sth.y, 2.0f + sth.z, &found); - if (found) - sth.z = 1.0f + groundZ; - m_pPed->m_nPedState = PED_IDLE; - m_pPed->SetMoveState(PEDMOVE_STILL); - CPed::PedSetOutCarCB(0, m_pPed); - CAnimManager::BlendAnimation(m_pPed->GetClump(), m_pPed->m_animGroup, ANIM_IDLE_STANCE, 100.0f); - CAnimManager::BlendAnimation(m_pPed->GetClump(), ASSOCGRP_STD, ANIM_FALL_LAND, 100.0f); - m_pPed->SetPosition(sth); - m_pPed->SetMoveState(PEDMOVE_STILL); - m_pPed->m_vecMoveSpeed = veh->m_vecMoveSpeed; + if (canJumpOff || veh->m_vecMoveSpeed.Magnitude() < 0.1f) { + if (!veh->bIsInWater) + m_pPed->SetObjective(OBJECTIVE_LEAVE_CAR, veh); + + } else if (veh->GetStatus() != STATUS_PLAYER && veh != CGameLogic::pShortCutTaxi) { + veh->AutoPilot.m_nTempAction = TEMPACT_WAIT; + veh->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + 1000; + } } } else { - // The code in here was under CPed::SetExitBoat in VC, did the same for here. m_pPed->SetExitBoat(veh); m_pPed->bTryingToReachDryLand = true; } @@ -451,14 +617,10 @@ CPlayerInfo::Process(void) CEntity *surfaceBelow = m_pPed->m_pCurrentPhysSurface; if (surfaceBelow && surfaceBelow->IsVehicle()) { carBelow = (CVehicle*)surfaceBelow; - if (carBelow->IsBoat()) { + if (carBelow->IsBoat() && carBelow->m_modelIndex != MI_SKIMMER) { weAreOnBoat = true; m_pPed->bOnBoat = true; -#ifdef VC_PED_PORTS if (carBelow->GetStatus() != STATUS_WRECKED && carBelow->GetUp().z > 0.3f) -#else - if (carBelow->GetStatus() != STATUS_WRECKED) -#endif m_pPed->SetSeekBoatPosition(carBelow); } } @@ -506,14 +668,15 @@ CPlayerInfo::Process(void) } } } + if (m_bInRemoteMode) { uint32 timeWithoutRemoteCar = CTimer::GetTimeInMilliseconds() - m_nTimeLostRemoteCar; - if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING) { + if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING && field_D6) { TheCamera.SetFadeColour(0, 0, 0); TheCamera.Fade(1.0f, 0); } if (timeWithoutRemoteCar > 2000) { - if (m_WBState == WBSTATE_PLAYING) { + if (m_WBState == WBSTATE_PLAYING && field_D6) { TheCamera.RestoreWithJumpCut(); TheCamera.SetFadeColour(0, 0, 0); TheCamera.Fade(1.0f, 1); @@ -525,6 +688,7 @@ CPlayerInfo::Process(void) CTimer::Update(); } m_bInRemoteMode = false; + CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bRemoveFromWorld = true; CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = nil; if (FindPlayerVehicle()) { FindPlayerVehicle()->SetStatus(STATUS_PLAYER); @@ -534,11 +698,10 @@ CPlayerInfo::Process(void) if (!(CTimer::GetFrameCounter() & 31)) { CVehicle *veh = FindPlayerVehicle(); if (veh && m_pPed->bInVehicle && veh->GetUp().z < 0.0f - && veh->m_vecMoveSpeed.Magnitude() < 0.05f && veh->IsCar() && !veh->bIsInWater) { + && veh->m_vecMoveSpeed.Magnitude() < 0.05f && (veh->IsCar() || veh->IsBoat()) && !veh->bIsInWater) { if (veh->GetUp().z < -0.5f) { m_nUpsideDownCounter += 2; - } else { m_nUpsideDownCounter++; } @@ -562,8 +725,74 @@ CPlayerInfo::Process(void) if (veh->pPassengers[i]) veh->pPassengers[i]->m_nZoneLevel = LEVEL_GENERIC; } - CStats::DistanceTravelledInVehicle += veh->m_fDistanceTravelled; + if(veh->m_modelIndex == MI_CADDY) + CStats::DistanceTravelledByGolfCart += veh->m_fDistanceTravelled; + else { + if(veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) + CStats::DistanceTravelledByHelicoptor += veh->m_fDistanceTravelled; + if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) + CStats::DistanceTravelledByPlane += veh->m_fDistanceTravelled; + if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR) + CStats::DistanceTravelledByCar += veh->m_fDistanceTravelled; + if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE) + CStats::DistanceTravelledByBike += veh->m_fDistanceTravelled; + if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT) + CStats::DistanceTravelledByBoat += veh->m_fDistanceTravelled; + + if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) { + if (veh->m_vecMoveSpeed.Magnitude() > 0.2f) { + CStats::FlightTime += CTimer::GetTimeStep() * 16.f; // what a weird choice + } + } + } } else { CStats::DistanceTravelledOnFoot += FindPlayerPed()->m_fDistanceTravelled; } + + if (m_pPed->m_pWanted->m_nWantedLevel && !CTheScripts::IsPlayerOnAMission()) { + float maxDelta = 0.0f; + static bool movedSignificantly = true; + static bool thereIsACarPathNear = true; + // there was one more guard without variable's itself??? + + if (CTimer::GetTimeInMilliseconds() / 20000 != CTimer::GetPreviousTimeInMilliseconds() / 20000) { + float posChange = (lastPlayerPos - FindPlayerCoors()).Magnitude(); + movedSignificantly = posChange >= 10.0f; + lastPlayerPos = FindPlayerCoors(); + thereIsACarPathNear = ThePaths.FindNodeClosestToCoors(FindPlayerCoors(), PATH_CAR, 60.0f, true, false, false, false) != 0; + } + switch (m_pPed->m_pWanted->m_nWantedLevel) { + case 1: + maxDelta = 31.f; + break; + case 2: + maxDelta = 62.f; + break; + case 3: + maxDelta = 125.f; + break; + case 4: + maxDelta = 250.f; + break; + case 5: + maxDelta = 500.f; + break; + case 6: + maxDelta = 1000.f; + break; + default: + break; + } + float increaseDelta = maxDelta - m_fMediaAttention; + float increaseAttentionBy = CTimer::GetTimeStep() * 0.0001f * increaseDelta; + if (increaseAttentionBy < 0.0f + || movedSignificantly && thereIsACarPathNear && !CCullZones::NoPolice() && !CCullZones::PoliceAbandonCars() && CGame::currArea == AREA_MAIN_MAP) { + m_fMediaAttention += increaseAttentionBy; + } + } else { + m_fMediaAttention = 0.0f; + } + CStats::HighestChaseValue = Max(m_fMediaAttention, CStats::HighestChaseValue); + m_nMoney = Min(999999999, m_nMoney); + m_nVisibleMoney = Min(999999999, m_nVisibleMoney); } diff --git a/src/core/PlayerInfo.h b/src/core/PlayerInfo.h index 11f51ac0..1a8df47c 100644 --- a/src/core/PlayerInfo.h +++ b/src/core/PlayerInfo.h @@ -45,19 +45,33 @@ public: int8 m_WBState; // eWastedBustedState uint32 m_nWBTime; bool m_bInRemoteMode; + bool field_D5; + bool field_D6; uint32 m_nTimeLostRemoteCar; uint32 m_nTimeLastHealthLoss; uint32 m_nTimeLastArmourLoss; uint32 m_nTimeTankShotGun; - int32 m_nTimeNotFullyOnGround; int32 m_nUpsideDownCounter; - int32 field_248; + int32 field_EC; + int32 m_nTimeCarSpentOnTwoWheels; + int32 m_nDistanceCarTravelledOnTwoWheels; + int32 m_nTimeNotFullyOnGround; + int32 m_nTimeSpentOnWheelie; + float m_nDistanceTravelledOnWheelie; + int32 m_nTimeSpentOnStoppie; + float m_nDistanceTravelledOnStoppie; + int32 m_nCancelWheelStuntTimer; + int32 m_nPrevTimeCarSpentOnTwoWheels; + int32 m_nPrevDistanceCarTravelledOnTwoWheels; + int32 m_nPrevTimeSpentOnWheelie; + int32 m_nPrevDistanceTravelledOnWheelie; + int32 m_nPrevTimeSpentOnStoppie; + int32 m_nPrevDistanceTravelledOnStoppie; int16 m_nTrafficMultiplier; + int16 field_12A; float m_fRoadDensity; uint32 m_nPreviousTimeRewardedForExplosion; - int32 m_nExplosionsSinceLastReward; - int32 field_268; - int32 field_272; + uint32 m_nExplosionsSinceLastReward; uint32 m_nHavocLevel; float m_fMediaAttention; bool m_bInfiniteSprint; @@ -76,7 +90,6 @@ public: void MakePlayerSafe(bool); void LoadPlayerSkin(); void DeletePlayerSkin(); - void AwardMoneyForExplosion(CVehicle *vehicle); void SetPlayerSkin(char* skin); const CVector &GetPos(); void Process(void); diff --git a/src/core/Radar.h b/src/core/Radar.h index a36faaea..100da8f3 100644 --- a/src/core/Radar.h +++ b/src/core/Radar.h @@ -19,7 +19,7 @@ #define COORDBLIP_MARKER_COLOR_R 252 #define COORDBLIP_MARKER_COLOR_G 138 #define COORDBLIP_MARKER_COLOR_B 242 -#define COORDBLIP_MARKER_COLOR_A 255 +#define COORDBLIP_MARKER_COLOR_A 228 #define NUM_MAP_LEGENDS 75 diff --git a/src/core/Stats.cpp b/src/core/Stats.cpp index 29087b34..d5c08e4f 100644 --- a/src/core/Stats.cpp +++ b/src/core/Stats.cpp @@ -3,12 +3,14 @@ #include "Stats.h" #include "Text.h" #include "World.h" +#include "Pad.h" #include -//TODO int32 CStats::SeagullsKilled; - +int32 CStats::BoatsExploded; +int32 CStats::WantedStarsAttained; +int32 CStats::WantedStarsEvaded; int32 CStats::DaysPassed; int32 CStats::HeadsPopped; int32 CStats::CommercialPassed; @@ -21,8 +23,25 @@ int32 CStats::PedsKilledOfThisType[NUM_PEDTYPES]; int32 CStats::TimesDied; int32 CStats::TimesArrested; int32 CStats::KillsSinceLastCheckpoint; -float CStats::DistanceTravelledInVehicle; +float CStats::DistanceTravelledByCar; +float CStats::DistanceTravelledByHelicoptor; +float CStats::DistanceTravelledByBike; +float CStats::DistanceTravelledByBoat; +float CStats::DistanceTravelledByPlane; +float CStats::DistanceTravelledByGolfCart; float CStats::DistanceTravelledOnFoot; +int32 CStats::FlightTime; +int32 CStats::TimesDrowned; +int32 CStats::PhotosTaken; +float CStats::LoanSharks; +float CStats::StoresKnockedOff; +float CStats::MovieStunts; +float CStats::Assassinations; +float CStats::PizzasDelivered; +float CStats::GarbagePickups; +float CStats::IceCreamSold; +float CStats::TopShootingRangeScore; +float CStats::ShootingRank; int32 CStats::ProgressMade; int32 CStats::TotalProgressInGame; int32 CStats::CarsExploded; @@ -40,95 +59,153 @@ int32 CStats::MissionsGiven; int32 CStats::MissionsPassed; char CStats::LastMissionPassedName[8]; int32 CStats::TotalLegitimateKills; -int32 CStats::ElBurroTime; -int32 CStats::Record4x4One; -int32 CStats::Record4x4Two; -int32 CStats::Record4x4Three; -int32 CStats::Record4x4Mayhem; int32 CStats::LivesSavedWithAmbulance; int32 CStats::CriminalsCaught; int32 CStats::HighestLevelAmbulanceMission; +int32 CStats::HighestLevelVigilanteMission; +int32 CStats::HighestLevelFireMission; int32 CStats::FiresExtinguished; -int32 CStats::TimeTakenDefuseMission; int32 CStats::TotalNumberKillFrenzies; int32 CStats::TotalNumberMissions; int32 CStats::RoundsFiredByPlayer; int32 CStats::KgsOfExplosivesUsed; -int32 CStats::InstantHitsFiredByPlayer; -int32 CStats::InstantHitsHitByPlayer; +int32 CStats::BulletsThatHit; int32 CStats::BestTimeBombDefusal; int32 CStats::FastestTimes[CStats::TOTAL_FASTEST_TIMES]; int32 CStats::HighestScores[CStats::TOTAL_HIGHEST_SCORES]; int32 CStats::BestPositions[CStats::TOTAL_BEST_POSITIONS]; +bool CStats::PropertyOwned[CStats::TOTAL_PROPERTIES]; +int32 CStats::NumPropertyOwned; int32 CStats::PropertyDestroyed; +float CStats::HighestChaseValue; +int32 CStats::CheatedCount; +int32 CStats::ShowChaseStatOnScreen; int32 CStats::PamphletMissionPassed; +bool CStats::abSonyCDs[1]; +int32 CStats::BloodRingKills; +int32 CStats::BloodRingTime; +float CStats::FavoriteRadioStationList[NUM_RADIOS]; int32 CStats::Sprayings; float CStats::AutoPaintingBudget; int32 CStats::NoMoreHurricanes; float CStats::FashionBudget; +float CStats::PropertyBudget; +float CStats::WeaponBudget; int32 CStats::SafeHouseVisits; int32 CStats::TyresPopped; +int32 CStats::LongestWheelie; +int32 CStats::LongestStoppie; +int32 CStats::Longest2Wheel; +float CStats::LongestWheelieDist; +float CStats::LongestStoppieDist; +float CStats::Longest2WheelDist; + +// --MIAMI: functions below are done except TODOs, but there are some to be moved from Frontend + void CStats::Init() { PeopleKilledByOthers = 0; PeopleKilledByPlayer = 0; - RoundsFiredByPlayer = 0; CarsExploded = 0; + BoatsExploded = 0; + RoundsFiredByPlayer = 0; + for (int i = 0; i < NUM_PEDTYPES; i++) + PedsKilledOfThisType[i] = 0; HelisDestroyed = 0; ProgressMade = 0; KgsOfExplosivesUsed = 0; - InstantHitsFiredByPlayer = 0; - InstantHitsHitByPlayer = 0; + BulletsThatHit = 0; + TyresPopped = 0; HeadsPopped = 0; + WantedStarsAttained = 0; + WantedStarsEvaded = 0; TimesArrested = 0; TimesDied = 0; DaysPassed = 0; - NumberOfUniqueJumpsFound = 0; - MaximumJumpFlips = 0; - MaximumJumpSpins = 0; + SafeHouseVisits = 0; + Sprayings = 0; MaximumJumpDistance = 0; MaximumJumpHeight = 0; + MaximumJumpFlips = 0; + MaximumJumpSpins = 0; BestStuntJump = 0; + NumberOfUniqueJumpsFound = 0; TotalNumberOfUniqueJumps = 0; - Record4x4One = 0; - Record4x4Two = 0; - PassengersDroppedOffWithTaxi = 0; - Record4x4Three = 0; - MoneyMadeWithTaxi = 0; - Record4x4Mayhem = 0; - LivesSavedWithAmbulance = 0; - ElBurroTime = 0; - CriminalsCaught = 0; MissionsGiven = 0; - HighestLevelAmbulanceMission = 0; MissionsPassed = 0; - FiresExtinguished = 0; + PassengersDroppedOffWithTaxi = 0; + MoneyMadeWithTaxi = 0; DistanceTravelledOnFoot = 0; - TimeTakenDefuseMission = 0; + DistanceTravelledByCar = 0; + DistanceTravelledByBike = 0; + DistanceTravelledByBoat = 0; + DistanceTravelledByGolfCart = 0; + DistanceTravelledByHelicoptor = 0; + DistanceTravelledByPlane = 0; // FIX: Wasn't initialized + LivesSavedWithAmbulance = 0; + CriminalsCaught = 0; + HighestLevelVigilanteMission = 0; + HighestLevelAmbulanceMission = 0; + HighestLevelFireMission = 0; + FiresExtinguished = 0; + PhotosTaken = 0; NumberKillFrenziesPassed = 0; - DistanceTravelledInVehicle = 0; TotalNumberKillFrenzies = 0; TotalNumberMissions = 0; - KillsSinceLastCheckpoint = 0; - TotalLegitimateKills = 0; + FlightTime = 0; + TimesDrowned = 0; + SeagullsKilled = 0; + WeaponBudget = 0.0f; + FashionBudget = 0.0f; + LoanSharks = 0.0f; + StoresKnockedOff = 0.0f; + MovieStunts = 0.0f; + Assassinations = 0.0f; + PizzasDelivered = 0.0f; + GarbagePickups = 0.0f; + IceCreamSold = 0.0f; + TopShootingRangeScore = 0.0f; + ShootingRank = 0.0f; + LongestWheelie = 0; + LongestStoppie = 0; + Longest2Wheel = 0; + LongestWheelieDist = 0.0f; + LongestStoppieDist = 0.0f; + Longest2WheelDist = 0.0f; + PropertyBudget = 0.0f; + AutoPaintingBudget = 0.0f; + PropertyDestroyed = 0; + HighestChaseValue = 0.0f; + CheatedCount = 0; + for (int i = 0; i < TOTAL_FASTEST_TIMES; i++) FastestTimes[i] = 0; for (int i = 0; i < TOTAL_HIGHEST_SCORES; i++) HighestScores[i] = 0; for (int i = 0; i < TOTAL_BEST_POSITIONS; i++) BestPositions[i] = INT_MAX; - for (int i = 0; i < NUM_PEDTYPES; i++) - PedsKilledOfThisType[i] = 0; + + KillsSinceLastCheckpoint = 0; + TotalLegitimateKills = 0; IndustrialPassed = 0; CommercialPassed = 0; SuburbanPassed = 0; - - Sprayings = 0; - AutoPaintingBudget = 0.0f; + PamphletMissionPassed = 0; NoMoreHurricanes = 0; - SafeHouseVisits = 0; + ShowChaseStatOnScreen = 0; + abSonyCDs[0] = 0; + // TODO(Miami): Change this with PopulateFavoriteRadioStationList(); !! + for (int i = 0; i < NUM_RADIOS; i++) + FavoriteRadioStationList[i] = 0.0f; + + NumPropertyOwned = 0; + for (int i = 0; i < TOTAL_PROPERTIES; i++) + PropertyOwned[i] = false; + + BloodRingKills = 0; + BloodRingTime = 0; } void CStats::RegisterFastestTime(int32 index, int32 time) @@ -152,31 +229,6 @@ void CStats::RegisterBestPosition(int32 index, int32 position) BestPositions[index] = Min(BestPositions[index], position); } -void CStats::RegisterElBurroTime(int32 time) -{ - ElBurroTime = (ElBurroTime && ElBurroTime < time) ? ElBurroTime : time; -} - -void CStats::Register4x4OneTime(int32 time) -{ - Record4x4One = (Record4x4One && Record4x4One < time) ? Record4x4One : time; -} - -void CStats::Register4x4TwoTime(int32 time) -{ - Record4x4Two = (Record4x4Two && Record4x4Two < time) ? Record4x4Two : time; -} - -void CStats::Register4x4ThreeTime(int32 time) -{ - Record4x4Three = (Record4x4Three && Record4x4Three < time) ? Record4x4Three : time; -} - -void CStats::Register4x4MayhemTime(int32 time) -{ - Record4x4Mayhem = (Record4x4Mayhem && Record4x4Mayhem < time) ? Record4x4Mayhem : time; -} - void CStats::AnotherLifeSavedWithAmbulance() { ++LivesSavedWithAmbulance; @@ -192,16 +244,21 @@ void CStats::RegisterLevelAmbulanceMission(int32 level) HighestLevelAmbulanceMission = Max(HighestLevelAmbulanceMission, level); } +void CStats::RegisterLevelVigilanteMission(int32 level) +{ + HighestLevelVigilanteMission = Max(HighestLevelVigilanteMission, level); +} + +void CStats::RegisterLevelFireMission(int32 level) +{ + HighestLevelFireMission = Max(HighestLevelFireMission, level); +} + void CStats::AnotherFireExtinguished() { ++FiresExtinguished; } -void CStats::RegisterTimeTakenDefuseMission(int32 time) -{ - TimeTakenDefuseMission = (TimeTakenDefuseMission && TimeTakenDefuseMission < time) ? TimeTakenDefuseMission : time; -} - void CStats::AnotherKillFrenzyPassed() { ++NumberKillFrenziesPassed; @@ -221,40 +278,88 @@ wchar *CStats::FindCriminalRatingString() { int rating = FindCriminalRatingNumber(); - if (rating < 10) return TheText.Get("RATNG1"); - if (rating < 25) return TheText.Get("RATNG2"); - if (rating < 70) return TheText.Get("RATNG3"); - if (rating < 150) return TheText.Get("RATNG4"); - if (rating < 250) return TheText.Get("RATNG5"); - if (rating < 450) return TheText.Get("RATNG6"); - if (rating < 700) return TheText.Get("RATNG7"); - if (rating < 1000) return TheText.Get("RATNG8"); - if (rating < 1400) return TheText.Get("RATNG9"); - if (rating < 1900) return TheText.Get("RATNG10"); - if (rating < 2500) return TheText.Get("RATNG11"); - if (rating < 3200) return TheText.Get("RATNG12"); - if (rating < 4000) return TheText.Get("RATNG13"); - if (rating < 5000) return TheText.Get("RATNG14"); - return TheText.Get("RATNG15"); + if (rating < 0) { + if (rating > -500) return TheText.Get("RATNG53"); + if (rating > -2000) return TheText.Get("RATNG54"); + if (rating > -4000) return TheText.Get("RATNG55"); + if (rating > -6000) return TheText.Get("RATNG56"); + return TheText.Get("RATNG57"); + } + if (rating < 20) return TheText.Get("RATNG1"); + if (rating < 50) return TheText.Get("RATNG2"); + if (rating < 75) return TheText.Get("RATNG3"); + if (rating < 100) return TheText.Get("RATNG4"); + if (rating < 120) return TheText.Get("RATNG5"); + if (rating < 150) return TheText.Get("RATNG6"); + if (rating < 200) return TheText.Get("RATNG7"); + if (rating < 240) return TheText.Get("RATNG8"); + if (rating < 270) return TheText.Get("RATNG9"); + if (rating < 300) return TheText.Get("RATNG10"); + if (rating < 335) return TheText.Get("RATNG11"); + if (rating < 370) return TheText.Get("RATNG12"); + if (rating < 400) return TheText.Get("RATNG13"); + if (rating < 450) return TheText.Get("RATNG14"); + if (rating < 500) return TheText.Get("RATNG15"); + if (rating < 550) return TheText.Get("RATNG16"); + if (rating < 600) return TheText.Get("RATNG17"); + if (rating < 610) return TheText.Get("RATNG18"); + if (rating < 650) return TheText.Get("RATNG19"); + if (rating < 700) return TheText.Get("RATNG20"); + if (rating < 850) return TheText.Get("RATNG21"); + if (rating < 1000) return TheText.Get("RATNG22"); + if (rating < 1005) return TheText.Get("RATNG23"); + if (rating < 1150) return TheText.Get("RATNG24"); + if (rating < 1300) return TheText.Get(TimesArrested > 0 ? "RATNG25" : "RATNG24"); + if (rating < 1500) return TheText.Get("RATNG26"); + if (rating < 1700) return TheText.Get("RATNG27"); + if (rating < 2000) return TheText.Get("RATNG28"); + if (rating < 2100) return TheText.Get("RATNG29"); + if (rating < 2300) return TheText.Get("RATNG30"); + if (rating < 2500) return TheText.Get("RATNG31"); + if (rating < 2750) return TheText.Get("RATNG32"); + if (rating < 3000) return TheText.Get("RATNG33"); + if (rating < 3500) return TheText.Get("RATNG34"); + if (rating < 4000) return TheText.Get("RATNG35"); + if (rating < 5000) return TheText.Get("RATNG36"); + if (rating < 7500) return TheText.Get("RATNG37"); + if (rating < 10000) return TheText.Get("RATNG38"); + if (rating < 20000) return TheText.Get("RATNG39"); + if (rating < 30000) return TheText.Get("RATNG40"); + if (rating < 40000) return TheText.Get("RATNG41"); + if (rating < 50000) return TheText.Get("RATNG42"); + if (rating < 65000) return TheText.Get("RATNG43"); + if (rating < 80000) return TheText.Get("RATNG44"); + if (rating < 100000) return TheText.Get("RATNG45"); + if (rating < 150000) return TheText.Get("RATNG46"); + if (rating < 200000) return TheText.Get("RATNG47"); + if (rating < 300000) return TheText.Get("RATNG48"); + if (rating < 375000) return TheText.Get("RATNG49"); + if (rating < 500000) return TheText.Get(FlightTime / 60000 / 60 > 10 ? "RATNG50" : "RATNG49"); + if (rating < 1000000) return TheText.Get("RATNG51"); + return TheText.Get(CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney > 10000000 ? "RATNG52" : "RATNG51"); } int32 CStats::FindCriminalRatingNumber() { int32 rating; - rating = FiresExtinguished + 10 * HighestLevelAmbulanceMission + CriminalsCaught + LivesSavedWithAmbulance + rating = FiresExtinguished + 10 * HighestLevelFireMission + 10 * HighestLevelAmbulanceMission + + CriminalsCaught + LivesSavedWithAmbulance + 30 * HelisDestroyed + TotalLegitimateKills - 3 * TimesArrested - 3 * TimesDied + CWorld::Players[CWorld::PlayerInFocus].m_nMoney / 5000; - if (rating <= 0) rating = 0; + if (CPad::bHasPlayerCheated || CheatedCount > 0) { + rating -= CheatedCount; + if (rating <= -10000) + rating = -10000; - if (InstantHitsFiredByPlayer > 100) - rating += (float)CStats::InstantHitsHitByPlayer / (float)CStats::InstantHitsFiredByPlayer * 500.0f; + } else if (rating <= 0) { + rating = 0; + } + + if (RoundsFiredByPlayer > 100) + rating += (float)CStats::BulletsThatHit / (float)CStats::RoundsFiredByPlayer * 500.0f; if (TotalProgressInGame) rating += (float)CStats::ProgressMade / (float)CStats::TotalProgressInGame * 1000.0f; - if (!IndustrialPassed && rating >= 3521) - rating = 3521; - if (!CommercialPassed && rating >= 4552) - rating = 4552; return rating; } @@ -266,11 +371,80 @@ float CStats::GetPercentageProgress() return Min(percentCompleted, 100.0f); } +void CStats::MoneySpentOnWeapons(int32 money) +{ + WeaponBudget += money; +} + +void CStats::MoneySpentOnProperty(int32 money) +{ + PropertyBudget += money; +} + +void CStats::MoneySpentOnAutoPainting(int32 money) +{ + AutoPaintingBudget += money; +} + void CStats::MoneySpentOnFashion(int32 money) { FashionBudget += money; } +void CStats::NumOfVisitsFromLoanSharks(int32 num) +{ + LoanSharks += num; +} + +void CStats::NumOfStoresKnockedOff(int32 num) +{ + StoresKnockedOff += num; +} + +void CStats::NumOfMovieStunts(int32 num) +{ + MovieStunts += num; +} + +void CStats::NumOfAssassinations(int32 num) +{ + Assassinations += num; +} + +void CStats::NumOfPizzasDelivered(int32 num) +{ + PizzasDelivered += num; +} + +void CStats::NumOfGarbagePickups(int32 num) +{ + GarbagePickups += num; +} + +void CStats::NumOfIceCreamSold(int32 num) +{ + IceCreamSold += num; +} + +void CStats::AddNumBloodRingKills(int32 num) +{ + BloodRingKills += num; +} + +void CStats::LongestTimeInBloodRing(int32 time) +{ + if (BloodRingTime < time) + BloodRingTime = time; +} + +void CStats::AddPropertyAsOwned(int32 id) +{ + if (!PropertyOwned[id]) { + PropertyOwned[id] = true; + ++NumPropertyOwned; + } +} + void CStats::SaveStats(uint8 *buf, uint32 *size) { CheckPointReachedSuccessfully(); @@ -278,18 +452,23 @@ void CStats::SaveStats(uint8 *buf, uint32 *size) *size = sizeof(PeopleKilledByPlayer) + sizeof(PeopleKilledByOthers) + sizeof(CarsExploded) + + sizeof(BoatsExploded) + + sizeof(TyresPopped) + sizeof(RoundsFiredByPlayer) + sizeof(PedsKilledOfThisType) + sizeof(HelisDestroyed) + sizeof(ProgressMade) + sizeof(TotalProgressInGame) + sizeof(KgsOfExplosivesUsed) + - sizeof(InstantHitsFiredByPlayer) + - sizeof(InstantHitsHitByPlayer) + + sizeof(BulletsThatHit) + sizeof(HeadsPopped) + + sizeof(WantedStarsAttained) + + sizeof(WantedStarsEvaded) + sizeof(TimesArrested) + sizeof(TimesDied) + sizeof(DaysPassed) + + sizeof(SafeHouseVisits) + + sizeof(Sprayings) + sizeof(MaximumJumpDistance) + sizeof(MaximumJumpHeight) + sizeof(MaximumJumpFlips) + @@ -298,50 +477,88 @@ void CStats::SaveStats(uint8 *buf, uint32 *size) sizeof(NumberOfUniqueJumpsFound) + sizeof(TotalNumberOfUniqueJumps) + sizeof(MissionsGiven) + - sizeof(MissionsPassed) + sizeof(PassengersDroppedOffWithTaxi) + sizeof(MoneyMadeWithTaxi) + sizeof(IndustrialPassed) + sizeof(CommercialPassed) + sizeof(SuburbanPassed) + - sizeof(ElBurroTime) + + sizeof(PamphletMissionPassed) + + sizeof(NoMoreHurricanes) + sizeof(DistanceTravelledOnFoot) + - sizeof(DistanceTravelledInVehicle) + - sizeof(Record4x4One) + - sizeof(Record4x4Two) + - sizeof(Record4x4Three) + - sizeof(Record4x4Mayhem) + + sizeof(DistanceTravelledByCar) + + sizeof(DistanceTravelledByBike) + + sizeof(DistanceTravelledByBoat) + + sizeof(DistanceTravelledByGolfCart) + + sizeof(DistanceTravelledByHelicoptor) + + sizeof(DistanceTravelledByPlane) + sizeof(LivesSavedWithAmbulance) + sizeof(CriminalsCaught) + - sizeof(HighestLevelAmbulanceMission) + sizeof(FiresExtinguished) + - sizeof(TimeTakenDefuseMission) + + sizeof(HighestLevelVigilanteMission) + + sizeof(HighestLevelAmbulanceMission) + + sizeof(HighestLevelFireMission) + + sizeof(PhotosTaken) + sizeof(NumberKillFrenziesPassed) + sizeof(TotalNumberKillFrenzies) + sizeof(TotalNumberMissions) + + sizeof(FlightTime) + + sizeof(TimesDrowned) + + sizeof(SeagullsKilled) + + sizeof(WeaponBudget) + + sizeof(FashionBudget) + + sizeof(LoanSharks) + + sizeof(StoresKnockedOff) + + sizeof(MovieStunts) + + sizeof(Assassinations) + + sizeof(PizzasDelivered) + + sizeof(GarbagePickups) + + sizeof(IceCreamSold) + + sizeof(TopShootingRangeScore) + + sizeof(ShootingRank) + + sizeof(LongestWheelie) + + sizeof(LongestStoppie) + + sizeof(Longest2Wheel) + + sizeof(LongestWheelieDist) + + sizeof(LongestStoppieDist) + + sizeof(Longest2WheelDist) + + sizeof(PropertyBudget) + + sizeof(AutoPaintingBudget) + + sizeof(PropertyDestroyed) + + sizeof(NumPropertyOwned) + + sizeof(BloodRingKills) + + sizeof(BloodRingTime) + + sizeof(PropertyOwned) + + sizeof(HighestChaseValue) + sizeof(FastestTimes) + sizeof(HighestScores) + sizeof(BestPositions) + sizeof(KillsSinceLastCheckpoint) + sizeof(TotalLegitimateKills) + - sizeof(LastMissionPassedName); + sizeof(LastMissionPassedName) + + sizeof(CheatedCount) + + sizeof(FavoriteRadioStationList); #define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data); CopyToBuf(buf, PeopleKilledByPlayer); CopyToBuf(buf, PeopleKilledByOthers); CopyToBuf(buf, CarsExploded); + CopyToBuf(buf, BoatsExploded); + CopyToBuf(buf, TyresPopped); CopyToBuf(buf, RoundsFiredByPlayer); CopyToBuf(buf, PedsKilledOfThisType); CopyToBuf(buf, HelisDestroyed); CopyToBuf(buf, ProgressMade); CopyToBuf(buf, TotalProgressInGame); CopyToBuf(buf, KgsOfExplosivesUsed); - CopyToBuf(buf, InstantHitsFiredByPlayer); - CopyToBuf(buf, InstantHitsHitByPlayer); + CopyToBuf(buf, BulletsThatHit); CopyToBuf(buf, HeadsPopped); + CopyToBuf(buf, WantedStarsAttained); + CopyToBuf(buf, WantedStarsEvaded); CopyToBuf(buf, TimesArrested); CopyToBuf(buf, TimesDied); CopyToBuf(buf, DaysPassed); + CopyToBuf(buf, SafeHouseVisits); + CopyToBuf(buf, Sprayings); CopyToBuf(buf, MaximumJumpDistance); CopyToBuf(buf, MaximumJumpHeight); CopyToBuf(buf, MaximumJumpFlips); @@ -350,33 +567,67 @@ void CStats::SaveStats(uint8 *buf, uint32 *size) CopyToBuf(buf, NumberOfUniqueJumpsFound); CopyToBuf(buf, TotalNumberOfUniqueJumps); CopyToBuf(buf, MissionsGiven); - CopyToBuf(buf, MissionsPassed); CopyToBuf(buf, PassengersDroppedOffWithTaxi); CopyToBuf(buf, MoneyMadeWithTaxi); CopyToBuf(buf, IndustrialPassed); CopyToBuf(buf, CommercialPassed); CopyToBuf(buf, SuburbanPassed); - CopyToBuf(buf, ElBurroTime); + CopyToBuf(buf, PamphletMissionPassed); + CopyToBuf(buf, NoMoreHurricanes); CopyToBuf(buf, DistanceTravelledOnFoot); - CopyToBuf(buf, DistanceTravelledInVehicle); - CopyToBuf(buf, Record4x4One); - CopyToBuf(buf, Record4x4Two); - CopyToBuf(buf, Record4x4Three); - CopyToBuf(buf, Record4x4Mayhem); + CopyToBuf(buf, DistanceTravelledByCar); + CopyToBuf(buf, DistanceTravelledByBike); + CopyToBuf(buf, DistanceTravelledByBoat); + CopyToBuf(buf, DistanceTravelledByGolfCart); + CopyToBuf(buf, DistanceTravelledByHelicoptor); + CopyToBuf(buf, DistanceTravelledByPlane); CopyToBuf(buf, LivesSavedWithAmbulance); CopyToBuf(buf, CriminalsCaught); - CopyToBuf(buf, HighestLevelAmbulanceMission); CopyToBuf(buf, FiresExtinguished); - CopyToBuf(buf, TimeTakenDefuseMission); + CopyToBuf(buf, HighestLevelVigilanteMission); + CopyToBuf(buf, HighestLevelAmbulanceMission); + CopyToBuf(buf, HighestLevelFireMission); + CopyToBuf(buf, PhotosTaken); CopyToBuf(buf, NumberKillFrenziesPassed); CopyToBuf(buf, TotalNumberKillFrenzies); CopyToBuf(buf, TotalNumberMissions); + CopyToBuf(buf, FlightTime); + CopyToBuf(buf, TimesDrowned); + CopyToBuf(buf, SeagullsKilled); + CopyToBuf(buf, WeaponBudget); + CopyToBuf(buf, FashionBudget); + CopyToBuf(buf, LoanSharks); + CopyToBuf(buf, StoresKnockedOff); + CopyToBuf(buf, MovieStunts); + CopyToBuf(buf, Assassinations); + CopyToBuf(buf, PizzasDelivered); + CopyToBuf(buf, GarbagePickups); + CopyToBuf(buf, IceCreamSold); + CopyToBuf(buf, TopShootingRangeScore); + CopyToBuf(buf, ShootingRank); + CopyToBuf(buf, LongestWheelie); + CopyToBuf(buf, LongestStoppie); + CopyToBuf(buf, Longest2Wheel); + CopyToBuf(buf, LongestWheelieDist); + CopyToBuf(buf, LongestStoppieDist); + CopyToBuf(buf, Longest2WheelDist); + CopyToBuf(buf, PropertyBudget); + CopyToBuf(buf, AutoPaintingBudget); + CopyToBuf(buf, PropertyDestroyed); + CopyToBuf(buf, NumPropertyOwned); + CopyToBuf(buf, BloodRingKills); + CopyToBuf(buf, BloodRingTime); + CopyToBuf(buf, PropertyOwned); + CopyToBuf(buf, HighestChaseValue); CopyToBuf(buf, FastestTimes); CopyToBuf(buf, HighestScores); CopyToBuf(buf, BestPositions); CopyToBuf(buf, KillsSinceLastCheckpoint); CopyToBuf(buf, TotalLegitimateKills); CopyToBuf(buf, LastMissionPassedName); + CopyToBuf(buf, CheatedCount); + // TODO(Miami): Set favourite radio stations!! + CopyToBuf(buf, FavoriteRadioStationList); assert(buf - buf_start == *size); #undef CopyToBuf @@ -391,18 +642,23 @@ void CStats::LoadStats(uint8 *buf, uint32 size) CopyFromBuf(buf, PeopleKilledByPlayer); CopyFromBuf(buf, PeopleKilledByOthers); CopyFromBuf(buf, CarsExploded); + CopyFromBuf(buf, BoatsExploded); + CopyFromBuf(buf, TyresPopped); CopyFromBuf(buf, RoundsFiredByPlayer); CopyFromBuf(buf, PedsKilledOfThisType); CopyFromBuf(buf, HelisDestroyed); CopyFromBuf(buf, ProgressMade); CopyFromBuf(buf, TotalProgressInGame); CopyFromBuf(buf, KgsOfExplosivesUsed); - CopyFromBuf(buf, InstantHitsFiredByPlayer); - CopyFromBuf(buf, InstantHitsHitByPlayer); + CopyFromBuf(buf, BulletsThatHit); CopyFromBuf(buf, HeadsPopped); + CopyFromBuf(buf, WantedStarsAttained); + CopyFromBuf(buf, WantedStarsEvaded); CopyFromBuf(buf, TimesArrested); CopyFromBuf(buf, TimesDied); CopyFromBuf(buf, DaysPassed); + CopyFromBuf(buf, SafeHouseVisits); + CopyFromBuf(buf, Sprayings); CopyFromBuf(buf, MaximumJumpDistance); CopyFromBuf(buf, MaximumJumpHeight); CopyFromBuf(buf, MaximumJumpFlips); @@ -411,33 +667,66 @@ void CStats::LoadStats(uint8 *buf, uint32 size) CopyFromBuf(buf, NumberOfUniqueJumpsFound); CopyFromBuf(buf, TotalNumberOfUniqueJumps); CopyFromBuf(buf, MissionsGiven); - CopyFromBuf(buf, MissionsPassed); CopyFromBuf(buf, PassengersDroppedOffWithTaxi); CopyFromBuf(buf, MoneyMadeWithTaxi); CopyFromBuf(buf, IndustrialPassed); CopyFromBuf(buf, CommercialPassed); CopyFromBuf(buf, SuburbanPassed); - CopyFromBuf(buf, ElBurroTime); + CopyFromBuf(buf, PamphletMissionPassed); + CopyFromBuf(buf, NoMoreHurricanes); CopyFromBuf(buf, DistanceTravelledOnFoot); - CopyFromBuf(buf, DistanceTravelledInVehicle); - CopyFromBuf(buf, Record4x4One); - CopyFromBuf(buf, Record4x4Two); - CopyFromBuf(buf, Record4x4Three); - CopyFromBuf(buf, Record4x4Mayhem); + CopyFromBuf(buf, DistanceTravelledByCar); + CopyFromBuf(buf, DistanceTravelledByBike); + CopyFromBuf(buf, DistanceTravelledByBoat); + CopyFromBuf(buf, DistanceTravelledByGolfCart); + CopyFromBuf(buf, DistanceTravelledByHelicoptor); + CopyFromBuf(buf, DistanceTravelledByPlane); CopyFromBuf(buf, LivesSavedWithAmbulance); CopyFromBuf(buf, CriminalsCaught); - CopyFromBuf(buf, HighestLevelAmbulanceMission); CopyFromBuf(buf, FiresExtinguished); - CopyFromBuf(buf, TimeTakenDefuseMission); + CopyFromBuf(buf, HighestLevelVigilanteMission); + CopyFromBuf(buf, HighestLevelAmbulanceMission); + CopyFromBuf(buf, HighestLevelFireMission); + CopyFromBuf(buf, PhotosTaken); CopyFromBuf(buf, NumberKillFrenziesPassed); CopyFromBuf(buf, TotalNumberKillFrenzies); CopyFromBuf(buf, TotalNumberMissions); + CopyFromBuf(buf, FlightTime); + CopyFromBuf(buf, TimesDrowned); + CopyFromBuf(buf, SeagullsKilled); + CopyFromBuf(buf, WeaponBudget); + CopyFromBuf(buf, FashionBudget); + CopyFromBuf(buf, LoanSharks); + CopyFromBuf(buf, StoresKnockedOff); + CopyFromBuf(buf, MovieStunts); + CopyFromBuf(buf, Assassinations); + CopyFromBuf(buf, PizzasDelivered); + CopyFromBuf(buf, GarbagePickups); + CopyFromBuf(buf, IceCreamSold); + CopyFromBuf(buf, TopShootingRangeScore); + CopyFromBuf(buf, ShootingRank); + CopyFromBuf(buf, LongestWheelie); + CopyFromBuf(buf, LongestStoppie); + CopyFromBuf(buf, Longest2Wheel); + CopyFromBuf(buf, LongestWheelieDist); + CopyFromBuf(buf, LongestStoppieDist); + CopyFromBuf(buf, Longest2WheelDist); + CopyFromBuf(buf, PropertyBudget); + CopyFromBuf(buf, AutoPaintingBudget); + CopyFromBuf(buf, PropertyDestroyed); + CopyFromBuf(buf, NumPropertyOwned); + CopyFromBuf(buf, BloodRingKills); + CopyFromBuf(buf, BloodRingTime); + CopyFromBuf(buf, PropertyOwned); + CopyFromBuf(buf, HighestChaseValue); CopyFromBuf(buf, FastestTimes); CopyFromBuf(buf, HighestScores); CopyFromBuf(buf, BestPositions); CopyFromBuf(buf, KillsSinceLastCheckpoint); CopyFromBuf(buf, TotalLegitimateKills); CopyFromBuf(buf, LastMissionPassedName); + CopyFromBuf(buf, CheatedCount); + CopyFromBuf(buf, FavoriteRadioStationList); assert(buf - buf_start == size); #undef CopyFromBuf diff --git a/src/core/Stats.h b/src/core/Stats.h index e6b8df6a..f9ad4174 100644 --- a/src/core/Stats.h +++ b/src/core/Stats.h @@ -1,6 +1,7 @@ #pragma once #include "PedType.h" +#include "audio_enums.h" class CStats { @@ -8,11 +9,10 @@ public: enum { TOTAL_FASTEST_TIMES = 23, TOTAL_HIGHEST_SCORES = 5, - TOTAL_BEST_POSITIONS = 1 + TOTAL_BEST_POSITIONS = 1, + TOTAL_PROPERTIES = 15 }; - //TODO static int32 SeagullsKilled; - static int32 DaysPassed; static int32 HeadsPopped; static int32 CommercialPassed; @@ -25,9 +25,29 @@ public: static int32 TimesDied; static int32 TimesArrested; static int32 KillsSinceLastCheckpoint; - static float DistanceTravelledInVehicle; + static float DistanceTravelledByCar; + static float DistanceTravelledByHelicoptor; + static float DistanceTravelledByBike; + static float DistanceTravelledByBoat; + static float DistanceTravelledByPlane; + static float DistanceTravelledByGolfCart; static float DistanceTravelledOnFoot; + static int32 FlightTime; + static int32 TimesDrowned; + static int32 PhotosTaken; + static float LoanSharks; + static float StoresKnockedOff; + static float MovieStunts; + static float Assassinations; + static float PizzasDelivered; + static float GarbagePickups; + static float IceCreamSold; + static float TopShootingRangeScore; + static float ShootingRank; static int32 CarsExploded; + static int32 BoatsExploded; + static int32 WantedStarsAttained; + static int32 WantedStarsEvaded; static int32 PeopleKilledByPlayer; static int32 ProgressMade; static int32 TotalProgressInGame; @@ -44,51 +64,60 @@ public: static int32 MissionsPassed; static char LastMissionPassedName[8]; static int32 TotalLegitimateKills; - static int32 ElBurroTime; - static int32 Record4x4One; - static int32 Record4x4Two; - static int32 Record4x4Three; - static int32 Record4x4Mayhem; static int32 LivesSavedWithAmbulance; static int32 CriminalsCaught; static int32 HighestLevelAmbulanceMission; + static int32 HighestLevelVigilanteMission; + static int32 HighestLevelFireMission; static int32 FiresExtinguished; - static int32 TimeTakenDefuseMission; static int32 TotalNumberKillFrenzies; static int32 TotalNumberMissions; static int32 RoundsFiredByPlayer; static int32 KgsOfExplosivesUsed; - static int32 InstantHitsFiredByPlayer; - static int32 InstantHitsHitByPlayer; + static int32 BulletsThatHit; static int32 BestTimeBombDefusal; static int32 FastestTimes[TOTAL_FASTEST_TIMES]; static int32 HighestScores[TOTAL_HIGHEST_SCORES]; static int32 BestPositions[TOTAL_BEST_POSITIONS]; + static bool PropertyOwned[TOTAL_PROPERTIES]; + static int32 NumPropertyOwned; static int32 PropertyDestroyed; + static float HighestChaseValue; + static int32 CheatedCount; + static int32 ShowChaseStatOnScreen; static int32 PamphletMissionPassed; + static bool abSonyCDs[1]; + static int32 BloodRingKills; + static int32 BloodRingTime; + static float FavoriteRadioStationList[NUM_RADIOS]; static int32 Sprayings; static float AutoPaintingBudget; static int32 NoMoreHurricanes; static float FashionBudget; + static float PropertyBudget; + static float WeaponBudget; static int32 SafeHouseVisits; static int32 TyresPopped; + static int32 LongestWheelie; + static int32 LongestStoppie; + static int32 Longest2Wheel; + static float LongestWheelieDist; + static float LongestStoppieDist; + static float Longest2WheelDist; + public: static void Init(void); static void RegisterFastestTime(int32, int32); static void RegisterHighestScore(int32, int32); static void RegisterBestPosition(int32, int32); - static void RegisterElBurroTime(int32); - static void Register4x4OneTime(int32); - static void Register4x4TwoTime(int32); - static void Register4x4ThreeTime(int32); - static void Register4x4MayhemTime(int32); static void AnotherLifeSavedWithAmbulance(); static void AnotherCriminalCaught(); static void RegisterLevelAmbulanceMission(int32); + static void RegisterLevelVigilanteMission(int32); + static void RegisterLevelFireMission(int32); static void AnotherFireExtinguished(); static wchar *FindCriminalRatingString(); - static void RegisterTimeTakenDefuseMission(int32); static void AnotherKillFrenzyPassed(); static void SetTotalNumberKillFrenzies(int32); static void SetTotalNumberMissions(int32); @@ -99,5 +128,20 @@ public: static void LoadStats(uint8 *buf, uint32 size); static float GetPercentageProgress(); + static void MoneySpentOnWeapons(int32); + static void MoneySpentOnProperty(int32); + static void MoneySpentOnAutoPainting(int32); static void MoneySpentOnFashion(int32); + + static void NumOfVisitsFromLoanSharks(int32); + static void NumOfStoresKnockedOff(int32); + static void NumOfMovieStunts(int32); + static void NumOfAssassinations(int32); + static void NumOfPizzasDelivered(int32); + static void NumOfGarbagePickups(int32); + static void NumOfIceCreamSold(int32); + static void AddNumBloodRingKills(int32); + + static void LongestTimeInBloodRing(int32); + static void AddPropertyAsOwned(int32); }; diff --git a/src/core/Wanted.cpp b/src/core/Wanted.cpp index c70a3ab5..f5ea6e53 100644 --- a/src/core/Wanted.cpp +++ b/src/core/Wanted.cpp @@ -10,6 +10,7 @@ #include "CopPed.h" #include "Wanted.h" #include "General.h" +#include "Stats.h" int32 CWanted::MaximumWantedLevel = 6; int32 CWanted::nMaximumWantedLevel = 9600; @@ -308,7 +309,6 @@ CWanted::ReportCrimeNow(eCrimeType type, const CVector &coors, bool policeDoesnt UpdateWantedLevel(); } -// TODO(Miami): Stats void CWanted::UpdateWantedLevel() { @@ -318,36 +318,44 @@ CWanted::UpdateWantedLevel() m_nChaos = nMaximumWantedLevel; if (m_nChaos >= 0 && m_nChaos < 50) { + if (m_nWantedLevel == 1) + ++CStats::WantedStarsEvaded; m_nWantedLevel = 0; m_MaximumLawEnforcerVehicles = 0; m_MaxCops = 0; m_RoadblockDensity = 0; } else if (m_nChaos >= 50 && m_nChaos < 180) { + CStats::WantedStarsAttained += 1 - m_nWantedLevel; m_nWantedLevel = 1; m_MaximumLawEnforcerVehicles = 1; m_MaxCops = 1; m_RoadblockDensity = 0; } else if (m_nChaos >= 180 && m_nChaos < 550) { + CStats::WantedStarsAttained += 2 - m_nWantedLevel; m_nWantedLevel = 2; m_MaximumLawEnforcerVehicles = 2; m_MaxCops = 3; m_RoadblockDensity = 0; } else if (m_nChaos >= 550 && m_nChaos < 1200) { + CStats::WantedStarsAttained += 3 - m_nWantedLevel; m_nWantedLevel = 3; m_MaximumLawEnforcerVehicles = 2; m_MaxCops = 4; m_RoadblockDensity = 12; } else if (m_nChaos >= 1200 && m_nChaos < 2400) { + CStats::WantedStarsAttained += 4 - m_nWantedLevel; m_nWantedLevel = 4; m_MaximumLawEnforcerVehicles = 2; m_MaxCops = 6; m_RoadblockDensity = 18; } else if (m_nChaos >= 2400 && m_nChaos < 4800) { + CStats::WantedStarsAttained += 5 - m_nWantedLevel; m_nWantedLevel = 5; m_MaximumLawEnforcerVehicles = 3; m_MaxCops = 8; m_RoadblockDensity = 24; } else if (m_nChaos >= 4800) { + CStats::WantedStarsAttained += 6 - m_nWantedLevel; m_nWantedLevel = 6; m_MaximumLawEnforcerVehicles = 3; m_MaxCops = 10; @@ -494,8 +502,7 @@ CWanted::UpdateCrimesQ(void) void CWanted::Suspend(void) { - // TODO(Miami): Stats - // dwStarsEvaded += m_nWantedLevel; + CStats::WantedStarsEvaded += m_nWantedLevel; m_nMinChaos = m_nChaos; m_nMinWantedLevel = m_nWantedLevel; m_nLastTimeSuspended = CTimer::GetTimeInMilliseconds(); diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 34fbb428..51995cf5 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -439,7 +439,7 @@ DebugMenuPopulate(void) DebugMenuEntrySetWrap(e, true); e = DebugMenuAddVar("Time & Weather", "New Weather", (int16*)&CWeather::NewWeatherType, nil, 1, 0, 5, weathers); DebugMenuEntrySetWrap(e, true); - DebugMenuAddVarBool8("Time & Weather", "Extracolours On", &CTimeCycle::m_bExtraColourOn, nil); + DebugMenuAddVarBool32("Time & Weather", "Extracolours On", &CTimeCycle::m_bExtraColourOn, nil); DebugMenuAddVar("Time & Weather", "Extracolour", &CTimeCycle::m_ExtraColour, nil, 1, 0, 23, extracols); DebugMenuAddVar("Time & Weather", "Time scale", (float*)&CTimer::GetTimeScale(), nil, 0.1f, 0.0f, 10.0f); diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 26c91abb..be8b28e3 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -4730,9 +4730,11 @@ CPed::InflictDamage(CEntity *damagedBy, eWeaponType method, float damage, ePedPi } else { CDarkel::RegisterKillNotByPlayer(this, method); } - if (method == WEAPONTYPE_DROWNING) + if (method == WEAPONTYPE_DROWNING) { bIsInTheAir = false; - // TODO(Miami): timesDrowned + if (FindPlayerPed() == this) + CStats::TimesDrowned++; + } return true; } diff --git a/src/render/SpecialFX.cpp b/src/render/SpecialFX.cpp index 4133e2fb..e9079bef 100644 --- a/src/render/SpecialFX.cpp +++ b/src/render/SpecialFX.cpp @@ -21,6 +21,9 @@ #include "Camera.h" #include "Shadows.h" #include "main.h" +#include "ColStore.h" +#include "Coronas.h" +#include "Script.h" RwIm3DVertex StreakVertices[4]; RwImVertexIndex StreakIndexList[12]; @@ -370,6 +373,8 @@ MarkerAtomicCB(RpAtomic *atomic, void *data) return atomic; } +// --MIAMI: C3dMarker and C3dMarkers done + bool C3dMarker::AddMarker(uint32 identifier, uint16 type, float fSize, uint8 r, uint8 g, uint8 b, uint8 a, uint16 pulsePeriod, float pulseFraction, int16 rotateRate) { @@ -414,6 +419,7 @@ C3dMarker::DeleteMarkerObject() m_nIdentifier = 0; m_nStartTime = 0; m_bIsUsed = false; + m_bFindZOnNextPlacement = false; m_nType = MARKERTYPE_INVALID; frame = RpAtomicGetFrame(m_pAtomic); @@ -457,6 +463,7 @@ C3dMarkers::Init() m_aMarkerArray[i].m_pAtomic = nil; m_aMarkerArray[i].m_nType = MARKERTYPE_INVALID; m_aMarkerArray[i].m_bIsUsed = false; + m_aMarkerArray[i].m_bFindZOnNextPlacement = false; m_aMarkerArray[i].m_nIdentifier = 0; m_aMarkerArray[i].m_Color.red = 255; m_aMarkerArray[i].m_Color.green = 255; @@ -502,8 +509,15 @@ C3dMarkers::Render() ActivateDirectional(); for (int i = 0; i < NUM3DMARKERS; i++) { if (m_aMarkerArray[i].m_bIsUsed) { - if (m_aMarkerArray[i].m_fCameraRange < 120.0f) + if (m_aMarkerArray[i].m_fCameraRange < 150.0f) { m_aMarkerArray[i].Render(); + if (m_aMarkerArray[i].m_nType == MARKERTYPE_ARROW) { + CCoronas::RegisterCorona((uintptr)&m_aMarkerArray[i], + SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, 192, + m_aMarkerArray[i].m_Matrix.GetPosition(), 1.2f * m_aMarkerArray[i].m_fSize, 50.0f * TheCamera.LODDistMultiplier, + CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f, false); + } + } NumActiveMarkers++; m_aMarkerArray[i].m_bIsUsed = false; } else if (m_aMarkerArray[i].m_pAtomic != nil) { @@ -516,9 +530,9 @@ C3dMarker * C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size, uint8 r, uint8 g, uint8 b, uint8 a, uint16 pulsePeriod, float pulseFraction, int16 rotateRate) { C3dMarker *pMarker; - + CVector2D playerPos = FindPlayerCentreOfWorld(0); pMarker = nil; - float dist = Sqrt((pos.x - FindPlayerCentreOfWorld(0).x) * (pos.x - FindPlayerCentreOfWorld(0).x) + (pos.y - FindPlayerCentreOfWorld(0).y) * (pos.y - FindPlayerCentreOfWorld(0).y)); + float dist = ((CVector2D)pos - playerPos).Magnitude(); if (type != MARKERTYPE_ARROW && type != MARKERTYPE_CYLINDER) return nil; @@ -591,6 +605,15 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size } if (type == MARKERTYPE_ARROW) pMarker->m_Matrix.GetPosition() = pos; + + if (pMarker->m_bFindZOnNextPlacement) { + if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(CVector2D(pos))) { + float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil); + if (z != 0.0f) + pMarker->m_Matrix.GetPosition().z = z - 0.05f * size; + pMarker->m_bFindZOnNextPlacement = false; + } + } pMarker->m_bIsUsed = true; return pMarker; } @@ -600,9 +623,14 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size pMarker->AddMarker(identifier, type, size, r, g, b, a, pulsePeriod, pulseFraction, rotateRate); if (type == MARKERTYPE_CYLINDER || type == MARKERTYPE_0 || type == MARKERTYPE_2) { - float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil); - if (z != 0.0f) - pos.z = z - 0.05f * size; + if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(CVector2D(pos))) { + float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil); + if (z != 0.0f) + pos.z = z - 0.05f * size; + pMarker->m_bFindZOnNextPlacement = false; + } else { + pMarker->m_bFindZOnNextPlacement = true; + } } pMarker->m_Matrix.SetTranslate(pos.x, pos.y, pos.z); if (type == MARKERTYPE_2) { diff --git a/src/render/SpecialFX.h b/src/render/SpecialFX.h index 7bc3750a..8c79856b 100644 --- a/src/render/SpecialFX.h +++ b/src/render/SpecialFX.h @@ -79,6 +79,7 @@ public: RpMaterial *m_pMaterial; uint16 m_nType; bool m_bIsUsed; + bool m_bFindZOnNextPlacement; uint32 m_nIdentifier; RwRGBA m_Color; uint16 m_nPulsePeriod; diff --git a/src/render/Timecycle.cpp b/src/render/Timecycle.cpp index 7e8ad5e5..b20a2443 100644 --- a/src/render/Timecycle.cpp +++ b/src/render/Timecycle.cpp @@ -123,7 +123,7 @@ int32 CTimeCycle::m_nCurrentFogColourGreen; int32 CTimeCycle::m_nCurrentFogColourBlue; int32 CTimeCycle::m_FogReduction; -bool CTimeCycle::m_bExtraColourOn; +int32 CTimeCycle::m_bExtraColourOn; int32 CTimeCycle::m_ExtraColour; float CTimeCycle::m_ExtraColourInter; diff --git a/src/render/Timecycle.h b/src/render/Timecycle.h index ad079a95..da911b75 100644 --- a/src/render/Timecycle.h +++ b/src/render/Timecycle.h @@ -114,7 +114,7 @@ class CTimeCycle static int32 m_FogReduction; public: - static bool m_bExtraColourOn; + static int32 m_bExtraColourOn; static int32 m_ExtraColour; static float m_ExtraColourInter; static int32 m_CurrentStoredValue; diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 52c1aef7..61a32a8d 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -37,9 +37,10 @@ #include "Weather.h" #include "World.h" #include "Zones.h" +#include "Timecycle.h" #define BLOCK_COUNT 20 -#define SIZE_OF_SIMPLEVARS 0xBC +#define SIZE_OF_SIMPLEVARS 0xD4 const uint32 SIZE_OF_ONE_GAME_IN_BYTES = 201729; @@ -187,6 +188,14 @@ GenericSave(int file) WriteDataToBufferPointer(buf, TheCamera.CarZoomIndicator); WriteDataToBufferPointer(buf, TheCamera.PedZoomIndicator); #endif + WriteDataToBufferPointer(buf, CGame::currArea); + WriteDataToBufferPointer(buf, CVehicle::bAllTaxisHaveNitro); + // TODO(Miami): Pad invert Y + bool invertY = 0; + WriteDataToBufferPointer(buf, invertY); + WriteDataToBufferPointer(buf, CTimeCycle::m_ExtraColour); + WriteDataToBufferPointer(buf, CTimeCycle::m_bExtraColourOn); + WriteDataToBufferPointer(buf, CTimeCycle::m_ExtraColourInter); assert(buf - work_buff == SIZE_OF_SIMPLEVARS); // Save scripts, block is nested within the same block as simple vars for some reason @@ -315,6 +324,14 @@ GenericLoad() ReadDataFromBufferPointer(buf, TheCamera.CarZoomIndicator); ReadDataFromBufferPointer(buf, TheCamera.PedZoomIndicator); #endif + ReadDataFromBufferPointer(buf, CGame::currArea); + ReadDataFromBufferPointer(buf, CVehicle::bAllTaxisHaveNitro); + // TODO(Miami): Pad invert Y + bool invertY = 0; + ReadDataFromBufferPointer(buf, invertY); + ReadDataFromBufferPointer(buf, CTimeCycle::m_ExtraColour); + ReadDataFromBufferPointer(buf, CTimeCycle::m_bExtraColourOn); + ReadDataFromBufferPointer(buf, CTimeCycle::m_ExtraColourInter); assert(buf - work_buff == SIZE_OF_SIMPLEVARS); #ifdef MISSION_REPLAY WaitForSave = 0; diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 0d8361b8..d94f2e80 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -1390,7 +1390,7 @@ WinMain(HINSTANCE instance, RwChar** argv; SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE); -#if 0 +#if 1 // TODO: make this an option somewhere AllocConsole(); freopen("CONIN$", "r", stdin); diff --git a/src/weapons/BulletInfo.cpp b/src/weapons/BulletInfo.cpp index 41d9c730..0efe6688 100644 --- a/src/weapons/BulletInfo.cpp +++ b/src/weapons/BulletInfo.cpp @@ -113,7 +113,7 @@ void CBulletInfo::Update(void) CEntity* pHitEntity; if (CWorld::ProcessLineOfSight(vecOldPos, vecNewPos, point, pHitEntity, true, true, true, true, true, false, false, true)) { if (pBullet->m_pSource && (pHitEntity->IsPed() || pHitEntity->IsVehicle())) - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; CWeapon::CheckForShootingVehicleOccupant(&pHitEntity, &point, pBullet->m_eWeaponType, vecOldPos, vecNewPos); if (pHitEntity->IsPed()) { diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp index 8e7e4265..0cd439c2 100644 --- a/src/weapons/Weapon.cpp +++ b/src/weapons/Weapon.cpp @@ -1466,20 +1466,20 @@ CWeapon::DoBulletImpact(CEntity *shooter, CEntity *victim, } case ENTITY_TYPE_VEHICLE: { - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; DMAudio.PlayOneShot(((CPhysical*)victim)->m_audioEntityId, SOUND_WEAPON_HIT_VEHICLE, 1.0f); break; } case ENTITY_TYPE_PED: { - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; DMAudio.PlayOneShot(((CPhysical*)victim)->m_audioEntityId, SOUND_WEAPON_HIT_PED, 1.0f); ((CPed*)victim)->Say(SOUND_PED_BULLET_HIT); break; } case ENTITY_TYPE_OBJECT: { - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; PlayOneShotScriptObject(SCRIPT_SOUND_BULLET_HIT_GROUND_2, point->point); break; } @@ -1862,7 +1862,7 @@ CWeapon::FireShotgun(CEntity *shooter, CVector *fireSource) case ENTITY_TYPE_VEHICLE: { if (!statUpdated) { - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; statUpdated = true; } DMAudio.PlayOneShot(((CPhysical*)victim)->m_audioEntityId, SOUND_WEAPON_HIT_VEHICLE, 1.0f); @@ -1871,7 +1871,7 @@ CWeapon::FireShotgun(CEntity *shooter, CVector *fireSource) case ENTITY_TYPE_PED: { if (!statUpdated) { - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; statUpdated = true; } DMAudio.PlayOneShot(((CPhysical*)victim)->m_audioEntityId, SOUND_WEAPON_HIT_PED, 1.0f); @@ -1881,7 +1881,7 @@ CWeapon::FireShotgun(CEntity *shooter, CVector *fireSource) case ENTITY_TYPE_OBJECT: { if (!statUpdated) { - CStats::InstantHitsHitByPlayer++; + CStats::BulletsThatHit++; statUpdated = true; } PlayOneShotScriptObject(SCRIPT_SOUND_BULLET_HIT_GROUND_2, point.point); @@ -2070,9 +2070,6 @@ CWeapon::FireSniper(CEntity *shooter) CBulletInfo::AddBullet(shooter, m_eWeaponType, source, dir); - if ( shooter == FindPlayerPed() ) - CStats::InstantHitsFiredByPlayer++; - if ( shooter == FindPlayerPed() ) { CPad::GetPad(0)->StartShake_Distance(240, 128, From 80a83d48f3177c401c2a173f4aacb55794ac2fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Fri, 14 Aug 2020 02:41:18 +0300 Subject: [PATCH 047/112] Guardian Angels fix --- src/peds/Ped.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index be8b28e3..d009579c 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -3160,6 +3160,8 @@ CPed::SetStoredObjective(void) case OBJECTIVE_GOTO_CHAR_ON_FOOT: case OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING: case OBJECTIVE_HASSLE_CHAR: + case OBJECTIVE_FOLLOW_CHAR_IN_FORMATION: + case OBJECTIVE_LEAVE_CAR: case OBJECTIVE_ENTER_CAR_AS_PASSENGER: case OBJECTIVE_ENTER_CAR_AS_DRIVER: case OBJECTIVE_GOTO_AREA_ON_FOOT: From 2a0a508a10ca3154e8bdc60ffc466ad6797a4394 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 14 Aug 2020 09:27:30 +0200 Subject: [PATCH 048/112] fixed clouds render --- src/render/Clouds.cpp | 84 ++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/src/render/Clouds.cpp b/src/render/Clouds.cpp index 60450213..05ddbcdc 100644 --- a/src/render/Clouds.cpp +++ b/src/render/Clouds.cpp @@ -78,6 +78,43 @@ CClouds::Update(void) #endif } +float StarCoorsX[9] = { 0.0f, 0.05f, 0.12f, 0.5f, 0.8f, 0.6f, 0.27f, 0.55f, 0.75f }; +float StarCoorsY[9] = { 0.0f, 0.45f, 0.9f, 1.0f, 0.85f, 0.52f, 0.48f, 0.35f, 0.2f }; +float StarSizes[9] = { 1.0f, 1.4f, 0.9f, 1.0f, 0.6f, 1.5f, 1.3f, 1.0f, 0.8f }; + +float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, 0.8f, -0.8f, 0.4f, -0.4f }; +float LowCloudsY[12] = { 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, 1.0f, 0.7f, 0.4f, 0.4f, -0.8f, -0.8f }; +float LowCloudsZ[12] = { 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.3f, 0.9f, 0.4f, 1.3f, 1.4f, 1.2f, 1.7f }; + +float CoorsOffsetX[37] = { + 0.0f, 60.0f, 72.0f, 48.0f, 21.0f, 12.0f, + 9.0f, -3.0f, -8.4f, -18.0f, -15.0f, -36.0f, + -40.0f, -48.0f, -60.0f, -24.0f, 100.0f, 100.0f, + 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, + 100.0f, 100.0f, -30.0f, -20.0f, 10.0f, 30.0f, + 0.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f +}; +float CoorsOffsetY[37] = { + 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, + 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, + 100.0f, 100.0f, 100.0f, 100.0f, -30.0f, 10.0f, + -25.0f, -5.0f, 28.0f, -10.0f, 10.0f, 0.0f, + 15.0f, 40.0f, -100.0f, -100.0f, -100.0f, -100.0f, + -100.0f, -40.0f, -20.0f, 0.0f, 10.0f, 30.0f, 35.0f +}; +float CoorsOffsetZ[37] = { + 2.0f, 1.0f, 0.0f, 0.3f, 0.7f, 1.4f, + 1.7f, 0.24f, 0.7f, 1.3f, 1.6f, 1.0f, + 1.2f, 0.3f, 0.7f, 1.4f, 0.0f, 0.1f, + 0.5f, 0.4f, 0.55f, 0.75f, 1.0f, 1.4f, + 1.7f, 2.0f, 2.0f, 2.3f, 1.9f, 2.4f, + 2.0f, 2.0f, 1.5f, 1.2f, 1.7f, 1.5f, 2.1f +}; + +uint8 BowRed[6] = { 30, 30, 30, 10, 0, 15 }; +uint8 BowGreen[6] = { 0, 15, 30, 30, 0, 0 }; +uint8 BowBlue[6] = { 0, 0, 0, 10, 30, 30 }; + void CClouds::Render(void) { @@ -98,11 +135,10 @@ CClouds::Render(void) int minute = CClock::GetHours()*60 + CClock::GetMinutes(); RwV3d campos = *(RwV3d*)&TheCamera.GetPosition(); - float coverage = Max(CWeather::Foggyness, CWeather::Foggyness); - // Moon int moonfadeout = Abs(minute - 180); // fully visible at 3AM if(moonfadeout < 180){ // fade in/out 3 hours + float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage); int brightness = (1.0f - coverage) * (180 - moonfadeout); RwV3d pos = { 0.0f, -100.0f, 15.0f }; RwV3dAdd(&worldpos, &campos, &pos); @@ -131,11 +167,10 @@ CClouds::Render(void) else if(CClock::GetHours() == 5) starintens = 255 * (60 - CClock::GetMinutes())/60.0f; if(starintens != 0){ - // R - static float StarCoorsX[9] = { 0.0f, 0.05f, 0.12f, 0.5f, 0.8f, 0.6f, 0.27f, 0.55f, 0.75f }; - static float StarCoorsY[9] = { 0.0f, 0.45f, 0.9f, 1.0f, 0.85f, 0.52f, 0.48f, 0.35f, 0.2f }; - static float StarSizes[9] = { 1.0f, 1.4f, 0.9f, 1.0f, 0.6f, 1.5f, 1.3f, 1.0f, 0.8f }; + float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage); int brightness = (1.0f - coverage) * starintens; + + // R RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0])); for(i = 0; i < 11; i++){ RwV3d pos = { 100.0f, 0.0f, 10.0f }; @@ -164,13 +199,7 @@ CClouds::Render(void) } // Low clouds - static float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f, - 0.0f, 0.7f, 0.8f, -0.8f, 0.4f, -0.4f }; - static float LowCloudsY[12] = { 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, - 1.0f, 0.7f, 0.4f, 0.4f, -0.8f, -0.8f }; - static float LowCloudsZ[12] = { 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.3f, - 0.9f, 0.4f, 1.3f, 1.4f, 1.2f, 1.7f }; - float lowcloudintensity = 1.0f - coverage; + float lowcloudintensity = 1.0f - Max(CWeather::Foggyness, CWeather::CloudCoverage); int r = CTimeCycle::GetLowCloudsRed() * lowcloudintensity; int g = CTimeCycle::GetLowCloudsGreen() * lowcloudintensity; int b = CTimeCycle::GetLowCloudsBlue() * lowcloudintensity; @@ -193,30 +222,6 @@ CClouds::Render(void) float rot_cos = Cos(CloudRotation); int fluffyalpha = 160 * (1.0f - CWeather::Foggyness); if(fluffyalpha != 0){ - static float CoorsOffsetX[37] = { - 0.0f, 60.0f, 72.0f, 48.0f, 21.0f, 12.0f, - 9.0f, -3.0f, -8.4f, -18.0f, -15.0f, -36.0f, - -40.0f, -48.0f, -60.0f, -24.0f, 100.0f, 100.0f, - 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, - 100.0f, 100.0f, -30.0f, -20.0f, 10.0f, 30.0f, - 0.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f - }; - static float CoorsOffsetY[37] = { - 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, - 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, - 100.0f, 100.0f, 100.0f, 100.0f, -30.0f, 10.0f, - -25.0f, -5.0f, 28.0f, -10.0f, 10.0f, 0.0f, - 15.0f, 40.0f, -100.0f, -100.0f, -100.0f, -100.0f, - -100.0f, -40.0f, -20.0f, 0.0f, 10.0f, 30.0f, 35.0f - }; - static float CoorsOffsetZ[37] = { - 2.0f, 1.0f, 0.0f, 0.3f, 0.7f, 1.4f, - 1.7f, 0.24f, 0.7f, 1.3f, 1.6f, 1.0f, - 1.2f, 0.3f, 0.7f, 1.4f, 0.0f, 0.1f, - 0.5f, 0.4f, 0.55f, 0.75f, 1.0f, 1.4f, - 1.7f, 2.0f, 2.0f, 2.3f, 1.9f, 2.4f, - 2.0f, 2.0f, 1.5f, 1.2f, 1.7f, 1.5f, 2.1f - }; static bool bCloudOnScreen[37]; float hilight; @@ -238,7 +243,7 @@ CClouds::Render(void) int bg = CTimeCycle::GetFluffyCloudsBottomGreen(); int bb = CTimeCycle::GetFluffyCloudsBottomBlue(); if(sundist < SCREEN_WIDTH/2){ - hilight = (1.0f - coverage) * (1.0f - sundist/(SCREEN_WIDTH/2)); + hilight = (1.0f - Max(CWeather::Foggyness, CWeather::CloudCoverage)) * (1.0f - sundist/(SCREEN_WIDTH/2)); tr = tr*(1.0f-hilight) + 255*hilight; tg = tg*(1.0f-hilight) + 190*hilight; tb = tb*(1.0f-hilight) + 190*hilight; @@ -286,9 +291,6 @@ CClouds::Render(void) // Rainbow if(CWeather::Rainbow != 0.0f){ - static uint8 BowRed[6] = { 30, 30, 30, 10, 0, 15 }; - static uint8 BowGreen[6] = { 0, 15, 30, 30, 0, 0 }; - static uint8 BowBlue[6] = { 0, 0, 0, 10, 30, 30 }; RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0])); for(i = 0; i < 6; i++){ RwV3d pos = { i*1.5f, 100.0f, 5.0f }; From 85d76dc1718a1399a08693cba2cc299f90f21a15 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 14 Aug 2020 09:28:17 +0200 Subject: [PATCH 049/112] fixed clouds render --- src/render/Clouds.cpp | 84 ++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/src/render/Clouds.cpp b/src/render/Clouds.cpp index c6ba0f10..15bae90b 100644 --- a/src/render/Clouds.cpp +++ b/src/render/Clouds.cpp @@ -71,6 +71,43 @@ CClouds::Update(void) #endif } +float StarCoorsX[9] = { 0.0f, 0.05f, 0.13f, 0.4f, 0.7f, 0.6f, 0.27f, 0.55f, 0.75f }; +float StarCoorsY[9] = { 0.0f, 0.45f, 0.9f, 1.0f, 0.85f, 0.52f, 0.48f, 0.35f, 0.2f }; +float StarSizes[9] = { 1.0f, 1.4f, 0.9f, 1.0f, 0.6f, 1.5f, 1.3f, 1.0f, 0.8f }; + +float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, 0.8f, -0.8f, 0.4f, -0.4f }; +float LowCloudsY[12] = { 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, 1.0f, 0.7f, 0.4f, 0.4f, -0.8f, -0.8f }; +float LowCloudsZ[12] = { 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.3f, 0.9f, 0.4f, 1.3f, 1.4f, 1.2f, 1.7f }; + +float CoorsOffsetX[37] = { + 0.0f, 60.0f, 72.0f, 48.0f, 21.0f, 12.0f, + 9.0f, -3.0f, -8.4f, -18.0f, -15.0f, -36.0f, + -40.0f, -48.0f, -60.0f, -24.0f, 100.0f, 100.0f, + 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, + 100.0f, 100.0f, -30.0f, -20.0f, 10.0f, 30.0f, + 0.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f +}; +float CoorsOffsetY[37] = { + 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, + 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, + 100.0f, 100.0f, 100.0f, 100.0f, -30.0f, 10.0f, + -25.0f, -5.0f, 28.0f, -10.0f, 10.0f, 0.0f, + 15.0f, 40.0f, -100.0f, -100.0f, -100.0f, -100.0f, + -100.0f, -40.0f, -20.0f, 0.0f, 10.0f, 30.0f, 35.0f +}; +float CoorsOffsetZ[37] = { + 2.0f, 1.0f, 0.0f, 0.3f, 0.7f, 1.4f, + 1.7f, 0.24f, 0.7f, 1.3f, 1.6f, 1.0f, + 1.2f, 0.3f, 0.7f, 1.4f, 0.0f, 0.1f, + 0.5f, 0.4f, 0.55f, 0.75f, 1.0f, 1.4f, + 1.7f, 2.0f, 2.0f, 2.3f, 1.9f, 2.4f, + 2.0f, 2.0f, 1.5f, 1.2f, 1.7f, 1.5f, 2.1f +}; + +uint8 BowRed[6] = { 30, 30, 30, 10, 0, 15 }; +uint8 BowGreen[6] = { 0, 15, 30, 30, 0, 0 }; +uint8 BowBlue[6] = { 0, 0, 0, 10, 30, 30 }; + void CClouds::Render(void) { @@ -94,11 +131,10 @@ CClouds::Render(void) float minute = CClock::GetHours()*60 + CClock::GetMinutes() + CClock::GetSeconds()/60.0f; RwV3d campos = *(RwV3d*)&TheCamera.GetPosition(); - float coverage = Max(CWeather::Foggyness, CWeather::Foggyness); - // Moon float moonfadeout = Abs(minute - 180.0f); // fully visible at 3AM if((int)moonfadeout < 180){ // fade in/out 3 hours + float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage); int brightness = (1.0f - coverage) * (180 - (int)moonfadeout); RwV3d pos = { 0.0f, -100.0f, 15.0f }; RwV3dAdd(&worldpos, &campos, &pos); @@ -122,11 +158,10 @@ CClouds::Render(void) else if(CClock::GetHours() == 5) starintens = 255 * (60 - CClock::GetMinutes())/60.0f; if(starintens != 0){ - // R - static float StarCoorsX[9] = { 0.0f, 0.05f, 0.13f, 0.4f, 0.7f, 0.6f, 0.27f, 0.55f, 0.75f }; - static float StarCoorsY[9] = { 0.0f, 0.45f, 0.9f, 1.0f, 0.85f, 0.52f, 0.48f, 0.35f, 0.2f }; - static float StarSizes[9] = { 1.0f, 1.4f, 0.9f, 1.0f, 0.6f, 1.5f, 1.3f, 1.0f, 0.8f }; + float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage); int brightness = (1.0f - coverage) * starintens; + + // R RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0])); for(i = 0; i < 11; i++){ RwV3d pos = { 100.0f, 0.0f, 10.0f }; @@ -155,13 +190,7 @@ CClouds::Render(void) } // Low clouds - static float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f, - 0.0f, 0.7f, 0.8f, -0.8f, 0.4f, -0.4f }; - static float LowCloudsY[12] = { 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, - 1.0f, 0.7f, 0.4f, 0.4f, -0.8f, -0.8f }; - static float LowCloudsZ[12] = { 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.3f, - 0.9f, 0.4f, 1.3f, 1.4f, 1.2f, 1.7f }; - float lowcloudintensity = 1.0f - Max(coverage, CWeather::ExtraSunnyness); + float lowcloudintensity = 1.0f - Max(Max(CWeather::Foggyness, CWeather::CloudCoverage), CWeather::ExtraSunnyness); int r = CTimeCycle::GetLowCloudsRed() * lowcloudintensity; int g = CTimeCycle::GetLowCloudsGreen() * lowcloudintensity; int b = CTimeCycle::GetLowCloudsBlue() * lowcloudintensity; @@ -184,30 +213,6 @@ CClouds::Render(void) float rot_cos = Cos(CloudRotation); int fluffyalpha = 160 * (1.0f - Max(CWeather::Foggyness, CWeather::ExtraSunnyness)); if(fluffyalpha != 0){ - static float CoorsOffsetX[37] = { - 0.0f, 60.0f, 72.0f, 48.0f, 21.0f, 12.0f, - 9.0f, -3.0f, -8.4f, -18.0f, -15.0f, -36.0f, - -40.0f, -48.0f, -60.0f, -24.0f, 100.0f, 100.0f, - 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, - 100.0f, 100.0f, -30.0f, -20.0f, 10.0f, 30.0f, - 0.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f - }; - static float CoorsOffsetY[37] = { - 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, - 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f, - 100.0f, 100.0f, 100.0f, 100.0f, -30.0f, 10.0f, - -25.0f, -5.0f, 28.0f, -10.0f, 10.0f, 0.0f, - 15.0f, 40.0f, -100.0f, -100.0f, -100.0f, -100.0f, - -100.0f, -40.0f, -20.0f, 0.0f, 10.0f, 30.0f, 35.0f - }; - static float CoorsOffsetZ[37] = { - 2.0f, 1.0f, 0.0f, 0.3f, 0.7f, 1.4f, - 1.7f, 0.24f, 0.7f, 1.3f, 1.6f, 1.0f, - 1.2f, 0.3f, 0.7f, 1.4f, 0.0f, 0.1f, - 0.5f, 0.4f, 0.55f, 0.75f, 1.0f, 1.4f, - 1.7f, 2.0f, 2.0f, 2.3f, 1.9f, 2.4f, - 2.0f, 2.0f, 1.5f, 1.2f, 1.7f, 1.5f, 2.1f - }; static bool bCloudOnScreen[37]; float sundist, hilight; @@ -230,7 +235,7 @@ CClouds::Render(void) int bb = CTimeCycle::GetFluffyCloudsBottomBlue(); int distLimit = (3*SCREEN_WIDTH)/4; if(sundist < distLimit){ - hilight = (1.0f - coverage) * (1.0f - sundist/(float)distLimit); + hilight = (1.0f - Max(CWeather::Foggyness, CWeather::CloudCoverage)) * (1.0f - sundist/(float)distLimit); tr = tr*(1.0f-hilight) + 255*hilight; tg = tg*(1.0f-hilight) + 190*hilight; tb = tb*(1.0f-hilight) + 190*hilight; @@ -277,9 +282,6 @@ CClouds::Render(void) // Rainbow if(CWeather::Rainbow != 0.0f){ - static uint8 BowRed[6] = { 30, 30, 30, 10, 0, 15 }; - static uint8 BowGreen[6] = { 0, 15, 30, 30, 0, 0 }; - static uint8 BowBlue[6] = { 0, 0, 0, 10, 30, 30 }; RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0])); for(i = 0; i < 6; i++){ RwV3d pos = { i*1.5f, 100.0f, 5.0f }; From e1ca6c6b79ceddaed6fa4dc757ae25c17b356611 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 14 Aug 2020 14:21:16 +0300 Subject: [PATCH 050/112] Move stuff to vendor --- .gitignore | 4 + .gitmodules | 27 +- librw | 1 - libsndfile.64/ChangeLog | 9764 ----------------- libsndfile.64/NEWS | 199 - libsndfile.64/include/sndfile.h | 857 -- libsndfile.64/include/sndfile.hh | 446 - mpg123.64/include/fmt123.h | 159 - mpg123.64/include/mpg123.h | 1697 --- ogg | 1 - opus | 1 - opusfile | 1 - premake5.lua | 49 +- vendor/librw | 1 + .../libsndfile}/ChangeLog | 0 {libsndfile.32 => vendor/libsndfile}/NEWS | 0 .../libsndfile/dist/Win32}/libsndfile-1.dll | Bin .../libsndfile/dist/Win64}/libsndfile-1.dll | Bin .../libsndfile}/include/sndfile.h | 0 .../libsndfile}/include/sndfile.hh | 0 .../libsndfile/lib/Win32}/libsndfile-1.def | 0 .../libsndfile/lib/Win32}/libsndfile-1.lib | Bin .../lib/Win32}/pkgconfig/sndfile.pc | 0 .../libsndfile/lib/Win64}/libsndfile-1.def | 0 .../libsndfile/lib/Win64}/libsndfile-1.lib | Bin .../lib/Win64}/pkgconfig/sndfile.pc | 0 .../mpg123/dist/Win32}/libmpg123-0.dll | Bin .../mpg123/dist/Win64}/libmpg123-0.dll | Bin {mpg123.32 => vendor/mpg123}/include/fmt123.h | 0 {mpg123.32 => vendor/mpg123}/include/mpg123.h | 0 .../mpg123/lib/Win32}/libmpg123-0.lib | Bin .../mpg123/lib/Win64}/libmpg123-0.lib | Bin vendor/ogg | 1 + {openal-soft => vendor/openal-soft}/COPYING | 0 .../openal-soft}/dist/Win32/OpenAL32.dll | Bin .../openal-soft}/dist/Win64/OpenAL32.dll | Bin .../openal-soft}/include/AL/al.h | 0 .../openal-soft}/include/AL/alc.h | 0 .../openal-soft}/include/AL/alext.h | 0 .../openal-soft}/include/AL/efx-creative.h | 0 .../openal-soft}/include/AL/efx-presets.h | 0 .../openal-soft}/include/AL/efx.h | 0 .../openal-soft}/libs/Win32/OpenAL32.def | 0 .../openal-soft}/libs/Win32/OpenAL32.lib | Bin .../openal-soft}/libs/Win32/libOpenAL32.dll.a | Bin .../openal-soft}/libs/Win64/OpenAL32.def | 0 .../openal-soft}/libs/Win64/OpenAL32.lib | Bin .../openal-soft}/libs/Win64/libOpenAL32.dll.a | Bin .../openal-soft}/readme.txt | 0 vendor/opus | 1 + vendor/opusfile | 1 + 51 files changed, 46 insertions(+), 13164 deletions(-) delete mode 160000 librw delete mode 100644 libsndfile.64/ChangeLog delete mode 100644 libsndfile.64/NEWS delete mode 100644 libsndfile.64/include/sndfile.h delete mode 100644 libsndfile.64/include/sndfile.hh delete mode 100644 mpg123.64/include/fmt123.h delete mode 100644 mpg123.64/include/mpg123.h delete mode 160000 ogg delete mode 160000 opus delete mode 160000 opusfile create mode 160000 vendor/librw rename {libsndfile.32 => vendor/libsndfile}/ChangeLog (100%) rename {libsndfile.32 => vendor/libsndfile}/NEWS (100%) rename {libsndfile.32/dist => vendor/libsndfile/dist/Win32}/libsndfile-1.dll (100%) rename {libsndfile.64/dist => vendor/libsndfile/dist/Win64}/libsndfile-1.dll (100%) rename {libsndfile.32 => vendor/libsndfile}/include/sndfile.h (100%) rename {libsndfile.32 => vendor/libsndfile}/include/sndfile.hh (100%) rename {libsndfile.32/lib => vendor/libsndfile/lib/Win32}/libsndfile-1.def (100%) rename {libsndfile.32/lib => vendor/libsndfile/lib/Win32}/libsndfile-1.lib (100%) rename {libsndfile.32/lib => vendor/libsndfile/lib/Win32}/pkgconfig/sndfile.pc (100%) rename {libsndfile.64/lib => vendor/libsndfile/lib/Win64}/libsndfile-1.def (100%) rename {libsndfile.64/lib => vendor/libsndfile/lib/Win64}/libsndfile-1.lib (100%) rename {libsndfile.64/lib => vendor/libsndfile/lib/Win64}/pkgconfig/sndfile.pc (100%) rename {mpg123.32/dist => vendor/mpg123/dist/Win32}/libmpg123-0.dll (100%) rename {mpg123.64/dist => vendor/mpg123/dist/Win64}/libmpg123-0.dll (100%) rename {mpg123.32 => vendor/mpg123}/include/fmt123.h (100%) rename {mpg123.32 => vendor/mpg123}/include/mpg123.h (100%) rename {mpg123.32/lib => vendor/mpg123/lib/Win32}/libmpg123-0.lib (100%) rename {mpg123.64/lib => vendor/mpg123/lib/Win64}/libmpg123-0.lib (100%) create mode 160000 vendor/ogg rename {openal-soft => vendor/openal-soft}/COPYING (100%) rename {openal-soft => vendor/openal-soft}/dist/Win32/OpenAL32.dll (100%) rename {openal-soft => vendor/openal-soft}/dist/Win64/OpenAL32.dll (100%) rename {openal-soft => vendor/openal-soft}/include/AL/al.h (100%) rename {openal-soft => vendor/openal-soft}/include/AL/alc.h (100%) rename {openal-soft => vendor/openal-soft}/include/AL/alext.h (100%) rename {openal-soft => vendor/openal-soft}/include/AL/efx-creative.h (100%) rename {openal-soft => vendor/openal-soft}/include/AL/efx-presets.h (100%) rename {openal-soft => vendor/openal-soft}/include/AL/efx.h (100%) rename {openal-soft => vendor/openal-soft}/libs/Win32/OpenAL32.def (100%) rename {openal-soft => vendor/openal-soft}/libs/Win32/OpenAL32.lib (100%) rename {openal-soft => vendor/openal-soft}/libs/Win32/libOpenAL32.dll.a (100%) rename {openal-soft => vendor/openal-soft}/libs/Win64/OpenAL32.def (100%) rename {openal-soft => vendor/openal-soft}/libs/Win64/OpenAL32.lib (100%) rename {openal-soft => vendor/openal-soft}/libs/Win64/libOpenAL32.dll.a (100%) rename {openal-soft => vendor/openal-soft}/readme.txt (100%) create mode 160000 vendor/opus create mode 160000 vendor/opusfile diff --git a/.gitignore b/.gitignore index 61ed7035..c7ebb3d1 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,7 @@ healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 MigrationBackup/ + +vendor/glew-2.1.0/ +vendor/glfw-3.3.2.bin.WIN32/ +vendor/glfw-3.3.2.bin.WIN64/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index bf1e33a5..c9a30c95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +1,16 @@ -[submodule "librw"] - path = librw - url = https://github.com/aap/librw -[submodule "opus"] - path = opus - url = https://github.com/xiph/opus.git - branch = master -[submodule "opusfile"] - path = opusfile - url = https://github.com/xiph/opusfile.git - branch = master -[submodule "ogg"] - path = ogg +[submodule "vendor/ogg"] + path = vendor/ogg url = https://github.com/xiph/ogg.git branch = master +[submodule "vendor/opus"] + path = vendor/opus + url = https://github.com/xiph/opus.git + branch = master +[submodule "vendor/opusfile"] + path = vendor/opusfile + url = https://github.com/xiph/opusfile.git + branch = master +[submodule "vendor/librw"] + path = vendor/librw + url = https://github.com/aap/librw.git + branch = master diff --git a/librw b/librw deleted file mode 160000 index 113d76cf..00000000 --- a/librw +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 113d76cfaaf064447ac936f79d91ea04788fca24 diff --git a/libsndfile.64/ChangeLog b/libsndfile.64/ChangeLog deleted file mode 100644 index 62576177..00000000 --- a/libsndfile.64/ChangeLog +++ /dev/null @@ -1,9764 +0,0 @@ -2013-04-05 Erik de Castro Lopo - - * Makefile.am - Make sure checkprograms are built as part of 'make test-tarball'. - Closes: https://github.com/erikd/libsndfile/issues/37 - -2013-03-29 Erik de Castro Lopo - - * tests/dft_cmp.c - Fix a buffer overflow detected using GCC 4.8's -fsantiize=address runtime - error checking functionality. This was a buffer overflow in libsndfile's - test suite, not in the actual library code. - -2013-03-09 Erik de Castro Lopo - - * M4/gcc_version.m4 - Fix to work with OpenBSD's sed. - -2013-03-07 Erik de Castro Lopo - - * src/ALAC/alac_encoder.c - Patch from Michael Pruett (author of libaudiofile) to add correct byte - swapping for the mChannelLayoutTag field. - -2013-03-02 Erik de Castro Lopo - - * doc/bugs.html - Bugs should bt reported on the github issue tracker. - -2013-02-22 Erik de Castro Lopo - - * configure.ac - Improve sanitization of FLAC_CFLAGS value. - -2013-02-21 Erik de Castro Lopo - - * src/Makefile.am - Call python interpreter instead of using '#!' in script. Thanks to Jan - Stary for reporting this. - - * doc/index.html doc/FAQ.html - Make internal links relative. Patch from Jan Stary. - -2013-02-13 Erik de Castro Lopo - - * src/test_endswap.def src/test_endswap.tpl - Add tests for psf_put_be32() and psf_put_be64(). - - * src/sfendian.h src/test_endswap.(def|tpl) - Add functions psf_get_be(16|32|64) with tests. - These are needed for platforms where un-aligned accesses cause bus faults. - - * src/ALAC/ag_enc.c src/ALAC/alac_decoder.c - Replace all un-aligned accesses with safe alternatives. - Closes: https://github.com/erikd/libsndfile/issues/19 - -2013-02-12 Erik de Castro Lopo - - * src/sfendian.h - Add big endian versions of H2BE_16 and H2BE_32. - -2013-02-11 Erik de Castro Lopo - - * src/ALAC/ - Replace Apple endswap routines with ones from libsndfile. - - * merge from libsndfile-cart repo - Add ability to set and get a cart chunk with WAV and RF64. - Orignal patch by Chris Roberts required a number of - tweaks. - -2013-02-10 Erik de Castro Lopo - - * src/common.h - Bump SF_HEADER_LEN from 8192 to 12292, the value it was in the 1.0.25 - release. - -2013-02-09 Erik de Castro Lopo - - * src/alac.c - Fix segfault when encoding 8 channel files. - Closes: https://github.com/erikd/libsndfile/issues/30 - -2013-02-07 Erik de Castro Lopo - - * src/ALAC/EndianPortable.c - Fall back to compiler's __BYTE_ORDER__ for endian-ness detection. - -2013-02-06 Erik de Castro Lopo - - * configure.ac src/common.h src/ima_adpcm.c src/ms_adpcm.c src/paf.c - Drop tests for and #ifdef hackery for C99 struct flexible array feature. - libsndfile assumes the compiler supports most of the ISO C99 standard. - - * src/alac.c - Fix valgrind invalid realloc. Reported by nu774. - Closes: https://github.com/erikd/libsndfile/issues/31 - -2013-02-05 Erik de Castro Lopo - - * src/alac.c - The 'pakt' chunk header should now be written correctly. - Closes: https://github.com/erikd/libsndfile/issues/24 - - * configure.ac Makefile.am - Use PKG_INSTALLDIR when it exists. Suggestion from Christoph Thompson. - Closes: https://github.com/erikd/libsndfile/pull/28 - -2013-02-03 Erik de Castro Lopo - - * src/common.h src/caf.c - Read the ALAC 'pakt' header and stash the values. - - * src/sfendian.h - Add functions psf_put_be64() and psf_put_be32(). - - * src/alac.c - Start work on filling on the 'pakt' chunk header. - -2013-02-02 Erik de Castro Lopo - - * doc/FAQ.html - Add missing opening

tag. - - * src/alac.c - Increase ALAC_BYTE_BUFFER_SIZE to 82000. - -2013-01-27 Erik de Castro Lopo - - * doc/FAQ.html - Improve question #8. - -2013-01-02 Erik de Castro Lopo - - * src/ogg_opus.c - Add skeleton implementation so someone else can run with it. - -2012-12-12 Erik de Castro Lopo - - * src/common.h src/dwd.c src/rx2.c src/txw.c - Fix for compiling when configured with --enable-experimental. Thanks to - Eric Wong for reporting this. - -2012-12-01 Erik de Castro Lopo - - * configure.ac programs/sndfile-play.c - OS X 10.8 uses a different audio API to previous versions. - Fix compile failure on by disabling sndfile-play on this version. - Someone needs to supply code for the new API. - -2012-11-30 Erik de Castro Lopo - - * Octave/Makefile.am Octave/octave_test.sh - Fix 'make distcheck'. - -2012-10-13 Erik de Castro Lopo - - * M4/octave.m4 - Relax constraints on Octave version. - -2012-10-11 Erik de Castro Lopo - - * tests/utils.tpl - Improve compare_*_or_die() functions. - - * src/command.c - Fix bug reported by Keiler Florian. When reading short or int data from a - file containing float data, and setting SFC_SET_SCALE_FLOAT_INT_READ to - SF_TRUE would fail 3, 5, 7 and other channels counts. Problem was that - psf_calc_signal_max() was not calculating the signal max correctly. - Calculation of the signal max was failing because it was trying to read - a sample count that was not an integer multiple of the channel count. - - * tests/channel_test.c tests/Makefile.am tests/test_wrapper.sh.in - Add test for the above. - -2012-09-25 Erik de Castro Lopo - - * src/sndfile.hh - Added a constructor to allow the use of SF_VIRTUAL_IO. Patch from - DannyDaemonic : https://github.com/erikd/libsndfile/pull/20 - -2012-08-23 Erik de Castro Lopo - - * doc/octave.html - Fix link to octave.sourceforge.net. Thanks to IOhannes m zmoelnig. - - * src/mat5.c - Allow reading of mat5 files without a specified sample rate (default to - 44.1kHz). Thanks to IOhannes m zmoelnig. - -2012-08-19 Erik de Castro Lopo - - * src/paf.c - Error out if channel count is zero. Bug report from William ELla via - launchpad: - https://bugs.launchpad.net/ubuntu/+source/libsndfile/+bug/1036831 - -2012-08-04 Erik de Castro Lopo - - * configure.ac programs/sndfile-play.c - Patch from Ricci Adams to use OSX's AudioQueues on OSX 10.7 and greater. - -2012-07-09 Erik de Castro Lopo - - * programs/common.c - Accept "ogg" as a file extention for Ogg/Vorbis files. - -2012-06-22 Erik de Castro Lopo - - * src/flac.c - Make sure any previously allocated FLAC stream encoder and stream decoder - objects are deleted before a new one is allocated. - -2012-06-20 Erik de Castro Lopo - - * tests/utils.tpl - Rename gen_lowpass_noise_float() to gen_lowpass_signal_float() and add a - sine wave component so that different FLAC compression levels can be - tested. - - * src/sndfile.h.in doc/command.html - Add SFC_SET_COMPRESSION_LEVEL and document it. - - * src/sndfile.c - Catch SFC_SET_VBR_ENCODING_QUALITY command and implement it as the inverse - of SFC_SET_COMPRESSION_LEVEL. - - * src/ogg_vorbis.c src/flac.c - Implement SFC_SET_COMPRESSION_LEVEL command. - - * tests/test_wrapper.sh.in tests/compression_size_test.c - Use the compression_size_test on FLAC as well. - -2012-06-19 Erik de Castro Lopo - - * tests/ - Rename vorbis_test.c -> compression_size_test.c so it can be extended to - test FLAC as well. - -2012-06-18 Erik de Castro Lopo - - * src/broadcast.c - Fix a bug where a file with a 'bext' chunk with a zero length coding - history field would get corrupted when the file was closed. - Reported by Paul Davis of the Ardour project. - - * src/test_broadcast_var.c - Add a test for the above. - -2012-05-19 Erik de Castro Lopo - - * src/sndfile.c - sf_format_check: For SF_FORMAT_AIFF, reject endian-ness setttings for - non-PCM formats. - -2012-04-12 Erik de Castro Lopo - - * src/aiff.c - Fix regression in handling of odd length SSND chunks. - Thanks Olivier Tristan for the example file. - - * src/aiff.c src/wav.c - Exit parser loop when marker == 0. - -2012-04-04 Erik de Castro Lopo - - * doc/FAQ.html - Fix text. Thanks to Richard Collins. - -2012-03-24 Erik de Castro Lopo - - * src/caf.c - Exit parse loop if the marker is zero. Pass jump offsets as size_t instead - of int. - -2012-03-20 Erik de Castro Lopo - - * src/alac.c - Fix segfault when decoding CAF/ALAC file with more than 4 channels. - Fixes github issue #8 reported by Charles Van Winkle. - -2012-03-20 Erik de Castro Lopo - - * src/common.h - Change 'typedef SF_CHUNK_ITERATOR { ... } SF_CHUNK_ITERATOR' into 'struct - SF_CHUNK_ITERATOR { ... }' to prevent older compilers from complaining of - re-typedef-ing of SF_CHUNK_ITERATOR. - - * configure.ac - Fix if test for empty $prefix. - -2012-03-18 Erik de Castro Lopo - - * src/*.c tests/chunk_test.c - Reworking of custom chunk handling code. - - Memory for the iterator is now attached to the SF_PRIVATE struct and - freed one sf_close(). - - Rename sf_create_chunk_iterator() -> sf_get_chunk_iterator(). - - Each SNDFILE handle never has more than one SF_CHUNK_ITERATOR handle. - - * tests/string_test.c - Fix un-initialised char buffer. - -2012-03-17 Erik de Castro Lopo - - * src/*.c tests/chunk_test.c - Add improved handling of custom chunk getting and settings. Set of patches - from IOhannes m zmoelnig submitted via github pull request #6. - - * src/alac.c - Fix calculated frame count for files with zero block length. - -2012-03-13 Erik de Castro Lopo - - * src/avr.c - Remove double assignment to psf->endian. Thanks Kao Dome. - - * src/gsm610.c - Fix clearing of buffers. Thanks Kao Dome. - - * src/paf.c - Remove duplicate code. Thanks Kao Dome. - - * src/test_strncpy_crlf.c - Fix minor error in test. Thanks Kao Dome. - - * src/common.h src/*.c - Fix a bunch of valgrind errors. - -2012-03-13 Erik de Castro Lopo - - * src/sndfile.c - Fix typo in error string 'Uknown' -> 'Unknown'. - - * tests/fix_this.c - Fix potential int overflow. - -2012-03-10 Erik de Castro Lopo - - * src/alac.c - Fix decoding of last block so that the decode length is not a multiple of - the block length. Fixes github issue #4 reported by Charles Van Winkle. - - * src/sfconfig.h src/sfendian.h - Fix for MinGW cross compiling. Use '#if (defined __*66__)' instead of - '#if __*86__' because the MinGW header use '#ifdef __x86_64__'. - -2012-03-10 Erik de Castro Lopo - - * src/ALAC/ src/alac.c - Unify the interface between libsndfile and Apple ALAC codec. Regardless of - file bit width samples are now passed between the two as int32_t that are - justified towards the most significant bit. Without this modification, 16 - conversion functions would have been needed between the libsndfile (short, - int, float, double) types and the ALAC types (16, 20, 24 and 32 bit). With - this mod, only 4 are needed. - - * tests/floating_point_test.tpl tests/write_read_test.(def|tpl) - Add tests for 20 and 24 bit ALAC/CAF files. - - * src/command.c - Add ALAC/CAF to the SFC_GET_FORMAT_* commands. Fixes github issue #5. - - * configure.ac - Only use automake AM_SLIENT_RULES where supported. Thanks Dave Yeo. - - * tests/pipe_test.tpl - Disable tests on OS/2. Thanks Dave Yeo. - -2012-03-09 Erik de Castro Lopo - - * configure.ac src/sfconfig.h src/sfendian.h - For GCC, use inline assembler for endian swapping. This should work with - older versions of GCC like the one currently used in OS/2. - -2012-03-06 Erik de Castro Lopo - - * src/alac.c - Make sure temp file gets opened in binary mode. - - * src/alac.c src/common.c src/common.h - Fix function alac_write16_d(). - - * tests/floating_point_test.tpl - Add tests for 16 bit ALAC/CAF. - - * src/alac.c src/common.c src/common.h - Add support for 32 bit ALAC/CAF files. - - * tests/floating_point_test.tpl tests/write_read_test.tpl - Add tests for 32 bit ALAC/CAF files. - -2012-03-05 Erik de Castro Lopo - - * src/ - Refactor chunk storage so it work on big as well as little endian CPUs. - - * tests/chunk_test.c - Clean up error messages. - - * src/sfendian.h src/*.c - Rename endian swapping macros and add ENDSWAP_64 and BE2H_64. - - * configure.ac - Detect presence of header file. - - * src/sfendian.h - Use intrinsics (ie for MinGW) when is not - present. - Make ENDSWAP_64() work with i686-w64-mingw32 compiler. - - * src/ALAC/EndianPortable.c - Add support for __powerpc__. - - * src/sfconfig.h - Make sure HAVE_X86INTRIN_H is either 1 or 0. - -2012-03-03 Erik de Castro Lopo - - * src/ALAC/* - Big dump of code for Apple's ALAC file format. The copyyright to this code - is owned by Apple who have released it under an Apache style license. A few - small modifications were made to allow this to be integrated into libsndfile - but unfortunately the history of those changes were lost because they were - developed in a Bzr tree and during that time libsndfile moved to Git. - - * src/alac.c src/caf.c src/common.[ch] src/Makefile.am src/sndfile.h.in - src/sndfile.c - Hook new ALAC codec in. - - * programs/sndfile-convert.c - Add support for alac codec. - - * tests/write_read_test.tpl - Expand tests to cover ALAC. - -2012-03-02 Erik de Castro Lopo - - * src/aiff.c src/wav.c - Fix a couple of regressions from version 1.0.25. - -2012-03-01 Erik de Castro Lopo - - * src/strings.c - Minor refactoring. Make sure that the memory allocation size if always > 0 - to avoid undefined behaviour. - -2012-02-29 Erik de Castro Lopo - - * src/chunk.c - Fix buffer overrun introduced in recently added chunk logging. This chunk - logging has not yet made it to a libsndfile release version. Thanks to - Olivier Tristan for providing an example file. - - * src/wav.c - Fix handling of odd sized chunks which was causing the parser to lose some - chunks. Thanks to Olivier Tristan for providing an example file. - -2012-02-26 Erik de Castro Lopo - - * tests/util.tpl - Used gnu_printf format checking with mingw-w64 compiler. - - * tests/header_test.tpl - Printf format fixes. - -2012-02-25 Erik de Castro Lopo - - * M4/extra_pkg.m4 - Update PKG_CHECK_MOD_VERSION macro to add an AC_TRY_LINK step. This fix - allows the configure process to catch attempts to link incompatible - libraries. For example, linking 32 bit version of eg libFLAC to a 64 bit - version of libsndfile will now fail. Similarly, when cross compiling - libsndfile from Linux to Windows linking the Linux versions of a library - to the Windows version of libsndfile will now also fail. - - * src/sndfile.h.in src/sndfile.c src/common.h src/create_symbols_file.py - Add API function sf_current_byterate(). - - * src/dwvw.c src/flac.c src/ogg_vorbis.c src/sds.c - Add codec specific handlers for current byterate. - - * tests/floating_point_test.tpl - Add initial test for sf_current_byterate(). - -2012-02-24 Erik de Castro Lopo - - * src/common.[ch] - Add function psf_decode_frame_count(). - - * src/dwvw.c - Fix a termnation bug that caused the decoder to go into an infinite loop. - -2012-02-24 Erik de Castro Lopo - - * src/wav.c - Fix a regression in the WAV header parser. Thanks to Olivier Tristan for - bug report and the example file. - -2012-02-21 Erik de Castro Lopo - - * src/sndfile.c - Return error when SF_BROADCAST_INFO struct has bad coding_history_size. - Thanks to Alex Weiss for the report. - -2012-02-20 Erik de Castro Lopo - - * src/au.c src/flac.c src/g72x.c src/ogg_vorbis.c src/wav_w64.c - Don't fake psf->bytewidth values. - -2012-02-19 Erik de Castro Lopo - - * tests/string_test.c - Fix valgrind warnings. - - * src/common.h src/sndfile.c src/strings.c - Make string storage dynamically allocated. - - * src/sndfile.c - Add extra validation for custom chunk handling. - -2012-02-18 Erik de Castro Lopo - - * src/wav.c - Improve handlling unknown chunk types. Thanks to Olivier Tristan for sending - example files. - - * src/utils.tpl - Add GCC specific testing for format string parameters for exit_if_true(). - - * tests/*.c tests/*.tpl - Fix all printf format warnings. - - * programs/sndfile-play.c - Remove un-needed OSX include . Thanks jamesfmilne for github - issue #3. - - * tests/chunk_test.c - Extend custom chunk test. - -2012-02-12 Erik de Castro Lopo - - * src/wav.c - Jump over some more chunk types while parsing. - -2012-02-04 Erik de Castro Lopo - - * src/common.h src/strings.c - Change way strings are stored in SF_PRIVATE in preparation for dynamically - allocating the storage. - -2012-02-02 Erik de Castro Lopo - - * src/common.h src*.c - Improve encapsulation of string data in SF_PRIVATE. - -2012-02-01 Erik de Castro Lopo - - * src/common.h src*.c - Remove the buffer union from SF_PRIVATE. Most uses of this have been - replaced with a BUF_UNION that is allocated on the stack. - -2012-01-31 Erik de Castro Lopo - - * src/common.h src*.c - Rename logbuffer field of SF_PRIVATE to parselog and reduce its size. - Put the parselog buffer and the index inside a struct within SF_PRIVATE. - -2012-01-26 Erik de Castro Lopo - - * configure.ac - Fix typo, FLAC_CLFAGS -> FLAC_CFLAGS. Thanks to Jeremy Friesner. - -2012-01-21 Erik de Castro Lopo - - * src/sndfile.c src/ogg.c - Fix misleading error message when trying to create an SF_FORMAT_OGG file - with anything other than SF_FORMAT_FILE. Thanks to Charles Van Winkle for - the bug report. Github issue #1. - -2012-01-20 Erik de Castro Lopo - - * src/sndfile.c src/wav.c - Allow files opened in RDWR mode with string data in the tailer to be - extended. Thanks to Bodo for the patch. - - * tests/string_test.c - Add tests for the above changes (patch from Bodo). - -2012-01-09 Erik de Castro Lopo - - * src/aiff.c - Refactor reading of chunk size and use of psf_store_read_chunk(). - - * src/(caf|wav).c - Correct storing of chunk offset. - -2012-01-05 Erik de Castro Lopo - - * src/aiff.c src/wav.c src/common.h - Refactor common code into src/common.h. - - * src/caf.c - Make custom chunks work for CAF files. - - * tests/chunk_test.c tests/test_wrapper.sh.in - Test CAF files with custom chunks. - - * src/sndfile.c - Prevent psf->codec_close() being called more than once. - -2012-01-04 Erik de Castro Lopo - - * programs/sndfile-cmp.c - Catch the case where the second file has more frames than the first. - -2012-01-02 Erik de Castro Lopo - - * src/create_symbols_file.py - Add sf_set_chunk/sf_get_chunk_size/sf_get_chunk_data. - -2011-12-31 Erik de Castro Lopo - - * tests/chunk_test.c tests/Makefile.am - New test for custom chunks. - - * src/aiff.c src/chunk.c src/common.h src/sndfile.c - Make custom chunks work on AIFF files. - - * src/wav.c - Make custom chunks work on WAV files (includes refactoring). - -2011-11-12 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c - Start working on setting/getting chunks. - -2011-11-24 Erik de Castro Lopo - - * src/binheader_writef_check.py src/create_symbols_file.py - Make it work for Python 2 and 3. Thanks Michael. - -2011-11-19 Erik de Castro Lopo - - * libsndfile.spec.in - Change field name 'URL' to 'Url'. - - * src/sndfile.h.in - Add SF_SEEK_SET/CUR/END. - -2011-11-05 Erik de Castro Lopo - - * src/id3.c - Fix a stack overflow that can occur when parsing a file with multiple - ID3 headers which would cause libsndfile to go into an infinite recursion - until it blew the stack. Thanks to Anders Svensson for supplying an example - file. - -2011-10-30 Erik de Castro Lopo - - * src/double64.c src/float32.c src/common.h - Make (float32|double_64)_(be|le)_read() functions const correct. - -2011-10-28 Erik de Castro Lopo - - * src/sfendian.h - Minor tweaking of types. Cast to ptr to correct final type rather void*. - - * programs/sndfile-play.c tests/utils.tpl - Fix compiler warnings with latest MinGW cross compiler. - -2011-10-13 Erik de Castro Lopo - - * src/file_io.c - Use the non-deprecated resource fork name on OSX. Thanks to Olivier Tristan. - -2011-10-12 Erik de Castro Lopo - - * src/wav.c - Jump over the 'olym' chunks when parsing. - -2011-10-06 Erik de Castro Lopo - - * tests/write_read_test.tpl - Remove windows only truncate() implementation. - -2011-09-04 Erik de Castro Lopo - - * src/sd2.c src/sndfile.c - Make sure 23 bit PCM SD2 files are readable/writeable. - - * tests/write_read_test.tpl - Add tests for 32 bit PCM SD2 files. - -2011-08-23 Erik de Castro Lopo - - * configure.ac - Use AC_SYS_LARGEFILE instead of AC_SYS_EXTRA_LARGEFILE as suggested by - Jan Willies. - -2011-08-07 Erik de Castro Lopo - - * configure.ac Makefile.am - Move ACLOCAL_AMFLAGS setup to Makefile.am. - -2011-07-15 Erik de Castro Lopo - - * doc/command.html - Merge two separate blocks of SFC_SET_VBR_ENCODING_QUALITY documentation. - - * src/paf.c - Replace ppaf24->samplesperblock with a compile time constant. - -2011-07-13 Erik de Castro Lopo - - * src/ogg_vorbis.c - Fix return value of SFC_SET_VBR_ENCODING_QUALITY command. - - * doc/command.html - Document SFC_SET_VBR_ENCODING_QUALITY, SFC_GET/SET_LOOP_INFO and - SFC_GET_INSTRUMENT. - - * NEWS README configure.ac doc/*.html - Updates for 1.0.25. - -2011-07-07 Erik de Castro Lopo - - * src/sfconfig.h - Add handling for HAVE_SYS_WAIT_H. - - * Makefile.am src/Makefile.am tests/Makefile.am - Add 'checkprograms' target. - -2011-07-05 Erik de Castro Lopo - - * src/common.h src/sndfile.c - Purge SF_ASSERT macro. Use standard C assert instead. - - * src/paf.c src/common.h src/sndfile.c - Fix for Secunia Advisory SA45125, heap overflow (heap gets overwritten with - byte value of 0) due to integer overflow if PAF file handler. - - * src/ima_adpcm.c src/ms_adpcm.c src/paf.c - Use calloc instead of malloc followed by memset. - - * tests/utils.tpl - Clean up use of memset. - -2011-07-05 Erik de Castro Lopo - - * src/ogg.c - Fix log message. - - * tests/format_check_test.c - Fix compiler warnings. - -2011-07-04 Erik de Castro Lopo - - * src/sndfile.c - Fix error message for erro code SFE_ZERO_MINOR_FORMAT. - - * tests/format_check_test.c - Add a test to for SF_FINFO format field validation. - - * src/ogg.c src/ogg_vorbis.c src/ogg.h src/ogg_pcm.c src/ogg_speex.c - src/common.h src/Makefile.am - Move vorbis specific code to ogg_vorbis.c, add new files for handling PCM - and Speex codecs in an Ogg container. The later two are only enabled with - ENABLE_EXPERIMENTAL_CODE config variable. - -2011-06-28 Erik de Castro Lopo - - * src/strings.c - Clean up and refactor storage of SF_STR_SOFTWARE. - -2011-06-23 Erik de Castro Lopo - - * src/sndfile.h.in doc/api.html - Fix definition of SF_STR_LAST and update SF_STR_* related docs. Thanks to - Tim van der Molen for the patch. - -2011-06-21 Erik de Castro Lopo - - * programs/sndfile-interleave.c - Fix handling of argc. Thanks to Marius Hennecke. - - * src/wav_w64.c - Accept broken WAV files with blockalign == 0. Thanks to Olivier Tristan for - providing example files. - - * src/wav.c - Jump over 'FLLR' chunks. - -2011-06-14 Erik de Castro Lopo - - * src/sndfile.h.in - Fix -Wundef warning due to ENABLE_SNDFILE_WINDOWS_PROTOTYPES. - - * configure.ac - Add -Wundef to CFLAGS. - - * src/ogg.c - Fix -Wunder warning. - -2011-05-18 Erik de Castro Lopo - - * configure.ac - Use int64_t instead of off_t when they are the same size. - - * src/Makefile.am tests/Makefile.am - Use check_PROGRAMS instead of noinst_PROGRAMS where appropriate. - -2011-05-08 Erik de Castro Lopo - - * src/wav.c - Don't allow unknown and/or un-editable chunks to prevent the file from being - opened in SFM_RDWR mode. - -2011-04-25 Erik de Castro Lopo - - * tests/format_check_test.c - Fix segfault in test program. - -2011-04-25 Erik de Castro Lopo - - * tests/format_check_test.c - New test program to check to make sure that sf_open() and sf_check_format() - agree as to what is a valid program. - - * tests/Makefile.am tests/test_wrapper.sh.in - Hook into build and test runner. - - * src/sndfile.c - Fix some sf_format_check() problems. Thanks to Charles Van Winkle for the - notification. - -2011-04-06 Erik de Castro Lopo - - * src/caf.c - Add validation to size of 'data' chunk and fix size of written 'data' - chunk. Thanks to Michael Pruett for reporting this. - -2011-03-28 Erik de Castro Lopo - - * src/* tests/* programs/* - Fix a bunch of compiler warnings with gcc-4.6. - -2011-03-25 Erik de Castro Lopo - - * tests/util.tpl - Add NOT macro to util.h. - - * src/strings.c - Fix handling of SF_STR_SOFTWARE that resulted in a segfault due to calling - strlen() on an unterminated string. Thanks to Francois Thibaud for reporting - this problem. - - * tests/string_test.c - Add test for SF_STR_SOFTWARE segfault bug. - - * configure.ac - Sanitize FLAC_CFLAGS value supplied by pkg-config which returns a value of - '-I${includedir}/FLAC'. However FLAC also provides an include file - which clashes with the Standard C header of the same name. The - solution is strip the 'FLAC' part off the end and include all FLAC headers - as . - - * configure.ac src/Makefile.am - Use non-recursive make in src/ directory. - -2011-03-23 Erik de Castro Lopo - - * NEWS README docs/*.html - Updates for 1.0.24 release. - -2011-03-22 Erik de Castro Lopo - - * configure.ac - Fix up usage of sed (should not assume GNU sed). - - * M4/add_(c|cxx)flags.m4 - Test flags in isolation. - - * tests/cpp_test.cc - Fix a broken test (test segfaults). Report by Dave Flogeras. - -2011-03-21 Erik de Castro Lopo - - * programs/common.[ch] - Add function program_name() which returns the program name minus the path - from argv [0]. - - * programs/*.c programs/Makefile.am - Use program_name() where appropriate. Fix build. - -2011-03-20 Erik de Castro Lopo - - * src/wav.c - For u-law and A-law files, write an 18 byte 'fmt ' chunk instead of a 16 - byte one. Win98 accepts files with a 16 but not 18 byte 'fmt' chunk. Later - version accept 18 byte but not 16 byte. - -2011-03-15 Erik de Castro Lopo - - * doc/FAQ.html - Add examples for question 12. - - * doc/libsndfile.css.in - Add tweaks for h4 element. - - * doc/api.html - Add documentation for virtual I/O functionality. Thanks to Uli Franke. - - * tests/util.tpl - Add static inline functions sf_info_clear() and sf_info_setup(). - - * tests/(alaw|dwvw|ulaw)_test.c - Use functions sf_info_clear() and sf_info_setup(). - -2011-03-08 Erik de Castro Lopo - - * configure.ac - Fail more gracefully if pkg-config is missing. Suggestion from Brian - Willoughby. - -2011-02-27 Erik de Castro Lopo - - * src/common.c - Use size_t instead of int for size params with varargs. - -2011-02-09 Erik de Castro Lopo - - * doc/index.html - Update supported platforms with more Debian platforms and Android. - -2011-01-27 Erik de Castro Lopo - - * src/sndfile.hh - Add an LPCWSTR version of the SndfileHandle constructor to the SndfileHandle - class definition. Thanks to Eric Eizenman for pointing out this was missing. - - * tests/cpp_test.cc - Add test for LPCWSTR version of the SndfileHandle constructor. - -2011-01-19 Erik de Castro Lopo - - * programs/sndfile-play.c - Remove cruft. - -2010-12-01 Erik de Castro Lopo - - * src/sndfile.hh - Add methods rawHandle() and takeOwnership(). Thanks to Tim Blechmann for - the patch. - - * tests/cpp_test.cc - Add tests for above two methods. Also supplied by Tim Blechmann. - -2010-11-11 Erik de Castro Lopo - - * doc/api.html - Add mention of use of sf_strerror() when sf_open() fails. - -2010-11-01 Erik de Castro Lopo - - * configure.ac - Make TYPEOF_SF_COUNT_T int64_t where possible. This may fix problems where - people are compiling on a 64 bit system with the GCC -m32 flag. - - * src/sndfile.h.in - Fix comments on sf_count_t. - -2010-10-26 Erik de Castro Lopo - - * src/aiff.c - Handle non-zero offset field in SSND chunk. Thanks to Michael Chinen. - -2010-10-20 Erik de Castro Lopo - - * configure.ac - Sed fix for FreeBSD. Thanks Tony Theodore. - -2010-10-14 Erik de Castro Lopo - - * shave.in M4/shave.m4 - Fix shave invocation of windres compiler. Thanks Damien Lespiau (upstream - shave author). - - * configure.ac M4/shave.m4 shave-libtool.in shave.in - Switch from shave to automake-1.11's AM_SILENT_RULES. - -2010-10-13 Erik de Castro Lopo - - * shave-libtool.in shave.in - Sync to upstream version. - - * src/rf64.c - More work to make the parser more robust and accepting of mal-formed files. - -2010-10-12 Erik de Castro Lopo - - * src/common.h - Add functions psf_strlcpy() and psf_strlcat(). - - * src/broadcast.c src/sndfile.c src/strings.c src/test_main.c - src/test_main.h src/test_strncpy_crlf.c - Use functions psf_strlcpy() and psf_strlcat() as appropriate. - - * tests/string_test.c - Add tests for SF_STR_GENRE and SF_STR_TRACKNUMBER. - - * src/rf64.c - Fix size of 'ds64' chunk when writing RF64. - -2010-10-10 Erik de Castro Lopo - - * programs/*.c - Add the libsndfile version to the usage message of all programs. - -2010-10-10 Erik de Castro Lopo - - * configure.ac src/version-metadata.rc.in src/Makefile.am - Add version string resources to the windows DLL. - - * doc/api.html - Update to add missing SF_FORMAT_* values. Closed Debian bug #545257. - - * NEWS README configure.ac doc/*.html - Updates for 1.0.23 release. - -2010-10-09 Erik de Castro Lopo - - * tests/pedantic-header-test.sh.in - Handle unusual values of CC environment variable. - - * src/rf64.c - Minor tweaks and additional sanity checking. - - * src/Makefile.am src/binheader_writef_check.py - Use python 2.6. - -2010-10-08 Erik de Castro Lopo - - * src/sndfile.hh - Add a missing 'inline' before a constructor defintion. - -2010-10-06 Erik de Castro Lopo - - * src/common.h - Add macro NOT. - - * src/rf64.c - Minor tweaks. - - * Makefile.am */Makefile.am - Add *~ to CLEANFILES. - -2010-10-05 Erik de Castro Lopo - - * src/sndfile.c - Fix a typo in the error string for SFE_OPEN_PIPE_RDWR. Thanks to Charles - Van Winkle for the report. - -2010-10-04 Erik de Castro Lopo - - * src/flac.c src/ogg.c src/sndfile.h.in src/strings.c src/wav.c - Add ability to read/write tracknumber and genre to flac/ogg/wav files. - Thanks to Matti Nykyri for the patch. - - * src/common.h src/broadcast.c src/strings.c - Add function psf_safe_strncpy() and use where appropriate. - -2010-10-04 Erik de Castro Lopo - - * NEWS README configure.ac doc/*.html - Updates for 1.0.22 release. - -2010-10-03 Erik de Castro Lopo - - * src/common.h src/broadcast.c src/rf64.c src/sndfile.c src/wav.c - Rewrite of SF_BROADCAST_INFO handling. - - * src/test_broadcast_var.c tests/command_test.c - Tweak SF_BROADCAST_INFO tests. - - * src/test_broadcast_var.c - Fix OSX stack check error. - -2010-09-30 Erik de Castro Lopo - - * src/sds.c - Set sustain_loop_end to 0 as suggested by Brian Lewis. - -2010-09-29 Erik de Castro Lopo - - * src/sds.c - Make sure the correct frame count gets written into the header. - - * tests/write_read_test.tpl - Don't allow SDS files to have a long frame count. - -2010-09-17 Erik de Castro Lopo - - * src/sds.c - Apply a pair of patches from Brian Lewis to fix the packet number location - and the checksum. - -2010-09-10 Erik de Castro Lopo - - * src/aiff.c src/file_io.c src/ogg.c src/rf64.c src/sndfile.c - src/strings.c src/test_audio_detect.c src/test_strncpy_crlf.c - src/wav.c tests/pcm_test.tpl - Fix a bunch of minor issues found using static analysis. - -2010-08-23 Erik de Castro Lopo - - * src/test_broadcast_var.c - New file containing tests for broadcast_set_var(). - - * src/Makefile.am src/test_main.[ch] - Hook test_broadcast_var.c into tests. - -2010-08-22 Erik de Castro Lopo - - * src/broadcast.c src/common.(c|h) - Move function strncpy_crlf() to src/common.c so the function can be tested - in isolation. - - * src/test_strncpy_crlf.c - New file. - - * src/Makefile.am src/test_main.[ch] - Hook test_strncpy_crlf.c into tests. - -2010-08-18 Erik de Castro Lopo - - * src/common.h - Move code around to make comments make sense. - - * src/broadcast.c - Add debugging code that is disabled by default. - -2010-08-02 Erik de Castro Lopo - - * src/flac.c - When the file meta data says the file has zero frames set psf->sf.frames - to SF_COUNT_MAX. Fixes Debian bug #590752. - - * programs/sndfile-info.c - Print 'unknown' if frame count == SF_COUNT_MAX. - -2010-06-27 Erik de Castro Lopo - - * src/sndfile.c - Only support writing mono SVX files. Multichannel SVX files are not - interleaved and there is no support infrastructure to cache and write - multiple channels to create a non-interleaved file. - - * src/file_io.c - Don't call close() on a file descriptor of -1. Thanks to Jeremy Friesner - for the bug report. - -2010-06-09 Erik de Castro Lopo - - * src/common.h - Add macro SF_ASSERT. - - * src/sndfile.c - Use SF_ASSERT to ensure sizeof (sf_count_t) == 8. - - * src/svx.c - Add support for reading and writing stereo SVX files. - -2010-05-07 Erik de Castro Lopo - - * configure.ac - When compiling with x86_64-w64-mingw32-gcc link with -static-libgcc flags. - - * programs/common.c programs/sndfile-metadata-set.c - Update metadata after the audio data is copied. Other minor fixes. Patch - from Marius Hennecke. - -2010-05-04 Erik de Castro Lopo - - * src/nist.c - Fix a regression reported by Hugh Secker-Walker. - - * src/api.html - Add comment about sf_open_fd() not working on Windows if the application - and the libsndfile DLL are linked to different versions of the Microsoft - C runtime DLL. - -2010-04-23 Erik de Castro Lopo - - * tests/pedantic-header-test.sh.in - Fix 'make distcheck'. - -2010-04-21 Erik de Castro Lopo - - * tests/pedantic-header-test.sh.in - New file to test whether sndfile.h can be compiled with gcc's -pedantic - flag. - - * configure.ac tests/test_wrapper.sh.in - Hook pedantic-header-test into test suite. - - * src/sndfile.h.in - Fix -pedantic warning. - -2010-04-19 Erik de Castro Lopo - - * programs/sndfile-salvage.c programs/Makefile.am - New program to salvage the audio data from WAV/WAVEX/AIFF files which are - greater than 4Gig in size. - -2010-04-09 Erik de Castro Lopo - - * programs/sndfile-convert.c - Fix valgrind warning. - -2010-04-06 Erik de Castro Lopo - - * programs/sndfile-cmp.c - When files differ in the PCM data, also print the difference offset. - Minor cleanup. - -2010-03-19 Erik de Castro Lopo - - * src/aiff.c - Don't use the 'twos' marker for 24 and 32 bit PCM, use 'in24' and 'in32' - instead. Thanks to Paul Davis (Ardour) for this suggestion. - -2010-02-28 Erik de Castro Lopo - - * configure.ac - Clean up configure report. - - * tests/utils.tpl - Add functions test_read_raw_or_die and test_write_raw_or_die. - - * tests/rdwr_test.(def|tpl) tests/Makefile.am - Add new test program and hook into build. - - * src/sndfile.c - Fix minor issues with sf_read/write_raw(). Bug reported by Milan Křápek. - - * tests/test_wrapper.sh.in - Add rdwr_test to the test wrapper script. - -2010-02-22 Erik de Castro Lopo - - * configure.ac - Remove -fpascal-strings from OSX's OS_SPECIFIC_CFLAGS. - - * programs/common.[ch] programs/sndfile-metadata-set.c - Apply a patch from Robin Gareus allowing the setting of the time reference - field of the BEXT chunk. - -2010-02-06 Erik de Castro Lopo - - * src/ima_adpcm.c - Add a fix from Jonatan Liljedahl to handle predictor overflow when decoding - IMA4. - -2010-01-26 Erik de Castro Lopo - - * src/sndfile.hh - Add a constructor which takes an existing file descriptor and then calls - sf_open_fd(). Patch from Sakari Bergen. - -2010-01-10 Erik de Castro Lopo - - * programs/sndfile-deinterleave.c programs/sndfile-interleave.c - Improve usage messages. - -2010-01-09 Erik de Castro Lopo - - * src/id3.c src/Makefile.am - Add new file src/id3.c and hook into build. - - * src/sndfile.c src/common.h - Detect and skip and ID3 header at the start of the file. - -2010-01-07 Erik de Castro Lopo - - * programs/common.c - Fix update_strings() copyright, comment, album and license are correctly - written. Thanks to Todd Allen for reporting this. - - * man/Makefile.am - Change GNU makeism to something more widely supported. Thanks to Christian - Weisgerber for reporting this. - - * configure.ac programs/Makefile.am programs/sndfile-play.c - Apply patch from Christian Weisgerber and Jacob Meuserto add support for - OpenBSD's sndio. - -2010-01-05 Erik de Castro Lopo - - * doc/api.html - Discourage the use of sf_read/write_raw(). - -2009-12-28 Erik de Castro Lopo - - * configure.ac - Test for Unix pipe() and waitpid() functions. - - * src/sfconfig.h tests/pipe_test.tpl - Disable pipe_test if pipe() and waitpid() aren't available. - -2009-12-16 Erik de Castro Lopo - - * configure.ac src/Makefile.am src/create_symbols_file.py - src/make-static-lib-hidden-privates.sh - Change name of generated file src/Symbols.linux to Symbols.gnu-binutils and - and use the same symbols file for other systems which use GNU binutils like - Debian's kfreebsd. - - * M4/shave.m4 shave.in - Update shave files from upstream. - -2009-12-15 Erik de Castro Lopo - - * man/sndfile-metadata-get.1 - Fix typo. - - * man/sndfile-interleave.1 man/Makefile.am - New man page. - -2009-12-13 Erik de Castro Lopo - - * src/ogg.c - When decoding to short or int, clip the decoded signal to [-1.0, 1.0] if - its too hot. Thanks to Dmitry Baikov for suggesting this. - - * NEWS README doc/*.html - Updates for 1.0.21. - -2009-12-09 Erik de Castro Lopo - - * programs/sndfile-jackplay.c man/sndfile-jackplay.1 - Remove these which will now be in found in the sndfile-tools package. - - * programs/Makefile.am man/Makefile.am - Remove build rules for sndfile-jackplay. - - * configure.ac - Remove detection of JACK Audio Connect Kit. - - * programs/sndfile-concat.c man/sndfile-concat.1 - Add new program with man page. - - * man/Makefile.am programs/Makefile.am - Hook sndfile-concat into build system. - -2009-12-08 Erik de Castro Lopo - - * tests/error_test.c - Don't terminate when sf_close() returns zero in error_close_test(). - It seems that Windows 7 behaves differently from earlier versions of - Windows. - -2009-12-03 Erik de Castro Lopo - - * configure.ac M4/*.m4 - Rename all custom macros from AC_* to MN_*. - - * programs/sndfile-interleave.c - Make it actually work. - -2009-12-02 Erik de Castro Lopo - - * doc/*.html configure.ac - Corrections and clarifications courtesy of Robin Forder. - - * programs/sndfile-convert.c programs/common.[ch] - Move some code from convert to common for reuse. - - * programs/sndfile-interleave.c programs/sndfile-interleave.c - Add new programs sndfile-interleave and sndfile-deinterleave. - - * programs/Makefile.am - Hook new programs into build. - -2009-12-01 Erik de Castro Lopo - - * src/create_symbols_file.py tests/stdio_test.c tests/win32_test.c - Minor OS/2 tweaks as suggested by David Yeo. - - * tests/multi_file_test.c - Fix file creation flags on windows. Thanks to Bruce Sharpe. - - * src/sf_unistd.h - Set all group and other file create permssions to zero. - - * tests/win32_test.c - Add a new test. - -2009-11-30 Erik de Castro Lopo - - * doc/print.css doc/*.html - Add a print stylesheet and update all HTML documents to reference it. - Thanks to Aditya Bhargava for suggesting this. - - * doc/index.html - Minor corrections. - -2009-11-29 Erik de Castro Lopo - - * sndfile.pc.in - Add a Libs.private entry to assist with static linking. - -2009-11-28 Erik de Castro Lopo - - * src/make-static-lib-hidden-privates.sh src/Makefile.am - Add a script to hide all non-public symbols in the libsndfile.a static - library. - -2009-11-22 Erik de Castro Lopo - - * tests/locale_test.c - Correct usage of ENABLE_SNDFILE_WINDOWS_PROTOTYPES. - -2009-11-20 Erik de Castro Lopo - - * src/windows.c - Correct usage of ENABLE_SNDFILE_WINDOWS_PROTOTYPES. - -2009-11-16 Erik de Castro Lopo - - * programs/sndfile-convert.c - Allow the program to read from stdin by specifying '-' on the command line - as the input file. - - * src/sndfile.h.in - Hash define ENABLE_SNDFILE_WINDOWS_PROTOTYPES to 1 for greater safety. - - * tests/virtual_io_test.c - Add a PAF/PCM_24 test and verify the file length is not negative - immediately after openning the file for write. - -2009-10-18 Erik de Castro Lopo - - * src/wav.c - When writing loop lengths, adjust the end position by one to make up for - Microsoft's screwed up spec. Thanks to Olivier Tristan for the patch. - -2009-10-14 Erik de Castro Lopo - - * src/flac.c - Apply patch from Uli Franke allowing FLAC files to be encoded at any sample - rate. - -2009-10-09 Erik de Castro Lopo - - * src/nist.c - Fix parsing of odd ulaw encoded file provided by Jan Silovsky. - - * configure.ac - Insist on libvorbis >= 1.2.3. Earlier verions have bugs that cause the - libsndfile test suite to fail on MIPS, PowerPC and others. - See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=549899 - -2009-10-06 Erik de Castro Lopo - - * man/sndfile-convert.1 - Fix warning from Debian's lintian checks. - - * man/sndfile-cmp.1 man/sndfile-jackplay.1 man/sndfile-metadata-get.1 - man/Makefile.am - Add three new minimal manpages and hook into build. - -2009-10-05 Erik de Castro Lopo - - * tests/test_wrapper.sh.in - Don't run cpp_test on x86_64-w64-mingw32. - -2009-09-28 Erik de Castro Lopo - - * tests/utils.tpl - On windows, make sure the open() function doesn't get called with a third - parameter of 0 which fails for no good reason. Also make sure this third - parameter doesn't get called with S_IRGRP when compiling for windows because - Wine complains. - - * src/sndfile.hh - Add a SndfileHandle constructor for windows that takes a 'const wchar_t *' - string. - - * doc/FAQ.html - Add Q/A : I'm cross compiling libsndfile for another platform. How can I - run the test suite? - - * src/create_symbols_file.py src/Makefile.am - Add Symbols.static target, a list of symbols, one per line. - -2009-09-27 Erik de Castro Lopo - - * tests/test_wrapper.sh.in - Update to allow all tests to be gathered up into a testsuite tarball and - then be run using this script. - - * build-test-tarball.mk.in - Add a Make script to build a tarball of all the test binaries and the test - wrapper script. This is useful for cross compiling; you can build the - binaries, build test test tarball and transfer the test tarball to the - target machine for testing. - -2009-09-26 Erik de Castro Lopo - - * src/common.h src/*.c - Modify SF_FILE struct to allow it to carry either 8-bit or 16-bit strings - for the file path, directory and name. Fixes for this change throughout. - - * src/windows.c src/Makefile.am - New file defining new windows only public function sf_wchar_open() which - takes a 'const wchar_t *' string (LPCWSTR) for the file name parameter. - - * src/sndfile.h.in - Add SF_CHANNEL_MAP_ABISONIC_* entries. - Add windows only defintion for sf_wchar_open(). - - * src/create_symbols_file.py - Add sf_wchar_open() to the list of public symbols (windows only). - - * tests/locale_test.c - Add a wchar_test() to test sf_wchar_open(). - -2009-09-25 Erik de Castro Lopo - - * src/common.h src/*.c - Split file stuff into PSF_FILE struct within the SF_PRIVATE struct. - -2009-09-23 Erik de Castro Lopo - - * src/aiff.c src/voc.c - When a byte is needed, use unsigned char. - - * src/ima_oki_adpcm.c src/broadcast.c src/test_ima_oki_adpcm.c - Include sfconfig.h to prevent compile errors with MinGW compilers. - - * configure.ac - Remove AM_CONFIG_HEADER due to warnings from autoconf 2.64. - - * tests/locale_test.c - Update to work with xx_XX.UTF-8 style locales. Refactoring. - -2009-09-22 Erik de Castro Lopo - - * configure.ac - Set __USE_MINGW_ANSI_STDIO to 1 when compiling using MinGW compilers. - Remove unneeded AC_SUBST. - Report Host CPU/OS/vendor. - -2009-09-19 Erik de Castro Lopo - - * src/sndfile.c - Fix error message string. - - * src/flac.c - Add 88200 to the list of supported sample rates. - - * src/ogg.c - Fix compiler warning when using gcc-4.5.0. - - * programs/sndfile-info.c tests/utils.tpl - Remove WIN32 snprintf #define. - - * src/ima_adpcm.c - Fix minor bug in aiff_ima_encode_block. Thanks to Denis Fileev for finding - this. - -2009-09-16 Erik de Castro Lopo - - * src/caf.c - Use the correct C99 format specifier for int64_t. - - * M4/endian.m4 - Fix detection of CPU endian-ness when cross compiling. Thanks to Pierre - Ossman for the bug report. - - * src/caf.c src/sndfile.c - Fix reading and writing of PEAK chunks in CAF files. - - * tests/peak_chunk_test.c tests/test_wrapper.sh.in - Run peak_chunk_test on CAF files. - -2009-09-15 Erik de Castro Lopo - - * src/aiff.c src/wav.c - Use the correct C99 format specifier for int64_t. - -2009-08-30 Erik de Castro Lopo - - * src/rf64.c src/sndfile.c src/wav.c src/wav_w64.h - Apply a patch (massaged slightly) from Uli Franke adding handling of the - BEXT chunk in RF64 files. - - * tests/command_test.c - Update channel_map_test() function so WAV test passes. - - * src/rf64.c - Add channel mapping and ambisonic support. - - * src/sndfile.h - Add comments showing correspondance between libsndfile channel map - defintiions and those used by Apple and MS. - - Add handling of reading/writing channel map info. - - * tests/command_test.c tests/test_wrapper.sh.in - Update channel map tests. - -2009-07-29 Erik de Castro Lopo - - * src/common.h - Add function psf_isprint() a replacement for the standard C isprint() - function which ignores any locale settings and treats all input as ASCII. - - * src/(aiff|common|rf64|sd2|strings|svx|wav).c - Use psf_isprint() instead of isprint(). - -2009-07-13 Erik de Castro Lopo - - * src/command.c - Add string descriptions for SF_FORMAT_RF64 and SF_FORMAT_MPC2K. - -2009-06-30 Erik de Castro Lopo - - * programs/sndfile-play.c - Allow use of Open Sound System audio output under FreeBSD. - -2009-06-24 Erik de Castro Lopo - - * configure.ac - Add patch from Conrad Parker to add --disable-jack. - -2009-05-28 Erik de Castro Lopo - - * src/alaw.c src/float32.c src/htk.c src/pcm.c src/sds.c src/ulaw.c - Fix bugs where invalid files can cause a divide by zero error (SIGFPE). - Thanks to Sami Liedes for reporting this a Debian bug #530831. - -2009-05-26 Erik de Castro Lopo - - * src/chanmap.[ch] - New files for channel map decoding/encoding. - -2009-05-25 Erik de Castro Lopo - - * configure.ac src/sndfile.h.in - Fix MSVC definition of sf_count_t. - -2009-05-24 Erik de Castro Lopo - - * src/wav_w64.[ch] - Add wavex_channelmask to WAV_PRIVATE struct and add a function to convert - an array of SF_CHANNEL_MASK_* values into a bit mask for use in WAV files. - - * src/wav.c - Add ability to write the channel mask. - -2009-05-23 Erik de Castro Lopo - - * programs/sndfile-info.c - Add -c command line option to dump the channel map information. - - * src/wav_w64.c - Don't bail from parser if channel map bitmask is faulty. - - * src/common.h src/sndfile.c - Remove error code SFE_W64_BAD_CHANNEL_MAP which is not needed any more. - - * src/sndfile.c - On SFC_SET_CHANNEL_MAP_INFO pass the channel map command down to container's - command handler. - -2009-05-22 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c src/wav_w64.c - Apply a patch from Lennart Poettering (PulseAudio) to allow reading of - channel data in WAV and W64 files. - Add a test for the above. - -2009-05-20 Erik de Castro Lopo - - * src/FAQ.html - Update the section about pre-compiled binaries for Win64. - -2009-05-14 Erik de Castro Lopo - - * src/common.h src/test_conversions.c - Be more careful when including so compiling on pre-C99 platforms - (hello Slowlaris) might actually work. - - * NEWS README doc/*.html - Updates for 1.0.20. - -2009-04-21 Erik de Castro Lopo - - * src/voc.c - Fix a bug whereby opening a specially crafted VOC file could result in a - heap overflow. Thanks to Tobias Klein (http://www.trapkit.de) for reporting - this issue. - - * src/aiff.c - Fix potential (heap) buffer overflow when parsing 'MARK' chunk. - -2009-04-12 Erik de Castro Lopo - - * tests/stdin_test.c - Check psf->error after opening file. - - * src/file_io.c - Fix obscure seeking bug reported by Hugh Secker-Walker. - - * tests/utils.tpl - Add check of sf_error to test_open_file_or_die(). - - * src/sndfile.c - Clear error if opening resource fork fails. - -2009-04-11 Erik de Castro Lopo - - * tests/alaw_test.c tests/locale_test.c tests/ulaw_test.c - Cleanup output. - -2009-03-25 Erik de Castro Lopo - - * src/float32.c - Fix f2s_clip_array. - -2009-03-24 Erik de Castro Lopo - - * src/float32.c - In host_read_f2s call convert instead of f2s_array. - - * src/ima_adpcm.c - Remove dead code. - - * src/test_ima_oki_adpcm.c examples/generate.c tests/dither_test.c - tests/dwvw_test.c tests/fix_this.c tests/generate.c - tests/multi_file_test.c - Minor fixes. - -2009-03-23 Erik de Castro Lopo - - * M4/shave.m4 shave.in - Pulled update from upstream. - -2009-03-19 Erik de Castro Lopo - - * doc/api.html - Add pointers to example programs in source code tarball. - -2009-03-17 Erik de Castro Lopo - - * src/common.h - Define SF_PLATFORM_S64 for non-gcc compilers with 'long long' type. - - * configure.ac - Add documentation for --disable-external-libs and improve error handling - for that option. - - * src/sndfile.c src/sndfile.h.in src/create_symbols_file.py - Add public function sf_version_string. - - * tests/sfversion.c - Test function sf_version_string. - - * M4/shave.m4 shave-libtool.in shave.in - Add new files from 'git clone git://git.lespiau.name/shave'. - - * configure.ac - Enable shave. - - * src/Makefile.am src/binheader_writef_check.py Octave/* - Shave related tweaks. - -2009-03-15 Erik de Castro Lopo - - * src/common.h src/caf.c src/sndfile.c - Add SF_MAX_CHANNELS (set to 256) and use it. - - * src/sndfile.h.in - Check for either _MSCVER or _MSC_VER being defined. - -2009-03-04 Erik de Castro Lopo - - * tests/vorbis_test.c - Relax test slighly to allow test to pass on more CPUs etc. - -2009-03-03 Erik de Castro Lopo - - * configure.ac - Detect vorbis_version_string() correctly. - -2009-03-02 Erik de Castro Lopo - - * doc/index.html - Add a 'See Also' section with a link to sndfile-tools. - - * NEWS README doc/*.html - Updates for 1.0.19 release. - - * configure.ac - Fix --enable-external-libs logic. - -2009-03-01 Erik de Castro Lopo - - * src/aiff.c - Fix resource leak and potential read beyond end of buffer. - - * src/nist.c - Fix reading of header value sample_n_bytes. - - * src/sd2.c src/wav.c - Fix potential read beyond end of buffer. - - * src/sndfile.c src/svx.c - Check return values of file_io functions. - - * tests/win32_test.c - Fix resource leak. - - * configure.ac - Detect the presence/absence of vorbis_version_string() in libvorbis. - - * src/ogg.c - Only call vorbis_version_string() from libvorbis if present. - -2009-02-24 Erik de Castro Lopo - - * tests/win32_test.c - Don't use sprintf, even on windows. - - * src/aiff.c src/rf64.c src/wav.c - Eliminate dead code, more validation of data read from file. - -2009-02-22 Erik de Castro Lopo - - * src/ima_adpcm.c - Clamp values to a valid range before indexing ima_step_size array. - - * src/GSM610/*.c tests/*c programs/*.c src/audio_detect.c - Don't include un-needed headers. - - * programs/sndfile-info.c - Remove dead code. - - * tests/test_wrapper.sh.in - Add 'set -e' so the script exits on error. - - * src/test_ima_oki_adpcm.c - Fix read beyond end of array. - - * tests/win32_test.c - Add missing close on file descriptor. - - * src/nist.c programs/sndfile-metadata-set.c - Fix 'unused variable' warnings. - - * src/aiff.c - Fix potential memory leak in handling of 'MARK' chunk. - Remove un-needed test (unsigned > 0). - - * src/sd2.c - Improve handling of heap allocated buffer. - - * src/sndfile.c - Remove un-needed test (always true). - - * src/wav.c src/rf64.c - Ifdef out dead code that will be resurected some time in the future. - - * src/wav.c src/w64.c src/xi.c - Handle error return values from psf_ftell. - - * src/wav_w64.c - Fix handling and error checking of MSADPCM coefficient arrays. - - * regtest/*.c - Bunch of fixes. - - * src/test_file_io.c - Use snprintf instead of strncpy in test program. - -2009-02-21 Erik de Castro Lopo - - * src/sd2.c - Validate data before using. - - * src/caf.c - Validate channels per frame value before using, fixing a possible integer - overflow bug, leading to a possible heap overflow. Found by Alin Rad Pop of - Secunia Research (CVE-2009-0186). - -2009-02-20 Erik de Castro Lopo - - * Octave/octave_test.sh - Unset TERM environment variable and export LD_LIBRARY_PATH. - -2009-02-16 Erik de Castro Lopo - - * src/file_io.c - In windows code, cast LPVOID to 'char*' in printf. - -2009-02-15 Erik de Castro Lopo - - * M4/octave.m4 - Clear the TERM environment before evaluating anything in Octave. This works - around problems that might occur if a users TERM settings are incorrect. - Thanks to Rob Til Freedmen for helping to debug this. - - * src/wav.c - Handle four zero bytes as a marker within a LIST or INFO chunk. - Thanks to Rogério Brito for supplying an example file. - -2009-02-14 Erik de Castro Lopo - - * src/common.h src/*.c - Use C99 snprintf everywhere. - -2009-02-11 Erik de Castro Lopo - - * tests/test_wrapper.sh.in - New file to act as the template for the test wrapper script. - - * configure.ac - Generate tests/test_wrapper.sh from the template. - - * tests/Makefile.am - Replace all tests with a single invocation of the test wrapper script. - -2009-02-09 Erik de Castro Lopo - - * src/ogg.c - Record vorbis library version string. - - * configure.ac - Require libvorbis >= 1.2.2. - - * M4/endian.m4 - Fix bracketing of function for autoconf 2.63. Thanks to Richard Ash. - - * M4/octave.m4 M4/mkoctfile_version.m4 - Clean up AC_WITH_ARG usage using AC_HELP_STRING. - -2009-02-08 Erik de Castro Lopo - - * Octave/Makefile.am - Use $(top_buildir) instead of $(builddir) which may not be defined. - - * M4/octave.m4 - Improve logic and status reporting. - -2009-02-07 Erik de Castro Lopo - - * configure.ac AUTHORS NEWS README doc/*.html - Final tweaks for 1.0.18 release. - -2009-02-03 Erik de Castro Lopo - - * programs/sndfile-convert.c - Add 'htk' to the list of convert formats. - - * programs/sndfile-info.c - Simplify get_signal_max using SFC_CALC_SIGNAL_MAX command. - Increase size of files for which signal max will be calculated. - -2009-01-14 Erik de Castro Lopo - - * doc/index.html - Fix links for SoX and WavPlay. Thanks to Daniel Griscom. - -2009-01-11 Erik de Castro Lopo - - * programs/sndfile-metadata-get.c - Make valgrind clean. - Clean up temp string array usage. - Error out if trying to update coding history in RDWR mode. - -2009-01-10 Erik de Castro Lopo - - * doc/index.html - Fix links to versions of the LGPL. - -2008-12-14 Erik de Castro Lopo - - * tests/string_test.c - Add test for RDWR mode where the file ends up shorter than when it was - opened. - - * src/wav.c - Truncate the file on close for RDWR mode where the file ends up shorter - than when it was opened. - -2008-11-30 Erik de Castro Lopo - - * M4/add_cflags.m4 - Fix problem with quoting of '#include'. - - * M4/add_cxxflags.m4 configure.ac - Add new file M4/add_cxxflags.m4 and use it in configure.ac. - -2008-11-19 Erik de Castro Lopo - - * programs/sndfile-info.c - Apply patch from Conrad Parker to calculate and display total duration when - more than one file is dumped. - -2008-11-10 Erik de Castro Lopo - - * configure.ac src/Makefile.am - Tweaks to generation of Symbols files. - - * tests/win32_ordinal_test.c - Update tests for above changes. - -2008-11-06 Erik de Castro Lopo - - * programs/common.c - When merging broadcast info, make sure to clear the destination field - before copying in the new data. - - * programs/test-sndfile-metadata-set.py - Add test for the above. - - * src/broadcast.c - Fix checking of required coding_history_size. - -2008-10-28 Erik de Castro Lopo - - * tests/command_test.c - Add test to detect if coding history is truncated. - - * src/broadcast.c - Fix truncation of coding history. - -2008-10-27 Erik de Castro Lopo - - * tests/command_test.c - Add broadcast_coding_history_size test. - - * programs/*.[ch] - Use SF_BROADCAST_INFO_VAR to manipulate larger 'bext' chunks. - - * src/rf64.c - Add code to prevent infinite loop on malformed file. - - * src/common.h src/sndfile.c src/w64.c src/wav_w64.c - Rationalize and improve error handling when parsing 'fmt ' chunk. - - * M4/octave.m4 - Simplify and remove cruft. - Check for correct Octave version. - - * Octave/* - Reduce 3 C++ files to one, fix build for octave 3.0, fix build. - - * Octave/sndfile.cc Octave/PKG_ADD - Add Octave function sfversion which returns the libsndfile version that the - module is linked against. - - * Octave/Makefile.am - Bunch of build and 'make distcheck' fixes. - -2008-10-26 Erik de Castro Lopo - - * programs/common.c - Return 1 if SFC_SET_BROADCAST_INFO fails. - - * programs/test-sndfile-metadata-set.py - Update for new programs directory, exit on any error. - - * tests/error_test.c - Fix failure behaviour in error_number_test. - - * src/common.h src/sndfile.c - Add error number SFE_BAD_BROADCAST_INFO_SIZE. - - * src/* - Reimplement handling of broadcast extentioon chunk in WAV/WAVEX files. - - * src/broadcast.c - Fix generation of added coding history. - -2008-10-25 Erik de Castro Lopo - - * programs/sndfile-metadata-get.c programs/sndfile-info.c - Exit with non-zero on errors. - -2008-10-21 Erik de Castro Lopo - - * examples/sndfile-to-text.c examples/Makefile.am - Add a new example program and hook it into the build. - - * examples/ programs/ - Add a new directory programs and move sndfile-info, sndfile-play and other - real programs to the new directory, leaving example programs where they - were. - -2008-10-20 Erik de Castro Lopo - - * tests/Makefile.am - Automake 1.10 MinGW cross compiling fixes. - -2008-10-19 Erik de Castro Lopo - - * examples/sndfile-play.c - Remove call to deprecated function snd_pcm_sw_params_get_xfer_align. - Fix gcc-4.3 compiler warnings. - - * tests/command_test.c - Fix a valgrind warning. - - * tests/error_test.c tests/multi_file_test.c tests/peak_chunk_test.c - tests/pipe_test.tpl tests/stdio_test.c tests/win32_test.c - Fix gcc-4.3 compiler warnings. - -2008-10-17 Erik de Castro Lopo - - * src/broadcast.c - Fix termination of desitination string in strncpy_crlf. - When copying BROADCAST_INFO chunk, make sure destination gets correct line - endings. - - * examples/common.c - Fix copying of BROADCAST_INFO coding_history field. - -2008-10-13 Erik de Castro Lopo - - * tests/command_test.c - Add test function instrument_rw_test, but don't hook it into the testing - yet. - - * src/common.h src/command.c src/sndfile.c src/flac.c - Error code rationalization. - - * src/common.h src/sndfile.c - Set psf->error to SFE_CMD_HAS_DATA when adding metadata via sf_command() - fails due to psf->have_written being true. - - * doc/command.html - Document the SFC_GET/SET_BROADCAST_INFO comamnds. - -2008-10-10 Erik de Castro Lopo - - * tests/command_test.c - Improve error reporting when '\0' is found in coding history. - Fix false failure. - -2008-10-09 Erik de Castro Lopo - - * src/broadcast.c - Convert all coding history line endings to \r\n. - - * tests/command_test.c - Add test to make sure all line endings are converted to \r\n. - -2008-10-08 Erik de Castro Lopo - - * src/broadcast.c - Changed the order of coding history fields. - - * tests/command_test.c - Update bextch test to cope with previous change. - - * examples/common.c - Add extra length check when copying broadcast info data. - -2008-10-05 Erik de Castro Lopo - - * tests/utils.tpl tests/pcm_test.tpl - Update check_file_hash_or_die to use 64 bit hash. - - * tests/checksum_test.c tests/Makefile.am - Add new checksum_test specifically for lossy compression of headerless - files. - -2008-10-04 Erik de Castro Lopo - - * src/gsm610.c - Seek to psf->dataoffset before decoding first block. - - * src/sndfile.c - Fix detection of mpc2k files on big endian systems. - -2008-10-03 Erik de Castro Lopo - - * src/broadcast.c - Use '\r\n' newlines in Coding History as required by spec. - -2008-10-02 Erik de Castro Lopo - - * src/test_conversions.c - Use int64_t instead of 'long long'. - -2008-10-01 Erik de Castro Lopo - - * examples/sndfile-metadata-set.c - Remove --bext-coding-history-append command line option because it didn't - really make sense. - - * examples/sndfile-metadata-(get|set).c - Add usage messages. - - * examples/test-sndfile-metadata-set.py - Start work on test coding history. - -2008-09-30 Erik de Castro Lopo - - * README doc/win32.html - Bring these up to date. - - * src/aiff.c - Fix parsing of REX files. - -2008-09-29 Erik de Castro Lopo - - * src/file_io.c - Use intptr_t instead of long for return value of _get_osfhandle. - - * src/test_conversions.c src/test_endswap.tpl - Fix printing of int64_t values. - - * examples/sndfile-play.c - Fix win64 issues. - - * tests/win32_ordinal_test.c - Fix calling of GetProcAddress with ordinal under win64. - - * tests/utils.tpl - Fix win64 issues. - -2008-09-25 Erik de Castro Lopo - - * examples/* - Rename copy_data.[ch] to common.[ch]. Fix build. - Move code from sndfile-metadata-set.c to common.c. - - * examples/Makefile.am tests/Makefile.am regtest/Makefile.am - Clean paths. - -2008-09-19 Erik de Castro Lopo - - * doc/tutorial.html doc/Makefile.am - Add file doc/tutorial.html and hook into build/dist system. - -2008-09-14 Erik de Castro Lopo - - * examples/sndfile-metadata-set.c - Clean up handling of bext command line params. - -2008-09-13 Erik de Castro Lopo - - * src/w64.c - Add handling/skipping of a couple of new chunk types. - -2008-09-09 Erik de Castro Lopo - - * configure.ac - Add -funsigned-char to CFLAGS if the compiler supports it. - - * examples/sndfile-metadata-(get|set).c - Add handling for more metadata types. - -2008-09-04 Erik de Castro Lopo - - * src/common.h - Add macros SF_CONTAINER, SF_CODEC and SF_ENDIAN useful for splitting format - field of SF_INFO into component parts. - - * src/*.c - Use new macros everywhere it is appropriate. - -2008-09-02 Erik de Castro Lopo - - * examples/sndfile-bwf-set.c - Massive reworking. - -2008-08-24 Erik de Castro Lopo - - * examples/sndfile-bwf-set.c - Add --info-auto-create-date command line option. - - * examples/sndfile-metadata-set.c examples/sndfile-metadata-get.c - examples/Makefile.am examples/test-sndfile-bwf-set.py - Rename sndfile-bwf-(set|get).c to sndfile-metadata-(set|get).c. - Change command line args. - -2008-08-23 Erik de Castro Lopo - - * src/wav.c - Allow 'PAD ' chunk to be modified in RDWR mode. - - * src/sndfile.h.in src/sndfile.c - Add handling (incomplete) for SFC_SET_ADD_HEADER_PAD_CHUNK. - - * tests/Makefile.am tests/write_read_test.tpl tests/header_test.tpl - tests/misc_test.c - Add tests for RF64. - - * src/rf64.c - Fixes to make sure all tests pass. - - * tests/Makefile.am tests/string_test.c - Add string tests (not yet passing). - -2008-08-22 Erik de Castro Lopo - - * src/rf64.c - First pass at writing RF64 now working. - -2008-08-21 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add SF_FORMAT_RF64 to format_map. - - * src/common.h src/sndfile.c - More RF64 support code. - - * examples/sndfile-bwf-set.c - Fix the month number in autogenerated date string and use hypen in date - instead of slash. - - * examples/test-sndfile-bwf-set.py - Update tests. - - * examples/sndfile-info.c - When called with -i or -b option, operate on all files on command line, not - just the first. - -2008-08-19 Erik de Castro Lopo - - * src/rf64.c - New file to handle RF64 (WAV like format supportting > 4Gig files). - - * src/sndfile.h.in src/common.h src/sndfile.c src/Makefile.am - Hook the above into build so hacking can begin. - - * src/pcm.c - Improve log message when pcm_init fails. - - * src/sndfile-info.c - Only calculate and print 'Signal Max' if file is less than 10 megabytes in - length. - -2008-08-18 Erik de Castro Lopo - - * tests/string_test.c - Polish string_multi_set_test. - - * src/wav.c - In RDWR mode, pad the header if necessary (ie LIST chunk has moved or - length has changed). - Minor fixes in wav_write_strings. - Write PAD chunk with default endian-ness, not a specific endian-ness. - - * examples/test-sndfile-bwf-set.py - Add Python script to test sndfile-bwf-set/get. - - * examples/sndfile-bwf-set.c - Clean up and fixes. - - * src/wav.c - Merge function wavex_write_header into wav_write_header, deleting about 70 - lines of code. - - * src/common.h - Double value of SF_MAX_STRINGS. - - * tests/string_test.c - Add string tests for WAVEX and RIFX files. - - * tests/command_test.c - Add broadcast test for WAVEX files. - -2008-08-17 Erik de Castro Lopo - - * tests/string_test.c - Add a new string_rdwr_test (currently failing for WAV). - Add a new string_multi_set_test (currently failing). - - * tests/command_test.c - Add new broadcast_rdwr_test (currently failing). - - * src/wav.c - Fix to WAV parser to allow 'bext' chunk to be updated in place. - In wav_write_tailer, seek to psf->dataend if its greater than zero. - - * src/sndfile.c - Make sure psf->have_written gets set correctly in mode SFM_RDWR. - - * configure.ac - Test for and gettimeofday. - - * src/common.c - Use gettimeofday() to initialize psf_rand_int32. - - * src/common.h src/sndfile.c - Add unique_id field to SF_PRIVATE struct. - - * src/common.h src/sndfile.c src/wav.c src/wav_w64.[ch] - Move wavex_ambisonic field from SF_PRIVATE struct to WAV_PRIVATE struct. - - * src/common.h src/strings.c - Add function psf_location_string_count. - -2008-08-16 Erik de Castro Lopo - - * configure.ac - Test for localtime and localtime_r. - - * examples/sndfile-convert.c - In function copy_metadata(), copy broadcast info if present. - - * examples/copy_data.[ch] examples/Makefile.am - Break some functionality out of sndfile-convert.c so it can be used in - examples/sndfile-bwf-set.c. - - * tests/utils.tpl - Add new function create_short_sndfile(). - - * examples/sndfile-bwf-set.c examples/sndfile-bwf-get.c - examples/Makefile.am - Add new files and hook into build. - -2008-08-11 Erik de Castro Lopo - - * src/sndfile.h.in - Fix comments. Patch from Mark Glines. - -2008-07-30 Erik de Castro Lopo - - * tests/misc_test.c - Use zero_data_test on Ogg/Vorbis files. - - * src/ogg.c - Fix segfault when closing an Ogg/Vorbis file that has been opened for write - but had no actual data written to it. Bug reported by Chinoy Gupta. - - * tests/Makefile.am - Make sure to run mist_test on Ogg/Vorbis files. - -2008-07-19 Erik de Castro Lopo - - * regtest/Makefile.am - Use SQLITE3_CFLAGS to locate sqlite headers. - -2008-07-10 Erik de Castro Lopo - - * doc/index.html doc/FAQ.html - Add notes about which versions of windows libsndfile works on. - -2008-07-03 Erik de Castro Lopo - - * tests/misc_test.c - Add a test for correct handling of Ambisonic files. Thanks to Fons - Adriaensen for the test. - - * src/wav.c src/wav_w64.c - Fix handling of Ambisonic files. Thanks to Fons Adriaensen for the patch. - -2008-06-29 Erik de Castro Lopo - - * configure.ac - Fix detection/enabling of external libs. - - * M4/extra_pkg.m4 M4/Makefile.am - Add m4 macro PKG_CHECK_MOD_VERSION which is a hacked version - PKG_CHECK_MODULES. The new macro prints the version number of the package - it is searching for. - -2008-06-14 Erik de Castro Lopo - - * src/aiff.c - Apply a fix from Axel Röbel where if the second loop in the instrument - chunk is none, the loop mode is written into the first loop. - -2008-05-31 Erik de Castro Lopo - - * src/test_float.c src/test_main.(c|h) src/Makefile.am - Add new file to test functions float32_(le|be)_(read|write) and - double64_(le|be)_(read|write). Hook into build and testsuite. - - * src/double64.c src/float32.c - Fix bugs in functions found by test added above. Thanks to Nicolas Castagne - for reporting this bug. - - * src/sndfile.h.in - Change time_reference_(low|high) entries of SF_BROADCAST_INFO struct to - unsigned. - - * examples/sndfile-info.c - Print out the BEXT time reference in a sensible format. - -2008-05-21 Erik de Castro Lopo - - * src/*.c - Fuzz fixes. - - * src/ogg.c - Add call to ogg_stream_clear to fix valgrind warning. - - * src/aiff.c - Fix x86_64 compile issue. - - * configure.ac src/Makefile.am src/flac.c src/ogg.c - Link to external versions of FLAC, Ogg and Vorbis. - - * tests/lossy_comp_test.c tests/ogg_test.c tests/string_test.c - tests/vorbis_test.c tests/write_read_test.tpl - Fix tests when configured with --disable-external-libs. - - * tests/external_libs_test.c tests/Makefile.am - Add new test and hook into build and test suite. - - * src/command.c - Use HAVE_EXTERNAL_LIBS to ensure that the SFC_GET_FORMAT_* commands return - the right data when external libs are disabled. - -2008-05-11 Erik de Castro Lopo - - * tests/write_read_test.tpl - Add a test for extending a file during write by seeking past the current - end of file. - - * src/sndfile.c - Allow seeking past end of file during write. - -2008-05-10 Erik de Castro Lopo - - * doc/api.html doc/command.html - Move all information about the sf_command function to command.html and add - a link from documentation of the sf_read/write_raw function to the - SFC_RAW_NEEDS_ENDSWAP command. - - * doc/index.html doc/FAQ.html doc/libsndfile.css - Minor documentation tweaks. - -2008-05-09 Erik de Castro Lopo - - * configure.ac - Add AM_PROG_CC_C_O. - -2008-04-27 Erik de Castro Lopo - - * tests/error_test.c - Add a test to make sure if file opened with sf_open_fd, and then the file - descriptor is closed, then sf_close will return an error code. Thanks to - Dave Flogeras for the bug report. - - * src/sndfile.c - Make sf_close return an error is the file descriptor is already closed. - -2008-04-19 Erik de Castro Lopo - - * configure.ac - Set object format to aout for OS/2. Thanks to David Yeo. - - * src/mpc2k.c src/sndfile.c src/sndfile.h.in src/common.h src/Makefile.am - Add ability to read MPC 2000 file. - - * tests/write_read_test.tpl tests/misc_test.c tests/header_test.tpl - tests/Makefile.am - Add tests for MPC 2000 file format. - - * examples/sndfile-convert.c - Allow conversion to MPC 2000 file format. - -2008-04-17 Erik de Castro Lopo - - * src/VORBIS/lib/codebook.c - Sync from upstream SVN. - - * autogen.sh configure.ac - Minor tweaks. - -2008-04-13 Erik de Castro Lopo - - * src/ogg.c - Add a patch that fixes finding the length in samples of an Ogg/Vorbis file. - The patch as supplied segfaulted and required many hours of debugging. - - * src/OGG/bitwise.c - Sync from upstream SVN. - -2008-04-09 Erik de Castro Lopo - - * src/aiff.c - Fix up handling of 'APPL' chunk. Thanks to Axel Röbel for bringing up - this issue. - -2008-04-06 Erik de Castro Lopo - - * tests/*.c - Add calls to sf_close() where needed. - - * tests/utils.tpl tests/multi_file_test.c - Always pass 0 as the third argument to open when OS_IS_WIN32. - -2008-04-03 Erik de Castro Lopo - - * src/test_* - Add files test_main.[ch]. - Collapse all tests into a single executable. - -2008-03-30 Erik de Castro Lopo - - * src/FLAC - Sync to upstream CVS. - -2008-03-25 Erik de Castro Lopo - - * src/common.h - Make SF_MIN and SF_MAX macros MinGW friendly. - - * examples/sndfile-(info|play).c - Use Sleep function from instead of _sleep. - - * tests/locale_test.c - Disable some tests when OS_IS_WIN32. - - * src/FLAC/src/share/replaygain_anal/replaygain_analysis.c - src/FLAC/src/share/utf8/utf8.c - MinGW fixes. - -2008-03-11 Erik de Castro Lopo - - * doc/FAQ.html - Tweaks to pcm16 <-> float conversion answer. - -2008-02-10 Erik de Castro Lopo - - * src/OGG - Sync to SVN upstream. - - * Makefile.am - Add 'DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror'. - -2008-02-05 Erik de Castro Lopo - - * examples/sndfile-jackplay.c - Minor tweaks to warning message printed when compiled without libjack. - -2008-01-27 Erik de Castro Lopo - - * tests/peak_chunk_test.c - Improve read_write_peak_test to find more errors. Inspired by example - provided by Nicolas Castagne. - - * src/aiff.c - Another SFM_RDWR fix shown up by above test. - -2008-01-24 Erik de Castro Lopo - - * src/aiff.c - Fix reading of COMM encoding string. - - * src/chunk.c src/common.h src/Makefile.am - New file for storing and retrieving info about header chunks. Hook into - build. - - * src/aiff.c - Use new chunk logging to fix problem with AIFF in RDWR mode. - -2008-01-22 Erik de Castro Lopo - - * src/command.c - Add WVE to the list of major formats. - - * tests/aiff_rw_test.c - Fix error reporting. - -2008-01-21 Erik de Castro Lopo - - * src/common.[ch] - Add internal functions str_of_major_format, str_of_minor_format, - str_of_open_mode and str_of_endianness. - - * tests/write_read_test.tpl - Fix reporting of errors in new_rdwr_XXXX_test. - -2008-01-20 Erik de Castro Lopo - - * examples/sndfile-play.c - Apply patch from Yair K. to fix compiles with OSS v4. - - * src/common.h src/float32.c src/double64.c - Rename psf->float_enswap to psf->data_endswap. - - * src/sndfile.h.in src/sndfile.c src/pcm.c - Add command SFC_RAW_NEEDS_ENDSWAP. - - * tests/command.c - Add test for SFC_RAW_NEEDS_ENDSWAP. - - * doc/command.html - Document SFC_RAW_NEEDS_ENDSWAP. - - * tests/peak_chunk_test.c - Add test function read_write_peak_test. Thanks to Nicolas Castagne for the - bug report. - -2008-01-09 Erik de Castro Lopo - - * examples/sndfile-cmp.c - Add new example program contributed by Conrad Parker. - - * examples/Makefile.am - Hook into build. - - * doc/development.html - Change use or reconfigure.mk to autogen.sh. - -2008-01-08 Erik de Castro Lopo - - * tests/win32_test.c - Add another win32 test. - - * tests/util.tpl - Add function file_length_fd which wraps fstat. - - * tests/Makefile.am - Run the multi_file_test on AU files. - - * tests/multi_file_test.c - Use function file_length_fd() instead of file_length() to overcome stupid - win32 bug. Fscking hell Microsoft sucks so much. - -2008-01-05 Erik de Castro Lopo - - * src/sd2.c - Fix a rsrc parsing bug. Example file supplied by Uli Franke. - -2007-12-28 Erik de Castro Lopo - - * doc/index.html - Allow use of either LGPL v2.1 or LGPL v3. - - * tests/header_test.tpl - Add header_shrink_test from Axel Röbel. - - * src/wav.c - Add fix from Axel Röbel for writing files with float data but no peak - chunk (ie peak chunk gets removed after the file is opened). - - * src/aiff.c tests/header_test.tpl - Apply similar fix to above for AIFF files. - - * src/wav.c tests/header_test.tpl - Apply similar fix to above for WAVEX files. - - * src/command.c - Add Ogg/Vorbis to 'get format' commands. - -2007-12-16 Erik de Castro Lopo - - * src/ogg.c - Fix seeking on multichannel Ogg Vorbis files. Reported by Bodo. - Set the default encoding quality to 0.4 instead of 4.0 (Bodo again). - - * tests/ogg_test.c - Add stereo seek tests. - -2007-12-14 Erik de Castro Lopo - - * tests/ogg_test.c - Add a test (currently failing) for stereo seeking on Ogg Vorbis files. Test - case supplied by Bodo. - - * tests/utils.(def|tpl) - Add compare_XXX_or_die functions. - -2007-12-05 Erik de Castro Lopo - - * src/aiff.c - Fix a bug where ignoring ssnd_fmt.offset and ssnd_fmt.blocksize caused - misaligned reading of 24 bit data. Thanks to Uli Franke for reporting this. - -2007-12-03 Erik de Castro Lopo - - * src/vox_adpcm.c src/ima_oki_adpcm.[ch] src/Makefile.am - Merge in code from the vox-patch branch. Thanks to Robs for the patch - which fixes a long standing bug in the VOX codec. - -2007-12-01 Erik de Castro Lopo - - * examples/sndfile-convert.c - Fix handling of -override-sample-rate=X option. - -2007-11-25 Erik de Castro Lopo - - * src/ogg.c src/VORBIS - Merge in Ogg Vorbis support from John ffitch of the Csound project. - -2007-11-24 Erik de Castro Lopo - - * src/sndfile.c - Recognise files with 'vox6' extension as 6kHz OKI VOX ADPCM files. Also - recognise 'vox8' as and 'vox' as 8kHz files. - - * configure.ac - Detect libjack (JACK Audio Connect Kit). - - * examples/sndfile-jackplay.c examples/Makefile.am - Add new example program to play sound files using the JACK audio server. - Thanks to Jonatan Liljedahl for allowing this to be included. - -2007-11-21 Erik de Castro Lopo - - * doc/index.html - Update support table with SD2 and FLAC. - -2007-11-17 Erik de Castro Lopo - - * src/sndfile.c - Fix calculation of internal value psf->read_current when attempting to read - past end of audio data. - Remove redundant code. - - * tests/lossy_comp_test.c - Add read_raw_test to check that raw reads do not go past the end of the - audio data section. - Clean up error output messages. - - * src/sndfile.c - Add code to prevent sf_read_raw from reading past the end of the audio data. - - * tests/Makefile.am - Add the wav_pcm lossy_comp_test. - -2007-11-16 Erik de Castro Lopo - - * configure.ac src/Makefile.am src/create_symbols_file.py - More OS/2 fixes from David Yeo. - -2007-11-12 Erik de Castro Lopo - - * src/file_io.c tests/utils.tpl tests/benchmark.tpl - Improve handling of requirements for O_BINARY as suggested by Ed Schouten. - -2007-11-11 Erik de Castro Lopo - - * src/common.h - Fix symbol class when SF_MIN is nested inside SF_MAX or vice versa. - - * src/create_symbols_file.py - Add support for OS/2 contributed by David Yeo. - -2007-11-05 Erik de Castro Lopo - - * M4/gcc_version.m4 - Add macro AC_GCC_VERSION to detect GCC_MAJOR_VERSION and GCC_MINOR_VERSION. - - * configure.ac - Use AC_GCC_VERSION to work around gcc-4.2 inline warning stupidity. - See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995 - Use -fgnu-inline to prevent stupid warnings. - -2007-11-03 Erik de Castro Lopo - - * tests/util.tpl - Increase the printing width for print_test_name(). - - * tests/command_test.c tests/Makefile.am - Add tests for correct updating of broadcast WAV coding history. - - * examples/sndfilehandle.cc examples/Makefile.am - Add example program using the C++ SndfileHandle class. - -2007-10-29 Erik de Castro Lopo - - * src/common.h src/sndfile.c - Add error codes SFE_ZERO_MAJOR_FORMAT and SFE_ZERO_MINOR_FORMAT. - -2007-10-26 Erik de Castro Lopo - - * src/sd2.c - Identify sample-rate/sample-size/channels by resource id. - -2007-10-25 Erik de Castro Lopo - - * src/broadcast.c src/common.h src/sndfile.c - Improvements to handling of broadcast info in WAV files. Thanks to Frederic - Cornu and other for their input. - -2007-10-24 Erik de Castro Lopo - - * src/FLAC/include/share/alloc.h - Mingw fix for SIZE_T_MAX from Uli Franke. - -2007-10-23 Erik de Castro Lopo - - * tests/open_fail_test.c tests/error_test.c tests/Makefile.am - Move tests from open_fail_test.c to error_test.c and remove the former. - -2007-10-22 Erik de Castro Lopo - - * tests/scale_clip_test.(def|tpl) - Add tests for SFC_SET_INT_FLOAT_WRITE command. - - * doc/command.html - Add docs for SFC_SET_INT_FLOAT_WRITE command. - - * examples/sndfile-play.c tests/dft_cmp.c - Fix gcc-4.2 warning messages. - -2007-10-21 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Add command SFC_GET_CURRENT_SF_INFO. - - * src/sndfile.h.in src/sndfile.c src/create_symbols_file.py - Remove function sf_get_info (only ever in pre-release code). - - * tests/command_test.c - Add test for SFC_GET_CURRENT_SF_INFO. - -2007-10-15 Erik de Castro Lopo - - * src/wav.c - Add parsing of 'exif' chunks. Originally coded by Trent Apted. - - * configure.ac - Put config stuff in Cfg directory. - Remove check for inttypes.h. - -2007-10-10 Erik de Castro Lopo - - * src/w64.c - Fix writing of 'riff' chunk length and check for correct value in parser. - -2007-09-20 Erik de Castro Lopo - - * doc/index.html - Link to MP3 FAQ entry. - -2007-09-18 Erik de Castro Lopo - - * src/flac.c - Move the blocksize check to an earlier stage of flac_buffer_copy. - -2007-09-12 Erik de Castro Lopo - - * src/FLAC - Huge merge from FLAC upstream. - -2007-09-10 Erik de Castro Lopo - - * examples/*.c - Change license to all example programs to BSD. - -2007-09-08 Erik de Castro Lopo - - * src/FLAC/include/FLAC/metadata.h - Include to prevent compile error on OSX. - - * Octave/octave_test.sh - Disable test on OSX. Can't get it to work. - - * src/flac.c - Check the blocksize returned from the FLAC decoder to prevent buffer - overruns. Reported by Jeremy Friesner. Thanks. - -2007-09-07 Erik de Castro Lopo - - * Makefile.am M4/octave.m4 - Fix build when Octave headers are not present. - -2007-08-27 Erik de Castro Lopo - - * doc/development.html - Add note about bzr repository directory looking empty. - -2007-08-26 Erik de Castro Lopo - - * configure.ac Octave/* M4/octave_* - Bunch of changes to add ability to build GNU Octave modules to read/write - sound files using libsndfile from Octave. - -2007-08-23 Erik de Castro Lopo - - * acinclude.m4 configure.ac ... - Get rid of acinclude.m4 and replace it with an M4 directory. - -2007-08-21 Erik de Castro Lopo - - * src/sndfile.h.in - Remove crufty Metrowerks compiler support. Allow header file to be compiled - on windows with both GCC and microsoft compiler. - -2007-08-19 Erik de Castro Lopo - - * tests/dft_cmp.[ch] tests/floating_point_test.tpl - Clean up floating point tests. - -2007-08-14 Erik de Castro Lopo - - * src/aiff.c - Fix segfault when COMM chunk length is byte swapped. - -2007-08-09 Erik de Castro Lopo - - * src/common.h src/mat4.c src/mat5.c src/sndfile.c - Add a generic SFE_CHANNEL_COUNT_ZERO error, remove format specific errors. - - * src/au.c - Fix crash on AU files with zero channel count. Reported by Ben Alison. - -2007-08-08 Erik de Castro Lopo - - * src/voc.c - Fix bug in handling file supplied by Matt Olenik. - -2007-07-31 Erik de Castro Lopo - - * src/OGG - Merge from OGG upstream sources. - -2007-07-25 Erik de Castro Lopo - - * src/FLAC - Merge from FLAC upstream sources. - -2007-07-15 Erik de Castro Lopo - - * src/flac.c - Fix memory leak; set copy parameter to FALSE in call to - FLAC__metadata_object_vorbiscomment_append_comment. - - * src/common.[ch] - Add function psf_rand_int32(). - -2007-07-14 Erik de Castro Lopo - - * src/FLAC - Merge from FLAC upstream sources. - - * src/strings.c tests/string_test.c tests/Makefile.am - Make sure string tests for SF_STR_LICENSE actually works. - -2007-07-13 Erik de Castro Lopo - - * tests/string_test.c - Add ability to test strings stored in metadata secion of FLAC files. - - * src/string.c - Fix logic for testing if audio data has been written and string is added. - Make sure SF_STR_ALBUM actually works. - - * src/flac.c - Finalize reading/writing string metadata. Tests pass. - - * src/sndfile.h.in tests/string_test.c src/flac.c - Add string type SF_STR_LICENSE, update test and use for FLAC files. - - * src/sndfile.h.in - Add definition for SFC_SET_SCALE_FLOAT_INT_WRITE command. - - * src/common.h src/double64.c src/float32.c src/sndfile.c - Add support for SFC_SET_SCALE_FLOAT_INT_WRITE (still needs testing). - -2007-07-12 Erik de Castro Lopo - - * src/flac.c - Apply patch from Ed Schouten to read artist and title metadata from FLAC - files. - Improve reporting of FLAC metadata. - - * src/sndfile.h.in tests/string_test.c src/flac.c - Add string type SF_STR_ALBUM, update test and use for FLAC files. - -2007-06-28 Erik de Castro Lopo - - * src/FLAC/* - Merge from upstream CVS. - -2007-06-16 Erik de Castro Lopo - - * src/FLAC/* - Update from upstream CVS. - -2007-06-14 Erik de Castro Lopo - - * tests/cpp_test.cc - Add extra tests for when the SndfileHandle constructor fails. - - * src/sndfile.hh - Make sure failure to open the file in the constructor does not allow later - calls to other methods to fail. - -2007-06-10 Erik de Castro Lopo - - * tests/util.tpl - Add function write_mono_file. - - * tests/generate.[ch] tests/Makefile.am - Add files generate.[ch] and hook into build. - - * tests/write_read_test.tpl - Add multi_seek_test. - - * src/flac.c - Fix buffer overflow bug. Test provided by Jeremy Friesner and fix provided - by David Viens. - -2007-06-07 Erik de Castro Lopo - - * doc/FAQ.html - Minor update. - - * configure.ac src/FLAC/src/libFLAC/ia32/Makefile.am src/Makefile.am - Apply patch from Trent Apted make it compile on Intel MacOSX. Thanks Trent. - -2007-05-28 Erik de Castro Lopo - - * src/wav.c - Fix writing of MSGUID subtypes. Thanks to Bruce Sharpe. - -2007-05-22 Erik de Castro Lopo - - * src/wav.c - Fix array indexing bug raised by Bruce Sharpe. - -2007-05-12 Erik de Castro Lopo - - * src/FLAC/src/share/getopt/getopt.c - Fix Mac OSX / PowerPC compile warnings. - - * configure.ac - Make sure WORDS_BIGENDIAN gets correctly defined for FLAC code. - -2007-05-04 Erik de Castro Lopo - - * doc/FAQ.html - Add Q/A about MP3 support. - -2007-05-03 Erik de Castro Lopo - - * doc/new_file_type.HOWTO - Minor updates. - -2007-05-02 Erik de Castro Lopo - - * src/wve.c - Fix a couple bad parameters with psf_log_printf. - - * src/pcm.c - Improve error reporting. - - * src/common.h src/common.c - Constify psf_hexdump. - -2007-04-30 Erik de Castro Lopo - - * src/FLAC - Ditch and re-import required FLAC code. - - * configure.ac - Force FLAC__HAS_OGG variable to 1. - - * src/FLAC/src/libFLAC/stream_encoder.c - Fix compiler warnings. - -2007-04-23 Erik de Castro Lopo - - * configure.ac tests/win32_ordinal_test.c - Detect if win32 DLL is beging generated and only run win32_ordinal_test if - true. - - * src/G72x/Makefile.am src/Makefile.am - Use $(EXEEXT) where possible. - -2007-04-18 Erik de Castro Lopo - - * src/wve.c src/common.h src/sndfile.c - Complete definition of SfE_WVE_NO_WVE error message. - - * src/wve.c - Fix error in files generated on big endian systems. Robustify parsing. - -2007-04-16 Erik de Castro Lopo - - * src/double64.c - Fix clipping of double to short conversions on 64 bit systems. - - * src/flac.c regtest/database.c tests/cpp_test.cc - Fix compile warnings for 64 bit systems. - -2007-04-15 Erik de Castro Lopo - - * src/wav.c src/wav_w64.c - Use audio detect function when 'fmt ' chunk data is suspicious. - - * configure.ac - Add ugly hack to remove -Werror from some Makefiles. - -2007-04-14 Erik de Castro Lopo - - * src/GSM610/long_term.c src/macbinary3.c tests/cpp_test.cc - Add patch from André Pang to clean up compiles on OSX. - - * src/wve.c src/common.h src/sndfile.c src/sndfile.h.in - examples/sndfile-convert.c - Merge changes from Reuben Thomas to improve WVE support. - - * tests/lossy_comp_test.c tests/Makefile.am - Add tests for WVE files. - -2007-04-11 Erik de Castro Lopo - - * src/sndfile.hh - Add a static SndfileHandle::formatCheck method as suggested by Jorge - Jiménez. - -2007-04-09 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_error() where the function itself was being compared - against zero. Add a check for a NULL return from peak_info_calloc. Fix a - possible NULL dereference. - -2007-04-07 Erik de Castro Lopo - - * src/flac.c - Turn off seekable flag when writing, return SFE_BAD_RDWR_FORMAT when - opening file for RDWR. - - * src/sndfile.c - Improve error message for SFE_BAD_RDWR_FORMAT. - - * src/mat4.c - Fix array indexing issue. Thanks to Ben Allison (Nullsoft) for alerting me. - -2007-03-05 Erik de Castro Lopo - - * doc/FAQ.html - Add Q/A 19 on project files. - -2007-03-01 Erik de Castro Lopo - - * src/sndfile.c - Guard agains MacOSX universal binary compiles. - - * doc/FAQ.html - Add Q/A 18 and clean up Q3. - -2007-02-22 Erik de Castro Lopo - - * src/aiff.c - Add support for 'in24' files. - -2007-02-13 Erik de Castro Lopo - - * src/wav.c src/wav_w64.c src/wav_w64.h - Start work towards detecting ausio codec type from the actual audio data. - - * src/audio_detect.c src/test_audio_detect.c - Add new file and its unit test. - -2007-02-07 Erik de Castro Lopo - - * examples/cooledit-fixer.c examples/Makefile.am - Remove old broken example program. - -2007-02-06 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h.in src/create_symbols_file.py - Add function sf_get_info. - -2007-01-25 Erik de Castro Lopo - - * examples/sndfile-play.c - For ALSA, use the 'default' device instead of 'plughw:0'. - -2007-01-22 Erik de Castro Lopo - - * src/sndfile.c - Allow writing of WAV/WAVEX 'BEXT' chunks in SFM_RDWR mode. - -2007-01-21 Erik de Castro Lopo - - * doc/development.html doc/embedded_files.html man/sndfile-play.1 - Minor documentation fixes. Thanks Reuben Thomas. - -2006-12-16 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add -override-sample-rate command line option. - -2006-11-19 Erik de Castro Lopo - - * tests/misc_test.c - Force errno to zero at start of some tests. - - * src/sndfile.c - Minor clean up of error handling. - - * configure.ac - Remove an assembler test which was failing on OSX. - -2006-11-15 Erik de Castro Lopo - - * src/common.h - Fix the definition of SF_PLATFORM_S64 for MinGW. - - * src/FLAC/Makefile.am src/FLAC/share/grabbag/Makefile.am - Fix path problems for MinGW. - -2006-11-13 Erik de Castro Lopo - - * src/sfendian.h - Add include guard. - - * src/Makefile.am src/flac.c - Clean up include paths. - - * src/test_conversions.c - New file to test psf_binheader_readf/writef functions. - - * src/Makefile.am src/test_file_io.c src/test_log_printf.c src/common.c - Clean up unit testing. - - * src/common.c - Fix a bug reading/writing 64 bit header fields. Thanks to Jonathan Woithe - for reporting this. - - * src/test_conversions.c - Complete unit test for above fix. - -2006-11-11 Erik de Castro Lopo - - * src/sndfile.c - More refactoring to clean up psf_open_file() and vairous sf_open() - functions. - -2006-11-09 Erik de Castro Lopo - - * src/wav.c - Apply a patch from Jonathan Woithe to allow opening of (malformed) WAV - files of over 4 gigabytes. - -2006-11-05 Erik de Castro Lopo - - * src/sndfile.c - Refactor function psf_open_file() to provide a single return point. - - * tests/misc_test.c - Fix permission_test to ensure that read only file can be created. - -2006-11-03 Erik de Castro Lopo - - * src/common.h - Add SF_PLATFORM_S64 macro as a platform independant way of doing signed 64 - bit integers. - - * src/aiff.c src/svx.c src/wav.c - Add warning in log if files are larger than 4 gigabytes in size. - -2006-11-01 Erik de Castro Lopo - - * src/FLAC src/OGG confgure.ac src/Makefile.am - Pull in all required FLAC and OGG code so external libraries are not - needed. This makes compiling on stupid fscking Windoze easier. - -2006-10-27 Erik de Castro Lopo - - * src/sd2.c - Add workaround for switched sample rate and sample size. - - * src/wav.c - Add workaround for excessively long coding history in the 'bext' chunk. - -2006-10-23 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c src/wav.c doc/command.html - Use SF_AMBISONIC_* instead of SF_TRUE/SF_FALSE. - -2006-10-22 Erik de Castro Lopo - - * src/sndfile.h.in src/wav.c src/wav_w64.c src/common.h doc/command.html - Apply a patch from Fons Adriaensen to allow writing on WAVEX Ambisonic - files. Still needs a little tweaking before its ready for release. - - * src/*.c - Use the UNUSED macro to prevent compiler warnings. - -2006-10-19 Erik de Castro Lopo - - * src/aiff.c - Fix a bug in parsing AIFF files with a slightly unusual 'basc' chunk. Thanks - to David Viens for providing two example files. - - * src/common.(c|h) src/aiff.c - Add a function psf_sanitize_string and use it in aiff.c. - -2006-10-18 Erik de Castro Lopo - - * src/wav_w64.c - Apply a patch from Fons Adriaensen which fixes a minor WAVEX GUID issue. - -2006-10-17 Erik de Castro Lopo - - * src/Makefile.am - Fix problem related to recent test coverage changes. - -2006-10-15 Erik de Castro Lopo - - * configure.ac tests/Makefile.am - Add --enable-test-coverage configure option. - -2006-10-05 Erik de Castro Lopo - - * src/sndfile.hh - Add an std::string SndfileHandle constructor. - - * tests/scale_clip_test.tpl - Fix the 'make distcheck' target. - -2006-10-03 Erik de Castro Lopo - - * src/double64.c src/float32.c - Add optional clipping on float file data to int read data conversions. - - * tests/tests/scale_clip_test.(def|tpl) - Add test for above new code. - -2006-09-06 Erik de Castro Lopo - - * tests/aiff_rw_test.c - Add 'MARK' chunks to make sure they are parsed correctly. - -2006-09-05 Erik de Castro Lopo - - * src/aiff.c - Fix parsing of MARK chunks. Many thanks to Sciss for generating files to - help debug the problem. - -2006-09-02 Erik de Castro Lopo - - * src/common.h - Make the SF_MIN and SF_MAX macros at least partially type safe. - - * tests/lossy_comp_test.c - Fix overflow problems when ensuring that signalis not zero. - -2006-08-31 Erik de Castro Lopo - - * configure.ac docs/*.html - Changes for release 1.0.17. - -2006-08-08 Erik de Castro Lopo - - * src/flac.c - Remove inline from functions called by pointer. Thanks to Sampo Savolainen - for notifying me of this. - -2006-07-31 Erik de Castro Lopo - - * src/sndfile.hh - Add writeSync method. - Add copy constructor and assignment operator (thanks Daniel Schmitt). - Add methods readRaw and writeRaw. - Make read/write/readf/writef simple overlaods instead of templates (thanks - to Trent Apted for suggesting this). - - * tests/cpp_test.cc - Cleanup. Add tests. - -2006-07-30 Erik de Castro Lopo - - * src/sndfile.hh - Templatize the read/write/readf/writef methods as suggested by Lars Luthman. - Prevent the potential leak of SNDFILE* pointers in the openRead/openWrite/ - openReadWrite methods. - Add const to SF_INFO pointer in Sndfile constructor. - Make the destrictor call the close() method. - - * tests/cpp_test.cc - Add more tests. - -2006-07-29 Erik de Castro Lopo - - * tests/cpp_test.cc - Remove the generated file so "make distcheck" passes. - - * src/Makefile.am - Add sndfile.hh to distributed header files. - - * src/sndfile.hh - Change the license for the C++ wrapper to modified BSD. - -2006-07-28 Erik de Castro Lopo - - * src/sndfile.hh - Complete it. - - * tests/cpp_test.cc - Add more tests. - -2006-07-27 Erik de Castro Lopo - - * tests/utils.tpl - Add extern C to generated header file. - - * src/sndfile.hh - Work towards completing this. - - * tests/cpp_test.cc tests/Makefile.am - Add a C++ test and hook into build. - - * configure.ac - Add appropriate CXXFLAGS. - -2006-07-26 Erik de Castro Lopo - - * configure.ac - Test if compiler supports -Wpointer-arith. - - * src/common.c - Fix a warning resulting from -Wpointer-arith. - -2006-07-15 Erik de Castro Lopo - - * examples/sndfile-play.c - Explicitly set endian-ness as well as setting 16 bit output. - - * examples/sndfile-info.c - Make sure to parse info if file fails to open. - - * src/sndfile.c - Handle parse error a little better. - - * src/wav_w64.[ch] - Minor clean up, add detection of IPP ITU G723.1. - -2006-06-23 Erik de Castro Lopo - - * src/sndfile.c - Make sure psf->dataoffset gets reset to zero when openning headersless - files based on the file name extension. - -2006-06-21 Erik de Castro Lopo - - * tests/(command|lossy_comp|pcm|scale_clip)_test.c tests/fix_this.c - tests/write_read_test.(tpl|def) - Fix gcc-4.1 compiler warnings about "dereferencing type-punned pointer will - break strict-aliasing rules". - - * examples/cooledit-fixer.c - More fixes like above. - -2006-06-20 Erik de Castro Lopo - - * src/file_io.c - Fix a windows bug where the syserr string of SF_PRIVATE was not being set - correctly. - - * src/sndfile.c - Fixed a logic bug in sf_seek(). Thanks to Paul Davis for finding this. - -2006-06-04 Erik de Castro Lopo - - * configure.ac - Fixed detection of S_IRGRP. - -2006-05-30 Erik de Castro Lopo - - * sndfile-convert.c - Add conversion SF_INSTRUMENT data when present. - -2006-05-22 Erik de Castro Lopo - - * doc/development.html - Removed references to tla on windows. - - * src/common.h src/sndfile.c - Add separate void pointers for file containter and file codec data to - SF_PRIVATE struct. Still need to move all existing fdata pointers. - - * tests/write_read_test.tpl - Change the order of some tests. - - * src/aiff.c - When writing 'AIFC' files, make sure get an 'FVER' gets added. - - * src/common.h src/(dwvw|flac|g72x|gsm610|ima_adpcm|ms_adpcm|paf|sds).c - src/(sndfile|voc|vox_adpcm|xi).c - Remove fdata field from SF_PRIVATE struct and replace it with codec_data. - -2006-05-10 Erik de Castro Lopo - - * Win32/testprog.c Win32/Makefile.am - Add a minimal win32 test program. - - * Win32/README-precompiled-dll.txt Mingw-make-dist.sh - Update readme and Mingw build script. - -2006-05-09 Erik de Castro Lopo - - * configure.ac acinclude.m4 - Minor fixes for Solaris. - -2006-05-05 Erik de Castro Lopo - - * src/test_endswap.(def|tpl) - Fix printf formatting for int64_t on 64 bit machines. - -2006-05-04 Erik de Castro Lopo - - * src/binhead_check.py - New file to check for bad parameters passed to psf_binheader_writef(). - - * src/Makefile.am - Hook into test suite. - - * src/voc.c src/caf.c src/wav.c src/mat5.c src/mat4.c - Fix bugs found by new test program. - - * src/double64.c - Clean up double64_get_capability(). - -2006-05-03 Erik de Castro Lopo - - * src/wav_w64.c - Fix a bug on x86_64 where an int was being passed via stdargs and being - read using size_t which is 64 bits. Thenks to John ffitch for giving me a - login on his box. - -2006-05-02 Erik de Castro Lopo - - * src/caf.c src/double64.c examples/sndfile-info.c tests/virtual_io_test.c - tests/utils.tpl - Fix a couple of signed/unsigned problems. - -2006-05-01 Erik de Castro Lopo - - * tests/command_test.c - Add channel map tests. - - * src/common.h src/sndfile.c - Add a pointer to the SF_PRIVATE struct and make sure it gets freed in - sf_close(). - -2006-04-30 Erik de Castro Lopo - - * configure.ac doc/(command|index|api).html NEWS README - Updates for 1.0.16 release. - - * src/sndfile.h.in - Define enums for channel mapping. - - * examples/sndfile-info.c - Clean up usage of SF_INFO struct. - -2006-04-29 Erik de Castro Lopo - - * tests/util.tpl - Add function testing function exit_if_true(). - - * tests/floating_point_test.tpl - Fix a problem where the test program was not exiting when the test failed. - -2006-04-15 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.c - Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS. - - * doc/commands.html - Document new commands. Other minor updates. - - * tests/peak_chunk_test.c - Update tests for new commands. - -2006-04-02 Erik de Castro Lopo - - * tests/peak_chunk_test.c - Add test for RIFX and WAVEX files. - Try and confuse the PEAK chunk writing by enabling and disabling it. - - * src/sndfile.c - Fix a bug where enabling and disabling PEAK chunk was screwing up. - -2006-03-31 Erik de Castro Lopo - - * src/sndfile.h.in - Add the block of 190 reserved bytes into this struct to allow for - future expansion. - - * src/wav.c src/sndfile.c src/broadcast.c - Significant cleanup of broadcast wave stuff. - - * examples/sndfile-info.c - Fix print message. - - * tests/command_test.c tests/Makefile.am - Complete bext tests, hook test in test suite. - -2006-03-30 Erik de Castro Lopo - - * src/sndfile.h.in - Make coding_history field of SF_BROADCAST_INFO struct a char array instead - of a char pointer. - - * src/sndfile.c src/common.h src/wav.c - Clean up knock on effects of above chnage. - - * examples/sndfile-info.c - Add -b command line option to usage message. - Clean up output of broadcast wave info. - - * src/wav.c - Ignore and skip the 'levl' chunk. - -2006-03-26 Erik de Castro Lopo - - * configure.ac - Fix handling of --enable and --disable configure args. Thanks to Diego - 'Flameeyes' Pettenò who sent the patch. - -2006-03-22 Erik de Castro Lopo - - * doc/win32.html - Make it really clear that although the MSVC++ cannot compile libsndfile, - the precompiled DLL can be used in C++ programs compiled with MSVC++. - -2006-03-18 Erik de Castro Lopo - - * src/aiff.c - Fix bug in writing of INST chunk in AIFF files. - Fix potential bug in writing MARK chunks. - - * src/sndfile.c - Make sure the instrument chunk can only be written at the start of the file. - - * tests/command_test.c - Add check of log buffer. - - * tests/utils.tpl - Add usage of space character to psf_binheader_writef. - -2006-03-17 Erik de Castro Lopo - - * src/Makefile.am tests/Makefile.am - Remove --source-time argument from autogen command lines. - - * src/broadcast.c - New file for EBU Broadcast chunk in WAV files. - - * src/sndfile.c src/sndfile.h.in src/wav.c src/common.h - Add patch from Paul Davis implementing read/write of the BEXT chunk. - -2006-03-16 Erik de Castro Lopo - - * Win32/README-precompiled-dll.txt - New file descibing how to use the precompiled DLL. - - * Win32/Makefile.am - Add Win32/README-precompiled-dll.txt to EXTRA_DIST files. - - * configure.ac - Bump version to 1.0.15. - -2006-03-11 Erik de Castro Lopo - - * src/wav.c - On read, only add the endian flag if the file is big endian. - - * src/ms_adpcm.c - Fixed writing of APDCM coeffs in RIFX files. - - * tests/write_read_test.tpl tests/lossy_comp_test.c - Add tests for RIFX files. - -2006-03-10 Erik de Castro Lopo - - * Mingw-make-dist.sh - Bunch of improvements. - - * doc/win32.html - Update MinGW program versions. - -2006-03-09 Erik de Castro Lopo - - * src/create_symbols_file.py - Fix the library name in created win32 DEF file. Add correct DLL name for - Cygwin DLL. - - * Win32/Makefile.am tests/Makefile.am - Remove redundant files, add win32_ordinal_test to test suite. - - * tests/win32_ordinal_test.c - Update to do test in cygsndfile-1.dll as well. - - * doc/win32.html - Fix typo, mention that -mno-cygwin with the Cygwin compiler does not work. - - * src/wav.c src/wav_w64.c src/sndfile.c src/sndfile.h.in - Apply large patch from Jesse Chappell which adds support for RIFX files. - -2006-03-08 Erik de Castro Lopo - - * Makefile.am - Add Mingw-make-dist.sh to the extra dist files. - - * configure.ac - Fix setting SHLIB_VERSION_ARG for MinGW. - - * tests/win32_ordinal_test.c - New test program to test that the win32 DLL ordinals agree with the DEF - file. - -2006-03-04 Erik de Castro Lopo - - * src/common.h - Add a static inline function to convert an int to a size_t. This will be - a compile to nothing on 32 bit CPUs and a sign extension on 64 bit CPUs. - - * src/aiff.c src/avr.c src/common.c src/xi.c src/gsm610.c - Fix an ia64 problem where a varargs function was being passed an int in - some places and a size_t in other places. - - * src/sd2.c - Add a workaround for situations where OSX seems to add an extra 0x52 bytes - to the start of the resource fork. - -2006-02-19 Erik de Castro Lopo - - * Mingw-make-dist.sh - Add a shell script to build the windows binary/source ZIP file. - - * doc/index.html - Add download link for windows binary/source ZIP file. Add links for GPG - signatures. - - * doc/win32.html - Remove info about building using microsoft compiler. - - * configure.ac - Bump version to 1.0.14. - -2006-02-11 Erik de Castro Lopo - - * src/sd2.c - Improve logging of errors in resource fork parser. - -2006-01-31 Erik de Castro Lopo - - * Win32/Makefile.msvc - Replace au_g72x.* with g72x.*. Thanks to ussell Borogove. - -2006-01-29 Erik de Castro Lopo - - * src/common.c - Make sure return values are initialised header buffer is full. - - * src/wav.c - Add workarounds for messed up WAV files. - -2006-01-21 Erik de Castro Lopo - - * Win32/config.h - Undef HAVE_INTTYPES_H for win32. - - * tests/command_test.c - Don't exit on error in instrument test for XI files. - - * configure.ac - Bump version to 1.0.13. - - * doc/*.html NEWS README - Update version numbers. - -2006-01-19 Erik de Castro Lopo - - * src/xi.c - Start work on add read/write of instrument chunks. - - * src/command_test.c - Add tests for XI instrument chunk. - - * tests/largefile_test.c tests/Makefile.am - Add new test and hook it into the build system. This test will not be run - automatically because it requires 3 Gig of disk space and takes 3 minutes - to run. - -2006-01-10 Erik de Castro Lopo - - * examples/sndfile-play.c - Fix calculation of samples remaining in win32 code. Thanks Axel Röbel. - - * src/common.h - Make sure length of header buffer can hold header plus strings. Thanks Axel - Röbel. - -2006-01-09 Erik de Castro Lopo - - * src/sndfile.h.in src/aiff.c src/wav.c - Apply a patch from John ffitch (Csound project). - Add detune field to SF_INSTRUMENT struct. - Add reading/writing instrument chunks to WAV files. - - * tests/command_test.c - Update SF_INSTRUMENT tests. - - * tests/Makefile.am - Hook instrument tests into test suite. - -2006-01-05 Erik de Castro Lopo - - * configure.ac - Check for because some broken systems (like Solaris) don't have - which is the 1999 ISO C standard file containing int64_t. - - * src/sfendian.h src/common.h - Use if is not available. - -2005-12-30 Erik de Castro Lopo - - * tests/peak_chunk_test.c - Extend and clean up tests. - - * src/sndfile.c - Fix a bug that prevented the turning off of PEAK chunks. - -2005-12-29 Erik de Castro Lopo - - * tests/error_test.c - Make the test distclean correct. - - * src/file_io.c - Fix an SD2 MacOSX bug (reported by vince schwarzinger). - -2005-12-28 Erik de Castro Lopo - - * src/aiff.c tests/command_test.c - Apply a big patch from John ffitch (Csound project) to add reading and - writing of instrument chunks to AIFF files. Also update the test. - -2005-12-10 Erik de Castro Lopo - - * tests/aiff_rw_test.c tests/virtual_io_test.c tests/utils.tpl - Move test function dump_data_to_file() to utils.tpl. - - * tests/error_test.c tests/Makefile.am - Updates, including a new test to test that sf_error() returns a valid error - number. - -2005-12-07 Erik de Castro Lopo - - * examples/list_formats.c - Make sure the SF_INFO struct is memset to all zero before being used. - Thanks to Stephen F. Booth. - - * src/sndfile.c - Make the return value of sf_error() match the API documentation. - -2005-11-19 Erik de Castro Lopo - - * examples/sndfile-convert.c - Allow conversion to raw gsm610. - - * src/common.h src/sndfile.c src/au.c - Remove au_nh_open() and all references to it (wasn't working anyway). - - * tests/headerless_test.c - Add new test for file extension based detection. - - * src/sndfile.c - Rejig file extension based file type detection. - -2005-11-16 Erik de Castro Lopo - - * src/sndfile.c - Add "gsm" as a recognised file extension when no magic number can be found. - - * tests/lossy_comp_test.c tests/Makefile.am - Test headerless GSM610. - -2005-11-13 Erik de Castro Lopo - - * doc/api.html - Fix a minor typo and a minor error. Thanks Christoph Kobe and John Pavel. - -2005-10-30 Erik de Castro Lopo - - * src/wav_w64.c - Add more reporting of 'fmt ' chunk for G721 encoded files. - - * src/wav.c - Gernerate a more correct 20 byte 'fmt ' chunk rather than a 16 byte one. - -2005-10-29 Erik de Castro Lopo - - * src/G72x/g72x.[ch] - Minor cleanup of interface. - -2005-10-28 Erik de Castro Lopo - - * src/ogg.c - Removed the horribly broken and non-functional OGG implementation when - --enable-experimental was enabled. When OGG does finally work it will be - merged. - - * src/caf.c - Fix a memory leak. - -2005-10-27 Erik de Castro Lopo - - * src/g72x.c src/G72x/*.(c|h) src/common.h src/sndfile.c src/wav.c src/au.c - Add support for G721 encoded WAV files. - - * doc/index.html - Update support matrix. - - * tests/lossy_comp_test.c - For file formats that support it, add string data after the audio data and - make sure it isn't treated as audio data on read. - - * src/gsm610.c - Add code to ensure that the container close function (ie for WAV files) gets - called after the codec's close function. This allows GSM610 encoded WAV files - to have string data following the audio data. - Add an AIFF specific check on psf->datalength. - - * src/wav.c - Simplify wav_close function. - - * src/aiff.c - Make sure the tailer data gets written at an even file offset. Pad if - necessary. - - * src/common.h - Replace the close function pointer in SF_PRIVATE with separate functions - codec_close and container_close. The former is always called first. - - * src/*.c - Fix knock on effects of above. - -2005-10-26 Erik de Castro Lopo - - * examples/sndfile-info.c - Complete dumping SF_INSTRUMENT data. - - * src/dwvw.c src/ima_adpcm.c src/gsm610.c src/ms_adpcm.c - Add extra checks in *_init function. - - * tests/lossy_comp_test.c - Add a string comment to the end of the files to make sure that the decoder - doesn't decode beyond the end of the audio data section. - -2005-10-25 Erik de Castro Lopo - - * examples/sndfile-info.c - Minor code cleanup. - Start work on dumping SF_INSTRUMENT data. - -2005-10-23 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/common.c - Update definition of SF_INSTRUMENT struct and create a function to allocate - and initialize the struct (input from David Viens). - Clean up definition of SF_INSTRUMENT struct. - - * src/wav.c src/wav_w64.c - Add support for Ambisoncs B WAVEX files (David Viens). - - * src/aiff.c src/wav.c src/wav_w64.c - Start work on reading/writing the SF_INSTRUMENT data. - - * src/sndfile.c - Add code to get and set SF_INSTRUMENT data. - - * tests/command_test.* tests/Makefile.am - Add test for set and getof SF_INSTRUMENT data. - The file command_test.c is no longer autogen generated. - -2005-10-15 Erik de Castro Lopo - - * src/gsm610.c - Minor cleanup. - -2005-10-14 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Minor cleanup. - -2005-10-13 Erik de Castro Lopo - - * src/*.c - Ensure sfconfig.h is included before any other header file. - - * src/file_io.c - Add comments documenting the three sections of the file. - - * src/gsm610.c - Make sure SF_FORMAT_WAVEX are handled correctly. - -2005-10-07 Erik de Castro Lopo - - * configure.ac - Add options to allow disabling of FLAC and ALSA. Suggested by Ben Greear. - -2005-09-30 Erik de Castro Lopo - - * tests/locale_test.c - Modify the way the unicode strings were encoded so that older compilers - do not complain. Thanks Axel Röbel. - - * configure.ac - Bump the version to 1.0.12 for release. - - * NEWS README Win32/config.h doc/(FAQ|index.html|command|api).html - Update version numbers. - -2005-09-26 Erik de Castro Lopo - - * src/flac.c - Fix valgrind error and minor cleanup. - -2005-09-25 Erik de Castro Lopo - - * src/(au|paf|aiff|w64|wav|svx).c - Make sure structs are initialised. - -2005-09-24 Erik de Castro Lopo - - * configure.ac - Make -Wdeclaration-after-statement work with --enable-gcc-werror configure - option. - Add -std=gnu99 (C99 plus posix style stuff like gmtime_r) to CFLAGS if the - compiler supports it. - -2005-09-23 Erik de Castro Lopo - - * configure.ac acinclude.m4 - Add -Wdeclaration-after-statement to CFLAGS if the compilers supports it. - -2005-09-22 Erik de Castro Lopo - - * tests/util.(tpl|def) - Make the test_write_*_or_die() functions const safe. - -2005-09-21 Erik de Castro Lopo - - * src/nist.c - Make sure the data offset is read from the file header. Thanks to - David A. van Leeuwen for a patch. - -2005-09-20 Erik de Castro Lopo - - * configure.ac src/sfconfig.h - Check for and the function setlocale(). - Set config variables to zero if not found. - - * tests/locale_test.c tests/Makefile.am - Add new test program and hook into build/test system. - -2005-09-18 Erik de Castro Lopo - - * src/common.h src/file_io.c - On windows, use windows specific types for file handles. - Add functions psf_init_files() and psf_use_rsrc(). - - * src/sd2.c - Make resource fork handling independant of file desciptor/handles. - - * src/sndfile.c src/test_file_io.c - Fix knock on effects. - -2005-09-06 Erik de Castro Lopo - - * src/float_cast.h - The lrint and lrintf implementations in Cygwin are both buggy and slow. - Add replacements which were pulled from the Public Domain MinGW math.h - header file. - -2005-09-05 Erik de Castro Lopo - - * tests/(lossy_comp_test|virtual_io_test).c - More Valgrind fixups. - - * configure.ac - Simplify and correct configuring for Cygwin. - - * Win32/config.h Win32/sndfile.h Win32/Makefile.msvc - Update build for MSVC. - -2005-09-04 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Make sure to close SNDFILE when exiting test when file format is not seekable. - - * tests/(aiff_rw_test|virtual_io_test).c - Do a few valgrind fix ups. - -2005-09-03 Erik de Castro Lopo - - * src/float32.c src/double64.c - Replace floating point equality comparisons with greater/less comparisons. - Found by John Pavel using the Intel compiler. - - * src/sfconfig.h - New file to clean up issues surrounding autoconf generated preprocessor - symbols. - - * src/*.(c|h) tests/*.(c|tpl) examples/*.c - Fixed a bunch of other stuff found by John Pavel using the Intel compiler. - - * src/file_io.c - Remove Mac OS9 Metrowerks compiler specific hacks. - -2005-08-31 Erik de Castro Lopo - - * src/w64.c - Cast integer literal to sf_count_t in call to psf_binheader_writef() to - prevent Valgrind error. - -2005-08-30 Erik de Castro Lopo - - * doc/command.html - Improve documentation of SF_GET_FORMAT_SUBTYPE. - -2005-08-26 Erik de Castro Lopo - - * examples/sndfile-convert.c - Allow files to be converted to SD2 format. - - * src/sd2.c - Fix a bug in reading and writing of SD2 files on little endian CPUs. - Thanks to Matthew Willis for finding this. - -2005-08-25 Erik de Castro Lopo - - * doc/api.html - Update Note2 to point to SFC_SET_SCALE_FLOAT_INT_READ. - -2005-08-16 Erik de Castro Lopo - - * configure.ac - Use $host_os instead of $target_os (thanks to Mo De Jong). - -2005-08-15 Erik de Castro Lopo - - * src/Makefile.am - Apply a patch from Mo DeJong to allow building outside of the source dir. - - * src/file_io.c - Fix psf_fsync() for win32. - - * src/wav.c src/wav_w64.(c|h) - Move some code from wav.c to wav_w64.c to improve the log output of files of - type WAVE_FORMAT_EXTENSIBLE. - -2005-08-10 Erik de Castro Lopo - - * src/create_symbols_file.py - Make sure sf_write_fsync is an exported symbol. - - * examples/sndfile-convert.c - Add support for writing VOX adpcm files. - -2005-07-31 Erik de Castro Lopo - - * doc/api.html - Document the new function sf_write_sync(). - - * doc/FAQ.html - Do you plan to support XYZ codec. - -2005-07-28 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Add function sf_write_sync() to the API. - - * src/common.h src/file_io.c - Low level implementation (win32 not done yet). - - * tests/write_read_test.tpl - Use the new function in the tests. - -2005-07-24 Erik de Castro Lopo - - * src/common.h src/double64.c src/float32.c src/sndfile.c - Change the way PEAK chunk info is stored. Peaks now stored as an sf_count_t - for position and a double as the value. - - * src/aiff.c src/caf.c src/wav.c - Fix knock on effects of above changes. - - * src/caf.c - Implement 'peak' chunk for file wuth data in SF_FORMAT_FLOAT or - SF_FORMAT_DOUBLE format. - -2005-07-23 Erik de Castro Lopo - - * src/nist.c - Fix a bug where a variable was being used without being initialized. - - * src/flac.c - Add extra debug in sf_flac_meta_callback. - Make a bunch of private functions static. - - * src/aiff.c src/wav.c - Fix allocation for PEAK_CHUNK (bug found using valgrind). - -2005-07-21 Erik de Castro Lopo - - * src/common.h - Move the peak_loc field of SF_PRIVATE to the PEAK_CHUNK struct. - Remove had_peak field of SF_PRIVATE, use pchunk != NULL instead. - Rename PEAK_CHUNK and PEAK_POS to PEAK_CHUNK_32 and PEAK_POS_32. - - * src/aiff.c src/caf.c src/wav.c src/float32.c src/double64.c - Fix knock on effects from above. - -2005-07-19 Erik de Castro Lopo - - * src/wav.c - Prevent files with unknown chunks from being opened read/write. - -2005-07-14 Erik de Castro Lopo - - * src/flac.c - Do not use psf->end_of_file because it never gets set to anything. - - * src/common.h - Remove unused SF_PRIVATE field end_of_file. - -2005-07-12 Erik de Castro Lopo - - * src/common.c - Change the 'S' format specifier of psf_binheader_writef() to write AIFF - style strings (no terminating character). - - * src/aiff.c - Move to new (correct) AIFF string style. Thanks to Axel Röbel for being - so persistent on this issue. - -2005-07-11 Erik de Castro Lopo - - * src/sndfile.c - Allow SFE_UNSUPPORTED_FORMAT as an error from sf_open(). - - * doc/api.html doc/command.html - Documentation updates (thanks to Kyroz for promoting these updates). - - * src/mat5.c - Modify the way the header is written. - -2005-07-10 Erik de Castro Lopo - - * src/caf.c - Add a 'free' chunk to the written file so that the audio data starts at - an offset of 0x1000. - - * src/sndfile.c - Allow SFE_UNSUPPORTED_FORMAT as an error from sf_open(). - -2005-07-09 Erik de Castro Lopo - - * src/caf.c src/sndfile.c - Add support for signed 8 bit integers. - - * tests/write_read_test.tpl - Add test for signed 8 bit integers in CAF files. - - * doc/index.html - Update matrix for signed 8 bit integers in CAF files. - -2005-07-08 Erik de Castro Lopo - - * src/sndfile.c - Update sf_check_format() to support CAF. - - * examples/sndfile-convert.c - Add support for ".caf" file extension. - - * doc/index.html - Add Apple CAF to the support matrix. - - * src/caf.c - Add file write support. - - * src/common.c - Fix printing of Frames. - - * tests/Makefile.am tests/write_read_test.tpl tests/lossy_comp_test.c - tests/header_test.tpl misc_test.c - Add tests for CAF files. - -2005-07-07 Erik de Castro Lopo - - * doc/FAQ.html - Fix Q/A about reading/writing memory buffers. - - * src/caf.c - Bunch of work to support reading of CAF files. - -2005-07-04 Erik de Castro Lopo - - * src/(aiff|ima_adpcm|mat4|mat5|ms_adpcm).c examples/sndfile-play.c - Fix sign conversion errors reported by gcc-4.0. - - * src/caf.c - New file for Apple's Core Audio File format. - - * src/sndfile.c src/common.h src/sndfile.h.in src/Makefile.am - Hook new file into build system. - -2005-06-21 Erik de Castro Lopo - - * src_wav_w64.c - Fix handling of stupidly large 'fmt ' chunks. Thanks to Vadim Berezniker - for supplying an example file. - - * src/common.h src/sndfile.c - Remove redundant error code SFE_WAV_FMT_TOO_BIG. - -2005-06-20 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c - Add public error value SF_ERR_MALFORMED_FILE. - - * src/sndfile.c - When parsing a file header fails and we don't have a system error, then set - the error number to SF_ERR_MALFORMED_FILE (suggested by Kyroz). - - * configure.ac - Allow sqlite support to be disabled in configure script. - - * regtest/database.c regtest/sndfile-regtest.c - Fix compiling when sqlite is missing. - -2005-06-11 Erik de Castro Lopo - - * src/file_io.c - Fix psf_is_pipe() and return value of psf_fread() when using virtual i/o. - - * src/sndfile.c - Fix VALIDATE_AND_ASSIGN_PSF macro for virtual i/o. - - * tests/virtual_io_test.c - Fill in skeleton test program. - - * tests/Makefile.am - Move virtual i/o tests to end of tests with stdio/pipe tests. - - * src/(sndfile.h.in|file_io.c|common.h|sndfile.c) tests/virtual_io_test.c - Rename some of the virtual i/o functions and data types. - -2005-06-10 Erik de Castro Lopo - - * src/sndfile.c - Fix the return values of sf_commands : SFC_SET_NORM_DOUBLE, - SFC_SET_NORM_FLOAT, SFC_GET_LIB_VERSION and SFC_GET_LOG_INFO. Thanks to - Kyroz for pointing out these errors. - - * doc/command.html - Correct documented return values for SFC_SET_NORM_DOUBLE and - SFC_SET_NORM_FLOAT. Thanks to Kyroz again. - -2005-05-17 Erik de Castro Lopo - - * regtest/* - Add new files for sndfile-regtest program. - - * configure.ac Makefile.am - Hook regetest into build. - - * src/wav.c src/common.c - Fix a regression where long ICMT chunks were causing the WAV parser - to exit. - -2005-05-15 Erik de Castro Lopo - - * libsndfile.spec.in - Add html docs to the files section as suggested by Karsten Jeppesen. - - * src/aiff.c - Fix parsing of odd length ANNO chunks. - -2005-05-13 Erik de Castro Lopo - - * src/common.h - Change the include guard to prevent clashes with other code. - -2005-05-12 Erik de Castro Lopo - - * examples/sndfile-play.c - Improve error handling in code for playback under Linux/ALSA. - -2005-05-10 Erik de Castro Lopo - - * src/ircam.c - Fix writing of IRCAM files on big endian systems (thanks to Axel Röbel). - - * src/wav.c - Add workaround for files created by the Peak audio editor on Mac which can - produce files with very short LIST chunks (thanks to Jonathan Segel who - supplied the file). - -2005-04-30 Erik de Castro Lopo - - * src/aiff.c - Apply a patch From David Viens to make the parsing of basc chunks more - robust. - - * src/wav.c - Another patch from David Viens to write correct wavex channel masks for - the most common channel configurations. - -2005-04-08 Erik de Castro Lopo - - * src/command.c - Only allow FLAC in the format arrays if FLAC is enabled. Thanks to - Leigh Smith. - -2005-03-09 Erik de Castro Lopo - - * src/common.h - Add a directory field for storing the file directory to the SF_PRIVATE - struct. - - * src/sndfile.c - Grab the directory name when copying the file path. - - * src/file_io.c - Cleanup psf_open_rsrc() and also check for resource fork in - .AppleDouble/filename. - -2005-03-01 Erik de Castro Lopo - - * src/svx.c - Fix a bug in the printing of the channel count. Bug reported by Michael - Schwendt. Thanks. - -2005-01-26 Erik de Castro Lopo - - * src/paf.c - Fix a seek bug for 24 bit PAF files. - - * tests/write_read_test.tpl - Update write_read_test to trigger the previously hidden PAF seek bug. - -2005-01-25 Erik de Castro Lopo - - * src/aiff.c src/w64.c src/wav.c - Do not return a header parse error when the log buffer overflows. - Continuing parsing works even on files where the log buffer does overflow. - This avoids a bug on some weirdo WAV (and other) files. - - * src/common.h src/sndfile.c - Remove SFE_LOG_OVERRIN error and its associated error message. - - * src/file_io.c - Fix a rsrc fork problem on MacOSX. - -2004-12-31 Erik de Castro Lopo - - * src/sndfile-play.c - In the ALSA output code, added call to snd_pcm_drain() just before - snd_pcm_close() as suggested by Thomas Kaeding. - In the OSS output code, added two ioctls (SNDCTL_DSP_POST and - SNDCTL_DSP_SYNC) just before the close of the audio device. - - * tests/virtual_io_test.c tests/Makefile.am - Add a new test program (currently empty) and add it to the build. - -2004-12-29 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.h src/common.h src/file_io.c - src/create_symbols_file.py - Apply patch from Steve Baker which is the beginnings of a virtual - I/O interface. - -2004-12-23 Erik de Castro Lopo - - * src/*.c src/sndfile.h.in - Const-ify the write path throughout the library. - -2004-12-14 Erik de Castro Lopo - - * doc/development.html - Minor improvements. - -2004-11-29 Erik de Castro Lopo - - * doc/bugs.html - Minor improvements. - -2004-11-18 Erik de Castro Lopo - - * src/aiff.c - Add workaround for Logic Platinum AIFF files with broken COMT chunks. - -2004-11-16 Erik de Castro Lopo - - * doc/FAQ.html - Remove some ambiguities in the SD2 FAQ answer. - -2004-11-15 Erik de Castro Lopo - - * Win32/sndfile.h Win32/config.h MacOS9/sndfile.h MacOS9/config.h - Updates from autoconfig versions. - -2004-11-13 Erik de Castro Lopo - - * src/aiff.c - Fix parsing of COMT chunks. Store SF_STR_COMMENT data in ANNO chunks - instead of COMT chunk. - -2004-11-07 Erik de Castro Lopo - - * src/file_io.c src/common.h - Change the ptr argument to psf_write() from "void*" to a "const void*". - Thanks to Tobias Gehrig for suggesting this. - -2004-10-31 Erik de Castro Lopo - - * src/file_io.c src/common.h - Add functions psf_close_rsrc() and read length of resourse fork into - rsrclength field of SF_PRIVATE. - - * src/sd2.c - Make sure resource fork gets closed. - - * tests/util.tpl - Add functions to check for file descriptor leakage. - - * src/write_read_test.tpl - Use the file descriptor leak checks. - - * src/sndfile.h.in - Add SFC_GET_LOOP_INFO and SF_LOOP_INFO struct. - - * src/common.h - Add SF_LOOP_INFO pointer to SF_PRIVATE. - - * src/wav.c src/aiff.c - Improve and add parsing of 'ACID' and 'basc' chunks, filling in - SF_LOOP_INFO data in SF_PRIVATE. - -2004-10-30 Erik de Castro Lopo - - * src/sd2.c - Further cleanup: remove printfs, change snprintf to LSF_SNPRINTF. - - * Win32/config.h Win32/sndfile.h - Updates. - - * tests/util.tpl - Add win32 macro for snprintf. - -2004-10-29 Erik de Castro Lopo - - * src/sfendian.h - Add macros : H2BE_SHORT, H2BE_INT, H2LE_SHORT and H2LE_INT. - - * src/sd2.c - Use macros to make sure writing SD2 files on little endian machines works - correctly. - - * tests/util.tpl - Add a delete_file() function which also deletes the resource fork of SD2 - files. - - * tests/write_read_test.tpl - Use delete_file() so that "make distcheck" works. - -2004-10-28 Erik de Castro Lopo - - * src/sndfile.c src/file_io.c - Move resource filename construction and testing to psf_open_rsrc(). - - * src/common.h src/sndfile.c - Add error SFE_SD2_FD_DISALLOWED. - - * tests/util.tpl tests/*.(c|tpl) - Add and allow_fd parameter to test_open_file_or_die() so that use of - sf_open_fd() can be avoided when opening SD2 files. - -2004-10-27 Erik de Castro Lopo - - * src/wav.c - Update ACID chunk parsing. - - * src/sd2.c - More fixes for files with large resource forks. - -2004-10-23 Erik de Castro Lopo - - * src/common.h src/sndfile.c - Add error numbers and messages for sd2 files. - - * src/sd2.c - Reading of sd2 (resource fork version) now seems to be working. - -2004-10-17 Erik de Castro Lopo - - * src/file_io.h - Update file_io.c to include win32 psf_rsrc_open(). - - * tests/floating_point_test.tpl - Remove use of __func__ in test programs (MSVC++ doesn't grok this). - - * Win32/(config|sndfile).h MacOS9/(config|sndfile).h - Updates. - -2004-10-13 Erik de Castro Lopo - - * src/sfendian.h - Fix endswap_int64_t_(array|copy). - - * src/test_endswap.(tpl|def) - Add tests for above and inprove all tests. - -2004-10-12 Erik de Castro Lopo - - * src/sfendian.h - Improve type safety, add endswap_double_array(). - - * src/double64.c - Use endswap_double_array() instead of endswap_long_array(). - - * src/test_endswap.(tpl|def) src/Makefile.am - Add preliminary endswap tests and hook into build system. - -2004-10-06 Erik de Castro Lopo - - * src/configure.ac src/makefile.am - Finally fix the bulding of DLLs on Win32/MinGW. - - * tests/makefile.am - Fix running of tests on Win32/MinGW. - -2004-10-01 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c tests/floating_point_test.tpl - Rename SFC_SET_FLOAT_INT_MULTIPLIER to SFC_SET_SCALE_FLOAT_INT_READ. - - * doc/command.html - Document SFC_SET_SCALE_FLOAT_INT_READ. - -2004-09-30 Erik de Castro Lopo - - * tests/floating_point_test.(tpl|def) - Derived from floating_point_test.c. - Add (float|double)_(short|int)_test functions. - - * tests/util.(tpl|def) - Make separate float and double versions of gen_windowed_sine(). - - * tests/write_read_test.tpl - Fix after changes to gen_windowed_sine(). - - * src/(float32|double64).c - Implement SFC_SET_FLOAT_INT_MULTIPPLIER. - -2004-09-29 Erik de Castro Lopo - - * acinclude.m4 - Fix warnings from automake 1.8 and later. - - * examples/sndfile-info.c - Add a "fflush (stdout)" after printing Win32 message. - -2004-09-28 Erik de Castro Lopo - - * Win32/Makefile.mingw.in - Add a "make install" target. - -2004-09-24 Erik de Castro Lopo - - * src/sndfile.h.in src/common.h src/sndfile.c src/command.c - Start work on adding command SFC_SET_FLOAT_INT_MULTIPLIER. - -2004-09-22 Erik de Castro Lopo - - * examples/sndfile-convert.c - Fix a bug converting stereo integer PCM files to float. - -2004-09-22 Erik de Castro Lopo - - * examples/sndfile-play.c - Appy patch from Conrad Parker to make Mac OSX error messages more - consistent and informative. - - * doc/api.html - Fix a HTML HREF which was wrong. - - * doc/win32.html - Add information about when nmake fails. - -2004-09-05 Erik de Castro Lopo - - * examples/sndfile-play.c - Another patch from Denis Cote to prevent race conditions. - -2004-09-02 Erik de Castro Lopo - - * src/common.h src/ms_adpcm.c src/ima_adpcm.c - Fix alternative to ISO standard flexible struct array feature for broken - compilers. - -2004-08-31 Erik de Castro Lopo - - * src/common.h src/string.c src/sndfile.c - Make sf_set_string() return an error if trying to set a string when in - read mode. - -2004-08-29 Erik de Castro Lopo - - * src/common.h - Change the unnamed union into a named union so gcc-2.95 will compile it. - - * src/*.c - Fixes to allow for the above change. - -2004-08-20 Erik de Castro Lopo - - * examples/sndfile-play.c - Fixes for Win32. Thanks to Denis Cote. - - * Win32/Win32/Makefile.(msvc|mingw.in) - Fix build system after removal of sfendian.h. - Build sndfile-convert. - - * src/Makefile.am - Remove sfendian.c from dependancies. - -2004-08-10 Erik de Castro Lopo - - * src/sndfile.h.in - Fix typo in comments (thanks Tommi Sakari Uimonen). - -2004-07-31 Erik de Castro Lopo - - * tests/(a|u)law_test.c - Minor cleanup. - -2004-07-29 Erik de Castro Lopo - - * src/(pcm|float|double64|ulaw|alaw|xi).c - Optimise read/write loops by removing a redundant variable. - -2004-07-24 Erik de Castro Lopo - - * src/file_io.c - Remove call to fsync() in psf_close(). - -2004-07-19 Erik de Castro Lopo - - * src/pcm.c - Inline x2y_array() functions where possible. - - * configure.ac - Detect presence of type int64_t. - - * src/sfendian.c src/sfendian.h - Move functions in the first file to the sfendian.h as static inline - functions. - Improve endswap_long_*() where possible. - -2004-07-17 Erik de Castro Lopo - - * src/pcm.c - When converting from unsigned char to float or double, subtract 128 before - converting to float/double rather than after to save a floating point - operation as suggested by Stefan Briesenick. - - * src/(pcm|sfendian|alaw|ulaw|double64|float32).c - Optimize inner loops by changing the loop counting slightly as suggested - by Stefan Briesenick. - - * configure.ac - Detect presence of . - - * src/sfendian.h - Use if present as suggested by Stefan Briesenick. - - * src/pcm.c - Update bytewapping. - -2004-07-02 Erik de Castro Lopo - - * src/common.h src/*.c - Change the psf->buffer field of SF_PRIVATE into a more type safe union with - double, float, int etc elements. - -2004-06-28 Erik de Castro Lopo - - * examples/sndfile-play.c - Merge slightly modifed patch from Stanko Juzbasic which allows playback of - mono files on MacOSX. - -2004-06-25 Erik de Castro Lopo - - * examples/sndfile-convert.c - Move copy_metadata() after the second sf_open(). - -2004-06-21 Erik de Castro Lopo - - * examples/sndfile-convert.c - Fix a bug which caused the program to go into an infinite loop if the source - file has no meta-data. Thanks to Ron Parker for reporting this. - - * src/sndfile.h.in - Add SF_STR_FIRST and SF_STR_LAST to allow enumeration of string types. - - * Win32/sndfile.h MacOS9/sndfile.h - Update these as per the above file. - -2004-06-17 Erik de Castro Lopo - - * configure.ac src/common.h src/ogg.c src/sndfile.c src/sndfile.h.in - src/Makefile.am - Apply large patch from Conrad Parker implementing Ogg Vorbis, Ogg Speex and - Annodex support via liboggz and libfishsound. Thanks Conrad. - -2004-06-15 Erik de Castro Lopo - - * src/avr.c src/ircam.c src/nist.c src/paf.c src/xi.c - Add cast to size_t for some parameters passed to psf_binheader_writef. This - is Debian bug number 253490. Thanks to Anand Kumria and Andreas Jochens. - - * src/w64.c - Found and fixed a bug resulting from use of size_t when writing W64 'fmt ' - chunk. - -2004-06-14 Erik de Castro Lopo - - * configure.ac - Bump version to 1.0.10 ready for release. - - * Makefile.am - Remove redundant files (check_libsndfile.py libsndfile_version_convert.py) - from distribution tarball. - - * tests/header_test.tpl - Fix uninitialised variable. - - * src/GSM610/short_term.c - Fix compiler warning on MSVC++. - -2004-05-23 Erik de Castro Lopo - - * src/wav.c - Improve record keeping of chunks seen and return an error if a file with - unusual chunks is opened in mode SFM_RDWR. - - * src/mmreg.h - This file not needed so remove it. - -2004-05-22 Erik de Castro Lopo - - * tests/header_test.tpl - Add extra_header_test(). - - * src/common.h src/sndfile.c - Add SFE_RDWR_BAD_HEADER error number and string. - -2004-05-21 Erik de Castro Lopo - - * tests/utils.tpl tests/*.c tests/*.tpl - Add a line number argument to check_log_buffer_or_die() and update all - files that use that function. - - * tests/header_test.tpl - Modify/update tests for files opened SFM_RDWR and SFC_UPDATE_HEADER_AUTO. - - * src/aiff.c src/wav.c - Fix another bug in AIFF and WAV files opened in SFM_RDWR and using - SFC_UPDATE_HEADER_AUTO. - - * src/test_file_io.c - Add a test for psf_ftruncate() function. - -2004-05-19 Erik de Castro Lopo - - * src/sndfile.c - Fix another weird corner case bug found by Martin Rumori. Thanks. - - * tests/header_test.(tpl|def) - Two new files to test for the absence of the above bug and include tests - moved from tests/misc_test.c. - - * tests/Makefile.am - Hook new tests into build/test system. - - * tests/misc_test.c - Remove update_header_test() which has been moved to the new files above. - -2004-05-16 Erik de Castro Lopo - - * src/aiff.c - Fixed a bug reported by Martin Rumori on the LAD list. If a file created - with a format of SF_FORMAT_FLOAT and then closed before any data is written - to it, the header can get screwed up (PEAK chunk gets overwritten). - - * tests/write_read_test.tpl - Add a test (empty_file_test) for the above bug. - -2004-05-13 Erik de Castro Lopo - - * Win32/Makefile.mingw.in - Added a Makefile for MinGW (needs to be processed by configure). - - * src/mmsystem.h src/mmreg.h - Add files from the Wine project (under the LGPL) to allow build of - sndfile-play.exe under MinGW. - -2004-05-12 Erik de Castro Lopo - - * src/GSM610/gsm610_priv.h - Replace ugly macros with inline functions. - - * src/GSM610/*.c - Remove temporary variables used by macros and other minor fixes required by - above change. - -2004-05-10 Erik de Castro Lopo - - * tests/pipe_test.tpl tests/stdio_test.c Win32/Makefile.msvc - Make sure these programs compile (even though they do nothing) on Win32 - and add them to the "make check" target. - - * src/sfendian.h - Fix warning on Sparc CPU and code cleanup. - -2004-05-09 Erik de Castro Lopo - - * src/file_io.c - Fix warning messages when compiling under MinGW. - -2004-05-01 Erik de Castro Lopo - - * configure.ac - Set HAVE_FLEXIBLE_ARRAY in src/config.h depending on whether the compiler - accepts the flexible array struct member as per 1999 ISO C standard. - - * src/common.h src/ima_adpcm.c src/paf.c src/ms_adpcm.c - Added ugly #if HAVE_FLEXIBLE_ARRAY and provided a non-standards compliant - hack for non 1999 ISO C compliant compilers. - -2004-04-26 Erik de Castro Lopo - - * src/strings.c - If adding an SF_STR_SOFTWARE string, only append libsndfile-X.Y.Z if the - string does not already have libsndfile in the string. Thanks to Conrad - Parker. - - * tests/string_test.c - Add test to verify the above. - - * examples/sndfile-convert.c - Add ability to transcode meta data as well (Conrad Parker). - -2004-04-25 Erik de Castro Lopo - - * doc/command.html - Fix minor error. Thanks to Simon Burton. - - * doc/win32.html - Started adding instructions for compiling libsndfile under MinGW. - - * configure.ac - Add --enable-bow-docs to enable black text on a white background HTML docs. - - * doc/libsndfile.css.in - This is now a template file for configure which sets the foreground and - background colours. - -2004-04-20 Erik de Castro Lopo - - * configure.ac - Do some MinGW fixes. - - * configure.ac doc/Makefile.am - Install HTML docs when doing make install. - -2004-04-19 Erik de Castro Lopo - - * examples/sndfile-info.c - Print out the dB level with the signal max. - -2004-04-15 Erik de Castro Lopo - - * src/file_io.c - Define S_ISSOCK in src/file_io.c if required. - -2004-04-03 Erik de Castro Lopo - - * configure.ac - Improve printout configuration summary (as suggested by Axel Röbel). - - * doc/index.html - Add link to pre-release location. - - * src/sndfile.h.in - Remove comma after last element of enum. - - * src/float32.c src/double64.c - Fix read/write of float/double encoded raw files to/from pipes. - - * tests/pipe_test.c tests/pipe_test.tpl tests/pipe_test.def - Turn pipe_test.c into an autogenerated file and add tests for reading/ - writing floats and doubles. - - * tests/Makefile.am - Hook tests/pipe_test.* into build system. - -2004-04-02 Erik de Castro Lopo - - * configure.ac acinclude.m4 - Rename AC_C_STRUCT_HACK macro to AC_C99_FLEXIBLE_ARRAY. - -2004-03-31 Erik de Castro Lopo - - * tests/misc_test.c - Perform update_header_test in RDWR mode as well. - - * src/aiff.c - Fix problems when updating header in RDWR mode. - -2004-03-30 Erik de Castro Lopo - - * src/wav.c src/w64.c src/wav_w64.c - Integrate code supplied by David Viens for supporting microsoft's - WAVEFORMATEXTENSIBLE stuff. Thanks David for supplying this. - - * configure.ac doc/*.html - Bump version to 1.0.9. - -2004-03-28 Erik de Castro Lopo - - * src/command.c src/sndfile.c src/sndfile.h.in src/wav.c - Started work on supporting microsoft's WAVEFORMATEXTENSIBLE gunk. - -2004-03-26 Erik de Castro Lopo - - * src/avr.c - New file to handle Audio Visual Resaerch files. - - * src/sndfile.h.in src/common.h src/sndfile.c src/command.c - Hook AVR into everything else. - - * tests/Makefile.am tests/write_read_test.tpl tests/misc_test.c - Add testing for AVR files. - -2004-03-22 Erik de Castro Lopo - - * src/file_io.c - Fix psf_set_file() for win32. Thanks to Vincent Trussart (Plogue Art et - Technologie) for coming up with the solution. - -2004-03-21 Erik de Castro Lopo - - * tests/write_read_test.tpl - Fixed a bug that was causing valgrind to report a memory leak. The bug was - in the test code itself, not the library. - -2004-03-20 Erik de Castro Lopo - - * examples/generate.cs - An example showing how to use libsndfile from C#. Thanks to James Robson - for providing this. - -2004-03-19 Erik de Castro Lopo - - * src/common.c - Fix problems with WAV files containing large chunks after the 'data' - chunk. Thanks to Koen Tanghe for providing a sample file. - -2004-03-17 Erik de Castro Lopo - - * configure.ac - Detect presense of ALSA (Advanced Linux Sound Architecture). - - * examples/sndfile-play.c - Add ALSA output support. - - * examples/Makefile.am - Add ALSA_LIBS to link line of sndfile-play.c. - -2004-03-15 Erik de Castro Lopo - - * acinclude.m4 - Add new macro (AC_C_STRUCT_HACK) to detect whether the C compiler allows - the use of the what is known as the struct hack introduced by the 1999 ISO - C Standard. - - * configure.ac - The last release would not compile with gcc-2.95 due to the use of features - (ie struct hack) introduced by the 1999 ISO C Standard. - Add check to make sure compiler handles this and bomb out if it doesn't. - -2004-03-14 Erik de Castro Lopo - - * tests/write_read_test.tpl - Fix compiler warning on Win32. - - * src/file_io.c - Fix use of an un-initialised variable in Win32 stuff. - - * Win32/config.h examples/sndfile-play.c - Win32 fixes. - -2004-03-10 Erik de Castro Lopo - - * configure.ac - Fix bug which occurres when configuring for MinGW. - If compiler is gcc and cross compiling use -nostdinc. - -2004-03-09 Erik de Castro Lopo - - * src/common.h src/aiff.c src/wav.c src/float32.c src/double64.c - src/sndfile.c - Fix a bug with PEAK chunk handling for files with more than 16 channels. - Thanks to Remy Bruno for finding this. - -2004-03-08 Erik de Castro Lopo - - * src/common.c - Fix a bug which was preventing WAV files being openned correctly if the - file had a very large header. Thanks to Eldad Zack for finding this. - -2004-03-04 Erik de Castro Lopo - - * configure.ac src/file_io.c - Fix cross-compiling from Linux to Win32 using the MinGW tools. - -2004-03-01 Erik de Castro Lopo - - * src/create_symbols_file.sh - Christian Weisgerber pointed out that the shell script did not run on a - real Bourne shell although it did run under Bash in Bourne shell mode. - - * src/create_symbols_file.py - Rewrite of above in Python. Also add support for writing Win32 .def files. - The Python script generates Symbols.linux, Symbols.darwin and - libsndfile.def (Win32 version). These files get shipped with the tarball - so there should not be necessary to run the Python script when building - the code from the tarball. - - * configure.ac src/Makefile.am Win32/Makefile.am - Hook new Python script into the build system. - -2004-02-25 Erik de Castro Lopo - - * src/configure.ac - Add --enable-gcc-werror option and move GCC specific stuff down. - -2004-02-24 Erik de Castro Lopo - - * acinclude.m4 configure.ac - Fix clip mode detection (tested in one of HP's testdrive Itanium II boxes). - - * src/file_io.c - Added check for sizeof (off_t) != sizeof (sf_count_t) to prevent recurrence - of missing large file support on Linux and Solaris. - -2004-02-19 Erik de Castro Lopo - - * examples/sndfile-play.c - Fix a MacOSX specific bug which was caused by a space being inserted in - the middle of a file name. - - * configure.ac src/Makefile.am examples/Makefile.am - Fix a couple of MacOSX build issues. - -2004-02-17 Erik de Castro Lopo - - * doc/command.html - Document SFC_SET_CLIPPING and SFC_GET_CLIPPING. - -2004-02-14 Erik de Castro Lopo - - * doc/*.html - Applied patch from Frank Neumann (author of lakai) which fixes many minor - typos in documentation. Thanks Frank. - -2004-02-13 Erik de Castro Lopo - - * ChangeLog - Changed my email address throughout source and docs. - -2004-02-08 Erik de Castro Lopo - - * src/file_io.c - Make sure config.h is included before stdio.h to make sure large file - support is enabled on Linux (and Solaris). - - * tests/misc_test.c - Disable update_header test on Win32. This should work but doesn't and - I'm not sure why. - - * Make.bat Win32/Makefile.msvc - Updates. - -2004-01-07 Erik de Castro Lopo - - * src/common.h - Changed logindex, headindex and headend files of SF_PRIVATE from unsigned - int to int to prevent weird arithmetic bugs. - - * src/common.c src/aiff.c src/wav.c src/w64.c - Fixed compiler warnings resulting from above change. - -2004-01-06 Erik de Castro Lopo - - * src/common.c - Fixed a bug in header reader for some files with data after the sample data. - -2003-12-29 Erik de Castro Lopo - - * tests/lossy_comp_test.c tests/Makefile.am - Add tests for AIFF/IMA files. - -2003-12-26 Erik de Castro Lopo - - * src/macbinary3.c src/macos.c - Two new files required for handling SD2 files. - - * src/common.h - Add prototypes for functions in above two files. - - * src/Makefile.am - Hook new files into build system. - -2003-12-21 Erik de Castro Lopo - - * configure.ac - Add checks for mmap() and getpagesize() which might be used at some time - for faster file reads. - Add detection of MacOSX. - -2003-12-13 Erik de Castro Lopo - - * doc/FAQ.html - Minor mods to pkg-config section. - -2003-12-12 Erik de Castro Lopo - - * src/create_symbols_file.sh - Andre Pang (also known as Ozone) pointed out that on MacOSX, all non - static symbols are exported causing troubles when trying to link - libsndfile with another library which has any of the same symbols. - He fixed this by supplying the MacOSX linker with a file containing - all the public symbols so that only they would be exported and then - supplied a patch for libsndfile. - This wasn't quite ideal, because I would have to maintain two (3 if - you include Win32) separate files containing the exported symbols. - A better solution was to create this script which can generate a - Symbols file for Linux, MacoSX and any other OS that supports - minimising the number of exported symbols. - - * configure.ac src/Makefile.am - Hook the new script into the build process. - -2003-12-10 Erik de Castro Lopo - - * doc/index.html - Added comments about Steve Dekorte's SoundConverter scam. - -2003-12-07 Erik de Castro Lopo - - * src/file_io.c - Axel Röbel pointed out that on Mac OSX a pipe is not considered a fifo - (S_ISFIFO (st.st_mode) is false) but a socket (S_ISSOCK (st.st_mode) is - true). The test has therefore been changed to is S_ISREG and anything - which which does not return true for S_ISREG is considered a pipe. - -2003-11-25 Erik de Castro Lopo - - * tests/misc_test.c - Fix update_header_test to pass SDS. - - * src/sds.c - More minor fixes. - - * tests/floating_point_test.c - Add test for SDS files. - - * src/command.c - Add SDS to major_formats array. - -2003-11-24 Erik de Castro Lopo - - * tests/write_read_test.tpl tests/misc_test.c - Add tests for SDS files. - - * src/sds.c - Fix a bug in header update code. - -2003-11-23 Erik de Castro Lopo - - * src/sds.c - Get file write working. - - * src/paf.c - Fix a potential bug in paf24_seek(). - -2003-11-04 Erik de Castro Lopo - - * doc/FAQ.html - Add Q/A about u-law encoded WAV files. - - * Win32/*.h - Updated so it compiles on Win32. - -2003-11-03 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add -alaw and -ulaw command line arguments. - - * configure.ac - Add library versioning comments. - Add arguments to AC_INIT. - -2003-10-28 Erik de Castro Lopo - - * src/file_io.c - Ross Bencina has contributed code to replace all of the (mostly broken) - Win32 POSIX emulation calls with calls the native Win32 file I/O API. - This code still needs testing but is likely to be a huge improvemnt - of support for Win32. Thanks Ross. - -2003-10-27 Erik de Castro Lopo - - * src/dwvw.c - Removed filedes field from the DWVW_PRIVATE struct. - - * src/file_io.c - Change psf_fopen() so it returns psf->error instead of the file descriptor. - Add new functions psf_set_stdio() and psf_set_file(). - - * src/sndfile.c - Change these to work with changed psf_fopen() return value. - Remove all uses of psf->filedes from sndfile, making it easier to slot native - Win32 API file handling functions. - - * src/test_file_io.c - Minor changes to make it compile with new file_io.c stuff. - -2003-10-26 Erik de Castro Lopo - - * src/gsm610.h - Rename a variable from true to true_flag. As Ross Bencina points out, - true is defined in the C99 header . - - * src/file_io.c - If fstat() fails, return SF_TRUE instead of -1 (Ross Bencina). - -2003-10-09 Erik de Castro Lopo - - * src/common.h - Increase the size of SF_BUFFER_LEN and SF_HEADER_LEN. - - * src/sndfile.c - Fix sf_read/write_raw which were dividing by psf->bytwidth and - psf->blockwidth which can both be zero. - - * examples/sndfile-info.c - Increase size of BUFFER_LEN. - -2003-09-21 Erik de Castro Lopo - - * configure.ac - Add checks for and ssize_t. - Other Win32/MinGW checks. - - * src/aiff.c src/au_g72x.c src/file_io.c src/gsm610.c src/interleave.c - src/paf.c src/sds.c src/svx.c src/voc.c src/w64.c src/wav.c src/xi.c - Fix compiler warnings. - -2003-09-20 Erik de Castro Lopo - - * tests/scale_clip_test.tpl - Add definition of M_PI if needed. - -2003-09-19 Erik de Castro Lopo - - * configure.ac - Detect if S_IRGRP is declared in . - - * src/file_io.c tests/*.tpl tests/*.c - More fixes for Win32/MSVC++ and MinGW. MinGW does have but that - file doesn't declare S_IRGRP. - -2003-10-18 Erik de Castro Lopo - - * src/config.h.in - Add comment stating that the sf_count_t typedef is determined when - libsndfile is being compiled. - - * tests/utils.tpl - Modified so that utils.c gets one copy of the GPL and not two. - - -2003-09-17 Erik de Castro Lopo - - * Win32/unistd.h src/sf_unistd.h - Move first file to the second. This will help for Win32/MSVC++ and MinGW. - - * Win32/Makefile.am src/Makefile.am - Changed in line with above. - - * Win32/Makefile.msvc - Removed "/I Win32" which is no longer required. - - * src/file_io.c src/test_file_io.c tests/*.tpl tests/*.c - If HAVE_UNISTD_H include else include . This should - work for Win32, MinGW and other fakes Unix-like OSes. - - * src/*.c - Removed #include from files which didn't need it. - -2003-09-16 Erik de Castro Lopo - - * libsndfile.spec.in - Apply fix from Andrew Schultz. - -2003-09-07 Erik de Castro Lopo - - * src/vox_adpcm.c - Only set psf->sf.samplerate if the existing value is invalid. - -2003-09-06 Erik de Castro Lopo - - * examples/sndfile-play.c - Started adding support for ALSA output. - -2003-09-04 Erik de Castro Lopo - - * src/sndfile.h.in - Removed from sndfile.h. - - * src/*.c examples/*.c tests/*.c tests/*.tpl - Added where needed. - -2003-09-02 Erik de Castro Lopo - - * src/common.h - Added ARRAY_LEN, SF_MAX and SF_MIN macros. - -2003-08-19 Erik de Castro Lopo - - * doc/index.html - Remove statements about alternative licensing arrangements. - -2003-08-17 Erik de Castro Lopo - - * MacOS MacOS9 Makefile.am configure.ac - Change directory name from MacOS to MacOS9 - - * MacOS9/MacOS9-readme.txt - Change name to make it really obvious, add text to top of file to make it - still more obvious again. - -2003-08-16 Erik de Castro Lopo - - * src/test_log_printf.c - Add tests for %u conversions. - - * src/common.c - Fix psf_log_printf() %u conversions. - -2003-08-15 Erik de Castro Lopo - - * src/aiff.c - Fixed a bug where opening a file with a non-trival header in SFM_RDWR mode - would over-write part of the header. Thanks to Axel Röbel for pointing - this out. Axel also provided a patch to fix this but I came up with a - neater and more general solution. - Return error when openning an AIFF file with data after the SSND chunk - (Thanks Axel Röbel). - - * tests/aiff_rw_test.c - Improvements to test program which will later allow it to be generalised to - test WAV, SVX and others as required. - -2003-08-14 Erik de Castro Lopo - - * tests/pipe_test.c - Add useek_pipe_rw_test() submitted by Russell Francis. - - * src/sndfile.c - In sf_open_fd(), check if input file descriptor is a pipe. - - * src/sndfile.[ch] - Fix typo in variable name do_not_close_descriptor. - -2003-08-13 Erik de Castro Lopo - - * src/test_log_printf.c - Improve the tests for %d and %s conversions. - - * src/common.c - Fixed a few problems in psf_log_printf() found using new tests. - -2003-08-06 Erik de Castro Lopo - - * configure.ac - Add -Wwrite-strings warning to CFLAGS if the compiler is GCC. Thanks to - Peter Miller (Aegis author) for suggesting this and supplying a patch. - - * src/*.c examples/*.c tests/*.c - Fix all compiler warnings arising from the above. - -2003-08-02 Erik de Castro Lopo - - * tests/aiff_rw_test.c tests/Makefile.am - New test program to check for errors re-writing the headers of AIFC files - opened in mode SFM_RDWR. - -2003-07-21 Erik de Castro Lopo - - * examples/sndfile-play.c - Applied a patch from Tero Pelander to allow this program to run on systems - using devfs which used /dev/sound/dsp instead of /dev/dsp. - -2003-07-11 Erik de Castro Lopo - - * doc/new_file_type.HOWTO - Updated document. Still incomplete. - -2003-06-29 Erik de Castro Lopo - - * src/sndfile.c - Fix VALIDATE_SNDFILE_AND_ASSIGN_PSF which was returning an error rather - than saving it and returning zero. - -2003-06-25 Erik de Castro Lopo - - * src/file_io.c - Two fixes for Mac OS9. - Fix all casts from sf_count_t to ssize_t (not size_t). - -2003-06-22 Erik de Castro Lopo - - * src/wav.c - Fix for reading files with RIFF length of 8 and data length of 0. - -2003-06-14 Erik de Castro Lopo - - * src/*.c tests/*.c tests/*.tpl - Added comments to mark code for removal when make Lite version of - libsndfile. - -2003-06-09 Erik de Castro Lopo - - * examples/sndfile-convert.c - Add extra error checking for unrecognised arguments. - -2003-06-08 Erik de Castro Lopo - - * src/ima_adpcm.c - Started adding code to write IMA ADPCM encoded AIFF files. - - * src/test_log_printf.c src/Makefile.am - New file to test psf_log_printf() function and add hooks into build system. - - * src/common.c - Move psf_log_printf() function to top of the file and only compile the rest - of the file if if PSF_LOG_PRINTF_ONLY is not defined. - -2003-06-03 Erik de Castro Lopo - - * Win32/config.h Win32/sndfile.h - Updated with new config variables. - - * Win32/unistd.h src/file_io.c - Added implementation of S_ISFIFO macro which Win32 seems to lack and is - used in src/file_io.c. - - * tests/utils.tpl - Added #include to pull in Win32/unistd.h so it compiles for - Win32. - - * src/Makefile.msvc - Added src\test_file_io.exe build target and run this as the very first - test. - - * tests/win32_test.c - Add support for testing Cygwin32. - - * configure.ac - Detect POSIX fsync() and fdatasync() functions. - - * src/file_io.c - If compiling for Cygwin, call fsync() before calling fstat() to retrieve - file length. - - * tests/pcm_test.tpl - Add a test for lrintf() function. This was required to detect a really - broken lrint() and lrintf() on Cygwin. - - * tests/misc_test.c - Don't run permission test when compiling under Cygwin. - - * src/float_cast.h - Fix fallback macro for lrint() and lrintf() to cast to long instead of int - to match official function prototypes. - -2003-06-02 Erik de Castro Lopo - - * examples/sndfile-convert.c - Modifications to improve accuracy of conversions; use double data for - floating point and int for everything else. - - * src/ima_apdcm.c - Completed work on decoding IMA ADPCM encoded AIFF files. Still need to - get encoding working. - -2003-05-28 Erik de Castro Lopo - - * src/aiff.c src/ima_adpcm.c - Start working on getting IMA ADPCM encoded AIFF files working. - -2003-05-27 Erik de Castro Lopo - - * configure.ac - Fixed the touch command for when the autogen program is not found (Matt - Flax). - - * src/ulaw.c src/alaw.c - Made these pipe-able. - -2003-05-24 Erik de Castro Lopo - - * src/paf.c src/ircam.c - Fixed writing to pipe. - - * src/wav.c src/aiff.c src/nist.c src/mat*.c src/svx.c src/w64.c - Return SFE_NO_PIPE_WRITE if an attempt is made to write to a pipe. - -2003-05-23 Erik de Castro Lopo - - * examples/sndfile-info.c - Modified to detect unknown file lengths. - - * src/mat4.c - Fix reading from a pipe. - -2003-05-22 Erik de Castro Lopo - - * tests/pipe_test.c - Add more file types to tests. - - * src/mat4.c - Removed explicit setting of psf->sf.seekable to SF_TRUE. - - * tests/utils.tpl - Add macro for generating and check data in the stdio and pipe tests. - - * tests/stdout_test.c tests/stdin_test.c - Use the above macro to generate known data on output and check data on - input. - - * src/voc.c src/htk.c common.h sndfile.c - Disallow reading/writing VOC and HTK files from/to pipes be returning new - error values. - - * src/w64.c - Fixes to allow reading from a pipe. - -2003-05-21 Erik de Castro Lopo - - * configure.ac src/sndfile.h.in - When the configure script determines the sizeof (sf_count_t), also set the - value of SF_COUNT_MAX in sndfile.h. - - * configure.ac - Remove -pedantic flag from default GCC compiler flags. - - * tests/pipe_test.c - Add a pipe_read_test() before doing pipe_write_test(). - - * tests/scale_clip_test.c - Add test to make sure non-normalized values also clip in the right way. - -2003-05-18 Erik de Castro Lopo - - * configure.ac - Add test to detect processor clipping capabilities. - - * tests/stdin_test.c tests/stdout_test.c - Fix a pair of compiler warnings. - - * src/common.h - Add new pipeoffset field to SF_PRIVATE. This will contain the current file - offset when operating on a pipe. - - * src/common.c - Removed direct calls to psf_fread()/psf_fseek()/psf_fgets() etc from - psf_binheader_readf and redirect them to new buffered versions - header_read(), header_seek() and header_gets(). - Add "G" format specifier to emulate fgets() functionality with buffering. - This will allow reading some file types from pipes. - - * src/file_io.c - When the file descriptor is a pipe, manintain psf->pipeoffset. - - * src/pvf.c - Change use of psf_fgets() to psf_binheader_readf() as required but changes to header re - - * src/au.c - Fix reading from a pipe. - -2003-05-17 Erik de Castro Lopo - - * src/pcm.c - Add clipping versions of the f2XXX_array() functions to allow option of - clipping data that would otherwise overflow. - - * tests/scale_clip_test.tpl tests/scale_clip_test.def - New files test that clipping option does actually work. - -2003-05-14 Erik de Castro Lopo - - * doc/index.html - Fixed a typo ("OS(" instead of "OS9"). - -2003-05-13 Erik de Castro Lopo - - * tests/open_fail_test.c - Include to prevent warning message of missing declaration of - memset(). - -2003-05-12 Erik de Castro Lopo - - * src/common.h - Add new "add_clipping" field to SF_PRIVATE. - - * src/sndfile.h.in src/sndfile.c - Add command SFC_SET_CLIPPING which sets/resets add_clipping field. - -2003-05-11 Erik de Castro Lopo - - * doc/api.html - Add docs for sf_set_string() and sf_get_string(). - - * src/common.h src/sndfile.c - Add new SFE_STR_BAD_STRING error. - - * tests/stdin_test.c tests/stdout_test.c - Removed all non-error print statements. - - * tests/stdio_test.c tests/pipe_test.c tests/Makefile.am - Add print statements removed from two files above. - -2003-05-10 Erik de Castro Lopo - - * libsndfile.spec.in - Fixed a coulpe of minor errors discovered by someone calling themselves - Agent Smith. - - * src/common.c src/common.h src/file_io.h - Added is_pipe field to SF_PRIVATE and declaration of psf_is_pipe() - function. (Axel Röbel) - - * src/sndfile.c - Fixed determination of whether the file is a pipe. (Axel Röbel) - - * src/paf.c - Force paf24 to start with undefined mode. (Axel Röbel) - - * tests/pipe_test.c - Mods to make this test work and actually do the test on RAW files. (Axel - Röbel). - -2003-05-05 Erik de Castro Lopo - - * src/sndfile.c - Fixed a potential bug where psf->sf.seekable was being set to FALSE when - operating on stdin or stdout but then the default initialiser was reseting - it to TRUE. Thanks to Axel Röbel. - - * src/aiff.c - Fixed a bug in the header parser where it was not handling an odd length - COMM chunk correctly. Thanks to Axel Röbel. - - * src/test_file_io.c - Add more tests. - - * tests/win32_test.c - New file for showing the bugs in the Win32 implementation of the POSIX API. - It also runs on Linux for sanity checking. - - * tests/Makefile.am Win32/Makefile.msvc - Hook the new test program into the build system. - -2003-05-04 Erik de Castro Lopo - - * src/test_file_io.c - New test program to test operation of functions defined in file_io.c. This - should make supporting win32 significantly easier. - - * src/Makefile.am - Hook new test program into the build system. - - * src/file_io.c - Add compile/run time check that sizeof statbuf.st_size and sf_count_t are - the same. - - * src/common.h src/sndfile.c - Added new error code and error message for new check. - - * tests/benchmark.tpl - Fix to use frames instead of samples in SF_INFO. - -2003-05-03 Erik de Castro Lopo - - * src/file_io.c - More stuffing about working around PLAIN OLD-FASHIONED **BUGS** in Win32. - - * examples/sndfile-info.c - Applied patch from Conrad Parker to add "--help" and "-h" options as - well as an improved usage message. - -2003-05-02 Erik de Castro Lopo - - * src/au.c - Added embedded file support. - - * tests/multi_file_test.c - Added tests for embedded AU files. - Added verbose testing mode. - - * src/common.h src/sndfile.c - Added an embedded AU specific error code and message. - - * src/wav.c - Added patch from Conrad Parker which filled in a little more information - about ACIDized WAV files. - -2003-04-30 Erik de Castro Lopo - - * src/file_io.c - Fixed Win32 version of psf_fseek() which was calling psf_get_filelen() - which was in turn calling psf_fseek() which in the end blew the stack. - Now of course this would have been easy to find on Linux, but this blow - up was happening in kernel32.dll and the fscking MSVC++ debugger couldn't - figure out what call caused this (it couldn't even tell me the stack had - overflowed) and was absolutley useless for this debugging exercise. - On top of that, the reason I got into this mess was that windoze doesn't - have a working fstat() function which can return file lengths > 2 Gig. It - HAS a fscking _fstati64() but the file length value is only updated AFTER - the bloody file is closed. That makes it completely useless. - How the hell do people stand working on this crap excuse of an OS? - -2003-04-29 Erik de Castro Lopo - - * Win32/unistd.h src/file_io.c - Moved definitions of S_IGRP etc from file_io.c to unistd.h so that these - can be used in the test programs. - - * Win32/libsndfile.def - Added sf_open_fd. - - * Win32/sndfile.h - Updated to match src/sndfile.h.in. - - * Win32/Makefile.msvc - Added dither.c and htk.c to libsndfile.dll target. - -2003-04-28 Erik de Castro Lopo - - * src/file_io.c - First attempt at getting the Win32 versions of the these functions working. - They still need to be tested. - -2003-04-27 Erik de Castro Lopo - - * src/strings.c - Found and fixed a bug which was causing psf_store_string() to fail on - Motorola 68k processors. Many thanks to Joshua Haberman (Debian maintainer - of libsndfile) for compiling and running debug code to help me debug the - problem. - -2003-04-26 Erik de Castro Lopo - - * src/sndfile.c src/file_io.c src/wav.c src/aiff.c - Much hacking to get reading and writing of embedded files working (ie sound - files at a non-zero files offset). - - * doc/embedded_files.html - First pass atempt at documenting reading/writing embedded files. - -2003-04-21 Erik de Castro Lopo - - * doc/FAQ.html - Updated answer to "Why doesn't libsndfile do interleaving/de-interleaving?" - -2003-04-19 Erik de Castro Lopo - - * src/wav.c src/aiff.c - Fix retrieving and storing of string data from files. Need to be careful - about using psf->buffer for strings. - -2003-04-18 Erik de Castro Lopo - - * src/file_io.c - Fix psf_fseek() for seeks withing embedded files. - -2003-04-15 Erik de Castro Lopo - - * src/sndfile.h.in - Changed the definition of SNDFILE slightly to produce warnings when it isn't - used correctly. This should have zero affect in code which uses the SNDFILE - type correctly. - - * src/sndfile.c - Fixed a few compiler warnings cause by the changes to the SNDFILE type. - -2003-04-12 Erik de Castro Lopo - - * doc/FAQ.html - Added question and answer to the question "How about adding the ability - to write/read sound files to/from memory buffers?". - -2003-04-08 Erik de Castro Lopo - - * tests/write_read_test.tpl - Removed un-needed enums declaring TRUE and FALSE and replaced usage of - these with SF_TRUE and SF_FALSE. - - * tests/multi_file_test.c - New test program to test sf_open_fd() on files containing data other than - a single sound file. - -2003-04-06 Erik de Castro Lopo - - * src/file_io.c - When creating files, set the readable by others flag. This still allows - further restrictions to be enforced by use of the user's umask. Fix - suggested by Eric Lyon. - -2003-04-05 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Changed sf_open_fd(). Dropped offset parameter and added a close_desc - parameter. If close desc is TRUE, the file descritpor passed into the - library will be closed when sf_close() is called. - - * tests/utils.tpl - Modified call to sf_open_fd() to set close_desc parameter to SF_TRUE. - -2003-04-04 Erik de Castro Lopo - - * tests/write_read_test.tpl - Add a string (using sf_set_string() function) before and after data section - of all files. This will make sure that if string data can be added, it - doesn't overwrite real audio data. - -2003-04-02 Erik de Castro Lopo - - * src/sndfile.c - Started work on supporting a non-zero offset parameter for sf_open_fd (). - - * src/.c - Removed many uses of psf_fseek (SEEK_END) which to allow for future use of - sf_open_fd() with non-zero offset. - Associated refactoring. - - * src/aiff.c - Implemented functionality required to get sf_get_string() and - sf_set_string() working for AIFF files. - -2003-04-01 Erik de Castro Lopo - - * tests/utils.tpl - Modified test_open_file_or_die() to alternately use sf_open() and - sf_open_fd(). - - * src/svx.c - Fixed a bug which occurred when openning an existing file for read/write - using sf_open_fd(). In this case, the existing NAME chunk needs to be - read into psf->filename. - Fixed printing of sf_count_t types to logbuffer. - -2003-03-31 Erik de Castro Lopo - - * src/sndfile.h.in - Added prototype for new function sf_open_fd(). - - * src/sndfile.c - Moved most of the code in sf_open() to a new function psf_open_file(). - Created new function sf_open_fd() which also uses psf_open_file() but - does not currently support the offset parameter. - - * doc/api.html - Document sf_open_fd(). - -2003-03-09 Erik de Castro Lopo - - * src/sndfile.c - Fixed a memory leak reported by Evgeny Karpov. Memory leak only occurred - when an attempt was made to read and the open() call fails. - -2003-03-08 Erik de Castro Lopo - - * tests/open_fail_test.c - New test program to check for memory leaks when sf_open fails on a valid - file. Currently this must be run manually under valgrid. - - * tests/Makefile.am - Hook new test program into build. - -2003-03-03 Erik de Castro Lopo - - * Octave/sndfile_save.m Octave/sndfile_play.m - Added a -mat-binary option to the octave save command to force the output - to binary mode even if the user has set ascii data as the default. Found - by Christopher Moore. - -2003-02-27 Erik de Castro Lopo - - * doc/dither.html - New file which will document the interface which allows the addition of - audio dither when sample word sizes are being reduced. - - * src/dither.c - More work. - -2003-02-26 Erik de Castro Lopo - - * tests/misc_test.c - In update_header_test(), make HTK files a special case. - - * doc/index.html - Added HTK to the feature matrix. - -2003-02-25 Erik de Castro Lopo - - * src/htk.c - New file for reading/writing HMM Tool Kit files. - - * src/sndfile.h.in src/sndfile.c src/command.c src/Makefile.am - Hook in htk.c - - * tests/write_read_test.tpl tests/misc_test.c tests/Makefile.am - Add tests for HTK files. - -2003-02-22 Erik de Castro Lopo - - * src/wav.c - Fixed a bug where the LIST chunk length was being written incorrectly. - - * tests/string_test.c - Added call to check_log_buffer(). - Minor cleanups. - -2003-02-10 Erik de Castro Lopo - - * src/wav_w64.h - Applied patch from Antoine Mathys to add extra WAV format definitions and - a G72x_ADPCM_WAV_FMT struct definition. - - * src/wav_w64.c - Applied patch from Antoine Mathys which converts wav_w64_format_str() from - one huge inefficient switch statement to a binary search. - - * tests/string_test.c - Dump log buffer if tests fail. - -2003-02-07 Erik de Castro Lopo - - * tests/string_test.c - David Viens supplied some modifications to this file which showed up a bug - when using sf_set_string() and the sf_writef_float() functions. - - * src/sndfile.c - Fixed the above bug. - -2003-02-06 Erik de Castro Lopo - - * doc/FAQ.html - Added Q and A on how to detect libsndfile in configure.in (at the suggestion - of Davy Durham). - -2003-02-05 Erik de Castro Lopo - - * src/sndfile.h.in - Add enums and typedefs for dither. - Deprecate SFC_SET_ADD_DITHER_ON_WRITE and SFC_SET_ADD_DITHER_ON_READ, to be - replaced with SFC_SET_DITHER_ON_WRITE and SFC_SET_DITHER_ON_READ which will - allow different dither algorithms to be enabled. - Added SFC_GET_DITHER_INFO_COUNT and SFC_GET_DITHER_INFO. - - * src/sndfile.h.in src/Version_script.in Win32/libsndfile.def. - Added public sf_dither_*() functions. - - * src/sndfile.c - Implement commands above. - - * src/dither.c - More work. Framework and external hooks into dither algorithms complete. - -2003-02-03 Erik de Castro Lopo - - * doc/version-1.html libsndfile_version_convert.py - Remove redundant files. - - * doc/index.html doc/api.html - Remove links to version-1.html. - - * src/dither.c - New file to allow the addition of audio dither on input and output. - - * src/common.h - Add prototype for dither_init() function. - - * Makefile.am doc/Makefile.am - Changes for added and removed files. - -2003-02-02 Erik de Castro Lopo - - * Win32/Makefile.msvc - Changes to force example binaries to be placed in the top level directory - instead of the examples/ directory. - Add src/strings.c and src/xi.c to the build. - Add string_test to build and to tests on WAV files. - - * doc/index.html - Added XI to support matrix. - -2003-01-27 Erik de Castro Lopo - - * src/sndfile.h.in - Added prototypes for sf_get_string() and sf_set_string() and SF_STR_* - enum values. - - * src/sndfile.c - Added public interface to sf_get_string() and sf_set_string(). - - * src/wav.c - Added code for setting and getting strings in WAV files. - - * tests/string_test.c - New test program for sf_get_string() and sf_set_string() functionality. - - * tests/Makefile.am - Hook new test program into build and test framework. - -2003-01-26 Erik de Castro Lopo - - * src/common.h - Added fields to SF_PRIVATE for string data needed to implement - sf_get_string() and sf_set_string(). - - * src/strings.c - New file for storing and retrieving strings to/from files. - - * src/Makefile.am - Added strings.c to build. - -2003-01-25 Erik de Castro Lopo - - * src/xi.c - Read seems to be working so looking at write. - - * src/sndfile.h.in - Added SF_FORMAT_XI, SF_FORMAT_DPCM_8 and SF_FORMAT_DPCM_16 enum values. - - * tests/floating_point_test.c tests/lossy_comp_test.c tests/Makefile.am - Added test for 8 and 16 bit XI format files. - -2003-01-24 Erik de Castro Lopo - - * doc/index.html - Added a non-lawyer readable summary of the licensing provisions as - suggested by Steve Dekorte. - -2003-01-23 Erik de Castro Lopo - - * src/wav.c - Fixed a compiler warning found by Alexander Lerch. - -2003-01-18 Erik de Castro Lopo - - * configure.ac - Fixed the multiple linking of libm. - -2003-01-17 Erik de Castro Lopo - - * Win32/Makefile.mcvs - Added comments on the correct way to set up the MSVCDir environment - variable. - - * doc/win32.html - Add on how to set up the MSVCDir environment variable. - -2003-01-15 Erik de Castro Lopo - - * examples/sndfile-play.c examples/sndfile-info.c - When run on Win32 without any command line parameters print a message and - then sleep for 5 seconds. This means the when somebody double clicks on - these programs in explorer the user will actually see the message. - -2003-01-14 Erik de Castro Lopo - - * tests/misc_test.c - Bypass permission test if running as root because root is allowed to open - a readonly file for write. - -2003-01-08 Erik de Castro Lopo - - * Win32/Makefile.msvc - Added pvf.c and xi.c source files to project. - - * src/sndfile.h - Updated for PVF files. - -2003-01-07 Erik de Castro Lopo - - * src/sndfile.c - Modified validate_sfinfo() to force samplerate, channels and sections - to be >= 1. - In format_from_extension() replaced calls to does_extension_match() - with strcmp(). - - * src/xi.c - More work. - -2003-01-06 Erik de Castro Lopo - - * doc/Makefile.am - Added octave.html which had been left out. Found by Jan Weil. - -2003-01-05 Erik de Castro Lopo - - * src/pvf.c src/common.h src/sndfile.c - Fixed error handling for PVF files. - - * src/xi.c - New file for handling Fasttracker 2 Extended Instrument files. Not working - yet and included when configured with --enable-experimental. - - * src/sndfile.c src/common.h - Hooked in new file xi.c. - -2002-12-30 Erik de Castro Lopo - - * src/rx2.c - Added a patch from Marek Peteraj which sheds a little more light on the - slices within an RX2 file. Still need to find out data encoding. - -2002-12-20 Erik de Castro Lopo - - * src/wav.c - Started work on decoding 'acid' and 'strc' chunks. - -2002-12-14 Erik de Castro Lopo - - * tests/peak_check_test.c - Minor cleanup. - -2002-12-12 Erik de Castro Lopo - - * tests/write_read_test.tpl - Added check to make sure no error was generated when an attempt was made to - read past the end of the file. - -2002-12-11 Erik de Castro Lopo - - * doc/lists.html - Added "mailto" links for all three lists. - - * src/pvf.c - New file for Portable Voice Format files. - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.c src/Makefile.am - Added hooks for SF_FORMAT_PVF format files. - - * tests/write_read_test.tpl tests/std*.c - Add tests for SF_FORMAT_PVF. - - * doc/index.html - Add PVF to the compatibility matrix. - - * src/pcm.c src/alaw.c src/ulaw.c src/float32.c src/double64.c - Previously, attempts to read beyond the end of a file would set psf->error - to SFE_SHORT_ERROR. This behaviour diverged from the behaviour of the POSIX - read() call but has now been fixed. - Attempts to read beyond the end of the file will return a short read count - but will not longer set any error. - -2002-12-09 Erik de Castro Lopo - - * src/sndfile.c - Add more sanity checking when opening a RAW file for read. When format is - not RAW, zero out all members of the SF_INFO struct. - - * tests/raw_test.c - Add bad_raw_test() to check for above problem. - - * tests/stdin_test.c examples/sndfile-info.c - Set the format field of the SF_INFO struct to zero before calling - sf_open(). - - * doc/api.html - Add information about the need to set the format field of the SF_INFO struct - to zero when opening non-RAW files for read. - - * configure.ac - Removed use of conversion script on Solaris. Not all Solaris versions - support it. - - * doc/lists.html - New file containg details of the mailing lists. - - * doc/index.html - Add a link to the above new file. - -2002-12-04 Erik de Castro Lopo - - * tests/dft_cmp.c - Fixed a SIGFPE on Alpha caused by a log10 (0.0). Thanks to Joshua Haberman - for providing the gdb traceback. - -2002-11-28 Erik de Castro Lopo - - * src/wav.c - Added more capabilities to 'smpl' chunk parser. - - * src/sndfile.c - Fixed some (not all) possible problems found with Flawfinder. - -2002-11-24 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_seek(). This bug could only occur when an attempt was - made to read beyond the end and then sf_seek() was called with a whence - parameter of SEEK_CUR. - - * src/file_io.c - Win32's _fstati64() does not work, it returns BS. Re-implemented - psf_get_filelen() in terms of psf_fseek(). - - * tests/write_read_test.tpl - Add a test to detect above bug. - - * src/float_cast.h - Modification to prevent compiler warnings on Mac OS X. - - * src/file_io.c - Fixes for windows (what a f**ked OS). - -2002-11-08 Erik de Castro Lopo - - * configure.ac - Disable use of native lrint()/lrintf() on Mac OSX. These functions exist on - Mac OSX 10.2 but not on 10.1. Forcing the use of the versions in - src/float_cast.h means that a library compiled on 10.2 will still work on - 10.1. - -2002-11-06 Erik de Castro Lopo - - * configure.in configure.ac - Renamed configure.in to configure.ac as expected by later versions of - autoconf. - Slight hacking of configure.ac to work with version 2.54 of autoconf. - Changed to using -dumpversion instead of --version for determining GCC - version numer as suggested by Anand Kumria. - - * src/G72x/Makefile.am - Slight hacking required for operation with automake 1.6.3. - -2002-11-05 Erik de Castro Lopo - - * src/common.c - In psf_binheader_readf() changed type parameter type "b" type from size_t - to int to prevent errors on IA64 CPU where sizeof (size_t) != sizeof (int). - Thanks to Enrique Robledo Arnuncio for debugging this. - -2002-11-04 Erik de Castro Lopo - - * test/command_test.tpl - Changed test value so test would pass on Solaris. - - * src/Version_script.in - Modified version numbering so that later versions of 1.0.X can replace - earlier versions without recompilation. - - * src/vox_adpcm.c - Fixed bug causing short reads. - -2002-11-03 Erik de Castro Lopo - - * test/floating_point_test.c - Code cleanup using functions from util.c. - Add test for IEEE replacement floats and doubles. - -2002-11-01 Erik de Castro Lopo - - * src/wav.c - Fixed a possible divide by zero error when read the 'smpl' chunk. Thanks to - Serg Repalov for the example file. - - * tests/pcm_test.tpl - Used sf_command (SFC_TEST_IEEE_FLOAT_REPLACE) to test IEEE replacement code. - Clean up pcm_double_test(). - - * src/float32.c src/double64.c - Force use of IEEE replacement code using psf->ieee_replace is TRUE, - Print message to log_buffer as well. - Rename all broken_read_* and broken_write* functions to replace_read_* and - replace_write_*. - - * tests/util.tpl - Added string_in_log_buffer(). - - * tests/pcm_test.tpl - Use string_in_log_buffer() to ensure that IEEE replacement code has been - used. - - * configure.in - Removed --enable-force-broken-float option. IEEE replacement code is now - always tested. - -2002-10-31 Erik de Castro Lopo - - * src/double64.c - Implement code for read/writing IEEE doubles on platforms where the native - double format is not IEEE. - - * src/float32.c src/common.h - Remove float32_read() and float32_write(). Replace with float32_le_read(), - float32_be_read(), float32_le_write() and float32_be_write() to match stuff - in src/double64.c. - - * src/common.c - Fix all usage of float32_write(). - - * src/sndfile.h.in - Added SFC_TEST_IEEE_FLOAT_REPLACE command (testing only). - - * src/common.h - Added SF_PRIVATE field ieee_replace. - - * src/sndfile.c - In sf_command() set/reset psf->ieee_replace. - -2002-10-26 Erik de Castro Lopo - - * tests/pcm_test.tpl - Fixed a problem when testing with --enable-force-broken-float. The test was - generating a value of negative zero and the broken float code is not able - to write negative zero. Removing the negative zero fixed the test. - -2002-10-25 Erik de Castro Lopo - - * src/file_io.c - Added fix for Cygwin (suggested by Maros Michalik). - -2002-10-23 Erik de Castro Lopo - - * src/file_io.c - Improved error detection and handling. - - * src/file_io.c src/common.h - Removed functions psf_ferror() and psf_clearerr() which were redundant - after above improvements. - - * src/aiff.c src/svx.c src/w64.c src/wav.c - Removed all use of psf_ferror() and psf_clearerr(). - - * src/sndfile.c - Removed #include of , , and which - are no longer needed. - - * tests/misc_test.c - Added test to make sure the correct error message is returned with an - existing read-only file is openned for write. - -2002-10-21 Erik de Castro Lopo - - * doc/index.html doc/api.html - Updated for OKI Dialogic ADPCM files. - - * src/command.c - Added VOX ADPCM to sub_fomats. - -2002-10-20 Erik de Castro Lopo - - * src/vox_adpcm.c src/Makefile.am - New file for handling OKI Dialogic ADPCM files. - - * src/sndfile.h - Add new subtype SF_FORMAT_VOX_ADPCM. - - * src/sndfile.c - Renamed function is_au_snd_file () to format_from_extenstion () and expanded - its functionality to detect headerless VOX files. - - * src/raw.c - Added hooks for SF_FORMAT_VOX_ADPCM. - - * examples/sndfile-info.c - Print out file duration (suggested by Conrad Parker). - - * libsndfile.spec.in - Force installation of sndfile.pc file (found by John Thompson). - - * tests/Makefile.am tests/lossy_comp_test.c tests/floating_point_test.c - Add tests for SF_FORMAT_VOX_ADPCM. - -2002-10-18 Erik de Castro Lopo - - * tests/misc_test.c - Add test which attempts to write to /dev/full (on Linux anyway) to check - for correct handling of writing to a full filesystem. - - * src/sndfile.c - Return correct error message if the header cannot be written because the - filesystem is full. - - * tests/util.tpl - Corrected printing of file mode in error reporting. - - * src/mat5.c - Fixed a bug where a MAT5 file written by libsndfile could not be opened by - Octave 2.1.36. - -2002-10-13 Erik de Castro Lopo - - * src/common.h src/file_io.c - All low level file I/O have been modified to be better able to report - system errors resulting from calling system level open/read/write etc. - - * src/*.c - Updated for compatibility with above changes. - - * examples/cooledit-fixer.c - New example program which fixes badly broken file created by Syntrillium's - Cooledit which are marked as containing PCM samples but actually contain - floating point data. - - * examples/Makefile.am - Hooked cooledit-fixer into the build system. - -2002-10-10 Erik de Castro Lopo - - * doc/command.html - Document SFC_GET_FORMAT_INFO. - -2002-10-09 Erik de Castro Lopo - - * examples/wav32_aiff24.c examples/sndfile2oct.c examples/sfhexdump.c - examples/sfdump.c - Removed these files because they weren't interesting. - - * examples/sfconvert.c examples/sndfile-convert.c - Renamed the first to the latter. - - * examples/Makefile.am - Added sndfile-convert to the bin_PROGRAMS, so it is installed when the lib - is installed. - Removed old programs wav32_aiff24 and sndfile2oct. - - * man/sndfile-convert.1 - New man page. - - * examples/sndfile-convert.c - Added some gloss now that sndfile-convert.c is an installed program. - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.h - Added command SFC_GET_FORMAT_INFO. - - * tests/command_test.c - Added tests form SFC_GET_FORMAT_INFO. - -2002-10-08 Erik de Castro Lopo - - * src/sndfile.c - In sf_format_check() return error if samplerate < 0. - -2002-10-07 Erik de Castro Lopo - - * src/aiff.c - Fixed bug in handling of COMM chunks with a 4 byte encoding byte but no - encoding string. - -2002-10-06 Erik de Castro Lopo - - * src/sndfile.c - Fixed repeated word in an error message. - -2002-10-05 Erik de Castro Lopo - - * doc/index.html - Improved advertising in Features section. - -2002-10-04 Erik de Castro Lopo - - * src/wav.c - Added decoding of 'labl' chunks within 'LIST' chunks. - - * src/common.h - Added (experimental only) SF_FORMAT_OGG and SF_FORMAT_VORBIS and definition - of ogg_open(). This is nowhere near working yet. - - * src/sndfile.c - Added detection of 'OggS' file marker and added call to ogg_open() to - switch statement. - - * src/ogg.c - New file. Very early start of Ogg Vorbis support. - - * src/wav.c - Added handling of brain-damaged and broken Cooledit "32 bit 24.0 float - type 1" files. These files are marked as being 24 bit WAVE_FORMAT_PCM with - a block alignment of 4 times the numbers of channels but are in fact 32 bit - floating point. - -2002-10-02 Erik de Castro Lopo - - * configure.in - Modified option --enable-experimental to set ENABLE_EXPERIMENTAL_CODE in - config.h to either 0 or 1. - - * src/sndfile.c - Modify sf_command (SFC_GET_LIB_VERSION) to append "-exp" to the version - string if experimental code has been enabled. - -2002-10-01 Erik de Castro Lopo - - * src/Makefile.am - Added -lm to libsndfile_la_LIBADD. This means that -lm is not longer needed - in the link line when linking something to libsndfile. - - * tests/Makefile.am examples/Makefile.am - Removed -lm from all link lines. - - * sndfile.pc.in - Removed -lm from Libs line. - -2002-09-24 Erik de Castro Lopo - - * src/file_io.c - Removed all perror() calls. - - * src/nist.c - Removed calls to exit() function. - Added check to detect NIST files dammaged from Unix CR -> Win32 CRLF - conversion process. - -2002-09-24 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - New function sf_strerror() which will eventually replace functions - sf_perror() and sf_error_str(). - Function sf_error_number() has also been changed, but this was documented - as being for testing only. - - * doc/api.html - Documented above changes. - - * tests/*.c examples/*.c - Changed to new error functions. - -2002-09-22 Erik de Castro Lopo - - * configure.in - Detect GCC version, and print a warning message about writeable strings - it GCC major version number is less than 3. - -2002-09-21 Erik de Castro Lopo - - * src/sndfile.h.in doc/api.html - Documentation fixes. - -2002-09-19 Erik de Castro Lopo - - * src/Version_script.in src/Makefile.am configure.in - Use the version script to prevent the exporting of all non public symbols. - This currently only works with Linux. Will test on Solaris as well. - - * src/float_cast.h - Added #ifndef to prevent the #warning directives killing the SGI MIPSpro - compiler. - - * src/au_g72x.c src/double64.c src/float32.c src/gsm610.c src/ima_adpcm.c - src/ms_adpcm.c - Fix benign compiler warnings arising from previously added compiler - flags. - -2002-09-18 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_error_str() where errnum was used as the index instead - of k. Found by Tim Hockin. - - * examples/sndfile-play.c - Fixed a compiler warning resulting from a variable shadowing a previously - defined local. - -2002-09-17 Erik de Castro Lopo - - * src/sndfile.h.in src/sndfile.c - Added command SFC_SET_RAW_START_OFFSET. - - * doc/command.html - Document SFC_SET_RAW_START_OFFSET. - - * tests/raw_test.c tests/Makefile.am - Add new file for testing SF_FORMAT_RAW specific functionality. - - * tests/dwvw_test.c - Updates. - -2002-09-16 Erik de Castro Lopo - - * src/wav.c - Modified reading of 'smpl' chunk to take account of the sampler data field. - - * tests/utils.tpl tests/utils.h - Added function print_test_name(). - - * tests/misc_test.c tests/write_read_test.tpl tests/lossy_comp_test.c - tests/pcm_test.tpl tests/command_test.tpl tests/floating_point_test.c - Convert to use function print_test_name(). - -2002-09-15 Erik de Castro Lopo - - * doc/octave.html - Added a link to some other Octave scripts for reading and writing sound - files. - - * src/paf.c - Change type of dummy data field to int. This should fix a benign compiler - warning on some CPUs. - Removed superfluous casts resulting from the above change. - - * src/rx2.c - More hacking. - -2002-09-14 Erik de Castro Lopo - - * src/mat5.c src/common.c - Changed usage of snprintf() to LSF_SNPRINTF(). - - * Win32/Makefile.msvc - Updated to include new files and add new tests. - - * Win32/config.h Win32/sndfile.h - Updated. - - * doc/api.html - Added note about the possibility of "missing" features actually being - implemented as an sf_command(). - -2002-09-13 Erik de Castro Lopo - - * tests/misc_test.c - Added previously missing update_header_test and zero_data_tests for PAF, - MAT4 and MAT5 formats. - - * src/paf.c src/mat4.c src/mat5.c - Fixed bugs uncovered by new tests above. - - * src/mat5.c - Generalised parsing of name fields of MAT5 files. - - * src/mat5.c src/sndfile.c - Added support for unsigned 8 bit PCM MAT5 files. - - * tests/write_read_test.tpl - Added test for unsigned 8 bit PCM MAT5 files. - - * doc/index.html - Added unsigned 8 bit PCM MAT5 to capabilities matrix. - -2002-09-12 Erik de Castro Lopo - - * test/update_header_test.c tests/misc_test.c - Renamed update_header_test.c to misc_test.c. - Added zero_data_test() to check for case where file is opened for write and - closed immediately. The resulting file can be left in a state where - libsndfile cannot open it. Problem reported by Werner Schweer, the author - of Muse. - - * src/aiff.c - Removed superfluous cast. - - * src/wav.c src/svx.c - Fixed case of file generated with no data. - Removed superfluous cast. - - * src/sndfile.c - Fixed error on IA64 platform caused by incorrect termination of - SndfileErrors struct array. This problem was found in the Debian buildd - logs (http://buildd.debian.org/). - - * configure.in - Added Octave directory. - - * Octave/Makefile.ma - New Makfile.am for Octave directory. - - * Octave/sndfile_load.m Octave/sndfile_save.m Octave/sndfile_play.m - New files for working with Octave. - - * doc/octave.html - Document explaining the use of the above three Octave scripts. - -2002-09-10 Erik de Castro Lopo - - * src/sndfile.c - Fixed bug in RDWR mode. - -2002-09-09 Erik de Castro Lopo - - * src/common.c - Fixed psf_get_date_str() for systems which don't have gmtime_r() or - gmtime(). - - * src/file_io.c - Added #include for Win32. Reported by Koen Tanghe. - -2002-09-08 Erik de Castro Lopo - - * src/common.c - Added 'S' format specifier for psf_binheader_writef() which writes a C - string, including single null terminator to the header. - Added 'j' format specifier to allow jumping forwards or backwards in the - header. - Added function psf_get_date_str(). - - * src/mat5.c - Complete read and write support. - - * doc/index.html - Added entries for MAT4 and MAT5 in capabilities matrix. - -2002-09-06 Erik de Castro Lopo - - * src/mat4.c - Completed read and write support. - - * src/common.h src/sndfile.c - Added MAT4 and MAT5 specific error messages. - - * tests/write_read_test.tpl tests/Makefile.am - Added tests for MAT4 and MAT5 files. - - * tests/stdio_test.c tests/stdout_test.c tests/stdin_test.c - Added tests for MAT4 and MAT5 files. - -2002-09-05 Erik de Castro Lopo - - * src/command.c - Added elements for SF_FORMAT_MAT4 and SF_FORMAT_MAT5 to major_formats - array. - - * examples/sfconvert.c - Added mat4 and mat5 output targets. - -2002-09-04 Erik de Castro Lopo - - * src/sndfile.c - Added check to prevent errors openning read only formats for read/write. - - * src/interleave.c - New file for interleaving non-interleaved data. Non-interleaved data is - only supported on read. - - * src/Makefile.am - Added src/interleave.c to build. - -2002-09-03 Erik de Castro Lopo - - * src/double64.c src/common.h - Added double64_be_read(), double64_le_read(), double64_be_write() and - double64_le_write() which replace double64_read() and double64_write(). - - * src/common.c - Cleanup of psf_binheader_readf() and add ability to read big and little - endian doubles (required by mat4.c and mat5.c). - Add ability for psf_binheader_writef() to write doubles to sound file - headers. - -2002-09-01 Erik de Castro Lopo - - * src/mat5.c - New file for reading Matlab (tm) version 5 data files. This is also the - native binary file format for version 2.1.X of GNU Octave which will be - used for testing. - Not complete yet. - - * src/mat4.c - New file for reading Matlab (tm) version 4.2 data files. This is also the - native binary file format for version 2.0.X of GNU Octave which will be - used for testing. - Not complete yet. - - * src/sndfile.h.in src/sndfile.c src/common.h src/command.c src/Makefile.am - Mods to add Matlab files. - - * src/common.[ch] - Added readf_endian field to SF_PRIVATE struct allowing endianness to - remembered across calls to sf_binheader_readf(). - Fixed bug in width_specifier behaviour for printing hex values. - -2002-08-31 Erik de Castro Lopo - - * src/file_io.c - Check return value of close() call in psf_fclose(). - -2002-08-24 Erik de Castro Lopo - - * src/ms_adpcm.c - Commented out some code where 0x10000 was being subtracted from a short - and the result assigned to a short again. Andrew Zaja found this. - -2002-08-23 Erik de Castro Lopo - - * doc/command.html - Fixed typo found by Tommi Ilmonen. - - * src/ima_adpcm.c - Changed type of diff from short to int to prevent errors which can occur - during very rare circumstances. Thanks to FUWAFUWA. - -2002-08-16 Erik de Castro Lopo - - * tests/floating_point_test.c - Disable testing on machines without lrintf(). - - * Win32/Makefile.msvc - Added dwd.c and wve.c to build. - - * configure.in - Bumped version to 1.0.0. - -2002-08-15 Erik de Castro Lopo - - * src/file_io.c - Add a #include for Mac OS 9. Thanks to Stephane Letz. - - * src/wav.c - Changed an snprintf to LSF_SNPRINTF. - - * doc/Makefile.am - Added version-1.html. - -2002-08-14 Erik de Castro Lopo - - * configure.in - Bumped version to 1.0.rc6. - - * src/*.c - Modified scaling of normalised floats and doubles to integers. Until now - this has been done by multiplying by 0x8000 for short output, 0x80000000 - for 32 bit ints and so on. Unfortunately this can cause an overflow and - wrap around in the target value. All thes values have therefore been - reduced to 0x7FFF, 0x7FFFFFFF and so on. The conversion from ints to - normalised floats and doubles remains unchanged. This does mean that for - repeated conversions normalised float -> pcm16 -> normalised float would - result in a decrease in amplitude of 0x7FFF/0x8000 on every round trip. - This is undesirable but less undesireable than the wrap around I am trying - to avoid. - - * tests/floating_point_test.c - Removed file hash checking because new float scaling procedure introduced - above prevented the ability to crate a has on both x86 and PowerPC systems. - -2002-08-13 Erik de Castro Lopo - - * src/txw.c - Completed reading of TXW files. Seek doesn't work yet. - - * src/file_io.c - Added a MacOS 9 replacement for ftruncate(). - - * MacOS/sndfile.h - Added MacOS 9 header file. This should be copied into src/ to compile - libsndfile for MacOS9. - -2002-08-12 Erik de Castro Lopo - - * src/sndfile.c - Fixed commands SF_SET_NORM_DOUBLE and SFC_SET_NORM_FLOAT to return their - values after being set. Reported by Jussi Laako. - - * configure.in - If autogen is not found, touch all .c and .h files in tests/. - - * src/common.c - Added format width specifier to psf_log_printf() for %u, %d, %D and %X. - - * src/dwd.c - Completed implementation of read only access to these files. - - * src/common.h src/*.c src/pcm.c - Removed redundant field chars from SF_PRIVATE struct and modified - pcm_init() to do without it. - -2002-08-11 Erik de Castro Lopo - - * src/wve.c - New file implementing read of Psion Alaw files. This will be a read only - format. Implementation complete. - - * src/dwd/c - Started implementation of DiamondWare Digitized files. Also read only, not - complete. - - * src/wav.c - Add parsing of 'smpl' chunk. - - * src/paf.c - Fixed reading on un-normalized doubles and floats from 24 bit PAF files. - This brings it into line with the reading of 8 bit files into - un-normalized doubles which returns values in the range [-128, 127]. - - * src/common.c - Modified psf_log_printf() to accept the %% conversion specifier to allow - printing of a single '%'. - - * src/sds.c - Read only of 16 bit samples is working. Need to build a test harness for - this and other read only formats. - -2002-08-10 Erik de Castro Lopo - - * configure.in - Added --enable-experimental configure option. - Removed pkg-config message at the end of the configure process. - - * src/sds.c src/txw.c src/rx2.c src/sd2.c - Moved all the code in these files inside #if ENABLE_EXPERIMENTAL_CODE - blocks and added new *_open() function for the case where experimental is - not enabled. These new functions just return SFE_UNIMPLMENTED. - - * Win32/sndfile.h src/sndfile.h.in src/common.h - Removed un-necessary #pragma pack commands. - - * src/file_io.c - Implemented psf_ftruncate() and much other hacking for Win32. - - * Win32/Makefile.msvc - Updated. - - * doc/win32.html - Updated to include the copying of the sndfile.h file from the Win32/ - directory to the src/ directory. - - * Make.bat - Batch file to make compiling on Wi32 a little easier. Implements "make" and - "make check". - -2002-08-09 Erik de Castro Lopo - - * src/file_io.c - Add place holder for ftruncate() on Win32 which doesn't have ftruncate(). - This will need to be fixed later. - - * src/sndfile.h.in - New file (copy of sndfile.h) with sets up @TYPEOF_SF_COUNT_T@ which will be - replaced by the correct type during configure. - - * configure.in - Modified to find a good type for TYPEOF_SF_COUNT_T. - - * src/aiff.c - Fixed a bug when reading malformed headers. - - * src/common.c - Set read values to zero before performing read. - -2002-08-08 Erik de Castro Lopo - - * doc/command.html - Fixed some HTML tags which were not allowing jumps to links within the - page. - - * src/sds.c - Massive hacking on this. - - * src/wav.c - Added recognition of 'clm ' tag. - -2002-08-07 Erik de Castro Lopo - - * doc/index.html - Added beginning of a capabilities list beyond simple file formats which - can be read/written. - - * src/aiff.c - Added parsing of INST and MARK chunks of AIFF files. At the moment this - data is simply recorded in the log buffer. Later it will be possible to - read this data from an application using sf_command(). - - * src/wav.c - Added parsing of 'cue ' chunk which contains loop information in WAV files. - - * exampes/sndfile-info.c - Changed reporting of Samples to Frames. - - * src/wav.c src/w64.c src/aiff.c src/wav_w64.h - Moved from a samples to a frames nomenclature to avoid confusion. - - * doc/FAQ.html - What's the best format for storing temporary files? - - * src/sds.c - New file for reading/writing Midi Sample Dump Standard files. - - * src/Makefile.am src/sndfile.c src/common.[ch] - Added hooks for sds.c. - - * examples/sndfile-info.c - Changed from using sf_perror() to using sf_error_str(). - -2002-08-06 Erik de Castro Lopo - - * doc/api.html - Added explanation of mode parameter for sf_open(). - Added explanation of usage of SFM_* values in sf_seek(). - - * src/sndfile.[ch] src/command.c src/file_io.c src/common.h - Implemented SFC_FILE_TRUNCATE to allow a file to be truncated. File - truncation was suggested by James McCartney. - - * src/command.html - Documented SFC_FILE_TRUNCATE. - - * tests/command_test.c - Add tests for SFC_FILE_TRUNCATE. - - * src/sndfile.c - Added a thrid parameter to the VALIDATE_SNDFILE_AND_ASSIGN_PSF macro to - make resetting the error number optional. All uses of the macro other than - in error reporting functions were changed to reset the error number. - - * src/pcm.c - Fixed a bug were sf_read_* was logging an SFE_SHORT_READ even when no error - occurred. - - * tests/write_read_test.tpl - Added tests of internal error state. - -2002-08-05 Erik de Castro Lopo - - * src/GSM610/private.h src/GSM610/*.c src/GSM610/Makefile.am - Renamed private.h to gsm610_priv.h to prevent clash with other headers - named private.h in other directories. (Probably only a problem on MacOS 9). - - * src/G72x/private.h src/G72x/*.c src/G72x/Makefile.am - Renamed private.h to g72x_priv.h to prevent clash with other headers - named private.h in other directories. (Probably only a problem on MacOS 9). - - * MacOS/config.h - Changed values of HAVE_LRINT and HAVE_LRINTF to force use of code in - float_cash.h. - - * src/sndfile.h - Changes the name of samples field of the SF_INFO to frames. The old name - had caused too much confusion and it simply had to be changed. There will - be at least one more pre-release. - -2002-08-04 Erik de Castro Lopo - - * doc/index.html - Updated formats matrix to include RAW (header-less) GSM 6.10. - Fix specificaltion of table and spelling mistakes. - - * src/sndfile.c src/command.c - Fixed bug in SFC_CALC_MAX_SIGNAL family and psf_calc_signal_max (). - - * tests/command.c - Removed cruft. - Added test for SFC_CALC_MAX_SIGNAL and SFC_CALC_NORM_MAX_SIGNAL. - - * configure.in - Update version to 1.0.0rc5. - - * sfendian.h - Removed inclusion of un-necessary header. - -2002-08-03 Erik de Castro Lopo - - * src/aiff.c - Minor fixes of info written to log buffer. - - * src/float_cast.h - Add definition of HAVE_LRINT_REPLACEMENT. - - * tests/floating_point_test.c - Fix file hash check on systems without lrint/lrintf. - - * tests/dft_cmp.c - Limit SNR to less than -500.0dB. - - * examples/sndfile2oct.c - Fixed compiler warnings. - - * doc/api.html - Fixed error where last parameter of sf_error_str() was sf_count_t instead - of size_t. - -2002-08-02 Erik de Castro Lopo - - * doc/FAQ.html - Why doesn't libsndfile do interleaving/de-interleaving. - - * tests/pcm_test.tpl - On Win32 do not perform hash check on files containing doubles. - -2002-08-01 Erik de Castro Lopo - - * src/common.h - Defined SF_COUNT_MAX_POSITIVE() macro, a portable way of setting variables - of type sf_count_t to their maximum positive value. - - * src/dwvw.c src/w64.c - Used SF_COUNT_MAX_POSITIVE(). - -2002-07-31 Erik de Castro Lopo - - * src/paf.c - Fixed bug in reading/writing of 24 bit PCM PAF files on big endian systems. - - * tests/floating_point_tests.c - Fixed hash values for 24 bit PCM PAF files. - Disabled file has check if lrintf() function is not available and added - warning. - Decreased level of signal from a peak of 1.0 to a value of 0.95 to prevent - problems on platforms without lrintf() ie Solaris. - -2002-07-30 Erik de Castro Lopo - - * src/wav.c - Fixed a problem with two different kinds of mal-formed WAV file header. The - first had the 'fact' chunk before the 'fmt ' chunk, the other had an - incomplete 'INFO' chunk at the end of the file. - - * src/w64.c - Added fix to allow differentiation between W64 files and ACID files. - - * src/au_g72x.c src/common.h src/sndfile.c - Added error for G72x encoded files with more than one channel. - - * tests/pcm_test.tpl tests/utils.tpl - Moved function check_file_hash_or_die() to utils.tpl. Function was then - modified to calculate the has of the whole file. - - * src/wav.c - Fixed problem writing the 'fact' chunk on big endian systems. - - * tests/sfconvert.c - Fixed bug where .paf files were being written as Sphere NIST. - -2002-07-29 Erik de Castro Lopo - - * src/voc.c - Fix for reading headers generated using SFC_UPDATE_HEADER_NOW. - - * doc/command.html - Add docs for SFC_UPDATE_HEADER_NOW and SFC_SET_UPDATE_HEADER_AUTO. - -2002-07-28 Erik de Castro Lopo - - * man/sndfile-info.1 man/sndfile-play.1 - Added manpages supplied by Joshua Haberman the Debian maintainer for - libsndfile. Additional tweaks by me. - - * configure.in man/Makefile.am - Hooked manpages into autoconf/automake system. - - * src/sndfile.c - Added hooks for SFC_SET_UPDATE_HEADER_AUTO. - - * tests/update_header_test.c - Improved rigor of testing. - - * src/*.c - Fixed problem with *_write_header() functions. - -2002-07-27 Erik de Castro Lopo - - * doc/*.html - Updates to documentation to fix problems found by wdg-html-validator. - - * src/common.h src/command.c - Added normalize parameter to calls to psf_calc_signal_max() and - psf_calc_max_all_channels(). - - * src/sndfile.c - Added handling for commands SFC_CALC_NORM_SIGNAL_MAX and - SFC_CALC_NORM_MAX_ALL_CHANNELS. - - * doc/command.html - Added entry for SFC_CALC_NORM_SIGNAL_MAX and SFC_CALC_NORM_MAX_ALL_CHANNELS. - -2002-07-26 Erik de Castro Lopo - - * examples/sndfile-play.c Win32/Makefile.msvc - Get sndfile-play program working on Win32. The Win32 PCM sample I/O API - sucks. The sndfile-play program now works on Linux, MacOSX, Solaris and - Win32. - -2002-07-25 Erik de Castro Lopo - - * doc/FAQ.html - New file for frequently asked questsions. - -2002-07-22 Erik de Castro Lopo - - * doc/api.html - Documentation fixes. - - * src/au.[ch] src/au_g72x.c src/G72x/g72x.h - Add support of 40kbps G723 ADPCM encoding. - - * tests/lossy_comp_test.c tests/floating_point_test.c - Add tests for 40kbps G723 ADPCM encoding. - - * doc/index.html - Update support matrix. - -2002-07-21 Erik de Castro Lopo - - * doc/command.html - Documented SFC_GET_SIMPLE_FORMAT_COUNT, SFC_GET_SIMPLE_FORMAT, - SFC_GET_FORMAT_* and SFC_SET_ADD_PEAK_CHUNK. - - * src/sndfile.c src/pcm.c - Add ability to turn on and off the addition of a PEAK chunk for floating - point WAV and AIFF files. - - * src/sndfile.[ch] src/common.h src/command.c - Added sf_command SFC_CALC_MAX_ALL_CHANNELS. Implemented by Maurizio Umberto - Puxeddu. - - * doc/command.html - Docs for SFC_CALC_MAX_ALL_CHANNELS (assisted by Maurizio Umberto Puxeddu). - -2002-07-18 Erik de Castro Lopo - - * src/sndfile.c src/gsm610.c - Finalised support for GSM 6.10 AIFF files and added support for GSM 6.10 - encoded RAW (header-less) files. - - * src/wav.c - Add support for IBM_FORMAT_MULAW and IBM_FORMAT_ALAW encodings. - - * src/api.html - Fixed more documentation bugs. - -2002-07-17 Erik de Castro Lopo - - * src/sndfile.h src/common.h - Moved some yet-to-be-implelmented values for SF_FORMAT_* from the public - header file sndfile.h to the private header file common.h to avoid - confusion about the actual capabilities of libsndfile. - -2002-07-16 Erik de Castro Lopo - - * src/aiff.c src/wav.c - Fixed file parsing for WAV and AIFF files containing non-audio data after - the data chunk. - - * src/aiff.c src/sndfile.c - Add support for GSM 6.10 encoded AIFF files. - - * tests/lossy_comp_test.c tests/Makefile.am - Add tests for GSM 6.10 encoded AIFF files. - - * src/*.c - Fix compiler warnings. - -2002-07-15 Erik de Castro Lopo - - * tests/command_test.c - For SFC_SET_NORM_* tests, change the file format from SF_FORMAT_WAV to - SF_FORMAT_RAW. - - * src/sndfile.c - Added sf_command(SFC_TEST_ADD_TRAILING_DATA) to allow testing of reading - from AIFF and WAV files with non-audio data after the audio chunk. - - * src/common.h - Add test commands SFC_TEST_WAV_ADD_INFO_CHUNK and - SFC_TEST_AIFF_ADD_INST_CHUNK. When these commands are working, they will be - moved to src/sndfile.h - - * src/aiff.c src/wav.c - Begin implementation of XXXX_command() hook for sf_command(). - - * tests/write_read_test.tpl - Added sf_command (SFC_TEST_ADD_TRAILING_DATA) to ensure above new code was - working. - -2002-07-13 Erik de Castro Lopo - - * tests/update_header_test.c - Allow read sample count == write sample count - 1 to fix problems with VOC - files. - - * tests/write_read_test.tpl tests/pcm_test.tpl - Fixed some problems in the test suite discovered by using Valgrind. - -2002-07-12 Erik de Castro Lopo - - * tests/utils.[ch] tests/*.c - Renamed check_log_buffer() to check_log_buffer_or_die(). - - * src/sndfile.c - SFC_UPDATE_HEADER_NOW and SFC_SETUPDATE_HEADER_AUTO almost finished. Works - for all file formats other than VOC. - -2002-07-11 Erik de Castro Lopo - - * src/sndfile.[ch] src/common.h - Started adding functionality to allow the file header to be updated before - the file is closed on files open for SFM_WRITE. This was requested by - Maurizio Umberto Puxeddu who is using libsndfile for file I/O in iCSound. - - * tests/update_header_test.c - New test program to test that the above functionality is working correctly. - - * tests/peak_chunk_test.c tests/floating_point_test.c - Cleanups. - -2002-07-10 Erik de Castro Lopo - - * src/sfendian.[ch] - Changed length count parameters for all endswap_XXX() functions from - sf_count_t (which can be 64 bit even on 32 bit architectures) to int. These - functions are only called frin inside the library, are always called with - integer parameters and doing the actual calculation on 64 bit values is - slow in comparision to doing it on ints. - - * examples/sndfile-play.c - More playback hacking for Win32. - -2002-07-09 Erik de Castro Lopo - - * src/common.c - In psf_log_printf(), changed %D format conversion specifier to %M (marker) and - added %D specifier for printing the sf_count_t type. - - * src/*.c - Changed all usage of psf_log_printf() with %D format conversion specifiers - to use %M conversion instead. - - * tests/pcm_test.tpl tests/pcm_test.def - New files to autogen pcm_test.c. - - * src/pcm.c - Fixed bug in scaling floats and doubles to 24 bit PCM and vice versa. - -2002-07-08 Erik de Castro Lopo - - * configure.in - Fix setup of $ac_cv_sys_largefile_CFLAGS so that sndfile.pc gets valid - values for CFLAGS. - - * examples/sndfile-play.c - Start adding playback support for Win32. - -2002-07-07 Erik de Castro Lopo - - * src/*.c - Worked to removed compiler warnings. - Extensive refactoring. - - * src/common.[ch] - Added function psf_memset() which works like the standard C function memset - but takes and sf_count_t as the length parameter. - - * src/sndfile.c - Replaced calls to memset(0 with calls to psf_memset() as required. - -2002-07-06 Erik de Castro Lopo - - * src/sndfile.c - Added "libsndfile : " to the start of all error messages. This was suggested - by Conrad Parker author of Sweep ( http://sweep.sourceforge.net/ ). - - * src/sfendian.[ch] - Added endswap_XXXX_copy() functions. - - * src/pcm.c src/float32.c src/double64.c - Use endswap_XXXX_copy() functions and removed dead code. - Cleanups and optimisations. - -2002-07-05 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h - Gave values to all the SFC_* enum values to allow better control of the - interface as commands are added and removed. - Added new command SFC_SET_ADD_PEAK_CHUNK. - - * src/wav.c src/aiff.c - Modified wav_write_header and aiff_write_header to make addition of a PEAK - chunk optional, even on floating point files. - - * tests/benchmark.tpl - Added call to sf_command(SFC_SET_ADD_PEAK_CHUNK) to turn off addition of a - PEAK chunk for the benchmark where we are trying to miximize speed. - - * src.pcm.c - Changed tribyte typedef to something more sensible. - Further conversion speed ups. - -2002-07-03 Erik de Castro Lopo - - * src/command.c - In major_formats rename "Sphere NIST" to "NIST Sphere". - - * src/common.c src/sfendian.c - Moved all endswap_XXX_array() functions to sfendian.c. These functions will - be tweaked to provide maximum performance. Since maximum performance on one - platform does not guarantee maximum performance on another, a small set of - functions will be written and the optimal one chosen at compile time. - - * src/common.h src/sfendian.h - Declarations of all endswap_XXX_array() functions moved to sfendian.h. - - * src/Makefile.am - Add sfendian.c to build targets. - -2002-07-01 Erik de Castro Lopo - - * src/pcm.c src/sfendian.h - Re-coded PCM encoders and decoders to match or better the speed of - libsndfile version 0.0.28. - -2002-06-30 Erik de Castro Lopo - - * src/wav.c - Add checking for WAVPACK data in standard PCM WAV file. Return error if - found. This WAVPACK is *WAY* broken. It uses the same PCM WAV file header - and then stores non-PCM data. - - * tests/benchmark.tpl - Added more tests. - -2002-06-29 Erik de Castro Lopo - - * tests/benchmark.tpl - Added conditional definition of M_PI. - For Win32, set WRITE_PERMS to 0777. - - * Win32/Makefile.msvc - Added target to make generate program on Win32. - - * src/samplitude.c - Removed handler for Samplitude RAP file format. This file type seems rarer - than hens teeth and is completely undocumented. - - * src/common.h src/sndfile.c src/Makefile.am Win32/Makefile.msvc - Removed references to sampltiude RAP format. - - * tests/benchmark.tpl - Benchmark program now prints the libsndfile version number when run. This - program was also backported to version 0 to compare results. Version - 1.0.0rc2 is faster than version 0.0.28 on most conversions but slower on - some. The slow ones need to be fixed before final release. - -2002-06-28 Erik de Castro Lopo - - * tests/benchmark.def tests/benchmark.tpl - New files which generate tests/benchmark.c using Autogen. Added int -> - SF_FORMAT_PCM_24 test. - - * tests/benchmark.c - Now and Autogen output file. - - * tests/Makefile.am - Updated for above changes. - -2002-06-27 Erik de Castro Lopo - - * tests/benchmark.c - Basic benchmark program complete. Need to convert it to Autogen. - - * Win32/Makefile.msvc - Added benchmark.exe target. - -2002-06-26 Erik de Castro Lopo - - * examples/generate.c - New program to generate a number of different output file formats from a - single input file. This allows testing of the created files. - - * tests/benchmark.c - New test program to benchmark libsndfile. Nowhere near complete yet. - - * examples/Makefile.am tests/Makefile.am - New make rules for the two new programs. - -2002-06-25 Erik de Castro Lopo - - * Win32/libsndfile.def - Removed definition for sf_signal_max(). - - * src/sndfile.c - Removed cruft. - - * doc/index.html - A number of documentation bugs were fixed. Thanks to Anand Kumria. - - * doc/version-1.html - Minor doc updates. - - * configure.in - Bumped version to 1.0.0rc2. - - * src/sf_command.h src/Makefile.am - Removed the header file as it was no longer being used. Thanks to Anand - Kunria for spotting this. - - * doc/index.html - A number of documentation bugs were fixed. Thanks to Anand Kumria. - -2002-06-24 Erik de Castro Lopo - - * src/common.h - Test for Win32 before testing SIZEOF_OFF_T so that it works correctly - on Win32.. - - * src/file_io.c - Win32 fixes to ensure O_BINARY is used for file open. - - * doc/win32.html - New file documenting the building libsndfile on Win32. - - * doc/*.html - Updating of documentation. - -2002-06-23 Erik de Castro Lopo - - * tests/pcm_test.c - Minor changes to allow easier determination of test file name. - - * src/sndfile.[ch] - Removed function sf_signal_max(). - - * examples/sndfile-play.c - Changed call to sf_signal_max() to a call to sf_command(). - -2002-06-22 Erik de Castro Lopo - - * src/format.c src/command.c - Renamed format.c to command.c which will now include code for sf_command() - calls to perform operations other than format commands. - - * src/sndfile.c src/sndfile.h - Removed function sf_get_signal_max() which is replaced by commands passed - to sf_command(). - - * src/command.c - Implement commands SFC_CALC_SIGNAL_MAX. - - * doc/command.html - Documented SFC_CALC_SIGNAL_MAX. - -2002-06-21 Erik de Castro Lopo - - * examples/sndfile-play.c - Mods to make sndfile-play work on Solaris. The program sndfile-play now - runs on Linux, MaxOSX and Solaris. Win32 to come. - - * src/format.c - Added SF_FORMAT_DWVW_* to subtype_formats array. - - * src/nist.c - Added support for 8 bit NIST Sphere files. Example file supplied by Anand - Kumria. - -2002-06-20 Erik de Castro Lopo - - * examples/sndfile-info.c - Tidy up of output format. - - * examnples/sndfile-play.c - Mods to make sndfile-play work on MacOSX using Apple's CoreAudio API. - - * configure.in - Add new variables OS_SPECIFIC_INCLUDES and OS_SPECIFIC_LINKS which were - required to supply extra include paths and link parameters to get - sndfile-play working on MacOSX. - - * examples/Makefile.am - Use OS_SPOECIFIC_INCLUDES and OS_SPECIFIC_LINKS to build commands for - sndfile-play. - -2002-06-19 Erik de Castro Lopo - - * src/nist.c - Added ability to read/write new NIST Sphere file types (A-law, u-law). - Header parser was re-written from scratch. Example files supplied by Anand - Kumria. - - * src/sndfile.c - Support for A-law and u-law NIST files. - - * tests/Makefile.am tests/lossy_comp_test.c - Tests for A-law and u-law NIST files. - -2002-06-18 Erik de Castro Lopo - - * tests/utils.c - Fixed an error in error string. - -2002-06-17 Erik de Castro Lopo - - * acinclude.m4 - Removed exit command to allow cross-compiling. - - * Win32/unistd.h src/file_io.c - Moved contents of first file into the second file (enclosed in #ifdef). - Win32/unistd.h is now an empty file but still must be there for libsndfile - to compile on Win32. - - * src/sd2.c, src/sndfile.c: - Fixes for Sound Designer II files on big endian systems. - -2002-06-16 Erik de Castro Lopo - - * configure.in - Modified to work around problems with crappy MacOSX version of sed. - Added sanity check for proper values for CFLAGS. - -2002-06-14 Erik de Castro Lopo - - * src/sndfile.c - Code clean up in sf_open (). - - * Win32/Makefile.msvc - Michael Fink's contributed MSVC++ makefile was hacked to bits and put back - together in a new improved form. - - * src/file_io.c - Fixes for Win32; _lseeki64() returns an invalid argument for calls like - _lseeki64(fd, 0, SEEK_CUR) so need to use _telli64 (fd) instead. - - * src/common.h src/sndfile.c src/wav.c src/aiff.c - Added SFE_LOG_OVERRUN error. - Added termination for potential infinite loop when parsing file headers. - - * src/wav.c src/w64.c - Fixed bug casuing incorrect header generation when opening file read/write. - -2002-06-12 Erik de Castro Lopo - - * doc/api.html - Improved the documentation to make it clearer that the file read method - and the underlying file format are completely disconnected. Suggested - by Josh Green. - - * doc/command.html - Started correcting docs to take into account changes made to the - operations of the sf_command () function. Not complete yet. - - * src/sndfile.c - Reverted some changes which had broken the partially working SDII header - parsing. Now have access to an iBook with OS X so reading and writing SDII - files on all platforms should be a reality in the near future. On Mac this - will involve reading the resource fork via the standard MacOS API. To move - a file from Mac to another OS, the resource and data forks will need to be - combined before transfer. The combined file will be read on both Mac and - other OSes like any other file. - -2002-06-08 Erik de Castro Lopo - - * ltmain.sh - Applied a patch from http://fink.sourceforge.net/doc/porting/libtool.php - which allows libsndfile to compile on MacOSX 10.1. This patch should not - interfere with compiling on other OSes. - - * src/GSM610/private.h - Changes to fix compile problems on MacOSX (see src/GSM610/ChangeLog). - - * src/float_cast.h - Added MacOSX replacements for lrint() and lrintf(). - -2002-06-05 Erik de Castro Lopo - - * src/sndfile.c - Replaced the code to print the filename to the log buffer when a file is - opened. This code seems to have been left out during the merge of - sf_open_read() and sf_open_write() to make a single functions sf_open(). - -2002-06-01 Erik de Castro Lopo - - * src/wav.c - Fixed a bug where the WAV header parser was going into an infinite loop - on a badly formed LIST chunk. File supplied by David Viens. - -2002-05-25 Erik de Castro Lopo - - * configure.in - Added a message at the end of the configuration process to warn about the - need for the use of pkg-config when linking programs against version 1 of - libsndfile. - - * doc/pkg-config.html - New documentation file containing details of how to use pkg-config to - retrieve settings for CFLAGS and library locations for linking files - against version 1 of libsndfile. - -2002-05-17 Erik de Castro Lopo - - * src/wav.c - Fixed minor bug in handling of so-called ACIDized WAV files. - -2002-05-16 Erik de Castro Lopo - - * Win32/libsndfile.def Win32/Makefile.msvc - Two new files contributed by Michael Fink (from the winLAME project) - which allows libsndfile to be built on windows in a MSDOS box by doing - "nmake -f Makefile.msvc". Way cool! - -2002-05-15 Erik de Castro Lopo - - * configure.in - MacOSX is SSSOOOOOOO screwed up!!! I can't believe how hard it is to - generate a tarball which will configure and compile on that platform. - Joined the libtool mailing list to try and get some answers. - -2002-05-13 Erik de Castro Lopo - - * configure.in - Changed to autoconf version 2.50. MacOSX uses autoconf version 2.53 which - is incompatible with with version 2.13 which had been using until now. - The AC_SYS_LARGE_FILE macro distributed withe autoconf 2.50 is missing a - few features so AC_SYS_EXTRA_LARGE file was defined to replace it. - - * configure.in - Changed to automake version 1.5 to try and make a tarball which will - work on MacOSX. - -2002-05-12 Erik de Castro Lopo - - * src/wav_gsm610.c - Changed name to gsm610.c. Added reading/writing of headerless files. - - * src/sndfile.c src/raw.c - Added ability to read/write headerless (SF_FORMAT_RAW) GSM 6.10 files. - -2002-05-11 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Clean up in preparation for Autogen-ing this file. - - * src/GSM610/*.[ch] - Code cleanup and prepartion forgetting file seek working. Details in - src/GSM610/ChangeLog. - - * sndfile.pc.in - Testing complete. Is sndfile.m4 still needed? - -2002-05-09 Erik de Castro Lopo - - * tests/write_read_test.tpl tests/rdwr_test.tpl - Merged tests from these two programs into write_read_test.tpl and deleted - rdwr_test.tpl. - -2002-05-08 Erik de Castro Lopo - - * src/w64.c src/svx.c src/paf.c - Fixed bugs in read/write mode. - -2002-05-07 Erik de Castro Lopo - - * examples/Makefile.am - Renamed sfplay.c to sndfile-play.c and sndfile_info.c to sndfile-info.c for - consistency when these programs become part of the Debian package - sndfile-programs. - - * sndfile.pc.in - New file to replace sndfile-config.in. Libsndfile now uses the pkg-config - model for providing installation parameters to dependant programs. - - * src/sndfile.c - Cleanup of code in sf_open(). - -2002-05-06 Erik de Castro Lopo - - * tests/utils.tpl tests/write_read_test.tpl - More conversion to Autogen fixes and enchancements. - - * src/*.c - Read/write mode is now working for 16, 24 and 32 bit PCM as well as 32 - bit float and 64 bit double data. More tests still required. - - * src/Makefile.am - Added DISTCLEANFILES target to remove config.status and config.last. - - * Win32/Makefile.am MacOS/Makefile.am - Added DISTCLEANFILES target to remove Makefile. - -2002-05-05 Erik de Castro Lopo - - * src/*.[ch] tests/rdwr_test.c - More verifying workings of read/write mode. Fixing bugs found. - - * tests/utils.[ch] - Made these files Autogen generated files. - - * tests/util.tpl tests/util.def - New Autogen files to generate utils.[ch]. Moved some generic test functions - into this file. Autogen is such a great tool! - -2002-05-03 Erik de Castro Lopo - - * src/pcm.c src/float_cast.h Win32/config.h - Fixed a couple of Win32 specific bugs pointed out by Michael Fink - (maintainer of WinLAME) and David Viens. - - * tests/check_log_buffer.[ch] tests/utils.[ch] - Moved check_log_buffer() to utils.[ch] and deleted old file. - -2002-05-02 Erik de Castro Lopo - - * src/common.[ch] src/sndfile.c - New function psf_default_seek() which will be the default seek function - for things like PCM and floating point data. This default is set for - both read and write in sf_open() but can be over-ridden by any codec - during it's initialisation. - -2002-05-01 Erik de Castro Lopo - - * src/au.c - AU files use a data size value of -1 to mean unknown. Fixed au_open_read() - to allow opening files like this. - - * tests/rdwr_test .c - Added more tests. - - * src/sndfile.c - Fixed bugs in read/write mode found due to improvements in the test - program. - -2002-04-30 Erik de Castro Lopo - - * tests/rdwr_test .c - New file for testing read/write mode. - -2002-04-29 Erik de Castro Lopo - - * m4/* - Removed all m4 macros from this directory as they get concatenated to form - the file aclocal.m4 anyway. - - * sndfile.m4 - Moved this from the m4 directory to the root directory asn this is part of - the distribution and is installed during "make install". - -2002-04-29 Erik de Castro Lopo - - * src/float32.c - Removed logging of peaks for all file formats other than AIFF and WAV. - - * tests/write_read_test.tpl tests/write_read_test.def - New files which autogen uses to generate write_read_test.c. Doing it this - way makes write_read_test.c far easier to maintain. Other test programs - will be converted to autogen in the near future. - - * src/*.c - Fixed a few bugs found when testing on Sparc (bug endian) Solaris. - -2002-04-28 Erik de Castro Lopo - - * doc/*.html - Fixed documention versioning. - - * configure.in - Fixed a bug in the routines which search for Large File Support on systems - which have large file support by defualt. - -2002-04-27 Erik de Castro Lopo - - * src/*.[ch] - Found and fixed an issue which can cause a bug in other software (I was - porting Conrad Parker's Sweep program from version 0 of the library to - version 1). When opening a file for write, the libsndfile code would - set the sfinfo.samples field to a maximum value. - - * tests/write_read_test.c - Added tests to detect the above problem. - -2002-04-25 Erik de Castro Lopo - - * src/*.[ch] - Finished base implementation of read/write mode. Much more testing still - needed. - - * m4/largefile.m4 - Macro for detecting Large File Standard capabilities. This macro was ripped - out of the aclocal.m4 file of GNU tar-1.13. - - * configure.in - Added detection of large file support. Files larger than 2 Gigabytes should - now be supported on 64 bit platforms and many 32 bit platforms including - Linux (2.4 kernel, glibc-2.2), *BSD, MacOS, Win32. - - * libsndfile_convert_version.py - A Python script which attempts to autoconvert code written to use version 0 - to version 1. - -2002-04-24 Erik de Castro Lopo - - * src/*.[ch] - Finished base implementation of read/write mode. Much more testing still - needed. - - * tests/write_read_test.c - Preliminary tests for read/write mode added. More needed. - -2002-04-20 Erik de Castro Lopo - - * src/sndfile.[ch] - Removed sf_open_read() and sf_open_write() functions,replacting them with - sf_open() which takes an extra mode parameter (SF_OPEN_READ, SF_OPEN_WRITE, - or SF_OPEN_RDWR). This new function sf_open can now be modified to allow - opening a file formodification (RDWR). - -2002-04-19 Erik de Castro Lopo - - * src/*.c - Completed merging of separate xxx_open_read() and xxx_open_write() - functions. All tests pass. - -2002-04-18 Erik de Castro Lopo - - * src/au.c - Massive refactoring required to merge au_open_read() with au_open_write() - to create au_open(). - -2002-04-17 Erik de Castro Lopo - - * src/*.c - Started changes required to allow a sound file to be opened in read/write - mode, with separate file pointers for read and write. This involves merging - of encoder/decoder functions like pcm_read_init() and pcm_write_init() - int a new function pcm_init() as well as doing something similar for all - the file type specific functions ie aiff_open_read() and aiff_open_write() - were merged to make the function aiff_open(). - -2002-04-15 Erik de Castro Lopo - - * src/file_io.c - New file containing psf_fopen(), psf_fread(), psf_fwrite(), psf_fseek() and - psf_ftell() functions. These function will replace use of fopen/fread/fwrite - etc and allow access to files larger than 2 gigabytes on a number of 32 bit - OSes (Linux on x86, 32 bit Solaris user space apps, Win32 and MacOS). - - * src/*.c - Replaced all instances of fopen with psf_open, fread with psd_read, fwrite - with psf_write and so on. - -2002-03-11 Erik de Castro Lopo - - * src/dwvw.c - Finally fixed all known problems with 12, 16 and 24 bit DWVW encoding. - - * tests/floating_point_test.c - Added tests for 12, 16 and 24 bit DWVW encoding. - -2002-03-03 Erik de Castro Lopo - - * m4/endian.m4 - Defines a new m4 macro AC_C_FIND_ENDIAN, for determining the endian-ness of - the target CPU. It first checks for the definition of BYTE_ORDER in - , then in and . If none of these work - and the C compiler is not a cross compiler it compiles and runs a program - to test for endian-ness. If the compiler is a cross compiler it makes a - guess based on $target_cpu. - - * configure.in - Modified to use AC_C_FIND_ENDIAN. - - * src/sfendian.h - Simplified. - -2002-02-23 Erik de Castro Lopo - - * tests/floating_point_test.c - Tests completely rewritten using the dft_cmp function. Now able to - calculate a quick guesstimate of the Signal to Noise Ratio of the encoder. - -2002-02-15 Erik de Castro Lopo - - * tests/dft_cmp.[ch] - New files containing functions for comparing pre and post lossily - compressed data using a quickly hacked DFT. - - * tests/utils.[ch] - New files containing functions for saving pre and post encoded data in a - file readable by the GNU Octave package. - -2002-02-13 Erik de Castro Lopo - - * m4/lrint.m4 m4/lrintf.m4 - Fixed m4 macros to define HAVE_LRINT and HAVE_LRINTF even when the test - is cached. - -2002-02-12 Erik de Castro Lopo - - * tests/floating_point_test.c - Fixed improper use of strncat (). - -2002-02-11 Erik de Castro Lopo - - * tests/headerless_test.c - New test program to test the ability to open and read a known file type as a - RAW header-less file. - -2002-02-07 Erik de Castro Lopo - - * tests/losy_comp_test.c - Added a test to ensure that the data read from a file is not all zeros. - - * examples/sfconvert.c - Added "-gsm610" encoding types. - -2002-01-29 Erik de Castro Lopo - - * examples/sfconvert.c - Added "-dwvw12", "-dwvw16" and "-dwvw24" encoding types. - - * tests/dwvw_test.c - New file for testing DWVW encoder/decoder. - -2002-01-28 Erik de Castro Lopo - - * src/dwvw.c - Implemented writing of DWVW. 12 bit seems to work, 16 and 24 bit still broken. - - * src/aiff.c - Improved reporting of encoding types. - - * src/voc.c - Clean up. - -2002-01-27 Erik de Castro Lopo - - * src/dwvw.c - New file implementing lossless Delta Word Variable Width (DWVW) encoding. - Reading 12 bit DWVW is now working. - - * src/aiff.c common.h sndfile.c - Added hooks for DWVW encoded AIFF and RAW files. - -2002-01-15 Erik de Castro Lopo - - * src/w64.c - Robustify header parsing. - - * src/wav_w64.h - Header file wav.h was renamed to wav_w64.h to signify sharing of - definitions across the two file types. - - * src/wav.c src/w64.c src/wav_w64.c - Refactoring. - Modified and moved functions with a high degree of similarity between - wav.c and w64.c to wav_w64.c. - -2002-01-14 Erik de Castro Lopo - - * src/w64.c - Completed work on getting read and write working. - - * examples/sfplay.c - Added code to scale floating point data so it plays at a reasonable volume. - - * tests/Makefile.am tests/write_read_test.c - Added tests for W64 files. - -2002-01-13 Erik de Castro Lopo - - * src/*.c - Modded all code in file header writing routines to use - psf_new_binheader_writef(). - Removed psf_binheader_writef() from src/common.c. - Globally replaced psf_new_binheader_writef with psf_binheader_writef. - -2002-01-12 Erik de Castro Lopo - - * src/*.c - Modded all code in file parsing routines to use psf_new_binheader_readf(). - Removed psf_binheader_readf() from src/common.c. - Globally replaced psf_new_binheader_readf with psf_binheader_readf. - - * src/common.[ch] - Added new function psf_new_binheader_writef () which will soon replace - psf_binheader_writef (). The new function has basically the same function - as the original but has a more flexible and capable interface. It also - allows the writing of 64 bit integer values for files contains 64 bit file - offsets. - -2002-01-11 Erik de Castro Lopo - - * src/formats.c src/sndfile.c src/sndfile.h - Added code allowing full enumeration of supported file formats via the - sf_command () interface. - This feature will allow applications to avoid needing recompilation when - support for new file formats are added to libsndfile. - - * tests/command_test.c - Added test code for the above feature. - - * examples/list_formats.c - New file. An example of the use of the supported file enumeration - interface. This program lists all the major formats and for each major - format the supported subformats. - -2002-01-10 Erik de Castro Lopo - - * src/*.[ch] tests/*.c - Changed command parameter of sf_command () function from a test string to - an int. The valid values for the command parameter begin with SFC_ and are - listed in src/sndfile.h. - -2001-12-20 Erik de Castro Lopo - - * src/formats.c src/sndfile.c - Added an way of enumerating a set of common file formats using the - sf_command () interface. This interface was suggested by Dominic Mazzoni, - one of the main authors of Audacity (http://audacity.sourceforge.net/). - -2001-12-26 Erik de Castro Lopo - - * src/sndfile.c - Added checking of filename parameter in sf_open_read (). Previousy, if a - NULL pointer was passed the library would segfault. - -2001-12-18 Erik de Castro Lopo - - * src/common.c src/common.h - Changed the len parameter of the endswap_*_array () functions from type - int to type long. - - * src/pcm.c - Fixed a problem which - -2001-12-15 Erik de Castro Lopo - - * src/sndfile.c - Added conditional #include for EMX/gcc on OS/2. Thanks to - Paul Hartman for pointing this out. - - * tests/lossy_comp_test.c tests/floating_point_test.c - Added definitions for M_PI for when it isn't defined in . - -2001-11-30 Erik de Castro Lopo - - * src/ircam.c - Re-implemented the header reader. Old version was making incorrect - assumptions about the endian-ness of the file from the magic number at the - start of the file. The new code looks at the integer which holds the - number of channels and determines the endian-ness from that. - -2001-11-30 Erik de Castro Lopo - - * src/aiff.c - Added support for other AIFC types ('raw ', 'in32', '23ni'). - Further work on IMA ADPCM encoding. - -2001-11-29 Erik de Castro Lopo - - * src/ima_adpcm.c - Renamed from wav_ima_adpcm.c. This file will soon handle IMA ADPCM - encodings for both WAV and AIFF files. - - * src/aiff.c - Started adding IMA ADPCM support. - -2001-11-28 Erik de Castro Lopo - - * src/double.c - New file for handling double precision floating point (SF_FORMAT_DOUBLE) - data. - - * src/wav.c src/aiff.c src/au.c src/raw.c - Added support for SF_FORMAT_DOUBLE data. - - * src/common.[ch] - Addition of endswap_long_array () for endian swapping 64 bit integers. This - function will work correctly on processors with 32 bit and 64 bit longs. - Optimised endswap_short_array () and endswap_int_array (). - - * tests/pcm_test.c - Added and extra check. After the first file of each type is written to disk - a checksum is performed of the first 64 bytes and checked against a pre- - calculated value. This will work whatever the endian-ness of the host - machine. - -2001-11-27 Erik de Castro Lopo - - * src/aiff.c - Added handling of u-law, A-law encoded AIFF files. Thanks to Tom Erbe for - supplying example files. - - * tests/lossy_comp_test.c - Added tests for above. - - * src/common.h src/*.c - Removed function typedefs from common.h and function pointer casting in all - the other files. This allows the compiler to perform proper type checking. - Hopefully this will prevernt problems like the sf_seek bug for OpenBSD, - BeOS etc. - - * src/common.[ch] - Added new function psf_new_binheader_readf () which will eventually replace - psf_binheader_readf (). The new function has basically the same function as - the original but has a more flexible and capable interface. It also allows - the reading of 64 bit integer values for files contains 64 bit file - offsets. - -2001-11-26 Erik de Castro Lopo - - * src/voc.c - Completed implementation of VOC file handling. Can now handle 8 and 16 bit - PCM, u-law and A-law files with one or two channels. - - * src/write_read_test.c tests/lossy_comp_test.c - Added tests for VOC files. - -2001-11-22 Erik de Castro Lopo - - * src/float_cast.h - Added inline asm version of lrint/lrintf for MacOS. Solution provided by - Stephane Letz. - - * src/voc.c - More work on this braindamaged format. The VOC files produced by SoX also - have a number of inconsistencies. - -2001-11-19 Erik de Castro Lopo - - * src/paf.c - Added support for 8 bit PCM PAF files. - - * tests/write_read_test.c - Added tests for 8 bit PAF files. - -2001-11-18 Erik de Castro Lopo - - * tests/pcm_test.c - New test program to test for correct scaling of integer values between - different sized integer containers (ie short -> int). - The new specs for libsndfile state that when the source and destination - containers are of a different size, the most significant bit of the source - value becomes the most significant bit of the destination container. - - * src/pcm.c src/paf.c - Modified to pass the above test program. - - * tests/write_read_test.c tests/lossy_comp_test.c - Modified to work with the new scaling rules. - -2001-11-17 Erik de Castro Lopo - - * src/raw.c tests/write_read_test.c tests/write_read_test.c - Added ability to do raw reads/writes of float, u-law and A-law files. - - * src/*.[ch] examples/*.[ch] tests/*.[ch] - Removed dependance on pcmbitwidth field of SF_INFO struct and moved to new - SF_FORMAT_* types and use of SF_ENDIAN_BIG/LITTLE/CPU. - -2001-11-12 Erik de Castro Lopo - - * src/*.[ch] - Started implmentation of major changes documented in doc/version1.html. - - Removed all usage of off_t which is not part of the ISO C standard. All - places which were using it are now using type long which is the type of - the offset parameter for the fseek function. - This should fix problems on BeOS, MacOS and *BSD like systems which were - failing "make check" because sizeof (long) != sizeof (off_t). - --------------------------------------------------------------------------------- -This is the boundary between version 1 of the library above and version 0 below. --------------------------------------------------------------------------------- - -2001-11-11 Erik de Castro Lopo - - * examples/sfplay_beos.cpp - Added BeOS version of sfplay.c. This needs to be compiled using a C++ - compiler so is therefore not built by default. Thanks to Marcus Overhagen - for providing this. - -2001-11-10 Erik de Castro Lopo - - * examples/sfplay.c - New example file showing how libsndfile can be used to read and play a - sound file. - At the moment on Linux is supported. Others will follow in the near future. - -2001-11-09 Erik de Castro Lopo - - * src/pcm.c - Fixed problem with normalisation code where a value of 1.0 could map to - a value greater than MAX_SHORT or MAX_INT. Thanks to Roger Dannenberg for - pointing this out. - -2001-11-08 Erik de Castro Lopo - - * src/pcm.c - Fixed scaling issue when reading/writing 8 bit files using - sf_read/sf_write_short (). - On read, values are scaled so that the most significant bit in the char - ends up in the most significant bit of the short. On write, values are - scaled so that most significant bit in the short ends up as the most - significant bit in the char. - -2001-11-07 Erik de Castro Lopo - - * src/au.c src/sndfile.c - Added support for 32 bit float data in big and little endian AU files. - - * tests/write_read_test.c - Added tests for 32 bit float data in AU files. - -2001-11-06 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Finalised testing of stereo files where possible. - -2001-11-05 Erik de Castro Lopo - - * src/wav_ms_adpcm.c - Fixed bug in writing stereo MS ADPCM WAV files. Thanks to Xu Xin for - pointing out this problem. - -2001-10-24 Erik de Castro Lopo - - * src/wav_ms_adpcm.c - Modified function srate2blocksize () to handle 44k1Hz stereo files. - -2001-10-21 Erik de Castro Lopo - - * src/w64.c - Added support for Sonic Foundry 64 bit WAV format. As Linux (my main - development platform) does not yet support 64 bit file offsets by default, - current handling of this file format treats everything as 32 bit and fails - openning the file, if it finds anything that goes beyond 32 bit values. - - * src/sndfile.[hc] src/common.h src/Makefile.am - Added hooks for W64 support. - -2001-10-21 Erik de Castro Lopo - - * configure.in - Added more warnings options to CFLAGS when the gcc compiler is detected. - - * src/*.[ch] tests/*.c examples/*.c - Started fixing the warning messages due to the new CFLASG. - - * src/voc.c - More work on VOC file read/writing. - - * src/paf.c - Found that PAF files were not checking the normalisation flag when reading - or writing floats and doubles. Fixed it. - - * tests/floating_point_test.c - Added specific test for the above problem. - - * src/float_cast.h src/pcm.c - Added a section for Win32 to define lrint () and lrintf () in the header - and implement it in the pcm.c - -2001-10-20 Erik de Castro Lopo - - * sndfile-config.in m4/sndfile.m4 - These files were donated by Conrad Parker who also provided instructions - on how to install them using autoconf/automake. - - * src/float_cast.h - Fiddled around with this file some more. On Linux and other gcc supported - OSes use the C99 functions lrintf() and lrint() for casting from floating - point to int without incurring the huge perfromance penalty (particularly - on the i386 family) caused by the regular C cast from float to int. - These new C99 functions replace the FLOAT_TO_* and DOUBLE_TO_* macros which - I had been playing with. - - * configure.in m4/lrint.m4 m4/lrintf.m4 - Add detection of these functions. - -2001-10-17 Erik de Castro Lopo - - * src/voc.c - Completed code for reading VOC files containing a single audio data - segment. - Started implementing code to handle files with multiple VOC_SOUND_DATA - segments but couldn't be bothered finishing it. Multiple segment files can - have different sample rates for different sections and other nasties like - silence and repeat segments. - -2001-10-16 Erik de Castro Lopo - - * src/common.h src/*.c - Removed SF_PRIVATE struct field fdata and replaced it with extra_data. - - * src/voc.c - Further development of the read part of this woefult file format. - -2001-10-04 Erik de Castro Lopo - - * src/float_cast.h - Implemented gcc and i386 floating point to int cast macros. Standard cast - will be used when not on gcc for i385. - - * src/pcm.c - Modified all uses of FLOAT/DOUBLE_TO_INT and FLOAT/DOUBLE_TO_SHORT casts to - comply with macros in float_cast.h. - -2001-10-04 Erik de Castro Lopo - - * src/voc.c - Changed the TYPE_xxx enum names to VOC_TYPE_xxx to prevent name clashes - on MacOS with CodeWarrior 6.0. - - * MacOS/MacOS-readme.txt - Updated the compile instructions. Probably still need work as I don't have - access to a Mac. - -2001-10-01 Erik de Castro Lopo - - * src/wav.c src/aiff.c common.c - Changed all references to snprintf to LSF_SNPRINTF and all vsnprintf to - LSF_VSNPRINTF. LSF_VSNPRINTF and LSF_VSNPRINTF are defined in common.h. - - * src/common.h - Added checking of HAVE_SNPRINTF and HAVE_VSNPRINTF and defining - LSF_VSNPRINTF and LSF_VSNPRINTF to appropriate values. - - * src/missing.c - New file containing a minimal implementation of snprintf and vsnprintf - functions named missing_snprintf and missing_vsnprintf respectively. These - are only compliled into the binary if snprintf and/or vsnprintf are not - available. - -2001-09-29 Erik de Castro Lopo - - * src/ircam.c - New file to handle Berkeley/IRCAM/CARL files. - - * src/sndfile.c src/common.h - Modified for IRCAM handling. - - * tests/*.c - Added tests for IRCAM files. - -2001-09-27 Erik de Castro Lopo - - * src/wav.c - Apparently microsoft windows (tm) doesn't like ulaw and Alaw WAV files with - 20 byte format chunks (contrary to ms's own documentation). Fixed the WAV - header writing code to generate smaller ms compliant ulaw and Alaw WAV - files. - -2001-09-17 Erik de Castro Lopo - - * tests/stdio_test.sh tests/stdio_test.c - Shell script was rewritten as a C program due to incompatibilities of the - sh shell on Linux and Solaris. - -2001-09-16 Erik de Castro Lopo - - * tests/stdio_test.sh tests/stdout_test.c tests/stdin_test.c - New test programs to verify the correct operation of reading from stdin and - writing to stdout. - - * src/sndfile.c wav.c au.c nist.c paf.c - Fixed a bugs uncovered by the new test programs above. - -2001-09-15 Erik de Castro Lopo - - * src/sndfile.c wav.c - Fixed a bug preventing reading a file from stdin. Found by T. Narita. - -2001-09-12 Erik de Castro Lopo - - * src/common.h - Fixed a problem on OpenBSD 2.9 which was causing sf_seek() to fail on IMA - WAV files. Root cause was the declaration of the func_seek typedef not - matching the functions it was actually being used to point to. In OpenBSD - sizeof (off_t) != sizeof (int). Thanks to Heikki Korpela for allowing me - to log into his OpenBSD machine to debug this problem. - -2001-09-03 Erik de Castro Lopo - - * src/sndfile.c - Implemented sf_command ("norm float"). - - * src/*.c - Implemented handling of sf_command ("set-norm-float"). Float normalization - can now be turned on and off. - - * tests/double_test.c - Renamed to floating_point_test.c. Modified to include tests for all scaled - reads and writes of floats and doubles. - - * src/au_g72x.c - Fixed bug in normalization code found with improved floating_point_test - program. - - * src/wav.c - Added code for parsing 'INFO' and 'LIST' chunks. Will be used for extract - text annotations from WAV files. - - * src/aiff.c - Added code for parsing '(c) ' and 'ANNO' chunks. Will be used for extract - text annotations from WAV files. - -2001-09-02 Erik de Castro Lopo - - * examples/sf_info.c example/Makefile.am - Renamed to sndfile_info.c. The program sndfile_info will now be installed - when the library is installed. - - * src/float_cast.h - New file defining floating point to short and int casts. These casts will - eventually replace all flot and double casts to short and int. See comments - at the top of the file for the reasoning. - - * src/*.c - Changed all default float and double casts to short or int with macros - defined in floatcast.h. At the moment these casts do nothing. They will be - replaced with faster float to int cast operations in the near future. - -2001-08-31 Erik de Castro Lopo - - * tests/command_test.c - New file for testing sf_command () functionality. - - * src/sndfile.c - Revisiting of error return values of some functions. - Started implementing sf_command () a new function will allow on-the-fly - modification of library behaviour, or instance, sample value scaling. - - * src/common.h - Added hook for format specific sf_command () calls to SNDFILE struct. - - * doc/api.html - Updated and errors corrected. - - * doc/command.html - New documentation file explaining new sf_command () function. - -2001-08-11 Erik de Castro Lopo - - * src/sndfile.c - Fixed error return values from sf_read*() and sf_write*(). There were - numerous instances of -1 being returned through size_t. These now all set - error int the SF_PRIVATE struct and return 0. Thanks to David Viens for - spotting this. - -2001-08-01 Erik de Castro Lopo - - * src/common.c - Fixed use of va_arg() calls that were causing warning messages with the - latest version of gcc (thanks Maurizio Umberto Puxeddu). - -2001-07-25 Erik de Castro Lopo - - * src/*.c src/sfendian.h - Moved definition of MAKE_MARKER macro to sfendian.h - -2001-07-23 Erik de Castro Lopo - - * src/sndfile.c - Modified sf_get_lib_version () so that version string will be visible using - the Unix strings command. - - * examples/Makefile.am examples/sfinfo.c - Renamed sfinfo program and source code to sf_info. This prevents a name - clash with the program included with libaudiofile. - -2001-07-22 Erik de Castro Lopo - - * tests/read_seek_test.c tests/lossy_comp_test.c - Added tests for sf_read_float () and sf_readf_float (). - - * src/voc.c - New files for handling Creative Voice files (not complete). - - * src/samplitude.c - New files for handling Samplitude files (not complete). - -2001-07-21 Erik de Castro Lopo - - * src/aiff.c src/au.c src/paf.c src/svx.c src/wav.c - Converted these files to using psf_binheader_readf() function. Will soon be - ready to attempt to make reading writing from pipes work reliably. - - * src/*.[ch] - Added code for sf_read_float () and sf_readf_float () methods of accessing - file data. - -2001-07-20 Erik de Castro Lopo - - * src/paf.c src/wav_gsm610.c - Removed two printf()s which had escaped notice for some time (thanks - Sigbjørn Skjæret). - -2001-07-19 Erik de Castro Lopo - - * src/wav_gsm610.c - Fixed a bug which prevented GSM 6.10 encoded WAV files generated by - libsndfile from being played in Windoze (thanks klay). - -2001-07-18 Erik de Castro Lopo - - * src/common.[ch] - Implemented psf_binheader_readf() which will do for file header reading what - psf_binheader_writef() did for writing headers. Will eventually allow - libsndfile to read and write from pipes, including named pipes. - -2001-07-16 Erik de Castro Lopo - - * MacOS/config.h Win32/config.h - Attempted to bring these two files uptodate with src/config.h. As I don't - have access to either of these systems support for them may be completely - broken. - -2001-06-18 Erik de Castro Lopo - - * src/float32.c - Fixed bug for big endian processors that can't read 32 bit IEEE floats. Now - tested on Intel x86 and UltraSparc processors. - -2001-06-13 Erik de Castro Lopo - - * src/aiff.c - Modified to allow REX files (from Propellorhead's Recycle and Reason - programs) to be read. - REX files are basically an AIFF file with slightly unusual sequence of - chunks (AIFF files are supposed to allow any sequence) and some extra - application specific information. - Not yet able to write a REX file as the details of the application specific - data is unknown. - -2001-06-12 Erik de Castro Lopo - - * src/wav.c - Fixed endian bug when reading PEAK chunk on big endian machines. - - * src/common.c - Fixed endian bug when reading PEAK chunk on big endian machines with - --enable-force-broken-float configure option. - Fix psf_binheader_writef for (FORCE_BROKEN_FLOAT ||______) - -2001-06-07 Erik de Castro Lopo - - * configure.in src/config.h.in - Removed old CAN_READ_WRITE_x86_IEEE configure variable now that float - capabilities are detected at run time. - Added FORCE_BROKEN_FLOAT to allow testing of broken float code on machines - where the processor can in fact handle floats correctly. - - * src/float32.c - Rejigged code reading and writing of floats on broken processors. - - * m4/ - Removed this directory and all its files as they are no longer needed. - -2001-06-05 Erik de Castro Lopo - - * tests/peak_chunk_test.c - New test to validate reading and writing of peak chunk. - - * examples/sfconvert - Added -float32 option. - - * src/*.c - Changed all error return values to negative values (ie the negative of what - they were). - - * src/sndfile.c tests/error_test.c - Modified to take account of the previous change. - -2001-06-04 Erik de Castro Lopo - - * src/float32.c - File renamed from wav_float.c and renamed function to something more - general. - Added runtime detection of floating point capabilities. - Added recording of peaks during write for generation of PEAK chunk. - - * src/wav.c src/aiff.c - Added handing for PEAK chunk for floating point files. PEAK is read when the - file headers are read and generated when the file is closed. Logic is in - place for adding PEAK chunk to end of file when writing to a pipe (reading - and writing from/to pipe to be implemented soon). - - * src/sndfile.c - Modified sf_signal_max () to use PEAK values if present. - -2001-06-03 Erik de Castro Lopo - - * src/*.c - Added pcm_read_init () and pcm_write_init () to src/pcm.c and removed all - other calls to functions in this file from the filetype specific files. - - * src/*.c - Added alaw_read_init (), alaw_write_int (), ulaw_read_init () and - ulaw_write_init () and removed all other calls to functions in alaw.c and - ulaw.c from the filetype specific files. - - * tests/write_read_test.c - Added tests to validate sf_seek () on all file types. - - * src/raw.c - Implemented raw_seek () function to fix a bug where - sf_seek (file, 0, SEEK_SET) on a RAW file failed. - - * src/paf.c - Fixed a bug in paf24_seek () found due to added seeks tests in - tests/write_read_test.c - -2001-06-01 Erik de Castro Lopo - - * tests/read_seek_test.c - Fixed a couple of broken binary files. - - * src/aiff.c src/wav.c - Added handling of PEAK chunks on file read. - -2001-05-31 Erik de Castro Lopo - - * check_libsndfile.py - New file for the regression testing of libsndfile. - check_libsndfile.py is a Python script which reads in a file containing - filenames of audio files. Each file is checked by running the examples/sfinfo - program on them and checking for error or warning messages in the libsndfile - log buffer. - - * check_libsndfile.list - This is an example list of audio files for use with check_libsndfile.py - - * tests/lossy_comp_test.c - Changed the defined value of M_PI for math header files which don't have it. - This fixed validation test failures on MetroWerks compilers. Thanks to Lord - Praetor Satanus of Acheron for bringing this to my attention. - -2001-05-30 Erik de Castro Lopo - - * src/common.[ch] - Removed psf_header_setf () which was no longer required after refactoring - and simplification of header writing. - Added 'z' format specifier to psf_binheader_writef () for zero filling header - with N bytes. Used by paf.c and nist.c - - * tests/check_log_buffer.c - New file implementing check_log_buffer () which reads the log buffer of a - SNDFILE* object and searches for error and warning messages. Calls exit () - if any are found. - - * tests/*.c - Added calls to check_log_buffer () after each call to sf_open_XXX (). - -2001-05-29 Erik de Castro Lopo - - * src/wav.c src/wav_ms_adpcm.c src/wav_gsm610.c - Major rehack of header writing using psf_binheader_writef (). - -2001-05-28 Erik de Castro Lopo - - * src/wav.c src/wav_ima_adpcm.c - Major rehack of header writing using psf_binheader_writef (). - -2001-05-27 Erik de Castro Lopo - - * src/wav.c - Changed return type of get_encoding_str () to prevent compiler warnings on - Mac OSX. - - * src/aiff.c src/au.c - Major rehack of header writing using psf_binheader_writef (). - -2001-05-25 Erik de Castro Lopo - - * src/common.h src/common.c - Added comments. - Name of log buffer changed from strbuffer to logbuffer. - Name of log buffer index variable changed from strindex to logindex. - - * src/*.[ch] - Changed name of internal logging function from psf_sprintf () to - psf_log_printf (). - Changed name of internal header generation functions from - psf_[ab]h_printf () to psf_asciiheader_printf () and - psf_binheader_writef (). - Changed name of internal header manipulation function psf_hsetf () to - psf_header_setf (). - -2001-05-24 Erik de Castro Lopo - - * src/nist.c - Fixed reading and writing of sample_byte_format header. "01" means little - endian and "10" means big endian regardless of bit width. - - * configure.in - Detect Mac OSX and disable -Wall and -pedantic gcc options. Mac OSX is - way screwed up and spews out buckets of warning messages from the system - headers. - Added --disable-gcc-opt configure option (sets gcc optimisation to -O0 ) for - easier debugging. - Made decision to harmonise source code version number and .so library - version number. Future releases will stick to this rule. - - * doc/new_file_type.HOWTO - New file to document the addition of new file types to libsndfile. - -2001-05-23 Erik de Castro Lopo - - * src/nist.c - New file for reading/writing Sphere NIST audio file format. - Originally requested by Elis Pomales in 1999. - Retrieved from unstable (and untouched for 18 months) branch of libsndfile. - Some vital information gleaned from the source code to Bill Schottstaedt's - sndlib library : ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz - Currently reading and writing 16, 24 and 32 bit, big-endian and little - endian, stereo and mono files. - - * src/common.h src/common.c - Added psf_ah_printf () function to help construction of ASCII headers (ie NIST). - - * configure.in - Added test for vsnprintf () required by psf_ah_printf (). - - * tests/write_read_test.c - Added tests for supported NIST files. - -2001-05-22 Erik de Castro Lopo - - * tests/write_read_test.c - Added tests for little endian AIFC files. - - * src/aiff.c - Minor re-working of aiff_open_write (). - Added write support for little endian PCM encoded AIFC files. - -2001-05-13 Erik de Castro Lopo - - * src/aiff.c - Minor re-working of aiff_open_read (). - Added read support for little endian PCM encoded AIFC files from the Mac - OSX CD ripper program. Guillaume Lessard provided a couple of sample files - and a working patch. - The patch was not used as is but gave a good guide as to what to do. - -2001-05-11 Erik de Castro Lopo - - * src/sndfile.h - Fixed comments about endian-ness of WAV and AIFF files. Guillaume Lessard - pointed out the error. - -2001-04-23 Erik de Castro Lopo - - * examples/make_sine.c - Re-write of this example using sample rate and required frequency in Hz. - -2001-02-11 Erik de Castro Lopo - - * src/sndfile.c - Fixed bug that prevented known file types from being read as RAW PCM data. - -2000-12-16 Erik de Castro Lopo - - * src/aiff.c - Added handing of COMT chunk. - -2000-11-16 Erik de Castro Lopo - - * examples/sfconvert.c - Fixed bug in normalisatio code. Pointed out by Johnny Wu. - -2000-11-08 Erik de Castro Lopo - - * Win32/config.h - Fixed the incorrect setting of HAVE_ENDIAN_H parameter. Win32 only issue. - -2000-10-27 Erik de Castro Lopo - - * tests/Makefile.am - Added -lm for write_read_test_LDADD. - -2000-10-16 Erik de Castro Lopo - - * src/sndfile.c src/au.c - Fixed bug which prevented writing of G723 24kbps AU files. - - * tests/lossy_comp_test.c - Corrrection to options for G723 tests. - - * configure.in - Added --disable-gcc-pipe option for DJGPP compiler (gcc on MS-DOS) which - doesn't allow gcc -pipe option. - -2000-09-03 Erik de Castro Lopo - - * src/ulaw.c src/alaw.c src/wav_imaadpcm.c src/msadpcm.c src/wav_gsm610.c - Fixed normailsation bugs shown up by new double_test program. - -2000-08-31 Erik de Castro Lopo - - * src/pcm.c - Fixed bug in normalisation code (spotted by Steve Lhomme). - - * tests/double_test.c - New file to test scaled and unscaled sf_read_double() and sf_write_double() - functions. - -2000-08-28 Erik de Castro Lopo - - * COPYING - Changed to the LGPL COPYING file (spotted by H. S. Teoh). - -2000-08-21 Erik de Castro Lopo - - * src/sndfile.h - Removed prototype of unimplemented function sf_get_info(). Added prototype - for sf_error_number() Thanks to Sigbjørn Skjæret for spotting these. - -2000-08-18 Erik de Castro Lopo - - * src/newpcm.h - New file to contain a complete rewrite of the PCM data handling. - -2000-08-15 Erik de Castro Lopo - - * src/sndfile.c - Fixed a leak of FILE* pointers in sf_open_write(). Thanks to Sigbjørn - Skjæret for spotting this one. - -2000-08-13 Erik de Castro Lopo - - * src/au_g72x.c src/G72x/g72x.c - Added G723 encoded AU file support. - - * tests/lossy_comp_test.c - Added tests for G721 and G723 encoded AU files. - -2000-08-06 Erik de Castro Lopo - - * all files - Changed the license to LGPL. Albert Faber who had copyright on - Win32/unistd.h gave his permission to change the license on that file. All - other files were either copyright erikd AT mega-nerd DOT com or copyright - under a GPL/LGPL compatible license. - -2000-08-06 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Fixed incorrect error message. - - * src/au_g72x.c src/G72x/* - G721 encoded AU files now working. - - * Win32/README-Win32.txt - Replaced this file with a new one which gives a full explanation - of how to build libsndfile under Win32. Thanks to Mike Ricos. - -2000-08-05 Erik de Castro Lopo - - * src/*.[ch] - Removed double leading underscores from the start of all variable and - function names. Identifiers with a leading underscores are reserved - for use by the compiler. - - * src/au_g72x.c src/G72x/* - Continued work on G721 encoded AU files. - -2000-07-12 Erik de Castro Lopo - - * src/G72x/* - New files for reading/writing G721 and G723 ADPCM audio. These files - are from a Sun Microsystems reference implementation released under a - free software licence. - Extensive changes to this code to make it fit in with libsndfile. - See the ChangeLog in this directory for details. - - * src/au_g72x.c - New file for G721 encoded AU files. - -2000-07-08 Erik de Castro Lopo - - * libsndfile.spec.in - Added a spec file for making RPMs. Thanks to Josh Green for supplying this. - -2000-06-28 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h - Add checking for and handling of header-less u-law encoded AU/SND files. - Any file with a ".au" or ".snd" file extension and without the normal - AU file header is treated as an 8kHz, u-law encoded file. - - * src/au.h - New function for opening a headerless u-law encoded file for read. - -2000-06-04 Erik de Castro Lopo - - * src/paf.c - Add checking for files shorter than minimal PAF file header length. - -2000-06-02 Erik de Castro Lopo - - * tests/write_read_test.c - Added extra sf_perror() calls when sf_write_XXXX fails. - -2000-05-29 Erik de Castro Lopo - - * src/common.c - Modified usage of va_arg() macro to work correctly on PowerPC - Linux. Thanks to Kyle Wheeler for giving me ssh access to his - machine while I was trying to track this down. - - * configure.in src/*.[ch] - Sorted out some endian-ness issues brought up by PowerPC Linux. - - * tests/read_seek_test.c - Added extra debugging for when tests fail. - -2000-05-18 Erik de Castro Lopo - - * src/wav.c - Fixed bug in GSM 6.10 handling for big-endian machines. Thanks - to Sigbjørn Skjæret for reporting this. - -2000-04-25 Erik de Castro Lopo - - * src/sndfile.c src/wav.c src/wav_gsm610.c - Finallised writing of GSM 6.10 WAV files. - - * tests/lossy_comp_test.c - Wrote new test code for GSM 6.10 files. - - * examples/sfinfo.c - Fixed incorrect format in printf() statement. - -2000-04-06 Erik de Castro Lopo - - * src/sndfile.h.in - Fixed comments about sf_perror () and sf_error_str (). - -2000-03-14 Erik de Castro Lopo - - * configure.in - Fixed --enable-justsrc option. - -2000-03-07 Erik de Castro Lopo - - * wav.c - Fixed checking of bytespersec field of header. Still some weirdness - with some files. - -2000-03-05 Erik de Castro Lopo - - * tests/lossy_comp_test.c - Added option to test PCM WAV files (sanity check). - Fixed bug in sf_seek() tests. - -2000-02-29 Erik de Castro Lopo - - * src/sndfile.c src/wav.c - Minor changes to allow writing of GSM 6.10 WAV files. - -2000-02-28 Erik de Castro Lopo - - * configure.in Makefile.am src/Makefile.am - Finally got around to figuring out how to build a single library from - multiple source directories. - Reading GSM 6.10 files now seems to work. - -2000-01-03 Erik de Castro Lopo - - * src/wav.c - Added more error reporting in read_fmt_chunk(). - -1999-12-21 Erik de Castro Lopo - - * examples/sfinfo.c - Modified program to accept multiple filenames from the command line. - -1999-11-27 Erik de Castro Lopo - - * src/wav_ima_adpcm.c - Moved code around in preparation to adding ability to read/write IMA ADPCM - encoded AIFF files. - -1999-11-16 Erik de Castro Lopo - - * src/common.c - Fixed put_int() and put_short() macros used by _psf_hprintf() which were - causing seg. faults on Sparc Solaris. - -1999-11-15 Erik de Castro Lopo - - * src/common.c - Added string.h to includes. Thanks to Sigbjxrn Skjfret. - - * src/svx.c - Fixed __svx_close() function to ensure FORM and BODY chunks are correctly - set. - -1999-10-01 Erik de Castro Lopo - - * src/au.c - Fixed handling of incorrect size field in AU header on read. Thanks to - Christoph Lauer for finding this problem. - -1999-09-28 Erik de Castro Lopo - - * src/aiff.c - Fixed a bug with incorrect SSND chunk length being written. This also lead - to finding an minor error in AIFF header parsing. Thanks to Dan Timis for - pointing this out. - -1999-09-24 Erik de Castro Lopo - - * src/paf.c - Fixed a bug with reading and writing 24 bit stereo PAF files. This problem - came to light when implementing tests for the new functions which operate - in terms of frames rather than items. - -1999-09-23 Erik de Castro Lopo - - * src/sndfile.c - Modified file type detection to use first 12 bytes of file rather than - file name extension. Required this because NIST files use the same - filename extension as Microsoft WAV files. - - * src/sndfile.c src/sndfile.h - Added short, int and double read/write functions which work in frames - rather than items. This was originally suggested by Maurizio Umberto - Puxeddu. - -1999-09-22 Erik de Castro Lopo - - * src/svx.c - Finished off implementation of write using __psf_hprintf(). - -1999-09-21 Erik de Castro Lopo - - * src/common.h - Added a buffer to SF_PRIVATE for writing the header. This is required - to make generating headers for IFF/SVX files easier as well as making - it easier to do re-write the headers which will be required when - sf_rewrite_header() is implemented. - - * src/common.c - Implemented __psf_hprintf() function. This is an internal function - which is documented briefly just above the code. - -1999-09-05 Erik de Castro Lopo - - * src/sndfile.c - Fixed a bug in sf_write_raw() where it was returning incorrect values - (thanks to Richard Dobson for finding this one). Must put in a test - routine for sf_read_raw and sf_write_raw. - - * src/aiff.c - Fixed default FORMsize in __aiff_open_write (). - - * src/sndfile.c - Added copy of filename to internal data structure. IFF/SVX files - contain a NAME header chunk. Both sf_open_read() and sf_open_write() - copy the file name (less the leading path information) to the - filename field. - - * src/svx.c - Started implementing writing of files. - -1999-08-04 Erik de Castro Lopo - - * src/svx.c - New file for reading/writing 8SVX and 16SVX files. - - * src/sndfile.[ch] src/common.h - Changes for SVX files. - - * src/aiff.c - Fixed header parsing when unknown chunk is found. - -1999-08-01 Erik de Castro Lopo - - * src/paf.c - New file for reading/writing Ensoniq PARIS audio file format. - - * src/sndfile.[ch] src/common.h - Changes for PAF files. - - * src/sndfile.[ch] - Added stuff for sf_get_lib_version() function. - - -1999-07-31 Erik de Castro Lopo - - * src/sndfile.h MacOS/config.h - Fixed minor MacOS configuration issues. - -1999-07-30 Erik de Castro Lopo - - * MacOS/ - Added a new directory for the MacOS config.h file and the - readme file. - - * src/aiff.c - Fixed calculation of datalength when reading SSND chunk. Thanks to - Sigbjørn Skjæret for pointing out this error. - -1999-07-29 Erik de Castro Lopo - - * src/sndfile.c src/sndfile.h src/raw.c - Further fixing of #includes for MacOS. - -1999-07-25 Erik de Castro Lopo - - * src/wav.c src/aiff.c - Added call to ferror () in main header parsing loop of __XXX_open_read - functions. This should fix problems on platforms (MacOS, AmigaOS) where - fseek()ing or fread()ing beyond the end of the file puts the FILE* - stream in an error state until clearerr() is called. - - * tests/write_read_test.c - Added tests for RAW header-less PCM files. - - * src/common.h - Moved definition of struct tribyte to pcm.c which is the only place - which needs it. - - * src/pcm.c - Modified all code which assumed sizeof (struct tribyte) == 3. This code - did not work on MacOS. Thanks to Ben "Jacobs" for pointing this out. - - * src/au.c - Removed from list of #includes (not being used). - - * src/sndfile.c - Added MacOS specific #ifdef to replace . - - * src/sndfile.h - Added MacOS specific #ifdef to replace . - - * src/sndfile.h - Added MacOS specific typedef for off_t. - - * MacOS-readme.txt - New file with instructions for building libsndfile under MacOS. Thanks - to Ben "Jacobs" for supplying these instructions. - -1999-07-24 Erik de Castro Lopo - - * configure.in - Removed sndfile.h from generated file list as there were no longer - any autoconf substitutions being made. - - * src/raw.c - New file for handling raw header-less PCM files. In order to open these - for read, the user must specify format, pcmbitwidth and channels in the - SF_INFO struct when calling sf_open_read (). - - * src/sndfile.c - Added support for raw header-less PCM files. - -1999-07-22 Erik de Castro Lopo - - * examples/sfinfo.c - Removed options so the sfinfo program always prints out all the information. - -1999-07-19 Erik de Castro Lopo - - * src/alaw.c - New file for A-law encoding (similar to u-law). - - * tests/alaw_test.c - New test program to test the A-law encode/decode lookup tables. - - * tests/lossy_comp_test.c - Added tests for a-law encoded WAV, AU and AULE files. - -1999-07-18 Erik de Castro Lopo - - * src/sndfile.c src/au.c - Removed second "#include ". Thanks to Ben "Jacobs" for pointing - this out. - -1999-07-18 Erik de Castro Lopo - - * tests/ulaw_test.c - New test program to test the u-law encode/decode lookup tables. - -1999-07-16 Erik de Castro Lopo - - * src/sndfile.h - Made corrections to comments on the return values from sf_seek (). - - * src/sndfile.c - Fixed boundary condition checking bug and accounting bug in sf_read_raw (). - -1999-07-15 Erik de Castro Lopo - - * src/au.c src/ulaw.c - Finished implementation of u-law encoded AU files. - - * src/wav.c - Implemented reading and writing of u-law encoded WAV files. - - * tests/ - Changed name of adpcm_test.c to lossy_comp_test.c. This test program - will now be used to test Ulaw and Alaw encoding as well as APDCM. - Added tests for Ulaw encoded WAV files. - -1999-07-14 Erik de Castro Lopo - - * tests/adpcm_test.c - Initialised amp variable in gen_signal() to remove compiler warning. - -1999-07-12 Erik de Castro Lopo - - * src/aiff.c - In __aiff_open_read () prevented fseek()ing beyond end of file which - was causing trouble on MacOS with the MetroWerks compiler. Thanks to - Ben "Jacobs" for pointing this out. - - *src/wav.c - Fixed as above in __wav_open_read (). - -1999-07-01 Erik de Castro Lopo - - * src/wav_ms_adpcm.c - Implemented MS ADPCM encoding. Code cleanup of decoder. - - * tests/adpcm_test.c - Added tests for MS ADPCM WAV files. - - * src/wav_ima_adpcm.c - Fixed incorrect parameter in call to srate2blocksize () from - __ima_writer_init (). - -1999-06-23 Erik de Castro Lopo - - * tests/read_seek_test.c - Added test for 8 bit AIFF files. - -1999-06-18 Erik de Castro Lopo - - * tests/write_read_test.c - Removed test for IMA ADPCM WAV files which is now done in adpcm_test.c - - * configure.in - Added -Wconversion to CFLAGS. - - * src/*.c tests/*.c examples/*.c - Fixed all warnings resulting from use of -Wconversion. - -1999-06-17 Erik de Castro Lopo - - * src/wav.c - Added fact chunk handling on read and write for all non WAVE_FORMAT_PCM - WAV files. - - * src/wav_ima.c - Changed block alignment to be dependant on sample rate. This should make - WAV files created with libsndfile compatible with the MS Windows media - players. - - * tests/adpcm_test.c - Reimplemented adpcm_test_short and implemented adpcm_test_int and - adpcm_test_double. - Now have full testing of IMA ADPCM WAV file read, write and seek. - -1999-06-15 Erik de Castro Lopo - - * src/wav_float.c - Fixed function prototype for x86f2d_array () which was causing ocassional - seg. faults on Sparc Solaris machines. - -1999-06-14 Erik de Castro Lopo - - * src/aiff.c - Fixed bug in __aiff_close where the length fields in the header were - not being correctly calculated before writing. - - * tests/write_read_test.c - Modified to detect the above bug in WAV, AIFF and AU files. - -1999-06-12 Erik de Castro Lopo - - * Win32/* - Added a contribution from Albert Faber to allow libsndfile to compile - under Win32 systems. libsndfile will now be used as part of LAME the - the MPEG 1 Layer 3 encoder (http://internet.roadrunner.com/~mt/mp3/). - -1999-06-11 Erik de Castro Lopo - - * configure.in - Changed to reflect previous changes. - - * src/wav_ima_adpcm.c - Fixed incorrect calculation of bytespersec header field (IMA ADPCM only). - - Fixed bug when writing from int or double data to IMA ADPCM file. Will need - to write test code for this. - - Fixed bug in __ima_write () whereby the length of the current block was - calculated incorrectly. Thanks to Jongcheon Park for pointing this out. - -1999-03-27 Erik de Castro Lopo - - * src/*.c - Changed all read/write/lseek function calls to fread/fwrite/ - fseek/ftell and added error checking of return values from - fread and fwrite in critical areas of the code. - - * src/au.c - Fixed incorrect datasize element in AU header on write. - - * tests/error_test.c - Add new test to check all error values have an associated error - string. This will avoid embarrassing real world core dumps. - -1999-03-23 Erik de Castro Lopo - - * src/wav.c src/aiff.c - Added handling for unknown chunk markers in the file. - -1999-03-22 Erik de Castro Lopo - - * src/sndfile.c - Filled in missing error strings in SndfileErrors array. Missing entries - can cause core dumps when calling sf_error-str (). Thanks to Sam - for finding this problem. - -1999-03-21 Erik de Castro Lopo - - * src/wav_ima_adpcm.c - Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading - stereo files. Caused by not adjusting offset into buffer of decoded - samples for 2 channels. A similar bug existed in __ima_write (). - Need a test for stereo ADPCM files. - - * src/wav_ms_adpcm.c - Decoder working correctly. - -1999-03-18 Erik de Castro Lopo - - * configure.in Makefile.am - Added --enable-justsrc configuration variable sent by Sam - . - - * src/wav_ima_adpcm.c - Fixed bug when reading beyond end of data section due to not - checking pima->blockcount. - This uncovered __ima_seek () bug due to pima->blockcount being set - before calling __ima_init_block (). - -1999-03-17 Erik de Castro Lopo - - * src/wav.c - Started implementing MS ADPCM decoder. - If file is WAVE_FORMAT_ADPCM and length of data chunk is odd, this - encoder seems to add an extra byte. Why not just give an even data - length? - -1999-03-16 Erik de Castro Lopo - - * src/wav.c - Split code out of wav.c to create wav_float.c and wav_ima_adpcm.c. - This will make it easier to add and debug other kinds of WAV files - in future. - -1999-03-14 Erik de Castro Lopo - - * tests/ - Added adpcm_test.c which implements test functions for - IMA ADPCM reading/writing/seeking etc. - - * src/wav.c - Fixed many bugs in IMA ADPCM encoder and decoder. - -1999-03-11 Erik de Castro Lopo - - * src/wav.c - Finished implementing IMA ADPCM encoder and decoder (what a bitch!). - -1999-03-03 Erik de Castro Lopo - - * src/wav.c - Started implementing IMA ADPCM decoder. - -1999-03-02 Erik de Castro Lopo - - * src/sndfile.c - Fixed bug where the sf_read_XXX functions were returning a - incorrect read count when reading past end of file. - Fixed bug in sf_seek () when seeking backwards from end of file. - - * tests/read_seek_test.c - Added multiple read test to short_test(), int_test () and - double_test (). - Added extra chunk to all test WAV files to test that reading - stops at end of 'data' chunk. - -1999-02-21 Erik de Castro Lopo - - * tests/write_read_test.c - Added tests for little DEC endian AU files. - - * src/au.c - Add handling for DEC format little endian AU files. - -1999-02-20 Erik de Castro Lopo - - * src/aiff.c src/au.c src/wav.c - Add __psf_sprintf calls during header parsing. - - * src/sndfile.c src/common.c - Implement sf_header_info (sndfile.c) function and __psf_sprintf (common.c). - - * tests/write_read_test.c - Added tests for 8 bit PCM files (WAV, AIFF and AU). - - * src/au.c src/aiff.c - Add handling of 8 bit PCM data format. - - * src/aiff.c - On write, set blocksize in SSND chunk to zero like everybody else. - -1999-02-16 Erik de Castro Lopo - - * src/pcm.c: - Fixed bug in let2s_array (cptr was not being initialised). - - * src/sndfile.c: - Fixed bug in sf_read_raw and sf_write_raw. sf_seek should - now work when using these functions. - -1999-02-15 Erik de Castro Lopo - - * tests/write_read_test.c: - Force test_buffer array to be double aligned. Sparc Solaris - requires this. - -1999-02-14 Erik de Castro Lopo - - * src/pcm.c: - Fixed a bug which was causing errors in the reading - and writing of 24 bit PCM files. - - * doc/api.html - Finished of preliminary documentaion. - -1999-02-13 Erik de Castro Lopo - - * src/aiff.c: - Changed reading of 'COMM' chunk to avoid reading an int - which overlaps an int (4 byte) boundary. diff --git a/libsndfile.64/NEWS b/libsndfile.64/NEWS deleted file mode 100644 index d8f549f4..00000000 --- a/libsndfile.64/NEWS +++ /dev/null @@ -1,199 +0,0 @@ -Version 1.0.28 (2017-04-02) - * Fix buffer overruns in FLAC and ID3 handling code. - * Move to variable length header storage. - * Fix detection of Large File Support for 32 bit systems. - * Remove large stack allocations in ALAC handling code. - * Remove all use of Variable Length Arrays. - * Minor bug fixes and improvements. - -Version 1.0.27 (2016-06-19) - * Fix an SF_INFO seekable flag regression introduced in 1.0.26. - * Fix potential infinite loops on malformed input files. - * Add string metadata read/write for CAF and RF64. - * Add handling of CUE chunks. - * Fix endian-ness issues in PAF files. - * Minor bug fixes and improvements. - -Version 1.0.26 (2015-11-22) - * Fix for CVE-2014-9496, SD2 buffer read overflow. - * Fix for CVE-2014-9756, file_io.c divide by zero. - * Fix for CVE-2015-7805, AIFF heap write overflow. - * Add support for ALAC encoder in a CAF container. - * Add support for Cart chunks in WAV files. - * Minor bug fixes and improvements. - -Version 1.0.25 (2011-07-13) - * Fix for Secunia Advisory SA45125, heap overflow in PAF file handler. - * Accept broken WAV files with blockalign == 0. - * Minor bug fixes and improvements. - -Version 1.0.24 (2011-03-23) - * WAV files now have an 18 byte u-law and A-law fmt chunk. - * Document virtual I/O functionality. - * Two new methods rawHandle() and takeOwnership() in sndfile.hh. - * AIFF fix for non-zero offset value in SSND chunk. - * Minor bug fixes and improvements. - -Version 1.0.23 (2010-10-10) - * Add version metadata to Windows DLL. - * Add a missing 'inline' to sndfile.hh. - * Update docs. - * Minor bug fixes and improvements. - -Version 1.0.22 (2010-10-04) - * Couple of fixes for SDS file writer. - * Fixes arising from static analysis. - * Handle FLAC files with ID3 meta data at start of file. - * Handle FLAC files which report zero length. - * Other minor bug fixes and improvements. - -Version 1.0.21 (2009-12-13) - * Add a couple of new binary programs to programs/ dir. - * Remove sndfile-jackplay (now in sndfile-tools package). - * Add windows only function sf_wchar_open(). - * Bunch of minor bug fixes. - -Version 1.0.20 (2009-05-14) - * Fix potential heap overflow in VOC file parser (Tobias Klein, http://www.trapkit.de/). - -Version 1.0.19 (2009-03-02) - * Fix for CVE-2009-0186 (Alin Rad Pop, Secunia Research). - * Huge number of minor bug fixes as a result of static analysis. - -Version 1.0.18 (2009-02-07) - * Add Ogg/Vorbis support (thanks to John ffitch). - * Remove captive FLAC library. - * Many new features and bug fixes. - * Generate Win32 and Win64 pre-compiled binaries. - -Version 1.0.17 (2006-08-31) - * Add sndfile.hh C++ wrapper. - * Update Win32 MinGW build instructions. - * Minor bug fixes and cleanups. - -Version 1.0.16 (2006-04-30) - * Add support for Broadcast (BEXT) chunks in WAV files. - * Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS. - * Add support for RIFX (big endian WAV variant). - * Fix configure script bugs. - * Fix bug in INST and MARK chunk writing for AIFF files. - -Version 1.0.15 (2006-03-16) - * Fix some ia64 issues. - * Fix precompiled DLL. - * Minor bug fixes. - -Version 1.0.14 (2006-02-19) - * Really fix MinGW compile problems. - * Minor bug fixes. - -Version 1.0.13 (2006-01-21) - * Fix for MinGW compiler problems. - * Allow readin/write of instrument chunks from WAV and AIFF files. - * Compile problem fix for Solaris compiler. - * Minor cleanups and bug fixes. - -Version 1.0.12 (2005-09-30) - * Add support for FLAC and Apple's Core Audio Format (CAF). - * Add virtual I/O interface (still needs docs). - * Cygwin and other Win32 fixes. - * Minor bug fixes and cleanups. - -Version 1.0.11 (2004-11-15) - * Add support for SD2 files. - * Add read support for loop info in WAV and AIFF files. - * Add more tests. - * Improve type safety. - * Minor optimisations and bug fixes. - -Version 1.0.10 (2004-06-15) - * Fix AIFF read/write mode bugs. - * Add support for compiling Win32 DLLS using MinGW. - * Fix problems resulting in failed compiles with gcc-2.95. - * Improve test suite. - * Minor bug fixes. - -Version 1.0.9 (2004-03-30) - * Add handling of AVR (Audio Visual Research) files. - * Improve handling of WAVEFORMATEXTENSIBLE WAV files. - * Fix for using pipes on Win32. - -Version 1.0.8 (2004-03-14) - * Correct peak chunk handing for files with > 16 tracks. - * Fix for WAV files with huge number of CUE chunks. - -Version 1.0.7 (2004-02-25) - * Fix clip mode detection on ia64, MIPS and other CPUs. - * Fix two MacOSX build problems. - -Version 1.0.6 (2004-02-08) - * Added support for native Win32 file access API (Ross Bencina). - * New mode to add clippling then a converting from float/double to integer - would otherwise wrap around. - * Fixed a bug in reading/writing files > 2Gig on Linux, Solaris and others. - * Many minor bug fixes. - * Other random fixes for Win32. - -Version 1.0.5 (2003-05-03) - * Added support for HTK files. - * Added new function sf_open_fd() to allow for secure opening of temporary - files as well as reading/writing sound files embedded within larger - container files. - * Added string support for AIFF files. - * Minor bug fixes and code cleanups. - -Version 1.0.4 (2003-02-02) - * Added suport of PVF and XI files. - * Added functionality for setting and retreiving strings from sound files. - * Minor code cleanups and bug fixes. - -Version 1.0.3 (2002-12-09) - * Minor bug fixes. - -Version 1.0.2 (2002-11-24) - * Added support for VOX ADPCM. - * Improved error reporting. - * Added version scripting on Linux and Solaris. - * Minor bug fixes. - -Version 1.0.1 (2002-09-14) - * Added MAT and MAT5 file formats. - * Minor bug fixes. - -Version 1.0.0 (2002-08-16) - * Final release for 1.0.0. - -Version 1.0.0rc6 (2002-08-14) - * Release candidate 6 for the 1.0.0 series. - * MacOS9 fixes. - -Version 1.0.0rc5 (2002-08-10) - * Release candidate 5 for the 1.0.0 series. - * Changed the definition of sf_count_t which was causing problems when - libsndfile was compiled with other libraries (ie WxWindows). - * Minor bug fixes. - * Documentation cleanup. - -Version 1.0.0rc4 (2002-08-03) - * Release candidate 4 for the 1.0.0 series. - * Minor bug fixes. - * Fix broken Win32 "make check". - -Version 1.0.0rc3 (2002-08-02) - * Release candidate 3 for the 1.0.0 series. - * Fix bug where libsndfile was reading beyond the end of the data chunk. - * Added on-the-fly header updates on write. - * Fix a couple of documentation issues. - -Version 1.0.0rc2 (2002-06-24) - * Release candidate 2 for the 1.0.0 series. - * Fix compile problem for Win32. - -Version 1.0.0rc1 (2002-06-24) - * Release candidate 1 for the 1.0.0 series. - -Version 0.0.28 (2002-04-27) - * Last offical release of 0.0.X series of the library. - -Version 0.0.8 (1999-02-16) - * First offical release. diff --git a/libsndfile.64/include/sndfile.h b/libsndfile.64/include/sndfile.h deleted file mode 100644 index 8a60fb09..00000000 --- a/libsndfile.64/include/sndfile.h +++ /dev/null @@ -1,857 +0,0 @@ -/* -** Copyright (C) 1999-2016 Erik de Castro Lopo -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU Lesser General Public License as published by -** the Free Software Foundation; either version 2.1 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* -** sndfile.h -- system-wide definitions -** -** API documentation is in the doc/ directory of the source code tarball -** and at http://www.mega-nerd.com/libsndfile/api.html. -*/ - -#ifndef SNDFILE_H -#define SNDFILE_H - -/* This is the version 1.0.X header file. */ -#define SNDFILE_1 - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* The following file types can be read and written. -** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise -** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and -** SF_FORMAT_SUBMASK can be used to separate the major and minor file -** types. -*/ - -enum -{ /* Major formats. */ - SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */ - SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ - SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ - SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ - SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ - SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ - SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ - SF_FORMAT_VOC = 0x080000, /* VOC files. */ - SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ - SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ - SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ - SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ - SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ - SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ - SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ - SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ - SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ - SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ - SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ - SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ - SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ - SF_FORMAT_WVE = 0x190000, /* Psion WVE format */ - SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */ - SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */ - SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */ - - /* Subtypes from here on. */ - - SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ - SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ - SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ - SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ - - SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ - - SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ - SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ - - SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ - SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ - SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ - SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ - - SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ - SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ - - SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ - SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ - SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ - - SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ - SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ - - SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ - SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ - - SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */ - - SF_FORMAT_ALAC_16 = 0x0070, /* Apple Lossless Audio Codec (16 bit). */ - SF_FORMAT_ALAC_20 = 0x0071, /* Apple Lossless Audio Codec (20 bit). */ - SF_FORMAT_ALAC_24 = 0x0072, /* Apple Lossless Audio Codec (24 bit). */ - SF_FORMAT_ALAC_32 = 0x0073, /* Apple Lossless Audio Codec (32 bit). */ - - /* Endian-ness options. */ - - SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ - SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ - SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ - SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ - - SF_FORMAT_SUBMASK = 0x0000FFFF, - SF_FORMAT_TYPEMASK = 0x0FFF0000, - SF_FORMAT_ENDMASK = 0x30000000 -} ; - -/* -** The following are the valid command numbers for the sf_command() -** interface. The use of these commands is documented in the file -** command.html in the doc directory of the source code distribution. -*/ - -enum -{ SFC_GET_LIB_VERSION = 0x1000, - SFC_GET_LOG_INFO = 0x1001, - SFC_GET_CURRENT_SF_INFO = 0x1002, - - - SFC_GET_NORM_DOUBLE = 0x1010, - SFC_GET_NORM_FLOAT = 0x1011, - SFC_SET_NORM_DOUBLE = 0x1012, - SFC_SET_NORM_FLOAT = 0x1013, - SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, - SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015, - - SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, - SFC_GET_SIMPLE_FORMAT = 0x1021, - - SFC_GET_FORMAT_INFO = 0x1028, - - SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, - SFC_GET_FORMAT_MAJOR = 0x1031, - SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, - SFC_GET_FORMAT_SUBTYPE = 0x1033, - - SFC_CALC_SIGNAL_MAX = 0x1040, - SFC_CALC_NORM_SIGNAL_MAX = 0x1041, - SFC_CALC_MAX_ALL_CHANNELS = 0x1042, - SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, - SFC_GET_SIGNAL_MAX = 0x1044, - SFC_GET_MAX_ALL_CHANNELS = 0x1045, - - SFC_SET_ADD_PEAK_CHUNK = 0x1050, - SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051, - - SFC_UPDATE_HEADER_NOW = 0x1060, - SFC_SET_UPDATE_HEADER_AUTO = 0x1061, - - SFC_FILE_TRUNCATE = 0x1080, - - SFC_SET_RAW_START_OFFSET = 0x1090, - - SFC_SET_DITHER_ON_WRITE = 0x10A0, - SFC_SET_DITHER_ON_READ = 0x10A1, - - SFC_GET_DITHER_INFO_COUNT = 0x10A2, - SFC_GET_DITHER_INFO = 0x10A3, - - SFC_GET_EMBED_FILE_INFO = 0x10B0, - - SFC_SET_CLIPPING = 0x10C0, - SFC_GET_CLIPPING = 0x10C1, - - SFC_GET_CUE_COUNT = 0x10CD, - SFC_GET_CUE = 0x10CE, - SFC_SET_CUE = 0x10CF, - - SFC_GET_INSTRUMENT = 0x10D0, - SFC_SET_INSTRUMENT = 0x10D1, - - SFC_GET_LOOP_INFO = 0x10E0, - - SFC_GET_BROADCAST_INFO = 0x10F0, - SFC_SET_BROADCAST_INFO = 0x10F1, - - SFC_GET_CHANNEL_MAP_INFO = 0x1100, - SFC_SET_CHANNEL_MAP_INFO = 0x1101, - - SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110, - - /* Support for Wavex Ambisonics Format */ - SFC_WAVEX_SET_AMBISONIC = 0x1200, - SFC_WAVEX_GET_AMBISONIC = 0x1201, - - /* - ** RF64 files can be set so that on-close, writable files that have less - ** than 4GB of data in them are converted to RIFF/WAV, as per EBU - ** recommendations. - */ - SFC_RF64_AUTO_DOWNGRADE = 0x1210, - - SFC_SET_VBR_ENCODING_QUALITY = 0x1300, - SFC_SET_COMPRESSION_LEVEL = 0x1301, - - /* Cart Chunk support */ - SFC_SET_CART_INFO = 0x1400, - SFC_GET_CART_INFO = 0x1401, - - /* Following commands for testing only. */ - SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, - - /* - ** SFC_SET_ADD_* values are deprecated and will disappear at some - ** time in the future. They are guaranteed to be here up to and - ** including version 1.0.8 to avoid breakage of existing software. - ** They currently do nothing and will continue to do nothing. - */ - SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, - SFC_SET_ADD_DITHER_ON_READ = 0x1071 -} ; - - -/* -** String types that can be set and read from files. Not all file types -** support this and even the file types which support one, may not support -** all string types. -*/ - -enum -{ SF_STR_TITLE = 0x01, - SF_STR_COPYRIGHT = 0x02, - SF_STR_SOFTWARE = 0x03, - SF_STR_ARTIST = 0x04, - SF_STR_COMMENT = 0x05, - SF_STR_DATE = 0x06, - SF_STR_ALBUM = 0x07, - SF_STR_LICENSE = 0x08, - SF_STR_TRACKNUMBER = 0x09, - SF_STR_GENRE = 0x10 -} ; - -/* -** Use the following as the start and end index when doing metadata -** transcoding. -*/ - -#define SF_STR_FIRST SF_STR_TITLE -#define SF_STR_LAST SF_STR_GENRE - -enum -{ /* True and false */ - SF_FALSE = 0, - SF_TRUE = 1, - - /* Modes for opening files. */ - SFM_READ = 0x10, - SFM_WRITE = 0x20, - SFM_RDWR = 0x30, - - SF_AMBISONIC_NONE = 0x40, - SF_AMBISONIC_B_FORMAT = 0x41 -} ; - -/* Public error values. These are guaranteed to remain unchanged for the duration -** of the library major version number. -** There are also a large number of private error numbers which are internal to -** the library which can change at any time. -*/ - -enum -{ SF_ERR_NO_ERROR = 0, - SF_ERR_UNRECOGNISED_FORMAT = 1, - SF_ERR_SYSTEM = 2, - SF_ERR_MALFORMED_FILE = 3, - SF_ERR_UNSUPPORTED_ENCODING = 4 -} ; - - -/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP). -*/ - -enum -{ SF_CHANNEL_MAP_INVALID = 0, - SF_CHANNEL_MAP_MONO = 1, - SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */ - SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */ - SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */ - SF_CHANNEL_MAP_FRONT_LEFT, - SF_CHANNEL_MAP_FRONT_RIGHT, - SF_CHANNEL_MAP_FRONT_CENTER, - SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */ - SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */ - SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */ - SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */ - SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */ - SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */ - SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */ - SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */ - SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */ - SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */ - SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */ - SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */ - SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */ - SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */ - SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */ - - SF_CHANNEL_MAP_AMBISONIC_B_W, - SF_CHANNEL_MAP_AMBISONIC_B_X, - SF_CHANNEL_MAP_AMBISONIC_B_Y, - SF_CHANNEL_MAP_AMBISONIC_B_Z, - - SF_CHANNEL_MAP_MAX -} ; - - -/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */ - -typedef struct SNDFILE_tag SNDFILE ; - -/* The following typedef is system specific and is defined when libsndfile is -** compiled. sf_count_t will be a 64 bit value when the underlying OS allows -** 64 bit file offsets. -** On windows, we need to allow the same header file to be compiler by both GCC -** and the Microsoft compiler. -*/ - -#if (defined (_MSCVER) || defined (_MSC_VER) && (_MSC_VER < 1310)) -typedef __int64 sf_count_t ; -#define SF_COUNT_MAX 0x7fffffffffffffffi64 -#else -typedef __int64 sf_count_t ; -#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL -#endif - - -/* A pointer to a SF_INFO structure is passed to sf_open () and filled in. -** On write, the SF_INFO structure is filled in by the user and passed into -** sf_open (). -*/ - -struct SF_INFO -{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */ - int samplerate ; - int channels ; - int format ; - int sections ; - int seekable ; -} ; - -typedef struct SF_INFO SF_INFO ; - -/* The SF_FORMAT_INFO struct is used to retrieve information about the sound -** file formats libsndfile supports using the sf_command () interface. -** -** Using this interface will allow applications to support new file formats -** and encoding types when libsndfile is upgraded, without requiring -** re-compilation of the application. -** -** Please consult the libsndfile documentation (particularly the information -** on the sf_command () interface) for examples of its use. -*/ - -typedef struct -{ int format ; - const char *name ; - const char *extension ; -} SF_FORMAT_INFO ; - -/* -** Enums and typedefs for adding dither on read and write. -** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE -** and SFC_SET_DITHER_ON_READ. -*/ - -enum -{ SFD_DEFAULT_LEVEL = 0, - SFD_CUSTOM_LEVEL = 0x40000000, - - SFD_NO_DITHER = 500, - SFD_WHITE = 501, - SFD_TRIANGULAR_PDF = 502 -} ; - -typedef struct -{ int type ; - double level ; - const char *name ; -} SF_DITHER_INFO ; - -/* Struct used to retrieve information about a file embedded within a -** larger file. See SFC_GET_EMBED_FILE_INFO. -*/ - -typedef struct -{ sf_count_t offset ; - sf_count_t length ; -} SF_EMBED_FILE_INFO ; - -/* -** Struct used to retrieve cue marker information from a file -*/ - -typedef struct -{ int32_t indx ; - uint32_t position ; - int32_t fcc_chunk ; - int32_t chunk_start ; - int32_t block_start ; - uint32_t sample_offset ; - char name [256] ; -} SF_CUE_POINT ; - -#define SF_CUES_VAR(count) \ - struct \ - { uint32_t cue_count ; \ - SF_CUE_POINT cue_points [count] ; \ - } - -typedef SF_CUES_VAR (100) SF_CUES ; - -/* -** Structs used to retrieve music sample information from a file. -*/ - -enum -{ /* - ** The loop mode field in SF_INSTRUMENT will be one of the following. - */ - SF_LOOP_NONE = 800, - SF_LOOP_FORWARD, - SF_LOOP_BACKWARD, - SF_LOOP_ALTERNATING -} ; - -typedef struct -{ int gain ; - char basenote, detune ; - char velocity_lo, velocity_hi ; - char key_lo, key_hi ; - int loop_count ; - - struct - { int mode ; - uint32_t start ; - uint32_t end ; - uint32_t count ; - } loops [16] ; /* make variable in a sensible way */ -} SF_INSTRUMENT ; - - - -/* Struct used to retrieve loop information from a file.*/ -typedef struct -{ - short time_sig_num ; /* any positive integer > 0 */ - short time_sig_den ; /* any positive power of 2 > 0 */ - int loop_mode ; /* see SF_LOOP enum */ - - int num_beats ; /* this is NOT the amount of quarter notes !!!*/ - /* a full bar of 4/4 is 4 beats */ - /* a full bar of 7/8 is 7 beats */ - - float bpm ; /* suggestion, as it can be calculated using other fields:*/ - /* file's length, file's sampleRate and our time_sig_den*/ - /* -> bpms are always the amount of _quarter notes_ per minute */ - - int root_key ; /* MIDI note, or -1 for None */ - int future [6] ; -} SF_LOOP_INFO ; - - -/* Struct used to retrieve broadcast (EBU) information from a file. -** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. -*/ -#define SF_BROADCAST_INFO_VAR(coding_hist_size) \ - struct \ - { char description [256] ; \ - char originator [32] ; \ - char originator_reference [32] ; \ - char origination_date [10] ; \ - char origination_time [8] ; \ - uint32_t time_reference_low ; \ - uint32_t time_reference_high ; \ - short version ; \ - char umid [64] ; \ - char reserved [190] ; \ - uint32_t coding_history_size ; \ - char coding_history [coding_hist_size] ; \ - } - -/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */ -typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ; - -struct SF_CART_TIMER -{ char usage [4] ; - int32_t value ; -} ; - -typedef struct SF_CART_TIMER SF_CART_TIMER ; - -#define SF_CART_INFO_VAR(p_tag_text_size) \ - struct \ - { char version [4] ; \ - char title [64] ; \ - char artist [64] ; \ - char cut_id [64] ; \ - char client_id [64] ; \ - char category [64] ; \ - char classification [64] ; \ - char out_cue [64] ; \ - char start_date [10] ; \ - char start_time [8] ; \ - char end_date [10] ; \ - char end_time [8] ; \ - char producer_app_id [64] ; \ - char producer_app_version [64] ; \ - char user_def [64] ; \ - int32_t level_reference ; \ - SF_CART_TIMER post_timers [8] ; \ - char reserved [276] ; \ - char url [1024] ; \ - uint32_t tag_text_size ; \ - char tag_text [p_tag_text_size] ; \ - } - -typedef SF_CART_INFO_VAR (256) SF_CART_INFO ; - -/* Virtual I/O functionality. */ - -typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; -typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; -typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; -typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; -typedef sf_count_t (*sf_vio_tell) (void *user_data) ; - -struct SF_VIRTUAL_IO -{ sf_vio_get_filelen get_filelen ; - sf_vio_seek seek ; - sf_vio_read read ; - sf_vio_write write ; - sf_vio_tell tell ; -} ; - -typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ; - - -/* Open the specified file for read, write or both. On error, this will -** return a NULL pointer. To find the error number, pass a NULL SNDFILE -** to sf_strerror (). -** All calls to sf_open() should be matched with a call to sf_close(). -*/ - -SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; - - -/* Use the existing file descriptor to create a SNDFILE object. If close_desc -** is TRUE, the file descriptor will be closed when sf_close() is called. If -** it is FALSE, the descriptor will not be closed. -** When passed a descriptor like this, the library will assume that the start -** of file header is at the current file offset. This allows sound files within -** larger container files to be read and/or written. -** On error, this will return a NULL pointer. To find the error number, pass a -** NULL SNDFILE to sf_strerror (). -** All calls to sf_open_fd() should be matched with a call to sf_close(). - -*/ - -SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; - -SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; - - -/* sf_error () returns a error number which can be translated to a text -** string using sf_error_number(). -*/ - -int sf_error (SNDFILE *sndfile) ; - - -/* sf_strerror () returns to the caller a pointer to the current error message for -** the given SNDFILE. -*/ - -const char* sf_strerror (SNDFILE *sndfile) ; - - -/* sf_error_number () allows the retrieval of the error string for each internal -** error number. -** -*/ - -const char* sf_error_number (int errnum) ; - - -/* The following two error functions are deprecated but they will remain in the -** library for the foreseeable future. The function sf_strerror() should be used -** in their place. -*/ - -int sf_perror (SNDFILE *sndfile) ; -int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; - - -/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ - -int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ; - - -/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ - -int sf_format_check (const SF_INFO *info) ; - - -/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses -** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as -** stdio.h function fseek (). -** An offset of zero with whence set to SEEK_SET will position the -** read / write pointer to the first data sample. -** On success sf_seek returns the current position in (multi-channel) -** samples from the start of the file. -** Please see the libsndfile documentation for moving the read pointer -** separately from the write pointer on files open in mode SFM_RDWR. -** On error all of these functions return -1. -*/ - -enum -{ SF_SEEK_SET = SEEK_SET, - SF_SEEK_CUR = SEEK_CUR, - SF_SEEK_END = SEEK_END -} ; - -sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; - - -/* Functions for retrieving and setting string data within sound files. -** Not all file types support this features; AIFF and WAV do. For both -** functions, the str_type parameter must be one of the SF_STR_* values -** defined above. -** On error, sf_set_string() returns non-zero while sf_get_string() -** returns NULL. -*/ - -int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; - -const char* sf_get_string (SNDFILE *sndfile, int str_type) ; - - -/* Return the library version string. */ - -const char * sf_version_string (void) ; - -/* Return the current byterate at this point in the file. The byte rate in this -** case is the number of bytes per second of audio data. For instance, for a -** stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate -** would be 2 (stereo) * 2 (two bytes per sample) * 16000 => 64000 bytes/sec. -** For some file formats the returned value will be accurate and exact, for some -** it will be a close approximation, for some it will be the average bitrate for -** the whole file and for some it will be a time varying value that was accurate -** when the file was most recently read or written. -** To get the bitrate, multiple this value by 8. -** Returns -1 for unknown. -*/ -int sf_current_byterate (SNDFILE *sndfile) ; - -/* Functions for reading/writing the waveform data of a sound file. -*/ - -sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; -sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ; - - -/* Functions for reading and writing the data chunk in terms of frames. -** The number of items actually read/written = frames * number of channels. -** sf_xxxx_raw read/writes the raw data bytes from/to the file -** sf_xxxx_short passes data in the native short format -** sf_xxxx_int passes data in the native int format -** sf_xxxx_float passes data in the native float format -** sf_xxxx_double passes data in the native double format -** All of these read/write function return number of frames read/written. -*/ - -sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; -sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; -sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; -sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ; - -sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; -sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ; - - -/* Functions for reading and writing the data chunk in terms of items. -** Otherwise similar to above. -** All of these read/write function return number of items read/written. -*/ - -sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; -sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ; - -sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; -sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ; - -sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; -sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ; - -sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; -sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ; - - -/* Close the SNDFILE and clean up all memory allocations associated with this -** file. -** Returns 0 on success, or an error number. -*/ - -int sf_close (SNDFILE *sndfile) ; - - -/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file -** to force the writing of data to disk. If the file is opened SFM_READ -** no action is taken. -*/ - -void sf_write_sync (SNDFILE *sndfile) ; - - - -/* The function sf_wchar_open() is Windows Only! -** Open a file passing in a Windows Unicode filename. Otherwise, this is -** the same as sf_open(). -** -** In order for this to work, you need to do the following: -** -** #include -** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 -** #including -*/ - -#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES) -SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; -#endif - - - - -/* Getting and setting of chunks from within a sound file. -** -** These functions allow the getting and setting of chunks within a sound file -** (for those formats which allow it). -** -** These functions fail safely. Specifically, they will not allow you to overwrite -** existing chunks or add extra versions of format specific reserved chunks but -** should allow you to retrieve any and all chunks (may not be implemented for -** all chunks or all file formats). -*/ - -struct SF_CHUNK_INFO -{ char id [64] ; /* The chunk identifier. */ - unsigned id_size ; /* The size of the chunk identifier. */ - unsigned datalen ; /* The size of that data. */ - void *data ; /* Pointer to the data. */ -} ; - -typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ; - -/* Set the specified chunk info (must be done before any audio data is written -** to the file). This will fail for format specific reserved chunks. -** The chunk_info->data pointer must be valid until the file is closed. -** Returns SF_ERR_NO_ERROR on success or non-zero on failure. -*/ -int sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; - -/* -** An opaque structure to an iterator over the all chunks of a given id -*/ -typedef struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ; - -/* Get an iterator for all chunks matching chunk_info. -** The iterator will point to the first chunk matching chunk_info. -** Chunks are matching, if (chunk_info->id) matches the first -** (chunk_info->id_size) bytes of a chunk found in the SNDFILE* handle. -** If chunk_info is NULL, an iterator to all chunks in the SNDFILE* handle -** is returned. -** The values of chunk_info->datalen and chunk_info->data are ignored. -** If no matching chunks are found in the sndfile, NULL is returned. -** The returned iterator will stay valid until one of the following occurs: -** a) The sndfile is closed. -** b) A new chunk is added using sf_set_chunk(). -** c) Another chunk iterator function is called on the same SNDFILE* handle -** that causes the iterator to be modified. -** The memory for the iterator belongs to the SNDFILE* handle and is freed when -** sf_close() is called. -*/ -SF_CHUNK_ITERATOR * -sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; - -/* Iterate through chunks by incrementing the iterator. -** Increments the iterator and returns a handle to the new one. -** After this call, iterator will no longer be valid, and you must use the -** newly returned handle from now on. -** The returned handle can be used to access the next chunk matching -** the criteria as defined in sf_get_chunk_iterator(). -** If iterator points to the last chunk, this will free all resources -** associated with iterator and return NULL. -** The returned iterator will stay valid until sf_get_chunk_iterator_next -** is called again, the sndfile is closed or a new chunk us added. -*/ -SF_CHUNK_ITERATOR * -sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ; - - -/* Get the size of the specified chunk. -** If the specified chunk exists, the size will be returned in the -** datalen field of the SF_CHUNK_INFO struct. -** Additionally, the id of the chunk will be copied to the id -** field of the SF_CHUNK_INFO struct and it's id_size field will -** be updated accordingly. -** If the chunk doesn't exist chunk_info->datalen will be zero, and the -** id and id_size fields will be undefined. -** The function will return SF_ERR_NO_ERROR on success or non-zero on -** failure. -*/ -int -sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; - -/* Get the specified chunk data. -** If the specified chunk exists, up to chunk_info->datalen bytes of -** the chunk data will be copied into the chunk_info->data buffer -** (allocated by the caller) and the chunk_info->datalen field -** updated to reflect the size of the data. The id and id_size -** field will be updated according to the retrieved chunk -** If the chunk doesn't exist chunk_info->datalen will be zero, and the -** id and id_size fields will be undefined. -** The function will return SF_ERR_NO_ERROR on success or non-zero on -** failure. -*/ -int -sf_get_chunk_data (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* SNDFILE_H */ - diff --git a/libsndfile.64/include/sndfile.hh b/libsndfile.64/include/sndfile.hh deleted file mode 100644 index 0e1c1c20..00000000 --- a/libsndfile.64/include/sndfile.hh +++ /dev/null @@ -1,446 +0,0 @@ -/* -** Copyright (C) 2005-2012 Erik de Castro Lopo -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the author nor the names of any contributors may be used -** to endorse or promote products derived from this software without -** specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** The above modified BSD style license (GPL and LGPL compatible) applies to -** this file. It does not apply to libsndfile itself which is released under -** the GNU LGPL or the libsndfile test suite which is released under the GNU -** GPL. -** This means that this header file can be used under this modified BSD style -** license, but the LGPL still holds for the libsndfile library itself. -*/ - -/* -** sndfile.hh -- A lightweight C++ wrapper for the libsndfile API. -** -** All the methods are inlines and all functionality is contained in this -** file. There is no separate implementation file. -** -** API documentation is in the doc/ directory of the source code tarball -** and at http://www.mega-nerd.com/libsndfile/api.html. -*/ - -#ifndef SNDFILE_HH -#define SNDFILE_HH - -#include - -#include -#include // for std::nothrow - -class SndfileHandle -{ private : - struct SNDFILE_ref - { SNDFILE_ref (void) ; - ~SNDFILE_ref (void) ; - - SNDFILE *sf ; - SF_INFO sfinfo ; - int ref ; - } ; - - SNDFILE_ref *p ; - - public : - /* Default constructor */ - SndfileHandle (void) : p (NULL) {} ; - SndfileHandle (const char *path, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - SndfileHandle (std::string const & path, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - SndfileHandle (int fd, bool close_desc, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; - -#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES - SndfileHandle (LPCWSTR wpath, int mode = SFM_READ, - int format = 0, int channels = 0, int samplerate = 0) ; -#endif - - ~SndfileHandle (void) ; - - SndfileHandle (const SndfileHandle &orig) ; - SndfileHandle & operator = (const SndfileHandle &rhs) ; - - /* Mainly for debugging/testing. */ - int refCount (void) const { return (p == NULL) ? 0 : p->ref ; } - - operator bool () const { return (p != NULL) ; } - - bool operator == (const SndfileHandle &rhs) const { return (p == rhs.p) ; } - - sf_count_t frames (void) const { return p ? p->sfinfo.frames : 0 ; } - int format (void) const { return p ? p->sfinfo.format : 0 ; } - int channels (void) const { return p ? p->sfinfo.channels : 0 ; } - int samplerate (void) const { return p ? p->sfinfo.samplerate : 0 ; } - - int error (void) const ; - const char * strError (void) const ; - - int command (int cmd, void *data, int datasize) ; - - sf_count_t seek (sf_count_t frames, int whence) ; - - void writeSync (void) ; - - int setString (int str_type, const char* str) ; - - const char* getString (int str_type) const ; - - static int formatCheck (int format, int channels, int samplerate) ; - - sf_count_t read (short *ptr, sf_count_t items) ; - sf_count_t read (int *ptr, sf_count_t items) ; - sf_count_t read (float *ptr, sf_count_t items) ; - sf_count_t read (double *ptr, sf_count_t items) ; - - sf_count_t write (const short *ptr, sf_count_t items) ; - sf_count_t write (const int *ptr, sf_count_t items) ; - sf_count_t write (const float *ptr, sf_count_t items) ; - sf_count_t write (const double *ptr, sf_count_t items) ; - - sf_count_t readf (short *ptr, sf_count_t frames) ; - sf_count_t readf (int *ptr, sf_count_t frames) ; - sf_count_t readf (float *ptr, sf_count_t frames) ; - sf_count_t readf (double *ptr, sf_count_t frames) ; - - sf_count_t writef (const short *ptr, sf_count_t frames) ; - sf_count_t writef (const int *ptr, sf_count_t frames) ; - sf_count_t writef (const float *ptr, sf_count_t frames) ; - sf_count_t writef (const double *ptr, sf_count_t frames) ; - - sf_count_t readRaw (void *ptr, sf_count_t bytes) ; - sf_count_t writeRaw (const void *ptr, sf_count_t bytes) ; - - /**< Raw access to the handle. SndfileHandle keeps ownership. */ - SNDFILE * rawHandle (void) ; - - /**< Take ownership of handle, if reference count is 1. */ - SNDFILE * takeOwnership (void) ; -} ; - -/*============================================================================== -** Nothing but implementation below. -*/ - -inline -SndfileHandle::SNDFILE_ref::SNDFILE_ref (void) -: sf (NULL), sfinfo (), ref (1) -{} - -inline -SndfileHandle::SNDFILE_ref::~SNDFILE_ref (void) -{ if (sf != NULL) sf_close (sf) ; } - -inline -SndfileHandle::SndfileHandle (const char *path, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open (path, mode, &p->sfinfo) ; - } ; - - return ; -} /* SndfileHandle const char * constructor */ - -inline -SndfileHandle::SndfileHandle (std::string const & path, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open (path.c_str (), mode, &p->sfinfo) ; - } ; - - return ; -} /* SndfileHandle std::string constructor */ - -inline -SndfileHandle::SndfileHandle (int fd, bool close_desc, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - if (fd < 0) - return ; - - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open_fd (fd, mode, &p->sfinfo, close_desc) ; - } ; - - return ; -} /* SndfileHandle fd constructor */ - -inline -SndfileHandle::SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_open_virtual (&sfvirtual, mode, &p->sfinfo, user_data) ; - } ; - - return ; -} /* SndfileHandle std::string constructor */ - -inline -SndfileHandle::~SndfileHandle (void) -{ if (p != NULL && --p->ref == 0) - delete p ; -} /* SndfileHandle destructor */ - - -inline -SndfileHandle::SndfileHandle (const SndfileHandle &orig) -: p (orig.p) -{ if (p != NULL) - ++p->ref ; -} /* SndfileHandle copy constructor */ - -inline SndfileHandle & -SndfileHandle::operator = (const SndfileHandle &rhs) -{ - if (&rhs == this) - return *this ; - if (p != NULL && --p->ref == 0) - delete p ; - - p = rhs.p ; - if (p != NULL) - ++p->ref ; - - return *this ; -} /* SndfileHandle assignment operator */ - -inline int -SndfileHandle::error (void) const -{ return sf_error (p->sf) ; } - -inline const char * -SndfileHandle::strError (void) const -{ return sf_strerror (p->sf) ; } - -inline int -SndfileHandle::command (int cmd, void *data, int datasize) -{ return sf_command (p->sf, cmd, data, datasize) ; } - -inline sf_count_t -SndfileHandle::seek (sf_count_t frame_count, int whence) -{ return sf_seek (p->sf, frame_count, whence) ; } - -inline void -SndfileHandle::writeSync (void) -{ sf_write_sync (p->sf) ; } - -inline int -SndfileHandle::setString (int str_type, const char* str) -{ return sf_set_string (p->sf, str_type, str) ; } - -inline const char* -SndfileHandle::getString (int str_type) const -{ return sf_get_string (p->sf, str_type) ; } - -inline int -SndfileHandle::formatCheck (int fmt, int chans, int srate) -{ - SF_INFO sfinfo ; - - sfinfo.frames = 0 ; - sfinfo.channels = chans ; - sfinfo.format = fmt ; - sfinfo.samplerate = srate ; - sfinfo.sections = 0 ; - sfinfo.seekable = 0 ; - - return sf_format_check (&sfinfo) ; -} - -/*---------------------------------------------------------------------*/ - -inline sf_count_t -SndfileHandle::read (short *ptr, sf_count_t items) -{ return sf_read_short (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::read (int *ptr, sf_count_t items) -{ return sf_read_int (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::read (float *ptr, sf_count_t items) -{ return sf_read_float (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::read (double *ptr, sf_count_t items) -{ return sf_read_double (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const short *ptr, sf_count_t items) -{ return sf_write_short (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const int *ptr, sf_count_t items) -{ return sf_write_int (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const float *ptr, sf_count_t items) -{ return sf_write_float (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::write (const double *ptr, sf_count_t items) -{ return sf_write_double (p->sf, ptr, items) ; } - -inline sf_count_t -SndfileHandle::readf (short *ptr, sf_count_t frame_count) -{ return sf_readf_short (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readf (int *ptr, sf_count_t frame_count) -{ return sf_readf_int (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readf (float *ptr, sf_count_t frame_count) -{ return sf_readf_float (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readf (double *ptr, sf_count_t frame_count) -{ return sf_readf_double (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const short *ptr, sf_count_t frame_count) -{ return sf_writef_short (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const int *ptr, sf_count_t frame_count) -{ return sf_writef_int (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const float *ptr, sf_count_t frame_count) -{ return sf_writef_float (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::writef (const double *ptr, sf_count_t frame_count) -{ return sf_writef_double (p->sf, ptr, frame_count) ; } - -inline sf_count_t -SndfileHandle::readRaw (void *ptr, sf_count_t bytes) -{ return sf_read_raw (p->sf, ptr, bytes) ; } - -inline sf_count_t -SndfileHandle::writeRaw (const void *ptr, sf_count_t bytes) -{ return sf_write_raw (p->sf, ptr, bytes) ; } - -inline SNDFILE * -SndfileHandle::rawHandle (void) -{ return (p ? p->sf : NULL) ; } - -inline SNDFILE * -SndfileHandle::takeOwnership (void) -{ - if (p == NULL || (p->ref != 1)) - return NULL ; - - SNDFILE * sf = p->sf ; - p->sf = NULL ; - delete p ; - p = NULL ; - return sf ; -} - -#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES - -inline -SndfileHandle::SndfileHandle (LPCWSTR wpath, int mode, int fmt, int chans, int srate) -: p (NULL) -{ - p = new (std::nothrow) SNDFILE_ref () ; - - if (p != NULL) - { p->ref = 1 ; - - p->sfinfo.frames = 0 ; - p->sfinfo.channels = chans ; - p->sfinfo.format = fmt ; - p->sfinfo.samplerate = srate ; - p->sfinfo.sections = 0 ; - p->sfinfo.seekable = 0 ; - - p->sf = sf_wchar_open (wpath, mode, &p->sfinfo) ; - } ; - - return ; -} /* SndfileHandle const wchar_t * constructor */ - -#endif - -#endif /* SNDFILE_HH */ - diff --git a/mpg123.64/include/fmt123.h b/mpg123.64/include/fmt123.h deleted file mode 100644 index dcabf5e0..00000000 --- a/mpg123.64/include/fmt123.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - libmpg123: MPEG Audio Decoder library - - separate header just for audio format definitions not tied to - library code - - copyright 1995-2020 by the mpg123 project - free software under the terms of the LGPL 2.1 - see COPYING and AUTHORS files in distribution or http://mpg123.org -*/ - -#ifndef MPG123_ENC_H -#define MPG123_ENC_H - -/** \file fmt123.h Audio format definitions. */ - -/** \defgroup mpg123_enc mpg123 PCM sample encodings - * These are definitions for audio formats used by libmpg123 and - * libout123. - * - * @{ - */ - -/** An enum over all sample types possibly known to mpg123. - * The values are designed as bit flags to allow bitmasking for encoding - * families. - * This is also why the enum is not used as type for actual encoding variables, - * plain integers (at least 16 bit, 15 bit being used) cover the possible - * combinations of these flags. - * - * Note that (your build of) libmpg123 does not necessarily support all these. - * Usually, you can expect the 8bit encodings and signed 16 bit. - * Also 32bit float will be usual beginning with mpg123-1.7.0 . - * What you should bear in mind is that (SSE, etc) optimized routines may be - * absent for some formats. We do have SSE for 16, 32 bit and float, though. - * 24 bit integer is done via postprocessing of 32 bit output -- just cutting - * the last byte, no rounding, even. If you want better, do it yourself. - * - * All formats are in native byte order. If you need different endinaness, you - * can simply postprocess the output buffers (libmpg123 wouldn't do anything - * else). The macro MPG123_SAMPLESIZE() can be helpful there. - */ -enum mpg123_enc_enum -{ -/* 0000 0000 0000 1111 Some 8 bit integer encoding. */ - MPG123_ENC_8 = 0x00f -/* 0000 0000 0100 0000 Some 16 bit integer encoding. */ -, MPG123_ENC_16 = 0x040 -/* 0100 0000 0000 0000 Some 24 bit integer encoding. */ -, MPG123_ENC_24 = 0x4000 -/* 0000 0001 0000 0000 Some 32 bit integer encoding. */ -, MPG123_ENC_32 = 0x100 -/* 0000 0000 1000 0000 Some signed integer encoding. */ -, MPG123_ENC_SIGNED = 0x080 -/* 0000 1110 0000 0000 Some float encoding. */ -, MPG123_ENC_FLOAT = 0xe00 -/* 0000 0000 1101 0000 signed 16 bit */ -, MPG123_ENC_SIGNED_16 = (MPG123_ENC_16|MPG123_ENC_SIGNED|0x10) -/* 0000 0000 0110 0000 unsigned 16 bit */ -, MPG123_ENC_UNSIGNED_16 = (MPG123_ENC_16|0x20) -/* 0000 0000 0000 0001 unsigned 8 bit */ -, MPG123_ENC_UNSIGNED_8 = 0x01 -/* 0000 0000 1000 0010 signed 8 bit */ -, MPG123_ENC_SIGNED_8 = (MPG123_ENC_SIGNED|0x02) -/* 0000 0000 0000 0100 ulaw 8 bit */ -, MPG123_ENC_ULAW_8 = 0x04 -/* 0000 0000 0000 1000 alaw 8 bit */ -, MPG123_ENC_ALAW_8 = 0x08 -/* 0001 0001 1000 0000 signed 32 bit */ -, MPG123_ENC_SIGNED_32 = MPG123_ENC_32|MPG123_ENC_SIGNED|0x1000 -/* 0010 0001 0000 0000 unsigned 32 bit */ -, MPG123_ENC_UNSIGNED_32 = MPG123_ENC_32|0x2000 -/* 0101 0000 1000 0000 signed 24 bit */ -, MPG123_ENC_SIGNED_24 = MPG123_ENC_24|MPG123_ENC_SIGNED|0x1000 -/* 0110 0000 0000 0000 unsigned 24 bit */ -, MPG123_ENC_UNSIGNED_24 = MPG123_ENC_24|0x2000 -/* 0000 0010 0000 0000 32bit float */ -, MPG123_ENC_FLOAT_32 = 0x200 -/* 0000 0100 0000 0000 64bit float */ -, MPG123_ENC_FLOAT_64 = 0x400 -/* Any possibly known encoding from the list above. */ -, MPG123_ENC_ANY = ( MPG123_ENC_SIGNED_16 | MPG123_ENC_UNSIGNED_16 - | MPG123_ENC_UNSIGNED_8 | MPG123_ENC_SIGNED_8 - | MPG123_ENC_ULAW_8 | MPG123_ENC_ALAW_8 - | MPG123_ENC_SIGNED_32 | MPG123_ENC_UNSIGNED_32 - | MPG123_ENC_SIGNED_24 | MPG123_ENC_UNSIGNED_24 - | MPG123_ENC_FLOAT_32 | MPG123_ENC_FLOAT_64 ) -}; - -/** Get size of one PCM sample with given encoding. - * This is included both in libmpg123 and libout123. Both offer - * an API function to provide the macro results from library - * compile-time, not that of you application. This most likely - * does not matter as I do not expect any fresh PCM sample - * encoding to appear. But who knows? Perhaps the encoding type - * will be abused for funny things in future, not even plain PCM. - * And, by the way: Thomas really likes the ?: operator. - * \param enc the encoding (mpg123_enc_enum value) - * \return size of one sample in bytes - */ -#define MPG123_SAMPLESIZE(enc) ( \ - (enc) < 1 \ - ? 0 \ - : ( (enc) & MPG123_ENC_8 \ - ? 1 \ - : ( (enc) & MPG123_ENC_16 \ - ? 2 \ - : ( (enc) & MPG123_ENC_24 \ - ? 3 \ - : ( ( (enc) & MPG123_ENC_32 \ - || (enc) == MPG123_ENC_FLOAT_32 ) \ - ? 4 \ - : ( (enc) == MPG123_ENC_FLOAT_64 \ - ? 8 \ - : 0 \ -) ) ) ) ) ) - -/** Representation of zero in differing encodings. - * This exists to define proper silence in various encodings without - * having to link to libsyn123 to do actual conversions at runtime. - * You have to handle big/little endian order yourself, though. - * This takes the shortcut that any signed encoding has a zero with - * all-zero bits. Unsigned linear encodings just have the highest bit set - * (2^(n-1) for n bits), while the nonlinear 8-bit ones are special. - * \param enc the encoding (mpg123_enc_enum value) - * \param siz bytes per sample (return value of MPG123_SAMPLESIZE(enc)) - * \param off byte (octet) offset counted from LSB - * \return unsigned byte value for the designated octet - */ -#define MPG123_ZEROSAMPLE(enc, siz, off) ( \ - (enc) == MPG123_ENC_ULAW_8 \ - ? (off == 0 ? 0xff : 0x00) \ - : ( (enc) == MPG123_ENC_ALAW_8 \ - ? (off == 0 ? 0xd5 : 0x00) \ - : ( (((enc) & (MPG123_ENC_SIGNED|MPG123_ENC_FLOAT)) || (siz) != ((off)+1)) \ - ? 0x00 \ - : 0x80 \ - ) ) ) - -/** Structure defining an audio format. - * Providing the members as individual function arguments to define a certain - * output format is easy enough. This struct makes is more comfortable to deal - * with a list of formats. - * Negative values for the members might be used to communicate use of default - * values. - */ -struct mpg123_fmt -{ - long rate; /**< sampling rate in Hz */ - int channels; /**< channel count */ - /** encoding code, can be single value or bitwise or of members of - * mpg123_enc_enum */ - int encoding; -}; - -/* @} */ - -#endif - diff --git a/mpg123.64/include/mpg123.h b/mpg123.64/include/mpg123.h deleted file mode 100644 index 7b0a8495..00000000 --- a/mpg123.64/include/mpg123.h +++ /dev/null @@ -1,1697 +0,0 @@ -/* - libmpg123: MPEG Audio Decoder library (version 1.26.3) - - copyright 1995-2015 by the mpg123 project - free software under the terms of the LGPL 2.1 - see COPYING and AUTHORS files in distribution or http://mpg123.org -*/ - -#ifndef MPG123_LIB_H -#define MPG123_LIB_H - -#include - -/** \file mpg123.h The header file for the libmpg123 MPEG Audio decoder */ - -/** A macro to check at compile time which set of API functions to expect. - * This should be incremented at least each time a new symbol is added - * to the header. - */ -#define MPG123_API_VERSION 45 - -#ifndef MPG123_EXPORT -/** Defines needed for MS Visual Studio(tm) DLL builds. - * Every public function must be prefixed with MPG123_EXPORT. When building - * the DLL ensure to define BUILD_MPG123_DLL. This makes the function accessible - * for clients and includes it in the import library which is created together - * with the DLL. When consuming the DLL ensure to define LINK_MPG123_DLL which - * imports the functions from the DLL. - */ -#ifdef BUILD_MPG123_DLL -/* The dll exports. */ -#define MPG123_EXPORT __declspec(dllexport) -#else -#ifdef LINK_MPG123_DLL -/* The exe imports. */ -#define MPG123_EXPORT __declspec(dllimport) -#else -/* Nothing on normal/UNIX builds */ -#define MPG123_EXPORT -#endif -#endif -#endif - -/* This is for Visual Studio, so this header works as distributed in the binary downloads */ -#if defined(_MSC_VER) && !defined(MPG123_DEF_SSIZE_T) -#define MPG123_DEF_SSIZE_T -#include -typedef ptrdiff_t ssize_t; -#endif - -#ifndef MPG123_NO_CONFIGURE /* Enable use of this file without configure. */ -#include -#include - -/* Simplified large file handling. - I used to have a check here that prevents building for a library with conflicting large file setup - (application that uses 32 bit offsets with library that uses 64 bits). - While that was perfectly fine in an environment where there is one incarnation of the library, - it hurt GNU/Linux and Solaris systems with multilib where the distribution fails to provide the - correct header matching the 32 bit library (where large files need explicit support) or - the 64 bit library (where there is no distinction). - - New approach: When the app defines _FILE_OFFSET_BITS, it wants non-default large file support, - and thus functions with added suffix (mpg123_open_64). - Any mismatch will be caught at link time because of the _FILE_OFFSET_BITS setting used when - building libmpg123. Plus, there's dual mode large file support in mpg123 since 1.12 now. - Link failure is not the expected outcome of any half-sane usage anymore. - - More complication: What about client code defining _LARGEFILE64_SOURCE? It might want direct access to the _64 functions, along with the ones without suffix. Well, that's possible now via defining MPG123_NO_LARGENAME and MPG123_LARGESUFFIX, respectively, for disabling or enforcing the suffix names. -*/ - -/* - Now, the renaming of large file aware functions. - By default, it appends underscore _FILE_OFFSET_BITS (so, mpg123_seek_64 for mpg123_seek), if _FILE_OFFSET_BITS is defined. You can force a different suffix via MPG123_LARGESUFFIX (that must include the underscore), or you can just disable the whole mess by defining MPG123_NO_LARGENAME. -*/ -#if (!defined MPG123_NO_LARGENAME) && ((defined _FILE_OFFSET_BITS) || (defined MPG123_LARGESUFFIX)) - -/* Need some trickery to concatenate the value(s) of the given macro(s). */ -#define MPG123_MACROCAT_REALLY(a, b) a ## b -#define MPG123_MACROCAT(a, b) MPG123_MACROCAT_REALLY(a, b) -#ifndef MPG123_LARGESUFFIX -#define MPG123_LARGESUFFIX MPG123_MACROCAT(_, _FILE_OFFSET_BITS) -#endif -#define MPG123_LARGENAME(func) MPG123_MACROCAT(func, MPG123_LARGESUFFIX) - -#define mpg123_open_fixed MPG123_LARGENAME(mpg123_open_fixed) -#define mpg123_open MPG123_LARGENAME(mpg123_open) -#define mpg123_open_fd MPG123_LARGENAME(mpg123_open_fd) -#define mpg123_open_handle MPG123_LARGENAME(mpg123_open_handle) -#define mpg123_framebyframe_decode MPG123_LARGENAME(mpg123_framebyframe_decode) -#define mpg123_decode_frame MPG123_LARGENAME(mpg123_decode_frame) -#define mpg123_tell MPG123_LARGENAME(mpg123_tell) -#define mpg123_tellframe MPG123_LARGENAME(mpg123_tellframe) -#define mpg123_tell_stream MPG123_LARGENAME(mpg123_tell_stream) -#define mpg123_seek MPG123_LARGENAME(mpg123_seek) -#define mpg123_feedseek MPG123_LARGENAME(mpg123_feedseek) -#define mpg123_seek_frame MPG123_LARGENAME(mpg123_seek_frame) -#define mpg123_timeframe MPG123_LARGENAME(mpg123_timeframe) -#define mpg123_index MPG123_LARGENAME(mpg123_index) -#define mpg123_set_index MPG123_LARGENAME(mpg123_set_index) -#define mpg123_position MPG123_LARGENAME(mpg123_position) -#define mpg123_length MPG123_LARGENAME(mpg123_length) -#define mpg123_framelength MPG123_LARGENAME(mpg123_framelength) -#define mpg123_set_filesize MPG123_LARGENAME(mpg123_set_filesize) -#define mpg123_replace_reader MPG123_LARGENAME(mpg123_replace_reader) -#define mpg123_replace_reader_handle MPG123_LARGENAME(mpg123_replace_reader_handle) -#define mpg123_framepos MPG123_LARGENAME(mpg123_framepos) - -#endif /* largefile hackery */ - -#endif /* MPG123_NO_CONFIGURE */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup mpg123_init mpg123 library and handle setup - * - * Functions to initialise and shutdown the mpg123 library and handles. - * The parameters of handles have workable defaults, you only have to tune them when you want to tune something;-) - * Tip: Use a RVA setting... - * - * @{ - */ - -/** Opaque structure for the libmpg123 decoder handle. */ -struct mpg123_handle_struct; - -/** Opaque structure for the libmpg123 decoder handle. - * Most functions take a pointer to a mpg123_handle as first argument and operate on its data in an object-oriented manner. - */ -typedef struct mpg123_handle_struct mpg123_handle; - -/** Function to initialise the mpg123 library. - * This should be called once in a non-parallel context. It is not explicitly - * thread-safe, but repeated/concurrent calls still _should_ be safe as static - * tables are filled with the same values anyway. - * - * \return MPG123_OK if successful, otherwise an error number. - */ -MPG123_EXPORT int mpg123_init(void); - -/** Superfluous Function to close down the mpg123 library. - * This was created with the thought that there sometime will be cleanup code - * to be run after library use. This never materialized. You can forget about - * this function and it is only here for old programs that do call it. - */ -MPG123_EXPORT void mpg123_exit(void); - -/** Create a handle with optional choice of decoder (named by a string, see mpg123_decoders() or mpg123_supported_decoders()). - * and optional retrieval of an error code to feed to mpg123_plain_strerror(). - * Optional means: Any of or both the parameters may be NULL. - * - * \param decoder optional choice of decoder variant (NULL for default) - * \param error optional address to store error codes - * \return Non-NULL pointer to fresh handle when successful. - */ -MPG123_EXPORT mpg123_handle *mpg123_new(const char* decoder, int *error); - -/** Delete handle, mh is either a valid mpg123 handle or NULL. - * \param mh handle - */ -MPG123_EXPORT void mpg123_delete(mpg123_handle *mh); - -/** Free plain memory allocated within libmpg123. - * This is for library users that are not sure to use the same underlying - * memory allocator as libmpg123. It is just a wrapper over free() in - * the underlying C library. - */ -MPG123_EXPORT void mpg123_free(void *ptr); - -/** Enumeration of the parameters types that it is possible to set/get. */ -enum mpg123_parms -{ - MPG123_VERBOSE = 0, /**< set verbosity value for enabling messages to stderr, >= 0 makes sense (integer) */ - MPG123_FLAGS, /**< set all flags, p.ex val = MPG123_GAPLESS|MPG123_MONO_MIX (integer) */ - MPG123_ADD_FLAGS, /**< add some flags (integer) */ - MPG123_FORCE_RATE, /**< when value > 0, force output rate to that value (integer) */ - MPG123_DOWN_SAMPLE, /**< 0=native rate, 1=half rate, 2=quarter rate (integer) */ - MPG123_RVA, /**< one of the RVA choices above (integer) */ - MPG123_DOWNSPEED, /**< play a frame N times (integer) */ - MPG123_UPSPEED, /**< play every Nth frame (integer) */ - MPG123_START_FRAME, /**< start with this frame (skip frames before that, integer) */ - MPG123_DECODE_FRAMES, /**< decode only this number of frames (integer) */ - MPG123_ICY_INTERVAL, /**< Stream contains ICY metadata with this interval (integer). - Make sure to set this _before_ opening a stream.*/ - MPG123_OUTSCALE, /**< the scale for output samples (amplitude - integer or float according to mpg123 output format, normally integer) */ - MPG123_TIMEOUT, /**< timeout for reading from a stream (not supported on win32, integer) */ - MPG123_REMOVE_FLAGS, /**< remove some flags (inverse of MPG123_ADD_FLAGS, integer) */ - MPG123_RESYNC_LIMIT, /**< Try resync on frame parsing for that many bytes or until end of stream (<0 ... integer). This can enlarge the limit for skipping junk on beginning, too (but not reduce it). */ - MPG123_INDEX_SIZE /**< Set the frame index size (if supported). Values <0 mean that the index is allowed to grow dynamically in these steps (in positive direction, of course) -- Use this when you really want a full index with every individual frame. */ - ,MPG123_PREFRAMES /**< Decode/ignore that many frames in advance for layer 3. This is needed to fill bit reservoir after seeking, for example (but also at least one frame in advance is needed to have all "normal" data for layer 3). Give a positive integer value, please.*/ - ,MPG123_FEEDPOOL /**< For feeder mode, keep that many buffers in a pool to avoid frequent malloc/free. The pool is allocated on mpg123_open_feed(). If you change this parameter afterwards, you can trigger growth and shrinkage during decoding. The default value could change any time. If you care about this, then set it. (integer) */ - ,MPG123_FEEDBUFFER /**< Minimal size of one internal feeder buffer, again, the default value is subject to change. (integer) */ - ,MPG123_FREEFORMAT_SIZE /**< Tell the parser a free-format frame size to - * avoid read-ahead to get it. A value of -1 (default) means that the parser - * will determine it. The parameter value is applied during decoder setup - * for a freshly opened stream only. - */ -}; - -/** Flag bits for MPG123_FLAGS, use the usual binary or to combine. */ -enum mpg123_param_flags -{ - MPG123_FORCE_MONO = 0x7 /**< 0111 Force some mono mode: This is a test bitmask for seeing if any mono forcing is active. */ - ,MPG123_MONO_LEFT = 0x1 /**< 0001 Force playback of left channel only. */ - ,MPG123_MONO_RIGHT = 0x2 /**< 0010 Force playback of right channel only. */ - ,MPG123_MONO_MIX = 0x4 /**< 0100 Force playback of mixed mono. */ - ,MPG123_FORCE_STEREO = 0x8 /**< 1000 Force stereo output. */ - ,MPG123_FORCE_8BIT = 0x10 /**< 00010000 Force 8bit formats. */ - ,MPG123_QUIET = 0x20 /**< 00100000 Suppress any printouts (overrules verbose). */ - ,MPG123_GAPLESS = 0x40 /**< 01000000 Enable gapless decoding (default on if libmpg123 has support). */ - ,MPG123_NO_RESYNC = 0x80 /**< 10000000 Disable resync stream after error. */ - ,MPG123_SEEKBUFFER = 0x100 /**< 000100000000 Enable small buffer on non-seekable streams to allow some peek-ahead (for better MPEG sync). */ - ,MPG123_FUZZY = 0x200 /**< 001000000000 Enable fuzzy seeks (guessing byte offsets or using approximate seek points from Xing TOC) */ - ,MPG123_FORCE_FLOAT = 0x400 /**< 010000000000 Force floating point output (32 or 64 bits depends on mpg123 internal precision). */ - ,MPG123_PLAIN_ID3TEXT = 0x800 /**< 100000000000 Do not translate ID3 text data to UTF-8. ID3 strings will contain the raw text data, with the first byte containing the ID3 encoding code. */ - ,MPG123_IGNORE_STREAMLENGTH = 0x1000 /**< 1000000000000 Ignore any stream length information contained in the stream, which can be contained in a 'TLEN' frame of an ID3v2 tag or a Xing tag */ - ,MPG123_SKIP_ID3V2 = 0x2000 /**< 10 0000 0000 0000 Do not parse ID3v2 tags, just skip them. */ - ,MPG123_IGNORE_INFOFRAME = 0x4000 /**< 100 0000 0000 0000 Do not parse the LAME/Xing info frame, treat it as normal MPEG data. */ - ,MPG123_AUTO_RESAMPLE = 0x8000 /**< 1000 0000 0000 0000 Allow automatic internal resampling of any kind (default on if supported). Especially when going lowlevel with replacing output buffer, you might want to unset this flag. Setting MPG123_DOWNSAMPLE or MPG123_FORCE_RATE will override this. */ - ,MPG123_PICTURE = 0x10000 /**< 17th bit: Enable storage of pictures from tags (ID3v2 APIC). */ - ,MPG123_NO_PEEK_END = 0x20000 /**< 18th bit: Do not seek to the end of - * the stream in order to probe - * the stream length and search for the id3v1 field. This also means - * the file size is unknown unless set using mpg123_set_filesize() and - * the stream is assumed as non-seekable unless overridden. - */ - ,MPG123_FORCE_SEEKABLE = 0x40000 /**< 19th bit: Force the stream to be seekable. */ - ,MPG123_STORE_RAW_ID3 = 0x80000 /**< store raw ID3 data (even if skipping) */ - ,MPG123_FORCE_ENDIAN = 0x100000 /**< Enforce endianess of output samples. - * This is not reflected in the format codes. If this flag is set along with - * MPG123_BIG_ENDIAN, MPG123_ENC_SIGNED16 means s16be, without - * MPG123_BIG_ENDIAN, it means s16le. Normal operation without - * MPG123_FORCE_ENDIAN produces output in native byte order. - */ - ,MPG123_BIG_ENDIAN = 0x200000 /**< Choose big endian instead of little. */ - ,MPG123_NO_READAHEAD = 0x400000 /**< Disable read-ahead in parser. If - * you know you provide full frames to the feeder API, this enables - * decoder output from the first one on, instead of having to wait for - * the next frame to confirm that the stream is healthy. It also disables - * free format support unless you provide a frame size using - * MPG123_FREEFORMAT_SIZE. - */ - ,MPG123_FLOAT_FALLBACK = 0x800000 /**< Consider floating point output encoding only after - * trying other (possibly downsampled) rates and encodings first. This is to - * support efficient playback where floating point output is only configured for - * an external resampler, bypassing that resampler when the desired rate can - * be produced directly. This is enabled by default to be closer to older versions - * of libmpg123 which did not enable float automatically at all. If disabled, - * float is considered after the 16 bit default and higher-bit integer encodings - * for any rate. */ - ,MPG123_NO_FRANKENSTEIN = 0x1000000 /**< Disable support for Frankenstein streams - * (different MPEG streams stiched together). Do not accept serious change of MPEG - * header inside a single stream. With this flag, the audio output format cannot - * change during decoding unless you open a new stream. This also stops decoding - * after an announced end of stream (Info header contained a number of frames - * and this number has been reached). This makes your MP3 files behave more like - * ordinary media files with defined structure, rather than stream dumps with - * some sugar. */ -}; - -/** choices for MPG123_RVA */ -enum mpg123_param_rva -{ - MPG123_RVA_OFF = 0 /**< RVA disabled (default). */ - ,MPG123_RVA_MIX = 1 /**< Use mix/track/radio gain. */ - ,MPG123_RVA_ALBUM = 2 /**< Use album/audiophile gain */ - ,MPG123_RVA_MAX = MPG123_RVA_ALBUM /**< The maximum RVA code, may increase in future. */ -}; - -/** Set a specific parameter, for a specific mpg123_handle, using a parameter - * type key chosen from the mpg123_parms enumeration, to the specified value. - * \param mh handle - * \param type parameter choice - * \param value integer value - * \param fvalue floating point value - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_param( mpg123_handle *mh -, enum mpg123_parms type, long value, double fvalue ); - -/** Get a specific parameter, for a specific mpg123_handle. - * See the mpg123_parms enumeration for a list of available parameters. - * \param mh handle - * \param type parameter choice - * \param value integer value return address - * \param fvalue floating point value return address - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_getparam( mpg123_handle *mh -, enum mpg123_parms type, long *value, double *fvalue ); - -/** Feature set available for query with mpg123_feature. */ -enum mpg123_feature_set -{ - MPG123_FEATURE_ABI_UTF8OPEN = 0 /**< mpg123 expects path names to be given in UTF-8 encoding instead of plain native. */ - ,MPG123_FEATURE_OUTPUT_8BIT /**< 8bit output */ - ,MPG123_FEATURE_OUTPUT_16BIT /**< 16bit output */ - ,MPG123_FEATURE_OUTPUT_32BIT /**< 32bit output */ - ,MPG123_FEATURE_INDEX /**< support for building a frame index for accurate seeking */ - ,MPG123_FEATURE_PARSE_ID3V2 /**< id3v2 parsing */ - ,MPG123_FEATURE_DECODE_LAYER1 /**< mpeg layer-1 decoder enabled */ - ,MPG123_FEATURE_DECODE_LAYER2 /**< mpeg layer-2 decoder enabled */ - ,MPG123_FEATURE_DECODE_LAYER3 /**< mpeg layer-3 decoder enabled */ - ,MPG123_FEATURE_DECODE_ACCURATE /**< accurate decoder rounding */ - ,MPG123_FEATURE_DECODE_DOWNSAMPLE /**< downsample (sample omit) */ - ,MPG123_FEATURE_DECODE_NTOM /**< flexible rate decoding */ - ,MPG123_FEATURE_PARSE_ICY /**< ICY support */ - ,MPG123_FEATURE_TIMEOUT_READ /**< Reader with timeout (network). */ - ,MPG123_FEATURE_EQUALIZER /**< tunable equalizer */ - ,MPG123_FEATURE_MOREINFO /**< more info extraction (for frame analyzer) */ - ,MPG123_FEATURE_OUTPUT_FLOAT32 /**< 32 bit float output */ - ,MPG123_FEATURE_OUTPUT_FLOAT64 /**< 64 bit float output (usually never) */ -}; - -/** Query libmpg123 features. - * \param key feature selection - * \return 1 for success, 0 for unimplemented functions - */ -MPG123_EXPORT int mpg123_feature(const enum mpg123_feature_set key); - -/** Query libmpg123 features with better ABI compatibility - * - * This is the same as mpg123_feature(), but this time not using - * the enum as argument. Compilers don't have to agree on the size of - * enums and hence they are not safe in public API. - * - * \param key feature selection - * \return 1 for success, 0 for unimplemented functions - */ -MPG123_EXPORT int mpg123_feature2(int key); - -/* @} */ - - -/** \defgroup mpg123_error mpg123 error handling - * - * Functions to get text version of the error numbers and an enumeration - * of the error codes returned by libmpg123. - * - * Most functions operating on a mpg123_handle simply return MPG123_OK (0) - * on success and MPG123_ERR (-1) on failure, setting the internal error - * variable of the handle to the specific error code. If there was not a valid - * (non-NULL) handle provided to a function operating on one, MPG123_BAD_HANDLE - * may be returned if this can not be confused with a valid positive return - * value. - * Meaning: A function expected to return positive integers on success will - * always indicate error or a special condition by returning a negative one. - * - * Decoding/seek functions may also return message codes MPG123_DONE, - * MPG123_NEW_FORMAT and MPG123_NEED_MORE (all negative, see below on how to - * react). Note that calls to those can be nested, so generally watch out - * for these codes after initial handle setup. - * Especially any function that needs information about the current stream - * to work will try to at least parse the beginning if that did not happen - * yet. - * - * On a function that is supposed to return MPG123_OK on success and - * MPG123_ERR on failure, make sure you check for != MPG123_OK, not - * == MPG123_ERR, as the error code could get more specific in future, - * or there is just a special message from a decoding routine as indicated - * above. - * - * @{ - */ - -/** Enumeration of the message and error codes and returned by libmpg123 functions. */ -enum mpg123_errors -{ - MPG123_DONE=-12, /**< Message: Track ended. Stop decoding. */ - MPG123_NEW_FORMAT=-11, /**< Message: Output format will be different on next call. Note that some libmpg123 versions between 1.4.3 and 1.8.0 insist on you calling mpg123_getformat() after getting this message code. Newer verisons behave like advertised: You have the chance to call mpg123_getformat(), but you can also just continue decoding and get your data. */ - MPG123_NEED_MORE=-10, /**< Message: For feed reader: "Feed me more!" (call mpg123_feed() or mpg123_decode() with some new input data). */ - MPG123_ERR=-1, /**< Generic Error */ - MPG123_OK=0, /**< Success */ - MPG123_BAD_OUTFORMAT, /**< Unable to set up output format! */ - MPG123_BAD_CHANNEL, /**< Invalid channel number specified. */ - MPG123_BAD_RATE, /**< Invalid sample rate specified. */ - MPG123_ERR_16TO8TABLE, /**< Unable to allocate memory for 16 to 8 converter table! */ - MPG123_BAD_PARAM, /**< Bad parameter id! */ - MPG123_BAD_BUFFER, /**< Bad buffer given -- invalid pointer or too small size. */ - MPG123_OUT_OF_MEM, /**< Out of memory -- some malloc() failed. */ - MPG123_NOT_INITIALIZED, /**< You didn't initialize the library! */ - MPG123_BAD_DECODER, /**< Invalid decoder choice. */ - MPG123_BAD_HANDLE, /**< Invalid mpg123 handle. */ - MPG123_NO_BUFFERS, /**< Unable to initialize frame buffers (out of memory?). */ - MPG123_BAD_RVA, /**< Invalid RVA mode. */ - MPG123_NO_GAPLESS, /**< This build doesn't support gapless decoding. */ - MPG123_NO_SPACE, /**< Not enough buffer space. */ - MPG123_BAD_TYPES, /**< Incompatible numeric data types. */ - MPG123_BAD_BAND, /**< Bad equalizer band. */ - MPG123_ERR_NULL, /**< Null pointer given where valid storage address needed. */ - MPG123_ERR_READER, /**< Error reading the stream. */ - MPG123_NO_SEEK_FROM_END,/**< Cannot seek from end (end is not known). */ - MPG123_BAD_WHENCE, /**< Invalid 'whence' for seek function.*/ - MPG123_NO_TIMEOUT, /**< Build does not support stream timeouts. */ - MPG123_BAD_FILE, /**< File access error. */ - MPG123_NO_SEEK, /**< Seek not supported by stream. */ - MPG123_NO_READER, /**< No stream opened. */ - MPG123_BAD_PARS, /**< Bad parameter handle. */ - MPG123_BAD_INDEX_PAR, /**< Bad parameters to mpg123_index() and mpg123_set_index() */ - MPG123_OUT_OF_SYNC, /**< Lost track in bytestream and did not try to resync. */ - MPG123_RESYNC_FAIL, /**< Resync failed to find valid MPEG data. */ - MPG123_NO_8BIT, /**< No 8bit encoding possible. */ - MPG123_BAD_ALIGN, /**< Stack aligmnent error */ - MPG123_NULL_BUFFER, /**< NULL input buffer with non-zero size... */ - MPG123_NO_RELSEEK, /**< Relative seek not possible (screwed up file offset) */ - MPG123_NULL_POINTER, /**< You gave a null pointer somewhere where you shouldn't have. */ - MPG123_BAD_KEY, /**< Bad key value given. */ - MPG123_NO_INDEX, /**< No frame index in this build. */ - MPG123_INDEX_FAIL, /**< Something with frame index went wrong. */ - MPG123_BAD_DECODER_SETUP, /**< Something prevents a proper decoder setup */ - MPG123_MISSING_FEATURE /**< This feature has not been built into libmpg123. */ - ,MPG123_BAD_VALUE /**< A bad value has been given, somewhere. */ - ,MPG123_LSEEK_FAILED /**< Low-level seek failed. */ - ,MPG123_BAD_CUSTOM_IO /**< Custom I/O not prepared. */ - ,MPG123_LFS_OVERFLOW /**< Offset value overflow during translation of large file API calls -- your client program cannot handle that large file. */ - ,MPG123_INT_OVERFLOW /**< Some integer overflow. */ -}; - -/** Look up error strings given integer code. - * \param errcode integer error code - * \return string describing what that error error code means - */ -MPG123_EXPORT const char* mpg123_plain_strerror(int errcode); - -/** Give string describing what error has occured in the context of handle mh. - * When a function operating on an mpg123 handle returns MPG123_ERR, you should check for the actual reason via - * char *errmsg = mpg123_strerror(mh) - * This function will catch mh == NULL and return the message for MPG123_BAD_HANDLE. - * \param mh handle - * \return error message - */ -MPG123_EXPORT const char* mpg123_strerror(mpg123_handle *mh); - -/** Return the plain errcode intead of a string. - * \param mh handle - * \return error code recorded in handle or MPG123_BAD_HANDLE - */ -MPG123_EXPORT int mpg123_errcode(mpg123_handle *mh); - -/*@}*/ - - -/** \defgroup mpg123_decoder mpg123 decoder selection - * - * Functions to list and select the available decoders. - * Perhaps the most prominent feature of mpg123: You have several (optimized) decoders to choose from (on x86 and PPC (MacOS) systems, that is). - * - * @{ - */ - -/** Get available decoder list. - * \return NULL-terminated array of generally available decoder names (plain 8bit ASCII) - */ -MPG123_EXPORT const char **mpg123_decoders(void); - -/** Get supported decoder list. - * \return NULL-terminated array of the decoders supported by the CPU (plain 8bit ASCII) - */ -MPG123_EXPORT const char **mpg123_supported_decoders(void); - -/** Set the active decoder. - * \param mh handle - * \param decoder_name name of decoder - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_decoder(mpg123_handle *mh, const char* decoder_name); - -/** Get the currently active decoder name. - * The active decoder engine can vary depening on output constraints, - * mostly non-resampling, integer output is accelerated via 3DNow & Co. but for - * other modes a fallback engine kicks in. - * Note that this can return a decoder that is only active in the hidden and not - * available as decoder choice from the outside. - * \param mh handle - * \return The decoder name or NULL on error. - */ -MPG123_EXPORT const char* mpg123_current_decoder(mpg123_handle *mh); - -/*@}*/ - - -/** \defgroup mpg123_output mpg123 output audio format - * - * Functions to get and select the format of the decoded audio. - * - * Before you dive in, please be warned that you might get confused by this. - * This seems to happen a lot, therefore I am trying to explain in advance. - * If you do feel confused and just want to decode your normal MPEG audio files that - * don't alter properties in the middle, just use mpg123_open_fixed() with a fixed encoding - * and channel count and forget about a matrix of audio formats. If you want to get funky, - * read ahead ... - * - * The mpg123 library decides what output format to use when encountering the first frame in a stream, or actually any frame that is still valid but differs from the frames before in the prompted output format. At such a deciding point, an internal table of allowed encodings, sampling rates and channel setups is consulted. According to this table, an output format is chosen and the decoding engine set up accordingly (including optimized routines for different output formats). This might seem unusual but it just follows from the non-existence of "MPEG audio files" with defined overall properties. There are streams, streams are concatenations of (semi) independent frames. We store streams on disk and call them "MPEG audio files", but that does not change their nature as the decoder is concerned (the LAME/Xing header for gapless decoding makes things interesting again). - * - * To get to the point: What you do with mpg123_format() and friends is to fill the internal table of allowed formats before it is used. That includes removing support for some formats or adding your forced sample rate (see MPG123_FORCE_RATE) that will be used with the crude internal resampler. Also keep in mind that the sample encoding is just a question of choice -- the MPEG frames do only indicate their native sampling rate and channel count. If you want to decode to integer or float samples, 8 or 16 bit ... that is your decision. In a "clean" world, libmpg123 would always decode to 32 bit float and let you handle any sample conversion. But there are optimized routines that work faster by directly decoding to the desired encoding / accuracy. We prefer efficiency over conceptual tidyness. - * - * People often start out thinking that mpg123_format() should change the actual decoding format on the fly. That is wrong. It only has effect on the next natural change of output format, when libmpg123 will consult its format table again. To make life easier, you might want to call mpg123_format_none() before any thing else and then just allow one desired encoding and a limited set of sample rates / channel choices that you actually intend to deal with. You can force libmpg123 to decode everything to 44100 KHz, stereo, 16 bit integer ... it will duplicate mono channels and even do resampling if needed (unless that feature is disabled in the build, same with some encodings). But I have to stress that the resampling of libmpg123 is very crude and doesn't even contain any kind of "proper" interpolation. - * - * In any case, watch out for MPG123_NEW_FORMAT as return message from decoding routines and call mpg123_getformat() to get the currently active output format. - * - * @{ - */ - -/** They can be combined into one number (3) to indicate mono and stereo... */ -enum mpg123_channelcount -{ - MPG123_MONO = 1 /**< mono */ - ,MPG123_STEREO = 2 /**< stereo */ -}; - -/** An array of supported standard sample rates - * These are possible native sample rates of MPEG audio files. - * You can still force mpg123 to resample to a different one, but by - * default you will only get audio in one of these samplings. - * This list is in ascending order. - * \param list Store a pointer to the sample rates array there. - * \param number Store the number of sample rates there. */ -MPG123_EXPORT void mpg123_rates(const long **list, size_t *number); - -/** An array of supported audio encodings. - * An audio encoding is one of the fully qualified members of mpg123_enc_enum (MPG123_ENC_SIGNED_16, not MPG123_SIGNED). - * \param list Store a pointer to the encodings array there. - * \param number Store the number of encodings there. */ -MPG123_EXPORT void mpg123_encodings(const int **list, size_t *number); - -/** Return the size (in bytes) of one mono sample of the named encoding. - * \param encoding The encoding value to analyze. - * \return positive size of encoding in bytes, 0 on invalid encoding. */ -MPG123_EXPORT int mpg123_encsize(int encoding); - -/** Configure a mpg123 handle to accept no output format at all, - * use before specifying supported formats with mpg123_format - * \param mh handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_format_none(mpg123_handle *mh); - -/** Configure mpg123 handle to accept all formats - * (also any custom rate you may set) -- this is default. - * \param mh handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_format_all(mpg123_handle *mh); - -/** Set the audio format support of a mpg123_handle in detail: - * \param mh handle - * \param rate The sample rate value (in Hertz). - * \param channels A combination of MPG123_STEREO and MPG123_MONO. - * \param encodings A combination of accepted encodings for rate and channels, p.ex MPG123_ENC_SIGNED16 | MPG123_ENC_ULAW_8 (or 0 for no support). Please note that some encodings may not be supported in the library build and thus will be ignored here. - * \return MPG123_OK on success, MPG123_ERR if there was an error. */ -MPG123_EXPORT int mpg123_format( mpg123_handle *mh -, long rate, int channels, int encodings ); - -/** Set the audio format support of a mpg123_handle in detail: - * \param mh handle - * \param rate The sample rate value (in Hertz). Special value 0 means - * all rates (the reason for this variant of mpg123_format()). - * \param channels A combination of MPG123_STEREO and MPG123_MONO. - * \param encodings A combination of accepted encodings for rate and channels, - * p.ex MPG123_ENC_SIGNED16 | MPG123_ENC_ULAW_8 (or 0 for no support). - * Please note that some encodings may not be supported in the library build - * and thus will be ignored here. - * \return MPG123_OK on success, MPG123_ERR if there was an error. */ -MPG123_EXPORT int mpg123_format2( mpg123_handle *mh -, long rate, int channels, int encodings ); - -/** Check to see if a specific format at a specific rate is supported - * by mpg123_handle. - * \param mh handle - * \param rate sampling rate - * \param encoding encoding - * \return 0 for no support (that includes invalid parameters), MPG123_STEREO, - * MPG123_MONO or MPG123_STEREO|MPG123_MONO. */ -MPG123_EXPORT int mpg123_format_support( mpg123_handle *mh -, long rate, int encoding ); - -/** Get the current output format written to the addresses given. - * If the stream is freshly loaded, this will try to parse enough - * of it to give you the format to come. This clears the flag that - * would otherwise make the first decoding call return - * MPG123_NEW_FORMAT. - * \param mh handle - * \param rate sampling rate return address - * \param channels channel count return address - * \param encoding encoding return address - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_getformat( mpg123_handle *mh -, long *rate, int *channels, int *encoding ); - -/** Get the current output format written to the addresses given. - * This differs from plain mpg123_getformat() in that you can choose - * _not_ to clear the flag that would trigger the next decoding call - * to return MPG123_NEW_FORMAT in case of a new format arriving. - * \param mh handle - * \param rate sampling rate return address - * \param channels channel count return address - * \param encoding encoding return address - * \param clear_flag if true, clear internal format flag - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_getformat2( mpg123_handle *mh -, long *rate, int *channels, int *encoding, int clear_flag ); - -/*@}*/ - - -/** \defgroup mpg123_input mpg123 file input and decoding - * - * Functions for input bitstream and decoding operations. - * Decoding/seek functions may also return message codes MPG123_DONE, MPG123_NEW_FORMAT and MPG123_NEED_MORE (please read up on these on how to react!). - * @{ - */ - -/** Open a simple MPEG file with fixed properties. - * - * This function shall simplify the common use case of a plain MPEG - * file on disk that you want to decode, with one fixed sample - * rate and channel count, and usually a length defined by a Lame/Info/Xing - * tag. It will: - * - * - set the MPG123_NO_FRANKENSTEIN flag - * - set up format support according to given parameters, - * - open the file, - * - query audio format, - * - fix the audio format support table to ensure the format stays the same, - * - call mpg123_scan() if there is no header frame to tell the track length. - * - * From that on, you can call mpg123_getformat() for querying the sample - * rate (and channel count in case you allowed both) and mpg123_length() - * to get a pretty safe number for the duration. - * Only the sample rate is left open as that indeed is a fixed property of - * MPEG files. You could set MPG123_FORCE_RATE beforehand, but that may trigger - * low-quality resampling in the decoder, only do so if in dire need. - * The library will convert mono files to stereo for you, and vice versa. - * If any constraint cannot be satisified (most likely because of a non-default - * build of libmpg123), you get MPG123_ERR returned and can query the detailed - * cause from the handle. Only on MPG123_OK there will an open file that you - * then close using mpg123_close(), or implicitly on mpg123_delete() or the next - * call to open another file. - * - * So, for your usual CD rip collection, you could use - * - * mpg123_open_fixed(mh, path, MPG123_STEREO, MPG123_ENC_SIGNED_16) - * - * and be happy calling mpg123_getformat() to verify 44100 Hz rate, then just - * playing away with mpg123_read(). The occasional mono file, or MP2 file, - * will also be decoded without you really noticing. Just the speed could be - * wrong if you do not care about sample rate at all. - * \param mh handle - * \param path filesystem path - * \param channels allowed channel count, either 1 (MPG123_MONO) or - * 2 (MPG123_STEREO), or bitwise or of them, but then you're halfway back to - * calling mpg123_format() again;-) - * \param encoding a definite encoding from enum mpg123_enc_enum - * or a bitmask like for mpg123_format(), defeating the purpose somewhat - */ -MPG123_EXPORT int mpg123_open_fixed(mpg123_handle *mh, const char *path -, int channels, int encoding); - -/** Open and prepare to decode the specified file by filesystem path. - * This does not open HTTP urls; libmpg123 contains no networking code. - * If you want to decode internet streams, use mpg123_open_fd() or mpg123_open_feed(). - * \param mh handle - * \param path filesystem path - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_open(mpg123_handle *mh, const char *path); - -/** Use an already opened file descriptor as the bitstream input - * mpg123_close() will _not_ close the file descriptor. - * \param mh handle - * \param fd file descriptor - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_open_fd(mpg123_handle *mh, int fd); - -/** Use an opaque handle as bitstream input. This works only with the - * replaced I/O from mpg123_replace_reader_handle()! - * mpg123_close() will call the cleanup callback for your handle (if you gave one). - * \param mh handle - * \param iohandle your handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_open_handle(mpg123_handle *mh, void *iohandle); - -/** Open a new bitstream and prepare for direct feeding - * This works together with mpg123_decode(); you are responsible for reading and feeding the input bitstream. - * Also, you are expected to handle ICY metadata extraction yourself. This - * input method does not handle MPG123_ICY_INTERVAL. It does parse ID3 frames, though. - * \param mh handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_open_feed(mpg123_handle *mh); - -/** Closes the source, if libmpg123 opened it. - * \param mh handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_close(mpg123_handle *mh); - -/** Read from stream and decode up to outmemsize bytes. - * - * Note: The type of outmemory changed to a void pointer in mpg123 1.26.0 - * (API version 45). - * - * \param mh handle - * \param outmemory address of output buffer to write to - * \param outmemsize maximum number of bytes to write - * \param done address to store the number of actually decoded bytes to - * \return MPG123_OK or error/message code - */ -MPG123_EXPORT int mpg123_read(mpg123_handle *mh -, void *outmemory, size_t outmemsize, size_t *done ); - -/** Feed data for a stream that has been opened with mpg123_open_feed(). - * It's give and take: You provide the bytestream, mpg123 gives you the decoded samples. - * \param mh handle - * \param in input buffer - * \param size number of input bytes - * \return MPG123_OK or error/message code. - */ -MPG123_EXPORT int mpg123_feed( mpg123_handle *mh -, const unsigned char *in, size_t size ); - -/** Decode MPEG Audio from inmemory to outmemory. - * This is very close to a drop-in replacement for old mpglib. - * When you give zero-sized output buffer the input will be parsed until - * decoded data is available. This enables you to get MPG123_NEW_FORMAT (and query it) - * without taking decoded data. - * Think of this function being the union of mpg123_read() and mpg123_feed() (which it actually is, sort of;-). - * You can actually always decide if you want those specialized functions in separate steps or one call this one here. - * - * Note: The type of outmemory changed to a void pointer in mpg123 1.26.0 - * (API version 45). - * - * \param mh handle - * \param inmemory input buffer - * \param inmemsize number of input bytes - * \param outmemory output buffer - * \param outmemsize maximum number of output bytes - * \param done address to store the number of actually decoded bytes to - * \return error/message code (watch out especially for MPG123_NEED_MORE) - */ -MPG123_EXPORT int mpg123_decode( mpg123_handle *mh -, const unsigned char *inmemory, size_t inmemsize -, void *outmemory, size_t outmemsize, size_t *done ); - -/** Decode next MPEG frame to internal buffer - * or read a frame and return after setting a new format. - * \param mh handle - * \param num current frame offset gets stored there - * \param audio This pointer is set to the internal buffer to read the decoded audio from. - * \param bytes number of output bytes ready in the buffer - * \return MPG123_OK or error/message code - */ -MPG123_EXPORT int mpg123_decode_frame( mpg123_handle *mh -, off_t *num, unsigned char **audio, size_t *bytes ); - -/** Decode current MPEG frame to internal buffer. - * Warning: This is experimental API that might change in future releases! - * Please watch mpg123 development closely when using it. - * \param mh handle - * \param num last frame offset gets stored there - * \param audio this pointer is set to the internal buffer to read the decoded audio from. - * \param bytes number of output bytes ready in the buffer - * \return MPG123_OK or error/message code - */ -MPG123_EXPORT int mpg123_framebyframe_decode( mpg123_handle *mh -, off_t *num, unsigned char **audio, size_t *bytes ); - -/** Find, read and parse the next mp3 frame - * Warning: This is experimental API that might change in future releases! - * Please watch mpg123 development closely when using it. - * \param mh handle - * \return MPG123_OK or error/message code - */ -MPG123_EXPORT int mpg123_framebyframe_next(mpg123_handle *mh); - -/** Get access to the raw input data for the last parsed frame. - * This gives you a direct look (and write access) to the frame body data. - * Together with the raw header, you can reconstruct the whole raw MPEG stream without junk and meta data, or play games by actually modifying the frame body data before decoding this frame (mpg123_framebyframe_decode()). - * A more sane use would be to use this for CRC checking (see mpg123_info() and MPG123_CRC), the first two bytes of the body make up the CRC16 checksum, if present. - * You can provide NULL for a parameter pointer when you are not interested in the value. - * - * \param mh handle - * \param header the 4-byte MPEG header - * \param bodydata pointer to the frame body stored in the handle (without the header) - * \param bodybytes size of frame body in bytes (without the header) - * \return MPG123_OK if there was a yet un-decoded frame to get the - * data from, MPG123_BAD_HANDLE or MPG123_ERR otherwise (without further - * explanation, the error state of the mpg123_handle is not modified by - * this function). - */ -MPG123_EXPORT int mpg123_framedata( mpg123_handle *mh -, unsigned long *header, unsigned char **bodydata, size_t *bodybytes ); - -/** Get the input position (byte offset in stream) of the last parsed frame. - * This can be used for external seek index building, for example. - * It just returns the internally stored offset, regardless of validity -- - * you ensure that a valid frame has been parsed before! - * \param mh handle - * \return byte offset in stream - */ -MPG123_EXPORT off_t mpg123_framepos(mpg123_handle *mh); - -/*@}*/ - - -/** \defgroup mpg123_seek mpg123 position and seeking - * - * Functions querying and manipulating position in the decoded audio bitstream. - * The position is measured in decoded audio samples, or MPEG frame offset for the specific functions. - * If gapless code is in effect, the positions are adjusted to compensate the skipped padding/delay - meaning, you should not care about that at all and just use the position defined for the samples you get out of the decoder;-) - * The general usage is modelled after stdlib's ftell() and fseek(). - * Especially, the whence parameter for the seek functions has the same meaning as the one for fseek() and needs the same constants from stdlib.h: - * - SEEK_SET: set position to (or near to) specified offset - * - SEEK_CUR: change position by offset from now - * - SEEK_END: set position to offset from end - * - * Note that sample-accurate seek only works when gapless support has been enabled at compile time; seek is frame-accurate otherwise. - * Also, really sample-accurate seeking (meaning that you get the identical sample value after seeking compared to plain decoding up to the position) is only guaranteed when you do not mess with the position code by using MPG123_UPSPEED, MPG123_DOWNSPEED or MPG123_START_FRAME. The first two mainly should cause trouble with NtoM resampling, but in any case with these options in effect, you have to keep in mind that the sample offset is not the same as counting the samples you get from decoding since mpg123 counts the skipped samples, too (or the samples played twice only once)! - * Short: When you care about the sample position, don't mess with those parameters;-) - * Also, seeking is not guaranteed to work for all streams (underlying stream may not support it). - * And yet another caveat: If the stream is concatenated out of differing pieces (Frankenstein stream), seeking may suffer, too. - * - * @{ - */ - -/** Returns the current position in samples. - * On the next successful read, you'd get that sample. - * \param mh handle - * \return sample offset or MPG123_ERR (null handle) - */ -MPG123_EXPORT off_t mpg123_tell(mpg123_handle *mh); - -/** Returns the frame number that the next read will give you data from. - * \param mh handle - * \return frame offset or MPG123_ERR (null handle) - */ -MPG123_EXPORT off_t mpg123_tellframe(mpg123_handle *mh); - -/** Returns the current byte offset in the input stream. - * \param mh handle - * \return byte offset or MPG123_ERR (null handle) - */ -MPG123_EXPORT off_t mpg123_tell_stream(mpg123_handle *mh); - -/** Seek to a desired sample offset. - * Usage is modelled afer the standard lseek(). - * \param mh handle - * \param sampleoff offset in PCM samples - * \param whence one of SEEK_SET, SEEK_CUR or SEEK_END - * \return The resulting offset >= 0 or error/message code - */ -MPG123_EXPORT off_t mpg123_seek( mpg123_handle *mh -, off_t sampleoff, int whence ); - -/** Seek to a desired sample offset in data feeding mode. - * This just prepares things to be right only if you ensure that the next chunk of input data will be from input_offset byte position. - * \param mh handle - * \param sampleoff offset in PCM samples - * \param whence one of SEEK_SET, SEEK_CUR or SEEK_END - * \param input_offset The position it expects to be at the - * next time data is fed to mpg123_decode(). - * \return The resulting offset >= 0 or error/message code */ -MPG123_EXPORT off_t mpg123_feedseek( mpg123_handle *mh -, off_t sampleoff, int whence, off_t *input_offset ); - -/** Seek to a desired MPEG frame offset. - * Usage is modelled afer the standard lseek(). - * \param mh handle - * \param frameoff offset in MPEG frames - * \param whence one of SEEK_SET, SEEK_CUR or SEEK_END - * \return The resulting offset >= 0 or error/message code */ -MPG123_EXPORT off_t mpg123_seek_frame( mpg123_handle *mh -, off_t frameoff, int whence ); - -/** Return a MPEG frame offset corresponding to an offset in seconds. - * This assumes that the samples per frame do not change in the file/stream, which is a good assumption for any sane file/stream only. - * \return frame offset >= 0 or error/message code */ -MPG123_EXPORT off_t mpg123_timeframe(mpg123_handle *mh, double sec); - -/** Give access to the frame index table that is managed for seeking. - * You are asked not to modify the values... Use mpg123_set_index to set the - * seek index - * \param mh handle - * \param offsets pointer to the index array - * \param step one index byte offset advances this many MPEG frames - * \param fill number of recorded index offsets; size of the array - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_index( mpg123_handle *mh -, off_t **offsets, off_t *step, size_t *fill ); - -/** Set the frame index table - * Setting offsets to NULL and fill > 0 will allocate fill entries. Setting offsets - * to NULL and fill to 0 will clear the index and free the allocated memory used by the index. - * \param mh handle - * \param offsets pointer to the index array - * \param step one index byte offset advances this many MPEG frames - * \param fill number of recorded index offsets; size of the array - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_set_index( mpg123_handle *mh -, off_t *offsets, off_t step, size_t fill ); - -/** An old crutch to keep old mpg123 binaries happy. - * WARNING: This function is there only to avoid runtime linking errors with - * standalone mpg123 before version 1.23.0 (if you strangely update the - * library but not the end-user program) and actually is broken - * for various cases (p.ex. 24 bit output). Do never use. It might eventually - * be purged from the library. - */ -MPG123_EXPORT int mpg123_position( mpg123_handle *mh, off_t frame_offset, off_t buffered_bytes, off_t *current_frame, off_t *frames_left, double *current_seconds, double *seconds_left); - -/*@}*/ - - -/** \defgroup mpg123_voleq mpg123 volume and equalizer - * - * @{ - */ - -/** another channel enumeration, for left/right choice */ -enum mpg123_channels -{ - MPG123_LEFT=0x1 /**< The Left Channel. */ - ,MPG123_RIGHT=0x2 /**< The Right Channel. */ - ,MPG123_LR=0x3 /**< Both left and right channel; same as MPG123_LEFT|MPG123_RIGHT */ -}; - -/** Set the 32 Band Audio Equalizer settings. - * \param mh handle - * \param channel Can be MPG123_LEFT, MPG123_RIGHT or MPG123_LEFT|MPG123_RIGHT for both. - * \param band The equaliser band to change (from 0 to 31) - * \param val The (linear) adjustment factor. - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_eq( mpg123_handle *mh -, enum mpg123_channels channel, int band, double val ); - -/** Get the 32 Band Audio Equalizer settings. - * \param mh handle - * \param channel Can be MPG123_LEFT, MPG123_RIGHT or MPG123_LEFT|MPG123_RIGHT for (arithmetic mean of) both. - * \param band The equaliser band to change (from 0 to 31) - * \return The (linear) adjustment factor (zero for pad parameters) */ -MPG123_EXPORT double mpg123_geteq(mpg123_handle *mh - , enum mpg123_channels channel, int band); - -/** Reset the 32 Band Audio Equalizer settings to flat - * \param mh handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_reset_eq(mpg123_handle *mh); - -/** Set the absolute output volume including the RVA setting, - * vol<0 just applies (a possibly changed) RVA setting. - * \param mh handle - * \param vol volume value (linear factor) - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_volume(mpg123_handle *mh, double vol); - -/** Adjust output volume including the RVA setting by chosen amount - * \param mh handle - * \param change volume value (linear factor increment) - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_volume_change(mpg123_handle *mh, double change); - -/** Return current volume setting, the actual value due to RVA, and the RVA - * adjustment itself. It's all as double float value to abstract the sample - * format. The volume values are linear factors / amplitudes (not percent) - * and the RVA value is in decibels. - * \param mh handle - * \param base return address for base volume (linear factor) - * \param really return address for actual volume (linear factor) - * \param rva_db return address for RVA value (decibels) - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_getvolume(mpg123_handle *mh, double *base, double *really, double *rva_db); - -/* TODO: Set some preamp in addition / to replace internal RVA handling? */ - -/*@}*/ - - -/** \defgroup mpg123_status mpg123 status and information - * - * @{ - */ - -/** Enumeration of the mode types of Variable Bitrate */ -enum mpg123_vbr { - MPG123_CBR=0, /**< Constant Bitrate Mode (default) */ - MPG123_VBR, /**< Variable Bitrate Mode */ - MPG123_ABR /**< Average Bitrate Mode */ -}; - -/** Enumeration of the MPEG Versions */ -enum mpg123_version { - MPG123_1_0=0, /**< MPEG Version 1.0 */ - MPG123_2_0, /**< MPEG Version 2.0 */ - MPG123_2_5 /**< MPEG Version 2.5 */ -}; - - -/** Enumeration of the MPEG Audio mode. - * Only the mono mode has 1 channel, the others have 2 channels. */ -enum mpg123_mode { - MPG123_M_STEREO=0, /**< Standard Stereo. */ - MPG123_M_JOINT, /**< Joint Stereo. */ - MPG123_M_DUAL, /**< Dual Channel. */ - MPG123_M_MONO /**< Single Channel. */ -}; - - -/** Enumeration of the MPEG Audio flag bits */ -enum mpg123_flags { - MPG123_CRC=0x1, /**< The bitstream is error protected using 16-bit CRC. */ - MPG123_COPYRIGHT=0x2, /**< The bitstream is copyrighted. */ - MPG123_PRIVATE=0x4, /**< The private bit has been set. */ - MPG123_ORIGINAL=0x8 /**< The bitstream is an original, not a copy. */ -}; - -/** Data structure for storing information about a frame of MPEG Audio */ -struct mpg123_frameinfo -{ - enum mpg123_version version; /**< The MPEG version (1.0/2.0/2.5). */ - int layer; /**< The MPEG Audio Layer (MP1/MP2/MP3). */ - long rate; /**< The sampling rate in Hz. */ - enum mpg123_mode mode; /**< The audio mode (Mono, Stereo, Joint-stero, Dual Channel). */ - int mode_ext; /**< The mode extension bit flag. */ - int framesize; /**< The size of the frame (in bytes, including header). */ - enum mpg123_flags flags; /**< MPEG Audio flag bits. Just now I realize that it should be declared as int, not enum. It's a bitwise combination of the enum values. */ - int emphasis; /**< The emphasis type. */ - int bitrate; /**< Bitrate of the frame (kbps). */ - int abr_rate; /**< The target average bitrate. */ - enum mpg123_vbr vbr; /**< The VBR mode. */ -}; - -/** Data structure for even more detailed information out of the decoder, - * for MPEG layer III only. - * This was added to support the frame analyzer by the Lame project and - * just follows what was used there before. You know what the fields mean - * if you want use this structure. */ -struct mpg123_moreinfo -{ - double xr[2][2][576]; - double sfb[2][2][22]; /* [2][2][SBMAX_l] */ - double sfb_s[2][2][3*13]; /* [2][2][3*SBMAX_s] */ - int qss[2][2]; - int big_values[2][2]; - int sub_gain[2][2][3]; - int scalefac_scale[2][2]; - int preflag[2][2]; - int blocktype[2][2]; - int mixed[2][2]; - int mainbits[2][2]; - int sfbits[2][2]; - int scfsi[2]; - int maindata; - int padding; -}; - -/** Get frame information about the MPEG audio bitstream and store it in a mpg123_frameinfo structure. - * \param mh handle - * \param mi address of existing frameinfo structure to write to - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_info(mpg123_handle *mh, struct mpg123_frameinfo *mi); - -/** Trigger collection of additional decoder information while decoding. - * \param mh handle - * \param mi pointer to data storage (NULL to disable collection) - * \return MPG123_OK if the collection was enabled/disabled as desired, MPG123_ERR - * otherwise (e.g. if the feature is disabled) - */ -MPG123_EXPORT int mpg123_set_moreinfo( mpg123_handle *mh -, struct mpg123_moreinfo *mi ); - -/** Get the safe output buffer size for all cases - * (when you want to replace the internal buffer) - * \return safe buffer size - */ -MPG123_EXPORT size_t mpg123_safe_buffer(void); - -/** Make a full parsing scan of each frame in the file. ID3 tags are found. An - * accurate length value is stored. Seek index will be filled. A seek back to - * current position is performed. At all, this function refuses work when - * stream is not seekable. - * \param mh handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_scan(mpg123_handle *mh); - -/** Return, if possible, the full (expected) length of current track in - * MPEG frames. - * \param mh handle - * \return length >= 0 or MPG123_ERR if there is no length guess possible. - */ -MPG123_EXPORT off_t mpg123_framelength(mpg123_handle *mh); - -/** Return, if possible, the full (expected) length of current - * track in samples (PCM frames). - * - * This relies either on an Info frame at the beginning or a previous - * call to mpg123_scan() to get the real number of MPEG frames in a - * file. It will guess based on file size if neither Info frame nor - * scan data are present. In any case, there is no guarantee that the - * decoder will not give you more data, for example in case the open - * file gets appended to during decoding. - * \param mh handle - * \return length >= 0 or MPG123_ERR if there is no length guess possible. - */ -MPG123_EXPORT off_t mpg123_length(mpg123_handle *mh); - -/** Override the value for file size in bytes. - * Useful for getting sensible track length values in feed mode or for HTTP streams. - * \param mh handle - * \param size file size in bytes - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_set_filesize(mpg123_handle *mh, off_t size); - -/** Get MPEG frame duration in seconds. - * \param mh handle - * \return frame duration in seconds, <0 on error - */ -MPG123_EXPORT double mpg123_tpf(mpg123_handle *mh); - -/** Get MPEG frame duration in samples. - * \param mh handle - * \return samples per frame for the most recently parsed frame; <0 on errors - */ -MPG123_EXPORT int mpg123_spf(mpg123_handle *mh); - -/** Get and reset the clip count. - * \param mh handle - * \return count of clipped samples - */ -MPG123_EXPORT long mpg123_clip(mpg123_handle *mh); - - -/** The key values for state information from mpg123_getstate(). */ -enum mpg123_state -{ - MPG123_ACCURATE = 1 /**< Query if positons are currently accurate (integer value, 0 if false, 1 if true). */ - ,MPG123_BUFFERFILL /**< Get fill of internal (feed) input buffer as integer byte count returned as long and as double. An error is returned on integer overflow while converting to (signed) long, but the returned floating point value shold still be fine. */ - ,MPG123_FRANKENSTEIN /**< Stream consists of carelessly stitched together files. Seeking may yield unexpected results (also with MPG123_ACCURATE, it may be confused). */ - ,MPG123_FRESH_DECODER /**< Decoder structure has been updated, possibly indicating changed stream (integer value, 0 if false, 1 if true). Flag is cleared after retrieval. */ - ,MPG123_ENC_DELAY /** Encoder delay read from Info tag (layer III, -1 if unknown). */ - ,MPG123_ENC_PADDING /** Encoder padding read from Info tag (layer III, -1 if unknown). */ - ,MPG123_DEC_DELAY /** Decoder delay (for layer III only, -1 otherwise). */ -}; - -/** Get various current decoder/stream state information. - * \param mh handle - * \param key the key to identify the information to give. - * \param val the address to return (long) integer values to - * \param fval the address to return floating point values to - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_getstate( mpg123_handle *mh -, enum mpg123_state key, long *val, double *fval ); - -/*@}*/ - - -/** \defgroup mpg123_metadata mpg123 metadata handling - * - * Functions to retrieve the metadata from MPEG Audio files and streams. - * Also includes string handling functions. - * - * @{ - */ - -/** Data structure for storing strings in a safer way than a standard C-String. - * Can also hold a number of null-terminated strings. */ -typedef struct -{ - char* p; /**< pointer to the string data */ - size_t size; /**< raw number of bytes allocated */ - size_t fill; /**< number of used bytes (including closing zero byte) */ -} mpg123_string; - -/** Allocate and intialize a new string. - * \param val optional initial string value (can be NULL) - */ -MPG123_EXPORT mpg123_string* mpg123_new_string(const char* val); - -/** Free memory of contents and the string structure itself. - * \param sb string handle - */ -MPG123_EXPORT void mpg123_delete_string(mpg123_string* sb); - -/** Initialize an existing mpg123_string structure to {NULL, 0, 0}. - * If you hand in a NULL pointer here, your program should crash. The other - * string functions are more forgiving, but this one here is too basic. - * \param sb string handle (address of existing structure on your side) - */ -MPG123_EXPORT void mpg123_init_string(mpg123_string* sb); - -/** Free-up memory of the contents of an mpg123_string (not the struct itself). - * This also calls mpg123_init_string() and hence is safe to be called - * repeatedly. - * \param sb string handle - */ -MPG123_EXPORT void mpg123_free_string(mpg123_string* sb); - -/** Change the size of a mpg123_string - * \param sb string handle - * \param news new size in bytes - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_resize_string(mpg123_string* sb, size_t news); - -/** Increase size of a mpg123_string if necessary (it may stay larger). - * Note that the functions for adding and setting in current libmpg123 - * use this instead of mpg123_resize_string(). - * That way, you can preallocate memory and safely work afterwards with - * pieces. - * \param sb string handle - * \param news new minimum size - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_grow_string(mpg123_string* sb, size_t news); - -/** Copy the contents of one mpg123_string string to another. - * Yes the order of arguments is reversed compated to memcpy(). - * \param from string handle - * \param to string handle - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_copy_string(mpg123_string* from, mpg123_string* to); - -/** Move the contents of one mpg123_string string to another. - * This frees any memory associated with the target and moves over the - * pointers from the source, leaving the source without content after - * that. The only possible error is that you hand in NULL pointers. - * If you handed in a valid source, its contents will be gone, even if - * there was no target to move to. If you hand in a valid target, its - * original contents will also always be gone, to be replaced with the - * source's contents if there was some. - * \param from source string handle - * \param to target string handle - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_move_string(mpg123_string* from, mpg123_string* to); - -/** Append a C-String to an mpg123_string - * \param sb string handle - * \param stuff to append - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_add_string(mpg123_string* sb, const char* stuff); - -/** Append a C-substring to an mpg123 string - * \param sb string handle - * \param stuff content to copy - * \param from offset to copy from - * \param count number of characters to copy (a null-byte is always appended) - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_add_substring( mpg123_string *sb -, const char *stuff, size_t from, size_t count ); - -/** Set the content of a mpg123_string to a C-string - * \param sb string handle - * \param stuff content to copy - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_set_string(mpg123_string* sb, const char* stuff); - -/** Set the content of a mpg123_string to a C-substring - * \param sb string handle - * \param stuff the future content - * \param from offset to copy from - * \param count number of characters to copy (a null-byte is always appended) - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_set_substring( mpg123_string *sb -, const char *stuff, size_t from, size_t count ); - -/** Count characters in a mpg123 string (non-null bytes or Unicode points). - * This function is of limited use, as it does just count code points - * encoded in an UTF-8 string, only loosely related to the count of visible - * characters. Get your full Unicode handling support elsewhere. - * \param sb string handle - * \param utf8 a flag to tell if the string is in utf8 encoding - * \return character count -*/ -MPG123_EXPORT size_t mpg123_strlen(mpg123_string *sb, int utf8); - -/** Remove trailing \\r and \\n, if present. - * \param sb string handle - * \return 0 on error, 1 on success - */ -MPG123_EXPORT int mpg123_chomp_string(mpg123_string *sb); - -/** Determine if two strings contain the same data. - * This only returns 1 if both given handles are non-NULL and - * if they are filled with the same bytes. - * \param a first string handle - * \param b second string handle - * \return 0 for different strings, 1 for identical - */ -MPG123_EXPORT int mpg123_same_string(mpg123_string *a, mpg123_string *b); - -/** The mpg123 text encodings. This contains encodings we encounter in ID3 tags or ICY meta info. */ -enum mpg123_text_encoding -{ - mpg123_text_unknown = 0 /**< Unkown encoding... mpg123_id3_encoding can return that on invalid codes. */ - ,mpg123_text_utf8 = 1 /**< UTF-8 */ - ,mpg123_text_latin1 = 2 /**< ISO-8859-1. Note that sometimes latin1 in ID3 is abused for totally different encodings. */ - ,mpg123_text_icy = 3 /**< ICY metadata encoding, usually CP-1252 but we take it as UTF-8 if it qualifies as such. */ - ,mpg123_text_cp1252 = 4 /**< Really CP-1252 without any guessing. */ - ,mpg123_text_utf16 = 5 /**< Some UTF-16 encoding. The last of a set of leading BOMs (byte order mark) rules. - * When there is no BOM, big endian ordering is used. Note that UCS-2 qualifies as UTF-8 when - * you don't mess with the reserved code points. If you want to decode little endian data - * without BOM you need to prepend 0xff 0xfe yourself. */ - ,mpg123_text_utf16bom = 6 /**< Just an alias for UTF-16, ID3v2 has this as distinct code. */ - ,mpg123_text_utf16be = 7 /**< Another alias for UTF16 from ID3v2. Note, that, because of the mess that is reality, - * BOMs are used if encountered. There really is not much distinction between the UTF16 types for mpg123 - * One exception: Since this is seen in ID3v2 tags, leading null bytes are skipped for all other UTF16 - * types (we expect a BOM before real data there), not so for utf16be!*/ - ,mpg123_text_max = 7 /**< Placeholder for the maximum encoding value. */ -}; - -/** The encoding byte values from ID3v2. */ -enum mpg123_id3_enc -{ - mpg123_id3_latin1 = 0 /**< Note: This sometimes can mean anything in practice... */ - ,mpg123_id3_utf16bom = 1 /**< UTF16, UCS-2 ... it's all the same for practical purposes. */ - ,mpg123_id3_utf16be = 2 /**< Big-endian UTF-16, BOM see note for mpg123_text_utf16be. */ - ,mpg123_id3_utf8 = 3 /**< Our lovely overly ASCII-compatible 8 byte encoding for the world. */ - ,mpg123_id3_enc_max = 3 /**< Placeholder to check valid range of encoding byte. */ -}; - -/** Convert ID3 encoding byte to mpg123 encoding index. - * \param id3_enc_byte the ID3 encoding code - * \return the mpg123 encoding index - */ - -MPG123_EXPORT enum mpg123_text_encoding mpg123_enc_from_id3(unsigned char id3_enc_byte); - -/** Store text data in string, after converting to UTF-8 from indicated encoding - * A prominent error can be that you provided an unknown encoding value, or this build of libmpg123 lacks support for certain encodings (ID3 or ICY stuff missing). - * Also, you might want to take a bit of care with preparing the data; for example, strip leading zeroes (I have seen that). - * \param sb target string - * \param enc mpg123 text encoding value - * \param source source buffer with plain unsigned bytes (you might need to cast from signed char) - * \param source_size number of bytes in the source buffer - * \return 0 on error, 1 on success (on error, mpg123_free_string is called on sb) - */ -MPG123_EXPORT int mpg123_store_utf8(mpg123_string *sb, enum mpg123_text_encoding enc, const unsigned char *source, size_t source_size); - -/** Sub data structure for ID3v2, for storing various text fields (including comments). - * This is for ID3v2 COMM, TXXX and all the other text fields. - * Only COMM, TXXX and USLT may have a description, only COMM and USLT - * have a language. - * You should consult the ID3v2 specification for the use of the various text fields - * ("frames" in ID3v2 documentation, I use "fields" here to separate from MPEG frames). */ -typedef struct -{ - char lang[3]; /**< Three-letter language code (not terminated). */ - char id[4]; /**< The ID3v2 text field id, like TALB, TPE2, ... (4 characters, no string termination). */ - mpg123_string description; /**< Empty for the generic comment... */ - mpg123_string text; /**< ... */ -} mpg123_text; - -/** The picture type values from ID3v2. */ -enum mpg123_id3_pic_type -{ - mpg123_id3_pic_other = 0 /**< see ID3v2 docs */ - ,mpg123_id3_pic_icon = 1 /**< see ID3v2 docs */ - ,mpg123_id3_pic_other_icon = 2 /**< see ID3v2 docs */ - ,mpg123_id3_pic_front_cover = 3 /**< see ID3v2 docs */ - ,mpg123_id3_pic_back_cover = 4 /**< see ID3v2 docs */ - ,mpg123_id3_pic_leaflet = 5 /**< see ID3v2 docs */ - ,mpg123_id3_pic_media = 6 /**< see ID3v2 docs */ - ,mpg123_id3_pic_lead = 7 /**< see ID3v2 docs */ - ,mpg123_id3_pic_artist = 8 /**< see ID3v2 docs */ - ,mpg123_id3_pic_conductor = 9 /**< see ID3v2 docs */ - ,mpg123_id3_pic_orchestra = 10 /**< see ID3v2 docs */ - ,mpg123_id3_pic_composer = 11 /**< see ID3v2 docs */ - ,mpg123_id3_pic_lyricist = 12 /**< see ID3v2 docs */ - ,mpg123_id3_pic_location = 13 /**< see ID3v2 docs */ - ,mpg123_id3_pic_recording = 14 /**< see ID3v2 docs */ - ,mpg123_id3_pic_performance = 15 /**< see ID3v2 docs */ - ,mpg123_id3_pic_video = 16 /**< see ID3v2 docs */ - ,mpg123_id3_pic_fish = 17 /**< see ID3v2 docs */ - ,mpg123_id3_pic_illustration = 18 /**< see ID3v2 docs */ - ,mpg123_id3_pic_artist_logo = 19 /**< see ID3v2 docs */ - ,mpg123_id3_pic_publisher_logo = 20 /**< see ID3v2 docs */ -}; - -/** Sub data structure for ID3v2, for storing picture data including comment. - * This is for the ID3v2 APIC field. You should consult the ID3v2 specification - * for the use of the APIC field ("frames" in ID3v2 documentation, I use "fields" - * here to separate from MPEG frames). */ -typedef struct -{ - char type; /**< mpg123_id3_pic_type value */ - mpg123_string description; /**< description string */ - mpg123_string mime_type; /**< MIME type */ - size_t size; /**< size in bytes */ - unsigned char* data; /**< pointer to the image data */ -} mpg123_picture; - -/** Data structure for storing IDV3v2 tags. - * This structure is not a direct binary mapping with the file contents. - * The ID3v2 text frames are allowed to contain multiple strings. - * So check for null bytes until you reach the mpg123_string fill. - * All text is encoded in UTF-8. */ -typedef struct -{ - unsigned char version; /**< 3 or 4 for ID3v2.3 or ID3v2.4. */ - mpg123_string *title; /**< Title string (pointer into text_list). */ - mpg123_string *artist; /**< Artist string (pointer into text_list). */ - mpg123_string *album; /**< Album string (pointer into text_list). */ - mpg123_string *year; /**< The year as a string (pointer into text_list). */ - mpg123_string *genre; /**< Genre String (pointer into text_list). The genre string(s) may very well need postprocessing, esp. for ID3v2.3. */ - mpg123_string *comment; /**< Pointer to last encountered comment text with empty description. */ - /* Encountered ID3v2 fields are appended to these lists. - There can be multiple occurences, the pointers above always point to the last encountered data. */ - mpg123_text *comment_list; /**< Array of comments. */ - size_t comments; /**< Number of comments. */ - mpg123_text *text; /**< Array of ID3v2 text fields (including USLT) */ - size_t texts; /**< Numer of text fields. */ - mpg123_text *extra; /**< The array of extra (TXXX) fields. */ - size_t extras; /**< Number of extra text (TXXX) fields. */ - mpg123_picture *picture; /**< Array of ID3v2 pictures fields (APIC). - Only populated if MPG123_PICTURE flag is set! */ - size_t pictures; /**< Number of picture (APIC) fields. */ -} mpg123_id3v2; - -/** Data structure for ID3v1 tags (the last 128 bytes of a file). - * Don't take anything for granted (like string termination)! - * Also note the change ID3v1.1 did: comment[28] = 0; comment[29] = track_number - * It is your task to support ID3v1 only or ID3v1.1 ...*/ -typedef struct -{ - char tag[3]; /**< Always the string "TAG", the classic intro. */ - char title[30]; /**< Title string. */ - char artist[30]; /**< Artist string. */ - char album[30]; /**< Album string. */ - char year[4]; /**< Year string. */ - char comment[30]; /**< Comment string. */ - unsigned char genre; /**< Genre index. */ -} mpg123_id3v1; - -#define MPG123_ID3 0x3 /**< 0011 There is some ID3 info. Also matches 0010 or NEW_ID3. */ -#define MPG123_NEW_ID3 0x1 /**< 0001 There is ID3 info that changed since last call to mpg123_id3. */ -#define MPG123_ICY 0xc /**< 1100 There is some ICY info. Also matches 0100 or NEW_ICY.*/ -#define MPG123_NEW_ICY 0x4 /**< 0100 There is ICY info that changed since last call to mpg123_icy. */ - -/** Query if there is (new) meta info, be it ID3 or ICY (or something new in future). - * \param mh handle - * \return combination of flags, 0 on error (same as "nothing new") - */ -MPG123_EXPORT int mpg123_meta_check(mpg123_handle *mh); - -/** Clean up meta data storage (ID3v2 and ICY), freeing memory. - * \param mh handle - */ -MPG123_EXPORT void mpg123_meta_free(mpg123_handle *mh); - -/** Point v1 and v2 to existing data structures wich may change on any next read/decode function call. - * v1 and/or v2 can be set to NULL when there is no corresponding data. - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_id3( mpg123_handle *mh -, mpg123_id3v1 **v1, mpg123_id3v2 **v2 ); - -/** Return pointers to and size of stored raw ID3 data if storage has - * been configured with MPG123_RAW_ID3 and stream parsing passed the - * metadata already. Null value with zero size is a possibility! - * The storage can change at any next API call. - * \param v1 address to store pointer to v1 tag - * \param v1_size size of v1 data in bytes - * \param v2 address to store pointer to v2 tag - * \param v2_size size of v2 data in bytes - * \return MPG123_OK or MPG123_ERR. Only on MPG123_OK the output - * values are set. - */ -MPG123_EXPORT int mpg123_id3_raw( mpg123_handle *mh -, unsigned char **v1, size_t *v1_size -, unsigned char **v2, size_t *v2_size ); - -/** Point icy_meta to existing data structure wich may change on any next read/decode function call. - * \param mh handle - * \param icy_meta return address for ICY meta string (set to NULL if nothing there) - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_icy(mpg123_handle *mh, char **icy_meta); - -/** Decode from windows-1252 (the encoding ICY metainfo used) to UTF-8. - * Note that this is very similar to mpg123_store_utf8(&sb, mpg123_text_icy, icy_text, strlen(icy_text+1)) . - * \param icy_text The input data in ICY encoding - * \return pointer to newly allocated buffer with UTF-8 data (You free() it!) */ -MPG123_EXPORT char* mpg123_icy2utf8(const char* icy_text); - - -/* @} */ - - -/** \defgroup mpg123_advpar mpg123 advanced parameter API - * - * Direct access to a parameter set without full handle around it. - * Possible uses: - * - Influence behaviour of library _during_ initialization of handle (MPG123_VERBOSE). - * - Use one set of parameters for multiple handles. - * - * The functions for handling mpg123_pars (mpg123_par() and mpg123_fmt() - * family) directly return a fully qualified mpg123 error code, the ones - * operating on full handles normally MPG123_OK or MPG123_ERR, storing the - * specific error code itseld inside the handle. - * - * @{ - */ - -/** Opaque structure for the libmpg123 decoder parameters. */ -struct mpg123_pars_struct; - -/** Opaque structure for the libmpg123 decoder parameters. */ -typedef struct mpg123_pars_struct mpg123_pars; - -/** Create a handle with preset parameters. - * \param mp parameter handle - * \param decoder decoder choice - * \param error error code return address - * \return mpg123 handle - */ -MPG123_EXPORT mpg123_handle *mpg123_parnew( mpg123_pars *mp -, const char* decoder, int *error ); - -/** Allocate memory for and return a pointer to a new mpg123_pars - * \param error error code return address - * \return new parameter handle - */ -MPG123_EXPORT mpg123_pars *mpg123_new_pars(int *error); - -/** Delete and free up memory used by a mpg123_pars data structure - * \param mp parameter handle - */ -MPG123_EXPORT void mpg123_delete_pars(mpg123_pars* mp); - -/** Configure mpg123 parameters to accept no output format at all, - * use before specifying supported formats with mpg123_format - * \param mp parameter handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_fmt_none(mpg123_pars *mp); - -/** Configure mpg123 parameters to accept all formats - * (also any custom rate you may set) -- this is default. - * \param mp parameter handle - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_fmt_all(mpg123_pars *mp); - -/** Set the audio format support of a mpg123_pars in detail: - * \param mp parameter handle - * \param rate The sample rate value (in Hertz). - * \param channels A combination of MPG123_STEREO and MPG123_MONO. - * \param encodings A combination of accepted encodings for rate and channels, - * p.ex MPG123_ENC_SIGNED16|MPG123_ENC_ULAW_8 (or 0 for no - * support). - * \return MPG123_OK on success -*/ -MPG123_EXPORT int mpg123_fmt(mpg123_pars *mp -, long rate, int channels, int encodings); - -/** Set the audio format support of a mpg123_pars in detail: - * \param mp parameter handle - * \param rate The sample rate value (in Hertz). Special value 0 means - * all rates (reason for this variant of mpg123_fmt). - * \param channels A combination of MPG123_STEREO and MPG123_MONO. - * \param encodings A combination of accepted encodings for rate and channels, - * p.ex MPG123_ENC_SIGNED16|MPG123_ENC_ULAW_8 (or 0 for no - * support). - * \return MPG123_OK on success -*/ -MPG123_EXPORT int mpg123_fmt2(mpg123_pars *mp -, long rate, int channels, int encodings); - -/** Check to see if a specific format at a specific rate is supported - * by mpg123_pars. - * \param mp parameter handle - * \param rate sampling rate - * \param encoding encoding - * \return 0 for no support (that includes invalid parameters), MPG123_STEREO, - * MPG123_MONO or MPG123_STEREO|MPG123_MONO. */ -MPG123_EXPORT int mpg123_fmt_support(mpg123_pars *mp, long rate, int encoding); - -/** Set a specific parameter, for a specific mpg123_pars, using a parameter - * type key chosen from the mpg123_parms enumeration, to the specified value. - * \param mp parameter handle - * \param type parameter choice - * \param value integer value - * \param fvalue floating point value - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_par( mpg123_pars *mp -, enum mpg123_parms type, long value, double fvalue ); - -/** Get a specific parameter, for a specific mpg123_pars. - * See the mpg123_parms enumeration for a list of available parameters. - * \param mp parameter handle - * \param type parameter choice - * \param value integer value return address - * \param fvalue floating point value return address - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_getpar( mpg123_pars *mp -, enum mpg123_parms type, long *value, double *fvalue); - -/* @} */ - - -/** \defgroup mpg123_lowio mpg123 low level I/O - * You may want to do tricky stuff with I/O that does not work with mpg123's default file access or you want to make it decode into your own pocket... - * - * @{ */ - -/** Replace default internal buffer with user-supplied buffer. - * Instead of working on it's own private buffer, mpg123 will directly use the one you provide for storing decoded audio. - * Note that the required buffer size could be bigger than expected from output - * encoding if libmpg123 has to convert from primary decoder output (p.ex. 32 bit - * storage for 24 bit output). - * - * Note: The type of data changed to a void pointer in mpg123 1.26.0 - * (API version 45). - * - * \param mh handle - * \param data pointer to user buffer - * \param size of buffer in bytes - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_replace_buffer(mpg123_handle *mh -, void *data, size_t size); - -/** The max size of one frame's decoded output with current settings. - * Use that to determine an appropriate minimum buffer size for decoding one frame. - * \param mh handle - * \return maximum decoded data size in bytes - */ -MPG123_EXPORT size_t mpg123_outblock(mpg123_handle *mh); - -/** Replace low-level stream access functions; read and lseek as known in POSIX. - * You can use this to make any fancy file opening/closing yourself, - * using mpg123_open_fd() to set the file descriptor for your read/lseek - * (doesn't need to be a "real" file descriptor...). - * Setting a function to NULL means that the default internal read is - * used (active from next mpg123_open call on). - * Note: As it would be troublesome to mess with this while having a file open, - * this implies mpg123_close(). - * \param mh handle - * \param r_read callback for reading (behaviour like POSIX read) - * \param r_lseek callback for seeking (like POSIX lseek) - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_replace_reader( mpg123_handle *mh -, ssize_t (*r_read) (int, void *, size_t) -, off_t (*r_lseek)(int, off_t, int) -); - -/** Replace I/O functions with your own ones operating on some kind of - * handle instead of integer descriptors. - * The handle is a void pointer, so you can pass any data you want... - * mpg123_open_handle() is the call you make to use the I/O defined here. - * There is no fallback to internal read/seek here. - * Note: As it would be troublesome to mess with this while having a file open, - * this mpg123_close() is implied here. - * \param mh handle - * \param r_read callback for reading (behaviour like POSIX read) - * \param r_lseek callback for seeking (like POSIX lseek) - * \param cleanup A callback to clean up an I/O handle on mpg123_close, - * can be NULL for none (you take care of cleaning your handles). - * \return MPG123_OK on success - */ -MPG123_EXPORT int mpg123_replace_reader_handle( mpg123_handle *mh -, ssize_t (*r_read) (void *, void *, size_t) -, off_t (*r_lseek)(void *, off_t, int) -, void (*cleanup)(void*) ); - -/* @} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ogg b/ogg deleted file mode 160000 index 1e8d7cce..00000000 --- a/ogg +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1e8d7cce266df61afc9d35db0283bbacc0237aba diff --git a/opus b/opus deleted file mode 160000 index 8aa77672..00000000 --- a/opus +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8aa7767207b1e3633004c26aecbb67d1c5118485 diff --git a/opusfile b/opusfile deleted file mode 160000 index eb252537..00000000 --- a/opusfile +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eb252537f374e30f7b68b84223c5a2303c05eca2 diff --git a/premake5.lua b/premake5.lua index a84d8ff4..4ebb735c 100644 --- a/premake5.lua +++ b/premake5.lua @@ -2,21 +2,21 @@ newoption { trigger = "glewdir", value = "PATH", description = "Directory of GLEW", - default = "glew-2.1.0" + default = "vendor/glew-2.1.0" } newoption { trigger = "glfwdir64", value = "PATH", description = "Directory of glfw", - default = "glfw-3.3.2.bin.WIN64", + default = "vendor/glfw-3.3.2.bin.WIN64", } newoption { trigger = "glfwdir32", value = "PATH", description = "Directory of glfw", - default = "glfw-3.3.2.bin.WIN32", + default = "vendor/glfw-3.3.2.bin.WIN32", } newoption { @@ -30,9 +30,9 @@ newoption { } if(_OPTIONS["with-librw"]) then - Librw = "librw" + Librw = "vendor/librw" else - Librw = os.getenv("LIBRW") or "librw" + Librw = os.getenv("LIBRW") or "vendor/librw" end function getsys(a) @@ -152,7 +152,7 @@ if(_OPTIONS["with-librw"]) then project "librw" kind "StaticLib" targetname "rw" - targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}" + targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) files { path.join(Librw, "src/*.*") } files { path.join(Librw, "src/*/*.*") } @@ -219,9 +219,9 @@ project "re3" includedirs { "src/extras" } if _OPTIONS["with-opus"] then - includedirs { "ogg/include" } - includedirs { "opus/include" } - includedirs { "opusfile/include" } + includedirs { "vendor/ogg/include" } + includedirs { "vendor/opus/include" } + includedirs { "vendor/opusfile/include" } end filter "platforms:*mss" @@ -231,9 +231,9 @@ project "re3" if _OPTIONS["with-opus"] then filter "platforms:win*" - libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" } - libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" } - libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" } + libdirs { "vendor/ogg/win32/VS2015/Win32/%{cfg.buildcfg}" } + libdirs { "vendor/opus/win32/VS2015/Win32/%{cfg.buildcfg}" } + libdirs { "vendor/opusfile/win32/VS2015/Win32/Release-NoHTTP" } filter {} defines { "AUDIO_OPUS" } end @@ -253,21 +253,20 @@ project "re3" characterset ("MBCS") targetextension ".exe" + filter "platforms:win*oal" + includedirs { "vendor/openal-soft/include" } + includedirs { "vendor/libsndfile/include" } + includedirs { "vendor/mpg123/include" } + filter "platforms:win-x86*oal" - includedirs { "openal-soft/include" } - includedirs { "libsndfile.32/include" } - includedirs { "mpg123.32/include" } - libdirs { "mpg123.32/lib" } - libdirs { "libsndfile.32/lib" } - libdirs { "openal-soft/libs/Win32" } + libdirs { "vendor/mpg123/lib/Win32" } + libdirs { "vendor/libsndfile/lib/Win32" } + libdirs { "vendor/openal-soft/libs/Win32" } filter "platforms:win-amd64*oal" - includedirs { "openal-soft/include" } - includedirs { "libsndfile.64/include" } - includedirs { "mpg123.64/include" } - libdirs { "mpg123.64/lib" } - libdirs { "libsndfile.64/lib" } - libdirs { "openal-soft/libs/Win64" } + libdirs { "vendor/mpg123/lib/Win64" } + libdirs { "vendor/libsndfile/lib/Win64" } + libdirs { "vendor/openal-soft/libs/Win64" } filter "platforms:linux*oal" links { "openal", "mpg123", "sndfile", "pthread" } @@ -296,7 +295,7 @@ project "re3" includedirs { "src/fakerw" } includedirs { Librw } if(_OPTIONS["with-librw"]) then - libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } + libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" } end links { "rw" } diff --git a/vendor/librw b/vendor/librw new file mode 160000 index 00000000..5e299fb1 --- /dev/null +++ b/vendor/librw @@ -0,0 +1 @@ +Subproject commit 5e299fb12e0ab85b5a32032544f58480a93a4a32 diff --git a/libsndfile.32/ChangeLog b/vendor/libsndfile/ChangeLog similarity index 100% rename from libsndfile.32/ChangeLog rename to vendor/libsndfile/ChangeLog diff --git a/libsndfile.32/NEWS b/vendor/libsndfile/NEWS similarity index 100% rename from libsndfile.32/NEWS rename to vendor/libsndfile/NEWS diff --git a/libsndfile.32/dist/libsndfile-1.dll b/vendor/libsndfile/dist/Win32/libsndfile-1.dll similarity index 100% rename from libsndfile.32/dist/libsndfile-1.dll rename to vendor/libsndfile/dist/Win32/libsndfile-1.dll diff --git a/libsndfile.64/dist/libsndfile-1.dll b/vendor/libsndfile/dist/Win64/libsndfile-1.dll similarity index 100% rename from libsndfile.64/dist/libsndfile-1.dll rename to vendor/libsndfile/dist/Win64/libsndfile-1.dll diff --git a/libsndfile.32/include/sndfile.h b/vendor/libsndfile/include/sndfile.h similarity index 100% rename from libsndfile.32/include/sndfile.h rename to vendor/libsndfile/include/sndfile.h diff --git a/libsndfile.32/include/sndfile.hh b/vendor/libsndfile/include/sndfile.hh similarity index 100% rename from libsndfile.32/include/sndfile.hh rename to vendor/libsndfile/include/sndfile.hh diff --git a/libsndfile.32/lib/libsndfile-1.def b/vendor/libsndfile/lib/Win32/libsndfile-1.def similarity index 100% rename from libsndfile.32/lib/libsndfile-1.def rename to vendor/libsndfile/lib/Win32/libsndfile-1.def diff --git a/libsndfile.32/lib/libsndfile-1.lib b/vendor/libsndfile/lib/Win32/libsndfile-1.lib similarity index 100% rename from libsndfile.32/lib/libsndfile-1.lib rename to vendor/libsndfile/lib/Win32/libsndfile-1.lib diff --git a/libsndfile.32/lib/pkgconfig/sndfile.pc b/vendor/libsndfile/lib/Win32/pkgconfig/sndfile.pc similarity index 100% rename from libsndfile.32/lib/pkgconfig/sndfile.pc rename to vendor/libsndfile/lib/Win32/pkgconfig/sndfile.pc diff --git a/libsndfile.64/lib/libsndfile-1.def b/vendor/libsndfile/lib/Win64/libsndfile-1.def similarity index 100% rename from libsndfile.64/lib/libsndfile-1.def rename to vendor/libsndfile/lib/Win64/libsndfile-1.def diff --git a/libsndfile.64/lib/libsndfile-1.lib b/vendor/libsndfile/lib/Win64/libsndfile-1.lib similarity index 100% rename from libsndfile.64/lib/libsndfile-1.lib rename to vendor/libsndfile/lib/Win64/libsndfile-1.lib diff --git a/libsndfile.64/lib/pkgconfig/sndfile.pc b/vendor/libsndfile/lib/Win64/pkgconfig/sndfile.pc similarity index 100% rename from libsndfile.64/lib/pkgconfig/sndfile.pc rename to vendor/libsndfile/lib/Win64/pkgconfig/sndfile.pc diff --git a/mpg123.32/dist/libmpg123-0.dll b/vendor/mpg123/dist/Win32/libmpg123-0.dll similarity index 100% rename from mpg123.32/dist/libmpg123-0.dll rename to vendor/mpg123/dist/Win32/libmpg123-0.dll diff --git a/mpg123.64/dist/libmpg123-0.dll b/vendor/mpg123/dist/Win64/libmpg123-0.dll similarity index 100% rename from mpg123.64/dist/libmpg123-0.dll rename to vendor/mpg123/dist/Win64/libmpg123-0.dll diff --git a/mpg123.32/include/fmt123.h b/vendor/mpg123/include/fmt123.h similarity index 100% rename from mpg123.32/include/fmt123.h rename to vendor/mpg123/include/fmt123.h diff --git a/mpg123.32/include/mpg123.h b/vendor/mpg123/include/mpg123.h similarity index 100% rename from mpg123.32/include/mpg123.h rename to vendor/mpg123/include/mpg123.h diff --git a/mpg123.32/lib/libmpg123-0.lib b/vendor/mpg123/lib/Win32/libmpg123-0.lib similarity index 100% rename from mpg123.32/lib/libmpg123-0.lib rename to vendor/mpg123/lib/Win32/libmpg123-0.lib diff --git a/mpg123.64/lib/libmpg123-0.lib b/vendor/mpg123/lib/Win64/libmpg123-0.lib similarity index 100% rename from mpg123.64/lib/libmpg123-0.lib rename to vendor/mpg123/lib/Win64/libmpg123-0.lib diff --git a/vendor/ogg b/vendor/ogg new file mode 160000 index 00000000..684c7377 --- /dev/null +++ b/vendor/ogg @@ -0,0 +1 @@ +Subproject commit 684c73773e7e2683245ffd6aa75f04115b51123a diff --git a/openal-soft/COPYING b/vendor/openal-soft/COPYING similarity index 100% rename from openal-soft/COPYING rename to vendor/openal-soft/COPYING diff --git a/openal-soft/dist/Win32/OpenAL32.dll b/vendor/openal-soft/dist/Win32/OpenAL32.dll similarity index 100% rename from openal-soft/dist/Win32/OpenAL32.dll rename to vendor/openal-soft/dist/Win32/OpenAL32.dll diff --git a/openal-soft/dist/Win64/OpenAL32.dll b/vendor/openal-soft/dist/Win64/OpenAL32.dll similarity index 100% rename from openal-soft/dist/Win64/OpenAL32.dll rename to vendor/openal-soft/dist/Win64/OpenAL32.dll diff --git a/openal-soft/include/AL/al.h b/vendor/openal-soft/include/AL/al.h similarity index 100% rename from openal-soft/include/AL/al.h rename to vendor/openal-soft/include/AL/al.h diff --git a/openal-soft/include/AL/alc.h b/vendor/openal-soft/include/AL/alc.h similarity index 100% rename from openal-soft/include/AL/alc.h rename to vendor/openal-soft/include/AL/alc.h diff --git a/openal-soft/include/AL/alext.h b/vendor/openal-soft/include/AL/alext.h similarity index 100% rename from openal-soft/include/AL/alext.h rename to vendor/openal-soft/include/AL/alext.h diff --git a/openal-soft/include/AL/efx-creative.h b/vendor/openal-soft/include/AL/efx-creative.h similarity index 100% rename from openal-soft/include/AL/efx-creative.h rename to vendor/openal-soft/include/AL/efx-creative.h diff --git a/openal-soft/include/AL/efx-presets.h b/vendor/openal-soft/include/AL/efx-presets.h similarity index 100% rename from openal-soft/include/AL/efx-presets.h rename to vendor/openal-soft/include/AL/efx-presets.h diff --git a/openal-soft/include/AL/efx.h b/vendor/openal-soft/include/AL/efx.h similarity index 100% rename from openal-soft/include/AL/efx.h rename to vendor/openal-soft/include/AL/efx.h diff --git a/openal-soft/libs/Win32/OpenAL32.def b/vendor/openal-soft/libs/Win32/OpenAL32.def similarity index 100% rename from openal-soft/libs/Win32/OpenAL32.def rename to vendor/openal-soft/libs/Win32/OpenAL32.def diff --git a/openal-soft/libs/Win32/OpenAL32.lib b/vendor/openal-soft/libs/Win32/OpenAL32.lib similarity index 100% rename from openal-soft/libs/Win32/OpenAL32.lib rename to vendor/openal-soft/libs/Win32/OpenAL32.lib diff --git a/openal-soft/libs/Win32/libOpenAL32.dll.a b/vendor/openal-soft/libs/Win32/libOpenAL32.dll.a similarity index 100% rename from openal-soft/libs/Win32/libOpenAL32.dll.a rename to vendor/openal-soft/libs/Win32/libOpenAL32.dll.a diff --git a/openal-soft/libs/Win64/OpenAL32.def b/vendor/openal-soft/libs/Win64/OpenAL32.def similarity index 100% rename from openal-soft/libs/Win64/OpenAL32.def rename to vendor/openal-soft/libs/Win64/OpenAL32.def diff --git a/openal-soft/libs/Win64/OpenAL32.lib b/vendor/openal-soft/libs/Win64/OpenAL32.lib similarity index 100% rename from openal-soft/libs/Win64/OpenAL32.lib rename to vendor/openal-soft/libs/Win64/OpenAL32.lib diff --git a/openal-soft/libs/Win64/libOpenAL32.dll.a b/vendor/openal-soft/libs/Win64/libOpenAL32.dll.a similarity index 100% rename from openal-soft/libs/Win64/libOpenAL32.dll.a rename to vendor/openal-soft/libs/Win64/libOpenAL32.dll.a diff --git a/openal-soft/readme.txt b/vendor/openal-soft/readme.txt similarity index 100% rename from openal-soft/readme.txt rename to vendor/openal-soft/readme.txt diff --git a/vendor/opus b/vendor/opus new file mode 160000 index 00000000..6bae366f --- /dev/null +++ b/vendor/opus @@ -0,0 +1 @@ +Subproject commit 6bae366f9fef25191fc812c430e8abd40a13a233 diff --git a/vendor/opusfile b/vendor/opusfile new file mode 160000 index 00000000..6452e838 --- /dev/null +++ b/vendor/opusfile @@ -0,0 +1 @@ +Subproject commit 6452e838e68e8f4fc0b3599523c760ac6276ce89 From 56388472cb5ccfbbd47408b6c54aaa5c82b0d7db Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 14 Aug 2020 15:25:02 +0300 Subject: [PATCH 051/112] Remove III files --- gamefiles/TEXT/JAPANESE.gxt | Bin 122022 -> 0 bytes gamefiles/TEXT/american.gxt | Bin 218862 -> 0 bytes gamefiles/TEXT/french.gxt | Bin 244494 -> 0 bytes gamefiles/TEXT/german.gxt | Bin 240448 -> 0 bytes gamefiles/TEXT/italian.gxt | Bin 239912 -> 0 bytes gamefiles/TEXT/polish.gxt | Bin 239930 -> 0 bytes gamefiles/TEXT/russian.gxt | Bin 220670 -> 0 bytes gamefiles/TEXT/spanish.gxt | Bin 246088 -> 0 bytes gamefiles/models/fonts_j.txd | Bin 1052072 -> 0 bytes gamefiles/models/fonts_p.txd | Bin 1379752 -> 0 bytes gamefiles/models/fonts_r.txd | Bin 1379752 -> 0 bytes gamefiles/models/menu.txd | Bin 8475176 -> 0 bytes utils/gxt/american.txt | 7979 --------------------------------- utils/gxt/english.txt | 7026 ----------------------------- utils/gxt/french.txt | 8211 ---------------------------------- utils/gxt/german.txt | 8028 --------------------------------- utils/gxt/italian.txt | 8040 --------------------------------- utils/gxt/russian.txt | 7979 --------------------------------- utils/gxt/spanish.txt | 8031 --------------------------------- 19 files changed, 55294 deletions(-) delete mode 100644 gamefiles/TEXT/JAPANESE.gxt delete mode 100644 gamefiles/TEXT/american.gxt delete mode 100644 gamefiles/TEXT/french.gxt delete mode 100644 gamefiles/TEXT/german.gxt delete mode 100644 gamefiles/TEXT/italian.gxt delete mode 100644 gamefiles/TEXT/polish.gxt delete mode 100644 gamefiles/TEXT/russian.gxt delete mode 100644 gamefiles/TEXT/spanish.gxt delete mode 100644 gamefiles/models/fonts_j.txd delete mode 100644 gamefiles/models/fonts_p.txd delete mode 100644 gamefiles/models/fonts_r.txd delete mode 100644 gamefiles/models/menu.txd delete mode 100644 utils/gxt/american.txt delete mode 100644 utils/gxt/english.txt delete mode 100644 utils/gxt/french.txt delete mode 100644 utils/gxt/german.txt delete mode 100644 utils/gxt/italian.txt delete mode 100644 utils/gxt/russian.txt delete mode 100644 utils/gxt/spanish.txt diff --git a/gamefiles/TEXT/JAPANESE.gxt b/gamefiles/TEXT/JAPANESE.gxt deleted file mode 100644 index d4b5438388b4c17680b769fa84ce099d8587bb3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122022 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⪚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 diff --git a/gamefiles/TEXT/french.gxt b/gamefiles/TEXT/french.gxt deleted file mode 100644 index cb2874f9f4b58cc157eb9e0eacb909ca419f655c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244494 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 z 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�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 diff --git a/gamefiles/TEXT/italian.gxt b/gamefiles/TEXT/italian.gxt deleted file mode 100644 index 95e2dd367ac9d75e5e328f863fb21765e4265f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239912 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 MJxy?STJZk=0vDTZ3IG5A diff --git a/gamefiles/TEXT/russian.gxt b/gamefiles/TEXT/russian.gxt deleted file mode 100644 index 026222acb807edb193c032a4f481371bb7c9f3c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220670 zcmeFaeVo-rcISUWj3KTu#290YA+0e=h(r3Bh8Saa-+tuw?d!d_n}--$9fuHN7()m# z#t_CqhhY#Ei7^gwT0~?J5s`5S8Z?G=jWMq4y2NFTF|NzHtn2!7{kbmdy8C(8sjAx` z&P<;E*x&01uZH)nd%jhtPMtb+s=nWQyEdn1{<<41{Ap@zYy{5IkGKh@K->)XJGa1B zIJd&rIk&;;>mBUQPe*P(Fr6H$+B> zdm^L6OOa7x_DL>J=Up)@+r znOKz`N~}sRKF8(9ROy<;>cC@()q$x$E}3$LD(wQessYlU+0H@dyCb9Xc~gT-80)7a zqjTjayd3*%j*LxSij2?CZa}74WOli8u+P54n%A?>4Kiaynp$FA@?7RlyX!ocp{A36 z(iz`a5*gpvADPi8obNLD#yyeojY&V{<@m;EWPIcK$TF>UT;MXD(q}xe8h$o1HtE06 zWn^-DAu={;oaW`&WPfCt+};k1#%AaIG%_v04%a7E!}}uB$FAuv!xft%)5kX>)5pm_ z<1+NIAu{?u8yP((UF0(8d39p->*mPlydyF?PyLL`qw_V1CI50{#Kr_{PBWO7k@E$Q<V zf;Q?eJhyW`{9a`JXQ#_}onzgdC3Sw#d3dPYWH)DSwgZ`4>$_DbMt=V(vWJ`P+P7?N?%)IfE0ma6?dJ$7E; zN~L>F)j9&#)Kjy0a8I!~f23^70@o^?nvu60Gf z%3JJ=pG(|o`vZ4%ch)o(froHCTXr!rLtS)iUEtD)Ol4aGSNci=C3_663>5l$nymKo z;%cp08!=l2kM#A;m;A=SSX|czrWVCC=UR`P_<4A&I#83HKNfd)c6AMiPrd{m3Nh`e z$S8OHFHl~oVw8I#kI7h1IfuFVa$@=8>xtEwcN5FWPQEnMGu9+OnwnVtG9$6ZzmQmC zRZ6U2ba`Tp$)d!v_wva2@S4QZVPj(HusN}Wb|jV#dlE~BXA()5UO)MP_ zL{>F+FtVz#w<4<=dp~lB?HXA0S2cEKWL0C+B6n9ttPr_pUfHe+?DK9}WE^Fh=8v4Y zX-s7|CzdbWmRR%XHD`v%-ige$s|w-T<}ocEk0n+;Z)a|{t5uikZ)QQ=o>=c6NUZ-& zZ3G!5Y6~*A*y_akzo76JWc2^bi4}-<=_iyc_)gMKUfmL}GKtxr7M zYx^>n>`mvMT4%q#=R7*B|Ibnc==C@7oKuJ^H?5V)D`3uyq zLvV4yu$r<-dM~hI<21O`tzfNq6}VQcs-88@q5MU7xU-uz?nvNbv8TIcA2|;Xbyw^h z)zv**tc@wAjRqbX>*=i8qR8lQbKp|7CO_QlT%#Y)1}@8WYqolrddkZDG)DrDbrShL zb{;ONzs+UIR0@r4jh)uz+|<(EX$un1?6m6=Yr?M2++{l=x9ZyGGI!bG%-weKWugA2 z*2aQO&D>)h&dp7#vy!>XmIUr8u=QJ)x!LZ?++t5;ZncA%+w9%U?RHj$cByBkHD~Uy z!OXL4USe$smuGIW+cG!X&de?LT;^6goVm>=X^=x(P3<-{^Gs{a++mkyo@KSf&5gDy zbCcbbx!E4e++r_eZnYzs+w5p&^;a`1=+LZoGj~`q^DJAOxTVonXKu3b%<6Au^*3{? zy^*=iP9BMEwY1v>nP=Ky<_;UpJj$Ok0w} znP=J4iQ60P<;+cXG;^~}nHSq?Z?W?-w^~Q$Hd~yz-BxCvX`3C7jW%h1 ztbb;cou9ecF3sFx%QCmx`pj*%BXhewn|Y=k&fH-qElBmxvU3u5G+JxsChO1KYzs5D z*ow@pc30*$+nc%FUd}wz>=$EO9UXRd=2_O5cvhnoGB?@6%*}Rv<`&zSxz%=NZnLK| zx7+KPXW9puJ8a73QHNQx?4rmzJF^9un`}kqW?PrJ#kOQ_wI?#S*(;gb?SsrS?bKiL zwwf9{Y(eH(wlT5d)xpe7_Il=KJ8xmUR!QWd%&oRHbDO=Hx!q11OY$?Vn7PB&W}ao+ z5-VQ4oLT;yx!KOSBG%K~VztbzwkmU*J(juM-poAHPP;N)+hJXqXW2E06|c5uR(~@$ z+u2veYg<}uLFQJwF>{-ZXKuH>nP=LInLF&Q%(JZU*;uFIRV8ziU7xwx4rgw$-m8;* ztKE>f&2G-zZksdDw7r=->|o|u_I_f;tJ6Lg>uhVX^D;Nv#hKOL%&oREbDM3;+-?Ul z&$L%Fci4xSXW40sVq1z=Gcq^XU}nwV%q@0(=2qL7xy`m`*8I&p)85V8VW<3ZYHOBV zkXZ4mH*=F+m0A15%q@0T=2qLCxy@e4+-`4Yo@u8nj&05CuxXiRS#M&+tE)3>FQ2*D z#xu9r-psA`V&*n`D|5R|{*~BP$4omXbB8r&o@K?vidTy=H`$uZ&9*hO&LuLp+UuFy z?BmSJH1lnOp6n%x!kouXo2@@{i(Q_%)mCI~v)eMa+dY|Q+UuD+?1Rj+?4+f!e#NV4nVam= z%*{5MS^KZdt#(i5Hrtn3^CT+Vh#) z>`3Nzn{;igzjdaaow>srGtaWY#EMr}XKu0^GdJ7anOp3!%&qovX65af+wJ4bGwrNj zk2>B6cVdd0o0*_St&8&4f zGU2$$u7hips`Rh)0T*9<{Xy9<7aaYu|UpZ#iq{ZT;6d4^{i@ z8F;L#(lgL&GkzQP^UP}l_f)&fI^PS-xuwoV0?!#JY8QLf^~n4ApGjWy zJIIU<^y%W7m~%n?EDb!rT$G+$oU3K+U0#8^dV>v5xdHC$#XhqG4`_3%eg!U$br*YW zb>Onz(AgB+(^;VY=K|}5Pt6?(tcLXGy}$+8WWdh)UE~X6`mv74{W=IJ1@0}VDZ9?O zgxWg;7sq-_L-uUo8mieF@IYrchkP%whV1N>v3#uA?#kR^M>4ls;rEhEn^iJ*+Kg4H zyvwf5+-(hCNaY3Fn7PN=Z%pOA_C(}n>2@Ts^ts@RF4HW1uE^YC&u4D6t5+wPHanbI zdySh?`Aj?W=ER-$X67!t=S!))+g{CFu=CcW@*cZ3bFaOUxz8^Da+2w{U6EU)|I3M` z|Iy5ywq&i#x9AXUOXhAn?JKFgV5>9t*z1{l?S^$prq9+zZdF@b605CKZgH7b9lDKY z?y^(Yr}AzqWG>i?nS1Q2Ta!$$ZO+_h=iipf`)yC;q9*gf#KUGE!o}VJ&Ydp0T|8V+ zsabpEvEG_3gDV50J<_eTA#s;Yze8Lt7r9f>9=KLvB3+wU&bm#kbE8_9gr0`GIyI|x zUp}(BZntgp^0B5aEBt7Ejoj}GnUJ68xyzbd^K^q>P)N{xabd}yv{9;B<@n& zyDOG!*1n#($?pEcSS~xfnz&E*)9;Su3XU%%9?;qNS7Z60+Dbe}=h%tW%d0m<8Rl|g z+2n)7vh-blB$;B@hz=<2AUrhMUmhvjGxvx~1&&~C>erm5zO9Z-ba^^50ch&D%Se6O z5xG}9?OrceSM2G?>WWR;?B(i;ogZ0UvAZLyD>m&umtnxRMpjqs^etYluGkHcahko6 z%i=TccbUt?3nOb8vGK@N@szDDQxmU@JR*KG@~F7{fXmDkZw}l$T#*m&3EZbUJUVBF ztK}Z82KEX(I)F*+u(-FgqB}7fqivBJ6{{2Ljf=k?%jIwPB$mIun^^vK@%AVqf7_l| z{&xO@v3#cdByorAoOqV*WA1PnRd3fPmJUxOM!AQgjD)%pONX6_rNhz0(xI?3%1ejc zktJ@EANF#I+qID;Zf{4HxYc&Kj8wLlB1>hP_K25DWm_FtrnS4^t^u9pN*}nVbF8^4 z|BT#H=(l$wx2pWi-7Z5EIXiNXF1{#o?@*(4W!63`bF;0;++sIp*7;0k?JG04+hdt$ z+RK?c?A^?>?2JcUAL83tk%vmdc3xuL!7D^A>3n`kVy(2xA`g$$Y*l0}D%@W+v-ikMmgPh}?A#dUh!@8n81WcT0!qiObzqi(HV? zUlEz-E0#nq>o(^Gl9a;IJ zy_8t_;YXQ^cG4evJq0D%rzM`-Y11P2^vttz;-RXoOI%W}mAPh5WFECciK`VmeV^Cg zQ>)ndiRX=4F>>!f#V${*hXxiU*1fRhiRD+DG7sAmnJe~Q;<>u-AGxnuw2L42cKbWK zY+m9n-Cs+rhXd9nR$uN;JgoDC%oTefaiwIhMjq&@+3Sg=^LvT4r#PB;wBNd(a2*Cl zM{RZF!LDK3m{{Y!Iq~p(+mm=?$exZ|R4VdPVok~SGdJ0!Kk@pDUCnk{<`!$rtb0b8 zyKQ}D<&%kZPwnZ%1w99qdBi5|kM;NT+G&Yh%m&hwSXk(lhbgE*s6PAUUe2t0otfv_)Tdpal6>QW%vI}6Jh#UdM;;!m+FOa|%(3?pYyMXL%#NJLkShk~yi(Pi+0oS3d{qlK< zt6erDbH81ZS+Oy3t!SGvSL~h4ie3La)+swQXYRGZ%tgB*bH%R9T(jMgFB|ExeUU3I z$~_XxCa+~K+S`e_ADvk9;_PQ!hsr>oO-o#Du_c+iZDZzM+nTsmvR#QsO13|-{Py|C zRqb(JN!+I__+NNiRUH5{OZoc zTECu3Txo9_MuGo0uxx;oi@`&b6>tA?1BbqPQB`$T@ zy37T;D{;Bg_Cy}->9<3ft9n4n>lq!8&qtoCJac;D{-Tu=mrJ%hai!aCj=VteYExpZ z(K`bdieqytw&5?Szfk2_&wZI&?Dfp8HsuAEsdhJ6d*)`F7kNy1(TdE<6%%)L+Wy3v zo0I;f*E3e_u?sQ}*nRrI+LFYo=as0>&_LN< zisfbH*l$IybQi4gCBL?!XA5hIwS8NXxooQLK`LnM-zC#|$gF$!uef|w4=`Pv zx!INm?i(BGEZg;w%fthdr*(<1lvRBU$S0qr%mgmEv94N8Z{BA17Y_H5*e_FR=HU)3C66nJQ?TRyNM zu^#ApHgUONQ~n+8N=Es4V`TjH(#X9!cUqpfGGx0V_v--ng~-L>f_)fysI$>df7R<8 zl5J;aZnjcp-QUdIYRfXW*`1l&Z9MZ#+nu>=&n50|ws$iR+39~B+a1!GTjH|HB5QkU zrObN%Dl%tlS0pa!%pq~PW;aB>tfuq)$jqtjiHExF<;Yb%5Byu_PdwabXa7yCQ~hd8Txu7ZMkB7L>TE zGmyl}(`LNx^^aD&ZC>R0>hHq9r7_~$ipYJ6!)p^OS-dAQhwR%DcMsUX#68-BMAqr1 zeVn=5&iq^2Esc?1bwuVN<8tKM{6@Pfv+k>AZniC%b$>H+t9_8U&8EEJ_1EUN+ln~|~4(a4-9oc!-;w>-vq!j#CIAv7jd zAA18|HdfW#KmASQ;ki~0T&)$lhwSde8pqcnk9Bp~IsXCqYHh5mU<(rKEMjlsLbpvm z9Ayf7xE^#2s=tdyUUVA=rvAfS^{J$v?!|UwUx%#xk+7q=W)}Cu;V%hom#EKzrB-Xf}bu`way<}Hp?!VrUSZ5vE63Y$; z5-a|^mAG26)BdN|)1!75M(&mT^2EwHZ;afhbJwkjwf60e+%Nf;5-Vpo^CPcwQ00x0 ziFN&nRep73a;F;-ONVz7mvzSezr3Cy)*m#Lnkkt>BcHuYm~w;~%B5=*zI63b5}|L-VM9kz1hs`|J*vBr8+Vj1+Y z#A@qc=1zMju{v|QeOK@|9rxO_#5#*BCf2%eRptS^EwG*%SI++yJfQp6dI0#;?{dbr zXGbop{tF^kwO_6zR$jU|GI{9@fh#)ZoMY=F^FaBQ#5$jR+F7HbzQD!KYJZpR<2cv4 z_)yIx%6qGQy?V|8j-SsRbmms1txDXed!vz?Res)g2l=rU@utYF;wdM2d7F4%t}p*2wtA`;qaD(I0kseB;i@_{M?A_(t=YE`vWTjEp}#9hq@IMP@$M&i8WW<4Hf| z%($$K%(yJPz{?qzHzPAHmtRP^oJxOII|rXUV_GQJ(=!^c$XM&+$Xv1br(LF1ioP2e ze=AJ)a{TR;#FA|I$P;X3U7A@u5{`nv-VczChKTJJ`Aa?kE}3b&qXE}wYIwqW4$0U zV|^$xW8E;*Wfc95Yd zTkK3z_F-iFVa?A48C=N<7dumKKOY#kvR-FYvo&x}Wk@NB-3j*(hxK|ZJX9R!NxEkO z>*PYVJseoOP}%e3OOUCC&rqM^JX%!HDZr(^vAMcnF+A*_oZc8%ce3R`n*&$$%^ZqF za77zb%g0tGmJQ!Xtod?IPn1_st|gXzHYKhw7*VFG z&l)F|ou~K3as}mg;Srffec#dV+$?@+AhP=Y;b3I-{p_N1i)3aDMV76)O3tk+KWjL$ z%HN5MV;wAimp*e_nLDg=xi{hXEag$>A~E5N%R;%h$wo8l*?`P?mN;{(y&ajcyRG8a z^10X3s*$Dt-ozTON{#Zum~O?}vcP&En7Osq4^$n7fMe7Tpm z>%+IjUrJoC44#WxXX5CR(^hUC?6|m zt}PEdA5+-@=MZNme-4@Xbjz-B4)NrD=MYbpFA6dtp1kKAV#vy04&@M}Y>JFNlYZ078I1Lj8H{HlGZ^nj zM(1fOTppdrBct z?s}J@twWJ%>&)Nra@yJy8T;%D+#1GZ;SI>NhTN&+cb#eLwaBz}=}IrBt+kP9Ye!_- zdNnd_UHp44Pg^@9GZvFpQQj8X-5Hrap7RAS$L7Vz*nC@LZ2m!Hbi4RQmq)kjBct2X zkQy~qT$#?^i;`TwrKL1lZ%In3V=ol)P;z6tq|lH0}3 zVg6QNg0}vwh}@*Oanj9RPX0C+nGX+K8(0td=+C;y#MSpA)9~n*xVBQF;eCOt$k92iH1_0~(k$;z4~HfrMbnR}y#GoteAsoOP+ZV0$y` zd5K$6d9Q8A+-I+6?zeU8lgxk}%{*uq-I~hh*qxb+HtDuhu6x9pOIFG}Y_DY2vv#*9 z`OEB@%oW>|xoU4_uGv`|lKhBOGV6Js%sTVGBgxFO)q%tC+B!I%t32%-ob0-dp*+mT zmm`Nc^7~%S99a<=C)*mCIWp-^mtm1u8o5K`vMaGBOzjU`rb82EPh{rQN0FIR*WBeY z%&EsBPHX+!>ifVP9lyTioXI^lN8i`c?e8m(#B`k?Gf- z$nXv>Z5RJ5WYDwb7zZl zmGU>>zN+%@vQ6D14xjka{c$+PlTqhjs||^jlOIkj-#hCYK|c82`owaw{gJWl(a8AT zrH{Ehw%rpM+n(`FFUPjU$k_I_$i$z^_qt4n3^(nMok>`?M#kpvM#kpb_PGo;KmBoM zY(Dh~XKcPJa+qs>;^p|{rIDHM`vTJwq#$1p97K6XX8^| zjy?Ws)aw7d1skWs#;v3M@A#-i~+ESEyt6YKJK6U*q$ z|J-HJ`G&}}a3nJ0a>_F= zOy6IPOy4`6^K$zBQed>vd7yLX`{jRujB-x({qDr-`=QA6Yx46hL%*JjOii`F^m6+3 zeq{P}@e5u~zm`U(Uz;M+uM7UA%h0bqk?B|Ki(XE@UIvZr&<`Lut9jK{GVkq^)O=NU?Co(!L`PVLk4u=xU4vSv)a`ZX#-#BCE8zN)pQx1ALcHRn) zR7QqW=^j{55#jUCi*>(FThBT6rZbPC+eeW{B!BW>Arp?2tP$?%3m-OH8n{;L(Y^b% zuc&;W)KgJXcu!zH1**@{1g_QioXCO91NI6WYpGyw8 zOo+pYrRThV=jDv!^?~sc#RumwMyI@rjOMcBUr8(@ZvE?6E+Z~~&6%;=7n!kpGqNtV z%HOyQi(T+hDsQz~W__nY=60L* zzmm*MTbQ{+&jzG&eFxgdiS<2ZnY-<(|DDPUwm-9;!?a0^MNjjXzIQHjpPltxsl4CD zBQt}aO02$IFv(?F)R(oHTkK%wR-63YNv6$OGq>Ba%sMkXDaq(N*)r?9*S;r}7i?K% zeE819(&6dM&DMId%eTtwugTo1@3Kzi^7`*h+-_Z&XWGHc9d_R2Bs0rOnLF*3%w5+1 zeMzR<_GK>Ud#zJ>kG-9_*Dm;Hsa!sjx!=w|)ytWW?TOW|Qf8eeWNxuHGPl~P-yg3X zYqN6ZPJ1u2?0H&}>9&PG;7n{>o>*-?o4MJ#rbHRp@WaflHv0!txjxUHxy#F!cmCL%Nj=h^$lc)8EW4WAfbz(We9RJU{RuxVuo|`IZZQ4DJiO>>SwdN!5NFuGVyk$ zLA-KaELT+ComdOl;7`VKEnr&{YXO^bekdo@Swm#>Uy@kw+?-hYKc86of1Fr$zT&66 z9u~Y;GV6QoE=c9AwkUI(ZOGhi?!(Ax zwAAOvBh!~_6RR(~5=-hxV(Gtjx?hX_tv{1k-xrs;)uvvQ%C$~q*7x%ymi})hmj2g# zCdd=^?8eB!Hxf&q7ZXdL$unG@b@tN4(q~8J7JD~yt8Mt%C@opyB#<@$(#((F}%hx7%<(hb(P%;*s_dp)u~ zzG>&Qs$5^gJYV*|8rC<|=(fCV4U82uHzU*E*V>R73*S}yeqz=0al6WgOSR5<+B43C zhf7^LXXuA@3$fH!wFPi>Ubq*(7#<;;SDXx74bL8|cOKQp5o{McPnnJE@L}d5yQCwQ z>rih^<{^7AaBoqMw%OUUkQp4&W5Tu&4&SpazYXl)QL`toKR@t-xYRRuj1H`tEgs;` zw9XS?8AwOhwllC^sLq#Q#Z>+r3ak&y=uhL%QLd-AW%GuM6ZhDZpN9*>!z(jO&A*_hGcbqjb^#piwj{9IZKt@b zrzrS>o3}DI+67&yT;H#lS>G3$xy9bj+^X+Aj`EscmnYWz+K^Z?^7+JCgHA3)d96XU z#9HLmBvxYmYGNhU4LvSD*4Sw0XKu1Zne|=7ne{z9nOm)~H(lFiD>7@&W}ay$_a&JQ zt7V>LcP7@M!=cRj{-6FRuY=cXGPl_F%&qoe<~F-@Aj!Ae>dg8~N9GPYV=&3+yIT`C zH`-%?^}WRM;^&>UJ=fkXL#O%3;vx~rw@sH^zet; zo$g%bJF@0E>oX%m`krKD!b3l{J#tk#yawxg=81bBz{Rm}L;9?ec(@q8AfqvGDI^xN z16OKeia_%cD~Va0xT^E~#B&u7;mbzC_evdsD?MEm&Brr_1M3m^ik%nOzwfIQ*uS4@ zW#HjKzQg&>!1~fIO~ZqMM?>5@rL1~J{8^gDzycybO9VBePhpU+6L@arqeR<8qxd z?rBF7YxqvPBFKzU=l;mlx%x^kr_RzorBKr zMP_7{{2KD?{Iw5?j6Me=qtDc(E`vThBBRgr&wDxgYz!Qxg6(n+Z5@hCTOUQHt!dYC zZCmiS8zOV{tC6wW!e4h8>^2@5yS)?{JwHyYvEH)G<8`}>?RNTaxeR^jk4#^-M5ZsV zMMnSfbuN$2dlIWJXZ*I8qyMtV=>I;fGebTrJ>~ku&2|y2jG36(A!apFHF~zknSL$) z9dWlF%hd!}A9z^1Yv~`jqDP3OgEJqgv4erD-N@Swx>m7HUpZrEIFINfk2XDUNsj~T zb5em7Z1txQ*neNfXk?Ou>zq-?)^+mR_h?RTY5@4T?rXoUNR z^~I5WRt#J&>f>d$GO^@$!pbD{6$|#XvtG(Rf&HP?%U2=;H`{BO^}Bw4FO}L_Rbfac~<$V8=du4CH7Kc4b1c}s(iR}4!Kr);1SGem%`<+b+dBdo*w;L z4Sla8IGmQ>zln=^OYYwKgVJon?w zo%Z^zsl3ZR$lPtsx5sjMbUAaUwQfk|`YzBr66rHfdL}Y4>ix*XrNQ6#didR27vJg3XTBD~J^G4P1%>s2N5c2DJ{@>o zZQlF^W`7`={sB@FI|J5ltCIWMHaO-X&pC%2;Jmv+`53WoRb*n_8}z6V+MO~UWWxG;No2-rLuAHle`NHTa<9vC z>Nz{HD!MMQntLKLwk>RSdGtIG89gt#&&$zsLu73GN@Q$%@)noDwzbIE_U_2o_KC>k zQ48*Od6tDkk;$Vvwt6}DmzN}#axWy7a+g2gGMdV^F0uNxKQimrlx;4waCQD$0Co2-;6ve-m%@~HTCV(2Vtx)`#1+*U71+=yd4?auGtaf!|yaa z^C4$!yErnoJ!_|zW82k{vF)i3dwHLt_%(qUX`M|u2OoPOGGjM;7xHa-nq2cGGW9n; z;^owTI5PF$yxYqeyYnA)X6%+kX6)VwJk~X$jq53UkO^OtY!}1Br4VOEBeUt+8+l9v zaOO9VncJhIFKZ4=5Kv5m{kYLCPb{xrnOXM>GPl@1=div^e=J;E?U&PB64>|JOW>-G zzSQA$nVaoSIDRha@^2>A@50zC9_b2s&fdrxI(^rlmunffsr%qkiQgN$H*?tzibqPl zVe54I|XUx|FhY{mCTL@}*_G$qq!u`O5pf9EUjh$;fhuC5hz_*C&>J)+UxiT=Z0wmqYAG zEQgr!r?Ffkydkl=bKcXjT$A}(Sigp=U%xx-aOR4A7`Uion;tv+&m^OVlFRyjfQw)~ z$U94Jye4vCp7vjnE7b*d=>eC~6CbuD@@Qemj=&W^UmbiVagS~P7jREEiP4LJb>ytW z&E{t*7b}gtIkSGJK;{;k@#m9F&4)kD;`vR3;W3rR0*^IuR@3ktp@(6Z;95jyKH1BZI^JfP-3xmwaA}UrWA6p7==yLHSneFwi`9|ws|}IytMSOJ3(qH3RagJZP-loCr@t6kNz!?di6?g@ z*7@Pi$i$XQ|CP(5(&5Nb)26)S<;0mqk%==e1V%IM>zzZ)yy{;gAAW_MZHr9IY<=0w zIcHuM8GUO1#>@GP=laO#({Rws(V-(UI*do=EbF|#a+yAlsM`yp{GOS07 zBD2;!6&P!3PvIQ&pYd;zZ{b()*@npI|4d?)zm-_+_8xM1`m#B(WDZ59FCRvxFPHo~ zm!~f)BV*5}BBTG&$OPgUuev-@=jzC;xqBni$9E&s$BX|Od0)#a&cT;fMP|hIMaF*) zC6>--ycVtvzZ-f*WcqG@dSF%s-S2x{GWt#+{;Uv(ML}HCY3fyfJIOZK zSFOQrwe_}EKVP<6Y>h}Z{wFS9rEf{N$!=FW>+MEcrFJ#X|B=g9+A>?I7B<^Xds4mJ zZR7S$+pd2b>|wj#cIjtx`2Qh$)E-p%Bld*!`2YHK8`S4}_0u3*>{8Dk)|YSZ)T@U= z*~4P2@_;O|)6UgjMFzdzE$N-I(C%QP+hwgCdi`K{hq3z;)wNS~?bQFfRoh1W|0k;R z5!ML!Qo8qHRkaui*4p{`pczg#a5!9P~nMS7RA zuh^#GId~AhbYU2|U)EK(tA?*@q!~|S$ED>H>eIONLIdjGY>(SF^lFRRL)&fYFZOs) z_PAG)4XXc9m2R=E`uE%kb)TrVN7dezV2K9RNqrNqrnLrZjD4D&`^A zL*;ny*4QTAg6ua#kFgZd$a~CaJP~|~())vtx$OP19@Yh-pVx{N#>2e#n1PpID`vp` z_8GmqE!foOI(^=&aw6B0YDH_YUg0~$7}{apFnYAGJ4CzHs*SoC6`vDWfF7U$Z87T} zm#o>>LJdTxujw5;_W`}*v*iKRId1zy-%`)r$ElTZ$FG@t$l(#R@Pw}Tv^n(^NiZw# z&utT>?+X!txril`$J4iZJH!Y^o|do&eIwf5r`Onq==PZYXLg%PJPsjEq{iYC>vga4 znCf1^9KkZwlg9JdKBqqV%7i6-B+%2>C2Wp0m>FqyqA7Mhv2WJxLGK=ytm|~*IRDAH z;1QJhOz)T}_$c#wJb1#i<7UcFOOspGQ`T9$03V_M7lrG5HZ%H+5w@mpSmxd!n`RIt zUhYwaH4N={gr43KMiYDQ2%dyB)`iyaZ^jL4VQc!#T0wMT46*6Gy5>Rs(DG)ribvu7 z^hbMzpy?`I^=PO8z445CjAZ29l0F8HNY-Z?eWs2-(*Nl1y`u-8l=-I_E&TVyqjdc0 z%{W~c^5)gLhTLSeau_m^^|EC>7g-Co$DDLMh#AByA|n1yJgTq!GxU0$ z-eL3~3O=`4we6OE)QQh}lw@p)&fCK4iK9w9p;q@;*08lfOJtF|LnX<7m@QkRjn|!4 z+56R+_q`r{#)IE^RPk7iHmvMVNCUiyp0X1lDzZYe`n%THicz^Qw1l72XRg8P-Oni@ z_K;8Q40_hJ_V*YwW(zr%XDz#>H`mig@@y=FEcNabGn=+an)mjG`h9+`3-2~aoBcsk z>h(FvxOfc3Bk0Q?tAtYgC`H2**|3^>QOZc@Wzuqou3`*{*68B4#s|maD_SLAWMv}i zxsQy89^i{y@vwY^QQxnB-I_kP$vnMw#=%F<8~K$W7RVFcXM&T$B2|S66P+l~@8Rd`1$`PSxSN zMYoOjmU!oRtoM+e(nG;IyQ3axN3>7g7#z@ynt zjpzNLJ-5Hd4E)ZsE$qG}Xh@!We7wW!$Of@peSec801?gY=ow<&dc-DL^)(w!(CzDz z_HkIPR*#)8o=adIW>(s>c^o62uuIt@O&A$GlGnT9SbiZ~#on7J#eCLXm+!a*;?EuO z0HOyrB0|*T(RP*p-RdLq?vK{}&U9rbMLux9v|t2x=ruO;JmFE5VH0eFM>6w0TVkzd zbRWukdjxmOxZWEyC%FpyKA0mM*%f2WJM=kaN_fK~dJik6b$OLad{sGDcBMX#f~--j zk&Lp>R>qt>;69DRFR1*F)P~0k)+=`NUsLJC-GqA&L$cz6H zr&G?r-0|`8wb^q`&qT4LTk+UyeT<2>*qp1$H9TLy*B+Af(>WdSj6LF3d55oRK2Nw3 zyQdlJqmtG^Eb6g=al{Js41t*T8U0XOieQXGnpIrEIC!K$6Gm^dbl^0DdE~xNtRa8c z9C~o8`m#+DZm+aTrg8S`@bNU8SF0XcCBFHJ<*|^tRrme|Y3gG@yXh3;iLj<7J&7e> z4|-AZWEjabBEAOV10IE3mRargB8C!sw}%*)Rt@UGW9p}C6LZWoLd5IjzqE_b_^yJe zdB1GN`a03FDOQbVJ3Sa|mpt6-Qq(^OEx7`;WmnHC&WA&J*EhF+x zjU8j^Yf+katVC$cyzp6-<|v-U$fT%1)Z{9U3O?gfX6LgBKfv>M=sFnx@hmUR!HIK| zIf(wrcYW3qW45T}{rc-s#&`CQ9%Dn+MMj7E=(&5R=g#=ZBf+A#i5>{E`hLl|H)12d zdZK-NXW-eN$1;597G1^KK~|pPn@4_TGF~(B6p)B}?8@<|{1z!jlE~t@8_{utN_Ocl z(d)kOzQ-=|C_fdf+XWdP1L7YUvG3toi*MAL@s)5FV~z4F>RlzRZ_z4wTgYKC^}USe z7PLduz@|^C9%d!hyj52-_E-zesEg}~w@(B;C*EoBI|$s{BD*GDaIb4!$iFuQfB1vo zYaT_2!D!*x7XIja*kn0+%Lx!|GkV94H`+}+t7Hs(*T`&SEZx(njkU^W6;ivy2om%7 zOOCWv{o($DM-8q>tI#L+!)R4+C)Keg>xpNwPSKy^b@m8JjApd(mAa0^E6zJp%gpd? zvd_3QM$0=wZA1aCukXrz$5Yq1UL!t$-x5#n4R$7SQr8AuPu}T~JbC9sVJ1<#+ly<7 z%H)uYm1nWU5+4oEy8K+<{gf8nHjhhYT)p$$iaN0_y-rce+xLCN{-D(=^>&xqyHN3C zmEEkUa-&WwRt3LVX}_hjyLGDNKIu&s!AREkE4z=0&b0Tiq}W?A9;_AQ30NFk5Ig@^ zKl}BL=gD6GEkW9&v)h%u9y+7FuhqwUSsJgkl0z12dSqh<>G$zGW5CmW?Q#!HGtS4- zcLc5nbDyY!J;|l0)mPeMvyyar=BFADOP*QIJvCzVV-sxRGmf75Yp+$->Yko%}E}{4OCok^A+|lWN89 z0r+TmM&)zq@eutc-c{rZp9fsSn9)l-^^^UokCDeVU#a|LiWocb?!&oZP7qZ$YF+j7 z&j!tnuWFvG*NNo0afWbL=|;VOtJ>wf5})zY5_|%iy03a9#8Xo2U~KlN$KXm&*vFU+Glt1csSML9@5;#j(W%8sN%KkV0h?}aS$@00h~ zh(&lnij?@@y|Rqw4!+0s(;+`q@qXPRDQv>%efntpWBC%EdY4+;rS^QC$EWc@a_N7# zzxsXoW9{J9A|@mv`neT}591n<$D|YM8@|cOiu=g9dCdR5bKuka`kl{&e>yGxVKske z^Y|au24nKcIPyoa7+HV1MGHo*i(_!;)^0 zhutp;q?x1XZo}>BDf=kqv9C&>%zpgz+2apqy+nf)c^HorgSltHx{D^{@tp9m$`XHA zMbYnmwOnuKYm!cDD6P=5Z-ncQ&6d8V8az8^pF{lP{_~^Cs%Xj$LWj>hG1}Zu`6~(%;X8cl!0}H|;mX7f!Gixf(N=h~hEC@3Pd# zklcKt7HGyQ#nV9P&L8{A`kI?gvr<;dc)6FQ`0V>Y&zgLFNv9ZFqz6wM`D)}|fo9mV z?jdMf-*rx0GqFGYK^xWx-&5AT<2IFZ+CtWfTs=c$?SD9o(YYaG`GPW(uP8$yuCLNu zx+(Z5Pa&>~<>dL4*YDu62Bkfp=T>+qE7`7?gQVHXI5U3e&aQ)9HZ#iCaaPSI;}vM* zD;#;Nue@BvE{**JExILHwd>dKKjwO}gViUz!rSr@@;s4Q>H9A3>w4ac?|VkbIS1|h zwtjAx9C@gpY}eK!ugUdNX6`MflL~L~_>AUu zV_!zR_;hJTfcZpr#n~Nqgt*I-GGc$a$@iR|fq8UbN4RT3FOJRT_&n%Jo2#E&GF%yunUe_YikExeIoYDG$k(GUe(!P6rHEwMjO&lJ8us#8if4Q5z`I%f(VLm- zcJ!z5h{vucR;Mn{9`Ge^>ya?7zC+_=%Fh~nMsJk1$N$AA(q1yfKziAw z%Q&YYr*%K0mrsPs^nBVNKiGu8@c#352gt)a%eM479$WJ&^9Pv|VuZKGV#0_?I zKEK%ia<3NqyS4q)nU#zaGUA5EYoDRaF^_kvG!~p7Qs40rxE^2dZFcR9CiYLc1*4N@ zJGQ1hP8Qt`jA@Ei6W7d}LLZOck3AY97+ysjKo{Cd)@Qu^9yq1=BCYVmi2ED=(zl5_ zVzOD{34Kpb9Qod7Tq_!Wh=-ArAOEZ_yP1bnPK3kOd-ZS1NqO?kPf~mwkDa@9o3RGr zbrby^oqeb3Ud%XSA;x^Icw#nEujvm|?)!JG>=4X0RC7ttAhX1jmZ&r+8R&EaMuzyNpc&ue;kx{Kb8^S#H zd0Bs^%sq>7;cD*w`W@c-s+(4#M`T$)E5VjL^}u>c3uK9Y`a(oRH{WY9n!IwKIXA>M z&*9QcL`UD-;e%+AVilu^|9Ko{oIF~sSBsR@BM@`NN1d9!uKWqh`t0M}7VCO6O!4Q! zaBi?xr-`?QRrgC;fmiE?Pa=@_txs@ML zMvZ5jdyFJjpD3F$d20HSq$m0kYYfrSeF<+N_TVqroO;s<-9#^BJv{bGb}#O^eywLH zewUGvm>46FNHa3sf%khKU_ zmd0t~wRPDPNql8bpB5yI{M6}v}K^rmnJ)c1Y2>lJZlwysE@uKAfrwCPVEa5`)D z1-1QjJ1auWs34CC-8lOpVSkP z8T~sX?K8{g4kPc;ku{#PU{)zs6wXQ08sc7@o_0z0AU|r*HU4k9-$pAufp=3}Wp2@) z@XM0BT{C!nv>5ay?FjFYCB72uhUJjr?vL*l*92?&6MSD#eMETf53zeh@+LhGMwGup z_lVYnyN?_6j2O`y$vd5&;T8|bB%uVn$JK{-_0sdXYRM^^#)zT zjut!LqpLQl#XDk4T*19>p4w&Qxk)k&Y8kEQ$)@l=*Q4tn=>2v2-}|;Mw7OO`a>w+h zXl=JS_4()b)`S?u-NvoTE4RyQ@css^ihP!`%YH?k(x6?`V$t$&YEjU?SLxh>@?v;@ zvEFIWy7^l{=Ck44<7$-*+tPo8Iyf(3%$Z|;-h}_G)hoa6%sqzW(d*<}_$uCqACeyv zoz9iS7s9+F){N^Fk&XEEc$lmBD06#a9!c4!=MkgIANrLs=y%qM#`IItiBFGJ0?*Ss zHO(^5BaY2UnX71#avpX}oZR?*!<+P;XFALf-g{DG{EBSjA4^l}^IePQ z&)9?+=vh@=b7tZHZ^09d_20#Uw`qjg_Z*wMr5wSt!L--)ESA`~!^q8(XMIK^#0ukn z%`+5u#JEP0-G_TMdwN!Yts$!19z2G7*M1dOqT`Thg}Rv~*xbIo^WUJq*+zKt!$)r#lrerJ$pK)xAPPjB$D_V0L^PfB#!uZ6Yr8r>aOYM<50YT+KimEy(XUgMqRlKGrnt=Fu#OU28y z{w|HAZv)WlD|H`Xv1;Rg*6C%EE{AKE>6*{0%rtJxq$_Lr=k@nmNzvYr>bfS-e914> zKH1C5l3A)VWwL9v(XXk-&j;yiB!L!J>QzBySI2Vh zb(nnObEH6)2{(t&pni7`rqs9QO)!RJ5V=z zpg)?pRp&?&eX$Tapgk?Roy*}`^jfMbuGDqdn!2uzJ-H^>h1Q2cIqy-^fF#hG7O9nM zX%*WsGFRGldPN_vlnt*EWAiR)^2_>*b$cYaNb<{qrnEr+m+3EF@TVhmPES1B-+A176VJg|e|UC^=R)e|I~(Nd z{(TJG7a9+l0iVaHpPWw2!B~OPet_J$p51s}?@#f1#6EuI)SMpC>6S?2Jk>*{$30EX6Upn+UgLag3+vlOah>zX$9(4Wf%7R} zLD%X^`pc@3PPzH^13!70r|-t$FQ4UjK&z~u*|Wm2(y_vj(a~f2h~`9H&#XLl@Ej`r zOP|Q}&zxVVNdJY9soxUL*6QcFWRQ$cef9GmrcWUt}gfolc0!3F=QTGKOi)uqU=f@8mz}j+9?d_V4y!?I)-36NmceGVmnsIWZ<=)kxQ$ zdhz?oSdBc_cc(~r?tlgGH`?Zm7Yn4PI+L$sfpKZfNr0a(t=8+!`oS~##KXP1(od|` zhq2kBGPfS@PXxrzU#|~oY2U@wpMH2C`Vq2R{mJ`G?hiyB zbih0PRNqg4(mnS~6HZdc`{{GpzPhR2sB!5-g1+$ig`v zmZR16(t&$^9;FyfuhTt``R(uEWyC7x3_a-!*$3HAgK`-1utmyk8kEQXrvCrDXdwLc z+>H#?bIz;u-gSDnS6LGK65kcgB-L_Pz=I?UeAN0+mkW92yEWWR_fuv0nF`ws-W zc^y23cp@3@`+593(Yr(p-sjsmu)>M!z<<*x?@m+;^MMFY^yc%*tRenXxZl@GeW$OS z@%b)+k@@zr>=uyxqG}~7@@!PfmB|ZxY(>age_Q*iUsX=ns{HfHP{!SiuWDxSnHhGX zH>quQm$&K_yHrjP{Zp=Yh}gYyQpx?g6J5!P=55*m*RP^3FZ+^alHb{5rZ8WKPwc0u ziSN?EuUO0QJUkkIOZ!bz%Xp`s)3HX}uGe@7c`Z5hZ>g+XK1WX7pl?4TtNolZV$K%* zT=3h=EmdvIpZZ$I{P>3KNn}s^WcPmmOcp2jTjHvS=6;&ux!xUNHStx%=hFS5uf)E3 z_U5qwub>5H8?nJZsm6H=GoLv5fNbISX8rtpl}hU;1$RNaf>}QOw5iNSe^!r)2Xw}{y);a1UiufAgUVMA7 zNd3%2-wv$n{YivRzQ-wHvcvt-z@L4Y7-}DC#@9dbZj=9);`9?pRGWK7(pCk#joEb zO7kzB#Ssm-mrZQ=sw~e*O^^024LZpg);^y5<0X}s^bY4a1-&yTyvLpKPDu>t-9Zs| z&3nST1K|XSQvgoEJ9XZ}RaL#}(qGPpdUVaVez#AxaRui_)H)dS=usK5fRpvIw4nY5 z)lQwXUJUP7B-^D|XivL-)`XVGmu$XD`}FRx-m8X~+O1ces-aKsbcdGEu@c+jyvplJ z*P#8dB#zV}~{B*ZUcpNh2(e9l1|Y(OC6Jif_B@4AvXcJH3*c8>~&6 ztL3xAb-qKARiu2tXWy0U5*Q5|^cNN97e>YpPWID5iR+_Ohi>LdKc z;QQ;tx3aI-zBQ!()0t(1T_Bkg+4<9E4GC@(0r^e2Vj2 z#;ZZvP=8g|yG;su#py1dKdiq*1Mdy3R)e*R6!m`PSAn3NA})?tPp}1z5jU$4=fSc`WP9l4$uL2GU+;&HOW#93XBDnt`zD)9xs#lB?yUJG^l*wGSRLxf{q zdo&9(r<$ zS_mVHCe>gmbe!l{y`gvB&*Oca=fIGsw>~O(?}?%1}#{V zc-{tIP1#6~?2LvJGZMUrHGx@;25tq9y;z8Pd&Bq;H<{aLkH>fF-MXJK+nCq%iU`B| z_z2n;vb_h@661$?k&m##@`AuF>-@A`T)Up2T^%(bL}=Ze^!R?!l@@Rw2bBKcH` z>_mWxp7Uu|JdsxsMHo%|mWW2nj4gW8CNYAUPtRHBO{+P!bRVlnz`7+}vQv`vm`6>l zCG$fMCt9!`mC|~FSNnQ${8d=e=Q;W^Lq}ACPV~$pbKRdj+K@4Ra%E!Vhr>HWO)?5b z{n*he2j8I_d(eAdO=$Vpt5~J+L^50ELM_(Wpfc?0HpL6RU9NWGnDS}<_Gw<^v*qtI zA3QdGMt#L@^xeIZ^=&|&$J*Bw=R2cwY?N$J4}I12T?|)$G9UF_4EZ!sv7TXLt8Z01 zUUU5Vo#J-=N=Eb3cS>oNbFa_+o4kmaR*F5QheQIOd&LmXeEjeuJev97QO7-qQDANo zk9?-nGq0lo8*v(KkEicdy@zZtp=t7UkiRXtaU5+QSI>Su#IhL;QSb>)_9;|e%c&0ih z?jkAYIdN)ESE4uC(IzvT{Zra&^vQ-5{Uq5AoqLj%`|if026-&CP4v6e3-$-pOFZ)N zNoxW9b}9ZHQ7>J}{g!L$t&&5QR6kblmadFAnHqKV>R)26k87$EUt>L?RXoxH6BDW$ zAIdz_PxANzeWjLT*BU0H?%oyzBD-#hB&3qm72u$zPg8$ zbUo4OJLxmpqZQV|7r$NKQzpioBMYSO%zFCu?c4JR@fnS`pARq_(ik$A$mNL#)a$h- zyWj(?W3`1#65L|hR1!*A+3 zvDL|@zOz;8(|wJRrp;qlU?0ykYTf;KG3u7$3 z7tAW^pmxUnTesp7(etvdux}yDEo!_MBb`Sot|LCuOOtQXKWbs7aeY-~Si)C0?B(aE z=>}} zJ}$l&=d8)k0DR?TgwvJB=hnW<^c)F4ugNadPUQA}V*~a)#4=8kko6ImA4ZBeMciVo zWUR?(j?KW_7paHe!$Z#?RySrZd5>pUtVHymb6k9%(PJk_ysT%*pWIV?>%9Pa`v|Dj0_X*D-%Ryg84Q=r()*jC({2T=D;}nEG)X)Cvdy2Hr zz)yTH#G238Vs}C z7T%`^J~tUR&h8h4x|j<+x)Pn-9<)GTlb;h;$%@dB@pSt#{`7*m?)ITw&zu;||HIzB zH)(!V_o45X(of2#2A_ju1HQyb&T(-um;{0jvP1G0#mzus3j)MBPE}N`)(kVWrss+f z4#?9CBZOddLx6FFrMGt0XMcOm{yk4WJu?y_!4%ci-Ouy8?7jB7ueI0STkE+uy+6G4 z(c*U;5WTg`L4m$GGroN+R4^ABft}AohFLW*X52pgAa^=Boe{^HG?rWCo3e#a%L8G?Kn?aF2>r@dk>TXCpcBro~d^ zndN|uP#C}O%R|93f(Jnx9+p(_4M95R|Bux{Smx@ z9`P;tax?`PPkL9;UeVRDzR`9dc6Ity?<;OZ1JrIU=rijauQ(cmo!sV6o(AoDFXA-b zF)kzxUN4~* zT8oO)D_w1bCBwUAOs<>dBFV z1}DXyhljf2%8G_B6%M~p|36*teyKkFms*AK<$AiSv-WqaJ5Xt7{dcN{zk9q&O7+vN zy07--nR-V3m)e`&{UVi#sf$r-^Miu$z152~4Oxl$sp|2IwT5E1{_5S;PmRByu4`6$ ze71i7+gLgAnY!}n`s97jSa0z+)#Ck)=8=uQjaq;28!f7q?kdi#z*BeC^+oE!)WfSp zvP)+wEY(rlRV(AReyH~bNxhs3F%@UK$8D?6>b=agwX9)Mb-JulQn8;Zesy27(lRw> z>c(I_RcPAD-Z($1E9#}}Rqj*{l~?u+dZqp^$AeS8QP89&SItr=W%Y1cKB^}UtB+rN z2adN_->E@PofrOS=&~X~k8rAn?YZL-tXF)cLKB`-^X6F)Ys)CpPAaY%>;LrOm-|fJ z7oAh5nSB@3G^#aJorp(N zAi^GQU*97G*X^#YQB1A(^0`!DqV~@Jx7zO-kgxY-+laM^nATyd*f0ZmR6?OsyB3hp;P z&ikb>P38=lmug(_ty25N`VZemG*35ajKZE(Nn}&qw~Fele^N0TET{VO(c-yB>!}Co zSIsTV>5oq8I(yXC5~+W7+)s;L%?fku3VWmHtR|)}X|3!WaEk-)YjLjqG@#Zqq(XIpx{vV*5!vR+Vfj=Vr~PHOSsj zQ)izHwW)Tb@cy^!o&Ic(3RQNlyS86%JW;=T3{8x59XnaI0{?bj=~WE7^%P5hYpvbD zi)3M*XaHX=z4leMdOJ2|b3YU-#Yh}2-77QfDYHMQYKLjL6=Q zs@C^L&AS~lu2oCU6G-jug~F2OT-mSZ&J}L5$A`*zE4$AP$z~sMSMO{M7cU>L%&-=C za+EV6R91REwkfvQst@*43u=MMGW*o)FZelGb@6a%Y3p~tSiZ)W3x*uktI4|H z&(>S*X}ys*cr$jMWHD)2uw~7eJ^4Z9O0RPlnegmBS=Qn+b^X2L|6kOntn#=pMzb#c zcWces1nUX#?Gwd&HwM-(Re#n*;ghU_p`W9RUmNhUHFlWkm8&pK&QI1*uRo>5oY2%Y z*6a6ih%?uAO7lEW81{Gmr;Xo?=^TxgYs*|@$;)m5@?;nT@Xr}$Dy;YA* zqV3{>`_2!ZJ5xMs=a_kJft`EaRc}4G^Um@29pkT>Sv%WYslTggamp_*8;|z7x860R zc@?eL8*s66Y#^COg`9i?%TAr4-)UyH?sh@9y)u7l+Job9;-y{_rw5uL>%;7M_}$TB z{4gGX{cf@@<*8#$x4JVPUS<2qJVLb3E)n|3I*qRA4}XX)=9=8tXK!V#L~sw=7msE9 z=`l+CKJaPC>vEN8^Bn7zm2lBvb9}fWUJDtAF>4Rlz6LnZWW_1PLI9ss4 zKD0!1J6s)BtHCt*d1$_Qns1hvCTAqKjcjUd8!u{mk0zQcVNQdvS8-0v2ZQ)G9zo&& zGR1O$H|sCZgKf$wG{G{T0CiCb9HCkGBl{@-v~WQ?gJ;s$nDv*Hc;X~d!x@Mzd~l zxnBwh&sJ|~EBl|$6{}N*+Ky!}l->u|{*%prY;bHAKP!8#tdA;|Pz&>v0;@Qm9e6rZ z8p|$JG#0NU_SimGb~xdeSm{Lj&E1^$3-Y<^C#{uJS=t+o{E%%scB8HFMi(x1$B*mo z+~15&5(T3V>PGL)H!s(noSb9-{;c)9pB6eEz`2Q1NEeRZE4s3F+2lkjdSz7aI?|jM9$&(bpK&0`%Kx7anl0hlFKV|e zM^`Lci2o8#hOFGK7GV_!!0bPiF0t+^kq|C>e)x}M07jBQn7dEFQFfhLQo+-|dYGZ< zez|aMr%iL$k`CebgMz4cs*Q(Eo3I0@62Fht_(91My+bpSYjJaYK@_HaVslV15p_I; zoZcoM5FZw`kLqnLY2A0+hoAHqE&I|jPiNQDv`N1jop`vt;h$AIzR}sMlHN928Qto8%3*BspAlareC?bRB1auz^Fw&cBx@T4AH_C(J0Fzp%* zk?bh!SxFD-9((U1VlVh;6V~3D5a=1MNM6bbHZ)B3zmi)BPFddURDLwZbeb$JN0K~g zQ!jY2UrF2I^h;h6v7qk#>G(4h^N7vAHGFk({JDCUmE-m1Le|c(@^}>_z;pi?!leMK;2Lp2|9889mw_#-@gdrU_;Gy!WXeL}&VS;vjvI z*fQR=Jr=};VziyX59HI{7EWWs*MSCH?#S1rpR7ff!=Sy5JXtuSrU&)JFPdkiMvA+o zIljYs3K!q1H`8kC3bEYgx_G(^T;Z2>nS(pM&{NSM>(bl%Fh-{w6-V-{;{W%l8AsJZ zAVGJ!NuKOljW66lj%a~o_~Tnfd(!xwE9VRGpORNO884vgUOl5#v|ZKrtb@KXyf(Xz z;@IiAv68n2HMVJvNEFRR*T)Lk{T>`NTezps<%}i}9Zj#Bm7pO}Ejk~a>E)l*Q)n+M zhwH;RkqEj>-*|Va0iw%LRcovssI*28;}s`7`i@U0UFM9|a(|x0XEc`VE)NpkZVtON zPYRh@o@72#Ps2xN6Tux#7hSl77UxDcvoG^JlB_lljQ9k%krwdVU&YC6JA-%Ok`)G7 z@PSWwaQH`7hy_hN8}C?q;#Sgze~#)KZb@A4yFJF}bbH~)az)n%s*|VntO}N^^=y1Z zl8S$q;{=UgPlN|TZS)~?IFRII=au-RxF7Ga2q+opI8#@XL&O_6MPKh2R`{LuN&D{_ zSjA)cp0)O&K0b=Xp%Ko8zlKR(9-oks=xKbzzi#cO@8+zIjlw1L)sknYM4FjMjPh(j zY; zlUr-8X9Rfo1C>dAchNFYFYV1IiWcOdqO_6FHKdnD(cZQ_Csy@tIMhCK&7rhY&-L4QiQ+5k(I_$yvgeR9Lx_FO#9*y^LSHp&DwHYoXo!jSCQ@Q@}%F3p;UUgU2 z*d#U-L((ESQ#u?-E0XGXJipFkd-|9&pD!9Ncd+iAAnlWAhebJcbEN;dGTwHYk$0b2 z_BZq9Bh};7K(WvAi=r-8)4YW2E&hJ2e(mnfZXTXW>CFs)8m-iq*@t?4?`a&loI%g7 zucW#CAsQ?^NnzBzt_d{!d>t zJ^!@cWbd@Wr=;EEJF*W=DR<*h@K?a$u6?iQZttW1QSn1y>>OD1D$PZcvS;yWGK-qM zpW{(^PelBk#mvLmx`xB>yYbIxVpY67b6vNF9bmicLYXXCPKdoxSF&%NXvDa*2k#jX z-%Z|i(+U~w!SRUr9Ve|2nUEi$=W~wv+&dbMNCaAmjd)hE?J#WDDD-1xGIpAoKhoZj zwi83N+_}3_S=SenwT_#yg{E1TVl-MD2sH_Bga<*DQPxjo~a&^hW znW^NDIDI$o&po1zmfxXOyvmYiYa*{azL4-k@u#52s<(*_a z;vvF8d(FHI*;=D}qW<&mWIv4>4`{EwZ+x08e|&b|@fS>L^CaetK~6X4dGmaN1N1s= z<{(mHZ%+}0ch@njrEd#Lha+6ESoZ*zI~6#=)MvZz8?s9)4f*N9dj%NAsD~;G@iOpu^>YAEo1Y&paAm zJD4@Xc%{aa`Ec<>b1Y866QZBwX*S1WFGo59y-8VSPxwV`d(xIHG0AuKk=}82G(zLF z_s6=nHSQ&6G{0mGn*b^MZ|~>z!~!u(_n3*4O!)oW<|YozB)o1IU?>4?R!K+ECys z+$|e}EBqQY{}lal;*t@ZuQpKExWm7Bt99`+^*r3r0kI}zZaG3@SyfBd>Irhvc}L?< zRyf@1EwpcMIaHNjh@8tCY3E$Q7w>q+$#kDVr@^UQN7tz4vLS zv8YqupeXL43HGc1rZ!4--_gGyq{rqN0{CHl{v588o6;%_zHPMmgHdmn8AMt<=l$XW zoJk(_M>4zvGucNt6o*9|!d|;?JZ-CdpMFfDdvUM!a7ZX@re?+`%Y04fiF%3f5*LR; zun~!Qq2!81jHS-Vw44ZW8HpbiWV|LE_SNb$_7lVh)!Mebw%v0FmSv%nu?!#N)H-rI zwcSqj%ch7}Q4SB#CC`o)%v`iqFp5AdZwLKAT$V4mpw|utPve!d^<39rk`WNgTpZPSVhaNUZNiHL zS<4x$M9;xNbRb^A5%H=(7_Gwt13!Ftk2Yt0SnKqI>(CCI;jy$xVp^;6cV4Tf=mU47 z37AZ3iM9->%vM_ASFo)+ zgRahdM2DsH;CS@+8~usWc-{ZhX@!%(ntU<(l9gNaKeZ36Lv)joo~?Uu8DAr@1q+qv zP-}_%`g}dOgx6Gi8AYg?UM4T4rq+`*STTI(7*3d7FK~v;3QvYvkbonkl>| zYX|q<&G^}u=&_EEjHUV7xXr1+&&1a=bzIgPYbBxMivF*<@Ozy<75$PjC(znQ^CM|9*UH?TcdCH%Dw1CNdM4 z4(bhdT#GrW_`;AEt+HPFOD|@nTxssXRdCK~!Z69i5%DSDrB@H&T4N?bT7bjLb(h_D z?WpeReePtBE^rcAk8VP3Fh@5;!eXPr5BqKJX5~XNJA2g{o^?N!_@cI>>VcMN&!05C zSWsx6T@_owCE1?4ud_vFvY#J0aO)D#(%LOq#+;G!x$#6i8G1)O&g4T zPQe?pt00t6xr}cX4rJBvNcWZZ_G+{uAohd*wXKIqH#MPZ$w)EI zn)G?B?%X=&7&`uPJwuu@AAC9`cv+brC0nz-YxRESX`e5dz+JS_Ht6Wy;Cs$u!ZEC| zJ|HHuFbbQ?UTACi6q1KSNuS69RkrswaRH{(;&o09UTzQCHb>9#c<)N}{#-rNdKEt# zzpOg#^z(w2l;=dn({aWRlaHmJW)Fw;-rW6sJM^dF>P+SGbB_1A)ZIT7CSJ~re8>+A z*IkY5RNj|1raTCH{)N z5PgW6qnDTCcr)|no0waUaqpN{Ww+YTj-L>oPqaRDQsf(bS(XRNPmK<}`xwtu29H$o z8)P3ID7p3?DyLd#_5ixKc9h1|o`8&IAfDFl&5fxsH>G?@C)DFF#c$ozhn?53dd_;C zKB1f6-!%dB>(>iUSIUn%JD$T?sbsLK=R#dq5omRu`CquS4#+(4UVS@XpRd<*d-a^z z;U}sV!Wq>vLhd|SpJscP>hsRd|6RXkm9N*6Su3a)yI$A_#Qb*e_F^vFo-FSf`zu)6 zWuJxYHJsI5b}jhRjd$!KU?-Yh0cJ0P?D*)s*gvSgddHQ1!anPE8A+RV;?B-Kc9h62 zFn?6Fjt`D^or!HNQ%?c= z^qic34M)BH(fQiv>-}I~<>j@4tud{_WS$mob%Jv;4vXi1RR8yfm&~)VBJlsI-&DF? zIBtKhp8Q5Z=q#OWeJ^{F5x-DlvL3(*i{Ojbk0{Z#zWH61UI}&Qo~# zc!Y^_VLSP5y4>4fF=AddZSOw22D+m`rER-8tdGE%tzW5%m@ih1oINx8+dJ33sj`~) zesA<2Xp#-prntJXk(>%hWZA5GRj*_>mh2w|bKz|qx1C$}OV;~D8!Hm6qD(OqrJIUsU;W3^ktKAhD>)5zZ_mZoP)PW8zPx68hF5lfPev`jo zn|T>LB=&`0*U^7YZo5`jUaY&@MjgJ0c4&z8pU5=alJzyu-6su5GY&%q`Ih*~V&Hqx z?0%kJwr-V|HRh_>t?#^4^kL1}&cCbPPgeGk5s)oc2;yzK?tG~JYw7ZcN$5{&IiDzr zVmtS%O{dzR?Na7Q&F|D5QZXfwq?&Vg*Nj6XE}0F!MP@AG%hFBYqNUU{fG0a;-G5)a zFSOFux=whdS~K&rguvcWcB+UrbB7Mygrl)x?C~M)A0GTa_32L8>OM1Szc?}6MvwC7 zZxtl+Yb3=T^huUbhFC6jQ|rkOh@!+3cxtaA0+PjbiNk$#WAyva zOU9oWTJK6xIxEd-|D~R%*-yK-$uU;n*&l4(zOZt%Ilf_=-c~U2M_wGT?H1p@Ys~a6 zpIU#%YV=LoJyTcg4rOns3)Nm?Gd7gOE-@gAVPB%jIv*pu8XEwrSm+BSBfM9B&V~BR z`{Bc6Wy;0!eZEC|~5k zl3(k0-#_^MwD%(0cBSB@whtX^e9|Ij7I*G1@#4@2c+k8fFXipUudZ(HJjBDeH7JzK zZsu&*K$fOYtUR5&ZyswQkoNep2i~+rG}+mD&iTFVG3}J~zh2nDv-_n-I*#KJxc2RW zpta9z`Jgn@gNy4|hrK^r*Ea98XLs^WqGdiKjn;jT=Jpm&ecB1*G z*D4;MdA?syq~E}`TR2XhK?dP`;a=2h_Z51Bd^S9p7oA@EGoz(=t@sZ|wYA4v(e0=U zO4_gM*g(GNHL*LX(Go)^r#fvTzEk}vgW4A3sQSM&D2xlw7OeWYd(Z79MSI=5&$gGe zgSkbq((URkv8L$MIL%4K2Fb~qI{@4A^S0QV^`*zG6Vv9ppVb<1;#&;=P-RfwSA3LD z&Na}FXcBJN)ph+8OoJ^r;t`8@>^5pA&7AVI-m`pC&jZu!e_kscK2vXfsCN5tzVM&b zeq3LwnM$$VZdJB_zW#r%K7FjNe4-*jXYuZqF3X)yje8%edrpc5#aq$dN2}M*R?BG- z29`O8P0883zm1bG6ply-pL=Ovme<=_@v@dr&lqV_o5gSC;jx`_mhy$_XX%aZR7H-T zo$?4jT0Y=z?W*KNZTnF^GCV?3oj4A~uM{TRGs?H=Ih?fit@AEb`};Mz2`{dOyL&~8 zJXOBwNx1H}g@$@*<7O$FJi93%6J2JxJ*-cq(iz1sS^X&Um zBkGO6(CvtZXzLe?kM!T!IeCHe)mPhhUYcjy7l8fDo?adH=eYr6@2x0a!d)UgV~eJ_ zzbE+uR^&O|M&2o2dHIBD zk@ia0uP>!zd1t-N>4p7SaRpw;9%v60&wRRi{XqTytKy>HDQ*3kAJ^R9v%&bhu(A)il#2T9($7Y^pduuJ5_tyqbZ?`D2R~#r>rg7hP z?En3CeLkt1r{}ocN0<>2jdvP7HlO-;rL8_$ddiN-(OYtZ`$LC#HW`ssU6avhS%{=J zZ@HT1qL-p~BiH=U^^9%K9k5TiSs!yZ@l34#;%CX4qA;KBM}yw3<_Z}hKVZ#D%TEu; zKQXk^L*w2jj=hjim%Q!PQ_=2rZT_qJ{MYq=x8DEU`2XSKt9EiWcg0^Jm2VqaAf==lKUJt~9sS=M5~aUv?HZ zKj`d4JGehIpquuwpV&4EI275Kjncxsq4{Uk`qID2D06y*kK)Y zKU#k`p`K$p{h1{^IhBAku`I95$aXX17c|kL=(G-!d_+ZwyT`8;9(Jm=s%et~P zGxm{GT60S2?(h_1xkY*8Ok~IoCZFl8%um=k^L}>*rQgjASxpz4C6BdiIaggtB*Y7d zUnyVy+Nc4GHQ_glLZ?U3I))!&q?>t&&QBPH2s2)EujHE6l{E3p#2}}y*pBBO2-uxv z{^ZR;aN)R(V87doX4~|hL;<`fF}ElAG|P1jjWv+jOChtjsV3lAd}-()d+sOFLc_OW zH*Zz|FPbA!L(o~?r;88W!Ku#5prx~`zmqG>vz)x@M24O6hdx>K_*^~xUkgH7Fmv?_$|!`T5jIbi*{>|gH0C0dqdUfzGGuF&@D?erN0Y_Oe_WVK~Q z&EbD@WT?JYGwHh}HP`B|8j1^*zrMcnxAp(YdgsQt_t?(=DEu7MGudxK4xBfxV&H4_ z#Kf3+5|+Yg1LC;0Y;Ub?!b`sl`$+13ahrE}!~%Rp)vV$jIS(0+)IuhcvnmQ?j+M@c zd}rSD^_j=rF;+aRqiXSH z-HDbm!*86%n0e&vH$#JNdTLqMa}t+yFF!16NMJ@hr#^(=?E9R34n!y0ex~4^T8lq7 zXS%b`)3(^$T$k(=i@=JB$HWS|1JCh0wFPV1KP<^I=hPX~OZB7~!rSAG-q94Fup!zs zYlmylcji2kOGMixHuMUcsS%GK>}^rQ&4Q9f?l~UwOWG78`ITG572g@3dgrLro};B5 zXfpTp?V&H}i>oyj8S7Y3P-eXV-a$?IS=fh3w8tMe$DLSlHPWkk`+Pm$mIW-40eoQJ z0p5ID(Z;X1%u~U>S>v>xb=l~T>q6^PsG0?RZb-w`!Efw6zB6j{gP*LB6xScs_f#i{ zNsQY(;a+`C4OTQF$wJe|>pEOqDQfuJ^-Vmm==#=nL?)}A@ePQ$P zA#1J9g+01@Y?suC#g2cYEZX_Sb#kW0;v09KWEJ=7eLE{1E}qORf!1fM?;Y`$oUju! z#9)cIez&f?XXp3o>ceIITt|PE8n=pT5>tkUNx~*)<2rgtHv5gA>$CkdpY?Y7l%C!4 zVVwNKSMKT)yv%lge)udZ6Fp(SpL|Z9XJ)-WP#%idPa8Q!fcIpt_V%JOYm{r5)!M7J z^mDeT5n*q{_e4je6?I`hK?VN8cTm)UgBcBKNDO^m)CW;8lONcnpV;A2|s*jhVIh$nbH+ zg)Cubz28w!#)7cx{F0+;ZT*>d-p4cVx{qf_^1b@{{rh<45ANfcKfI4;{`uBtTG!Z> z>yeUPxu2YtG4rvc^lV}Ougr>JIfg1bjr`?+g{4%&8rRN`qe)#SnjX=s{@}{1miO4#R zTgLY4t8$%>W2H!N$REh+=*B4+bIqqn7Cp6JynDXx_>4B|o}ijP)w#=d*2?WywI!DJVPaPd!uXU04J@rZH0TfKvW z7j6y`6nsv;vaEmV0YKs&tsh_fT76e%+H`}x&H960{m9;AMkMxu?&hT?uF-0*wg$^- z?HKiXk6jaw@|Wu8v5LlHS8r51PCVk(q?R|<)|^1+ENH`2^P?6GZ8q$Qit70|oAl-N z$O+KqYVG%`2R4cS+xat5Y41OTclgBFC+3gqTXuh$QKq{*?abq`m$c|I_Dlqm$a47^ zukaDA{5k*QyW=}f4{SfL zE2(VkJ$N#^wA{hLlcGJGD8A_`ZxUQv+Uud! zfV?$$&Kg(qO>eBdlh~du(fQdym%cGNV-PJT(?MDi$HQEnkooByVY231=4A2(U7g%Z zbC7o9|Mz-??2h8S$f3LpPZB;83(KG^_llK;rq#?bzEsqgBfz7iFTJZ~%*-Wk7WcGO zuv;wZ#Rtv$ycdq~Xy0Nj&R)UbO+6av>=|sdt?MG`*8Ns-uu^cS29%cXmMi4s zRGq1wPv_R~5IYxL>n{)6h-pl=M9o)dArFtg^>Q!njQpO2<@^S;G+dyduk^E1V^*DN z$7Q?C$a&zK-NA`gmt@`l+XiIW)yhd$u|GTWg?W z>u{;u&MPNcyjpq^$Ko!2ixy+c?39o(U8=jub{*B&)_tn?m%k@g6n}$g855rtyS%x1 z$ldCR$LUmC{q>BfSr5K$PPLUukq3CI`%WFrX?X|LUoz}}IpF)7@p-qteZDdQpDEbX zG3~BpEZW=6dAptcH@Y{69aid%!_f1!Z!NaKa-p~m&rJ_Nbqa3WwCKs6&gW0wk4Ea9 ztg}jiEUsrxHaR!*Mjsh7@gF(P&ivQn74>?*zWFwuPuq&%d);U2N~WHnqorg+Vee!F zh?4IvoZ;c->Ms|cuV0Z3`f}yMw)6QfkH>!1JkGn}9e$f%8~2->-n+NN^L%CDx31H0 z(u&?@NBa#i2bo)D)cL5(>d@H0*~a%5{haRWYxnQ#H~rx(GfYlDaVwijbi51<6U-GH09Y zu*~YOrWJj-q~EUU=9;Z=l_$=c#J&0!_CJa})N9g={O zGeg(Z{8i=1oPcUYP0ue(xpq2~^`7-mj1oPn`=jF{g|YjojN9}?)%vTPHXqc! z>UQt+CD~rG@6?dwF=!)*c!k zG6Q|?xVN5_k(FF#e$5i$z`wi03+8H4u?O;&y(P?MS@%i;pQv}HOlBVG-fdra1Mvd< z%}ToI$>d}^F)wL3SuM9YTZPkmog4W(7}Ai{dV7^UmHmf_%g0jD&yo)_%yOPtO)m40 z9a&^rW$$kkwd{7{+4ILXGdhco+6GByd-v-8wtO${FsGe$fj8=@Z5d#DJ$MF<=y!Dq zne)SQ#=AFGE}MA>H+-{3m-z)$%N`!dBdQaVVNSN#jNe|habdhK`}yWDB}1tv&}n(6 z{${tAljAW;xHwl&!)j}NS2xG_t-{XkJ=)ra_wBu=zrDg&&s@`t=;|wzBVw8yTRn@*Gp^4^~rkOAM{Q4IcBu(I)J5z z4pU8Wnkn|5p6sh3d_qrVi6(%p%?u0{H2*Clpsro1=o}HZk{^H3HV-b zybUnxC(qJIOYE&%m%HETih~|kMtoAX^`XXtzb!L+RK0g4VAk%$t8PeGOZdZ6(;8f_ zZ}%rvZ7E3eSBqxdR_|NVt<1 z&I^YZHob#wxMq#aTYjtFZYzXGMd1f^FLdu}cG7PaesAzqb7r1tjX0sm_0~u8`gZ8> z(#g69J(Anr;bZCjPN=rcjm}ZskKM5=Np?+&=gnuyURHd~c;@Y8$4gDV-JYU;(DtNP zL+9eJZ`TNDF6-EXS#lNp>=d3eQ=gdca`k7&+r)p%xRWHb-%BRU!kYI>9_ng+PW>A1 zlAhPX<}A5uAkDm3tWst}a4{W8JAAEXA=aO>yGCZza$eTX@!pnM5g>X|G4TG1t!4c` zSC;J)$8lD6&ii^nWF|-qd}};;_xiPuRYWK+sWPVP*UZ_NC4YSAOq>A9>@K-q?K%Ne z^eo?IWN3J+KHse0tHbJn;O|GpYTmjwqOQyl_o-AOH1lF&wTpu?Ih7)_QYuVk&Fy|* zUNo^tFk>f172!_%c;>j@IhU9ddD5?#2R=ZU`L1mceyPT`IWBKZxMT|1qf|zyzS54i z?IbK0Xr|89jzN2-F*AcN7dBYg)N&gQ&wYuT3UEUCV-^2j*u-n&-t zn3?YMQy4$2Hp zLy_~&nttBMJTZ+m&p5GHpS>tl*UZypCiix0a>wuoMmW=-s5P)TG4SFsesLEmlI@E2 z>GO1D%zGWJc9s?J$yCFIOqkZ+K1Qu&e!Tts`>Z+dnuFIn-w{7OQ`v3OP6A|tzhBo# zZluy1exI%Wd*5a)TSeOK&1L%zay0I-=%G(e&*+>#hj)xL@WNT8Ml7`p!7=Twz0L{AjAh?<`~Vsj;Pq-*`_bySI%kmNJyM#} zx?oF<1A8_{emJm~8W?=j8U)tpS3AJKLssgD?RJmHXO#xdYUsf3N-#(_Se@uD+^Re> zPPBrD<$gG^=NZ}gx@RxLY1z;toUR??=_;nBWJV|VS-!^1&Zut4-tlN?9N~<{owmEK zOWWBcAwEd@rO#(R%iB01t6NB0&fl4oxlpaFpBB8tT==SS%)3`%*EllHL;*OdcW)=d zXKT!$rCnc3O|Hv@ksO;%^6(VA@iuNqX_M=w&;+t?_ zaz%P;9y?nj%2|WPtb$Ed@sEaV&ZnBIjJe^87Gs@yXTs<&_(lKb^!RD;3Og{`yKUso z^x)`2kfLTJGu9@Sg2s)+;+NRMy@HfH+rJmD2V#DWC^Gv^i$TLFbU&z3@_~}loK&Mf z^;5U&Ia2A2JsOh+M{l~3zoDIL<6ZuqmZm2FFaI#Of?gx*pfYBhhKK#l$tLldMEQq33u3 zc*IE5?6Q3Bs{keyS=r5Z&@+oh((SfM&Rr#mFRk$&9BDzj>l!Pwl!+Z$M+KA9f^2fs z>JC?v#q^#tF4x;`PNK)Bw*|`hT6%5oD)zObibUmE8HuXo3(vGq&|YM760h;Q)f)fF zbAI2Lwr-y=r<2h<;W{!gPa_rWJC)VX>JApp4_ZyH0 z+&(bP8JVB74UhRt+G7cEKM4}U<}|ej>;BdHaWkv8z8GPLR$ECeg5DgmiOG!UK|u$Wd8NKnu`9%Y9xJT zH(he_3H(owy+)p00qnH6TQRJNSx7@X~uZbZ8-tU(;368F7JJ6qP^+iC4|WYMHcVFZ?pN0#)jHCd%Pt22XBhda9mah%X&E<;qkhUEAW9_ zRP_FG9HB6*@{r*nwGoq2t>eVPG)}w}mOyMm0#|ohzEt1IOEL;mGwlwk$L*P?v}|h?Tz+N15$iaq%HLhb^XbEyfwS!pHs8+-ho=u}l%!{Q=3Z>EH+(c!7qHkS$pZ}Y8! zac5&$xvCuzUZmeA->1)6%~%3Axe3;THIT8U@t3Te52aF< zj)yX;!{bj64!+CCV{@nd&<{CRmmWWmwD4$x-DuX6;N7xN=nzY5eX!?AUN9Le82$t+ zY8i#`;Gr4&vbt=ir}FM=$4}wUcw@;lg;&zDtbl!1z18P)iXFofq#$q8%7L!6*j%fn zC1W@@Z~`BZGBzk{6_V=+XRm7k)QEh8AW}h-;YRu^v?h_PBu)u^m)26>mkJkP_AXk& zk2Yuknmq5jl89HVal5YKuJq@WEBpz#R}6RoyBS`)6rmTD2x33&<))OjO^Fj;I&Iq&cqFL ze4oTKKOg?-6LsJFaD=m7t52|(5%sy@KQ1hJN*j&u=rnporYU}Br1j;o*GzUcNnRzZ z;&_-WfjG&@9XKuCefXc9iLZ>a!$*OmD-@$EgRj7xy++hVhFd_lSMQQz6z&ylcraJ8 zw?1!+ZkwZL1!14Qjub}gv=qPqkA1i1)o5%M0R8lMP`!%+;yMbxfJ;W48)xNq>*oZvlIT{a#+r@|Mj^5T1&ED+^gmG$$~*?X_}utpRsCn4q@M_{kOG>6y~ZK) zxl3gm=o@%}|6nV2L$u&~yeb&x6Xad-{P`g-;ljkNvGyX!=j%Ckjg8%$ed|n1$9D09 z^xr2LCaakp!map-&YOA|H&0jt-+Go~DJeHgFXD}xHU6V&&6_BdobttL3uiB_;%`;; z`0v)w+s9x3*Zqu8UYpU4AbYtm32%6(+m04V6v`I1C7dyCyq84gEX*8ZqVTqqEypYf zKW~|rxKtzRxlbID97TIPJVP@9(KW#)PKq}wqqDjL?~Q^mS$sGnQQD$?yoU>UmSQqI z2`ig=vTb&7is$eQ8>vT`I~0gbj%S#&UJ@~6x83_H`GV0d@!kP9tA#r{D}!JV;f#voSX zdL#PIGtL}e=TU96FPGgAjAYX?x<*QK#yOn?w{nTDdOyA#%;jX&Xyi!R^}5O~bu0vP z$w9|9EoIhuzVXhdM=83Zfir_g4}vg$J-(Nz=o#hcz3EpkG5Xjs?%MZ?*AnSXZ*auN z?GfP`l%e-?>H+UB-rLk9=L()^%y_2F6>ay8miCF>2tT1As}pX4OHai{XJo-JeBvs; zmvyo25d{O@@?7-da(?%6wYK!c*V~>kXih$#_zETQEZJK6uK5l_(N(B~(^*bey+KFB zHi0R7u;K4Sshg4aGQ)UnV57BdpwNG4M2EB|0lOeT8<`I{p;zb}^M@>6{N8Ir?%EgF zyx($gV~k?E#hPB3k)mk*!lbQgq4VwUu_erZh~ z{LZXVxBxZTES7Uw1D5yj0n8?D2AO>~GItb9ND9+ZEOmIY<1+XIyIx3tQ?|YQ#Im@+ znBg>DiOgGc7kRrht{ZJU8df)!C2>Y#m#0TB(eUR_MvqdD2$Hq!dKW*Z}v%$x+^-Qof zEqdbhrY3pi2Rbz~-s$FuG=uQmBKtu!ymlB zo)OBGC+gXry$jDLPl1=^PH+l{+osKSojSoPuz}OIN6Xz{!M#j+m z);+c*NyaB9zn}_VEnfGGCBrB9f(;D6!q+ldI4UUEmq>zl=NM=ayc1f@agtP#W~?4* zFfL{R$bcTa(&O4ti_!BL%yT>f7{qS(jJn2 zQ_*ezr_BH1ip3-7zr2IPmSc!Ku=-+ezRC2ezFVKK)tkXlxDKB!HA^__ zT3wsj(N#gyt5(!vl2dyWsOz`Z(wZ&ng;e`%ORbdJE?&Bk&}rW*-ost%C&oQm74DDL z&wmpdM&33mgP4vX}p*2l}hF$fa z2wWS{koYVoCWkxPCb~*<^55{BpfEIWk>)e8WWD;Y$R(Bw|SZ%mQL(24|iZwF8lUl;|>Ztj6 zwAO_@TD-Jd@}e?3*04DE)0swz}+WdSt0-7x_7y*dh@78gbEY8txHAP#`wL_rjgTF ziSpQ)|1d@REC0Re2I4nLT$ z0E5N~kGwRz;IrJmk@P%x&ke%c?Yi16WK8UGe9Tor`B?R-)__jeDnE+Njh{^a9c_#y z{i0PgVWQT{^#)#uCFnCfL-S<%vTI|aejZTf{qtn_Twm6M;R2pb{2lzdUt@=Z9&Iu* z_WZP0z@Wcj@b&7FO6(?Od);i73FD7zzzhD3#XE zX^mz&tS8W5Ni){}hsA5S6>l}SHD$t;#&dE75MAT_&MS5V7CbKZYlgqXBReA-(LP%2 z68QN|sUclbJ8~0SFKRNzXv^@}wR&^Lgz;oZTX2ad!)L5Dikcf-71owKo%jg1h+;@F zT)-jBH2=0=+jxP|-NHU-aaR1jnI)K*BuSo#w<;DzH@rSur{x0&`c9n?Jsr*^36Z&} zSu#HDh+4uAbUz&h8`@nTNAS^;)Q8(+Y##8ntjVC&x zqffWDl?+Mi0{lM5NV_%M+HI{2KR&nIMgK-`44Ukrb}ng;f7)^Ao&B>F&ImiC#VPHb|#lx3|y{L5s_nVt9-q!@KOYu@k2<1$k& zXU}>je$N@E;+{N_ysy4VdcPg%!--v=n%M%HqMvGgo}8r~GKU#Ry6#qOMCO_k?>|-j zwk`&BMzty!?WE%W_2NVJna)oAxSse(@vv9*?QFdl3j&|puEgGJC%MAd@t#MGhQ#xk zb!3m&3>=^Nzpk%!wX;@{Uix!Ya2^gAcoBL~XOmq1g!I8`wddo+7_dqYy54!dc=pST zvAgl+joUk&t4>BW{l=e~@lfWUJe}GJ86)z(8W;_(*a6-cE=qnEb~5V{U8EW$_0Icc z2iOqx#WVKGEM>fJ&_#PR6{9I{2Ds{c)&wYjY4JbjN}XQmUsB+4>-kmycdn{UN- z#m5hwGs`QQdTFehyD-{KRy%L=)wA!ka^Vhqh_mDUPt4jk0cB!+*K0h`Q6G(`+km|0*MwW6N_QVLy?aSKP z+tnW$c=zYklJDUN^9Ue%d1yA+f@$7N=DFlvGS|RM;a98*R%65m@fA|}WsJ*;7!rUc zp3+~>T=A9g*fQ^{t)>10?ejIChr2`^sb0z$SnU~4L|>3>QLzzbHY=7rT%m3Or-53$ zzpkJ3om~b%C8}KROB;!8PV_8^(T6ILuI=b?E_pRIdzb4;c`~ERykT0LnoF(|s@^zTSINvD*XOo~P6WF?ejYD6`iV^2XN@1_=jiz7 zCq;KZtHRvbfrlM4d=#HEGm_TU;tS@+{-w={J_vr&P~{=H`ER zpC@NFLcghdR-sVnv&mQMrsH@*7AKh8ZR=&#&X9axrd$pcOqjf4_2%-n%xi2%c!eCDdYx)|tue zCKlrH>LImx#t6^kk#wb&f=_Q%Ts-0ML-HFx86&?vu;xB0`o^2(N8_r@Y0&)JwMk&r z8xKh25?uhIx8H$zVhr@*mQKJ^kR+~OF{AvS7WJR!%gFzeWe-Z;sh&SUcGoA=;IX1Vm zy$v&rW&Rt_bzfP1=90_5=5xD?YgCP8rb=sq-) zL0Q+s(QFq6O{aIzS}E2dx+}bvT|Z;h!5jIZQPDGb2DrvUDrof=tvV@+gJ@{94DYcD zXcF9eH~y@568V$O^tzPb#(Xjnb1pgdCh|&qbvrrRlU2J~l)N>3V0fK8oGfp&$+D*& zMKqRb(dZZu9~6`mcSZ&te#>k(>qU(W%tlUQ>wCM$%jlUIm3hB&+&W#isqtW=rTyZt zpWQy0fUot@u;$T)Xdk(e5ktjPVKy%{RY+Pi)1=BW2FMt_wd7xQsN|CjZXfCT7}JXJ zr~c46LTJ;um3P;t_trJpkdN-XyD}PoQqQJkSbwPMIQvvF=c;sjPH_8d){x`G5y`FItb5O$kmmc#u&!%_?ee`IDYnLLJ(RfI>S<6! zkH#1uf(s7_kMbofnW4y`Q|sc z-o$Z#PsS`+keSi>W#Iaa%$S5;+w$E@etzru;WseyYwxa)ua*`e&GFXPV|{vir*w{5 z{KJy{)X}73U(Ax+F5fGA&(LGyDY7p&CIY-&R^h0$hRmA0+z4J*IYcwJa zPEX@y$eW0{TUhxKl%?5_?l+kCfs$zf@0Nv~uhWv*mOjb7%`v#h+_i%c0@ z$%)Pii)4pjqlG(-R7AB_Y3Vy$;;uK+!)kL&7qD|r$U zw^z@Y`PbH&1+||nSm3#Hfh19O=#TG=frQ9wCcoBWjNEPVJSkiiF3(mksZ~ha&kxl_cD*5+WtgWu)>+q#K)V@W;T4@4MykvkKY5DzZg;Qb~tkHmkq)H zYJA|$$WJ^zl1gghQ`zNanaN!J3gGXJL#!^^sgXIMW4HLxi5*`X^EqFutB=(j&-tp7 zxmZ{F^rCR_mLu9_R{o#&3~3J<5VzBtG%94X39r0n7gH7Zo% zeWo(gnoF2{tXi9^wBzlBiq^&QY#*%F534o(!k@EYa0#wa?;LNo;h*v_xi@n;C=8Q5 z%N3p_Mc{893r0{WG+lBw9>QIbY5k`jyytILHJ)&F_-)p{qg{KP{s%LBd(wt0`RHd# zW|tCoW?<-Q^(Y1qJ>Y<&!u5nW^KMg?PU=H%FL&JV2AYEQLfwf(&6-pc3Gaj9xyIYn3 zFa3IrW_dbZs2+_FTa+`WXo+nY?>dT;m|qp1&K1?8iI%h^VKj?9lJqfaQ=;$b0I>#& z$AUzXMK`_Huiv_RFVQw)%I@Rl=+WFXi3bHv5yOTXX^ka6CXbr^jP3`P;L<)gI2g2< z(T>lKw=;TnihPnbV~Bt7SV7^9=3knK)JA6{Huf~jN^?vZ#Op@YvtNyM@MrcbtMFL9 zj5U=Xkx}oOr=I5qoTO)X0+zDpu658fqEYx8E!I}EronPw2Ha%4@pH0+ zU}jOmL1za)f45pPLVl{xda)B0iE2NQRbl0$SxH>`4E&wmrIpNQ#YOTCjZL)^^yl3r zGccX6-sf7bNs->Sbh)#@Y%f$!Uh8)C1QI^Uts2!b3wCLYf@FD@T=1#dg2lgHmCPIz z6m0iAy)#)s7AjRyvsQpF2MhS8*PFEEFmje;VuD4OnhpcQJ{(Dm&oX=Fv+?vA_Q@0Y!6;QQ z!rlYNdsr^_L^B#%N z7T(K4U-kQ_i-w-S%Oa4B-?tvUcMp&IC9UD`_NP1*`-3K_f8g1}8`@1B3ij;dqV=WR zvqSMzSr#5uuqeAluf9?mE>OS(U8aR)RmrMgjCA1NrT^0_M98k$wOC3#gs-z&B#;Jk z?K3xLwa34#c}mS7?rCW0kj&ksBCVrVJZb+b5?};Vf?E>=o4%z5yc#dmHS#)f*)oE| zmbI=wDojViH~!Gysa~$4j%;}%&)z}H=;>>ie0l7-1k)`UOODR9M9upa{DkO` z#|HdbZ)$&dx` ztM)Ss%Z}Wxw{SvVX{?76;|tLI_Bf4KeOd(28We6K>EvGf(Nn2U?N;IoCf5>9jMtKy z`l(TVF!;pyV7}|=E)~qJC$jT0y@gNX(S+wxS=$!UxamSzlOM$s7X}ycesf-2xRnQm zGuaz=IR^*^BTj^)7k*dtJO04qWHA0zV!&V=taOlj;e`0dv_wWWEn8DF%n{@TKy*vSy^W)7cqa{~2cPQ1v z<(hN)X2EP;Wxt-eS|cJiv73C8?+ktpuF13&^YIFKaP|kM&EtLI>eDjlFs4;mFx3A} z;ZNo=Qrcc@ZO>G8_`}bv= zx4qvUA#Fz5JBtwy;Gwba(3eNW>UxdshiYDAcjuE;rTmrp`9jq)@0M?=axE3IYL&lI zb+3PYT&KKQqx-qBr_m#0w0G;}9dAi5Dza7UZX3x*Yi|6l7>T_z$wYQmxK%vGexnG< z@h#ScH;T@r7X4tJzex7!OMZntKyg{uUyy3+Vi<%WBq!WuzxHII)GYFzje<6Rt=ep^<_q%~;V+hu zc8~Tn(vD}Bvg3Mer}-aHXPSXImXtazf{!u4t^(D72~zAL5K&en7G|I3|*#Xb?P z#|KXJOioNcTkWuLMu0ouF%~yHBvM+Q-P+??()<@4*9S{ptw;EL{e7gyd3|6rzDBUn z>y<+9#B|>)n!o}Z!A8$m5r^;?5*cRiq;M`<&G*2+;l*3^zpc^Hz&@^HBX^2NM09eL zXb(%cIk;lCUa4!zsnE2Z@~l?+xj+K1fv){CaLker9j_vpgZF_&AWscuD8)I(Km}^R@+rESZ`|ee!$f+S z`(+vdK44SgQQxSxGS?hlCbejdb7Gfpd}6bf$l%zB5@mr7-_CLH&|2Hxu1{LbzE)yj z?Rls7nF5V5;i7mAo^Zvy)pCS<2yZ@7J@b{qks=k4;NHv@rbnDWmPnGemKNz}buIdP zyFOx3^@Lu{%jjn}IDMVe7VUYRv?cAKvSaK-WSb0R)G$eN@rouNovac;w}vUSpyOby z^E=UkS(7zolFxCYdQ}&HW_We;ys!(S2Jd?9CU>DYY`0d{U$0nmuP|!=^2h5}ygBCq za1hKby>l91{fu6mOpObpDSDW_SwJmj`x|Q)3Tl3-pVp-Zl?778!#>BOUS?R!bQ(1MyIw{pV7xRk6y8!t@nRs7kRDO ziFmcZR;&z36st{t97aHu94hUGrh2DI8-JORjE9u{(kHggk9X)*G{Cte*!d~TexeJs zi6YG-nrIVGrHz8?6u~E3I4wJ8-JZ$j4wIo8sT$h(CaQBLn zwpr1zH0yUqUx_8)J}txcRTnE+0Dc3mq*`mffLn{)F!^~Um?s?IE~Ym`kp(d(J;4BC-4FtkVL z`6mmq-g&9#tl%#`c}7o9!<^_gZL*3u@}SyjdUChis25`y5Nitl{Qe{ z3a98yRLpv8xcy#Xv-!S$s#%8xCbAq2-LoukLc_}OqEzoQi>v*(i^uyu35h&y-fvsQ zdhzP~;DgANnF}=I-9?JSL5Z7}^%bbwUTt)DOFbXQ7_@u+xE&nKD^agUdxjV3+ZRiY zGgjQZzT*%K=7eg{iXEbjo~X~gQY_jcmJR(92asY`?PqlbUNYCn=Xhb{0Gi6#MSD^s z+$j#AW&XbUfsJJbBC~}gseNXcrV-SCb?mgNv7f7vh9;A*&y3JEsp4qhd@3o}|FzedwqHWgS?`pputO`*>D@m}Vbz1@;JvANy{Z~q5l z1>1hLkd+a68%N_O@*F?Wxb%e!&K^V897U&gB%|NfXD8{MXaW9SsvkPY*peZ+Ha_9< zcuA3B)@;IJ6=A#&W1f}cq?t#bxh*F|Ip6MFz5Dgz*(<}>H;;9izyIT+$4iB;c60P_4fcTW4g+Ru~st(1&ESU%=QsMgEgB@|38D?%63T3I}`& zve|a9-$N6AS>``z*{K8`m!dFMa{hOr5Y((MJmuVv|;Vc=b|5d8!Yg7 z=+NFdE3*J36Nh*hYIy)Mn;Wcv33*^n6%t2XFEap0Tc*-1DRGS9}zhkM3iiP!>PZ0_b9#Xoq9L+z}8S zPMn8gFek1Q*{5F=6b~5uz(I{?>C8;VAHQHfB}0nr&zi4nPS9TG$3*<~8vz4gyi;vS6H@gR5{*$AU0MJBbsu zy6n?;t8LE}2Gv4LF9M&!S>zQ5_?`Rp>-pCBO zIq8@brh3)0c+}V;bGVylo0-mzskd=ATJXUV!%SUIhr}ns#W;25;`GH6f*n@bC%lOo z_=B#;|9C#K45x6Pc2arPZ^8}Vsw<>c)fYVp+q6P^#i2&t>U&e${%G`tYWOvy$H6oh ztBPZ2Cz-p@ij-RcM_Y9+gVv5jL^%z-Z4NK43$#9o3f84lbuIWTd7 z9K372-YoH;@wZfy+ZPK5s#mc9=$7Wj%|U1yFYvBn3uy}ZPV|MyNnE- zw`B#Exr`Tve!NgmrgjZZaAC&;_mXC#h&_Q*`j|g;TE++^mYM;Kw2XX4$J?8E7Ce?& z#CURN3fp^yxxMn4_bUE9s5YH@=I=py(TC&P#SI^N%IOl1{JeOq#!OegH1t{IyXl+= zi{3HX^~}v`a4XrSXGkuNqDd~-_l^Qc3JaXsKoN?0^h86b?9R;V;V7`shtHM8_c`(p zfAB*$v8Q-$DLr6Z6-4{>miN_?CGSX|()(sK@cR16?q+y0FA`o}&MwoeAV8tCLB{MG zV_ih_E}iKVb3QSS$-K>_K{vWDzWKx>`@V_EXvjnmxUg*)EvFYaaspE{$gIza6dNDx zz(`wS7(&;XFK{>4qTA@&hBbC$UDkr z>J!Cxm+M}%k&(fyj1Wx`>lavOt~^>PI$gekHo3RwlAPuX#Sda%l*E;2^)H3P@kLc3MkwZtOe!_6&l( zqu^+pj+kRfEeeigX=5qHWimcFTQ;(MVO$HZOzp-Vunc4Zr^JhF&!JoGDsd1!RjtAk zypp|G4YDEPYx?PD`VYyz$P3{WIU;w_p~pH;D2Fv~l2H7c=f&#qklaS{A+WnD+#d{H z6H|MFhFZo*J%(Tgt&@L^XUE=0wlWit)$L~s2AqNyjjG$g>)?xgi5Ei4j>CECxLB^6 zUuIt>?||zxOVqg^?cN&i(WS{Z@J>=yk&~$GWs|xoUJRMZvz>EDruQTzNFhjX4_K1X zqEj|4%Z<7gE-=Qdd1wt1YQiqf0r%oMd>&dKjghy`inn3h#$|>ae`emCzMs}8MqQ`fsM&?~{X@Bdr$; zg3h-Y=Rx(<_C=5QAUFwqvbHc4s^{z7j>f$UClfCqNFUmC!hvVjTMWM@o`4s)_SB8S z41K9));RSvM+s{`C_U@xnG@7A>SQ0SO^O_pRX8jU-^~9uxNu{}#-q?*`(-Cbb)iP# zD(_cbSZ*bpKWn$(tk*BSt+4vt8pm%}&*}{>lr^|i`z0kud3D$+wenvr_-3Ax?{!#D zUtjoF*K6GHMC%6MEE*eS#T=aR2}MM#JAPe_(b9Sor*y=@fEo7EPHMRl2?oE>ILTm> zMj8y~bsg)vCcRbk4JXm1ogG7ME4f#9aK0{+?IDs%x=<^T^WYPnX=oUxgGf#)VMqau zNhU&zB_3#?oP2w^+KYzWHp3r@1Gn7g>JF5L^}Vwx>-Z#-U7y!9rV-}5*9zi54Zf*= zwvTm_*PAzcW>+33o@eBbUBUM#5=}`nzyMj=^zct&CU$Fb$a1#>v|0C$^{^ZZyNL79 z>tx&Uc37oo4E&#bQ}n>~V@jYcoew*k*q!r_t2@+)f6w;as^{Tj&SdtU0VkoM7qzkU zBeJ`QXJKl6rxMVUhpd8V|E2eIe&hR+qy^R`Hj0Ls+A6xL^FVcgI*j4A_)Xq|wa7*wp*s@MoNf=+ZL~I*60JqDE5i#9;nmLIBp2?T ztdhdDnYFTW6o0`;Y20|}6Tjpm9x%AkKUTyHU;H?`sfRx@D`Q-!Y99|dXr98kx)L2V zTfSL6rY7d@ni92~OCJi7+-Z|`2h@67>RmIq_7(suA2&W`d+q&AWncT#v1?g1AE=Ew z-fT1m{B|WdPL3vE0khwUNSbewS>g6n(UpaUU+p9p%X@6QDMJeH?XQ>%M4c;jRb8`Z zCtrt`61#gZeAI8FB<+;g%s3)#>@HtcyCMhBgDTNY=Ki}Dt?P8*j?ek?8iDuJ*7A=@ zH9l**nal<*>AF7c#u9q2xg>dob&rBnfcUX$?N((}ND^CexjyleGG}KOE+?2>DDNnh zqI-3PuO^dlW#NZisyE0oj_G>D&00%Th*icr(NXR1@(QfCJ*sw=YxS?yl|lk6w!KifbPy&hE?s$8Ql^~|STT6=wfrB}Vt zhdq}80{p;cHeUq7jvPA9N-dC{f(<^FY#Q#5zj9FhplxCyEzg{y@q&!?F&h**^T_c# zEOpe12Q!$uj{QT1g22>p{B-)DP!ky>D{Kgm^m3&MjKiExQ!4Hm0<$uEx`X$!wopX$Ald`1A zDuU=tXV_&wT_b*dK$2>3nPSq8SMVt+$!SMdOt`wTFnz%j-VNbFYoEo0hZ}hJnFH;M@srAH+X_=pjx5e}@*!ZHcqGf_D z^IohK&EFZ7#I9(VT;x%;;9F}i(siTyadlOnqc=!BtJl6%^blELJ)%#&NlJS5wkf&| zFVUEX)oNz9Xbi2%sKNc}j<($#HJwdL+m1Hv%s`QRBgQ>sa^~UVmuVlqV7u*P$427X zc)do%r-jhFYnD2 z)9aNav9)ubIMl%*sbJSfb7A^xDTWJNa%u1(JGrgawK<$_#JBj;Xs4!%O$24~q$D+3 zF4Z$6czxXQC&(kdBzb%tSivFkOUaYz2h4M}%U#+Y2PMvG`P?0R{nNUq?}Pf!mdhUS zsadwv*==f$Sk%y%6f7$SB4=F_14bj1gJQEg>VfTWG)g4z7)^^KSQ|Db+2mjtueZ1K z@|cq}`$INxs=0fAjpJ(dGIPB=*XWHvqAw8pKP3sD@fpEHvw4U0gkL(vU3}M8;HW-D zBP_iMEwGSkkU*B%v+T|on;FcZ8Cf)@-i>PsvwPtSc3tm13b63i+NuYq;C-!rK#6bZ zKHs`ZM_Y7Gq8>PE*_s^LqdhsQ=)9?$Z&%ALr{U5$r=sos>S^vpzVtKJeag%)t=mrc z?TqiVo_IPlbpFEz-JLwVldIy1qZwRn^0A$CGGnWf??OfKsg}K1So6HUATzFYzf`{+ z=jOS_FdsM`JG)uRt_gP9b#C^uaV>qhcNC?TK30yb*>;X7FsfN z55AHgXgfT!?%Ig&nYmcrYb+8RO&mX3yUaXVvUOA#bLynIT~H=^fO9c}SxlqI492un zv9xEaZBMex{E#Q=Giet|!pGA8%q$N7G#Mb+@ND}J#>pQ@rM+*d7mQVloXkCbqJQA! zZWWS{d52fja{r_@UH2GR$tUY6D`^r@l5G({d@lU2`d3Br>JCrGN6xG) z8H-#dy2(ijS?hN&;2=3&>+)K`n;rC;ifmo-I^U^w*q`ta%!KB<#UIh}slRCt2p`4@ zMS6Sm(e;sh9x}L>UI)Gmp5c!LWj(-wy1nylB2nM0Z3=d2uxOe{Bkba|);h5p*$Jnk z{mmGdtezb`d5^w~oq%K7e?lN?XB(`hPL_?Q&PuQ(_^j!ixDOPO-L{j{M&pG@g#Ito zH~95S>ftw1(UqgY?eyl?`D|%T69cm!=4Q1Rk1o+#@Eof|qHq&#iDt_Pmfn4K2Rpy> zKT4n3sVno7Hx{|DteHAn)humE#8Lz&LxFc!qd??q&ZTdk6(6cvW$He&gPy%kz1TLXE2syZhlJj z0qeof+}-)-^-KF^h04w2`1*mOQ9SO6k?SRq@!DpzfFH;lIpc%Sv8g49#-J_ddNq>P zepEc-_W$&9t?aM2*+!JjepdRzfyp}HttE$s3O)DL9BQn%JRBNr%^OR8zh}0MnS`!J z-|=K|E&rc1g0}SyEs|ND=mGIoEG7)RIJAylV=e8NB|4yY@Y~E?u!nP>8d8b|;Z`{8 ziaouN}UGKZ6uY}ntXtoS^y!<7`>a;UoV`)N@$t5=6gdMy0$8KpRS(V zJ*d7K2hruvj5g_emNPx$o8~gOI4Zp6zxIMR*FY$z%JWzatVBd0C@cD1b zH~81JhuG)p`V(dG?P&)B-WM);sjl<7RjgRqbEB$dzE$n*)%6<%)vNW?&X`%5I8U~2 z#(At)&qHqWGGTXmn(!9ICl3)T!N0X8-)of2=d#|8nQAY7aE$ zbN}aYy7yOVpTobd-3|Z0+UwxI70mCh)3)DRI~xDV&iiY(V<*G^>l*im>eOHRAU{;Q z9)EP_;o2AZ&v*Xa&c|x+#s5&J0`Jx;ym!?3Qt#UNy`A6R`GcK5EG_&;JO8ZqiF`ye@Hor+{e`dZ6y{TP_r1akzB6+bel;doeWhaZpOpT#+Vvl5huT+*1OKt8 z`Fi2=vBLA?<(r(V${>4jeyyMOHuCe>M{Es?AB<0x5lwk+i4YjhHR(G+4a z@VCd+8MDkh#Umimv_|R%jIXWbCe~U@BnL$cM^~^p`XlwR5&Wk}U3AOz4cS0Ycr%fr z9+#FQusu~z#B+!SG6zkY<8<*)T1da)^7L-Bbh`*IYhE(GSdcUIF6!}s0{xllTWdcU zT#)#kMoIn&=8S+|o>ag+R{W~^-YdSspT2qKQhj@}K3yyReWJb{Y;Y?mVa5zmAf7Y{ z*WwY7mUj7+$PDHaztc>p$!m0xN7j70pn5)C>U(5OQch2_nyz}mARuY%k z)Yk0G`@H>hpFa0<`gHg7I>}M{Q6#kQC<2wX^xT?z;}a%MNcL!HW%MAc;0FwuE8W;W zR=md6I(&MXI++i8hc;7*l+{xHtXa+7Ls>z{YGOm12rN2ZPoNg1%D)G{VhA&jWuuXO zqB*Wq?>uI)OMJ16M?W7`3r_=!mZUguF0;wI^jfUeNm}#OVEtx|-D?erzTiToTlTLR zl@6xM*?`WIM1y{(ycvDVDs8H_oUL-cw6ptTY3J-|_4|C$`+EI9eTcKwXME1!XX;~p zg-@sM51!y6_KC;*N{tYEo4Qf@E!120j7MLuIW+v4>3Y0qK9NUjVZWon|8x0F{Kp4| z_w;A=_e147{!x8Db@MXzZ9TpAaANoJMl8BjkVr-Nayi?q?68^Oo|fj<5Vl2pGdP?& zbhr0PXU%;aus+{lGx49*M)^x}!8clZD4TjC-rdq;Y9Eh&T>Hb})|@a+vQ;s4B*|Zi z=A;Yo`S*`MTkE6QIv2s))>AYuUdJ``&(a6OOJ+?Y;kQk}x|}O*2ztGmTd$FeqJ92h zy=6tp9As8H*Gk75DUvAui}%D&rO)`*vKi6v;M5!G?UhK+U^4T8B`v_7Rm=4*-zCg@ ztLQ?n;M3Q#o~bQ(@=b}YS*m!fMvo^ta{_wkiZXbm|JQp_tYUiRs z0SmoT%AT&sRq|53nuB7onLijkwQZdG66UTQ`$eR)B@-k*v9VvMzrR&jAOR%HXAzfG zX8-mE*3pnIPX;O;0p9?eeeQ0s#cslW@6*=mY|Vgwp>aV`3FMi%@>^^A%3AQ0VLD9hbXGH_ZJrXgT=nvlu0ey|2aZo81$;)4`%+ur z2`i7GSn8S1Ru9gZ#sBLl!#omQ-~-w$_FK#53VJg$m4|i~F5Q;AX5hbGz1*qBYE#%w z%PaL}@9H&=B_5Z2nfqIDYoM??0h9E2IN)0SeP4OyKARbe?!soYZs1Q}yKst*_$O5b z6W%qprsk(Fmi}^jPF?wS|M-DnyA)ubXCHWubbW47=x=drmpQ+RJK z+&#BfYX7Dvz}+FVY-dK#6_4B5d11_1-Ue24)&jaDn@>{W^W*Z9oQU(|senE@$UFEk zCo`}ia5ZH!p3!!mlJ4<7z9N6TAD&mvW?>;f70Ecsvrf^ZRp6pIrlCpIKtnUva= zBQ1F6@_2XY)0uN3G|(A8G|0-unp;`UPyh#^Azi26D}`D1sx!^ejwEe*r=fjo>?sp4 z$I@gj*%=y`V2Njjn^>j@tiw=(Y6YQ!?yjGf)zdq-uZ+|c+){d0%o{q_H&_2zy>rSGdZAE@s>c)a@< zrjxxO@%Sk>u70b2lcmI`w~KDU^Uzo+v2yZgwVp9+W^}suAFdf$cbPrF+fwe~aMoY4 zF7#+DH5-*`x0x5kBeFWEwi_lb;2&pp8y@k}ekNa=vG7r>4(SP1Cq#YXXy&VLeE;(C z*wLA@vSEE|IO@w@@!PFI#tT&G5&N3mly^FwQ7y#+P&4pwxapXda+9@vZ?5^Hu9?5y}F zb+KW3fhp3JoLxNn=}m^dt&NU`h0eadgL-H8F3V_j{Vw+hfH3>KjL#$FNuUF2Y8@J> zM!R-Ax5z_U(zeNDovCrZR_(n%-&yIO-P%IYlI)Kj*BFl%O;3mbZ#aVD?UeT54%m* zi1M8f$AfAO1p|06Q049=xXzis$!etMsn>%$S`S6UjiiP)fmzT+-uP#93(L-mM&D_H z7V&!c4PE(17qY1O;?LZucBwmpztjyFg`Cj0{xU}RcfBWdc@kcvQ0&ywohOsiNbX_v zga3k$Wo^6)>v$`3Ro0&9SL+}8#Af(E&?J(^2e`MrRWr^Eg9)vYC7T|_jM{tN!D~1G zCX=b}Q)An^xK-fG^mUEq zNt~tHRR8!P`YHA%{vsK;w?-k8$&sMJLE&iX$Vhu@8~P1D%$-BM7aXL{MD5&HIDvHP zll>6&l5F&2Lww%N#l~1m^toehZhtGd(raWa{F{0!Q3x8K%d#>z9DX#onWog{o29YL zR!?UN6LhM`yE6&S>|^IsiD@ld^!;r8u<}mB-Yjf9E7m^IGIzbSo+oW*^!c_WAjRTu zyp4KGy%%p_Q+SP@yU#JmtCQ+bbX{INb75ALh(HZ)-hHDLfp`hw|w(RPUzmx20>`=6EpD5aU3ynDI z+;O9OC+LHC(%sL*+Ju?TTw;)1B)<^7f*Ze9{*SyoE&A=EIy#alz5C7gkH4_S9Y|np z?X!}?IrHVYLRr&5LsFK^KAMnNoK0Hgs96Qth9|PQ4JVvtOdi`aB?GiFTTL>JahjPK z_i{m#NCOsQSEAY6G8f#$f<+^cHdKlJOZ^0!XtuFnOAFPuBGEV*NzFHYz_V_L(1xYY ziiB_Iv)qHgf;BX;8+ytJ^srn38{i2X)1mDH$S9(I*yT z#ue)rI$jU&BWnp+9p+yc9p-7r;Hh&4WC;CfO;F5T)Sj|ba?E67Nug;IH;f z{2jZTJWBi!X9SuXUR8S=&oH!$KWscQ`Tfy92}o^Z&N89*Z`QNvb1frMmN?pUHVgueDwDM08x>rB%F_nmHaRZJUhdq_XilE0$IH zmPe4|qtw9nP7qJ{VU3ffuK90kU(_ITx&Jt^O-ol|t$WHEUM(;2xoUY(KkC8Gm0e^r zX9WU}eCErO?KN5?cWGU^$~EVI(1Wa(`>Oi<8d76kuhui#Yg5#3JBX(e>BD1IZX192 znN6U(S?ZbV>ij*5#bU^X*m%BuT@XW(N)CbtC^>qz28`j3)f2>CH@Rov2|=%PLnXw2G$YUj=&^Y6mPWD@3vL)keLO2 zz;nbU#*0RTwVqG-pI*39ZNE9VNR}#8zfgEgju0NdQM%rF_WoI4j~1DFJDF_Qw7#Cz ze_HZR`KQgTewH(C>63K|=dH6&YYt^U@~>f{uXaTi>5Ke)w_1=*m=Zgg*-s0<-NWU2 zhL2cw!0Z$Zrl@TpMrG)jTpjMcYc)?e&j9-npDu zQIgy|=Dq0&!Z+@Kdmc&hF8W9gD?OWIcB4d_T^ZU1W=U-_8u}+5gTgzB5b~5&Y=7_fk_q*;LMyZqhyI0!5 zc(ffK%cyiU+)dq%L+D$62g=4)m|t)yUxx1O--I%>01mM7ay0slcHpVdCGjk1q%~Zk z0eG0vab!lu$Oz%Z$Os7bYZnNJ^dcKhSFuKD4RUbk;nn(E>r3@_yl~Ws4e1EGtxC_) zDe|w^%xNQe8ZZ#@7&a`ID&0Vo+}y8O9dytR`0E=BJX0Wm#cN`7E1FY zLHpgJhEt(rDuU%Twj$|EPaw7w_p~R7dSWoMMW=8jox)4OQ}Km6GHhvU*$Ut0#`yRn zaJoLt0Itp7H~x-wL3@@2-tMVAI_^-ggX;Ri>kO@}&ElI)wQN7J*HC&#v7W)0)8b~! zb2VC5E~q{ZpQOsAv2CWw8R6}oVQ>&k!=X$Q48fj!ZSbCv*wW`}bf*sV%|WeeXj8Up zwv5*peV7cWzJi~eThM;Mu0AdgEH)oBmFNb%6YnkW(;;Tm89sVC`8;<)nFo4D$H%v& zLA?Q+t(j=V8JEpCxYyTZu;C~A0W~j;QS{O)MI<_&+=K`E_MVg#gVg}K~$%&?IvLkX>#*2RaN&N;p{}$w;T^cAcFU_#5jm$S4_wp>o zlhJ5B61l`D=n&fwO~ZSecc#tnma}fEpR`xuLjDj7E;2?b`wF{`+-W4KESfRf^@3w& z73JS!U3fsz)u4q(`h_=}$eA?Iy!NKi(|sl~F4rgj4Tk+6k07&+2Z^RV^KfKh6Mk&8 z%bYVFO#Vh+?55iUJk3cwS&O<+-=T$*v-b;z#AoFhvLA<&Ilk8@#lP5Y5a<-H8pOGuxkFzq{gf z(q&V$y)pU)w>NP)%tot6lBaCrUhu^ZXcxYut4K52v#xxGrX4s)FN_~mi+MIw`#^o# zMb@WSkB%dogN=KodN!H}6op+Q+(mL8#-_pUs}`(tb5eAknWe6KQzKul@67_0&eZ?1 zrO^uQVT2}p&wFqA2q>6youj+?ryxuOWQ5QQ&yvi<6ZntbzyrRCWor82p6k`Nwd_1G z1#Y7qQK0WHiN?!_dUM+{Dzc${^M~2d)vOh+5VyfB&qVzj4x79=HNSCoN$G4GFJHUq zH=Tq%T7u1*G=N_oN$kk7THiOlCfb}H%;Chy3QVJX^i8Pnl`%II)TY-l^>(MTisDgT ztatg@yzQn8nMzFA-Z!s;{g5J~qTy|Hi!94B!wHos?^+SJ)_~1e8 z$NoincyPbQ)oE~btuUAD8aWh&Tq-Pnw=ny)k}!YM!hZ6}nF*e{L-^4;U*hpPPvY@< z>*IS*jsKsh-%r=s6CbN5AE}?m>)eS?*Edhq*%Ob|6Ky|P&-Ux7xA*IeiO1`7iceNQ zpRG?1RI5+b`4y?+e5B5o_>KDeOEr(%E!Y-#sc!Tn_QZ#IwB z^N$}x|IzX3u`%9*VM~JxCiI| zA6&lcS00xiEZja;w8b@lUO0YmL8}iHEyEY+{Lw)SN%I-!sroTy zxZtV5HJ>gX!#AHC@-rpmBlUz_eR9A~!=2<7bNG44(%Zq?v5Uz`#vh8!Pu!GKN;WmC z^TVblqUwC!QE7KxYN9v!kmSqmDJ^tZ**#vQ`?LED3o)v7GnOwAO?G(jvQv@N9+?rW zAsV@3wf0;(o2G4iDPF<$I$u0_aa^A@n!c=ESQ8Po#R7LWcRN?U9GlGwM*40>HY{}& z#@?P&d--!#db?S@JYV)uraJdy(AHVMTYiI!;`uByWM;{un;z-uM%LSz5z~nV5~s7u zVj!MqW};tMU&Fzt;FHFRcdn0|#PaY75>NPFOJ1wYQsN3e#)nHHqD$5LKQwj+@H{+w zfBkc^(Sx^Ud{}QLrZL|o{o?KN&f|%pJzw(m6Bz~&z znIp(}kckI8lMjmIEhA9y+^Cj`^?2YXBeIOu6*6YZFXvZ;s>xLM*=3+>I8X*&_}I}C ze8d+EHh!p8KDbCc9Qo>c|0U-=4)!t8LoTY0WdqT!w;KZO0ihLC!MI zDeEdS)m?tBev+$P=N0cp_s+R*3O~`}utdj%c2mRC%6F1{dzOz7u6_$3S#8s(>Liaq&ADFV$apilfn+#KpqJ9wdKacW2`QMyK^KpKb07CiI2J zVsFqOd4G^c&gqyXwqH4hrX}LeI!oVoZw0Q@Jk2#)wqxCC%eUzRhBwyuGD-9oNiaW^ zTdJyamkViK=j3@bazm+<&-Xc3vT2EvWX1U+G92^*Jj2nNGLcQZplXNZ$c;sN)wZ*d zcz`DMUDj0E7h`=yfIqG8vo3$RKBpe7^I7n(tZac71|oMHU($a6kEgKf*!wD zwz5+pzBqY`jv{FjcQfA!OEiNX!|CAz)ZlRk`lU}n(jQ0{ z-m;b|P-q=^$-udDW`5-`U>*G z-uE{9km`fAPu;ni=pZ>)S;~xPBz#Enj0=nJtwfE}<*mEIfukK(oiK z2PdN93pK{;V-)&-YK=`vMm(oWqeXaT#*n+)zL9=djuyRirAD_NBD%nHS!0c^Yo6Se zTCg3~I~|3KD0iPo98BX<90;5F8@%?bkv9*U03T*B!s9X%p0Q7^PVG&#B^(_nOVto=gOtQ{ zt|;CGfBco=PBg-cFnE1nxa)mme{R$)z#kjIM;Ei2@7`*CrB_!T9T{l(=cg*?EFW#1 zM%%|KWByp32`+d3c;(DKKEC}(<*MfjjrP_;te>3jojd;+xV`PDe)AUPlh}`=!cK5wHOB5^>o0b} z*e9B^nViYAKX!>GQ*q-sQz7ELQQu76lbtQ^s%N}0R6^rKx>JtAIpK|X)8U?e`XFJ(U&nR=;ahnrc$O?^)5*lPIleAYB))pS{b3rB(J zp#ExK;!^z$BUj5>oh=NVJMNc`>}ss|H`azWAlJ`huzW3|o znLn&g*N2wm+iFV(+9`ju_wOn)m*o{(I`1BTy*jv!q-2G^TWfK4NK&Ah@|T?6Ge!I7 zN&=i!n>$fMwI3CIj76e8R+3Jl-fBOQ%Y$1yuJ^YB&s*;)5Ov-twiG4l*+}Gsk2J2a zMT%&E;Odpa(AC0Na`9-wuIcCQ`dC(!oU6BU`_Mt<3N99{P-#;mZMSk?1&O{`ExOfy z-Q3XUcj2F}6erPW$zjF1?2XvMi8)r@XqacJC#Mx(tE{MF#$HwV7yWzDR-;&w*V9EPy6K{5}tl5JllV~a<#D1f2YU=2VEA@rr{CUH%3h0#X^iy>HCvnYU-pss`eBM@2=}o%QtQ`cRi)j;Wm3J^GWwX8`g2CtC6^o-QbN&G+8n zeOMt^H8I!0-#oOxQN6q!Gww>1w=&<@iNnEvBtDtkS(6&S)Y`Rm8a9iZoh@Dp*T@s` zKst*N>lNQZi%5zb*XEd?t-tVlrhgk>Aohpf6rX_hiSLy4)|cv?_9k#8=zJEd2L|$Drt>acHu1H3Mh5AFoZ@?X8^bI5>98eUO%A?g~Cqp%opJ zs=EC>)jWa6}T3G;yl+O`L;kVWq1q{k@Fs zx7%)RNev$C*e=*<3C_MIr_r@Vo~O^T-*B{Tzjs^tyX#|@4?wzN@9l%@N>m&6}b-vd@AgYjUZc$d1R;K00-8?lp6J+q>&-veQBUSJwZmgCq};mDl9rP%2QM z{N3~kgUfgKOWWQ*ZX2U@^leOe+= z-q`K>*oMNp*4M1Xvea(`!}j~^wzDE>kiM1k7uCyK$H&!z9QARZ**8Y{9{7>%T;Dr+ zd)!{D_FpNfSoZUS>Lvb2da^3!4l(lcMwnjCZbEi9v|jeWqwLw8zK`=m^U-6nkF$r< z;)KP<8E+q64hnDlU()tw;SsUDzLKDD!1h_LZ$zW#2H%VFmatr?r{5}H)=B5Q36#GZ zTE96;?S|#e&FesZE4^B@qK43mOHF|Tx~v7k@lxX-S>XQ;xgz@)>AUT*5&Ri zeuYTFsy^Sp&)m_@$_Z_%y;^CfHl3;VZhXjn4_1AX^*K{5wqp%m3R$JglJ|=rN?z!l znQIL^EFnACamo55>kn0&@YxgkRzFU17JAyV5D)@od15&Oy1$6 z)izc4@|!%1r;l?VAE=#8AE=o=QnmY^tUCS=Rlgsts3m(4yl-E~lSTRciesLrmR9SM zv5xOdo_JT6Yh*D($Edt+{#R;|@I}04S_8ZyymhVUGE)_Lb_^CDqt}Q;mZ{E4Z5rQW z-9kPgYbh#c1K}IJLvH!gpgUW3YXSJ>4W9D|GoEM<`G2BshJ5* zQOq+Qj;xGIjLugkHxUTLia)9!_q}DOI2xj&U48Iqj$f$X|2#f{>U5lAPt|TX?*!Ae znkk6(OE=KkIN<0u{m>6)d78PlMKPmSs`v2AoO`_4S)pWQ;gOQ0?5!aOpBVeS?6i8k z-nZ)bm-Sa?i*BD$idGT*ot`p(ToU;4A-4~eB=#<@r^aZ}v%DVkU2D1Z{Q`eh*@!-E3C7;VK$G%(rW zTUtjnPa1(0_%(Dm_+Jw4u9XfrC=GRetT^Wm@`JME=W3qI@6OlfWP3heI@Mau3&Rsx zw&4Y&O?w4uMV+X*9D@dU;g;W^#irUE6uxc@iv*_Ej>G=D$>QSeRZ_Z3vFnWWrpo$!G5)Nf!wU; z$$4Kb?~8U|-9W1r=f(QzJYZ~t96qejO|rdoWas>PuSNRM&pdm;P2zmH)E-=`H_z4z z+s&el6}mHpqud3WJ#Sa*TlVzu_-3#D`u(HkORIO_H^@$Jd!xUa5Uy8Ow(Cl^t;w!AkP&O9%QYT3 zJaU3}mvq2s^APTMZf!P<|GYdxrvqfAe0d5% zSIH$_d%Pq<`;H+$P|@AVXU+&<|3G}b{=ZtEE|=7`EleDCG@hP0j@{1=tvstPw5PXt z;p%%H9uV@5Q{l6|%YbgbF*Nq`)lYWPWsloDRYrz|7JjvUi)(Yb9A9eJDfBdCFwc&s zf-t9gvoW;FnZn?A$9J32)>_&2H~L;yccdlAQisOBpttBF**X}CJ%QWag|XPcS~*4~AR@X5Vz) z0sQ;L>C4+DWR8Mo_!0f`1XH1}XP(qN4KJVdnG;;l3#4z%udu@2r{*Emz{d4vI0pRL zg9B^Z9ssWZPvQ08tLqB*C4u=nHO9U5v&}cDW5zAvAh4uHw`XtU>^tBKcYSqEC$uI8 zyRp$-lL>ARqv1A0zSH_2E1C>-&4%|D9UuZYEKWTf*-F}gXARToQALDL<|U3w#%23V zMwB8`Xt0z`zIN}{LR0z}$LB^dTm+iFfmx;sU&zA1OZ&c?0aa!WTj67IF&<36m+LPc z3{G}a6Kom}-zHlu$Iz7TQ=*#lVGT#~2(u=Oj}oh_PYVv`r(T7xe!0dn3N2?uTxCw@ z3JRX&iz6EZs#G_?NT80twY;e&(nfyeTe=#8t({iR41AZo7wV?B;Kf!2qbtP<$7><8F2S!48dt4$-$= z72s2!s7Y4nANUW|KpknGP=&kWwcj&vK$|)9F*nKvXRV!_o@>3^OvGk5ra8da^9GP$ zl%&l0y;OhGc^z?>d&@*-AU4U2;LD7C@2S~*W9(X+zdZ|ofZ@ez)7ia9drrg*<#D6= zgS=x%{&z-8?I$_ty%OL6-%?}b1kz9hpVQWfF*C=d&G9~}i@oOlwv2|>p(DyCcNRLB zNAn%M28(imDj9JlJ&A_fdztxK;WHc)oYGw3gLa>#x9Mo#o;#*(qzU%TmV~xWjb4rxIH{H4)=JyY1{T#1dV+7^KOBe8;N995 z4=)+e&^I`mP%P<#*CU6?@kCFw7eUh+3#>g7-V^i7tg>v`o3_mllgpQSFq+e8>hXAU zR>Ae^ogJZPdz9#4@=Z7Rv_9whzIuA5e(3IbVlrzG?e6#22kdxA&n#uuVPLMkHTf@j z-$<}}A2rO+kGLW`!R31P>-oic-X|Zm?;rmGgnbT8Bm#$aB?xKubla=3znUy03OFo^ zk!RGTrMyM9t=zJ1@v3{2&8_!tRJ+jAta=SLcy^!4dL;|KCal3nU=UsWeT@^Yq??l^ zpd*e7|IvbS>ERHwX)MOxk@D7tn_KW*ubIp}M!^A3o9Dwvg2CL}mUqA*Iv}h4oxdX? z{)(1>-@YNhn>Xv5cpvr}MssD|&!@Q~5MRV9$Jg*p*2Gg`78#s#!T+rX=u!R=8s%-; zI=6D+@<<5_wWcIqC4I4TCw&Ico^i7aK` z49zB<5*`merlio#C;2nd6BzJf-fH>fK}>q%C^W(K*@C7R6O?SGsDh+MZ+0DL^B?VOgy;q% zB@*Fnz^{nuh01o@A0rn&^Cr7F#3@_&I25KU@b+A@P6S1MXgvF~ruN)@<4bb0R!GF2 znOE-`F-M~%g2In_7H$2c+UL7i4pAIE=#)9Q*o<*$sw?$boPkQtLF#u;W@XOS_&7Z= zDS5=J+vA6?Xo1cIm?N)k8A;HE+Q2scW*upX=peip9~@5{jh21JjQJ&EiibCGsh^HS zT8A{<`y63WMq?qX+s4|)aWoNah`;oEWpKu_qQI;U>ghan=8dTx>ctwhw-Kv|*W*j0 zQ}iEMp$R-$;?ul0HTwDn>c&@Qhf`t`qNC{VD@6nSm~rqF+?(avzVS71jCUgipDWM7 z`Xd{4skE#$rke|C=xUf=hsT+%fBWo?cnOgk+==F}n^U)}I&#ho$fE zH$6%VZEnr)us%h{x2KnVZT#%311I6>co(gyaF=NN+hq&*hxURc5^8I>*3iqmXrv$z zkojwcmp;vf?|>Q|$Fe%zW8}cB%q2VKL&aS^Y)6)GVa()lqn&W}tc95oqU_LY+x7we zCyw9;|0OpV&4Z@uY4~69^XZ2~Cok9A%lyOo(|m2iW4YoJxp@Q4!aw^(L3!lF z8RP*J>6z@rPoQCV2P!qgIn&!0&6o?wmU*Q_IDr-}Xa;SUuq-7%oPVvx1ZU@Z(i-2% zO?poDroS_@EieL~(>mcakfBcE>vN-TJ?sw+5RJ^XH#hLhNDL`jjx+tLXcOn1PyZ_Z zJha+8|bk9ziGE4hNg!hkMGtovG(E;}>f_xe1eXSZB59 z9=u9pHb~_d&+JnxAo8Ub5pexAQtBIFI(}|da&%D9skmZU8P8XX$O@-e4C4a|W zp-{I(FL5ntO8)ys;WL)w zrldWMipN3sqhUee5+r>mFKrPohW^1tty#LNCVYMG;P1rnB-e;?mzx^#X1&$2j^pKg zmbWxD2k9ThK^|*JR$Eeo!B`YDjm)|Iw*`i{4h8)w&*<9$EGTs3Sf zpLO-`luYGD2r+PI+m%=5As<2-Xa#jpEP9_Rg=6V5yb!CI&)MM^nkBzP3ixSOd{J@6 z%El0rqILX;mL1wQ)_IvzfXDd6uub+7IfsK-&b}**Ci1;Gwbl(}K6Q0BXdbC*fsfQ( z9I6GLKK|>Gy~jtLyK@6_TFVHW<(_0!%rZeoWf5p2m{2{)4^q#ajHBwpJTW(?<^M_5?&gk% zlTYlMc9y|^AM^d_z{h;&T_--{gFC(PTU&4Z*5I5wz47j?H{QMT4YiB%8T1@`D0Z_B zB#z*mQcBx_(IL^&a#Quov0?dntag9iG}0`XqRL{?p%BQ2US`9@TjehtmFCT2k*q| z{xt-2+Ao6&A1KLt<6B?WcdU@V^+_jA1es@kJXYT?YqFeDuZMi({bnB&BN_@?!VpC z7|)fLqOynfb#u}ag}*E;`}HY$nlDMei&A2><=x~A+7|;s+P0V9HJYN^*5W*7 zHX!TIvM*p==bq9F|I3_uO>No7wd&DX%Ajex$`{O=|EBi5(*^ImHL6_izs7mTrCle><1n+W#o#|qo-`LJ3&t+d;Dm%sHJY4+NyGO%&p+?^r_vZGHZdAz@|MY;^-cei)ZA;FcI5J(N@DX#T+?^6iq}PQDhyEU zWQ(iSV&>*fe*X_68V&b=>8M7YyD-I8*7K70T;IMfTfpy=rMob&X>ZZGjp$7E1n>XN ze4`5TY~kJgqISyUES>$L$C(=49i(5Xo_i-^cJ%&!>DRw38?skW@x5VRTul%8+l}7a z(ca9_zEs~P?h~c`;^RKrvuk#ed5)fp#4RJ+WT6sw<_`8`hUm=BFhoL^5or7K>qtBD z{aRtDHHSQnwa7%g$xzNHI~hKi_pCjLdy*4|YdQw!oU9DreG_HkXBH!{_o_Jj&-F#4 zi~ZRpd5zY0eIur4=qvK)k6y0dZ~bn|&Oj$BX?*sqr)`wAY5NpyOupy$w6gio7lH8C zI7-I%&N$lEa5ReQbXol?mBp|l?tE#9>xEyM`r@dfnsop->iP7UavH8PVP$c%P7LnUs+O`Vpt4>Y?}Z)0@d5zF4j4d0dzb@0zcZCCnIdZ>d})LpVI6 z&C_}tKHOs^!Fk7B*Oj}|vvvc%P2nZ&4-3Y=o$93A>MLgx#I|SM0j4r5*$bb@WZ=n; z)N`eS&y^y{Jr!=^s$X8GAkz^Ou-NOS}EcSPK@Mi@Xp_XE++=Zk5z4z z8lq6vyUUE*)LmAvWMz`^%S=w5mekb3Q_FLsS$}zCJ1Mhfl$LKNPra+g*o7(kMkc0c z)rRsH%Tw?ASH)8}>CNzzc*F|iJPo_4g{Rz&mfg5FtJUPNyVp`IWmZIEk9O&)@b|A4 zPtk_I)<{Ps#k(|8EX!{0S=Za5?PlnBYmTuk9Y^!FtY~bCN3PZH>;p@+9Su9Z!mhGw zyZGMG=k?OEZW&eU8SXtlR-5Ue&h5+g@{W0U$xZBrfyJS-l2Pbgpn=&pu>U>2Ai4x! zvcs~8nCDDqo76T~-3xx%Q)kGtpJa4*HpQ&xD(zv-2JES0>0OPn@J%)O5!R32pEKlN ztv=A1=N;ccTVsNObu5V~g#*I3)*raEELGc%mgZ)UY$ z{bavPj|f6|>^e1PAaoSx+;O(-Ows3BQH(ZxwBokh@%LGV<*l$zH0v` z_2hK#{Apz~WtlsJ>GWrr&D=1Z+bo_c$dWI1^SLZ^*QG=pTyj-n zwuv=Vicf`3^Cq|TJzI@SQ3MJ)KPFLIQ#mv>y1%l@h>GqO<$;mTdn#k$ya{K!pBXFE zRshc*+o4zJVojyQSlxR6Ku$AaRAgTKry-{ZC2Z$&TY_x#}PZya+boq-Qj zy(AJ3FHZi@r!0n9^*S0p#EseK{GD+xVWNfWV|+49%eae_Ht71-__SR)#P?QhU^V}r ziuXnM(>IIOrG+7ZQg(BrtHs4b%Ql*$`Q2J7>hMjKr3=A|Z z$#tf(mA}M4&Fs0Tkw-%o(4AOG=sH+?j zGoXe_vQQ&AC{%A z)t6pXWOUYR1{YoR_}zlnP6s*_-;ssM-MEOwAOm2Cq_jl=@fwqTjw%c^ml!FQAzTZ- zw$+V+)I}}leo$|v)};GsJD;2mh`rtQCq~Rn*U@S3fyb9dzF4y)CEkx_xm4EmY-yG0 zzw+&-HRuYsoR4~aU@GTgM|;L+AlYP*#{nz7yTL5JH>`A8w{}gXQEF;bT8hnZ=N0@Y4zj-+(wx^a#;9+vy9StxwfOB(bT`a(}CvT34jjW{M~of zv9+H0C=wEqXMRp*iibwK2dn zIb(ARgE^}Kr+{hJ2d*hR`5b1@v#FV?Co*`sW@+9yI~fDCkF5dU)GaL$bKa<+Pt?k8 zwT#H$Syu_qH7@X?EIrZsCHxNqb0(3EctSY5xy+ouU7Sw`=O&NH^yTU?I#dffu4(R0vQYZTaoho*z z?0Vjj@%mEn(3#Pbb5*8P;;gy!A6;F^`GTt`~gK`s80;2Zrfz z7^Mxo4ezacPQJC~m6pQLvm?Q&Euta$&ZLhW3^nkI95g$MKd;sJGH!4f>FO+)>|ARJ zW2Yt(w9{tgG@#J%Z1qd7clEgBGW63Mc%qf?1enMn%iXcT60fnv&6mA*U{_02SmHCb zo_8V2!dXWJK|?Njn&aTK#%%odbx(-~t*#}q*xZuo%SFLnAAqgYoyHG==k*w13_W|! z`=d|QjXA3&qqjwe`*>XVzpKi7O=YRgo*OufFU51f2Q;U+wKI0|q2{1!a~B7~0tn$8 zPrQ2EidOGc1kg_p&tA)L!L@2Z;=4{Ct-T*w`^&1eh%a%cn<|mg@X~y>+-5$15`{SiiBcBR@l3t`5t znSEmHRNux%TFFBd-aq~P>cU2Tx%_gc`|%H!60x~O_rrmYU9xY^po1r~fx*r+!x%f& z`$@T` zar*RzUaco>-Eiit!ALZ3hI+93aY}`LvAik zSjxZFORTouK5AmfV6K`*M9yFxqTN zEuFH&&!oz8qwiQPqoF^D*%$D~zxQq+mKD(gH;RX|8YwF94Igaz1(oOUKIkW?Pmq(wt3f zTFa{yXmu&)>bG3mVeO|8&+S(wvr}5s*2`}?@uU56bU0ITrO(#RqBB@*jxqZ3%n>wO z>Z{8IbNIvm$ra#oeo6S-jN;j7880mUL!xZf6wkT?z1OexL`LYyWq!vg>(TwOb+nzc zopP?5jINnF$9U<{pdQZ?Epet(*3E(rw9DPN9aW$%nTmZ$glksh9}gtT_a2#Ba&&8M zZJJBGpB*%+7vWO>Gy>e9diLE#CuEhxw4f)kJ@Jj`uyv%BY?)ac!#jC#@P1<)29q(s z!6FJYYtK8lnJ{-OM2eoTH+vV;)cQDq_dlhg=drv`UObUV(;SwPf+BhY>GZD}2cEq= zW}P{UW}hFJi(Q)5B^)VB2aaNvt0+s2 z@=)E3rFU4ytGEiMC7(4l4Z6~{wBeF!>xgjrkcm9v`=E*2P*9GBoK%T_l2(bwjKB1T zHs#$Uj~J;BR*niz{1DBhf2Vbcrefc(A>`qyy}V1!#1&OOL+U7sg8r_tJv`#9lbnN5sH>e zeBsB)o3rJnv^LJ*0ZsK79h=+%>&k12N7-6G5eUA-&)Ky@*Ji$(Tb^iZA8)hxuMO=J z9`*^&r{$CpSko(B)3%05F0#F^$cdf9$pqx{GJeNP(Vejq6RTGWCi|<8>bD3iUUEa> z39PvLkar1Eb+x(c8~wjpKWe9)ONsVbVZhs<`{vL_IFx=yTQUx7-X&%9KYE6P;*D-@ zVed+PuQmL$f?aO~j;zx9rfoB5alaWYEdY&beEih>Vh3w5CL$-1W_~nA!6*D*=WDRP zI4M#BV&D4tS?wE*zNZoR{q`CqJM;W_PgIK1;buAUg@_AtszHlV}JocO4mY5@ly!KVIE-cSpoq0Cb zi_qK2AADtAv}y%?i=OvJMwU+O>h25UO_&IkPqw&PZ^uuvEBEC0^iu9!oH*vq;f>G+ zm0^lh@E<3($!&ItnD4oPOW2Jp7&kf;4p=y|@-5le6fBqO^I9M54Vys{U{u>^fp`b8 z40?4paJWU@+d4Kc+WFzXQ}4_@uk){^4QA0%ndBwUPPTC)&NXT@Qsg5#EcQ8ik{q;W zllQ$z0?mv((MY`$;!b-WAFVx(zhD18xaWSEM{39G@73<657b|e9N#SSNO69mMOy7& z#w;!rcI1&^dwNiC7#lJ@OS&1o6IsSCY@ebW?GN{~U|Wap)fmyN`94-vPqfdq`Yzr% z7`{2|@adtt-981B-wore_YQBwLiWB1nq%Fkp5kxEYb1ZHSX&EoII8H-e0;~tb*AX+ z_3WF~ieASr%RWSm{eE!rlfph71H(Bpq;=-Rd-T|npVxbOwr@;&f9;lgw7B`<;^+78 zeYm*z(G>@u9?Pl>R5T?AX)QPNq(N_w={HaR>vtG$uOxF_J(N9&v)<_b!v8y}A}G~K zDwLkC-Gm?8`;DT)jiQ6RV@I^SE0km9>9J*<+^)=4^igZtll5!r)~o^M<^=Wb|4vk#2F9{dHgzg{pp-``#+`4Fp^7wbvi zgfwSzuAcTxveJ1_PuO>>!o98pkG!6E;dF9*g5>w+&B>dZ+ts2$)`m$RdzpLz8^6qS z`evz@&KKQi{N>pNw8(qwz4({t8Ly-(6e8t6tQMeUUA|I(lUko&te>=Ro=#Rp+!)`L zuR}+v_50p&TTqd8z3@QizE0j-`$YN`J$k|?gA=g^?{?jGB0|R{*@uhs!=QJ%$ z15H>T-Xt1>{O;h0u1!zvv8T8AhA4y_X?D+ih9lyw)@zL-a3(gMkf>NLUoArscVe^jaw{vb^sVB)#p6r7? z;O{;+-ZTC(6T_M$u_!96Wo?r_@i9CyC@0Q(%7<)5d zNPboS!TE%Q2b>jjea6q=E$}3I_ZdHWdoQo}W4%LlGe%O4nVGCd>N;6#^>1|~yqVp+ z_}3a|Y76um&$K-syb0Sfjlo@@ocrh2P{zyV_oy#;d*Cz{AA^5|`mfbbd{5AYR`Cka zfhPvvS*6K}9)GNN(cKQe$t}D+l$`keLO~LrKmOMeyD}Ve7n9k=U+neg#^5qfg%5azX*=X7%gSn5|wolzBI|;e@5E+yz|>})NWaiR+zI& z1~Z&NOUkGR0_%GCWP13x@@(auWXF>Ua;xtbE8CJaVqRXa5pN2E*9V4aTIbF1rrnWz zZH&<;(Cin7icelHy#J`ay;*HUG1hHK56Jp%(~~PXHwzZ~`m*orh3Z>&=Y{f|X|*$z z+0Lnx_txi&_4L{C*|)g``%CpCI{;%Xyl>BRPR|OivUBiqjgil1hu_zqat?$~U11Ai zaunVQr^za~OJTXfcB$I1Jw3Zrz1b-y;>{YKKAK-=wNz^2k{^OQbfJ^+hqzZ<&UShp z8R&>iHo@9#qV?uDdOZ=8Ib5kWV#8U1pZrKxXi~kvO2{1Ik9^w|2S2K}%~_lY8ZGHR zw4W=Q*((aFqvB{0F1Xa7(C#yyhB3H&@wmt2QUdKfjVm{~h60UMYtFIliP5s739Nlu zG+qa3;7=r;l~^NgTb+CZbLI`|rseLlFklk@qh;@Xn>J3o87|o#CwT_;(_3uFw3Er2 zuQgdLC%uK*_z6x$sxQ}Xx@}o0bZ+oRTD46kUl zkFLp?nIrFHO>%Qf!qv%>;vNwvhf9|F?hC_Hy*}m{IY>2&*2{KgPwvp1Cfp2drF!r4 zrG=~-?bqI!8|A6CCW;i&%&^HbXp6SJN+lZwpJ+KN2gBEqK%Q-Knbv>p2I4VW)jo-P zqWmz4+q7jhcjt) zP~)VwZ`Or2g##Nr(WQ}|<(tVt8s86D!smU~1Z|QWZafNn3RgHV7AyM)q8F2~H4c0) zeYfy8tQZ4cWLG1%C_f>(Qr~4?5nkQglIX)46O5#RC!F5ztv*mF+Z12 zrT^`kyjh>&9VNg$^Wp1=rF)FLgUCDZ8P0HSUQT0N!k1c?Xej(2T}v;lA#WWwtzGmE zsMfTL=W}V$Aky3wV)Qg5{!r$dr>6i^>n#LFUyY-B3HCmlBh)0KhWXk0MFPlofO`gR$wr4kP}!bd2`$6NB+ zNsJle?t7VZdvotEDVrXW35q1*v2Dt3&x`ih{U*Bi9iD4k-2R;&kHg|!k_y;K?wg116sBm~EA@$Y>RWyE2s1kq&1ctEvgF{jwi!!4-v~#;**rTq z-28jBZu3;FvpiMbeYSo+R%E$wuGBxdv}XrCo-J?vOr7DE8y3|xovY_=;C61+_3G#9 m$h+aGzprnd#~>SZrtZFS3*%n-7@q1;tSLw5X);zPpZ`C1r4+FM diff --git a/gamefiles/TEXT/spanish.gxt b/gamefiles/TEXT/spanish.gxt deleted file mode 100644 index 0fdccce3bfe30dc99a4edc338caf0d27e57f44a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246088 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

dQNan{A6yN=$e2VM9*q&CkSHkF@zi2}$w;FZA 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�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

m{F3vqW9m0Z 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 diff --git a/gamefiles/models/fonts_r.txd b/gamefiles/models/fonts_r.txd deleted file mode 100644 index 4b89e4492a72ebe4cbf892ea541140c17c8f8da9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379752 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�ScLK6 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

A^e==1yV6n~!HQu%#(o?acV(FAvFP^Eh0 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

5Tdh7{5BMz5+0WzJ~ujoqN3dw4C|n9%1|) znzN~%uF5s5(`FuQTHTRWp8G^yYSnw3edV&dJCzJ#vnTo+`cRS1V^C4|n#LKL^vxXA zhOz~;`*I|;d4m)w>h+FHcfbTWy#vq6lvsVbHM!0`QqMnU)xVs>#qo!Bg)2X*htQXM zZ}Ox^%1Y&bkMzC!JxA|rcCDXZJdYl=9)BnO`NMiGrqJvy#5+8e=cGft@A|Y%&-(<{ zcOG8K>@QYfvED6oPSxT5epx7Ti7}vNK`{pr)V26?aJvU-&1EPCLQjL>634@*Mf6<; zF{}PV@Dn|owB2y>htQYtPhap-WpvWI{VduzD*M#oPjL2f!_8E1?m4a2kFywfcl9Io z;N_WM9{aW~EZ!pdE9D9Tx7@p+ttFJ@H5z3U5-iR z_%k=59uS;0X|;O~Q*5+n139s-X#c}rBxlth<(aF!d-;Bn>C@%sI8*icO-4Tke;$8Z zU9E{E6-WO*d^CD&ceQYR@xt;u8zvJ7Gu>SgJB+8Rd2(8P_0@8!X%=U2Ono~<>Rqge zm-Zk~#o5(~vlWflA;WLasKg^;FBw~T%i z{)O>JSwU&^5A?7#pRGPyq&a=f2N!%5dc|V=!8kj;nk3<>b}0j)+P$yTlTKo<79&QL zj+CdM{^@>(7p-1DW(j@QT>Ia$v%QBHNvG@ORbZxfyDg}yQ=CCg=1BiyPxaYh@-D=z zwr@hBsPBC1cK`^WSjGxN@3IC_v3KnH5ZcH-$UbowYMqm;D!uX@AR%!GP^svEG z_8#9_e0ljJn+MQeO%A@h9rp@gEGW%jD9`YFzdAjyZ`|E@$G(@odVTTwqVdVvAI=@a zjEr}*mGc*>-HI<4Ap({7NtsUf?!T(5roXv|)$bLbfp8y`BEbBFG9Yg&We^3~R?k`W zPqtDnSIqemg*~IUM*#O5AsakI{b~F<{ApbI9Vj#}-|Vy^`f>P^oV03${a?z0`hD`i z7FQO}-*Im|p$~Ugwbk=ET)mGoZJd>rq6&G`F#8^;_1uK$W2Km^DDtB`XXE^`|D*U> ziT{|VOpBhrpaXgOsh+{acj9s`ltKBv!n~+bJ(wd)$LcR4ImNv4t_eXinWOJCV9(vl z?d3bO>W|~szpZi)5`V5Nl zs@N+^9K}pwmS0Jrnu8)M!{4-_88G%ix#uGHS@lQ!eE-q=ATIvWsPeyZf%JZ-CGANl z;*aA`?D0ga4m18QVWdX?>#j=C+xl^QcRTIW!}@)R1Jx%P>-m{*?jxc0f1JG`NxlCHyk{{Z5M!YvMENFJd{)WotQy><5f=sEyeTAoxqF zbdD6G@u%_YGf?_J;d({w6QcL{)7@hA2FIEhr-ooOC8VfEU_lq@Qi^AEz`%cr}Q zylPhcgB_E3$~lH2f$Kax{)&+^$emSxLdw6ZntI-z`7DGo71t+3uj5~;-q6}j9KZba ziV~K|3-0%fX0Pav!d1-&WBiIMl~k22%%91l7Fv~UD@ma_VKI7>{9tc(j8%;s393M( z8C+Rwc!IKGoTq;2YRW(tG(r4Byu|obsUC0zWwic5kGTou9DXNBdaj?*oXl+t3Er{qNcC^_zV13zB^7xX zzv4WVB5r0$3m|tI?zr>r3FhYT~j11#XOSG_x4CJck_H^)gSTmk)B4ckIQPGAbps@55%9w zUqW^umTE*uzOnxdE1I2u+k41gKq<{Wtn^*ePtE}1%f|2Oms^b}Ld zGf|>PTf|l6>p_U%=n4jD5D*{>%IhMu=I-ATq+W?xg)&}d)L(EM81n>$wU#R29RH_r zL=jy;YDWDDDPO%;v#%?tn;R2EKN9~!@6S!ps+d(X2INbV{}^~iyWGsT<8Ij)Of$LK z?myxX;y-Z+Rc+R{=>I06{&{=j=JJKo>OZgZ2dgP2lx9!amv6Si7x4L5Mu2L<<@XeV zZgealFxUdZ-&aud_{Hek>sj>|JVm}_^2S)n5G}~|?g>`FkwG zS(^V4y`Sgvp6ZhHY{%N@`a`yQU5m6KV!@Ft@H0TRpj-u~9`qJauav6?yv}g1*4OoC zG-n=)gvhd7eBGkCZzcCKND_Xd^(XxN2*OD3vo9Lcu1|=5B>t2=M9el2mGu7t#?E98 zy~+41T(Q0AXX*4te2D3q_l|KoR1RFEe1d*F%t|v3RR4^U=!-mIR+Z6{pY+iWty-B@ zA_(faJsv@|CYZ-O3FREIl2K~!?vwo{ zZ`hpRJiDfSwoWoye?)4<;is=DY=kl19sQVA>FIw(#R43E;q4Qe{g>(M9=ZQ1`kCNq zDSC)i$($p4O7o>O8*BKBKINU@=;zkG2K@b(=oeW&&3@gNQtpvXAtxc<+3}(|Yk2#> zzSn1V0-jq;6)amJN1%DcUD{F5}Hu>JpCLkvNCrMAb zpL6n_*3(`g@4Fs$q^tbNQ=&HvSLNz8uRa@!tGM&Y@~EsokpDFAZc|2K=!@BdwKnMJ zj~|-~NcNt0Weu9@^dW;%vC=b$%cOz!t=Vz}q)cJe$)H{-RZonT^!C9%^p94d9hE+h z6c#1yFW1wQ)zyB_XIA|QKVK=r>bsBht2nY;pAh}5_!|sSwv|~KztR`%=bU5Z&HT$f zQ$HuteGt{DVTKeVTV?)D>jWx&Z4Ws6$|zHCs?J3D?X8tPoPAn875`1SQs3{jD1Agb z&4u2{mU8|?)K6S5QLiXcLvND)1AeI?Q1VfqGjl7xrvCTqER+=v$A7f`gp?bpRF(4C z7mXBGD^uzD>roZ_sZyZzek~^(5of^b20HR-=;8cTY3;t_kwq_z0^L=`e@*7HY$MZQ zr?`91Xh8m7k-k2y&P2J=u5c)Sc{f|V_Uk7q)&X-mQU;;OU$684;vXsY6TDl)pTEA4jsB_o@_@ul zoYy?dkY`lsPZ39))%*|7UN!$!p9%JBQ1|KNm4)6xmvZ&ALx>_^pi0O1MIw$}_8KEq zah;>q7g&Qya?@F*{($!S^^*~6;s>C=w@sZh*X-_|Vg44@e`x+JzY0MdXVo9^^OXjw zzxXwU)F1ZD_X*Mm{qb&b^Otcv;S5A8~DeWKIT-5UM|Rop2{h!Pt`rdYR?(VGbiQnmq1O)`l8nl9e^TRtnB9w5Z)$4uiAGDnNEGS9O zVuwcyd!@D~;b8Q)`ss7#vgYmy?S6NcJegB{FKf4^YZ!FUaWc13`Tj3wp%I7Cf@NKB+JJskJdExJ^2M@S& zvt0LNf|Z zzp;o`l7{sheS0uvnpAF~iUmow zJqvXL{Vqy$SEzqqr9|Tp?%_IqWyeIs&Qh)l^fvB`-3JfRhEfe`R{c?m$L}8A_4Oan zbR$#>;O=<*1A3F^X#8KjQ~6&Psb=2)AN=X{OYV)g>-&vhBBpJc-x9EY%c3I+N!O0(5$wSe^u=nDEUBm(CYty zn0J)goeWuvVf?>beBYJ(DtUr-b`lX-P~R}1S#6vZA72ak7nedLJiZ#A4$asfwCj_F zKo{w^?wX88?vcbbnJ}w7o|c)Ib?N#t&UkAp7RS?yld9F}@M34z3b|6e73S}>(ky1h zFn2y4sL9$*2jE=T@u<)psj?MU@I-6QSv zd$`kWp^X0~dUjQ1+6_?r_S>;QhTorb>o5aWPL754$1tB7hs){qZfC%{u-CyKFYLZd z(ck~_+;NSWRQLD$CXTDNr%tbN-lDZWb_md}vN(fI`xyrBf_Nsjsqc@p>i<#o#Tkf@ zr_N_XpQ-WFMN#)}<=yw=fDFC$*XbO-Vs{+$JLNhYm7i&H4hsRbejcO$wEFJ&Vd*r2 zFTN?#>0SL^!-=19kHF>#Y=u~I%6;AGw6*^IgBt_)(LXC}=&e6n#n`bs7~9{`AaK0A zQPXB02=KR#Q|ur1_T&*nnX*;1eqnUqI03sA%l4eKCr9IDnv}ytfZv%+v;To_Pd>|N zyLjP_cz12@X7yW(hl%3ZF-lzO@|VCi#R6g83b4A|O6>46~7 zJbXi-A#ipPXpy2J&=5Gg2%KHd*DP-cGz8AB=WCWX1R4U(12zO20%sS2<^dZ54S}N z9t;Biu>7-6)7O(%ra%Ae!WRd_`M7d9#-8}u_}=HbU(Y@6znb%GusP*YmmcrQ-%fDn zSGP~~SBa0SUwTG*b+O+>fcE?IXD-kA(U%wfZz#(Qz?|>>>XTLc*gO{c>{;MN{ReaHna zt{$G`XUn;He~&vJaNi@)u&hrn63_+C%+wrFt1DC z>!&ZDspxlt`|Uvb>7QZl{}+F_u=t}t{>vxVmw)q3IVvvx{xsrLiHWDu-xcgVFQfl- zefKQce%5XMldSxI{;y)s-*3PCdoeD4_sJNNVaeb}@iJ^jkgJ~$jmBx-V>0Rmr& zzW>1!?8l}5B`O2I!e^)AD#pVr;kRSE<8za_#m5^@JMVXYd)V*EURiy()y<*zK3+ET zleq==tM2~aYD|TeONMs!W3vZ)eR_Z7?yD=8&TriBC=K=2{q1{IshvMxva+3}o%TlR zWrsz?rqAy`0_?(mG5s#_Dq{pZ&n*&N&<*LsU2_CP7Xmf*@;QMHv|l_IDd_%Uur6>k zN7O-Tx{K6;Mrdm9V!P}rYE$O0?){I*b|ic;cLqyF4jZ0Mzf0O&hgJfkWr^m>^ajxd-H<-qouAwSzSjfw9pozHLGP_hZ+eQX zGQO5%gfrA(CCD;I+)-DuVSYj!KzFNg)L-xp(q}z>6s7%zy2^hmRROkVm392+qu;?9 z@a5}7KE!=NZTVic`9%4TS|?5J zmuc|HQlhbE{@uYvy!#kw!qoz_+K75CU`A3z59tHf$sF!v4{?pSUKMc_`+t4sO2W_ef}W2*=+hqzd{aWUh+Z03dJ(dL0q}=#e1a zW0dHwRNok>S2YTZtTeL%PmWOr*5XYbG3akeiT%N|U#f6eQZ#pTgS|a!zq070(cKb$ zBGXx!rhNxQ9de2si(q4SjB%2(hY;t9tJG=X25?&G*1MljR9^rd5by8LfT#G)l^- zCvzJ``a4Q%jnh(1|C;Vugp1k_eg~j?V=!6ZBP88TQ4uZrILb2|w!*V3l*^Q7p7$kv zn0r&4Uk{Nj#X3usvJHzU_2E@>?>W+9eNT!0rXAQYjnyLJ_^Q@#?jFmLHktFsWy+bK z{4U7)yom8qTm|?n^v|g|29Na?``qk0#il?LkL4JexKw>O#hyeptz`{S{$zfs%)!R@ zFq;(=Axdl)<9~n6!}Gw*s2njAk6fG&)2x!cx4W+SaEePpwx3G} zElWqNcCYMV<-zbP@7~t6HFqoV3S$kfoP=1d-$hD$wIHmG?;Sz~WGZIVIX&!L^!pYe zC$Ri)cXU`~zp=|`V!U2i1I-MVLiC@^WBd+SV?I&)qC%!GN_N__wg+<^$Ne8_{C*Qg zN%8+cjrur03x1|N1CQR=&Iq-?EZRg0nFG{(_+ypAP#2>n=>hZF`zF#{p^9=bkD%JU z(0K4W01$zv>psrW-7quH5d_`c+?fzvBWr;NB-&(_e2e+!n3&dFJvuhyEvMDm(V&LXTdk2$2C_Qx3Zb>TY2=c zci4OHUD(cN<6%}D`BzWeJSyP9dn%;|I4bEo0ldoi5BnQHwd;|IB>uE(%l5i@PfSTm7+A@k_f z7)BgoW{>J&`R~Kt>$Jn@ff8)N}wHT#dHI(MBw%!5qajqV8#=E85 z$!HK`i$$S}LWF2FGT};p7t>#jmLyy)3YcZx0~=h_<57_4d%lPSHaG;3*Hf|6z{x89 z8)xKRy0+s$(Y?s8-Zo|~f2y_nBp^{;#j0^QuFt#=6VbBsxh`JPyj)-Xj58?bNw+$V zyPN^&v`%{TuE7_ZZ?0Xq^z!nBp%r-4z8LFE{+i^Eq<@mMwr76!OLr@?U)UwtQDfxn zoBhhx9m+WGcG{Wfwh3$bdUZqc!bn_MK`}8GvM3k-F_##QDQBIB8vW-d(aJxTMu)xs zFR_nntxn=I@0T88%<$2gYS{UV(Ne?wbv^9@41)V5f`BiSZTZ!Qi?d?i8M$S-AC`g~oZHL%ojyCrp$?mDCE8u-Sms2VS zj-J;FNE@i4bTJY+#eEG#hy7r$c-+`*@-YA6xc|4Bls`s{YpqV=Gw-t~W`r3hu57C@ z9Om9>r5&Q0@t!r`NY(D?jiGTr%=R$;J72wVbD7q+L+k8FyU()cHQnbYl>aQa)^xWv zyOeR+#!if!+jZ&l6S?|gqB`&6b7+{n0;>C^d?c&+yZBg-{zk(XA8mW9F=i4&dm^hP zmGm6hM`a9So?89J?~j6gr|!*A=d)-BcbLP{3a}dgDfWh0Gy4DO<(hA#45ByUWxOb2 zMxVaEaem0WGtL1!FF$n6A!vcsgFPRu@UE-B2MRjMRe6IvBIozvS7M-SZ*-^r@K~Im zKvkevji;3dPkp%;MQOvju@8GBjwiA_vx=kt(A}SXe9O;250O3YTGZM`jQ?JHdXn!s z&sdrPqZe1>KSnDz`#0X1IM$*Vu7JlGblGR;Paw7hU+s=}Hv3}5Zkz*l6snaK9!MP` zCEnF%+ujbDy_oodnD>8)NbcOcJ9$fH6A6iB%qq$@axP}=xb1VA9QSw!X6+_>#8Hv$ zG>CMFE3SJS$*(Z{EMVm8Ho9gp$NEfvesb?R-$gUvIOoDBrpAA)bKCiA_lK*$)$i$J ztO#$OWw9Y}){dlq@af&LxN9v)fXFyqw<{kb{z!X|5#6n>V1s;&)6*f5Q&_u^&7XY) z{}^WImHmVYlKs)2vW`W{VXD>(tdBnWi|WZQYJL8PfN>n(wbm!;ne$v2b5g|_qnH|t zg8y{KxXUkkOn1LFqnGi|v z$d6zAMHo+I8oB_wRde~d0*YF{(tfzOs)`G`$F<5x{%sax|G47wMQ7F$i zcBC4BtBPk*6AzR>c7+$;eY104`$um?gsOa&2?uZubAlg~q&pN->v0$O+e>|XG1?iizvj4b9mI-2i`l~EVBg6D%d?KHlBu5p0% z?^)jUezZ+dH(FJB^W5xmgoqoy-lJ)%-J_KgKR?_+o*!$J>7HD{k2+fp)tYpqC#(Yp zvvPo1gsb9OKD~7q+N=E@rTZS2`4?J0XfH<={RdHn(KgF5t(W`_+Z3*U5Rj;jgEo6upnKC56**x8;qPN_Rck?wJNp7Jn@7Ps+;i35`?K~GqkkWM zP80lsvzKLb8Ir?1!{~1;f08OV-&8Vy&13|DPf>30@+s1}v%5;n?TvxF^4-Po z0^W*7^sYfi-PQOp3+nEd@*CJ6(6yA7DRGhYpo)*D9)M&1jo}N+@~^Xmr5)t;Cvgv; zvHRCwiaGulzlxQAW6x(lI!LLKXt(vn$$}WCT4Z_;s zGA@O00pEvg0rr3YTL}7l2LtFHp(NI$zIKE-?Dy*Tkh^^I7t7~9`L{p*Y4Q9Y(#+pr zy7!O!<$s*%Y#ifAFFk)eFYV!0Voan7air$!DE5W8I`l|u6lSN}g~bc>J)vs!;wp#J zxnyl-NoH%XSsZ&KxuV0xzM6s1glaHWveSPx(@tH(Q8K_)%B!|}`vWsBZ~cIk13hmL z=pB0epUkiRT*%8XbI(2w=Y?>G26-X7!WxIyfel+)bM8e z%{Asw@fQfQyh6`}vi*ZyzQ*yqcV9-n3Nd5_gZdwOt{a8L-HHkhS?>&Qvs%qV_VzI@ zhs%DJEsY0LD%R2ay2w)c-52MFdLwXc{!8=Bo>;B<+pK;J(eOrZ4AS11A3o>Auj+Z+ za7|>ujz&VE{slowSEsh$(EDGBUWMp$9*1u zFINFbi_iW!$NZGsF}??9diOaNnaXF+7x8im$RDb2)Y00*emr=sg8cDrKgVqLJFV_l zByXKXPg5(wb@$%LneD(BTLqyEF6CRevaZJC484$haAYp597KF+C1&03h3NmI{?Fro z&)DmiFto)d|60f-uYOtmHtImh8|Xav+ORmD&3~)=6!p2h z-3aOH8yZJbzl*eI>|p;>+_iFh=n09LT0hxVwAuS;A35nkYIV50_`9%Ev+})gK6%2O zhXW$$-0s7)io5fezWr0JoVsuAhku99yV092+*`ve#_UAAbFcQ+0nnerD6}_V#xCfe z6Zy~8Z5yw;-wy~j`C5EE7JeLB+v8{y9!csAvD;!>YNGao{rv;@OFJK4h5Pr_>_J$? z`NA+ONCxU+t_Gnev=IHWkGo%-|15qFz~-=@{%-lyz44C-W#6xLE62OnyFFO9hDV~s zTOGyA##>TE95DYq2p_k(=ybMw$F2|8+eeH*dwp@__kS$?f~VdO?MxBtAaFY%9{m15 z={ zgTOBNwuxUr>1KKF?9-3PD1ximL*~Ddx}BdW1ePz@{B9BZyyuHg z2QbD?6h_C`Uiwmdd7s}1kBE_A>>GV2(~q82t-J3ZT~76)(D!|-1!onn<7W3f)$X+# z@kn1wyUtGQ&Z&{89OD=;izUjt2R4uF-7PSS%tm`~2=IH~2jHJ*HM&KD1Hg1d_I0$< zxa#lXf7nBCw7N8D;}O8`&98{H<9+)W+Bv>&KBqKdo-RD}{d+CvJ1M=af4_FT9}yI| zlX~o4wqqOVgoRDVh=BV3L+M))k*Z;NTo9nI@2We*$N4ha%hvzqc#HEV7y;a2==Sdo z+xa(cRJGQJg8=#O1K4d%Gs08*=G1ZV;Llc%{H?#~Q~HKpi~7eH0rcND4j>ZIjPO+N zo<1C(e3H1*yB?DNYw0U2s8wSBQVxqwDt{whQR4T zV7RAfEgJ$2fzyV->G5REl7>J-U@QWs&7U=U8UhW0;RuZN7p;9mpdoO25E$+$TFZt& zL*TR_aC$shv!o%=5EzTVY4c~zo`yg}U^oI}{Y7iv5NHUT9t4Jaiq^6r&=5Fn2%H{I z)+}iVGz7*XaN7J?v!@}@5EzcYSbx#lHv}32rw4)Io}#sE2s8vv8v>`tlQm0@2?B4s zuK@p<{}Pb@Wx)1bpks-^Y4c~zo@b80*WI@O-*Df;`IftSaN@p<^UQHP62y*4%s7_5 zv0<}61YG=Id9XQ|fBS>(SEW~8`LOlyu|(i(c)4cfQ6jKqz9ilKy%&EM_-jWgzsVYo z!2UdZqiP705%`IV`QqR2AIsQRw&3hM8SW`s%Z9)}1pJ)eX94Te=Lgaq$&9z@A`v({ zo~~JXbO`*Fi2W;X{B?`|#})zU3)*=@;D8YL?rT4G(f^fiz1^bvF-G9%VnUO2wh;L6 z?HAvEap7#)eDbU<`1|j^4S)T=>Gl$|M{0j{r68;Gj&D}zYjojRjlPp#l^(d50yEBvzG9@ON zeBEQcDCckHJnZGtTid&SotNnRO0c{8cA2_|e(M0_SEUQh-T<9dd$jqi-{q#ZcO1W0 zode$5iE=;v+2X&rw*NieGko9i^w)pzo#}rCIom?>$>z0Oiw_3c{XyVpkJkj(H@_pF zydj=|JqJoZebMv&>-R4T>2(CHW-o}=5<7Vwc%vm?Wyd8w&r!{Jfc;T_!^7`}^cocL z^U_}bUT(o_KLMnZUh)j(OMBrwlh1y{UB`7>zmj{c;&~j!D`CyIe1xdNa)ZY!9IuM# zr|MFmOWF*L{~>xN%Iu7Fx7WS$*XtO*FQj~9{m!2{8IL8`FFU)x_>XV=r?~r7q094n zAG|Tha={bo^$VBb$q$7*=m%&e>izqoUw1L@%@_wA_d0@Bvj+l2&`8`@unM3&?Q`kPukdYdm`Czw>6)PUC}KHus^^s&v8euN7LdCG(+1vtIctGA0Ol!7B3m%Qge}mklZT z|FKlR{Pj2Fy&Jy|^z(1#QOdU*viA=0PgpMy*Vm&wv|(0y#BZyUf|-ZumptmSHZog~ zIEnK;rs=L<7cKkJ@2GF}7DGP9EO_Wa$7_9ff{50qaX!xjCNABXh;GB>Pkl^_6hfxC z_w9d2x&L7!$RFX}C+5x<7>(Ee{kMVN>sg;At+!B?c7^z-78HS}+5FMVpOqf_uZvP| zW)=loi^nU;=Hl63s?~y2bm-gItcd^LpwN?F{7$ zIW6po}iPuGmUjot0>t_}`5UoYF$0Ol8QfGO7 zp!8k+VIhl#bp)+8m_-m)-aXk=N<`QShgV#JR};`f3Efs!5dhs?vo=jeFP2K2)n? z^vcg?UVy`Y+aY;>XI26JyS#Vbw0~7vWY5D}b$P6WmhXWqVQst*_{TbX78U(FeL06& z=@CC0r83#mV(lSXfmwt^FP-ZnIX#bOe#9u10p))K*e{>I8~NEDDdP9_-ue5F^O{4n zd(i(MU49k`Ci9vn>Wd)K#}v*LNy!@(Xrv#k)gU%|>8sL{9up~1Ki6VlzkDTT2&wa5 zvaH{jmGfUotG=9{e7MK0e&u-Nu~Jf+^Iq$reW*A88Qit9i&+%398XX98LM~&%1G}U zgOmCGENr?WQIF?Z)yL2OA28jCr0zsf1QJAeI(A_aMtv9}zkZHZeh zU-%I3)vtla@^M6)^NJ{-%#oN&b^bnpe*G08kG1ZluSyr(wA_a*(ee=V@(_CiwH|kZ zO}u0NKljWEz(%08$A6ss+n4g%p8xccqo-K8^+V2LgoQyO91%ZXy;kOw?*digda(31 zN-CA`Z0?%m`!k$tGg{rXUJKF2yqj^qq;ScjINC3(Wp4m|VHSUd`%4=^GmU?*Mc#kW zg9XpDkgtRqZ}M8!F0}8CxbFHryYq|xQcW2s9bcrsZE3Il6-B$-3SH0&=@swyerVZq z%vL^fURn%9`4`{#ApfgqZz}zle)Z-5{aY#Pzh0WhT;!AaFMck){5NjD|HA9;t$Lhe z-nK|nJ)p;GTsQaCYb_>i7OVjKXQiK-D8>Eo#tYXp+|e$?L86(?^9X2paGk@pck;9+ zIS;UZD&KZYlI@wcbHvCWlDACNx|8n@l#epyRsI!*%!g7e@t&wBem)rD|3 z>mhnwcJo9@JN3}&)?&VU;o-@cf0w3u?SEiea9Vmai{Z6YtlWY5{ z^Q&=}pTYlw$^SP0#=p<~4neQWi*LVh?R#%@D7yWA3$dl8>B-&*|E_wysm(}>e4zjK zL67)-IKi5Gb>&C&2F|rZzJR>dzCpA+${juDA>FeuF49;6`{T-id5(FQwsXX+>Y#=z zTb}<*wD&@%?(9eT!bX&@^dI{ajAY(#8J|?$fkf-B%(M5JYOKNAqhHMDE|D+ND_$

EBHLMqI7`-Q4FQ#{8|@ADCHVc7eNlSPAc` z-b@fbTdAPj%WG2NbFlP3o_s}GKK$zeICk~=J>VVi!yfiH+xWl0G1xxK$5(m$V_iqb z5AwRSrZbs)Q}noztBpKoL0LZXR^%ri)}5ihNbzR+6X9oxhSyyyek!AMT;GLg6?bTX zSBrNQ9!Ni4ezXlTjt5>6#(;1)(wJ6=+WzH#CUE$C{@=yb^yOuF)fW+I?k?)l3VLSe zndIG7ueCLx=}PHcf`g@ht;j2U-A*7O=X^f(&81;huu?nw>E?C^>R@X zYfjfN4-OKsCZPCGTC3Jtkeq@(=f5F5{*ufF*8f~y{YS`<3Vgncv(~ttU(y1Qw$|j_R8jnB~4A z+h88FUg+()3CfrM|9a&MFJdAZ_&e|_)pxJZ%Ulb!f8<@cBKof7yEq3NAz$%w71=V5 zPhciyD)8MO)C5+vbqv&hFR%U&ln?Lwq3@TqfR$es`I$Pv3;Y(~E1O`WLJRtv>NUlk zph->F%2g(TTvg1XmZ9Io87gzb= ze_*8shw??1fz>=sKKK-v$GrjXwCU@no*FU*5iizX8TS5ikv{VBRc+8V`TkxnSD;HA z+!@RRgT)KTooVbfwotAH%KuZeSK*PK{UCiIfVJWM`i9RdBiGHZ&Ancb9(EgM)r`dk}%YkN26pz0IboA@uY;dpagDM6R=L3jVgQ9fM%tC=ekGtF4E~&|L*Izu0rHB51rCaE@9}j}O?ijKb z*Hak(Wn}<*66MSNsknPVlP`Ta>|!!|#-W~Ci6W(V5&fT>kp!P5j(zm6^vtOHy_~eN zat{7J%sY|0HkZa0(dra2^7qAr^-`bTCz|5f)^8;Rp68M5K_0C#*@!=k0?;BLf-)zR zFN~)z<2N98N!Ea_Q-2?AQzP)4l%IA2ydlQFtf%BWP=?a~UNddy2;~@G0c>&pUwn%L zfzQE00i^N4k^(r*C;z<&>FARs%m=i{vO zMf~h92o3(jEG&#T(bRiSvjt-}y;*=2jc#9s#slRG{b*l< zMl1XcR1xi5L4K2_P&w_qEaVC3g~L@f13)jO_|NzJj`ZZ~;SA|DFDI-7O1%FdXlsvA zW9j>+>zXEel1@9XWD2f!Q%|7VmPWqs2=_q4# zs#TzFDy{r>&TE)OcyGrbmcnNyyW<(W?-r{6^ko+f z1(dJoPhP#K#RK_eKZTD+q>=#uW`P6Nlym82{js86ia&=(Z+61R-pTc*JD7#}S_SH+ zj}6)H&x`mU@LS)LD`7d0LF3=_OxRBXdSmRyJ+7#We5(*pLHS|dgO!5&8dUkwn~B+u z@h6?HL0=eKCja8j(959Dk5`rT`$6=j+OyFL=~XXR)Lq&Fs~>R|1#1H8YBb7^7ALP9 zc}Z#c`D?Jouki64KmCWC*59$K|1Ug%JjU?pS$`?&|9xdlC`cX}y|uST_k@I=r=f0Y z1cnOy+c@SO;(sP_$j2ATDEC{)D3i|SOlB5rEzawUxe&^iHsZbpHGhbnJ zm>Y#pVYHn8KgYo$~Jku&q z4uhh6+}EJX_kKiu&lzJ+X$D`~ABUc_?8k{d?p{LgRi?*wx|b8)QuV^-IqZE*UvNV! zv^f~c59`hYB!VWt#C+%R@>7BSFBX3)uGXjL`ncmdK&j^(7s5Zp-yfTN4|FPVnUx;# zdxgLJGqeJLS(wk$NH;({U?_Xol2A^}9kA z=sgb3a)n1sKBzSRz!_8WGO(I1z9|bn&Ui4SPrIw|y{N>O>4$hZrctgRBui}^2rV!# z(qiC&$p7O9fcek<_;T3|A2yBalsxa<$u_Jq#%L;Qmtwtg-nWBK3t*L z`7~?iz{j9rR!=1Fd<2wb1T5WA?*(iV^fne_Re$jKmo_4AIc5@~&JUueaK0$}SM^`> zrEj&+ueX%vpeQ@GdkN>mVK;vA+u;o9buSm%mX8oI#T#?5CsM6OAB6mW{wAP(ZT=Ja zdjLQG<@_hOGvG<=3!n?NX`DIkm94fJ}2jx+P*J?xntYxwtQN_)rom&?NLrMGeRQ;7mtCDpwgYOGwLw@q`-@|RU& zR6;MSdwE4-q&LsL{aHfUoUL7%eD|B;j@|K(D5od{(yuz}>DK^$SeK6YIexEq+QHg% z!bECr&JUK}SOBXIQ?vSB*S~v8G-0%%Zff7i9=59n0{0FJGwLM{IS=faAlYz2ox)cw z$Qqe_Sb45zU&5MxW%kb_L+FS9s|)h2AK1hyDSNA8fH%AnPbO;`mfX4uYLfZP*F$hvi=`UkNDYff_J9s7Z;Ki z3-(*lIMa@?4ms(Sgm+Uv*;voNeqpl@fkQry3BS-U=J-Hx)_yanvw^A|CQtbOwZFoO zz8O>B(bk|zeL-YkN zC-f!%Yo1``SW4B-dH)xBd5vN{)iiWHe)&&;xsBK0|GzZv`>(>@z;DDa0C4=+%B<#0NHIfzx$iT z4C36bxTP)D}5NYl}`qq%jzz~SmYe8c>hqGhO*S z;)wn~(?YH&M;fUQQ|v`;Wn{F!$)o=rEPW>fcaE&o_b;$~a~;1KgwNDDwA}C4)oH-$ z?v9*|=R8n`%^>_Aj;r!22JZ5QUUs}||9g17Lg+V4KGzQ+(&F1w>Mz(2**Q@2Uqk3? zGuVM%mc6dHeh~evjCaLzL1}$4%2%nlVt^d}O;(ppwfi~Cby-#fKJKde=YjWseiFFo zU+VWZy^`-%4|M*>_=_*@04^{t1dmzi5kDU#MNGCbZ<4W#q_?6{jWvJADG=Hc1CVC@n2Uzd?bNZckgGbbk z=%rAezpDB_q%V6}O}4v-6?9bt;p4fMkMdROTK2-aNZ{l)k8FbbEx-*B+>zW-yfX~wXfSf(b=-Xj0^Qmsn zgWO-2^T6>h_lJsA1EW>UNl1UA!vd{d$R3=2ATkQ6cQ`N0$8lYfPrtNA@d9Fwx`X(E z@Q&EpUA^*reMP>He)?X0_B_nXC4Zlt$@SkJTdYMKi%`CXK)rtb1-$k5jo&%_K9kk{ zuey7G3)^>nZNRtx2!Anug;{v<+q1LMBYr+gVcltcTG)AFaUuEZ@|!{U zOpm}aN_Qhw%I^L*NE~t=MHw`&&&FNqzqtijVTipqHD`PD|1sxMluzS2r*wB<-<#O? z?)(eJ9BmF*^Ia>`@4dd6`#ZQ(r@#0>%Q=GYv&UgxPEyc0);PfTqV?{I_kW>$jiUIg zIUNokfW-gTdHa|Cuef{TlGFHS;+}j%!93*^f7|kvzv_t`jw|9Xs|7GJiZ%FI=@CC4 zrEuN8xOQ$WK>RLV+Z3Y0T7{=D~&^!I>8;w;yr#r~>Juhgn|HeCPv%dYKj|8PHYyMM=j@AuEsJ)`Gmz;)qk zufd#o>xbNvB^;t0YkQnI+t$$c#W-}J^l|kZxW4yBQM&o|@Oy7`>+FW&hu7#ki^xSs zK(ulDB)^vKI1D8YIgixZo{3yn@G(yS*__K{?xpA7fF6A1FRxXyp2Pv=r~4C>UqrCx zTh7EYIoA}iL)tE4jND&UXe}v^^87=y56239)m{n`_4P&{i5LDM9PA^K$ zveSydS&w7yhRAM?g*mgV5aj#6&P=2@>m%iK+J9R8+EBaX`fp*4`$4G3n&Xkp%ZBRT z+BF1bLEvbzg8n=9pE8qWh8Zc-! zoLvNtt6!Q)FIoq#@rsrG_0m2)xr;pC|5fANo;3uHI|8TD^NpCLo3F=&zXH`}cy5lH z$8632RQ6uO_y`d=?*6Ii*AQq393BEKf;0pg0%sS2!}BbSb3>pZaNH3%yPmIE-VkUA z9C!cJ^lJz-1P%{@<^dZ54S}>_Y@ zo~3ba2s8waI|66d^EJyG0u6!V?w^`|4S|Nh;UUmGU_+oGaCQ+mJkQcNHv}32#~p#Q z>-n1H4S|NharaM6zlK0V;P4P=9e&vM%pShd0VA5`T=#ce{KSHynUr?i6$TQ_FR!;v~u6{ zjGMEhWM`DemT2<1jk(4V@$J-NAbnAOcBDm}Et<13PK5Z#-S!koVpsTK%ZRgVwAW??JZ_D19i`u;UgNBbx9h``%AwY{s! ze*w6D&q)MiR-zXBroU#e%Kr*>j?-UhjbrUvYN6?$o(?_Rd>#38mc1r=GvdV@kxo)< zzE0!EqV+(w0A6ptfPGHbim}n@;yuZg;9dUz_O7P4iJpt5%`#DpD7uEUPM2 zC5VJtCUwhKz@s*5b1@8H{`kj>j zeHZba(BjxKDQh!{!?S`8l)P>4+&J0h^DSb^nUs7fd@cBJD`gHBKb_PE^zJelg)cx_ zwDlOIKRB)6$r7Zm{AX}|k+f_yrtGgkdf8~bfom7e(v#)CK>MurOgq!9*H=^a6L;fS zd+qP&DDT?qCH>j_7`3>T-G@=v%h)rN^!=aL>F=>R)baD$BA7XfvC*`pLu-FO42C3z`ATRIBpI;O-%mRjN{d)o0PBLD{de1iy`PQf9{H4|V2CN<2TD`&b zi*G4EFne&aO2?{+Ay#(=#~=3d=IC3BdBKa6WpgcQA5k?C2V3K!$goM>^jy^~0DxXJiw!i#@+Qqw1nSOH~=Iobr#^1>~j)N4kery=qEq7p)iMiu< zl5Kzu&)f{f@t)9=&j2u@q-2|GUj)m6U48vQSW@6ItxKxWm{iCE7H|o# z(lXFhiYw%`A0_6~pWWoyPwV-VjiC^01!qd@>bw{c{-9hl&ppS;QkeTX7QXw6df?sL z8ixlnS%X;M#UfKn$<9m9!3RIzc0M=#f>`;_Fdl^5@9*1B*~gsl(%k(B{=kw!W1|RuzE9Q$*vON#t zr9tcpwHznpv}efNqODlNSf^X@8Tw1qD=>b9+%J4d*~gr)?LV+|=xW;HID~DC86)F5MC%|!J-ie-8p8XWoQg`cXD4{$t z4D!wLZvGf>4KhzH`YZOi2${!fz*(l{spy!^9~wQl>Y#IlIpia^IqTMo{X47{MD`nG z%2^Ob+XJ01By$31({nN6?ym$~_wXhAD0_sJYv;jYJ8QuZ+?G}#a41inu3Wcf#w zY~N+t8T)OopcZ>II^tM!*~@IdqkIm*TBO$fP{_WL_OW(@J!#*`Y_h|5Sgjj`EijCB zm*We6UBslA1?RQsuk?ho6|1EKYboi=6l?lx$bC9iVe~3T?!DPj5T|{+@l4Llz4i7C zRt*jp>RycAi+kJV@QC-xw&JWZQ$@iVdXxP$7P5IkC;O?&1ET73x}^V|oApWwgki{&LYX`G^>?@zCVP5bMa=(9{vX2P1m4_AJq4TWf^>q2u zjd_9I#V^-0)x8s5wG@xy+*{T9fen9q zrnig>$D?!1`Ye|h_&eIOlzq$z z+Zj2=bT=k;m7jHLXS((JYRZ1%ZX9bad+976;nvzfR1PnW)oR(%b#QeN#a{1W?0@j> zJG|98KQ6;O+vj>gwcx7V>yaHBZCeaWB6qaxi&3Qz|IdS1|F&f%Tq{1vMnA{YS$=kR zM9gVF!I|AYuBW;f68)SP-$Ph^>;cJ`?Nl}YZ=Uc8lNGDT^nxf_CLlzj6IoI zv$c=4gT=ub>iA34bx@w0V#Jkk*)z4Z>yMcCSp4A__YDhn#i$LlT%A{3{=ClYS`#`9XX5Op zt5hS4I{;ulUyCLf6%JQ>kPmzgX3>X*RrGMxL1X|vDnzXgrDWbCG$<@H`}ZMx6aMA$ zg2)5xL1RCe6Jk!_GMZiG_hy~i8ToA^ZOXp=OdOLH4gGmX`K*0w0BengeS`gcF>^RJgFFHE>HXS>HCD-Z$#dlA zLdKDj#x@8x6!}O>ZiX`?J->(9*nB@&MK7-72KTxc>gHn(HR%gRc@h0E4rKQ4W36N1 z5l8O#c|qhu%0A|VZB)b62v?`rResi~of0uTNBc{=rVzF>lf8u5M^--6SAE|#uR#CB z*frw^zI!>HD0SK9yf`*4Vvid>K<>~Cc65!gxKKe4W+a6=LC8Jf`z${PoE6G7@3Gb( zT2zeJN;7h;%5$I=t+^NSfyzq6N?7*Xn||icwF9vh2x0`! zw8^0WnT4-}r2OATKG>`2+VgUKzkFAJc5a6DMGsuuKZxh=v8P@3ve#AK;Z+)s^4a@b ztPbU~{x?YAlPkE!YvVxdCS8(Fos(jGIA zzw#Y8tQcpJ|Mk0Y7H@UQxl=4P+jljJhHLfHd7w$R2U}Q(qv~FaWQM;FE?lHcc@XSX zka-VOB62&(aFu`2?h4=Fiim$6(c^8;l6e>AQ>O9&$oTo}uJZdcY-fv_?ZMmcewDie zeu1=jRvtg`RUz~r?^5sb&)TQFL5yr0^wH1N1G$QQtQ=up=D(M#$Zu)eoTH}33(aX5 zWgPoT9u+YuWI^0xE?CuZOem3ikNlk3>z30R)NpMpZsmL|C5v-3J@*CH*3lI4spJ!| z^3ZxwsbpLWq!)*>(t_A#EQ7zw;_rvo%MZ7pQ(Z0WTujCRE$>u#l zH6ep!5dRTH_b$QxR$t0K=7enx1(5N-39+kuSYdHK`v`V{be?r=YwgcYEye6qi-5ANt~ zhG*FxDEl9**<-Ch-Jc2t@xE<;adDh#Ls;T5!+lP1O0>c2+dw=bSCan(#AgK zgeLz3WEL-+o?YdGF_dn>wd*lw*Iq&U>31q?OI0))U1rvvA?`WXe7jj5;; zd&Ji)aD-=1<6 z0&@nDUtn&Md45v)afWk3Z&#e9xWDa>lzq$z+sXqVyz36XkRbUe~jZo8`@WU9#Br)8SG721iy(L zRltIA0h(HW6%$-YmJ;W;kIVA9b;BYUqhy7#U0Hv-%rdu+-RcY@aZvSyJ3V{BSyXv< z5vm{^%-7Vf6bS?tpJt~4Iw=mdUSJEPo+1L6w}@N;Gmpal{cC9}eO~CvlzogzZRG(q z+g2y%)!WDi8J25jumd%Ve9C{duLIYE9)ndbF*Z8NyY^;A)A{uYuCX8nw^{knKJM9D zfE?S+at;g?}fk*mRLKY~m_vUsUALES>M2BK{(U>wEqCf4KkMv2TXufQ|G$7$39IE6d)_4$f=@ zKf603+rcNu_~l)T@cmi%D+pGmIm)~!@EWrQiT@*b^CysVEzsA) z-F_E8N|6FICGBIcnpUGmSEtxjKK$E5zMVLm&5fX>ebqwD>>iU94UJ((dB99!e}4Df zjUn%QP)AzifBhn|AH;u|x#4#Ns{dj1*ZqUFx#S8;_}lrxYNKF^4F6%I(Dicj3Zh|Q z_jxOU73a?Rhqb4UIREL`k}$$U%#kr%pI-}WuBGPMQ8?oSSuv{*xNxhmW(KEcc=|sNC0o@z-b#>_XIr_^UoCwE}Ti;FEF( zi6^hD@5t$*qKk1LKY#S-+~_CY&dq!DN9+@`cI`1`KbaF^rN{l6(5~{qZ#8+Of{14Q z4UZ}N>Yku_aDv&3*h|q--lGg>n4|fe6A{e+`gOSbR`-7}1|8DD>XQ6L?QjoB^H-)Y z1A=V9wIO61$G#c13ZqvLXAUo#6@c)smR;0V5yD*vrFnMFGpt#|N<`$f&=E2xvaft6 z*j>mQ-7DnUm%;3>kU3!9b7`x`_x>-wHa?Ws5F&qqXWC?4Cb&0cAFtgSpRk2a3*Kw| z$7^NzAgbARe#ECP^LtRymL0#r^Q(t9n5VkzCEWd*m3QsMu@rdu+f*-ZFjqRv&;C>P zgZ+TNP1d==7KjW?)gOXN|DyT*pKIu`^sitAyW2ebI)(`OHh7OUMinvNE>Et4=$CtP zP1?xvb6`)($n!H~$FA$OYToWg7$2af0R5xe}dU> zn)@41wy`e|adnC($~RaWpYd8S?Lqy_1I{=f*G_MGs2d>mdzl$ z**`u*eSUm*ln?Q>?*qMP#lHKUt6eB9XutWU1iz?Zwct^XaIE#Xzw(0>DOD3nyn^T7 zwumq`jv>n^wu)Y*s=3t?@N=Qg?j%}13#$IcdSSjB%Bu_jBT(eOYEgL?B+k^^ScUV- z>|VqmPl(YISH$W{+zPycF(l3Xjl?$g1v0ME{X}`)s`mE-g;vql;A*x7o$P;_<9uAi z&W`eku6T!amcZ+_J*Clz_RaUNOGfH5m>}0ve`~Y-_8^++Jt#9*HEx)<^Q_r(Nu2=; z?B^H>IWNE0&D(9y!d3r4SG%2Ed*?Rxg+F$l96TK%?g%hUd}1OJuG43v@)=|&|L=nOxS6Fl zSag(+aI^T~x&)V-FdK>HfBz3NW&+Xaz1{@q!3ilgElud3-jkL_Tx2m->Y5a1AN732>V~4 z)U>iZ{?Yzzt2e6WBPy?CMvavo@s~1j4I)!JLiWwXsC@KjJ}Fhu-->xk5P3i=&f;@> zy%HMm_s|I2VBOx7r4wZoHoD-yidA{2L5muJ*myxY6nD+!sjX$Sduj^DJ0v^Sc5t|IE~mkbSp^yMh5{M>yN`40w@YotRC%j6Re5sN;L# z3f3=_?8O#q2cSu}2xfzlWurT7`|;_mL$mT~?nZ3WYZ5DD_Tsxv{usZ|t3oeqV_)=< zs}ns@UboYDm8{EN^=|d7NXU6@7SH9gFC{|Nh}$ zu#$MJ9rg__;p&O|GVwZ& zarEVCNA79mW{+2iX)B+#Pe3`QdbN7DMHGJzeiRuW{kVbnfBRvJ7@6Wjzx(cfUDz}4 zeGt!kYgv@}0+WZ&1L8MG%zRG%{(Z)w z#VrsJ>k(V*iR>JYxA3GFol8+07qjzTbpP$PJP&)%iOZg0Tf_>2*t0&_s3!MHJj33a zV81*M7JII(kh{Zj72GMcT|A{3)VinCis$4jS$NC{$lYObZFtN+7kqnes~HoF_hIim zCoX$_ZISckEp}6kbv`YhN_YmV8P8$7g?zyGV?sc!{<_zg{Cc7jk z?CzuG&w<0(1|mQNo`ygl96}vLfCx+zfv2$srHB9#cn%0mleOqI5g-D6An+VGjBOwS zMBr%%^uZz2K?I1vG!b|jYfy>^5P|1_z%*HlUK0T#&<6s~fy3AaB0vP5hCm-2LLEea z2uu@!r?Cd5hyW3I4hT$>wdgewAOd|L@EkadZ6E?f;Asf-!6DQ^1c<;i5qKJFP>Ki; zf#-n0G+B#Y69FR72LjK5!`KEQKm?wKKpz}J9YlZ#OcQ~pu?D4x01~GB?3g?KSkhatWlGif8HFg4j1-yU%Q{5KNAE#G=2Wcv}XRhd3XFw+P3!` z+tF`i{g`(P`)`(vT=t0?ZbnZOJ3?7xD*G9CkO{*|^*vYoy0 z*!x?I`QqJXD@N+gBU=6Y2)v6jK-PZ#elKicv9I|5>mp|U_R4i%HmGO(2)qcYKX2#b z_xWG;u%~GI{zAlihylN^w_u~5yrISa41o=fgD>;{%oC2KE(r9)edm{%=zsC!tRD;1 zG7$teA_KTI>i`q+e3J9`U9s)L5%qhnko6B2zt{Kc56ffD{Oi~~yE|Sl?^W;LUmf2t z_KzNcUHPMtzk}$%dc*yG|70xbWh@c7zluO2`h4E#*A~n*Z&!ModH-*yJ>+)O2SR(Orns1~BxxP2oca;a+Tc5vOpIli~%GTRY=hENAd0`z& z`mZF#sL6jKeS*8J^hWy7sVC0ftbG4HKK$v}d;2rMFY#T-TlYM3{SxZ-?Tr4mzIX2^ zSNp$x=e3v5a(f3ZJ8D>l^#}WY%f06*1njkCC4-qC$E~>P8izkxE9&^F$-O>{D~Bs> z`~BLsN*!ZwHXjoG@Uq+Li^Ol;w)4j9-ZwUXm-}y5c|fkQe=T#$!?N}EQ$S3j*Pa)4 zB1r$$-QrG(x%wnCob-Fk1fCoQGU&$46Jve>U&1%L6Q#zKib zU$!3bwp#?8+xz3=W2g1wuRiMGS*QHPVz9r7?fWY>F1x!Cm+MbxxqWwncjew;1x43S z09756-+=zmn{SZ0d9M%FdG7Zuk@$T#KHflkuKc~JvmNE3{~wk8U@z%9Wiz@4hzSHN zZiS~%r2k6t!s*6-SsY|?2#~kcFX)l;T+iFi5Nkv z(6Wv{U#wkyRF(9ghXQZjC1QW;!9@oQBz|`d%I&jz9b2)ZJoNvAvVUpqnq#LifQU)- z+VjFVmj3Iz?Wl#ymi8r+&w;!hrLqm}6Olo$+dI|qLEbISFESQEQ!qB7wu^iQDTpNBTO?3^}@-LCS`|0>rB`=MJF zm*0VEaItYYZUgwQ+iUwQtZaRXW%U)1*ZGTnoyy)Q!R2|Y&uC5l{{a0h z?V9stQmWD0@WK0tF$4p7HVnDLypPuYK{hvI0$mX6LSMSfoI)A<{z@<`SWI7sIj7ap z9zPW1^Sd7v7M-4dL(C2z_Ri#$``O1JzN0thse35_=hb!i*P^Y>On)BMf{qHU-<$0! z5B-0(cMaYv-#TP4Gej)Zpx>waTwj&`H7QX|CJaNPq^&+sX{o1jlLu5t-%N= zXwa;Je0zJmd4C6tVrGOH{sHb2al~;@y@m;~?$z=O#yUF}%h=aEXrDTFHmx5WatFbq z!QOS$R^U)%@73!K&gL;z3wypr*aOP@BZwZa;hpwNdQ-{XQfmd?a&so}Q;{l){$~9l z>3JXW(Es-{7<;-WyJc~?8MGY>g*YnPZ+g9HYdjt@-vp4i<26|mNMcyYpbK>i(~q&A zw$0{P%0M+6K1%*DGZmQ86ywJVx#rXI^bY5a)%Alg*3G_2e+sor$K>*UICpmhu_ArF z7)SFOfc-x;Ob>IvV6L9B{bv1$>o0fECmV=}7iv{pdV^8w@?`UEb8;(t#m;6^mYZu5 zvrQcRs~NwmX>btI#YjYv5^K*LcS{TGMjJZe{Y=znPWRi~N1X_t(7x2FFkZmy;u zqX7P!v8Q7$W^wv@riu^pUt0aqnnrBbT)~x=OWk6u2NbIJMg!yz@0yVhC>AoGJrNUb zPOneQjINytC3Im1#946jh}K9+qj%)f%Lz{?O}iRO-dWDGP@u^{RnXs`L7rmTw-Wtd{QgF)^f{b=FAjsXW)XX4dpP&7aYAx&q3+shg1hh6 zu%Doqd$jT^nJ;V^^F{k%6;;Jd;QwqD<4AgcVX*;OVZ(l&Jj$3YwTg3_UnJx=ub0O+ zChi@}Oa^KN3Ax#x#P14XW^1_;fp(P_?UOxun9sQqh(hm~hzFUOjmrrHr2oFf5LJy| znJRul9@^3D-$>YPT7kP~?P@>BCt54D!3b%epWdGgy{lkI@GBd0YNWMZ?l-NBLa;cUd{|ey!xlF&QhwWt*9K33rzAAG5z! zcczM;l9%3y{e;e@!&7Ezey^>^UY)snV`+T_vhB83C*_OZ-$}Gn6&>Ec%vo7J*Z(#acI(AN#Dls*AumjMeIu(ec4TBcNy)>t zQvL+v$7Q?LqCS?SwMUR^8VxWGin}KpZaKsGK5*CKpun6scX#Ww!07EsE>Poo=v#Wfj|BI_m(tmRWBn9DVfKd7npMfJMY~(Eiihi`q;!nU~b^e!`m(~0Qj$J zEyLk)OJGetGxH19Dq`%q@VE8obv6UDdVkki7tdKQ%RBd?_<{JFcdn{oJ;fv7{{;D5 z|9|L~{h6E!B3_%ZN?!_jVby=Dr+Eq!+ujMkh0BYLukwFbJ8+R6_IqTHN&OWl~^n8|mE9&4^;&wO3%KCb@O1bE&1_VR)i18%2Sso!1hT z68j4eVZ|2YrPkl&n3$5Yy&`N`BHL-VfZaRg?=Myl4=$SDtT~hXRc2v%r{zcB;!5o} z*u8YUKf_-lusSW<#Yd=l=jZ83_Ve1n=Z0}*%kpa&Ah&dX@pvQ73heLgL$(n`9`8#M zkNK(kt(mWOpWN9WSjEZAS{)vMpS27cO8Y-l{%B?7aSM4sQ0iFJcfNW2WW+l#ZCiQN z4hn1F(tmkwq@{P>nmmhTq+NYps(?xTuF?i;N`=g&X(x;vlPf?SDLG7)ice{Pw!2h-V7l2=jfm*Vf?gp3#bVc_AMGe5_u|EFK5tD zX>6k>KF?OJAWN<@yU$R%#$LF4shO()`<2;C^Dr=|${(Kef*NX5vFPXpShw@H<;mS? zr=1JdSLlVsTj1~SP?-pyCWN?W_sfCrZ8Xf{0xdA{_wroYtUSN4tGsN%r{GtP>b>70 z2>oX=R*1`myioYR+7F(j|1=lTHIvB-dH?%B9dnQ1R{}1Y?;8H{lI_!M|H*G)o9h7@ zkC{EZmvf#)W&RHA^K!E{M+UFVR~3UntkTSV2l1}NoeBP{W*f-e=AF!8vgeuD z4zt%+CSI-Dm~nf*{<$o#eVbSWyY&~p&w#(LVK%r3c4Gkkht2N|eujuz-9?8Qbo z3OeQ<;rh|#=h@K`5UBoo6J$PZ1}-&Zo>{O60()teoS(=Q$;Cl|IW_lIs@B=Mxs7~S ze^5_*!OppZMVY;{7FqKy*E*d|Pjt!O8lA@>lFjp2AkEmHiPeg{}bdP*HOMg+~g`)kN;Ft7N<|D>HW*3Bz_rFx2aCfir8dfmgp|3mi9{zTg>1)U) zE4v3E{vTc*UrFxJam>~vGYl-|M}DT{&f4Em$;dVw1hGy;9i!u=<*Dp3j2|Ui>Ceg@ zv~9_*AH)7FRqJ(aH*LvR4t$HS50r%L1C@W_=U9({J???+#)Dc02KZ@-X2*ckl*xQr z|96!K^i|}Br!K>6$7ANsBKwPW%s>{D&kLoz8XqtMKhH#T4J$9H_S;%JGAk7DoveI+fh9d>`LkLCkK&Evy>9heh;>5Ncu?T&HVVm^YBkoi zG8j+l>$l36Y#pPVJ=9mzGM*kROe|0KoACtlhi3e=V@B#J&ORgO7~sr5cFvUuUagFYIsi45-NNGL*bUHpxKE9a&7t+~)MP38>tDhc*S}UvLH=GO&H0-^G}CPTaPm%iKSB-d@+PfxmVBg)u&eC-9V;wQP@d4*=+A=1+Se>$kf{2mU?RV;nPEgeP9k-p8Y8?R%(Ouv}|)V_v^o}$}6v}Mwq`XUg{MD$S5=h@H~Z` z-#U-*Q|WaV59Ixa_Sfd+2&hEh9p$0_&0G~U=6-SCwI1*GGiJyO3S&{ot9UPdd+Jsp zFQaQ_FM^PFzYo+k_h?77$T@_zbtP{w2tfXB)|y1kLj8_a`dj0!2GK_G=cgt79;s%* z$}3ng(7b(Hf9l+5g;=L0?d#%4huUwjep;z@rrQB?HETUQ7FR*eAqKQ9xIO8#?@z=V zZL`@m;4n~EUTExLKW4lp@+)OuRSvrJ0mP4sHp_uuLds`88qZzjq5n;fW42RS|AzcQ z;pJw`fXR7w1PlK!n(^U!{*RIoxkzRggpgkx*zpIsMGGMv`mt`y%}jgc&_Z@ZfzArd9QZ->%Y9JcK+{x;tnXBs^0&O0Xo)Lk` zA+QZYJ+!(H_;`Pp+gtUdeTDxzvTXkp5a@$LsDlU) zfoUQz1&*SRM1TkkgTORdi(V4}BG3l{!>|gq5&L3C{V44U_ zfuran5g-D?ATUkVqSr)#2=sx#FswqYM1TlP0f9a^ggS@-5tt?dQ{X82NCb$$FbGVO zwdgewAOd|LFbu0uD-j?9Q$U~(4xtVrKm?|Vz!W%&J`w>UFbo3IWG#A41c*Q%2n@q2 z&q3?_^TxkEK8F^u4MZSBpbrjto;pqz2mZBuo^52S{&fUGKHz(c!0K?}U!Uz&9*Mwn zLf~KLzkK`O`slwnnC0)|Cq!Vn2s|e)>$NRMBKjY$_j=V$ZA4%s2uzo`2KIa-X8()t zjQ>R7St7u=mO9&KO6M+H(j3^ldevA13 zJ9EzyIhWdqz*rDq{7)nBO;-Qc>3evU2uvM;0uQO(Z#PegaPRfLx%pEh|9hFE&F8bm zi#xyef4DeqQ2IF9Rvj<>>z(P*Yk%c<`QPLEPkEqrj=nE^ubzN~`bIrLs*4Ynzy2&w z+)K@NufJZH`R|K|E#|&AC+in3Zhl&Szq8tl$BnlfpA{wDyylJbU1``jne!yu&sktk=#lrmG1mc=yrll*++nW#Z*!IH zb}vNsujLhO0}vLT8_(q3jsIK7gJy%H@4?7Y8i{Wb|Ah3Z{5;VQHTksF=<3;<)nog; z(LM3w`g~Xal}6W-7mp9WD*Dbh&{Egxc1$ItEk|66c(-|XA>OsougX93<69}!oZp(r zS(g1EX4;Vk>tFe}mU2Jsz1Q+;8yD?o(eWL4|3%`l_$l$Ycpb^^&1ALUaM9KaZlwLg zi^4Mm5`lKF!M(heuqZIyNIRzWuzTTB+?&=UZ8i3###dSf5Qy~cA}=+!db*4n@L?(a zP4x7Y{5;VQHTg7Z!PR##W*UnZ$KCSajQw{ouC>Njg_Wq!D;$NQ&H4Q+mcvZsGyglr zY2(UCf;X(3J1#%TDCExH&fOh3Etk@EaDH2rZnQ$QcC&S#iySOo{dp@v=LZ=~k- zyj$KVy!a~py@|(+?1@i8&fZy*xAzr}cXG7(HoZuA6KhG@-y}7z&lCPDjdRc;@lfaa z{VOepeU=O!o!582A4N=M+2>`I0qvcswrACZdw_ANCrU**fG76%-QD4Kx;FhQSl=*7hND($N^OG#)zd_h!4ugXR|b zM1&UB5@P^zxA^mqvPV;~up%F8jIONY2$bi)yVTGU_K$KJFOO1K%wNhjhUa&Yzg9=f zMM3=X{MDSfh#E7Ox$?`;dIIJtagUKbjU{wm7Jukce&xjj_+}N_6*kX4}1w3 z1K(FT>^(+5lwDNV9OgcfIrVux^DxW?Gau6?h+#z^%G?>Wrt#3M5m*jwj$yP%L|sh+ zWGpL#thr+)ktm~(if#!!l9r7Jk$srS>U*FX5oL6{$b)8swa%WldcBr?6lEuSv!C+w zL?&31uX%F>c*&mA=jFcFx?}srZ&V_m0}ZmZ&3R$}N*e=Ytd!i}o+mg{a9}C=E9Ol^ zOBZ>RmLhWrD^eypUrUBJpUT-&+5aDj7E68cc|zYc+;xdM+c|xvH9OYt6VVOwp=7*} z2*&nhTi$A~B|XOc%@?i1LpSFT&#FavEEUd}6DMG;GS zQm%aj9vN;;MW{kMK9mti)bIBshgVQYL^r61RIBNceL!TTu!1|HY6N_$qumzrAlqV{ zh|sdX;&aF$61kb|!_;W3$;TGq3ZN}*wdaY91mrQh(*9?wX+~qT0tMBg!^O+>J&eY} z2rvv3&cQzcVOSCp0GPTKuBBAs*_=1>6x;Bj8i* z{}%Ef+oERu>U@-FN7>2#3|2Ez*=R++;>TRpUk)x#)EYcoS)@h_=#=&^)F*(S*7yg< z=mSWH{d0M)u0$1_O#hq66wJZZs^uBh6Opgr-5D_6g_)~@beYfFU)h5wwrYQQFTv$t z+r?E_@7D7pIr}eWFBsbnZy&LR3m*$Iw?)NYoVe8nH= ztE;9ukE5lMzwL$g=P=fqdOzmac7@Af0xLkx-b3h<3wY~~-{e`Mb%z^tCsr7Eu7TK4%(?Z`1`CQcYUFG*@ zkbkaEH|BL7Swg?z;VfCkv!3_Ey zm|uC3s#Sod$UanqbgTi4qG-0OyuvcbKP`5zR#C12p0~XK*@=}^v*3p|^MUGoqUUPz zDVyQ7`RD87)&1J~`(EUKhw0JcHDv6Yme?l=e7g=8QT)d~U;kWUHl1j*wcaq=ndb_1 z)~;7RI{r}C@(cn|uR7Do>yg$jlRTT3RiDUtq?&Jw2==MG{+jY1avv)%F-kKk@Oayv zPiNJ(fCpw}A+D(BwLt8YD7NQ`wF*QsvJbIF&-MY2s2Z`Wyz&NeFlfVLx%ZluK)eL$ zAC0u^xn?y3+mG2zLOzdu^a)^L?bb4|y#EIaR{@iLMe!dqK5N$=OCzA+0f=|H-m71d z!6MH0i~@7T@=V`yPU;9ztQ@huZE+^$*D(99RA1rggLa=3)UO{}D-w@PMFFCAbAOlJ zU%=G{L8vGfs<#?R*>dTlJ+JmjWFMljt~J99H>yVLDzDm*%$!WbtLINJQf;f-qn1wg zrW}KTjEuA$tV>O})4=M@j21U~?R}}E+j%3sisCC#@52Dz0uLk z#lRj)=yyBDl(9zVFVL>2nzE~Wuzyctug^1BdmN!>LTMHI zpf?lyFl+MOQvD3;^ev8+^`DY`H+rF$<24Kz#UTcTzMnPh1?!*fS~=_}%EwTs{y!mZ zTlSRm_l2GFIEJ)$6^<_jd&+#q&d74QBwJcug`A+Z2{AB@2gFUIx4!plZzerxSEpe< zSE=7a4@h0+yk1S0GU;dipdKCd!LIVb{x{K&MsuNh-S`4M6H2R<8pu#xJoV$DChza8 zpGhp-d3v-s9831yHwwm9oDr7x3l>K}!wr(}Z46&Y7HM;W1pfgqMJvN4=E2WI#4c4E z5+1aAq`!gXjb#a^^N$W9{Z8(9lFu%laI06m+Km-klA;oD&S zw;5zkwq)OZqo6{Pc&6|dWMR+>JF1iRH4DM|V;ci;4Klxf4tS{+YxDdG73SJ}$uXzY zmtoP`4g#1xx4a6osTL22vdR6_Ak~%oRSN(?;{jBUtMz-x)WZ0eTJJ{uBKtCXI@GZX zS{B8gUFDTGkbg!ksEw+)>f+E>x;{hC*$hvPoQgc6m4BypG8_RG){Eq55qe7YZQEgu zmxw?LQIJrBm*S|F{!RmTcVNNoa z_n|pU&!QZE26sD+;D38J)MMKj7_1?uo+ivZLugkIa`uy}(~wD&s<%cf_~xQc8v_!t z0(}AL=vhCV=|FYa^|95mtGv=9^DQ<0&Y}GWmH00!KYC^S9J7hdABjj}Jk;cEJ2S_d zQ}ruPkLxC5yZhGeT!3g@$-uzA^i`iYz1Z`ouWBJ@BGusf;BDgxnmSJRI6@lb4QH6X73pIvN&vJj8H>P;ek88gfCIN z4BL=cosKH%p-k`|xc?H~)z+S8dy##J#yayWS0i?n5Ax5Z55S_0fv%^q^^l!3^%n5x zJ&e$3=X{XeB;?Ur_zv>Nnhr5%j$MvJyYx(AEKczAD*j|b6mfknj59wi4 zjo4LQ`2qVTng|Wmph^Y_J*eX)cyus(lzq}$LMX=Mt+I<(?NCje`p_S2xjzP zZkfnoppA>KP{Apz-6`x9pTXQ)N3JVbOIPnp^-Ex@X7~IY<4^h7JIh0|!d#m#S()I7 zSxggwQ?tE53i$hQ@geaWYOfw3BBt;N_!si25_$@K%q&3CXAxo4DZYn#fZe^2mFQ&O zdlFS6wv^YJ!i?}iwpvB|Ijp}VXS<>oAy-gqCHUmZ8h*JjrK={NMb7vjeLuWVnerKq z|HIPiyVf1q2aT8SXGcrhcqc7)JCEm(u)?gW0}#I|6?l|Qd(h4T1J83vK(y;KjWjxaKdmgQ31SrHi*?DMnOL^VG zVE05h|E$H&^7vcgFBb-ubz5rkVSB^(`O1&R&^`|vO8NI-zsas(_8yLic=QF|U!6V6 zJ}HkrJ^wF9@ahg|sI~$VEe<R>){afvaggmHP0qJDl`}I=B4t>6*e4{DQQH-F4Cr=E5h`#rGf}tZBV|(-Hrt%%S9Dtcb8(e(hHtqsQhM;(DR5sSKh^VVBNtyUk3S1@ox|Osn~0f z5#AONXzl}l618H~(8<2{G0Nw*l-HWVYDOsov(MA#5h%^SwYT2)*s|7Ilh0eWpX4>v zy$|f48=WipeURr-^<}n?YXePgwao|!);|OOTzo0d9vUWjkMj@5fUlytqF^n_L0ALt znlpd~tr=!|i)!7~%AY}X)p;KxVcvg;@Ib3=b^r`~nA$I3ts{Gx>(oaF88-Dy2(qM z?zah7@~S&mYXQ+WC|G%Fu-#?^1iSxmFZpe`c4#BXc@TLU#=1>#m1WHExU6tocz^mm z&YMzu^wM%Su-d$UcU3&F_Ud*@U=6o02YZz9DRaIBlB$K@RSn#|%4-km?k@I4??fvq zTgvMe2GtB)K^L}ePZF#3cFfr$;xD8xPnx#F>Uts@s>xeB#bfY$e~lLx#(q&w;Scux zm`(gOp|=5UMl)ubCi{f-l=PT)SA+G(_Zwf&{Zg8@A`_h*!z$+C?T4-Q@V#5#`&Z%# zt%&u|dixIdEUJ~@t}n4;;nngZwB+NppFh4#;c+cIU*9|5p+)P$Ec^lFJqqi4UlZ91 z%g(Jf=;ZB7U)*`5y|cWJ@<9~4Ng?oI`L0s;Z#_v$|6IPd($GJFWsN{hzS|g@zk}yj z57$4t_8Hih`)uD`$-MObA>q6B4e>XvcD<#Lt!2~uGr^hW$-B)T^>;&0x30pgz0cQK!a=Px%~wGkv?5xqqYEe6rCy59NBWUXML*{u1w-&AH>ur+Bx$jGx6lZ9nAp z76+B^IpSZ&anM$Yw*1|2A%C?W!x;z&kD2m?rv>x4X(EFUt&6VD<{`OxL2*~tfkk; z(1E4$_R{OmJH(j8dTieMke{duws}Q0_aUtgrQ5HFOmB=0g~=H7?n8xpdNWO^pV}DH zK8N@uwujZ+^Z$;|{jRvJD=|-M_rNWEX4Q;=(fWHm2*0`kUV;h@Ve<^6u}kRcr~?ciZ@%*dyJUui;6= zXt!Hzf3PcVS6u2B>j$&i8K-SMcxKg%!Eo9Z*In<2{aX{9X@dVIcBgiEb>?f(_g~`S z>gBZ++`kzuo^I=TRWqKB!`LL@m&ztM)5K@*bnSkZ=%4&GzGuVryT%I2KR*Ou@BRd5 zny_0>#sAy*>HN;IUvsnHb*CcMR+3|5cKSmE>IkS^Z~isGNcUZ?U)=t9`nrGHcDHk0 z?V+FGZior?;PZ>AQ)*G2A;y2l#{3QW&(X7ajNe3n2ow>R5?9ezB0vQCMPU5VogNYa zA}|yJ{jv$Q5dk7FB?N}z73w7dL}2^~Oo^-LD-j?9{UR`ahN6c=fCvnQK)-B4ZA5?w zObLOZc!he201+5J0#o8D`bq?dK)(o#pP}d>5g-CXAZY@mk1Dn@gp!LuA;9*fC%)9 z!1x)89uff}Fcbp)vI(^j0U|IZ1cu@j>Lmh1VEhP7iL2-<5g-EnA~1f2qK8C)2n>Zl zzidKnM1TlP34x(_g?fnq5g0!LQ{pQ6N(6{NzX*(q%5&+?^vfpHMg)k!ln@w-SE!c= z5P|U{FeR>{uS9?d^ozjw8Hyef0U|II0{yZHwGja#FeLZ0^?^WdPoF_z)%SE%O=!D1c<5g-CXAZY@mk1Dn@gp!LuA;9*fC%)9!1x)89uff}Fcbp)vI(^j0U|IZ1cu@j z>Lmh1VEhP7iL2-<5g-EnA~1f2qK8C)2n>ZlzidKnM1TlP34x(_g?fnq5g0!LQ{pQ6 zN(6{NzX*(q%5&+?^vfpHMg)k!ln@w-SE!c=5P|U{FeR>{uS9?d^ozjw8Hyef0U|II z0{yZHwGja#FeLZ0^?^WdPoF_z)%SE%O=!D1c<5g-CXAZY@mk1Dn@gp!LuA;9* zfC%)9!1x)89uff}Fcbp)vI(^j0U|IZ1cu@j>Lmh1VEhP7iL2-<5g-EnA~1f2qK8C) z2n>ZlzidKnM1TlP34x(_g?fnq5g0!LQ{pQ6N(6{NzX*(q%5&+?^vfpHMg)k!ln@w- zSE!c=5P|U{FeR>{uS9?d^ozjw8Hyef0U|II0{yZHwGja#FeLZ0^?^WdPoF_z)%SE%O=!D z1c<5g-CXAZY@mk1Dn@gp!LuA;9*fC%)9!1x)89uff}Fcbp)vI(^j0U|IZ z1cu@j>Lmh1VEhP7iL2-<5g-EnA~1f2qK8C)2n>ZlzidKnM1TlP34x(_g?fnq5g0!L zQ{pQ6N(6{NzX*({eQX>vuRD)#DaAgvc(*!hJ5l z`)XW$z#K<*>euaXPXVIGSZK zX2vBnbQx$F&@!N9K+AxZ0WAYs2DA)l8PGDIWkAb-mH{mTS_ZTXXc^Elpk+YIfR+I* z16l^O3}_k9GN5HZ%Yc>vEdyExvvEdyExvn@4x?+e$_QjICEh?3kU$| zrd9jXWv68zvof$3_}Gx97b0uuI?O|y)xgfcF2JB|gu#e+0KhV62b2ME%L46bx4-`S zYx0&YTMkyh?}HWa{NSwxr0d{+D&m!yk>A5`-5ZEoFA1I%;@M6BIW-IMoB+&=2e^^X zc-;n2{qgmP`){Bj%uk4WG`w;jI*xt-{NZ(^f)D)l+u;%gN?JdDO zNP6C}sS9h}n16SL`>TLAfbRfpY)SyKPX2cQ%w@MV?#Cgne*?eTBx8HE+JuC$tqKCF zOqStZn}#oemk_0@gG5*M^_KxZH+&KsUyK;H{sc}=MaqW)!!itpIUG12*a9?G^9m9^ z4xrp!&{#9k$kY9@QT~azzbD+h*U0nP(8)&=@Yfc!0e@u*$iQDFG<1HpR(xzH$6?OT z@qjiBUjlXUe}5$D&xTKyj&VmR0dQaZ^2;wfN_Mw-J}nBcMEoCs#D1JifkX?Y7%uu4a2ayZ!dtCGNQ6j>whwR?r>o?!5C(ao1gUiTm!mPuze1 z{o>(=9~O^2_Lz9$i6_J}&pZ>s>#x5qC|7lv*Is)~j2t;q?7sW%VvjxcNE-tO4iuMO zdTCwJHR$tSfBjXK{j6ED#36?qBF2mvBSwrEA@j>T6a1~9?9_Fyz4nUxO!=`3Z~XZ2 z;)o-T5NDlrmU!!}w^GjYmMwpa6_>sy4xjq4IC|Q8an!Nv#nfZMIAZEUV)B#+BbanV z_+DKn9{!*R-#=trqi&6~Z03T*6g(nY63$UlwCW z`&6FMEyLImkXO813>>ybY~Ea}PmIU^Me*tj^ICD;b=Qfis;X@&Uz9!79Ip>@s ze*3NNSCi!b0q9@LyqAiq<|{QaPzL3`OU3RZ?nsvZ<&fg%>?HYr|NEaf{P4rKJNdH8 zTi?EYYw@3R%ysM5$@vNA9-K#TjLJ5{>OY;|9AB$>48zYP)~s10?!NnO@y$2i*j0

?uq{o2|6Duvt*Q_6 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

$GY1PTocCOW5WpT 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 z

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%0DrO;TP4e#54B& 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%0D@ReGJLI2~qZ&yBmbLVs}fi+JbN+{ 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 lP$#)BhB-Zvf0T< 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 mUbdgCBgK``#bp_+;Au=L~>*08c#h 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

o@r4c`%*d>-Eq^O@=& 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Ȗqlav$BrEFI5#rnIy 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%0A%tIt-h%|1kKK>#t1G#-51{22%gQ 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 L>ieZvy8r+GpqbkA diff --git a/utils/gxt/american.txt b/utils/gxt/american.txt deleted file mode 100644 index 94074819..00000000 --- a/utils/gxt/american.txt +++ /dev/null @@ -1,7979 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- - -[IN_VEH] -~g~Hey! Get back in the vehicle! - -[IN_VEH2] -~g~You need some wheels for this job! - -[IN_BOAT] -~g~You need a boat for this job! - -[HEY] -~g~Don't go solo, keep your posse together! - -[HEY2] -~g~Don't split up, keep the group together! - -[HEY3] -~g~You've dropped your main man, go back and get 8-Ball! - -[HEY4] -~g~Lose Misty and Luigi will lose your face! Go and get her! - -[HEY5] -~g~One of the girls is AWOL, Go back and round her up! - -[HEY6] -~g~You left your honor with the Yakuza Kanbu. You must protect him! - -[HEY7] -~g~An extra gun could be useful. Go back and pick up your contact! - -[HEY8] -~g~Protection means just that -Protect the Old Oriental Gentleman! - -[HEY9] -~g~You want the word on the street? Go see the contact! - -[HELP2_A] -Press the ~h~/ button~w~ when running to ~h~sprint. - -[HELP3] -You can only sprint for short periods before becoming tired. - -[HELP4_A] -Press the~h~ ~k~~VEHICLE_ACCELERATE~ button~w~ to ~h~accelerate. - -[HELP4_D] -Push the~h~ right analog stick~w~ up to ~h~accelerate. - -[HELP5_A] -Press the~h~ ~k~~VEHICLE_BRAKE~ button~w~ to ~h~brake~w~, or to ~h~reverse~w~ if the vehicle has stopped. - -[HELP5_D] -Pull the ~h~right analog stick~w~ back to ~h~brake~w~, or to ~h~reverse~w~ if the vehicle has stopped. - -[HELP6_A] -Press the~h~ ~k~~VEHICLE_HANDBRAKE~ button ~w~to apply the vehicle's ~h~handbrake. - -[HELP6_C] -Press the~h~ ~k~~VEHICLE_HANDBRAKE~ button ~w~to apply the vehicle's ~h~handbrake. - -[HELP6_D] -Press the~h~ ~k~~VEHICLE_HANDBRAKE~ button ~w~to apply the vehicle's ~h~handbrake. - -[HELP7_A] -Press and hold the~h~ ~k~~PED_LOCK_TARGET~ button ~w~to ~h~target~w~ with the sniper rifle. - -[HELP7_D] -Press and hold the~h~ ~k~~PED_LOCK_TARGET~ button ~w~to ~h~target ~w~with the sniper rifle. - -[HELP8_A] -Press the~h~ ~k~~PED_SNIPER_ZOOM_IN~ button ~w~to ~h~zoom in ~w~with the rifle and the~h~ ~k~~PED_SNIPER_ZOOM_OUT~ button ~w~to ~h~zoom out ~w~again. - -[HELP9_A] -Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. - -[HELP10] -This badge indicates you have a police wanted level. - -[HELP11] -The more badges the higher your wanted level. - -[HELP13] -Sometimes you may need to use pathways not shown on the radar. - -[TIMER] -This is a timed mission, you must complete it before the timer counts down to zero. - -[MISTY1] -~r~Misty is morgue-meat! - -[OUT_VEH] -~g~Get out of the vehicle! - -[GARAGE] -Drive the vehicle into the garage, then walk outside. - -[WANTED1] -~g~Shake the cops and lose your wanted level! - -[NODOORS] -~g~They ain't sardines! Get some wheels with enough seats. - -[TRASH] -~g~You've junked your wheels real bad! Get your vehicle repaired! - -[WRECKED] -~r~The vehicle is wrecked! - -[HORN] -~g~Sound the horn. - -[NOMONEY] -~g~You need more cash! - -[OUTTIME] -~r~Too slow, man, too slow! - -[SPOTTED] -~r~They're on to you! - -[REWARD] -REWARD $~1~ - -[GAMEOVR] -GAME OVER - -[Z] -Z-axis value: ~1~ - -[M_FAIL] -MISSION FAILED! - -[M_PASS] -MISSION PASSED! $~1~ - -[O_PASS] -ODD JOB PASSED! - -[O_FAIL] -ODD JOB FAILED! - -[DEAD] -WASTED! - -[BUSTED] -BUSTED! - -[S_PROMP] -When not on a mission you can ~h~save your game here~w~, this will advance time six hours. - -[NUMBER] -~1~ - -[SCORE] -$~1~ - -[LOADCAR] -LOADING VEHICLE... (PRESS L1 TO CANCEL) - -[CARSOFF] -Cars turned off. - -[CARS_ON] -Cars turned on. - -[TEXTXYZ] -Writing coordinates to file... - -[CHEATON] -Cheat mode ON - -[CHEATOF] -Cheat mode OFF - -[UZI_IN] -The Uzi is now in stock at Ammunation! - -[IMPORT1] -Go outside and wait for your vehicle. - -[PAGEB1] -Pistol delivered to hideout - -[PAGEB2] -Uzi delivered to hideout - -[PAGEB3] -Body armor delivered to hideout - -[PAGEB4] -Shotgun delivered to hideout - -[PAGEB5] -grenades delivered to hideout - -[PAGEB6] -molotovs delivered to hideout - -[PAGEB7] -AK47 delivered to hideout - -[PAGEB8] -Sniper rifle delivered to hideout - -[PAGEB9] -M16 delivered to hideout - -[PAGEB10] -Rocket Launcher delivered to hideout - -[PAGEB11] -Flamethrower delivered to hideout - -[WANT_A] -You will only be arrested if you have a ~h~wanted level. - -[WANT_B] -Your ~h~wanted level~w~ is represented by the row of stars in the top right of the screen. - -[WANT_C] -You now have a ~h~wanted level~w~ of one... - -[WANT_D] -two... - -[WANT_E] -three... - -[WANT_F] -As your ~h~wanted level~w~ increases you will attract more powerful forms of law enforcement. - -[WANT_G] -When you are ~h~'busted'~w~ you are returned to the nearest police station. - -[WANT_H] -The cops will take all your weapons and some of your cash as a bribe. - -[WANT_I] -Any mission you were on will be failed. - -[WANT_J] -You will find ways of reducing your wanted level the more you play. - -[WANT_K] -If you are in a car, ~h~SPRAY SHOPS~w~ will ~h~clear your wanted level. - -[HEAL_B] -When you are ~h~'wasted'~w~ you are returned to the nearest hospital. - -[HEAL_C] -You will lose your weapons and the doctors will take some cash for patching you up. - -[HEAL_E] -You will find ways of healing or protecting yourself the more you play the game. - -[DAM] -DAMAGE: - -[KILLS] -KILLS: - -[FARES] -FARES: - -[BULL] -BULLION: - -[EVID] -EVIDENCE: - -[HEALTH] -CAR HEALTH: - -[COLLECT] -COLLECTED: - -[BOMB] -Drive your vehicle into the bomb shop to attach a ~h~bomb~w~. Cost - ~h~$1000. - -[SAVE1] -Walk through the doorway to ~h~Save the game~w~. You cannot save during a mission. - -[SAVE2] -Any vehicle left in this garage will be stored when the game is saved. - -[AMMU] -Go inside Ammu-Nation to buy a weapon. - -[BRIDGE1] -When the Callahan Bridge is repaired you will be able to drive to Staunton Island. - -[TUNNEL] -When the Porter Tunnel is opened you will be able to drive to Staunton Island. - -[LUIGI] -LUIGI MISSIONS - -[TONI] -TONI MISSIONS - -[JOEY] -JOEY MISSIONS - -[FRANK] -SALVATORE MISSIONS - -[DIABLO] -DIABLO MISSIONS - -[ASUKA] -ASUKA MISSIONS - -[B_SITE] -ASUKA SUBURBAN MISSIONS - -[KENJI] -KENJI MISSIONS - -[RAY] -RAY MISSIONS - -[LOVE] -LOVE MISSIONS - -[YARDIE] -YARDIE MISSIONS - -[HOOD] -HOOD MISSIONS - -[CITYZON] -Liberty City - -[IND_ZON] -Portland - -[PORT_W] -Callahan Point - -[PORT_S] -Atlantic Quays - -[PORT_E] -Portland Harbor - -[PORT_I] -Trenton - -[S_VIEW] -Portland View - -[CHINA] -Chinatown - -[EASTBAY] -Portland Beach - -[LITTLEI] -Saint Mark's - -[REDLIGH] -Red Light District - -[TOWERS] -Hepburn Heights - -[HARWOOD] -Harwood - -[ROADBR1] -Callahan Bridge - -[ROADBR2] -Callahan Bridge - -[TUNNELP] -Porter Tunnel - -[BOMB1] -8-Ball's Garage - -[COM_ZON] -Staunton Island - -[STADIUM] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Liberty Campus - -[CONSTRU] -Fort Staunton - -[PARK] -Belleville Park - -[COM_EAS] -Newport - -[SHOPING] -Bedford Point - -[YAKUSA] -Torrington - -[SUB_ZON] -Shoreside Vale - -[AIRPORT] -Francis Intl. Airport - -[PROJECT] -Wichita Gardens - -[SUB_IND] -Pike Creek - -[SWANKS] -Cedar Grove - -[BIG_DAM] -Cochrane Dam - -[SUB_ZO2] -Shoreside Vale - -[SUB_ZO3] -Shoreside Vale - -[CAR_1] -Ambulance - -[CAR_2] -Firetruck - -[CAR_3] -Police - -[CAR_4] -Enforcer - -[CAR_5] -Barracks - -[CAR_6] -Rhino - -[CAR_7] -FBIcar - -[CAR_8] -Securicar - -[CAR_9] -Moonbeam - -[CAR_10] -Coach - -[CAR_11] -Flatbed - -[CAR_12] -Linerunner - -[CAR_13] -Trashmaster - -[CAR_14] -Patriot - -[CAR_15] -Mr Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinel - -[CAR_25] -Cheetah - -[CAR_26] -Banshee - -[CAR_27] -Stinger - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_30] -Kuruma - -[CAR_31] -Stretch - -[CAR_32] -Perennial - -[CAR_33] -Landstalker - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Stallion - -[CAR_37] -Taxi - -[CAR_38] -Cabbie - -[CAR_39] -Buggy - -[LUIGIS] -Luigi's Place - -[GOAWAY] -~g~You are already on a mission! - -[LUIGGO] -~g~Luigi's interviewing some new girls -Come back later! - -[JOEYGO] -~g~Joey's out on the town with Misty -Drop by later! - -[TONIGO] -~g~Toni's taken his Momma to the opera -Call in some other time! - -[KEMUGO] -~g~Maria and Kemuri are all tied up at the moment -Drop by later! - -[KENJGO] -~g~Kenji is attending a Yakuza meeting -Call by some other time! - -[RAYGO] -~g~Ray has other toilets to hang around -Try again later! - -[LOVEGO] -~g~Donald Love has other business to attend to -Make an appointment later! - -[KENSGO] -~g~Kenji is busy! -Call by later! - -[HOODGO] -~g~The Hoods are not available at this time! - -[WRONGT1] -~g~Come back between 05:00 and 21:00 for a job - -[WRONGT2] -~g~Come back between 06:00 and 14:00 for a job - -[WRONGT3] -~g~Come back between 15:00 and 00:00 for a job - -[GUN_1A] -Use the ~h~~k~~PED_CYCLE_WEAPON_RIGHT~ button ~w~and the ~h~~k~~PED_CYCLE_WEAPON_LEFT~ button ~w~to cycle through your weapons. - -[GUN_2A] -Hold the ~h~~k~~PED_LOCK_TARGET~ button ~w~to ~h~auto-target~w~, press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire! Try shooting the targets... - -[GUN_2C] -Hold the ~h~~k~~PED_LOCK_TARGET~ button ~w~to ~h~auto-target~w~, press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire! Try shooting the targets... - -[GUN_2D] -Hold the ~h~~k~~PED_LOCK_TARGET~ button ~w~to ~h~auto-target~w~, press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire! Try shooting the targets... - -[GUN_3A] -While holding the ~h~~k~~PED_LOCK_TARGET~ button,~w~ press the ~h~~k~~PED_CYCLE_TARGET_LEFT~ button~w~ or the ~h~~k~~PED_CYCLE_TARGET_RIGHT~ button to switch target. - -[GUN_3B] -While holding the ~h~~k~~PED_LOCK_TARGET~ button,~w~ press the ~h~~k~~PED_CYCLE_TARGET_LEFT~ button~w~ or the ~h~~k~~PED_CYCLE_TARGET_RIGHT~ button to switch target. - -[GUN_4A] -While holding the ~h~~k~~PED_LOCK_TARGET~ button~w~ you can walk or run while remaining locked onto a target. - -[GUN_4B] -While holding the ~h~~k~~PED_LOCK_TARGET~ button~w~ you can walk or run while remaining locked onto a target. - -[GUN_5] -You can practice targeting and shooting on these paper targets. When you are finished resume the mission. - -[TAXI1] -~g~Look for a fare. - -[FARE1] -~g~Destination ~w~'Meeouch Sex Kitten Club' ~g~in Redlight. - -[FARE2] -~g~Destination ~w~'Supa Save' ~g~in Portland View. - -[FARE3] -~g~Destination ~w~'old school hall' ~g~in Chinatown. - -[FARE4] -~g~Destination ~w~'Greasy Joe's Cafe' ~g~in Callahan Point. - -[FARE5] -~g~Destination ~w~'AmmuNation' ~g~in Redlight. - -[FARE6] -~g~Destination ~w~'Easy Credit Autos' ~g~in Saint Mark's. - -[FARE7] -~g~Destination ~w~'Woody's topless bar' ~g~in Redlight. - -[FARE8] -~g~Destination ~w~'Marcos Bistro' ~g~in Saint Mark's. - -[FARE9] -~g~Destination ~w~'import export garage' ~g~in Portland Harbor. - -[FARE10] -~g~Destination ~w~'Punk Noodles' ~g~in Chinatown. - -[FARE12] -~g~Destination ~w~'Football Stadium' ~g~in Aspatria. - -[FARE13] -~g~Destination ~w~'The Church' ~g~in Bedford Point - -[FARE14] -~g~Destination ~w~'The Casino' ~g~in Torrington - -[FARE15] -~g~Destination ~w~'Liberty University' ~g~in Liberty Campus - -[FARE16] -~g~Destination ~w~'Shopping Mall' ~g~in Belleville Park Area - -[FARE17] -~g~Destination ~w~'Museum' ~g~in Newport - -[FARE18] -~g~Destination ~w~'AmCo Building' ~g~in Torrington - -[FARE19] -~g~Destination ~w~'Bolt Burgers' ~g~in Bedford Point - -[FARE20] -~g~Destination ~w~'The Park' ~g~in Belleville - -[FARE21] -~g~Destination ~w~'Francis intl. Airport' - -[FARE22] -~g~Destination ~w~'Cochrane Dam' - -[FARE24] -~g~Destination ~w~'The hospital' ~g~in Pike Creek - -[FARE25] -~g~Destination ~w~'The Park' ~g~in Shoreside Vale - -[FARE26] -~g~Destination ~w~'North West Towers' ~g~in Wichita Gardens - -[NEW_TAX] -BIGGER! FASTER! HARDER! new Borgnine taxis open for business in Harwood. Call 555-BORGNINE today! - -[TSCORE2] -$~1~ - -[IN_ROW] -~1~ IN A ROW bonus! $~1~ - -[TTUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle taxi missions on or off. - -[TTUTOR2] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle taxi missions on or off. - -[A_TIME] -+~1~ seconds - -[A_FULL] -~r~Ambulance full!! - -[A_RANGE] -~g~The ambulance radio is out of range, get closer to a hospital! - -[FTUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle fire truck missions on or off. - -[FTUTOR2] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle fire truck missions on or off. - -[F_PASS1] -Fire extinguished! - -[F_RANGE] -~g~The fire truck radio is out of range, get closer to a fire station! - -[C_BREIF] -~g~Suspect last seen in the ~a~ area. - -[C_RANGE] -~g~The police radio is out of range, get closer to a police station! - -[DODO_FT] -You flew for ~1~ seconds! - -[EBAL_A] -I know a place on the edge of the Red Light District where we can lay low, - -[EBAL_A1] -but my hands are all messed up so you better drive, brother. - -[EBAL_1] -Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a vehicle. - -[EBAL_1B] -Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a vehicle. - -[EBAL_2] -~g~Get back into the car! - -[EBAL_3] -This is the ~h~radar~w~. Use it to navigate the city, follow the ~h~blip~w~ on the ~h~radar~w~ to find the hideout! - -[EBAL_D] -I know a guy, he's connected, his name's Luigi. - -[EBAL_D1] -Me an' him go back so I could probably get you some work. C'mon lets head over there. - -[EBAL_E] -C'mon, lets drop by and I'll introduce you. - -[EBAL_I] -The boss will be out to see you shortly... - -[EBAL_J] -8-Ball's got some business up stairs. - -[EBAL_K] -Maybe you can do me a favor. - -[EBAL_L] -One of my girls needs a ride so grab a car and pick up Misty from the clinic. Then bring her back here. - -[EBAL_N] -So keep your hands on the wheel! - -[EBAL_4] -~r~8-Ball's dead! - -[EBAL_5] -~g~Get a vehicle! - -[EBAL_6] -~g~Pick up Misty! - -[LM1] -'LUIGI'S GIRLS' - -[LM2] -'DON'T SPANK MA BITCH UP' - -[LM3] -'DRIVE MISTY FOR ME' - -[LM5] -'THE FUZZ BALL' - -[LM1_2] -~g~Take Misty to Luigi's Club. - -[LM1_3] -~g~Press the horn to get the girl into the car. - -[LM1_6] -~g~Get back into the car! - -[LM1_7] -Stop the vehicle next to Misty and allow her to enter it. - -[LM1_8] -You can go and see Luigi for more work or check out Liberty City. - -[LM2_A] -There's a new high on the street goes by the name of SPANK. - -[LM2_E] -Some wiseguy's been introducing this trash to my girls down Portland Harbor. - -[LM2_B] -Go and introduce a bat to his face! - -[LM2_G] -I want compensation for this insult! - -[LM2_1] -~g~Take his car and get it resprayed. - -[LM2_2A] -Use the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~punch ~w~and ~h~kick~w~ or ~h~swing ~w~the bat! - -[LM2_2C] -Use the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~punch ~w~and ~h~kick~w~ or ~h~swing ~w~the bat~w~! - -[LM2_2D] -Use the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~punch ~w~and ~h~kick~w~ or ~h~swing ~w~the bat~w~! - -[LM2_3] -~g~Stash the car in Luigi's lockup! - -[LM2_4] -~g~Respray the car! - -[LM3_A] -Hey I've gotta talk to you... All right Mick I'll talk to yah later. - -[LM3_B] -How yah doing kid? - -[LM3_C] -The Don's son, Joey Leone, he wants some action from his regular girl Misty. - -[LM3_D] -Go pick her up at Hepburn Heights... - -[LM3_E] -but watch yourself that's Diablo turf. - -[LM3_F] -Then run her over to his garage in Trenton and make it quick, - -[LM3_H] -so keep your eyes on the road and off Misty! - -[LM3_2] -~g~Take Misty to Joey's. - -[LM3_4] -~g~Go pick up Misty! - -[LM3_5] -You working regular for Luigi now huh? It's about time he got a driver we can trust! - -[LM3_7] -I'll be with you in a minute spark plug. - -[LM3_10] -~g~Get a vehicle! - -[LM4_B] -Go and take care of things for me. - -[LM4_C] -If you need a piece go around the back of AmmuNation opposite the subway. - -[LM5_A] -The Policeman's Ball is being held at the old school hall near the Callahan Bridge - -[LM5_B] -and they'll be looking for some 'old school' action. - -[LM5_C] -Now I got girls all over town walking the streets. - -[LM5_D] -Get'em to the ball they'll make a bundle. - -[LM5_1] -~g~You pack these ladies too tight, they gonna bruise! ~g~Drop these girls off first, then come back for more. - -[LM5_2] -~r~One of Luigi's girls is bodybag meat! - -[LM5_3] -~g~You need a car! - -[LM5_4] -~g~Pick up the girls working St. Marks. - -[LM5_5] -~g~Take the girls to the Fuzz Ball! - -[LM5_8] -~g~Girls working the Ball: ~1~ - -[JM2] -'FAREWELL 'CHUNKY' LEE CHONG' - -[JM4] -'CIPRIANI'S CHAUFFEUR' - -[JM5] -'DEAD SKUNK IN THE TRUNK' - -[JM1_1] -~g~Take Forelli's car to 8-Ball's garage North of here, behind 'Easy Credit Autos'. - -[JM1_2] -~g~Park the car back at Marco's Bistro. - -[JM1_3] -~g~Activate the car bomb then get out of there! - -[JM1_4] -~g~You're trashing the vehicle! Get it repaired! - -[JM1_5] -~g~The car bomb's not set! - -[JM1_6] -~g~Put the car back in the correct position. - -[JM1_8A] -~y~Hey, it's my main man! - -[JM1_8B] -~y~The bomb shop's automated. Just drive in, stop your car and the shop will do the rest. - -[JM1_8C] -~y~Here, your first can be free, but after that it'll cost. - -[JM2_A] -Chunky Lee Chong is pushing spank for some new gang from Colombia... or Colorado... or something.... - -[JM2_B] -I'm not really sure. Who needs details anyway. - -[JM2_D] -That rat has sold his last stir fry. - -[JM2_E] -I want you to take him out! - -[JM2_G] -Sort yourself with a nine, you know where it is, right? - -[JM2_H] -Well remember, just watch your back in China Town, it's Triad territory. - -[JM3_A] -Alright, we're gonna hit the pay role van. - -[JM3_B] -It leaves the edge of China Town everyday. - -[JM3_C] -Bullets won't even dent the van's armor, so get a car and ram it off the road. - -[JM3_D] -Now hit it hard and the punk ass security guards should bail. - -[JM3_E] -Then take it to the warehouse at the docks and my guys are gonna take over from there. - -[JM3_F] -Now it won't be doin' it's rounds all day, so don't hang around. - -[JM3_1] -~g~Take the van to the lock up. - -[JM3_2] -~g~Ram the van until its damage is below 70 percent. - -[JM4_B] -Oh! Here's the guy I was telling you about! - -[JM4_C] -Alright Listen. This guy ain't Italian and he's no mechanic but he can get things fixed. - -[JM4_D] -This is Pops Capo, Toni Cipriani. - -[JM4_E] -Yeah, I'm Toni Cipriani - -[JM4_F] -Take him to Momma's restaurant at St Marks, alright. - -[JM4_G] -Now listen to me, I'm planning a job that needs a good driver so drop by sometime later Ok? - -[JM4_2] -Wait here! Keep the engine running. This ain't a social call. - -[JM4_3] -It's a Triad ambush! Get us out of here kid! - -[JM4_4] -The Triads think they can mess with me, the triads, with ME! - -[JM4_6] -Hey watch the car! I said no fancy crap. - -[JM4_7] -~g~Take Toni to his momma's restaurant. - -[JM4_8] -~r~Toni's been wasted! - -[JM5_A] -Beautiful! Just beautiful. - -[JM5_B] -Alright, Just the guy I need to talk to! - -[JM5_D] -One of the Forellis thought he was a wise guy, so he got what he had coming to him. - -[JM5_E] -Take the corpse to the crusher in Harwood, alright? - -[JM5_1] -~g~Take it to the crusher! - -[JM5_2] -~g~It's the Forelli brothers! - -[JM6_A] -What a ride she's gonna be, huh? - -[JM6_B] -Alright, listen. Get some wheels to the safehouse at St. Marks and pick up a few friends of mine. - -[JM6_C] -They're hittin' a bank and they need a driver. - -[JM6_D] -I gave my word that you were the man, so don't screw this up. - -[JM6_E] -Get them to the bank before five o'clock, not a minute after. - -[JM6_2] -Keep the engine running we'll be in and out in no time. - -[JM6_3] -Get us out of here!! - -[JM6_4] -Shake the cops and get us to the safehouse!! - -[JM6_6] -~g~Go and get a vehicle less conspicuous! - -[JM6_7] -~g~You need all 3 to rob the bank! - -[TM1] -'TAKING OUT THE LAUNDRY' - -[TM2] -'THE PICK-UP' - -[TM3] -'SALVATORE'S CALLED A MEETING' - -[TM4] -'TRIADS AND TRIBULATIONS' - -[TM5] -'BLOW FISH' - -[TONI_P] -I've got some urgent work for you! -Toni - -[TM1_A] -~w~Take a seat kid, take a god damned seat. - -[TM1_B] -~w~So the laundry won't pay any protection eh? - -[TM1_C] -~w~The Triads think they can mess with me? - -[TM1_D] -~w~Let's teach these would be tough guys what it means to be a tough guy. - -[TM1_E] -~w~Yeah, teach 'em some respect. No son of mine gets it from some Triads. - -[TM1_F] -~w~Your father, god rest his soul, took no crap from no Triads back in Sicily. - -[TM1_G] -~w~Sorry Ma. Yes Ma. - -[TM1_H] -~w~I want you to destroy their laundry vans - -[TM1_I] -~w~and mangle any triad gimp that gets in your way. - -[TM1_J] -~w~8-Ball can supply you with what you're gonna need. - -[TM2_A] -~w~TONI's off making people bleed or trying to. - -[TM2_AA] -~w~He'll never be as tough as his Pop, but he left you a note on the table. - -[TM2_B] -~w~The laundry has agreed to pay - you did real good kid! - -[TM2_C] -~w~Go collect the cash and bring it back here. Watch out for the Triads. - -[TM2_D] -~w~They may be shoving a firecracker up your ass, but don't take no crap. - -[TM2_E] -~w~Nobody I mean nobody, messes with TONI CIPRIANI! - -[TM2_1] -~g~Get the cash back to Toni's!! - -[TM2_2] -~g~You iced them all! - -[TM3_MA] -~w~I don't know where he is! - -[TM3_MB] -~w~I swear that boy of mine don't know himself sometimes. - -[TM3_MC] -~w~Now his father, he was different. Always on top, in charge, manful... - -[TM3_A] -~w~Don Salvatore has called a meeting. - -[TM3_B] -~w~I need you to collect the limo and his boy, Joey, from the garage. - -[TM3_C] -~w~Then get Luigi from his club, come back here and pick me up, - -[TM3_D] -~w~then we'll all drive over to the boss's place together. - -[TM3_E] -~w~Those Triads, they don't know when to stop. - -[TM3_F] -~w~They want a war. They got a war. - -[TM3_G] -~w~Now get going. - -[TM3_1] -~g~Pick up the Stretch from Joey's. - -[TM3_2] -~g~Now go pick up Luigi. - -[TM3_3] -~g~Now go pick up Toni. - -[TM3_4] -~g~Drive the goodfellas to Salvatore's place. - -[TM3_5] -~y~It's a triad ambush!! - -[TM4_B] -~w~We're at WAR! The Triads have a fish factory as a front. - -[TM4_C] -~w~Most of their business goes down at the fish market in Chinatown. - -[TM4_D] -~w~That laundry still owes us protection. - -[TM4_E] -~w~They reckon the Triads are protecting them now, so I say we exact a fitting punishment. - -[TM4_F] -~w~Take these boys over and whack the Triad Warlords! - -[TM4_G] -~w~Hell, if you get a chance, pop some of their soldiers too. - -[TM4_GAT] -~g~You need a 'Triad fish van' to enter. - -[TM5_B] -~w~OK, I've had enough of this shit. - -[TM5_C] -~w~We're gonna finish the Triads in Liberty once and for all! - -[TM5_D] -8-Ball's rigged a dustcart with a bomb. - -[TM5_E] -~w~It's on a timer so if you mess up there'll be no evidence. Go and pick up the dustcart. - -[TM5_F] -~w~Careful, 8-Ball says it's real sensitive and the slightest bump could set that thing off! - -[TM5_G] -~w~Their fish factory will open its gates for a dustcart, so you can drive right in. - -[TM5_H] -~w~Park up between the gas canisters and get the hell out of there! - -[TM5_I] -~w~I want it to rain mackerel. - -[TM5_J] -~w~We're talking real biblical here, nothing low budget. - -[FM2] -'CUTTING THE GRASS' - -[FM4] -'LAST REQUESTS' - -[FM1_A] -~w~Me an' the fellas need to talk business - -[FM1_B] -~w~so you're gonna look after my girl for the evening. - -[FM1_C] -~w~HEY MARIA! MOVE YOUR BUTT! - -[FM1_D] -~w~Dumb broad does this every time. - -[FM1_E] -~w~And here she is, the one and only Queen of Sheba! - -[FM1_F] -~w~What were you doing up there? - -[FM1_G] -~w~Whatever it was, I bet it cost me money. - -[FM1_H] -~w~Well, you don't think I hang around for the conversation, do you? - -[FM1_I] -~w~Get in that car and keep your big mouth shut. - -[FM1_J] -~w~Take the limo but bring it back in one piece, y'hear me? - -[FM1_K] -~w~And watch her, she can be trouble. - -[FM1_L] -~w~Yeah, yeah, yeah! I'm sure your new lap dog has everything covered, - -[FM1_M] -~w~and isn't he big and strong? - -[FM1_N] -~w~Hey Fido, Let's go visit Chico and get some party treats! - -[FM1_P] -~g~That's Chico over there, pull up next to him. - -[FM1_S] -~w~Here you go lady. - -[FM1_TT] -~w~IT'S A POLICE RAID! - -[FM1_1] -~g~Get back into the Stretch! - -[FM1_2] -~g~Get into the Stretch! - -[FM1_3] -~r~Leave Maria and Salvatore will have you whacked, go back and pick her up. - -[FM1_4] -~g~You've dumped the Don's woman! Get back to the warehouse and wait for Maria! - -[FM1_5] -~g~Get Maria safely back to Salvatore's! - -[FM1_6] -~g~Chico won't be there forever, get Maria to the waterfront! - -[FM1_7] -~r~Maria's dead! Salvatore won't be too pleased... - -[FM1_8] -~r~You wasted Maria's supplier! - -[FM2_J] -Leave us alone for a minute. - -[FM2_A] -The Colombian Cartel is making SPANK somewhere in Liberty. - -[FM2_K] -but we don't know where, and they seem to know everything we're doin' before we do. - -[FM2_L] -There is a guy named Curly Bob works the bar at Luigi's. - -[FM2_M] -He's been throwing more money around than he's earning. - -[FM2_N] -He usually gets a taxi home after work. So follow him. - -[FM2_O] -And if he's rattin' us out... kill him. - -[FM2_F] -Here comes our little friend. Mr big mouth himself. - -[FM2_G] -Were you followed? You know what goes on here is our little secret. - -[FM2_H] -No..no, I wasn't followed. You got my stuff? - -[FM2_I] -Here's your SPANK, squealer, now talk. - -[FM2_P] -OK, so the Leone's are fighting wars on two fronts. - -[FM2_Q] -They're in a turf war with the Triads with no sign of either side giving up. - -[FM2_R] -Meanwhile Joey Leone has stirred up some bad blood with the Forellis. - -[FM2_S] -Every day they're losing men and influence in the city. - -[FM2_T] -Salvatore is becoming dangerous and paranoid. He suspects everybody and everything. - -[FM2_U] -With loyalty like yours, what has he possibly got to worry about. - -[FM2_1] -~g~There's Curly Bob! - -[FM2_2] -~g~Curly's left the club, tail him! - -[FM2_5] -~g~Take him to Portland Harbor. - -[FM2_6] -~r~Curly won't get into a smashed-up taxi! - -[FM2_7] -~r~Curly's spooked! The meeting's off! - -[FM2_8] -~g~Whack Curly Bob! - -[FM2_9] -~r~Curly Bob's dead! - -[FM2_10] -~r~Curly got away! - -[FM2_11] -~g~Park out the front of Luigi's Club, Curly Bob will be leaving shortly. - -[FM2_12] -~r~He gave you the slip! - -[FM3_A] -~w~We should take these Colombian bastards out, - -[FM3_B] -~w~but while we're at war with the Triads we ain't strong enough. - -[FM3_C] -~w~The Cartel has got bottomless funds from pushing that SPANK crap. - -[FM3_D] -~w~If we make an open attack on them, they'll wipe the floor with us. - -[FM3_E] -~w~They must be making SPANK on that big boat that Curly lead you to. - -[FM3_F] -~w~So we gotta use our heads, or rather one head. Your head. - -[FM3_G] -~w~I'm asking you to destroy that SPANK factory as a personal favor to me, Salvatore Leone. - -[FM3_H] -~w~If you do this for me, you will be a made man, anything you want. - -[FM3_I] -~w~Go and see 8-Ball, you'll need his expertise to blow-up that boat. - -[FM3_8A] -~w~Yo my man! Salvatore phoned ahead, - -[FM3_8B] -~w~but a job like this is gonna need a lot of fireworks. - -[FM3_8D] -~w~but you know with me you get a lot of bang for your buck. - -[FM3_8E] -~w~Okay, let's do this thing! - -[FM3_8F] -~w~I can set this baby to detonate, but I still can't use a piece with these hands. - -[FM3_8G] -~w~Here, this rifle should help you pop some heads! - -[FM3_4] -~g~Stop the vehicle and let 8-Ball out! - -[FM3_7] -~r~8-Ball's been iced! - -[FM3_8] -~r~The guards have been alerted! - -[FM4_A] -~w~It's my favorite cleaner. - -[FM4_B] -~w~I'm proud of you my boy, you kicked the shit out of those grease balls. - -[FM4_C] -~w~I've got just one little job for you before we can all celebrate. - -[FM4_D] -~w~There's a car around the block from Luigi's club. - -[FM4_E] -~w~The inside is covered in brains. - -[FM4_F] -~w~We had to help some guy make up his mind and it proved a little messy. - -[FM4_H] -~w~Take it to the crusher before the cops find it. - -[AM3] -'PAPARAZZI PURGE' - -[AM4] -'PAYDAY FOR RAY' - -[AM5] -'TWO-FACED TANNER' - -[AM1_A] -We have certain issues to clear up before we can continue any form of relationship, - -[AM1_B] -business or otherwise. Lets lay our cards on the table. - -[AM1_C] -I am Yakuza and I know you worked for Salvatore Leone's family. - -[AM1_D] -I can give you work with our organization, - -[AM1_E] -But first you must prove to me that your ties with the Mafia are truly broken. - -[AM1_G] -Make sure he doesn't reach his club alive. - -[AM1_H] -Meanwhile Maria and I will catch up on old times. - -[AM1_I] -Oh..Asuka, you've got a massager. - -[AM1_J] -That's not a massager. - -[AM1_1] -~g~Salvatore is now leaving Luigi's! - -[AM1_2] -~r~You have been spotted! - -[AM1_3] -~r~You've missed Salvatore! - -[AM1_4] -~r~Nice going, you scared off the target! Call yourself a hitman? - -[AM1_5] -~g~Get to the Red Light District and wait for Salvatore to leave the club. - -[AM1_7] -~r~Salvatore's home, safe and sipping a cocktail. Ain't no one gonna call you the 'Jackal'! - -[AM1_8] -~g~Salvatore will be leaving Luigi's at about ~1~:~1~ - -[AM2_4] -~g~They seen you coming like a dayglow elephant! - -[AM3_A] -A reporter has been nosing around. - -[AM3_B] -Maria and I have taken a little holiday together until you can get rid of this perverted voyeur. - -[AM4_A] -It's my handsome handyman! - -[AM4_B] -Maria's all tied up at the moment but I'll tell her you called. - -[AM4_C] -Who's that? Asuka? I know I've been a naughty girl but I really need to pee! OK? - -[AM4_D] -It's time you met our man inside the LPD. - -[AM4_E] -Here's his payment for the last little job he did for us. - -[AM4_F] -He is understandably cautious. - -[AM4_G] -Get to the pay phone in Torrington as quick as you can and await his instructions. - -[AM5_A] -Maria and I have gone shopping. - -[AM5_B] -Our source in the police has informed us that one of our drivers is a strangely animated undercover cop! - -[AM5_C] -He's more or less useless out of his car, so we've tagged it with a tracer. - -[AM5_D] -Make him bleed! - -[AM5_1] -Tanner's on to you! - -[AS1] -'BAIT' - -[AS2] -'ESPRESSO-2-GO!' - -[AS4] -'RANSOM' - -[AS1_A] -~w~Miguel seems to think I'm mistreating him. - -[AS1_B] -~w~Still, he's revealed the extent to which Catalina fears your quest for revenge. - -[AS2_A] -~w~We underestimated Catalina's plans for SPANK. - -[AS2_B] -~w~It reaches far beyond the Yardies selling it on the street corners. - -[AS2_D] -~w~They've been selling SPANK through the street stalls. - -[AS2_1] -~g~All espresso stalls in Portland wrecked!! - -[AS2_2] -~g~All espresso stalls in Staunton Island wrecked!! - -[AS2_3] -~g~All espresso stalls in Shoreside Vale wrecked!! - -[AS2_4] -~r~The Cartel have warned their pushers!! - -[AS2_5] -~g~There are still espresso stalls in Shoreside Vale and on Staunton Island! - -[AS2_6] -~g~There are still espresso stalls in Shoreside Vale! - -[AS2_7] -~g~There are still espresso stalls on Staunton Island! - -[AS2_8] -~g~There are still espresso stalls in Portland! - -[AS2_9] -~g~There are still espresso stalls in Portland and Shoreside Vale! - -[AS2_10] -~g~There are still espresso stalls in Portland and on Staunton Island - -[AS2_12] -~g~Cruise Liberty's districts to find ~b~Espresso-2-Go stalls! - -[AS3_A] -~W~Do we tighten it some more now, or just wait for it to turn black and fall off? - -[AS3_B] -~w~Give it a quick prod... - -[AS3_D] -~w~My Handyman! - -[AS3_E] -~w~I was bored so I came over to keep Asuka company. - -[AS3_1] -~g~Find the ~r~boat~g~ and get to the ~b~marker buoy! - -[AS3_3] -~g~Wait for the ~y~plane~g~ to start its approach! - -[AS3_5] -~g~Collect the cargo! - -[AS3_4] -~g~Use a rocket launcher to shoot the ~y~plane~g~ down!! - -[AS3_2] -~b~Get to the runway marker buoys! ~y~The plane is on its final approach!! - -[AS3_6] -~g~~1~ OF 8 - -[KM1] -'KANBU BUST-OUT' - -[KM3] -'DEAL STEAL' - -[KM4] -'SHIMA' - -[KM5] -'SMACK DOWN' - -[KM1_A] -My sister speaks highly of you, - -[KM1_E] -though I am yet to be convinced that a gaijin can offer anything but disappointment. - -[KM1_B] -Perhaps you could help deal with a situation that has me at a disadvantage. - -[KM1_F] -Of course failure has its own disgrace. - -[KM1_C] -A Yakuza Kanbu is in custody awaiting transfer for trial. - -[KM1_G] -He is a valued member of the family. - -[KM1_H] -Break him out of custody and get him to the dojo at Bedford Point. - -[KM1_D] -We thankyou for your selfless actions. If you ever need help the dojo will be honoured to provide two men who will stand at your side. - -[KM1_1] -~g~Steal a cop car! - -[KM1_2] -~g~Rig the car with a bomb! - -[KM1_3] -~g~Now get him to the Yakuza dojo. - -[KM1_5] -~g~Okay now go to the police station. - -[KM1_6] -~g~Fit the car with a bomb! - -[KM1_7] -~g~Authorised police vehicles only! - -[KM1_9] -~r~You did not use a car bomb to destroy the wall - -[KM1_10] -~r~The Yakuza Kanbu is dead -along with your honor! - -[KM1_11] -~r~You brought the heat down on yourself! - -[KM2_A] -It is impossible to over-estimate the importance of etiquette in this line of work. - -[KM2_B] -To my eternal shame, a man once did me a favor and I have never had the opportunity to repay his kindness. - -[KM2_C] -The man's weakness is motor cars and he has requested that we acquire him certain models for his collection. - -[KM2_F] -My honor demands it. - -[KM2_2] -~g~Car delivered. - -[KM3_A] -When trouble looms, the fool turns his back, while the wise man faces it down. - -[KM3_B] -The Colombian Cartel have ignored repeated requests to leave our interests in Liberty well alone. - -[KM3_C] -Now they are negotiating terms with the Jamaicans in order to humiliate us further. - -[KM3_D] -They are finalizing a deal across town. - -[KM3_F] -Take one of my men, steal a Yardie car, and go and pay your respects to the Colombians. - -[KM3_E] -Our Honor demands that you leave no one alive. - -[KM3_2] -~g~Go and pick up your contact. - -[KM3_3] -~g~The meeting is being held in the hospital parking lot in Rockford! - -[KM3_4] -~r~They got away! - -[KM3_6] -~g~Kill them, kill them all! - -[KM3_8] -~g~You need a Yardie car to get on with the job! - -[KM3_9] -~r~One of the Colombians is dead, the deal's off. - -[KM3_10] -~r~The contact is dead! - -[KM4_A] -To be truly strong, it is important that you never show weakness. - -[KM4_C] -Go and collect the money immediately, so we can enter it into the casino accounts. - -[KM4_1] -I can't pay you and I wouldn't pay you if I could! - -[KM4_9] -Some young gang just jacked out the place! They took everything! - -[KM4_2] -You guys are useless. - -[KM4_10] -What kind of Yakuza are YOU anyway...? - -[KM4_3] -This ain't what I pay you goons for. If I wanted this kind of protection I'd have used the god damn police service - -[KM4_4] -~g~Punish the gang responsible and retrieve the ~b~protection money~g~! - -[KM4_7] -~r~The shopkeeper's breathed his last! - -[KM4_5] -Donald Love wishes you to drop by his tea garden so you and he can talk. - -[KM4_6] -There's the money its all there! - -[KM4_8] -~g~Briefcase collected! - -[KM5_A] -YOU! How fitting you should choose this moment to show your worthless face! - -[KM5_B] -It would appear your attempts to dissuade the Jamaicans - -[KM5_B1] -from becoming bed fellows with the Cartel were wholly inadequate! - -[KM5_C] -Yardie pushers line Liberty's streets selling packets of SPANK like they were selling hotdogs! - -[KM5_D] -Those Cartel pigs are laughing at us, at me! - -[KM5_E] -I will give you one last chance to prove my sister's faith in you to be well founded! - -[KM5_F] -Run these scumbags into the ground and wash your shame in rivers of our enemies' blood!!! - -[KM5_3] -~r~You failed to kill at least ~1~ yardies. - -[KM5_4] -~g~Congratulations you killed ~1~ Yardies. - -[KM5_5] -~g~Congratulations you killed ~1~ Yardies. BONUS $~1~ - -[RM1] -'SILENCE THE SNEAK' - -[RM3] -'EVIDENCE DASH' - -[RM4] -'GONE FISHING' - -[RM5] -'PLASTER BLASTER' - -[RM1_D] -He's under armed protection in WitSec property down in Newport, some apartment behind the car park. - -[RM1_E] -Torch that place, that should flush 'em out, and you'll hunt 'em down, make sure he never talks to nobody. - -[RM1_1] -~g~Check out the witness protection house. - -[RM1_2] -~g~Take out McAffrey! - -[RM2_A1] -Hey kid over here! - -[RM2_A] -An old army buddy of mine runs a business in Rockford. - -[RM2_D] -He's gonna need some back-up and in return he'll give you knock-down rates on any hardware you buy. - -[RM2_E] -Ray phoned ahead....but I thought there'd be more of you. - -[RM2_F] -Well, three arms are better than one, so grab whatever you need. - -[RM2_G] -~g~Go and check on Phil! - -[RM2_H] -~r~Phil has been killed!! - -[RM2_L] -Heh-hey! If I'd teamed up with you in Nicaragua maybe I'd still have my arm! - -[RM2_N] -Leave the cash behind. Now get out of here, I'll handle the cops. - -[RM3_D] -The evidence is being driven across town. - -[RM3_E] -You are going to have to ram that car and collect each little bit of evidence as it falls out. - -[RM3_F] -When you've got it all, leave it in the car and torch it. - -[RM3_G] -We're both gonna do pretty well outta this kid. - -[RM3_1] -~g~Leave the evidence in a car then torch the car. - -[RM3_4] -~g~The Prosecution has dropped the evidence! - -[RM3_6] -~r~The photos will be washed up all over Liberty! - -[RM3_7] -~g~Now torch the car! - -[RM4_A] -I think my partner's a rat. - -[RM4_C] -He goes fishing out of his boat near the lighthouse on Portland Rock most nights. - -[RM4_D] -Steal a police boat and make sure his back stabbing plans are sunk! - -[RM4_1] -~g~Go and steal a police boat. - -[RM4_2] -~g~Get to the lighthouse and 'rub out' Ray's partner! - -[RM5_A] -You useless bastard! - -[RM5_A1] -You totally messed up! My ass is on the line and you can't even kill a god damned fly. - -[RM5_B] -I paid you good money to kill that witness and he ain't dead! - -[RM5_B1] -And today he's gonna make a Federal Deposition! - -[RM5_C] -He's being moved any second now from the Carson General Hospital up in Rockford. - -[RM5_D] -If he squeals, I squeal.... - -[RM5_E] -so go do the job you were paid for! - -[RM5_1] -~g~Intercept the ambulance. - -[RM5_2] -~g~You've been spotted!! - -[RM5_3] -~g~It was a decoy! - -[RM5_4] -~g~Bullets won't get through that armored bodycast!! - -[RM5_5] -~g~That armored bodycast is flame retardant!! - -[RM5_7] -~r~Witness has been delivered!! - -[RM5_8] -~g~Witness has drowned!! - -[LOVE2] -'WAKA-GASHIRA WIPEOUT!' - -[LOVE3] -'A DROP IN THE OCEAN' - -[LOVE1_A] -First of all, let me thank you for dealing with that personal matter. - -[LOVE1_F] -People will read something into anything these days. - -[LOVE1_D] -They're trying to extort additional funds from me but I don't believe in re-negotiation. - -[LOVE1_E] -A deal is a deal, so they'll not see a penny from me. - -[LOVE1_G] -Go and rescue my friend, do whatever it takes. - -[LOVE1_2] -~g~Rescue the Old Oriental Gentleman. - -[LOVE1_3] -~g~Take the Old Oriental Gentleman back to Donald Love's building. - -[LOVE1_4] -~g~The Old Oriental Gentleman must be in one of the garages.... - -[LOVE1_6] -~r~The Old Oriental Gentleman's guts are all over the street! - -[LOVE1_7] -~g~The gate will only open for a Colombian Gang-car. - -[LOVE2_A] -Nothing drives down real estate prices like a good old fashioned gang war, - -[LOVE2_B] -apart from an outbreak of plague......but that might be going too far in this case. - -[LOVE2_C] -I've noticed the Yakuza and the Colombians are far from friends. - -[LOVE2_D] -Let's capitalise on this business opportunity. - -[LOVE2_E] -I want you to kill the Yakuza Waka-gashira, Kenji Kasen. - -[LOVE2_F] -Kenji is attending a meeting at the top of the multi-story carpark in Newport. - -[LOVE2_G] -Get a Cartel gangcar and eliminate him! - -[LOVE2_H] -The Yakuza must blame the Cartel for this declaration of war. - -[LOVE2_1] -~g~Go to Fort Staunton and steal a Colombian gangcar! - -[LOVE2_2] -~g~Now get to the ~p~multi-storey in Newport~g~ and whack Kenji! - -[LOVE2_3] -~r~If you proceed without a Cartel car you will be identified!! - -[LOVE2_4] -~r~The Yakuza have identified you!! - -[LOVE2_6] -~r~You've killed all the witnesses!! - -[LOVE3_A] -In these days of moral hypocrisy certain valuable commodities can be hard to import. - -[LOVE3_C] -It will drop several packages into the water. - -[LOVE3_D] -Make sure you pick them up before anyone else does. - -[LOVE3_1] -~g~Get a ~r~boat~g~ and follow the ~y~plane~g~! - -[LOVE4] -'GRAND THEFT AERO' - -[LOVE5] -'ESCORT SERVICE' - -[LOVE4_A] -Thank you for retrieving those packages, but they were only a decoy. - -[LOVE4_B] -Sorry about that, but that's sometimes the way in business. - -[LOVE4_C] -My real objective was hidden on the plane all along. - -[LOVE4_F] -I've paid off the officials. - -[LOVE4_1] -~r~The Colombian Cartel is here!! - -[LOVE4_2] -~g~The package is gone! Track down the Colombians and retrieve it. - -[LOVE4_3] -~g~Panlantic Construction...? - -[LOVE4_5] -~g~The package should be in the plane.... - -[LOVE4_6] -~g~Take the lift up the tower! - -[LOVE5_B] -My Oriental friend will need an escort while he takes my latest acquisition to be authenticated. - -[LOVE5_1] -~g~Lets go! - -[LOVE5_2] -~g~You'll need a car! - -[LOVE5_3] -~g~Go ahead and scout the exit of the tunnel! - -[LOVE5_4] -~r~Protect the truck! - -[RM6] -'MARKED MAN' - -[RM6_A] -You weren't followed? Good. - -[RM6_B] -This is it, I'm way over my head and I'm starting to drown here! - -[RM6_D] -I'm a marked man, so I'm getting out of here. - -[RM6_E] -Get me to my flight at the airport and I'll make it worth your while! - -[RM6_666] -Take care of my bullet proof Patriot. See you in Miami, Ray - -[CAT1] -'RANSOM' - -[CAT2] -'THE EXCHANGE' - -[CAT1_A] -I've got your precious Maria. If you don't want her face to look like she fell out with the butcher. - -[CAT2_F] -I broke a nail, and my hair's ruined. Can you believe it? This one cost me fifty dollars! - -[CAT2_G] -I was so scared, but then I thought to myself, you're a big girl now. - -[CAT2_H] -Oh we're going to have such fun, cause, you know, my sister said she wanted to come to stay with her two kids, - -[CAT2_I] -because her husband's playing around again and.. - -[CAT1_E] -XXXX - -[CAT1_F] -Get to Catalina before the time runs out! - -[CAT_MON] -~g~You don't have enough money yet. You need $500,000. - -[BITCH_D] -~g~Maria's dead! - -[WEATHER] -FORCE WEATHER - -[WEATHE2] -WEATHER NORMAL - -[8001] -You failed miserably!! - -[1000] -YOU ARE DEAD - -[1001] -YOU ARE DEAD - -[1002] -YOU ARE DEAD - -[1003] -YOU ARE DEAD - -[1004] -YOU ARE DEAD - -[1005] -BUSTED - -[1006] -BUSTED - -[1007] -BUSTED - -[1008] -BUSTED - -[1009] -BUSTED - -[GA_4] -Car bombs are $1000 each - -[GA_5] -Your car is already fitted with a bomb. - -[GA_6] -Park it, prime it by pressing the ~h~~k~~PED_FIREWEAPON~ button~w~ and LEG IT! - -[GA_7] -Arm with ~h~~k~~PED_FIREWEAPON~ button~w~. Bomb will go off when engine is started. - -[GA_8] -Use the detonator to activate the bomb. - -[GA_9] -You collected ~1~ out of 10 special cars - -[GA_10] -Nice one. Here's your $~1~ - -[GA_11] -We got these wheels already. It's worthless to us! - -[GA_12] -Bomb armed - -[GA_13] -Delivered like a pro. Complete the list and there'll be a bonus for you. - -[GA_14] -All the cars. NICE! Here's a little something. - -[GA_15] -Hope you like the new color. - -[GA_16] -Respray is complementary. - -[GA_19] -We're not interested in that model. - -[GA_20] -We got more of these than we can shift. Sorry man, no deal. - -[CR_1] -Crane cannot lift this vehicle. - -[PU_MONY] -You don't have enough cash. - -[CO_ALL] -You got all of them. Here's a little something... - -[PAUSED] -GAME PAUSED - -[HEALTH1] -Get outta here! You're perfectly healthy. - -[HEALTH2] -Healthcare costs. - -[HEALTH3] -I'll just fix you up. - -[HEALTH4] -That will be $250. - -[FEB_STA] -Stats - -[FEB_BRI] -Briefs - -[FEB_CON] -Controls - -[FEB_AUD] -Audio - -[FEB_DIS] -Display - -[FEB_LAN] -Language - -[FEP_STA] -STATS - -[FEP_BRI] -BRIEFS - -[FEP_CON] -CONTROLS - -[FEP_AUD] -AUDIO - -[FEP_DIS] -DISPLAY - -[FEP_LAN] -LANGUAGE - -[FEF_ST1] -Who's the bad man? - -[FEF_ST2] -How much havoc have you caused - -[FEF_BR1] -Lost the plot? - -[FEF_CO1] -Need more control, freak? - -[FEF_CO2] -Choose the best contoller set-up for your playing style - -[FEF_SA1] -Keep your place in the pile! - -[FEF_SA2] -Save and load your games - -[FEF_AU1] -Pump up the volume! - -[FEF_AU2] -Select a radio station and sound effect - -[FEF_DI1] -Change the game! - -[FEF_DI2] -Customize the game for your TV - -[FEF_LA1] -What you talking about willis? - -[FEF_LA2] -Choose your preferred parlance - -[FEB_PMB] -Previous Mission Briefs: - -[FEC_NA] -NA - -[FEC_CWL] -Cycle Weapon left - -[FEC_CWR] -Cycle Weapon right - -[FEC_LOF] -Look forward - -[FEC_TAR] -Target - -[FEC_MOV] -Movement - -[FEC_CAM] -Camera modes - -[FEC_PAU] -Pause - -[FEC_ENV] -Enter vehicle - -[FEC_JUM] -Jump - -[FEC_ATT] -Attack or Fire weapon - -[FEC_RUN] -Run - -[FEC_FPC] -First person camera - -[FEC_LL] -Look left - -[FEC_LB1] -Look - -[FEC_LB2] -behind - -[FEC_LB] -Look behind - -[FEC_LR] -Look right - -[FEC_HOR] -Horn - -[FEC_VES] -Vehicle control - -[FEC_RSC] -Radio station cycle - -[FEC_BRA] -Brake or Reverse - -[FEC_HAB] -Hand brake - -[FEC_CAW] -Car weapon - -[FEC_ACC] -Accelerate - -[FEC_SMT] -Special mission trigger - -[FEC_CCF] -Configuration: - -[FEC_CF1] -Setup1 - -[FEC_CF2] -Setup2 - -[FEC_CF3] -Setup3 - -[FEC_CF4] -Setup4 - -[FEC_CDP] -Controller Display: - -[FEC_ONF] -On Foot - -[FEC_INC] -In Car - -[FEC_VIB] -Vibration: - -[FEA_OUT] -Output: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_NON] -None - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -CHATTERBOX 109 - -[FED_DBG] -Menu Debug - -[FED_RID] -Reload IDE - -[FED_RIP] -Reload IPL - -[FED_PAH] -Parse Heap - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Big White Debug Light Switched - -[FED_SPR] -Show Ped Road Groups - -[FED_SCR] -Show Car Road Grups - -[FED_SCZ] -Show Cull Zones - -[FED_DSR] -Debug Streaming Requests - -[FED_SCP] -gbShowCollisionPolys - -[FEM_MCM] -Memory Card Menu - -[FEM_RMC] -Register MemCard One - -[FEM_TFM] -Test Format MemCard One - -[FEM_TUM] -Test UnFormat MemCard One - -[FEM_CRD] -Create Root Dir - -[FEM_CLI] -Create And Load Icons - -[FEM_FFF] -Fill First File with Guff - -[FEM_SOG] -Save Only The Game - -[FEM_CES] -Check Every 0kB4 Save - -[FEM_STG] -Save The Game - -[FEM_STS] -Save The Game under GTA3 name - -[FEM_CPD] -Create copy protected mag directory - -[FEM_MC2] -Memory Card Menu 2 - -[FEM_TS] -Test Save: - -[FEM_TL] -Test Load: - -[FEM_TD] -Test Delete: - -[PL_STAT] -Player stats - -[PE_WAST] -People you've wasted - -[PE_WSOT] -People wasted by others - -[CAR_EXP] -Cars exploded - -[TM_BUST] -Times busted - -[M_WASTE] -Civilian males wasted - -[F_WASTE] -Civilian females wasted - -[PIG_WST] -Cops wasted - -[GNG_WST] -Gang members wasted - -[MED_WST] -Medics wasted - -[FIRE_WS] -Firemen wasted - -[DED_CRI] -Criminals wasted - -[DED_DED] -Deadbeats wasted - -[DED_HOK] -Hookers wasted - -[HEL_DST] -Helicopters destroyed - -[PER_COM] -Percentage completed - -[KGS_EXP] -Kgs of explosives used - -[ACCURA] -Accuracy - -[ELBURRO] -Best Turismo time in secs - -[CAR_CRU] -Cars crushed - -[HED_EX] -Heads exploded - -[TM_DED] -Hospital visits - -[DAYSPS] -Days passed in game - -[MMRAIN] -Mm rain fallen - -[MXCARD] -Max. INSANE Jump dist. (ft) - -[MXCARJ] -Max. INSANE Jump height (ft) - -[MXCARDM] -Max. INSANE Jump dist. (m) - -[MXCARJM] -Max. INSANE Jump height (m) - -[MXFLIP] -Max. INSANE Jump flips - -[MXJUMP] -Max. INSANE Jump rotation - -[BSTSTU] -Best INSANE stunt so far: - -[INSTUN] -Insane stunt - -[PRINST] -Perfect insane stunt - -[DBINST] -Double insane stunt - -[DBPINS] -Perfect double insane stunt - -[TRINST] -Triple insane stunt - -[PRTRST] -Perfect triple insane stunt - -[QUINST] -Quadruple insane stunt - -[PQUINS] -Perfect quadruple insane stunt - -[NOSTUC] -No INSANE stunts completed - -[NOUNIF] -Unique Jumps completed - -[NOUNGM] -Total Unique Jumps - -[NMISON] -Mission attempts - -[NMMISP] -Missions passed - -[PASDRO] -Passengers dropped off - -[MONTAX] -Cash made in taxi - -[DAYPLC] -Daily police spending - -[CRIMRA] -Criminal rating: - -[GMSTOR] -Game Store - -[PREBRF] -Previous Briefs - -[CNTLS] -Controls - -[MUSMEN] -Music/SFX - -[GAMSET] -Game Settings - -[LANGUA] -Language - -[DSPLAY] -Display - -[DEBUGM] -Debug Menu - -[QUITOP] -Quit Options - -[CONTRL] -Control Configuration - -[SET1EN] -SetUp 1. Enabled - -[SET1] -SetUp 1. - -[SET2EN] -SetUp 2. Enabled - -[SET2] -SetUp 2 - -[SET3EN] -SetUp 3. Enabled - -[SET3] -SetUp 3 - -[SET4EN] -SetUp 4. Enabled - -[SET4] -SetUp 4 - -[GOBACK] -GoBack - -[SOUND] -SOUND - -[MUSVOL] -Music Volume - -[SFXVOL] -SFX Volume - -[SCROPT] -SCREEN OPTIONS - -[CTRSCR] -Center Screen - -[SCRFOR] -Screen format - -[GMSVLQ] -GAME SAVE-LOAD-QUIT - -[GMREST] -Restart Game - -[NOGMSV] -Can save only at your hideout. - -[DLFILE] -Delete Grand Theft Auto III Files - -[CHFILE] -CHOOSE FILE TO LOAD - -[CHFIDL] -CHOOSE FILE TO DELETE - -[SVCONF] -SAVE CONFIRMATION - -[LANGSL] -LANGUAGE SELECTION - -[ENGLIS] -English - -[GERMAN] -German - -[ITALIA] -Italian - -[FRENCH] -French - -[SPAIN] -Spanish - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[PARSHP] -Parse Heap - -[DBGFON] -CTheScripts::DbgFlag On - -[DBFOFF] -CTheScripts::DbgFlag Off - -[BGWHON] -Big White Debug Light Switched On - -[BGWOFF] -Big White Debug Light Switched Off - -[DSTRON] -Debug Streaming Requests On - -[DSTROFF] -Debug Streaming Requests Off - -[PDRGON] -ShowPedRoadGroups On - -[PRGOFF] -ShowPedRoadGroups Off - -[CRRGON] -ShowCarRoadGroups On - -[CRGOFF] -ShowCarRoadGroups Off - -[CLZOON] -Show Cull Zones On - -[CLZOOF] -Show Cull Zones Off - -[SHPLON] -gbShowCollisionPolys On - -[SHPLOF] -gbShowCollisionPolys Off - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[FORMM1] -FormatMemCard 1 (teststuff) - -[UNFRM1] -UnFormatMemCard 1 (teststuff) - -[GORLEV] -Gore Level - -[SICASS] -Sick Fuck - -[SICSIC] -Sick Fucker - -[SCASSL] -Sick Fuck Selected - -[SCSCSL] -Sick Fucker Selected - -[PRVMEN] -Previous Mission Briefs - -[FORMEN] -Format Menu - -[MEMTST] -MemoryCardTest screen - -[REGCAR] -Register MemoryCard One - -[TEFONE] -Test Format MemCard One - -[TEUFON] -Test UnFormat MemCard One - -[CRROOT] -CreateRootDir - -[CRLDIC] -Create and Load Icons - -[FLFSGF] -Fill First File With Guff - -[PUSAVE] -Save Only the game - -[CHEVOK] -CheckEveryOkB4Save - -[SVGMON] -SaveTheGame - -[CNTSAV] -Can't save the game. On a mission. - -[CNCSAV] -Can't save the game. You're in a car - -[CRMGSV] -Create copy protected magazine directory - -[MGSVCN] -MagazineDirectory Created - -[MGSVNC] -MagazineDirectory Not Created - -[YES] -Yes - -[NO] -No - -[X] -x - -[LAST] -Last message. - -[FEDS_XB] -Select - -[FEDS_ST] -START button - RESUME - -[FEST_OO] -out of - -[FEC_TUC] -Turret control - -[FEC_SM3] -Special mission trigger (R3 button) - -[FEC_RS3] -Radio station cycle (L3 button) - -[FEC_HO3] -Horn (L3 button) - -[DIAB1] -'TURISMO' - -[DIAB2] -'I SCREAM, YOU SCREAM' - -[DIAB3] -'TRIAL BY FIRE' - -[DIAB4] -'BIG'N'VEINY' - -[DIAB1_A] -El Burro wants to offer you an opportunity. Get to the payphone in Hepburn Heights if you want more info. - -[DIAB1_C] -You drive a mean race. Drop by the payphone again and 'El Burro' may have some work for you. - -[DIAB1_1] -~g~3..2..1.. GO GO GO! - -[DIAB1_4] -~g~Get a fast car and get to the starting grid. - -[DIAB1_3] -~r~You couldn't win a raffle, LOSER! - -[DIAB1_2] -~g~Congratulations you won, with an incredible time of ~1~ seconds. - -[FIRST] -~g~1st - -[SECOND] -~g~2nd - -[THIRD] -~g~3rd - -[FOURTH] -~g~4th - -[DIAB2_1] -~g~Pick up the briefcase in Harwood. - -[DIAB2_2] -~g~Find an icecream van. - -[DIAB2_3] -~g~Park the icecream van down at Atlantic Quays. - -[DIAB2_4] -~g~Press the ~w~~k~~VEHICLE_HORN~ button ~g~to activate the Icecream jingle. - -[DIAB2_6] -~g~Press the ~w~~k~~VEHICLE_HORN~ button ~g~to activate the Icecream jingle. - -[DIAB2_7] -~g~Press the ~w~~k~~VEHICLE_HORN~ button ~g~to activate the Icecream jingle. - -[DIAB2_5] -~g~Exit the van then use the remote to detonate the Icecream van. - -[YD1] -'BLING-BLING SCRAMBLE' - -[YD2] -'UZI RIDER' - -[YD3] -'GANGCAR ROUND-UP' - -[YD4] -'KINGDOM COME' - -[YD_P] -King Courtney would like a word. Get to the payphone in Aspatria!! - -[YD1_A] -~w~This is King Courtney. - -[YD1_A1] -~w~My Yardie posse could do with a driver and you've got a reputation for hot moves. - -[YD1_B] -~w~Get to the waste ground opposite the stadium in a car and wait for the other hopefuls. - -[YD1_C] -~w~I've got men watching checkpoints all over Staunton. - -[YD1_D] -~w~First driver to a checkpoint gets a Grand, then it's on to the next stop. - -[YD1_D1] -~w~If you get more checkpoints than any other driver, I could have some work for you. - -[YD1_E] -~g~Prepare to race! - -[YD1_F] -~g~You jumped the start -I like your style!! - -[YD1_G] -~r~This is a CAR RACE. You need a CAR fool! - -[YD1GO] -~g~GO!! - -[YD1_1] -~r~1 - -[YD1_2] -~r~2 - -[YD1_3] -~r~3 - -[YD1_BON] -$1000!! - -[Y1_1ST] -~g~You came first with ~1~ successful checkpoints! - -[Y1_2ND] -~y~2nd with ~1~ successful checkpoints. ~y~Close, but you just ain't the best! - -[Y1_3RD] -~r~3rd with ~1~ successful checkpoints. ~r~I thought you said you were good! - -[Y1_LAST] -~r~You were last! ~r~You wasted my time FOOL! - -[Y1_J1ST] -~y~Joint 1st with ~1~ successful checkpoints. ~y~Good, but you gotta be the best to drive for Queen Lizzy! - -[Y1_J2ND] -~r~Joint 2nd with ~1~ successful checkpoints. You drive like a crazed monkey! - -[Y1JLAST] -~r~Joint last! You talk like a driver, but you drive like a talker! - -[Y1_TEST] -CAR IN WATER!! - -[YD2_A] -~w~I need to see if you're capable of doing my dirty work. - -[YD2_A1] -~w~See if you can be trusted. - -[YD2_B] -~w~Two of my boys will be there any second to take you for a ride, - -[YD2_B1] -~w~see if you are who you say you are. - -[YD2_C] -~w~We're going for a little ride into Hepburn Heights, whack us some filthy Diablos been dissing Queen Lizzy. - -[YD2_CC] -~w~Here, you'll need a 'piece'. - -[YD2_D] -~w~You do the driving and shooting. We'll make sure you don't get cold feet. - -[YD2_E] -~w~Let's drive!! - -[YD2_F] -~r~He's bailed out on us, cap his yellow ass!!! - -[YD2_G1] -~w~Hepburn Heights..Let's kill me some filthy Diablos... - -[YD2_G2] -~w~But remember, ~r~You don't leave this car!! - -[YD2_H] -~w~OK, Get us back to Yardie turf! GO GO GO!! - -[YD2_L] -~w~You did good, Reaperman! - -[YD2_M] -~r~He's wrecked my car! Waste him! - -[YD2_N] -~w~Get your ass back in this car! - -[YD3_A] -I want you to boost some gang cars - -[YD3_A1] -so we can do hits on our enemies' turf. - -[YD3_B] -I need a Mafia Sentinel, - -[YD3_B1] -a Yakuza Stinger and a - -[YD3_B2] -Diablo Stallion so we can hit any gang in Liberty. - -[YD3_C] -Drop them off at the garage in Newport and remember, - -[YD3_C1] -they're no use to us wrecked!! - -[YD3_D] -Spare text label - -[YD3_E] -~r~You've already boosted a diablo gangcar! - -[YD3_F] -~r~You've already boosted a Mafia gangcar! - -[YD3_G] -~r~You've already boosted a Yakuza gangcar! - -[YD3_H] -~g~Diablo gangcar boosted! - -[YD3_I] -~g~Mafia gangcar boosted! - -[YD3_J] -~g~Yakuza gangcar boosted! - -[YD3_K] -~r~The car's nearly wrecked! Get it repaired! - -[YD3_L] -~g~Take it to the ~p~garage! - -[YD3_M] -~r~You've flipped it! Get another one! - -[YD4_A] -Listen up! - -[YD4_A1] -Get over to Bedford Point. - -[YD4_A2] -There's a stash in an old car I need pronto! - -[YD4_B] -LETTER: I hear you've been a busy boy. Well I've been a busy girl. - -[YD4_C] -I think it's time you witnessed the real power of 'SPANK'! Besos y fuderes, Catalina, xxx. - -[YD4_D] -PS: DIE PEEG DOG, DIE!! - -[YD4_1] -~g~SPANKED-up madmen! - -[YD4_2] -~g~Destroy the madmens' vans!! - -[HM_1] -'UZI MONEY' - -[HM_2] -'TOYMINATOR' - -[HM_3] -'RIGGED TO BLOW' - -[HM_5] -'RUMBLE' - -[HOOD1_A] -Get to the payphone in Wichita Gardens and we'll talk business. - -[HM1_A] -Yo! This is D-Ice of the Red Jacks! - -[HM1_C] -These young punks, they come onto the streets and they got nothing but guns and SPANK on their minds. - -[HM1_3] -~g~The 'Nines' walk their turf in Wichita Gardens. - -[HM2_3] -If you hit a vehicle's wheels the RC buggy will detonate! - -[HM2_4] -If it goes out of range the RC buggy will detonate! - -[HM2_5] -~r~Out of range! - -[HM3_1] -~g~Get to the garage but watch out if the car takes too much damage it will blow! - -[HM3_2] -~g~Take the car back it has to be in perfect condition - no damage! - -[HM3_3] -~g~Get the car repaired! - -[HM4_D] -~g~Get a vehicle! - -[HM4_E] -TEXT NO LONGER REQUIRED - -[HM4_1] -~g~Head to the location where the cargo is scattered, you need to collect 30 pieces of bullion. - -[HM4_2] -~g~Remember when the vehicle becomes too heavy and slow goto the garage and drop off the cargo. - -[HM5_3] -~r~You were told to use a baseball bat only! - -[HM5_4] -~r~Your contact's dead! - -[MEA1] -'THE CROOK' - -[MEA2] -'THE THIEVES' - -[MEA3] -'THE WIFE' - -[MEA4] -'HER LOVER' - -[MEAT1_A] -A friend said you could fix some problems I got. Get to the payphone in Trenton if you think you can help. - -[MEA1_B3] -~g~Go and meet the Bank Manager. - -[MEA1_B6] -~g~Take the car to the crusher to get rid of evidence, get out of the car and the crane will pick it up. - -[MEA1_1] -~r~The Bank Manager's dead! - -[MEA1_2] -~r~You were told to crush the vehicle! - -[MEA1_3] -~g~Get out of the car! - -[MEA1_4] -~r~You have left the Bank Manager behind! - -[MEA2_B3] -~g~Go and meet the thieves. - -[MEA2_B4] -~g~Take them to the Bitch'n' Dog Food Factory - -[MEA2_B6] -~g~Get the car resprayed to get rid of any evidence. - -[MEA2_1] -~r~You were told to crush the vehicle! - -[MEA2_2] -~r~A thief's dead! - -[MEA2_4] -~r~You have left a thief behind! - -[MEA3_B3] -~g~Go and collect Mrs. Chonks - -[MEA3_B6] -~g~Take the car and dump it into the sea, this will get rid of any evidence. - -[MEA3_1] -~r~The wife's dead! - -[MEA3_2] -~r~You were supposed to dump the vehicle in the water! - -[MEA3_3] -~r~You have left his wife behind! - -[MEA4_B3] -~g~Pick up his wife's lover - -[MEA4_B6] -It's far too late for that Marty. You had your chance, but now I'm taking over the business... - -[MEA4_1] -~r~Carlos is dead! - -[MEA4_3] -~r~You have left Carlos the loan shark behind! - -[LOOK_A] -Press and hold the ~h~~k~~VEHICLE_LOOKLEFT~ button ~w~or the ~h~~k~~VEHICLE_LOOKRIGHT~ button~w~ to look ~h~left~w~ or ~h~right~w~ while in a vehicle. Press both to look ~h~behind~w~. - -[LOVE6_1] -~g~Now lead the cops away from the warehouse! - -[LOVE6_2] -~r~You failed to lead the police far enough away! - -[RM4_3] -~r~Ray's partner has escaped! - -[RM6_C] -The CIA seem to have a vested interest in SPANK - -[RM6_C1] -and they don't like us screwing with the Cartel. - -[C_PASS] -THREAT ELIMINATED! - -[CTUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Vigilante missions on or off. - -[CTUTOR2] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Vigilante missions on or off. - -[COPCART] -~g~You have ~1~ seconds to return to a police vehicle before the mission ends. - -[C_FAIL] -Vigilante mission ended! - -[C_CANC] -~r~Vigilante mission cancelled! - -[C_ESCP] -~r~The suspect has escaped! - -[C_TIME] -~r~Your time as a law enforcer is over! - -[C_VIGIL] -VIGILANTE BONUS!! - -[A_FAIL2] -~r~Your lack of urgency has been fatal to the patient! - -[A_FAIL3] -~r~The patient is dead!! - -[A_PASS] -Rescued! - -[F_FAIL2] -~r~You're too late! - -[A_COMP2] -You will never get tired! - -[RM2_M] -If you need any firepower just drop by and take what you need from the lockers. - -[HEAL_A] -Your ~h~health~w~ is displayed in orange in the top right of the screen. - -[YD1_CNT] -~1~ of 15! - -[FM1_9] -~g~Thats the party up ahead, drop Maria off out front. - -[FM1_Y] -~w~You know I enjoyed myself for the first time in a long while, and you treated me really good. With respect and everything. - -[FM1_AA] -~w~Oh, I'd better go. I'll see you around I hope. - -[NOCONTE] -Please re-insert the analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2) in controller port 1 to continue - -[WRCONT] -The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto III requires an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). - -[WRCONTE] -The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto III requires an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). - -[WRONGCD] -Incorrect disc. Please insert correct disc. - -[NOCD] -The disc tray is empty. Please insert disc. - -[OPENCD] -The disc tray is open. Please close the disc tray. - -[CDERROR] -Error reading the Grand Theft Auto III DVD - -[RESTART] -Starting new game - -[GA_3] -No more freebies. $1000 to respray! - -[GA_1] -Whoa! I don't touch nothing THAT hot! - -[GA_1A] -Come back when you're not so busy... - -[S_PROM2] -The garage next door can store one vehicle when you save your game. - -[STOCK] -out of stock - -[FM1_O] -~w~He's at the rail station at the Chinatown waterfront I think. - -[EBAL_B] -This is the place right here, let's get off the street and find a change of clothes! - -[EBAL_G] -This is Luigi's club. Let's go round the back and use the service door. - -[AM4_3] -You must be Asuka's new errand boy! - -[AM4_4] -You got the money? Is it all here? - -[AM4_5] -I know what you're thinking, another bent cop. - -[AM4_6] -Well, it's a bent world. - -[AM4_7] -Just 'cause I lost a few partners, those suckers from internal affairs have started sniffing around. - -[AM4_8] -Reckon they can smell me. - -[AM4_9] -Well, this city is just one big open sewer. - -[AM4_10] -But I'm gonna need some non-union help. - -[AM4_11] -And if you're interested you'll know where to find me. - -[CAM_A] -Press the ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~ button~w~ to change ~h~camera ~w~modes when on foot or in a vehicle. - -[CAM_B] -Press the ~h~directional button up~w~ and ~h~down~w~ to change ~h~camera ~w~modes when on foot or in a vehicle. - -[KM2_1] -~g~Repair the car, it's gotta be mint. - -[LM3_6] -Joey... - -[LM3_6A] -Am I goin' to play with your big end again? - -[LM3_9A] -there might be some work for you. - -[LM3_9B] -Alright? - -[AWAY2] -~r~They got away. - -[AWAY] -~r~He's clean out of here! - -[JM6_1] -Get to the bank on the main drag. - -[GA_6B] -Park it, prime it by pressing the ~h~~k~~PED_FIREWEAPON~ button~w~ and LEG IT! - -[GA_7B] -Arm with ~h~~k~~PED_FIREWEAPON~ button~w~. Bomb will go off when engine is started. - -[BAT1] -~g~Pick up the bat! - -[EBAL_O] -If you don't mess this up, maybe there be more work for you. Now get outta here! - -[HELP9_B] -Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. - -[HELP9_C] -Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. - -[JM6_8] -~r~You've lost all the robbers! - -[COLT_IN] -The Pistol is now in stock at Ammunation! - -[TAXI2] -~r~You're out of time! - -[TAXI3] -~r~Your passenger fled in terror! - -[TAXI7] -~r~Your car is trashed, get it repaired. - -[TAXI4] -Fare complete! - -[TAXI5] -SPEED BONUS!! - -[TAXI6] -Taxi mission over - -[FRANGO] -~g~Salvatore wants you to help Toni deal with the Triads first! - -[PAGEB12] -Police Bribe delivered to hideout - -[PAGEB13] -Health delivered to hideout - -[PAGEB14] -Adrenaline delivered to hideout - -[KM1_4] -~g~You need a cop car to do the job! - -[CAT1_B] -bring $500,000 to the Villa at Cedar Grove. - -[JM2_C] -He's got a noodle stand down in China Town. - -[RM6_1] -Here's a key to a lock-up. - -[RM6_2] -You'll find some cash and some 'supplies' I'd stashed in case things got tight. - -[RM6_3] -See y'around. - -[FE_INIP] -Initialising and loading Pause Menu... Please wait. - -[FESZ_CA] -Cancel - -[FESZ_QU] -Quit - -[FESZ_L1] -Game saved successfully! - -[FESZ_L2] -Your saved filename is: - -[FESZ_OK] -OK - -[FES_LGA] -Load Game - -[FES_NGA] -New Game - -[FES_CAN] -Cancel - -[FESZ_QL] -All unsaved progress in your current game will be lost. Proceed with loading? - -[FESZ_QD] -Proceed with deleting this saved game? - -[FESZ_QO] -Proceed with overwriting this saved game? - -[FESZ_QR] -Are you sure you want to start a new game? All progress since the last save game will be lost. Proceed? - -[FESZ_QS] -PROCEED WITH SAVE ? - -[T4X4_1] -'PATRIOT PLAYGROUND' - -[T4X4_2] -'A RIDE IN THE PARK' - -[T4X4_3] -'GRIPPED!' - -[MM_1] -'MULTISTOREY MAYHEM' - -[T4X4_1A] -~g~You have ~y~5 minutes~g~ to collect ~y~15~g~ checkpoints. ~g~You may collect them in ~y~ANY ORDER. - -[T4X4_1B] -~1~ of 15! - -[T4X4_1C] -~y~PASS THROUGH~g~ the first checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~20 SECONDS~g~. - -[T4X4_2A] -~g~You have ~y~2 minutes~g~ to collect ~y~12~g~ checkpoints!! ~g~You may collect them in ~y~ANY ORDER. - -[T4X4_2B] -~1~ of 12! - -[T4X4_2C] -~y~PASS THROUGH~g~ the first checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~10 SECONDS~g~. - -[T4X4_3A] -~g~You have ~y~5 minutes~g~ to collect ~y~20~g~ checkpoints. ~g~You may collect them in ~y~ANY ORDER. - -[T4X4_3B] -~y~PASS THROUGH~g~ the first checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~15 SECONDS~g~. - -[T4X4_3C] -~1~ of 20! - -[T4X4_F] -~r~You bailed! Too tough for you?! - -[MM_1_A] -~g~You have ~y~2 minutes~g~ to collect ~y~20 checkpoints~g~ in the multistorey! ~g~You may collect them in ~y~ANY ORDER. - -[MM_1_B] -~1~ of 20! - -[MM_1_C] -~g~That's 20 seconds, plus ~y~5 SECONDS~g~ for each checkpoint. ~g~The timer will start ~y~IMMEDIATELY. - -[FM2_14] -~r~You got too close and spooked Curly! - -[FM2_15] -~g~Don't get too close or Curly will suspect something! - -[UPSIDE] -~r~You flipped your wheels! - -[FM2_16] -SPOOKOMETER: - -[LM3_11] -~g~Misty won't ride in a bus get another vehicle! - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinel - -[PATRIOT] -Patriot - -[FIRETRK] -Firetruck - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mule - -[CHEETAH] -Cheetah - -[AMBULAN] -Ambulance - -[FBICAR] -Fbi Car - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -Mr Whoopee - -[BFINJC] -BF Injection - -[POLICAR] -Police - -[ENFORCR] -Enforcer - -[SECURI] -Securicar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Barracks OL - -[TRAIN] -Train - -[HELI] -Helicopter - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -RC Bandit - -[BELLYUP] -Triad Fish Van - -[MRWONGS] -Mr Wongs - -[MAFIACR] -Mafia Sentinel - -[YARDICR] -Yardie Lobo - -[YAKUZCR] -Yakuza Stinger - -[DIABLCR] -Diablo Stallion - -[COLOMCR] -Cartel Cruiser - -[HOODSCR] -Hoods Rumpo XL - -[AEROPL] -Aeroplane - -[SPEEDER] -Speeder - -[REEFER] -Reefer - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Borgnine - -[TOYZ] -TOYZ - -[FEST_DF] -Dist. travelled on foot (miles) - -[FEST_DC] -Dist. travelled by car (miles) - -[FESTDFM] -Distance travelled on foot (m) - -[FESTDCM] -Distance travelled by car (m) - -[FEST_R1] -Patriot Playground in secs - -[FEST_R2] -A Ride In The Park in secs - -[FEST_R3] -Gripped! in secs - -[FEST_RM] -Multistorey Mayhem in secs - -[FEST_LS] -People saved in an Ambulance - -[FEST_CC] -Criminals killed on Vigilante Mission - -[FEST_FE] -Total fires extinguished - -[FEST_LF] -Longest flight in Dodo - -[FEST_BD] -Best time for bomb defusal - -[FEST_RP] -Rampages passed - -[FEST_MP] -Missions passed - -[FEST_BB] -Bling-bling Scramble: - -[FEST_H0] -Most checkpoints - -[FEST_GC] -Gang Cars Totalled: - -[FEST_H1] -Diablo destruction - -[FEST_H2] -Mafia Massacre - -[FEST_H3] -Casino Calamity - -[FEST_H4] -Rumpo Wrecker - -[USJI1] -TEXT NO LONGER REQUIRED - -[USJI2] -TEXT NO LONGER REQUIRED - -[USJI3] -TEXT NO LONGER REQUIRED - -[USJ] -UNIQUE STUNT BONUS! - -[SPRAY] -Drive your vehicle into the spray shop to lose your ~h~wanted level~w~, ~h~repair ~w~and ~h~respray ~w~your vehicle. Cost - ~h~$1000. - -[HM1_1] -~g~Ice 20 Purple Nines in 2 minutes 30 seconds. - -[KM1_8A] -Press the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~activate the bomb,~w~ remember to get out of the way. - -[KM1_8D] -Press the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~activate the bomb,~w~ remember to get out of the way. - -[KM1_12] -~g~Get him to the dojo but get rid of the cops first! - -[RATNG1] -Pickpocket - -[RATNG2] -Bully - -[RATNG3] -Thug - -[RATNG4] -Hustler - -[RATNG5] -Goon - -[RATNG6] -Wheelman - -[RATNG7] -Hired muscle - -[RATNG8] -Fixer - -[RATNG9] -Associate - -[RATNG10] -Cleaner - -[RATNG11] -Assassin - -[RATNG12] -Right-hand man - -[RATNG13] -Executioner - -[RATNG14] -Capo - -[RATNG15] -Boss - -[1010] -~r~Your vehicle is upside down - -[1011] -~r~Your vehicle is upside down - -[1012] -~r~Your vehicle is upside down - -[1013] -~r~Your vehicle is upside down - -[1014] -~r~Your vehicle is upside down - -[JM4_10] -OK, Kid. Drive me to the laundry in Chinatown first, I got a bit of business to take care of. - -[JM4_11] -Those washer women aint been payin' their protection money. - -[JM4_12] -And watch the car, Joey just fixed this junk heap. - -[JM4_13] -So no fancy crap, OK? - -[KM4_11] -~g~Take the money back to the casino! - -[FEF_BR2] -Find it again by reading any mission briefs collected to date. - -[TRAIN_1] -Kurowski Station - -[TRAIN_2] -Rothwell Station - -[TRAIN_3] -Baillie Station - -[SUBWAY1] -Portland Station - -[SUBWAY2] -Rockford Station - -[SUBWAY3] -Staunton South Station - -[SUBWAY4] -Shoreside Terminal - -[MEA4_2] -~r~Marty Chonks is dead! - -[SPRAY1] -Drive your vehicle into the spray shop to lose your ~h~wanted level~w~, ~h~repair ~w~and ~h~respray ~w~your vehicle. Cost - ~h~$1000~w~. This time it's free. - -[JM4_A] -Yeah, I know Toni, I've tuned her real sweet. She purrs, you know what I mean? - -[JM4_5] -Drop by later and we'll give them something to launder, their own blood stained clothes! - -[AMMU_A] -Luigi said you'd need a piece... - -[AMMU_B] -Joey told me to tool you up... - -[AMMU_C] -So go around back of the shop. I left you a nine in the yard. - -[AMMU_D] -I got all your home defence needs. - -[AMMU_E] -You want a license too? - -[AMMU_F] -I don't need to see any I.D. you look trustworthy. - -[DETON] -DETONATION: - -[DRIVE_A] -Have an Uzi selected when entering a vehicle then look left or right and press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire. - -[DRIVE_B] -Have an Uzi selected when entering a vehicle then look left or right and press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire. - -[RECORD] -~g~NEW RECORD!! - -[NRECORD] -~r~NO NEW RECORD! - -[RCHELP] -Press ~k~~PED_FIREWEAPON~, or drive the RC car into a vehicle's wheels to detonate. - -[RCHELPA] -Press the ~k~~PED_FIREWEAPON~ button, or drive the RC car into a vehicle's wheels to detonate. - -[RC_1] -You have 2 minutes to blow up as many Diablo Gang Cars as possible! - -[RC_2] -You have 2 minutes to blow up as many Mafia Gang Cars as possible! - -[RC_3] -You have 2 minutes to blow up as many Yakuza Gang Cars as possible! - -[RC_4] -You have 2 minutes to blow up as many Yardie Gang Cars as possible! - -[RC_5] -You have 2 minutes to blow up as many Hood Gang Cars as possible! - -[RC_6] -You have 2 minutes to blow up as many Cartel Gang Cars as possible! - -[RAMPAGE] -RAMPAGE!! - -[RAMP_P] -RAMPAGE COMPLETE! - -[RAMP_F] -RAMPAGE FAILED - -[PAGE_00] -. - -[PAGE_01] -Murder ~1~ Diablos in 120 seconds! - -[PAGE_02] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_03] -Kill ~1~ Mafia in 120 seconds! - -[PAGE_04] -Kill ~1~ Triads in 120 seconds! - -[PAGE_05] -Kill ~1~ Triads in 120 seconds! - -[PAGE_06] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_07] -Pop ~1~ Yardie heads in 120 seconds! - -[PAGE_08] -Burn ~1~ Yakuza in 120 seconds! - -[PAGE_09] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_10] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_11] -Annihialate ~1~ Yardies in 120 seconds! - -[PAGE_12] -Torch ~1~ Yakuza in 120 seconds! - -[PAGE_13] -Explode ~1~ Yardies in 120 seconds! - -[PAGE_14] -Fry ~1~ Colombians in 120 seconds! - -[PAGE_15] -Splatter ~1~ Hoods in 120 seconds! - -[PAGE_16] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_17] -Splatter ~1~ Colombians with a car in 120 seconds! - -[PAGE_18] -Driveby and Destroy ~1~ vehicles in 120 seconds! - -[PAGE_19] -Remove ~1~ Colombian heads in 120 seconds! - -[PAGE_20] -Behead ~1~ Hoods in 120 seconds! - -[JM1_A] -Hey, I'm bored when you gonna drill me? - -[JM1_B] -In a moment sweet heart, I got a little business to take care of. - -[JM1_C] -I got a little job for you pal. - -[JM1_D] -The Forelli brothers have owed me money for too long - -[JM1_E] -and they need to be taught some respect. - -[JM1_F] -Lips Forelli is stuffing his fat face in St Marks Bistro, - -[JM1_G] -so steal his car and take it to 8-Ball's bomb shop up in Harwood. - -[JM1_H] -You know 8-Ball right? - -[JM1_I] -Once he's fitted it with a bomb, go park the car where you found it. - -[JM1_J] -Then sit back and watch the whole show. - -[JM1_K] -But hurry up, he won't be eating forever. - -[CAT2_A1] -Come on you dumb bitch! - -[CAT2_A] -The real question is, did you turn up to rescue Maria or to get me back? - -[CAT2_B] -Well I got news for you, - -[CAT2_B2] -shooting you will be a pleasure but dating you was only business. - -[CAT2_C] -You are muy peccinno amigo! - -[CAT2_D] -Throw over the cash. - -[CAT2_E] -You have been a busy boy! - -[CAT2_E2] -But you haven't learned, I'm not to be trusted. - -[CAT2_E3] -Kill the idiot. - -[CAT2_J] -Get this thing airborne!! - -[HM5_1] -Yo, Ice said was comin'. There rules. Bats only. No guns, no cars. - -[HM5_5] -This is a battle for respect, you cool? - -[HELP14] -To collect weapons walk through them. These cannot be collected while in a vehicle. - -[CRUSH] -Park in the marked area and exit your vehicle. The vehicle will then be crushed. - -[DIAB2_B] -A gang of no-goods has threatened to remove my starring member if I don't pay them a cut. - -[DIAB2_C] -They threaten the wrong man, amigo. - -[DIAB2_D] -They have a weakness for the icecream. - -[DIAB2_E] -Pick up the bomb I've hidden in Harwood, - -[DIAB2_F] -hijack the regular icecream van on its rounds. - -[DIAB2_G] -and lure these fools to their doom with the jeengle-jeengle. - -[DIAB2_H] -They hide in a warehouse on Atlantic Quay. - -[DIAB3_A] -Some insolent Triads stole my beautiful car last night, - -[DIAB3_B] -wrecked it and left it burning. - -[DIAB3_C] -Some of my most precious donkey memorabilia was in the trunk - - -[DIAB3_D] -real collectibles that are irreplaceable my friend. - -[DIAB3_E] -I've hidden a throbbing weapon on the edge of Chinatown. - -[DIAB3_F] -Take it and teach these Triad vandals to fear El Burro's well-endowed wrath. - -[DIAB3_1] -KILL 25 TRIADS - -[DIAB4_A] -A thieving opportunist has stolen a van of my latest publication hot off the press! - -[DIAB4_B] -But that SPANKED-up idiot has left the rear doors open - -[DIAB4_C] -and now my beautifully produced, - -[DIAB4_D] -tastefully photographed adult literature is being dropped all over Liberty! - -[DIAB4_E] -Take the van and follow that trail of Donkey Does Dallas volumes 1, 2 and 3 - -[DIAB4_F] -collecting it as you go. - -[DIAB4_G] -When you've followed the trail to that thieving SPANK-head, waste him! - -[DIAB4_H] -Then deliver my donkey derby to XXX Mags in the Red Light District. - -[DIAB4_1] -~g~Take the van to the back of XXX Magazines. - -[HM1_E] -I want you to show these punk ass bitches how a real drive-by works. - -[HM1_H] -Take these nines off of here!! - -[HM2_A] -Those Nines are pressing me. - -[HM2_B] -These Bitches got armored cars and now they're running SPANK... - -[HM2_C] -and slinging it to brothers with no fear. - -[HM2_D] -There's a car parked up the way. - -[HM2_E] -There's some stuff in there to put these sissys on blass... - -[HM3_A] -Some effa has wired my wheels to blow. - -[HM3_B] -If I lose those wheels, my rep on the street will be dead. - -[HM3_C] -Pick up my car and take it over to the garage on St. Marks, a'right yo. - -[HM3_D] -Let them diffuse that, let them take care of that bomb. - -[HM3_E] -The clocks ticking and the wiring is messed up. - -[HM3_F] -One pot hole too many and that thing could blow. - -[HM3_G] -Now move it! - -[HM4_A] -Yo, a Federal Reserve flight just smashed down at Francis International. - -[HM4_B] -There's platinum all over the strip. - -[HM4_C] -Get a car and snatch up as much as you can. - -[HM4_F] -You can drop the bling off at one of my garages. - -[HM4_G] -This platinum is mad heavy and it will slow your wheels down some. - -[HM4_H] -So make regular drop off's at the garage. - -[HM5_A] -Them Nines are down to a few scabby herds... - -[HM5_B] -but they still wanna bring it. - -[HM5_C] -They agreed to go toe to toe. - -[HM5_D] -A gang of them against two of us, or rather... - -[HM5_E] -two of yaw - -[HM5_F] -I'd join you but... - -[HM5_G] -I ain't due my parole hearing for another three months now, - -[HM5_H] -y'know what I mean? - -[HM5_I] -Go and meet my baby brother, - -[HM5_J] -He'll show you where they are fighting a'right son. - -[MEA1_B] -The name's Chonks, Marty Chonks. - -[MEA1_C] -I run the Bitchin' Dog Food factory around the corner. - -[MEA1_D] -I got money troubles, but hey, who doesn't right? - -[MEA1_E] -I'm meeting my bank manager later. - -[MEA1_F] -He's a crooked bastard that keeps bumping up the loan repayments so he can cut a slice. - -[MEA1_G] -Take my car, pick him up and bring him back here. - -[MEA1_H] -I've got a little surprise for that blood sucking leech!! - -[MEA2_A] -I hired some thieves to break into my apartment... - -[MEA2_C] -The thieving bastards are threatening to tell the insurance company, - -[MEA2_D] -if I don't give them a cut. - -[MEA2_E] -Can you believe it? - -[MEA2_F] -I've left a car inside the factory gates. - -[MEA2_G] -Use it to go and pick them up from their turf in the Red Light district. - -[MEA2_H] -Then bring 'em back to the factory so I can make 'em see Marty's point of view. - -[MEA3_A] -The business is going to go under unless I get hold of some serious cash soon. - -[MEA3_B] -My wife has an insurance policy and all she's ever been to me is a hole in my pocket. - -[MEA3_C] -I've left a car in the usual place. - -[MEA3_D] -Go and pick up my wife from Classic Nails and bring her back to the factory. - -[MEA4_A] -Damn, I'm in trouble! - -[MEA4_B] -Turns out my wife was seeing some guy I owe money to. - -[MEA4_C] -He's got real angry and he's looking for payback! - -[MEA4_E] -he thinks I'm gonna pay him off... - -[MEA4_F] -but my guess is... - -[MEA4_G] -Liberty's dogs are gonna get yet another flavor this month! - -[WELCOME] -WELCOME TO - -[HM1_2] -~g~Get a vehicle, remember only Uzi drive by kills count! - -[HELP8_B] -Press the~h~ ~k~~PED_SNIPER_ZOOM_IN~ button ~w~to ~h~zoom in ~w~with the rifle and the~h~ ~k~~PED_SNIPER_ZOOM_OUT~ button ~w~to ~h~zoom out ~w~again. - -[LRQC_1] -Asuka and I are gonna have to talk, uh, - -[LRQC_2] -Why don't you go cruise around? - -[LRQC_3] -You'll need a place to lie low. - -[LRQC_4] -There's a warehouse at the edge of Belleville that should suit your needs. - -[LRQC_5] -Come back here to my Condo when you are ready, - -[LRQC_6] -and we can have a little chat. - -[JM6_5] -~g~You need a getaway vehicle, Idiot! - -[JM2_F] -If you need a piece go around back of AmmuNation opposite the subway. - -[LOVE4_7] -~g~There's a construction yard in Staunton Island, maybe they took the package there. - -[LOVE4_8] -~g~You'll need a car to open the garage. - -[TSCORE] -EARNINGS: $~1~ - -[AM1_9] -~r~Salvatore has escaped back into Luigi's Club! - -[AM1_6] -~g~If you hang around Luigi's club, the Mafia will spot you! - -[TM2_3] -~g~It's a trap! Waste them all!! - -[FM4_1] -This is Maria. The car's a trap! Meet me at the slip south of Callahan Bridge. - -[JM1_7] -~g~Close the car door! He'll notice! - -[KM5_1] -~g~DEALER MINCED!!. - -[KM5_6] -~g~You must murder at least 8 Yardie dealers. - -[KM5_7] -~g~Kill them quickly! Once they've pushed their SPANK they're off the streets. - -[RM3_8] -~r~That car is a decoy!! - -[LM3_8] -Hey, I'm Joey. - -[LM3_9] -Luigi said you were reliable so come back later, - -[KM3_5] -~g~Press the horn to get the deal going. - -[LOVE7] -LOVE'S DISAPPEARANCE - -[LOVE2_5] -~g~Kenji is fender meat! Get out of Newport and dump the car! - -[AS2_11] -~g~~1~ OF 9! - -[GARAGE1] -~g~Get out of the vehicle and walk outside. - -[KM3_11] -~g~The Cartel have been attacked and the briefcase has not been recovered. - -[KM3_12] -~g~Kill all of the Colombians, destory the vehicles and recover the briefcase. - -[KM3_13] -~g~Take the briefcase back to the casino. - -[RM5_6] -~g~He's bailed out!! Smash his bodycast with a vehicle or an explosion!! - -[PBOAT_1] -Press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire the boat cannons. - -[PBOAT_2] -Press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire the boat cannons. - -[DIAB1_B] -This is El Burro of the Diablos. - -[DIAB1_D] -You're new in Liberty, but already you are gaining a reputation on the streets. - -[DIAB1_E] -There's a street race starting by the old school hall near the Callahan Bridge. - -[DIAB1_F] -Get yourself some wheels and first through all the checkpoints wins the prize. - -[HM2_1] -Use the RC buggies to destroy the armored cars. Press the ~h~~k~~PED_FIREWEAPON~ button ~w~to detonate. - -[HM2_1A] -Use the RC buggies to destroy the armored cars. Press the ~h~~k~~PED_FIREWEAPON~ button ~w~to detonate. - -[HM2_2] -~r~You failed to destroy all the armored cars! - -[HM2_6] -~g~Armored Car destroyed! - -[RM3_A] -I know a real important man in town, a soft touch, - -[RM3_H] -with shall we say, exotic tastes and the money to indulge them. - -[RM3_B] -He's involved in a legal matter and the prosecution has some rather embarrassing photos of him - -[RM3_C] -at a morgue party or something. - -[LOVE6_A] -A lesson in business, my friend. - -[LOVE6_E] -If you have a unique commodity, the world and his wife will try to wrestle it from your grasp... - -[LOVE6_C] -SWAT teams have cordoned off the area around my associate and the package. - -[LOVE6_D] -Get over there, pick up the van and act as a decoy. - -[LOVE6_F] -Keep them busy and he should make good his escape. - -[AM3_C] -He's probably out in the bay as you read this! Steal a police boat, and sink his career! - -[FESZ_UC] -CANCEL - -[FEDS_SM] -L1,R1-CHANGE MENU - -[FEDS_AS] -;=-CHANGE SELECTION - -[FEDSAS2] -<>-CHANGE SELECTION - -[FEDS_SS] -L1,R1-CHANGE SELECTION - -[FEDSSC1] -;-FASTER SCROLLING - -[FEDSSC2] -=-STOP SCROLLING - -[MEA2_3] -~g~Bring the car back to the factory. - -[RM1_3] -~r~McAffrey escaped! - -[RM1_4] -~g~You have used all the grenades! Get some more from ammunation! - -[RM1_5] -~g~Go back and torch the safehouse! - -[RM6_4] -~g~Go over to the lockup and collect Ray's stash. - -[RM6_5] -~g~The CIA have the bridge under surveillance, find another route across. - -[HM2_F] -and wreck all their armored stuff. - -[HM_4] -'BULLION RUN' - -[MEA2_B5] -TEXT NO LONGER NEEDED - -[MEA1_B5] -TEXT NO LONGER NEEDED - -[MEA3_B5] -TEXT NO LONGER NEEDED - -[MEA4_B7] -but if you just step into my office... - -[MEA3_B4] -Marty wants to see me? Well it better be quick because I have to get my hair done. - -[KM3_7] -It's a Yakuza trap man! - -[FES_LOF] -Load Failed. - -[FES_SLO] -SAVE FILE - -[FES_ISC] -IS CORRUPTED - -[FESZ_TI] -SAVE Z1 - -[FESZ_SA] -Save game - -[MC_LDFL] -Load Failed! - -[MC_NWRE] -Now Restarting Game. - -[LOVE6_3] -~g~You have ~1~ seconds to return to the Securicar before you fail the mission. - -[LOVE6_4] -~r~You ditched the Decoy Securicar! - -[HELP1] -Stop in the center of the blue marker. - -[HELP12] -Walk into the center of the blue marker to trigger a mission. - -[HJSTAT] -Distance: ~1~.~1~m Height: ~1~.~1~m Flips: ~1~ Rotation: ~1~_ - -[HJSTATW] -Distance: ~1~.~1~m Height: ~1~.~1~m Flips: ~1~ Rotation: ~1~_ And what a great landing! - -[DIAB1_5] -RACE TIME: - -[LOVE3_4] -~r~You destroyed the plane!! - -[F_FAIL1] -Fire Truck mission ended. - -[F_CANC] -~r~Fire Fighter mission cancelled! - -[F_EXTIN] -FIRES: - -[A_COMP1] -Paramedic missions complete! - -[A_CANC] -~r~Paramedic mission cancelled! - -[A_COMP3] -Paramedic missions complete! You will never get tired when running! - -[ATUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Paramedic missions on or off. - -[ATUTOR3] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Paramedic missions on or off. - -[ALEVEL] -Paramedic Mission Level ~1~ - -[A_FAIL1] -Paramedic mission ended. - -[FEST_HA] -Highest Paramedic Mission level - -[A_SAVES] -PEOPLE SAVED: ~1~ - -[C_KILLS] -CRIMINALS KILLED: ~1~ - -[HM1_B] -I got a problem they tryin' to play me. - -[AM2_A] -Salvatore's death comes as pleasurable news, - -[AM2_A2] -you are an efficient killer. I like that in a man. - -[AM2_B] -This is my brother Kenji. - -[AM2_C] -Asuka has a little job for you, but when you're done, drop by my casino and we can talk. - -[AM2_D] -Just like Kenji, always trying to play with my toys. - -[AM2_E] -My police source indicates that the Mafia are watching our interests around the city - -[AM2_E2] -in a bid to track you down. - -[AM2_F] -We cannot continue our operations until they are dealt with. - -[AM2_G] -Take out these spying fools and end this vendetta once and for all. - -[F_START] -~g~Burning vehicle reported in the ~a~ area. Go and extinguish the fire. - -[AM4_1A] -Get to the Phone in West Belleville Park. - -[AM4_1B] -Get to the Phone on Liberty Campus. - -[AM4_1C] -Get to the Phone in South Belleville Park. - -[AM4_1D] -Meet me in the toilet block in the park. - -[HJSTATF] -Distance: ~1~ft Height: ~1~ft Flips: ~1~ Rotation: ~1~_ - -[HJSTAWF] -Distance: ~1~ft Height: ~1~ft Flips: ~1~ Rotation: ~1~_ And what a great landing! - -[HM1_F] -Watch your back though, there'll be Jacks on the street who'll think you're trying to blast them too! - -[HM1_D] -'Nines' is their tag and purple is their flag and each day they rock their colors... - -[HM1_G] -is another day the 'Jacks' look soft. - -[MEA2_B] -and steal some stuff so I could claim on the insurance as you do. - -[TM3_H] -~w~You did good back there kid, real good. - -[TM3_I] -~w~Come on, let's introduce you to the Don. - -[TM3_J] -~w~Heeyyy! Luigi! - -[TM3_K] -~w~Oh my girls have been missing you so long Salvatore, you been away too long. - -[TM3_L] -~w~You tell them that once this unfortunate business is taken care of, - -[TM3_M] -~w~we'll all go down to the club and celebrate, ok? - -[TM3_N] -~w~Here's my boy. - -[TM3_N2] -~w~How you doin' pop? - -[TM3_O] -~w~You got yourself a good woman yet? - -[TM3_P] -~w~Hey, your mother, god bless her soul, would be turning over in her grave - -[TM3_Q] -~w~to see you without a wife. - -[TM3_R] -~w~I know Pop, I'm working on it. - -[TM3_S] -~w~TONI! How's your Momma? - -[TM3_T] -~w~She's a great woman you know. Strong. Firenze. - -[TM3_U] -~w~She's good...fine. - -[TM3_V] -~w~Terrific, Terrific. Now listen you guys, you go inside while I talk to our new friend here. - -[TM3_W] -~w~I see nothing but good things for you my boy... - -[RM1_A] -That scumbag McAffrey, he took more bribes than anyone. - -[RM1_B] -He thinks he's gonna get an honorable discharge if he turns states evidence. - -[RM1_C] -He just squealed! - -[RM4_B] -We gotta shut him up, permanently. - -[RM4_E] -I want him sleeping with the fishes, not eating them. - -[LOVE3_B] -On its approach to the airport tonight, a light aircraft will pass over the bay. - -[LOVE4_D] -Unfortunately the port authorities seized the plane and were stripping it down - -[LOVE4_H] -until I intervened at great personal expense. - -[LOVE4_E] -Cross the bridge to Shoreside Vale and go to Francis International Airport. - -[GTAB_A] -Hey, let's get this out of here. God knows what it is - -[GTAB_B] -but he seems to want it badly enough so it must be worth something. - -[GTAB_C] -Who the Heck! - -[GTAB_D] -YOU! - -[GTAB_E] -Hey take it easy amigo! De nada! De nada! - -[GTAB_F] -I left you pouring your heart out into the gutter! - -[GTAB_G] -Don't shoot amigo. No problem. We all friends. Here, take this. - -[GTAB_H] -Don't be such a pussy! - -[GTAB_I] -We got no choice baby! - -[GTAB_J] -We always got a choice you dumb bastard! - -[GTAB_K] -I'm sorry about that crazy bitch man, they all the same...por favor?? - -[GTAB_L] -So the whore got away. - -[GTAB_M] -But you've done me a favor, - -[GTAB_N] -you're not the only one that has a score to settle with the Cartel, - -[GTAB_O] -this worm killed my brother! - -[GTAB_P] -I never killed no Yakuza! - -[GTAB_Q] -LIAR! We all saw the Cartel assassin. - -[GTAB_R] -We are going to hunt down and kill all you Colombian dogs! - -[GTAB_S] -I'll be operating on our friend here to extract information and a little pleasure. - -[GTAB_T] -You, drop by later, I'm sure I'll require your services. - -[GTAB_U] -Please amigo, don't leave me with her, she psycho chica! Amigo? Hey AMEEEGO!!!...Aiiieeeeaaargghh! - -[LOVE5_A] -You are proving to be a safe investment, a rare thing in these days of false hood. - -[KM3_1] -~g~The Cartel are expecting a Yardie Posse go and steal a Yardie car! Head north you'll find one in Newport. - -[LOVE1_1] -~g~Go 'jack a Colombian gang car, so you can infiltrate the hideout, head north you'll find one in Fort Staunton. - -[FM1_Q1] -~w~You looking for some fun? A little...hmm? Some SPANK? - -[FM1_R] -~w~Hi Chico. Nah, just the usual. - -[FM1_T] -~w~Thanks Chico. See you around. - -[FM1_W] -~w~Alright Fido, you wait here and look after the car while I go and shake my butt alright. - -[FM1_X] -~w~OK Fido, let's get out of here. Wooooh! - -[FM1_Q] -~w~Hey Maria! It's my favorite lady! - -[FM1_S1] -~w~Hey, maybe you should check out the warehouse party at the east end of Atlantic Quays. - -[FM1_U] -~w~Gracias and enjoy. That's good stuff. - -[FM1_V] -~w~C'mon Fido, let's go and check out this party! - -[FM1_SS] -~r~SCANNER: ~g~Four-five to all units: Assist narcotics raid Atlantic Quays... - -[LOVE6_B] -even if they have little understanding as to its true value. - -[TM3_A1] -~r~Joey's Fried! - -[TM3_A2] -~r~Joey and Luigi have been cremated! - -[TM3_A3] -~r~Joey, Luigi and Toni are Toast! - -[FM4_2] -Listen, Salvatore thinks that we're going behind his back, - -[FM4_3] -so he was offering you to the Cartel in order to make a deal. - -[FM4_4] -I couldn't let him do that, I mean the worst thing is, - -[FM4_4B] -it's all my fault... because I told him, we were an item. - -[FM4_5] -Don't ask me why. I don't know. - -[FM4_6] -Look you're a marked man on Mafia turf and I've got to get out of here too. - -[FM4_6B] -I've seen too much killing. Too much blood! - -[FM4_7] -This is a friend of mine ok, she's an old friend.. it's Asuka, she's someone we can trust. - -[FM4_8] -C'mon, Enough of the speeches. - -[FM4_9] -We better get out of here before we get more hysterical Italians wanting less friendly reunions. - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUCER - -[CRED003] -LESLIE BENZIES - -[CRED004] -ART DIRECTOR - -[CRED005] -AARON GARBUT - -[CRED006] -TECHNICAL DIRECTION - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -DESIGN - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -WRITTEN BY - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -CHARACTERS - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMATION & DIRECTION - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -AUTO DESIGN - -[CRED024] -PAUL KUROWSKI - -[CRED025] -ARTISTS - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODERS - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -SCORE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -SOUND DESIGN & MASTERING - -[CRED042] -ALLAN WALKER - -[CRED043] -AUDIO PROGRAMMING - -[CRED044] -RAYMOND USHER - -[CRED045] -TEST MANAGER - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -LEAD TESTERS - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRD050A] -TESTERS - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -TECHNICAL SUPPORT - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -EXECUTIVE PRODUCER - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUCER - -[CRED064] -DAN HOUSER - -[CRED065] -DIRECTOR OF DEVELOPMENT - -[CRED066] -JAMIE KING - -[CRED067] -TECHNICAL PRODUCER - -[CRED068] -GARY J. FOREMAN - -[CRED069] -ASSOCIATE PRODUCER - -[CRED070] -JEREMY POPE - -[CRED071] -MUSIC SUPERVISOR - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VP OF MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -TECHNICAL COORDINATOR - -[CRED088] -BRANDON ROSE - -[CRED089] -QA MANAGER - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -GAME ANALYST - -[CRED094] -RICHARD HUIE - -[CRED095] -TEST TEAM - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -LIBERTY TREE EDITORIAL - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -CUT-SCENES - -[CRED108] -SCRIPT BY DAN HOUSER AND JAMES WORRALL - -[CRED109] -AUDIO DIRECTED BY DAN HOUSER - -[CRED110] -AUDIO PRODUCED BY RENAUD SEBBANE - -[CRED111] -CAST - -[CRED112] -FRANK VINCENT AS SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO AS LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN AS TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT AS JOEY LEONE - -[CRED116] -DEBBI MAZAR AS MARIA - -[CRED117] -KYLE MACLACHLAN AS DONALD LOVE - -[CRED118] -ROBERT LOGGIA AS RAY MACHOWSKI - -[CRED119] -GURU AS 8-BALL - -[CRED120] -SONDRA JAMES AS MOMMA - -[CRED121] -LIANA PAI AS ASUKA - -[CRED122] -LES MAU AS KENJI - -[CRED123] -CYNTHIA FARRELL AS CATALINA - -[CRED124] -AL ESPINOSA AS MIGUEL - -[CRED125] -CHRIS PHILLIPS AS EL BURRO - -[CRED126] -HUNTER PLATIN AS CHICO - -[CRED127] -WALTER MUDU AS D-ICE - -[CRED128] -CURTIS MCCLARIN AS CURTLY - -[CRED129] -BILL FIORE AS DARKEL - -[CRED130] -CHRIS PHILLIPS AS MARTY CHONKS - -[CRED131] -HUNTER PLATIN AS CURLY BOB - -[CRED132] -WALTER MUDU AS KING COURTNEY - -[CRED133] -HUNTER PLATIN AS ONE-ARMED PHIL - -[CRED134] -KIM GURNEY AS MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATED BY - -[CRD136A] -ALEX HORTON - -[CRED137] -DIRECTED BY - -[CRD137A] -NAVID KHONSARI - -[CRED138] -PRODUCED BY - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRED139] -RECORDED AT MODERN UPRISING STUDIOS, BROOKLYN - -[CRED140] -ACTORS - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS. - -[CRED141] -PEDESTRIAN DIALOGUE - -[CRED142] -WRITTEN BY DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRECTED BY CRAIG CONNER, DAN HOUSER AND LAZLOW - -[CRED144] -PRODUCED BY RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -RADIO STATIONS AND MUSIC - -[CRED218] -PRODUCERS FOR ROCKSTAR UK - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED219] -SOUNDTRACK CO-ORDINATOR - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUCER FOR ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -EDITED BY - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER AND IMAGING WRITTEN BY - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -SPECIAL THANKS TO - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[CRED270] -MIKE HONG - -[CINCAM] -Cinematic Camera - -[KM1_13] -Drive the vehicle into the garage! - -[KM3_14] -~r~You have been spotted the deal is off! - -[EBAL_H] -Wait here man while I go in and talk to Luigi. - -[EBAL_M] -Remember no one messes with my girls! - -[LM2_F] -Then take his car, respray it. - -[LM2_D] -here, here take it. - -[LM1_9] -Hi I'm Misty. - -[LM4_A] -Some Diablo scumbag has been pimping his skuzzy bitches in my backyard. - -[FM2_B] -We got us a rat! - -[FM2_C] -He ain't pimpin' or pushin' so he must be talking. - -[FM3_CC] -~w~Come back brother when you have the money. - -[FEDS_AM] -<>-CHANGE MENU - -[LOVE5_5] -~r~You failed to protect the truck! - -[RM6_6] -~r~Ray is dead! - -[RM6_7] -~r~Ray has missed his flight. - -[RM6_8] -~g~You have left Ray behind, go back and get him. - -[FM1_10] -~g~You have left Maria behind, go back and pick her up. - -[LOVE4_9] -~r~The plane has been destroyed! - -[LOV4_10] -~r~The only lead to where the package has gone has been destroyed! - -[KM2_D] -Needless to say, we must give him the cars as a gift, to repay the debt that I owe him. - -[KM4_B] -The business's fortunate enough to have our protection settle their accounts today. - -[KM2_E] -You must obtain the cars on this list and deliver them to a garage behind the car park in Newport. - -[FM3_8I] -~w~Get a good vantage point then I'll head in when you fire the first shot. - -[LOVE1_B] -Experience has taught me that a man like you can be very loyal for the right price, - -[LOVE1_H] -but groups of men get greedy. - -[LOVE1_C] -A valued resource, an old oriental gentleman I know, - -[LOVE1_I] -has been kept hostage by some South Americans in Aspatria. - -[MEA4_D] -I've agreed to see him... - -[MEA4_B4] -Marty sent you huh? OK, I'm gonna show that creep the meaning of the word business. - -[MEA4_B5] -Carl, hi! i eerr, I need more time to get your money. - -[MEA1_B4] -Ah, Mr Chonks sent you did he. Let's go and pay the fellow a visit. - -[HM5_6] -Let's go crack some skulls... - -[LOVE1_5] -~g~Stop hanging around, get a Colombian Gang car and rescue Love's associate. - -[AS1_D] -~w~Act as the bait, and get the death squads to follow you to Pike Creek - -[AS1_E] -~w~where some of my men will be waiting for them. - -[AS2_C] -~w~The Cartel have a front company, The Kappa Coffee House. - -[AS2_E] -~w~We have no choice but to put these drug stands out of operation. - -[AS2_F] -~w~Smash them to splinters!! - -[AS2_A1] -~w~Miguel certainly has some of that famous Latin stamina. - -[AS2_A2] -~w~I'm quite exhausted. - -[SIREN_3] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[SIREN_4] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[AS3_C] -~w~Eeeeeeyoooo! What IS that gooey yellow stuff? - -[AS3_C1] -~w~Oh hi Babe. - -[AS3_F] -~w~She's got the makings of a natural this girl. - -[AS3_F1] -~w~She's managed to extract this little gem from our guest. - -[AS3_G] -~w~There is a plane coming into Francis International in 2 hours time. - -[AS3_G1] -~w~It is full of Catalina's poison. - -[AS3_H] -~w~You can avoid airport security by getting a boat out to the runway-light buoys - -[AS3_H1] -and shooting the plane down on its approach. - -[AS3_I] -~w~Collect the cargo from the debris and stash it! - -[AS3_J] -~w~Oh you be careful now, OK baby? - -[AS3_K] -~w~Now try the chilli oil..... - -[RM2_F1] -Those Colombians'll be here any minute! - -[RM2_K] -Goddam they're here!! LOCK'N'LOAD!! - -[LOVE2_7] -~g~ Now dump the car! - -[LOVE2_8] -~g~Now get out of Newport! - -[AM1_F] -Salvatore Leone will be leaving Luigi's in about three hours time. (~1~:~1~) - -[LOVE5_C] -I want you to follow him, and make sure both he and my package get to Pike Creek unharmed. - -[FESZ_SR] -Save Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[FESZ_FO] -Would you like to format the Memory Card (PS2) in MEMORY CARD slot 1? - -[FELZ_FO] -Memory Card (PS2) in MEMORY CARD slot 1 is unformatted. - -[FES_NOC] -No Memory Card (PS2) in MEMORY CARD slot 1. - -[FES_LOE] -Load Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[FES_DEE] -Deleting Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[SLONFM] -Error formatting Memory Card (PS2) in MEMORY CARD slot 1. - -[SLONDR] -Insufficient space to save. Please insert a Memory Card (PS2) with at least 500KB of free space available into MEMORY CARD slot 1. - -[SLNSP] -Insufficient space to save. Please insert a Memory Card (PS2) with at least 200KB of free space available into MEMORY CARD slot 1. - -[FEFD_WR] -Formatting Memory Card (PS2) in MEMORY CARD slot 1. Please do not remove the Memory Card (PS2), reset or switch off the console. - -[FES_ISF] -NOT PRESENT - -[FES_SAG] -PRESENT - -[SLONNO] -No Memory Card (PS2) in MEMORY CARD slot 1. - -[SLONNF] -Memory Card (PS2) in MEMORY CARD slot 1 is unformatted. - -[FESZ_FM] -Memory Card (PS2) in MEMORY CARD slot 1 is unformatted. Would you like to format Memory Card (PS2) in MEMORY CARD slot 1? - -[FESZ_FF] -Format Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[MCDNSP] -There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO) - -[MCGNSP] -There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO) - -[FESZ_WR] -Saving data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FESZ_OW] -Overwriting data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FELD_WR] -Loading data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FEDL_WR] -Deleting data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[LM2_C] -Luigi said to, to give you this so... - -[LM3_G] -Joey ain't the kind you keep waiting, remember, this is your foot in the door... - -[LM5_E] -Get as many of them as you can before the cops drink away their green. - -[JM5_C] -Alright, there's a car stuffed with a stiff at the cafe near Callahan Point. - -[RM2_B] -We saw action in Nicaragua, back when the country knew what it was doing. - -[RM2_C] -Some Cartel scum roughed him up yesterday, said they'd be back for some of his stock today. - -[RM2_D1] -I'd go myself but the old sciatica's playing up again -cough cough- so, eerr-hhrrmmm, good luck. - -[CATINF1] -~g~Get Catalina! - -[CATINF2] -~g~Follow the chopper to find Catalina. - -[BOATIN1] -Jump into a boat and press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~to get in. - -[BOATIN2] -You can press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~if you are near a boat to get in it. - -[BOATIN3] -Jump into a boat and press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~to get in. - -[BOATIN4] -You can press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~if you are near a boat to get in it. - -[JM6] -'THE GETAWAY' - -[FM1] -'CHAPERONE' - -[JM1] -'MIKE LIPS LAST LUNCH' - -[FM21] -'BOMB DA BASE: ACT I' - -[FM3] -'BOMB DA BASE: ACT II' - -[AM1] -'SAYONARA SALVATORE' - -[AM2] -'UNDER SURVEILLANCE' - -[KM2] -'GRAND THEFT AUTO' - -[AS3] -'S.A.M.' - -[RM2] -'ARMS SHORTAGE' - -[LOVE6] -'DECOY' - -[LOVE1] -'LIBERATOR' - -[RC1] -'DIABLO DESTRUCTION' - -[RC2] -'MAFIA MASSACRE' - -[RC3] -'CASINO CALAMITY' - -[RC4] -'RUMPO RAMPAGE' - -[RM2_E1] -I can't believe those yellow-bellied bastards left me without proper cover again! - -[GREN_1] -The longer you hold the ~h~~k~~PED_FIREWEAPON~ button~w~, the further you will throw the grenade. - -[GREN_2] -The longer you hold the ~h~~k~~PED_FIREWEAPON~ button~w~, the further you will throw the grenade. - -[GREN_3] -The longer you hold the ~h~~k~~PED_FIREWEAPON~ button~w~, the further you will throw the grenade. - -[LOVE4_G] -My property will be waiting for you at the customs hanger in the aircraft's fuselage. - -[KABOOM] -KABOOOM! - -[SPLAT] -SPLAT! - -[PANCAK] -PANCAKED! - -[SOAKED] -SOAKED! - -[HEAD] -Head Radio - -[DBL_CLF] -Double Clef FM - -[FLASHB] -Flashback FM - -[RISE] -Rise FM - -[LIPS] -Lips 106 - -[CHAT] -Chatterbox FM - -[K_JAH] -K-Jah Radio - -[GAM_FM] -Game Radio FM - -[MSX_FM] -MSX FM - -[TUBE1] -When the subway opens you will be able to catch a train to Staunton Island. - -[TUBE2] -When Shoreside Vale opens you will be able to Exit Shoreside Terminal to Francis International Airport. - -[TUBE_2] -To board a subway train, press the ~h~'enter vehicle' button~w~. - -[LEGAL] -~g~Eliminate the criminal threat! - -[GA_2] -New engine and paint job. The cops won't recognize you! - -[LM1_8A] -To earn some extra cash, why not 'borrow' a taxi... - -[TAXIH1] -Stop near a highlighted pedestrian to pick them up then drive them to their destination before the time runs out. - -[LM5_7] -~g~Less than four girls working the ~p~Fuzz Ball~g~ and Luigi won't be happy! - -[KM2_3] -~g~Remember the ~r~cars~g~ have to be in mint condition to be accepted by the ~p~garage~g~. - -[KM5_2] -~g~A Yardie is off the streets. - -[BETRA_A] -Sorry, babe. - -[BETRA_B] -I'm an ambitious girl and you, - -[BETRA_C] -you're just small time. - -[JAILB_C] -* - -[JAILB_D] -* - -[JAILB_E] -* - -[JAILB_F] -* - -[JAILB_G] -* - -[JAILB_H] -* - -[JAILB_I] -* - -[JAILB_J] -* - -[JAILB_P] -* - -[JAILB_Q] -Come on! - -[JAILB_R] -Senor dickhead! - -[JAILB_S] -It's no problem to kill you. - -[JAILB_T] -You gonna be sorry. - -[JAILB_U] -A'right, a'right. Get lost. - -[HELP15] -When on foot press the ~h~~k~~PED_LOOKBEHIND~ button~w~ to ~h~look behind~w~. - -[FEC_LB3] -Look behind - -[FEC_R3] -(R3 button) - -[FES_AFO] -This Memory Card (PS2) is already formatted. - -[FEA_UP] -; - -[FEA_DO] -= - -[FEA_LE] -< - -[FEA_RI] -> - -[FEDSAS3] -- CHANGE SELECTION - -[FEDSAS4] -;=<> - CHANGE SELECTION - -[SPRAY_4] -Use the ~h~~k~~PED_FIREWEAPON~ button ~w~to fire the water cannon. - -[SPRAY_1] -Use the ~h~~k~~PED_FIREWEAPON~ button ~w~to fire the water cannon. - -[LITTLE] -LITTLE T - -[NICK] -NICK LOVE - -[AM1_10] -~g~Salvatore will be leaving Luigi's at about 0~1~:~1~ - -[JAILB_V] -* - -[JAILB_A] -* - -[JAILB_B] -* - -[JAILB_W] -* - -[JAILB_K] -* - -[JAILB_L] -* - -[JAILB_M] -* - -[JAILB_N] -* - -[JAILB_O] -* - -[JAILB_X] -* - -[FEDS_SE] -/ button - SELECT - -[FEDS_SB] -/ button - SELECT " button - BACK - -[TM4_A] -~w~Oh it's you. TONI ain't here. - -[TM4_A2] -~w~But he left one of his sugary love letters for you. - -[DIAB2_A] -I started my exotic entertainment business with nothing but the sizeable contents of my leather pants! - -[LM5_9] -GIRLS: - -[PERPIC] -Hidden Packages found - -[CO_ONE] -Hidden Package ~1~ of ~1~ - -[LOVE3_3] -~g~The plane has dropped ~1~ of 6 packages. - -[FARE11] -~g~Destination ~w~'Construction site' ~g~in Fort staunton. - -[GA_21] -You cannot store any more cars in this garage. - -[CHEAT1] -Cheat activated - -[CHEAT2] -Weapon cheat - -[CHEAT3] -Health cheat - -[CHEAT4] -Armor cheat - -[CHEAT5] -Wanted level cheat - -[CHEAT6] -Money cheat - -[CHEAT7] -Weather cheat - -[AS1_H] -~r~You failed to lead the Deathsquad into the Yakuza trap!! - -[FEDS_BA] -" button - BACK - -[RAMP_A] -ALL RAMPAGES COMPLETED! - -[USJ_ALL] -ALL UNIQUE STUNTS COMPLETED! - -[FARE23] -~g~Destination ~w~'import export garage' ~g~in Cochrane Dam district - -[L_TRN_1] -You can ride the L-train around Portland. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[L_TRN_2] -You can ride the L-train around Portland. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[S_TRN_1] -You can take the subway trains across Liberty. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[S_TRN_2] -You can take the subway trains across Liberty. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[AS1_C] -~w~She has three death squads dotted around Liberty, whose sole job is to hunt you down. - -[AS1_G] -~r~All the Yakuza are dead!! - -[JAN] -Jan - -[FEB] -Feb - -[MAR] -Mar - -[APR] -Apr - -[MAY] -May - -[JUN] -Jun - -[JUL] -Jul - -[AUG] -Aug - -[SEP] -Sept - -[OCT] -Oct - -[NOV] -Nov - -[DEC] -Dec - -[DEFDT] ---:---:---- --:--:-- - -[BUGGY] -BUGGIES LEFT: - -[BONUS] -~g~BONUS $~1~ - -[HORN1] -Press the ~h~L3 button ~w~to activate the ~h~horn. - -[HORN2] -Press the ~h~L1 button ~w~to activate the ~h~horn - -[HORN3] -Press the ~h~R1 button ~w~to activate the ~h~horn - -[LM3_1A] -Press the~h~ ~k~~VEHICLE_HORN~ button~w~ to activate the ~h~horn~w~ and let Misty know you are here. - -[LM3_1B] -Press the~h~ ~k~~VEHICLE_HORN~ button~w~ to activate the ~h~horn~w~ and let Misty know you are here. - -[LM3_1C] -Press the~h~ ~k~~VEHICLE_HORN~ button~w~ to activate the ~h~horn~w~ and let Misty know you are here. - -[RADIO_A] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[RADIO_B] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[RADIO_C] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[RADIO_D] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[FEC_EXV] -Enter and exit vehicle - -[TAXI_M] -'TAXI DRIVER' - -[COP_M] -'VIGILANTE' - -[FIRE_M] -'FIREFIGHTER' - -[AMBUL_M] -'PARAMEDIC' - -[HJ_IS] -INSANE STUNT BONUS: $~1~ - -[HJ_PIS] -PERFECT INSANE STUNT BONUS: $~1~ - -[HJ_DIS] -DOUBLE INSANE STUNT BONUS: $~1~ - -[HJ_PDIS] -PERFECT DOUBLE INSANE STUNT BONUS: $~1~ - -[HJ_TIS] -TRIPLE INSANE STUNT BONUS: $~1~ - -[HJ_PTIS] -PERFECT TRIPLE INSANE STUNT BONUS: $~1~ - -[HJ_QIS] -QUADRUPLE INSANE STUNT BONUS: $~1~ - -[HJ_PQIS] -PERFECT QUADRUPLE INSANE STUNT BONUS: $~1~ - -[AM1_K] -Salvatore Leone will be leaving Luigi's in about three hours time. (0~1~:~1~) - -[IMPEXPP] -Import/Export garage, Portland Harbor. We have orders for various vehicles. Check our notice board for our requirements. - -[VANHSTP] -Any more Securicars you want cracked? Bring them to our garage in the Portland Harbor. - -[EMVHPUP] -Great rates paid for new and used Emergency Vehicles. Bring them to the crane in the north east of Portland Harbor. - -[STANDS] -STALLS WRECKED: - -[STASH] -~g~Stash the SPANK back at the ~p~construction site! - -[MCSTNS] -There is no Memory Card (PS2) in MEMORY CARD slot 1. Do you wish to start? (YES or NO) - -[LOVE3_5] -~g~The plane is now in range. - -[LOVE3_6] -~r~The Police got to the packages first! - -[SIREN_1] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[SIREN_2] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[FM3_8C] -~w~I'll need $100,000 to cover expenses, - -[MCLOAD] -Loading Data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FES_GME] -Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again. - -[FESZ_QF] -Are you sure you wish to format the Memory Card (PS2) in MEMORY CARD slot 1? - -[FESZ_LS] -Load Successful. - -[RM3_5] -~g~You have ~1~ of 6 evidence packages. - -[LOVE3_2] -~g~You have all the packages! Take them back to Donald Love. - -[LOVE4_4] -~g~Take the package back to Donald Love! - -[FEB_SAV] -Load - -[FEP_SAV] -LOAD GAME - -[AS2_12A] -~g~After you trash the first stall, you will have 8 minutes before the Cartel warn their pushers! - -[AS3_1A] -~g~Now get to the ~b~marker buoy! - -[NOCONT] -Please reconnect an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). to controller port 1 to continue - -[BET_JB] -BETRAYED BY HIS LOVER CATALINA AND LEFT FOR DEAD. CONVICTED AND SENTENCED, HE BEGINS HIS JOURNEY TO LIBERTY CITY PENITENTIARY. BUT ONLY ONE THOUGHT BURNS IN HIS CRIMINAL MIND......REVENGE! - -[END_A] -Residents in Cedar Grove have been coming to terms - -[END_B] -with the emotional aftermath of a full blown war - -[END_C] -that hit the area yesterday. - -[END_D] -Local resident, Clive Denver described to police - -[END_E] -a single gunman that he saw fleeing the scene, with a dark haired woman. - -[END_F] -Oh, you know, we're gonna have such fun, 'cos you know, you know, - -[END_G] -I love you, I, I, I, I really do, 'cos you're such a big strong man - -[END_H] -and that's just what I need. - -[END_I] -Anyway, what was I saying? - -[END_J] -Oh, you know, I forget. But you know what it's like, don't you? - -[END_K] -The sound of explosions shook nearby homes as people ran for cover. - -[END_L] -Several citizens were injured in the panic as ground fire was exchanged - -[END_M] -between ground forces and a helicopter circling the dam. - -[END_N] -Yeah, we got a good view from down here in the gardens. - -[END_O] -When the 'copter finally got taken out, - -[END_P] -better than the fireworks on the 4th of July. - -[END_Q] -With the death toll already over twenty, - -[END_R] -police are still finding bodies. - -[END_S] -There have been no official denials concerning rumours - -[END_T] -that the dead were members of the Colombian Cartel, - -[END_U] -and still no leads as to the cause of the massacre. - -[END_V] -I broke a nail and my hair is ruined, I mean can you believe it? - -[END_W] -This one cost me fifty dollars... - -[PAPER1] -* - -[PAPER2] -* - -[PAPER3] -* - -[FEB_CPC] -Control Configuration - -[FEC_PED] -Controls On Foot - -[FEC_VEH] -Controls In Vehicle - -[FEC_FPR] -Controls For First Person - -[FEC_CMM] -Common Controls - -[FEC_PWL] -GO Left - -[FEC_PWR] -Go Right - -[FEC_PWF] -Walk Forward - -[FEC_PWT] -Walk towards camera - -[FEC_PLB] -Look Behind. - -[FEC_PFR] -Fire Weapon - -[FEC_CLE] -Cycle Weapon Left - -[FEC_CRI] -Cycle Weapon Right - -[FEC_LKT] -Lock Target - -[FEC_PJP] -Ped Jump - -[FEC_PSP] -Ped Sprint - -[FEC_PSH] -Ped Shoot - -[FEC_TLF] -Next Target To Left - -[FEC_TRG] -Next Target to Right - -[FEC_CCM] -Center Camera Behind player. - -[FEC_SZI] -Sniper Rifle Zoom In - -[FEC_SZO] -Sniper Rifle Zoom Out - -[FEC_LKL] -First Person Look Left - -[FEC_LRT] -First Person Look Right - -[FEC_LUP] -1st Person Look Up - -[FEC_LDN] -1st Person Look Down - -[FEC_LBH] -Look Behind Vehicle - -[FEC_LLF] -Look Left of Vehicle - -[FEC_LRG] -Look Right of Vehicle - -[FEC_HRN] -Horn - -[FEC_HBR] -Vehicle Handbrake - -[FEC_ACL] -Vehicle Accelerate - -[FEC_BRK] -Vehicle Brake - -[FEC_TSM] -Toggle SubMissions - -[FEC_CRD] -Change Radio Station - -[FEC_ENT] -Enter/Exit Vehicle - -[FEC_WPN] -Fire Weapon - -[FEC_PAS] -Pause - -[FEC_FPO] -1st Person Weapons - -[FEC_SMS] -Show mouse pointer - -[FEC_CMS] -Change camera mode all situations. - -[FEC_TSS] -Take Screen Shot - -[FEN_NET] -Network - -[FEN_CON] -Connection - -[FEN_GAM] -Find game - -[FEN_TYP] -Game type - -[FEN_TY0] -Deathmatch - -[FEN_TY1] -Deathmatch stealth - -[FEN_TY2] -Team Deathmatch - -[FEN_TY3] -Team Deathmatch stealth - -[FEN_TY4] -Stash the Cash - -[FEN_TY5] -Capture the Flag - -[FEN_TY6] -Rat Race - -[FEN_TY7] -Domination - -[FEN_NAM] -Name: - -[FEN_GNA] -Game name: - -[FEM_MAP] -Select map - -[FEN_PLS] -Player settings - -[FEN_PLC] -Player color - -[FEM_MA0] -Liberty City - -[FEM_MA1] -RedLight - -[FEM_MA2] -Chinatown - -[FEM_MA3] -The Tower - -[FEM_MA4] -The Sewer - -[FEM_MA5] -Industrial Park - -[FEM_MA6] -The Docks - -[FEM_MA7] -Staunton - -[FEC_EMS] -Unique Keyboard Keys only please. - -[FEC_DBG] -DEBUG MENU - -[FEC_TGD] -Toggle Pad Game/Debug - -[FEC_TDO] -Turn Debug Camera Off - -[FEC_IVH] -Invert Mouse Horizontally: - -[FEC_MSL] -LMB - -[FEC_MSM] -MMB - -[FEC_MSR] -RMB - -[FEC_QUE] -??? - -[FEC_TWO] -Only Two Keyboard Keys Allowed - -[FEC_UMS] -Unique Mouse Keys only please. - -[FEC_OMS] -Only One Mouse Keys Allowed - -[FEC_UJS] -Unique Joystick buttons only please. - -[FEC_OJS] -Only One Joystick Buttons per action allowed - -[FEC_PTL] -Use LockTarget with Weapon Switch Left. - -[FEC_PTR] -Use LockTarget with Weapon Switch Right. - -[FEC_LBC] -Use Look Left With Look Right. - -[FEC_JBO] -JOY ~1~ - -[NO_PAUZ] -Cannot pause in multiplayer. Press twice to quit! - -[FEM_SL1] -Slot 1 is free - -[FEM_SL2] -Slot 2 is free - -[FEM_SL3] -Slot 3 is free - -[FEM_SL4] -Slot 4 is free - -[FEM_SL5] -Slot 5 is free - -[FEM_SL6] -Slot 6 is free - -[FEM_SL7] -Slot 7 is free - -[FEM_SL8] -Slot 8 is free - -[FEM_MM] -MAIN MENU - -[FEQ_SRE] -Are you sure you want to quit? All progress since the last save game will be lost. Proceed? - -[FEQ_SRW] -Are you sure you want to quit the game? - -[FEG_SRV] -SERVER - -[FEG_MAP] -MAP - -[FEG_PLY] -PLAYERS - -[FEG_TYP] -TYPE - -[FEG_PNG] -PING - -[FET_FG] -FIND GAME - -[FET_SP] -SINGLE PLAYER - -[FET_MP] -MULTIPLAYER - -[FET_HG] -HOST GAME - -[FET_PS] -PLAYER SETUP - -[FET_CON] -CONNECTION - -[FET_AUD] -AUDIO SETUP - -[FET_GFX] -GFX SETUP - -[FET_DIS] -DISPLAY SETUP - -[FET_LAN] -LANGUAGE SETUP - -[FET_LG] -LOAD GAME - -[FET_DG] -DELETE GAME - -[FET_NG] -NEW GAME - -[FET_SG] -SAVE GAME - -[FET_MAP] -SELECT MAP - -[FET_GT] -GAME TYPE - -[FET_CTL] -CONTROLLER SETUP - -[FET_OPT] -OPTIONS - -[FET_QG] -QUIT GAME - -[FET_STA] -STATISTICS - -[FET_BRE] -BRIEFS - -[FEC_WAR] -Warning - -[FEC_OKK] -O.K. - -[FED_CON] -Delete File Confirmation - -[FES_SSC] -Game successfully saved. - -[DEL_FNM] -File Successfully Deleted. - -[PCLOAD] -Loading File Data - -[PCRESRT] -Restarting Grand Theft Auto III - -[FEC_DLF] -Delete Failed. - -[FEC_SVU] -Save Unsuccessful. - -[FEC_LUN] -Load Unsuccessful. File Corrupted, Please delete. - -[FEN_PLA] -Number of players: - -[FET_NON] -NO GAMES AVAILABLE - -[FET_SFG] -SEARCHING FOR GAMES... - -[FET_SRT] -SORTING GAMES... - -[FEF_LAN] -LAN - -[FEF_INT] -INTERNET - -[FET_REF] -Refresh - -[FET_FIL] -Filter - -[FET_JG] -Join - -[FEC_NTW] -Talk To Network - -[FEC_ESR] -Escape key is Restricted - -[FEC_GSL] -Show head bob: - -[FIL_FLT] -FILTER GAMES LIST - -[FET_SAN] -START NEW GAME - -[FIL_MAP] -Map: - -[FIL_SRV] -Server: - -[FIL_TYP] -Game type: - -[FIL_SPC] -Games with Space available? - -[FIL_PNG] -Ping: - -[FEN_UKH] -Unknown host - -[FEN_UKM] -Map not found - -[FEN_UKT] -Game type not found - -[FEN_NCI] -NOT CONNECTED TO THE INTERNET - -[FET_PAU] -PAUSE MENU - -[FET_SGA] -START GAME - -[FEC_SGJ] -Set Game Joystick - -[FEC_PAD] -Gamepad - -[FEC_JOY] -Joystick - -[FEC_WHL] -Steering wheel - -[FEC_CNT] -Controller type: - -[FES_CSA] -Select a skin from the list below: - -[FES_SKN] -SKIN NAME - -[FES_DAT] -DATE - -[FES_NON] -NO SKINS AVAILABLE - -[FEA_FM9] -MP3 PLAYER - -[FESZ_QZ] -Are you sure you want to save this game? - -[FES_CGA] -Current game slots available: - -[FES_SCG] -Save the current game? - -[FES_LCG] -Load the game and continue playing? - -[FEC_FIR] -Fire - -[FEC_NWE] -Next weapon - -[FEC_PWE] -Previous weapon - -[FEC_FOR] -Forward - -[FEC_BAC] -Backwards - -[FEC_LEF] -Left - -[FEC_RIG] -Right - -[FEC_ZIN] -Zoom in - -[FEC_ZOT] -Zoom out - -[FEC_EEX] -Enter /exit - -[FEC_RAD] -Radio - -[FEC_SUB] -Sub-mission - -[FEC_CMR] -Change camera - -[FEC_JMP] -Jump - -[FEC_SPN] -Sprint - -[FEC_HND] -Handbrake - -[FEC_TUL] -Turret left - -[FEC_TUR] -Turret right - -[FEC_LOL] -Look left - -[FEC_LOR] -Look right - -[FEC_NTR] -Next target - -[FEC_PTT] -Previous target - -[FEC_LBA] -Look behind - -[FEC_CEN] -Center camera - -[FEC_UND] -(NO) - -[FET_CFT] -ON FOOT - -[FET_CCR] -IN CAR - -[CVT_MSG] -Converting textures to optimal format for your video card - -[FET_CAC] -ACTION - -[FEC_IBT] -- - -[FEC_SPC] -SPC - -[FEC_MXO] -MXB1 - -[FEC_MXT] -MXB2 - -[FEC_UNB] -UNBOUND - -[FET_CME] -CONTROL METHOD - -[FET_RDK] -REDEFINE CONTROLS - -[FET_AMS] -MOUSE SETTINGS - -[FET_STI] -STANDARD CONTROL CONFIGURATION - -[FET_CTI] -CLASSIC CONTROL CONFIGURATION - -[FET_MTI] -MOUSE CONTROL CONFIGURATION - -[FET_DAM] -DYNAMIC ACOUSTIC MODELING - -[FEC_TFL] -Turret Left - -[FEC_TFR] -Turret Right - -[FEC_MWF] -WHEEL UP - -[FEC_MWB] -WHEEL DN - -[FEC_ORR] -or - -[FEC_NUS] -NOT USED - -[FEC_LUD] -Look Up - -[FEC_LDU] -Look Down - -[FEC_CMP] -COMBO: LOOK L+R - -[FEC_NTT] -No Text Yet For This Key - -[FEC_FNC] -F~1~ - -[FEC_IRT] -INS - -[FEC_DLL] -DEL - -[FEC_HME] -HOME - -[FEC_END] -END - -[FEC_PGU] -PGUP - -[FEC_PGD] -PGDN - -[FEC_UPA] -UP - -[FEC_DWA] -DOWN - -[FEC_LFA] -LEFT - -[FEC_RFA] -RIGHT - -[FEC_NUM] -NUM - -[FEC_NMN] -NUM~1~ - -[FEC_FWS] -NUM / - -[FEC_PLS] -NUM + - -[FEC_MIN] -NUM - - -[FEC_DOT] -NUM . - -[FEC_NLK] -NUMLOCK - -[FEC_ETR] -ENT - -[FEC_SLK] -SCROLL LOCK - -[FEC_PSB] -BREAK - -[FEC_BSP] -BSPACE - -[FEC_TAB] -TAB - -[FEC_CLK] -CAPSLOCK - -[FEC_RTN] -RET - -[FEC_LSF] -LSHIFT - -[FEC_RSF] -RSHIFT - -[FEC_LCT] -LCTRL - -[FEC_RCT] -RCTRL - -[FEC_LAL] -LALT - -[FEC_RAL] -RALT - -[FEC_LWD] -LWIN - -[FEC_RWD] -RWIN - -[FEC_WRC] -WINCLICK - -[WIN_TTL] -Grand Theft Auto III - -[WIN_95] -Grand Theft Auto III cannot run on Windows 95 - -[WIN_DX] -Grand Theft Auto III requires at least DirectX version 8.1 - -[WIN_VDM] -Grand Theft Auto III requires at least 12MB of available video memory - -[DIAB3_G] -Arriba! - -[FEM_RES] -RESUME GAME - -[FES_SNG] -START NEW GAME - -[FEM_SP] -SINGLE PLAYER - -[FEM_MP] -MULTIPLAYER - -[FEM_QT] -QUIT GAME - -[FES_SG] -START NEW GAME - -[FES_LG] -LOAD GAME - -[FEM_HST] -HOST GAME - -[FEM_OPT] -OPTIONS - -[FEM_DBG] -DEBUG - -[FET_PSU] -PLAYER SETUP - -[FET_DEF] -RESTORE DEFAULTS - -[FED_BRI] -BRIGHTNESS - -[FED_TRA] -TRAILS - -[FEM_LOD] -DRAW DISTANCE - -[FEM_VSC] -FRAME SYNC - -[FEM_FRM] -FRAME LIMITER - -[FED_RES] -SCREEN RESOLUTION - -[FED_WIS] -WIDE SCREEN - -[FEDS_TB] -BACK - -[FEA_MUS] -MUSIC VOLUME - -[FEA_SFX] -SFX VOLUME - -[FEA_RSS] -RADIO STATION - -[FEL_ENG] -ENGLISH - -[FEL_FRE] -FRENCH - -[FEL_GER] -GERMAN - -[FEL_ITA] -ITALIAN - -[FEL_SPA] -SPANISH - -[FEA_3DH] -AUDIO HARDWARE - -[FEA_SPK] -SPEAKERS CONFIGURATION - -[FEA_2SP] -2 SPEAKERS - -[FEA_4SP] -MORE THAN 2 SPEAKERS - -[FEA_EAR] -HEADPHONES - -[FEA_NAH] -NO AUDIO HARDWARE - -[FET_SNG] -START NEW GAME - -[FEN_STA] -START GAME - -[GMLOAD] -LOAD GAME - -[GMSAVE] -SAVE GAME - -[FES_DGA] -DELETE GAME - -[FEM_NON] -NONE - -[FEC_IVV] -INVERT MOUSE VERTICALLY - -[FEC_MSH] -MOUSE SENSITIVITY - -[FET_CCN] -CONTROLS: CLASSIC - -[FET_SCN] -CONTROLS: STANDARD - -[FES_SET] -USE SKIN - -[GHOST] -Ghost - -[WIN_RSZ] -Failed to select new screen resolution - -[FEC_TFU] -Turret /Dodo up - -[FEC_TFD] -Turret /Dodo down - -[FET_APL] -APPLY - -[FET_APP] -LMB,RETURN TO APPLY THE NEW SETTING - -[FET_HRD] -DEFAULT SETTINGS RESTORED - -[FET_MST] -MOUSE CONTROLLED STEERING - -[FEC_STR] -NUM STAR - -[FET_MIG] -LEFT,RIGHT,MOUSEWHEEL TO ADJUST - -[FET_CIG] -BACKSPACE TO CLEAR - LMB,RETURN TO CHANGE - -[FET_RIG] -SELECT A NEW CONTROL FOR THIS ACTION OR ESC TO CANCEL - -[FET_EIG] -CANNOT SET A CONTROL FOR THIS ACTION - -[NO_PCCD] -Please insert Grand Theft Auto III - disc 2 into the drive or press ESC to cancel - -[CVT_ERR] -You have run out of disk space. Please make some space on your harddisk before continuing. Press ESC to cancel. - -[FED_SUB] -SUBTITLES - -[FET_DSN] -Default Player Skin.bmp - -[JM3] -'VAN HEIST' - -[ATUTOR2] -~g~Drive the patients to Hospital CAREFULLY. Each bump reduces their chances of survival. - -[EBAL] -'GIVE ME LIBERTY' - -[LM4] -'PUMP-ACTION PIMP' - -[REPLAY] -REPLAY - -[FEC_SFT] -SHIFT - -[CRED254] -STUDIO MANAGER - -[CVT_CRT] -Cannot convert textures for your video card. You must login to an Administrator account to do this. Press ESC to quit. - -[FEM_ON] -ON - -[FEM_OFF] -OFF - -[FEM_YES] -YES - -[FEM_NO] -NO - -[FES_WAR] -Saving, please wait... - -[FED_DLW] -Deleting, please wait... - -[FED_LDW] -Loading, please wait... - -[FEC_SLC] -Slot is corrupted - -[FED_LFL] -Loading save game has failed. The game will restart now. - -[FET_RSO] -ORIGINAL SETTING RESTORED - -[FET_RSC] -HARDWARE NOT AVAILABLE - ORIGINAL SETTING RESTORED - -{ re3 updates } -{ new languages } -[FEL_JAP] -JAPANESE - -[FEL_POL] -POLISH - -[FEL_RUS] -RUSSIAN - -{ new display menus } -[FED_MIP] -MIP MAPPING - -[FED_AAS] -ANTI ALIASING - -[FED_FIL] -TEXTURE FILTERING - -[FED_BIL] -BILINEAR - -[FED_TRL] -TRILINEAR - -{ end of file } - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file diff --git a/utils/gxt/english.txt b/utils/gxt/english.txt deleted file mode 100644 index 32a6f18f..00000000 --- a/utils/gxt/english.txt +++ /dev/null @@ -1,7026 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- - -[IN_VEH] -~g~Hey! Get back in the vehicle! - -[IN_VEH2] -~g~You need some wheels for this job! - -[IN_BOAT] -~g~You need a boat for this job! - -[HEY] -~g~Don't go solo, keep your posse together! - -[HEY2] -~g~Don't split up, keep the group together! - -[HEY3] -~g~You've dropped your main man, go back and get 8-Ball! - -[HEY4] -~g~Lose Misty and Luigi will lose your face! Go and get her! - -[HEY5] -~g~One of the girls is AWOL, Go back and round her up! - -[HEY6] -~g~You left your honor with the Yakuza Kanbu. You must protect him! - -[HEY7] -~g~An extra gun could be useful. Go back and pick up your contact! - -[HEY8] -~g~Protection means just that -Protect the Old Oriental Gentleman! - -[HEY9] -~g~You want the word on the street? Go see the contact! - -[HELP2_A] -Press the ~h~/ button~w~ when running to ~h~sprint. - -[HELP3] -You can only sprint for short periods before becoming tired. - -[HELP4_A] -Press the~h~ ~k~~VEHICLE_ACCELERATE~ button~w~ to ~h~accelerate. - -[HELP4_D] -Push the~h~ right analog stick~w~ up to ~h~accelerate. - -[HELP5_A] -Press the~h~ ~k~~VEHICLE_BRAKE~ button~w~ to ~h~brake~w~, or to ~h~reverse~w~ if the vehicle has stopped. - -[HELP5_D] -Pull the ~h~right analog stick~w~ back to ~h~brake~w~, or to ~h~reverse~w~ if the vehicle has stopped. - -[HELP6_A] -Press the~h~ ~k~~VEHICLE_HANDBRAKE~ button ~w~to apply the vehicle's ~h~handbrake. - -[HELP6_C] -Press the~h~ ~k~~VEHICLE_HANDBRAKE~ button ~w~to apply the vehicle's ~h~handbrake. - -[HELP6_D] -Press the~h~ ~k~~VEHICLE_HANDBRAKE~ button ~w~to apply the vehicle's ~h~handbrake. - -[HELP7_A] -Press and hold the~h~ ~k~~PED_LOCK_TARGET~ button ~w~to ~h~target~w~ with the sniper rifle. - -[HELP7_D] -Press and hold the~h~ ~k~~PED_LOCK_TARGET~ button ~w~to ~h~target ~w~with the sniper rifle. - -[HELP8_A] -Press the~h~ ~k~~PED_SNIPER_ZOOM_IN~ button ~w~to ~h~zoom in ~w~with the rifle and the~h~ ~k~~PED_SNIPER_ZOOM_OUT~ button ~w~to ~h~zoom out ~w~again. - -[HELP9_A] -Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. - -[HELP10] -This badge indicates you have a police wanted level. - -[HELP11] -The more badges the higher your wanted level. - -[HELP13] -Sometimes you may need to use pathways not shown on the radar. - -[TIMER] -This is a timed mission, you must complete it before the timer counts down to zero. - -[MISTY1] -~r~Misty is morgue-meat! - -[OUT_VEH] -~g~Get out of the vehicle! - -[GARAGE] -Drive the vehicle into the garage, then walk outside. - -[WANTED1] -~g~Shake the cops and lose your wanted level! - -[NODOORS] -~g~They ain't sardines! Get some wheels with enough seats. - -[TRASH] -~g~You've junked your wheels real bad! Get your vehicle repaired! - -[WRECKED] -~r~The vehicle is wrecked! - -[HORN] -~g~Sound the horn. - -[NOMONEY] -~g~You need more cash! - -[OUTTIME] -~r~Too slow, man, too slow! - -[SPOTTED] -~r~They're on to you! - -[REWARD] -REWARD $~1~ - -[GAMEOVR] -GAME OVER - -[Z] -Z-axis value: ~1~ - -[M_FAIL] -MISSION FAILED! - -[M_PASS] -MISSION PASSED! $~1~ - -[O_PASS] -ODD JOB PASSED! - -[O_FAIL] -ODD JOB FAILED! - -[DEAD] -WASTED! - -[BUSTED] -BUSTED! - -[S_PROMP] -When not on a mission you can ~h~save your game here~w~, this will advance time six hours. - -[NUMBER] -~1~ - -[SCORE] -$~1~ - -[LOADCAR] -LOADING VEHICLE... (PRESS L1 TO CANCEL) - -[CARSOFF] -Cars turned off. - -[CARS_ON] -Cars turned on. - -[TEXTXYZ] -Writing coordinates to file... - -[CHEATON] -Cheat mode ON - -[CHEATOF] -Cheat mode OFF - -[UZI_IN] -The Uzi is now in stock at Ammunation! - -[IMPORT1] -Go outside and wait for your vehicle. - -[PAGEB1] -Pistol delivered to hideout - -[PAGEB2] -Uzi delivered to hideout - -[PAGEB3] -Body armor delivered to hideout - -[PAGEB4] -Shotgun delivered to hideout - -[PAGEB5] -grenades delivered to hideout - -[PAGEB6] -molotovs delivered to hideout - -[PAGEB7] -AK47 delivered to hideout - -[PAGEB8] -Sniper rifle delivered to hideout - -[PAGEB9] -M16 delivered to hideout - -[PAGEB10] -Rocket Launcher delivered to hideout - -[PAGEB11] -Flamethrower delivered to hideout - -[WANT_A] -You will only be arrested if you have a ~h~wanted level. - -[WANT_B] -Your ~h~wanted level~w~ is represented by the row of stars in the top right of the screen. - -[WANT_C] -You now have a ~h~wanted level~w~ of one... - -[WANT_D] -two... - -[WANT_E] -three... - -[WANT_F] -As your ~h~wanted level~w~ increases you will attract more powerful forms of law enforcement. - -[WANT_G] -When you are ~h~'busted'~w~ you are returned to the nearest police station. - -[WANT_H] -The cops will take all your weapons and some of your cash as a bribe. - -[WANT_I] -Any mission you were on will be failed. - -[WANT_J] -You will find ways of reducing your wanted level the more you play. - -[WANT_K] -If you are in a car, ~h~SPRAY SHOPS~w~ will ~h~clear your wanted level. - -[HEAL_B] -When you are ~h~'wasted'~w~ you are returned to the nearest hospital. - -[HEAL_C] -You will lose your weapons and the doctors will take some cash for patching you up. - -[HEAL_E] -You will find ways of healing or protecting yourself the more you play the game. - -[DAM] -DAMAGE: - -[KILLS] -KILLS: - -[FARES] -FARES: - -[BULL] -BULLION: - -[EVID] -EVIDENCE: - -[HEALTH] -CAR HEALTH: - -[COLLECT] -COLLECTED: - -[BOMB] -Drive your vehicle into the bomb shop to attach a ~h~bomb~w~. Cost - ~h~$1000. - -[SAVE1] -Walk through the doorway to ~h~Save the game~w~. You cannot save during a mission. - -[SAVE2] -Any vehicle left in this garage will be stored when the game is saved. - -[AMMU] -Go inside Ammu-Nation to buy a weapon. - -[BRIDGE1] -When the Callahan Bridge is repaired you will be able to drive to Staunton Island. - -[TUNNEL] -When the Porter Tunnel is opened you will be able to drive to Staunton Island. - -[LUIGI] -LUIGI MISSIONS - -[TONI] -TONI MISSIONS - -[JOEY] -JOEY MISSIONS - -[FRANK] -SALVATORE MISSIONS - -[DIABLO] -DIABLO MISSIONS - -[ASUKA] -ASUKA MISSIONS - -[B_SITE] -ASUKA SUBURBAN MISSIONS - -[KENJI] -KENJI MISSIONS - -[RAY] -RAY MISSIONS - -[LOVE] -LOVE MISSIONS - -[YARDIE] -YARDIE MISSIONS - -[HOOD] -HOOD MISSIONS - -[CITYZON] -Liberty City - -[IND_ZON] -Portland - -[PORT_W] -Callahan Point - -[PORT_S] -Atlantic Quays - -[PORT_E] -Portland Harbor - -[PORT_I] -Trenton - -[S_VIEW] -Portland View - -[CHINA] -Chinatown - -[EASTBAY] -Portland Beach - -[LITTLEI] -Saint Mark's - -[REDLIGH] -Red Light District - -[TOWERS] -Hepburn Heights - -[HARWOOD] -Harwood - -[ROADBR1] -Callahan Bridge - -[ROADBR2] -Callahan Bridge - -[TUNNELP] -Porter Tunnel - -[BOMB1] -8-Ball's Garage - -[COM_ZON] -Staunton Island - -[STADIUM] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Liberty Campus - -[CONSTRU] -Fort Staunton - -[PARK] -Belleville Park - -[COM_EAS] -Newport - -[SHOPING] -Bedford Point - -[YAKUSA] -Torrington - -[SUB_ZON] -Shoreside Vale - -[AIRPORT] -Francis Intl. Airport - -[PROJECT] -Wichita Gardens - -[SUB_IND] -Pike Creek - -[SWANKS] -Cedar Grove - -[BIG_DAM] -Cochrane Dam - -[SUB_ZO2] -Shoreside Vale - -[SUB_ZO3] -Shoreside Vale - -[CAR_1] -Ambulance - -[CAR_2] -Firetruck - -[CAR_3] -Police - -[CAR_4] -Enforcer - -[CAR_5] -Barracks - -[CAR_6] -Rhino - -[CAR_7] -FBIcar - -[CAR_8] -Securicar - -[CAR_9] -Moonbeam - -[CAR_10] -Coach - -[CAR_11] -Flatbed - -[CAR_12] -Linerunner - -[CAR_13] -Trashmaster - -[CAR_14] -Patriot - -[CAR_15] -Mr Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinel - -[CAR_25] -Cheetah - -[CAR_26] -Banshee - -[CAR_27] -Stinger - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_30] -Kuruma - -[CAR_31] -Stretch - -[CAR_32] -Perennial - -[CAR_33] -Landstalker - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Stallion - -[CAR_37] -Taxi - -[CAR_38] -Cabbie - -[CAR_39] -Buggy - -[LUIGIS] -Luigi's Place - -[GOAWAY] -~g~You are already on a mission! - -[LUIGGO] -~g~Luigi's interviewing some new girls -Come back later! - -[JOEYGO] -~g~Joey's out on the town with Misty -Drop by later! - -[TONIGO] -~g~Toni's taken his Momma to the opera -Call in some other time! - -[KEMUGO] -~g~Maria and Kemuri are all tied up at the moment -Drop by later! - -[KENJGO] -~g~Kenji is attending a Yakuza meeting -Call by some other time! - -[RAYGO] -~g~Ray has other toilets to hang around -Try again later! - -[LOVEGO] -~g~Donald Love has other business to attend to -Make an appointment later! - -[KENSGO] -~g~Kenji is busy! -Call by later! - -[HOODGO] -~g~The Hoods are not available at this time! - -[WRONGT1] -~g~Come back between 05:00 and 21:00 for a job - -[WRONGT2] -~g~Come back between 06:00 and 14:00 for a job - -[WRONGT3] -~g~Come back between 15:00 and 00:00 for a job - -[GUN_1A] -Use the ~h~~k~~PED_CYCLE_WEAPON_RIGHT~ button ~w~and the ~h~~k~~PED_CYCLE_WEAPON_LEFT~ button ~w~to cycle through your weapons. - -[GUN_2A] -Hold the ~h~~k~~PED_LOCK_TARGET~ button ~w~to ~h~auto-target~w~, press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire! Try shooting the targets... - -[GUN_2C] -Hold the ~h~~k~~PED_LOCK_TARGET~ button ~w~to ~h~auto-target~w~, press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire! Try shooting the targets... - -[GUN_2D] -Hold the ~h~~k~~PED_LOCK_TARGET~ button ~w~to ~h~auto-target~w~, press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire! Try shooting the targets... - -[GUN_3A] -While holding the ~h~~k~~PED_LOCK_TARGET~ button,~w~ press the ~h~~k~~PED_CYCLE_TARGET_LEFT~ button~w~ or the ~h~~k~~PED_CYCLE_TARGET_RIGHT~ button to switch target. - -[GUN_3B] -While holding the ~h~~k~~PED_LOCK_TARGET~ button,~w~ press the ~h~~k~~PED_CYCLE_TARGET_LEFT~ button~w~ or the ~h~~k~~PED_CYCLE_TARGET_RIGHT~ button to switch target. - -[GUN_4A] -While holding the ~h~~k~~PED_LOCK_TARGET~ button~w~ you can walk or run while remaining locked onto a target. - -[GUN_4B] -While holding the ~h~~k~~PED_LOCK_TARGET~ button~w~ you can walk or run while remaining locked onto a target. - -[GUN_5] -You can practice targeting and shooting on these paper targets. When you are finished resume the mission. - -[TAXI1] -~g~Look for a fare. - -[FARE1] -~g~Destination ~w~'Meeouch Sex Kitten Club' ~g~in Redlight. - -[FARE2] -~g~Destination ~w~'Supa Save' ~g~in Portland View. - -[FARE3] -~g~Destination ~w~'old school hall' ~g~in Chinatown. - -[FARE4] -~g~Destination ~w~'Greasy Joe's Cafe' ~g~in Callahan Point. - -[FARE5] -~g~Destination ~w~'AmmuNation' ~g~in Redlight. - -[FARE6] -~g~Destination ~w~'Easy Credit Autos' ~g~in Saint Mark's. - -[FARE7] -~g~Destination ~w~'Woody's topless bar' ~g~in Redlight. - -[FARE8] -~g~Destination ~w~'Marcos Bistro' ~g~in Saint Mark's. - -[FARE9] -~g~Destination ~w~'import export garage' ~g~in Portland Harbor. - -[FARE10] -~g~Destination ~w~'Punk Noodles' ~g~in Chinatown. - -[FARE12] -~g~Destination ~w~'Football Stadium' ~g~in Aspatria. - -[FARE13] -~g~Destination ~w~'The Church' ~g~in Bedford Point - -[FARE14] -~g~Destination ~w~'The Casino' ~g~in Torrington - -[FARE15] -~g~Destination ~w~'Liberty University' ~g~in Liberty Campus - -[FARE16] -~g~Destination ~w~'Shopping Mall' ~g~in Belleville Park Area - -[FARE17] -~g~Destination ~w~'Museum' ~g~in Newport - -[FARE18] -~g~Destination ~w~'AmCo Building' ~g~in Torrington - -[FARE19] -~g~Destination ~w~'Bolt Burgers' ~g~in Bedford Point - -[FARE20] -~g~Destination ~w~'The Park' ~g~in Belleville - -[FARE21] -~g~Destination ~w~'Francis intl. Airport' - -[FARE22] -~g~Destination ~w~'Cochrane Dam' - -[FARE24] -~g~Destination ~w~'The hospital' ~g~in Pike Creek - -[FARE25] -~g~Destination ~w~'The Park' ~g~in Shoreside Vale - -[FARE26] -~g~Destination ~w~'North West Towers' ~g~in Wichita Gardens - -[NEW_TAX] -BIGGER! FASTER! HARDER! new Borgnine taxis open for business in Harwood. Call 555-BORGNINE today! - -[TSCORE2] -$~1~ - -[IN_ROW] -~1~ IN A ROW bonus! $~1~ - -[TTUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle taxi missions on or off. - -[TTUTOR2] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle taxi missions on or off. - -[ATUTOR2] -~g~Drive the patients to Hospital CAREFULLY. Each bump reduces their chances of survival. - -[A_TIME] -+~1~ seconds - -[A_FULL] -~r~Ambulance full!! - -[A_RANGE] -~g~The ambulance radio is out of range, get closer to a hospital! - -[FTUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle fire truck missions on or off. - -[FTUTOR2] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle fire truck missions on or off. - -[F_PASS1] -Fire extinguished! - -[F_RANGE] -~g~The fire truck radio is out of range, get closer to a fire station! - -[C_BREIF] -~g~Suspect last seen in the ~a~ area. - -[C_RANGE] -~g~The police radio is out of range, get closer to a police station! - -[DODO_FT] -You flew for ~1~ seconds! - -[EBAL] -'GIVE ME LIBERTY' - -[EBAL_A] -I know a place on the edge of the Red Light District where we can lay low, - -[EBAL_A1] -but my hands are all messed up so you better drive, brother. - -[EBAL_1] -Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a vehicle. - -[EBAL_1B] -Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a vehicle. - -[EBAL_2] -~g~Get back into the car! - -[EBAL_3] -This is the ~h~radar~w~. Use it to navigate the city, follow the ~h~blip~w~ on the ~h~radar~w~ to find the hideout! - -[EBAL_D] -I know a guy, he's connected, his name's Luigi. - -[EBAL_D1] -Me an' him go back so I could probably get you some work. C'mon lets head over there. - -[EBAL_E] -C'mon, lets drop by and I'll introduce you. - -[EBAL_I] -The boss will be out to see you shortly... - -[EBAL_J] -8-Ball's got some business up stairs. - -[EBAL_K] -Maybe you can do me a favor. - -[EBAL_L] -One of my girls needs a ride so grab a car and pick up Misty from the clinic. Then bring her back here. - -[EBAL_N] -So keep your hands on the wheel! - -[EBAL_4] -~r~8-Ball's dead! - -[EBAL_5] -~g~Get a vehicle! - -[EBAL_6] -~g~Pick up Misty! - -[LM1] -'LUIGI'S GIRLS' - -[LM2] -'DON'T SPANK MA BITCH UP' - -[LM3] -'DRIVE MISTY FOR ME' - -[LM4] -'PUMP-ACTION PIMP' - -[LM5] -'THE FUZZ BALL' - -[LM1_2] -~g~Take Misty to Luigi's Club. - -[LM1_3] -~g~Press the horn to get the girl into the car. - -[LM1_6] -~g~Get back into the car! - -[LM1_7] -Stop the vehicle next to Misty and allow her to enter it. - -[LM1_8] -You can go and see Luigi for more work or check out Liberty City. - -[LM2_A] -There's a new high on the street goes by the name of SPANK. - -[LM2_E] -Some wiseguy's been introducing this trash to my girls down Portland Harbor. - -[LM2_B] -Go and introduce a bat to his face! - -[LM2_G] -I want compensation for this insult! - -[LM2_1] -~g~Take his car and get it resprayed. - -[LM2_2A] -Use the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~punch ~w~and ~h~kick~w~ or ~h~swing ~w~the bat! - -[LM2_2C] -Use the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~punch ~w~and ~h~kick~w~ or ~h~swing ~w~the bat~w~! - -[LM2_2D] -Use the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~punch ~w~and ~h~kick~w~ or ~h~swing ~w~the bat~w~! - -[LM2_3] -~g~Stash the car in Luigi's lockup! - -[LM2_4] -~g~Respray the car! - -[LM3_A] -Hey I've gotta talk to you... All right Mick I'll talk to yah later. - -[LM3_B] -How yah doing kid? - -[LM3_C] -The Don's son, Joey Leone, he wants some action from his regular girl Misty. - -[LM3_D] -Go pick her up at Hepburn Heights... - -[LM3_E] -but watch yourself that's Diablo turf. - -[LM3_F] -Then run her over to his garage in Trenton and make it quick, - -[LM3_H] -so keep your eyes on the road and off Misty! - -[LM3_2] -~g~Take Misty to Joey's. - -[LM3_4] -~g~Go pick up Misty! - -[LM3_5] -You working regular for Luigi now huh? It's about time he got a driver we can trust! - -[LM3_7] -I'll be with you in a minute spark plug. - -[LM3_10] -~g~Get a vehicle! - -[LM4_B] -Go and take care of things for me. - -[LM4_C] -If you need a piece go around the back of AmmuNation opposite the subway. - -[LM5_A] -The Policeman's Ball is being held at the old school hall near the Callahan Bridge - -[LM5_B] -and they'll be looking for some 'old school' action. - -[LM5_C] -Now I got girls all over town walking the streets. - -[LM5_D] -Get'em to the ball they'll make a bundle. - -[LM5_1] -~g~You pack these ladies too tight, they gonna bruise! ~g~Drop these girls off first, then come back for more. - -[LM5_2] -~r~One of Luigi's girls is bodybag meat! - -[LM5_3] -~g~You need a car! - -[LM5_4] -~g~Pick up the girls working St. Marks. - -[LM5_5] -~g~Take the girls to the Fuzz Ball! - -[LM5_8] -~g~Girls working the Ball: ~1~ - -[JM2] -'FAREWELL 'CHUNKY' LEE CHONG' - -[JM3] -'VAN HEIST' - -[JM4] -'CIPRIANI'S CHAUFFEUR' - -[JM5] -'DEAD SKUNK IN THE TRUNK' - -[JM1_1] -~g~Take Forelli's car to 8-Ball's garage North of here, behind 'Easy Credit Autos'. - -[JM1_2] -~g~Park the car back at Marco's Bistro. - -[JM1_3] -~g~Activate the car bomb then get out of there! - -[JM1_4] -~g~You're trashing the vehicle! Get it repaired! - -[JM1_5] -~g~The car bomb's not set! - -[JM1_6] -~g~Put the car back in the correct position. - -[JM1_8A] -~y~Hey, it's my main man! - -[JM1_8B] -~y~The bomb shop's automated. Just drive in, stop your car and the shop will do the rest. - -[JM1_8C] -~y~Here, your first can be free, but after that it'll cost. - -[JM2_A] -Chunky Lee Chong is pushing spank for some new gang from Colombia... or Colorado... or something.... - -[JM2_B] -I'm not really sure. Who needs details anyway. - -[JM2_D] -That rat has sold his last stir fry. - -[JM2_E] -I want you to take him out! - -[JM2_G] -Sort yourself with a nine, you know where it is, right? - -[JM2_H] -Well remember, just watch your back in China Town, it's Triad territory. - -[JM3_A] -Alright, we're gonna hit the pay role van. - -[JM3_B] -It leaves the edge of China Town everyday. - -[JM3_C] -Bullets won't even dent the van's armor, so get a car and ram it off the road. - -[JM3_D] -Now hit it hard and the punk ass security guards should bail. - -[JM3_E] -Then take it to the warehouse at the docks and my guys are gonna take over from there. - -[JM3_F] -Now it won't be doin' it's rounds all day, so don't hang around. - -[JM3_1] -~g~Take the van to the lock up. - -[JM3_2] -~g~Ram the van until its damage is below 70 percent. - -[JM4_B] -Oh! Here's the guy I was telling you about! - -[JM4_C] -Alright Listen. This guy ain't Italian and he's no mechanic but he can get things fixed. - -[JM4_D] -This is Pops Capo, Toni Cipriani. - -[JM4_E] -Yeah, I'm Toni Cipriani - -[JM4_F] -Take him to Momma's restaurant at St Marks, alright. - -[JM4_G] -Now listen to me, I'm planning a job that needs a good driver so drop by sometime later Ok? - -[JM4_2] -Wait here! Keep the engine running. This ain't a social call. - -[JM4_3] -It's a Triad ambush! Get us out of here kid! - -[JM4_4] -The Triads think they can mess with me, the triads, with ME! - -[JM4_6] -Hey watch the car! I said no fancy crap. - -[JM4_7] -~g~Take Toni to his momma's restaurant. - -[JM4_8] -~r~Toni's been wasted! - -[JM5_A] -Beautiful! Just beautiful. - -[JM5_B] -Alright, Just the guy I need to talk to! - -[JM5_D] -One of the Forellis thought he was a wise guy, so he got what he had coming to him. - -[JM5_E] -Take the corpse to the crusher in Harwood, alright? - -[JM5_1] -~g~Take it to the crusher! - -[JM5_2] -~g~It's the Forelli brothers! - -[JM6_A] -What a ride she's gonna be, huh? - -[JM6_B] -Alright, listen. Get some wheels to the safehouse at St. Marks and pick up a few friends of mine. - -[JM6_C] -They're hittin' a bank and they need a driver. - -[JM6_D] -I gave my word that you were the man, so don't screw this up. - -[JM6_E] -Get them to the bank before five o'clock, not a minute after. - -[JM6_2] -Keep the engine running we'll be in and out in no time. - -[JM6_3] -Get us out of here!! - -[JM6_4] -Shake the cops and get us to the safehouse!! - -[JM6_6] -~g~Go and get a vehicle less conspicuous! - -[JM6_7] -~g~You need all 3 to rob the bank! - -[TM1] -'TAKING OUT THE LAUNDRY' - -[TM2] -'THE PICK-UP' - -[TM3] -'SALVATORE'S CALLED A MEETING' - -[TM4] -'TRIADS AND TRIBULATIONS' - -[TM5] -'BLOW FISH' - -[TONI_P] -I've got some urgent work for you! -Toni - -[TM1_A] -~w~Take a seat kid, take a god damned seat. - -[TM1_B] -~w~So the laundry won't pay any protection eh? - -[TM1_C] -~w~The Triads think they can mess with me? - -[TM1_D] -~w~Let's teach these would be tough guys what it means to be a tough guy. - -[TM1_E] -~w~Yeah, teach 'em some respect. No son of mine gets it from some Triads. - -[TM1_F] -~w~Your father, god rest his soul, took no crap from no Triads back in Sicily. - -[TM1_G] -~w~Sorry Ma. Yes Ma. - -[TM1_H] -~w~I want you to destroy their laundry vans - -[TM1_I] -~w~and mangle any triad gimp that gets in your way. - -[TM1_J] -~w~8-Ball can supply you with what you're gonna need. - -[TM2_A] -~w~TONI's off making people bleed or trying to. - -[TM2_AA] -~w~He'll never be as tough as his Pop, but he left you a note on the table. - -[TM2_B] -~w~The laundry has agreed to pay - you did real good kid! - -[TM2_C] -~w~Go collect the cash and bring it back here. Watch out for the Triads. - -[TM2_D] -~w~They may be shoving a firecracker up your ass, but don't take no crap. - -[TM2_E] -~w~Nobody I mean nobody, messes with TONI CIPRIANI! - -[TM2_1] -~g~Get the cash back to Toni's!! - -[TM2_2] -~g~You iced them all! - -[TM3_MA] -~w~I don't know where he is! - -[TM3_MB] -~w~I swear that boy of mine don't know himself sometimes. - -[TM3_MC] -~w~Now his father, he was different. Always on top, in charge, manful... - -[TM3_A] -~w~Don Salvatore has called a meeting. - -[TM3_B] -~w~I need you to collect the limo and his boy, Joey, from the garage. - -[TM3_C] -~w~Then get Luigi from his club, come back here and pick me up, - -[TM3_D] -~w~then we'll all drive over to the boss's place together. - -[TM3_E] -~w~Those Triads, they don't know when to stop. - -[TM3_F] -~w~They want a war. They got a war. - -[TM3_G] -~w~Now get going. - -[TM3_1] -~g~Pick up the Stretch from Joey's. - -[TM3_2] -~g~Now go pick up Luigi. - -[TM3_3] -~g~Now go pick up Toni. - -[TM3_4] -~g~Drive the goodfellas to Salvatore's place. - -[TM3_5] -~y~It's a triad ambush!! - -[TM4_B] -~w~We're at WAR! The Triads have a fish factory as a front. - -[TM4_C] -~w~Most of their business goes down at the fish market in Chinatown. - -[TM4_D] -~w~That laundry still owes us protection. - -[TM4_E] -~w~They reckon the Triads are protecting them now, so I say we exact a fitting punishment. - -[TM4_F] -~w~Take these boys over and whack the Triad Warlords! - -[TM4_G] -~w~Hell, if you get a chance, pop some of their soldiers too. - -[TM4_GAT] -~g~You need a 'Triad fish van' to enter. - -[TM5_B] -~w~OK, I've had enough of this shit. - -[TM5_C] -~w~We're gonna finish the Triads in Liberty once and for all! - -[TM5_D] -8-Ball's rigged a dustcart with a bomb. - -[TM5_E] -~w~It's on a timer so if you mess up there'll be no evidence. Go and pick up the dustcart. - -[TM5_F] -~w~Careful, 8-Ball says it's real sensitive and the slightest bump could set that thing off! - -[TM5_G] -~w~Their fish factory will open its gates for a dustcart, so you can drive right in. - -[TM5_H] -~w~Park up between the gas canisters and get the hell out of there! - -[TM5_I] -~w~I want it to rain mackerel. - -[TM5_J] -~w~We're talking real biblical here, nothing low budget. - -[FM2] -'CUTTING THE GRASS' - -[FM4] -'LAST REQUESTS' - -[FM1_A] -~w~Me an' the fellas need to talk business - -[FM1_B] -~w~so you're gonna look after my girl for the evening. - -[FM1_C] -~w~HEY MARIA! MOVE YOUR BUTT! - -[FM1_D] -~w~Dumb broad does this every time. - -[FM1_E] -~w~And here she is, the one and only Queen of Sheba! - -[FM1_F] -~w~What were you doing up there? - -[FM1_G] -~w~Whatever it was, I bet it cost me money. - -[FM1_H] -~w~Well, you don't think I hang around for the conversation, do you? - -[FM1_I] -~w~Get in that car and keep your big mouth shut. - -[FM1_J] -~w~Take the limo but bring it back in one piece, y'hear me? - -[FM1_K] -~w~And watch her, she can be trouble. - -[FM1_L] -~w~Yeah, yeah, yeah! I'm sure your new lap dog has everything covered, - -[FM1_M] -~w~and isn't he big and strong? - -[FM1_N] -~w~Hey Fido, Let's go visit Chico and get some party treats! - -[FM1_P] -~g~That's Chico over there, pull up next to him. - -[FM1_S] -~w~Here you go lady. - -[FM1_TT] -~w~IT'S A POLICE RAID! - -[FM1_1] -~g~Get back into the Stretch! - -[FM1_2] -~g~Get into the Stretch! - -[FM1_3] -~r~Leave Maria and Salvatore will have you whacked, go back and pick her up. - -[FM1_4] -~g~You've dumped the Don's woman! Get back to the warehouse and wait for Maria! - -[FM1_5] -~g~Get Maria safely back to Salvatore's! - -[FM1_6] -~g~Chico won't be there forever, get Maria to the waterfront! - -[FM1_7] -~r~Maria's dead! Salvatore won't be too pleased... - -[FM1_8] -~r~You wasted Maria's supplier! - -[FM2_J] -Leave us alone for a minute. - -[FM2_A] -The Colombian Cartel is making SPANK somewhere in Liberty. - -[FM2_K] -but we don't know where, and they seem to know everything we're doin' before we do. - -[FM2_L] -There is a guy named Curly Bob works the bar at Luigi's. - -[FM2_M] -He's been throwing more money around than he's earning. - -[FM2_N] -He usually gets a taxi home after work. So follow him. - -[FM2_O] -And if he's rattin' us out... kill him. - -[FM2_F] -Here comes our little friend. Mr big mouth himself. - -[FM2_G] -Were you followed? You know what goes on here is our little secret. - -[FM2_H] -No..no, I wasn't followed. You got my stuff? - -[FM2_I] -Here's your SPANK, squealer, now talk. - -[FM2_P] -OK, so the Leone's are fighting wars on two fronts. - -[FM2_Q] -They're in a turf war with the Triads with no sign of either side giving up. - -[FM2_R] -Meanwhile Joey Leone has stirred up some bad blood with the Forellis. - -[FM2_S] -Every day they're losing men and influence in the city. - -[FM2_T] -Salvatore is becoming dangerous and paranoid. He suspects everybody and everything. - -[FM2_U] -With loyalty like yours, what has he possibly got to worry about. - -[FM2_1] -~g~There's Curly Bob! - -[FM2_2] -~g~Curly's left the club, tail him! - -[FM2_5] -~g~Take him to Portland Harbor. - -[FM2_6] -~r~Curly won't get into a smashed-up taxi! - -[FM2_7] -~r~Curly's spooked! The meeting's off! - -[FM2_8] -~g~Whack Curly Bob! - -[FM2_9] -~r~Curly Bob's dead! - -[FM2_10] -~r~Curly got away! - -[FM2_11] -~g~Park out the front of Luigi's Club, Curly Bob will be leaving shortly. - -[FM2_12] -~r~He gave you the slip! - -[FM3_A] -~w~We should take these Colombian bastards out, - -[FM3_B] -~w~but while we're at war with the Triads we ain't strong enough. - -[FM3_C] -~w~The Cartel has got bottomless funds from pushing that SPANK crap. - -[FM3_D] -~w~If we make an open attack on them, they'll wipe the floor with us. - -[FM3_E] -~w~They must be making SPANK on that big boat that Curly lead you to. - -[FM3_F] -~w~So we gotta use our heads, or rather one head. Your head. - -[FM3_G] -~w~I'm asking you to destroy that SPANK factory as a personal favor to me, Salvatore Leone. - -[FM3_H] -~w~If you do this for me, you will be a made man, anything you want. - -[FM3_I] -~w~Go and see 8-Ball, you'll need his expertise to blow-up that boat. - -[FM3_8A] -~w~Yo my man! Salvatore phoned ahead, - -[FM3_8B] -~w~but a job like this is gonna need a lot of fireworks. - -[FM3_8D] -~w~but you know with me you get a lot of bang for your buck. - -[FM3_8E] -~w~Okay, let's do this thing! - -[FM3_8F] -~w~I can set this baby to detonate, but I still can't use a piece with these hands. - -[FM3_8G] -~w~Here, this rifle should help you pop some heads! - -[FM3_4] -~g~Stop the vehicle and let 8-Ball out! - -[FM3_7] -~r~8-Ball's been iced! - -[FM3_8] -~r~The guards have been alerted! - -[FM4_A] -~w~It's my favorite cleaner. - -[FM4_B] -~w~I'm proud of you my boy, you kicked the shit out of those grease balls. - -[FM4_C] -~w~I've got just one little job for you before we can all celebrate. - -[FM4_D] -~w~There's a car around the block from Luigi's club. - -[FM4_E] -~w~The inside is covered in brains. - -[FM4_F] -~w~We had to help some guy make up his mind and it proved a little messy. - -[FM4_H] -~w~Take it to the crusher before the cops find it. - -[AM3] -'PAPARAZZI PURGE' - -[AM4] -'PAYDAY FOR RAY' - -[AM5] -'TWO-FACED TANNER' - -[AM1_A] -We have certain issues to clear up before we can continue any form of relationship, - -[AM1_B] -business or otherwise. Lets lay our cards on the table. - -[AM1_C] -I am Yakuza and I know you worked for Salvatore Leone's family. - -[AM1_D] -I can give you work with our organization, - -[AM1_E] -But first you must prove to me that your ties with the Mafia are truly broken. - -[AM1_G] -Make sure he doesn't reach his club alive. - -[AM1_H] -Meanwhile Maria and I will catch up on old times. - -[AM1_I] -Oh..Asuka, you've got a massager. - -[AM1_J] -That's not a massager. - -[AM1_1] -~g~Salvatore is now leaving Luigi's! - -[AM1_2] -~r~You have been spotted! - -[AM1_3] -~r~You've missed Salvatore! - -[AM1_4] -~r~Nice going, you scared off the target! Call yourself a hitman? - -[AM1_5] -~g~Get to the Red Light District and wait for Salvatore to leave the club. - -[AM1_7] -~r~Salvatore's home, safe and sipping a cocktail. Ain't no one gonna call you the 'Jackal'! - -[AM1_8] -~g~Salvatore will be leaving Luigi's at about ~1~:~1~ - -[AM2_4] -~g~They seen you coming like a dayglow elephant! - -[AM3_A] -A reporter has been nosing around. - -[AM3_B] -Maria and I have taken a little holiday together until you can get rid of this perverted voyeur. - -[AM4_A] -It's my handsome handyman! - -[AM4_B] -Maria's all tied up at the moment but I'll tell her you called. - -[AM4_C] -Who's that? Asuka? I know I've been a naughty girl but I really need to pee! OK? - -[AM4_D] -It's time you met our man inside the LPD. - -[AM4_E] -Here's his payment for the last little job he did for us. - -[AM4_F] -He is understandably cautious. - -[AM4_G] -Get to the pay phone in Torrington as quick as you can and await his instructions. - -[AM5_A] -Maria and I have gone shopping. - -[AM5_B] -Our source in the police has informed us that one of our drivers is a strangely animated undercover cop! - -[AM5_C] -He's more or less useless out of his car, so we've tagged it with a tracer. - -[AM5_D] -Make him bleed! - -[AM5_1] -Tanner's on to you! - -[AS1] -'BAIT' - -[AS2] -'ESPRESSO-2-GO!' - -[AS4] -'RANSOM' - -[AS1_A] -~w~Miguel seems to think I'm mistreating him. - -[AS1_B] -~w~Still, he's revealed the extent to which Catalina fears your quest for revenge. - -[AS2_A] -~w~We underestimated Catalina's plans for SPANK. - -[AS2_B] -~w~It reaches far beyond the Yardies selling it on the street corners. - -[AS2_D] -~w~They've been selling SPANK through the street stalls. - -[AS2_1] -~g~All espresso stalls in Portland wrecked!! - -[AS2_2] -~g~All espresso stalls in Staunton Island wrecked!! - -[AS2_3] -~g~All espresso stalls in Shoreside Vale wrecked!! - -[AS2_4] -~r~The Cartel have warned their pushers!! - -[AS2_5] -~g~There are still espresso stalls in Shoreside Vale and on Staunton Island! - -[AS2_6] -~g~There are still espresso stalls in Shoreside Vale! - -[AS2_7] -~g~There are still espresso stalls on Staunton Island! - -[AS2_8] -~g~There are still espresso stalls in Portland! - -[AS2_9] -~g~There are still espresso stalls in Portland and Shoreside Vale! - -[AS2_10] -~g~There are still espresso stalls in Portland and on Staunton Island - -[AS2_12] -~g~Cruise Liberty's districts to find ~b~Espresso-2-Go stalls! - -[AS3_A] -~W~Do we tighten it some more now, or just wait for it to turn black and fall off? - -[AS3_B] -~w~Give it a quick prod... - -[AS3_D] -~w~My Handyman! - -[AS3_E] -~w~I was bored so I came over to keep Asuka company. - -[AS3_1] -~g~Find the ~r~boat~g~ and get to the ~b~marker buoy! - -[AS3_3] -~g~Wait for the ~y~plane~g~ to start its approach! - -[AS3_5] -~g~Collect the cargo! - -[AS3_4] -~g~Use a rocket launcher to shoot the ~y~plane~g~ down!! - -[AS3_2] -~b~Get to the runway marker buoys! ~y~The plane is on its final approach!! - -[AS3_6] -~g~~1~ OF 8 - -[KM1] -'KANBU BUST-OUT' - -[KM3] -'DEAL STEAL' - -[KM4] -'SHIMA' - -[KM5] -'SMACK DOWN' - -[KM1_A] -My sister speaks highly of you, - -[KM1_E] -though I am yet to be convinced that a gaijin can offer anything but disappointment. - -[KM1_B] -Perhaps you could help deal with a situation that has me at a disadvantage. - -[KM1_F] -Of course failure has its own disgrace. - -[KM1_C] -A Yakuza Kanbu is in custody awaiting transfer for trial. - -[KM1_G] -He is a valued member of the family. - -[KM1_H] -Break him out of custody and get him to the dojo at Bedford Point. - -[KM1_D] -We thankyou for your selfless actions. If you ever need help the dojo will be honoured to provide two men who will stand at your side. - -[KM1_1] -~g~Steal a cop car! - -[KM1_2] -~g~Rig the car with a bomb! - -[KM1_3] -~g~Now get him to the Yakuza dojo. - -[KM1_5] -~g~Okay now go to the police station. - -[KM1_6] -~g~Fit the car with a bomb! - -[KM1_7] -~g~Authorised police vehicles only! - -[KM1_9] -~r~You did not use a car bomb to destroy the wall - -[KM1_10] -~r~The Yakuza Kanbu is dead -along with your honor! - -[KM1_11] -~r~You brought the heat down on yourself! - -[KM2_A] -It is impossible to over-estimate the importance of etiquette in this line of work. - -[KM2_B] -To my eternal shame, a man once did me a favor and I have never had the opportunity to repay his kindness. - -[KM2_C] -The man's weakness is motor cars and he has requested that we acquire him certain models for his collection. - -[KM2_F] -My honor demands it. - -[KM2_2] -~g~Car delivered. - -[KM3_A] -When trouble looms, the fool turns his back, while the wise man faces it down. - -[KM3_B] -The Colombian Cartel have ignored repeated requests to leave our interests in Liberty well alone. - -[KM3_C] -Now they are negotiating terms with the Jamaicans in order to humiliate us further. - -[KM3_D] -They are finalizing a deal across town. - -[KM3_F] -Take one of my men, steal a Yardie car, and go and pay your respects to the Colombians. - -[KM3_E] -Our Honor demands that you leave no one alive. - -[KM3_2] -~g~Go and pick up your contact. - -[KM3_3] -~g~The meeting is being held in the hospital parking lot in Rockford! - -[KM3_4] -~r~They got away! - -[KM3_6] -~g~Kill them, kill them all! - -[KM3_8] -~g~You need a Yardie car to get on with the job! - -[KM3_9] -~r~One of the Colombians is dead, the deal's off. - -[KM3_10] -~r~The contact is dead! - -[KM4_A] -To be truly strong, it is important that you never show weakness. - -[KM4_C] -Go and collect the money immediately, so we can enter it into the casino accounts. - -[KM4_1] -I can't pay you and I wouldn't pay you if I could! - -[KM4_9] -Some young gang just jacked out the place! They took everything! - -[KM4_2] -You guys are useless. - -[KM4_10] -What kind of Yakuza are YOU anyway...? - -[KM4_3] -This ain't what I pay you goons for. If I wanted this kind of protection I'd have used the god damn police service - -[KM4_4] -~g~Punish the gang responsible and retrieve the ~b~protection money~g~! - -[KM4_7] -~r~The shopkeeper's breathed his last! - -[KM4_5] -Donald Love wishes you to drop by his tea garden so you and he can talk. - -[KM4_6] -There's the money its all there! - -[KM4_8] -~g~Briefcase collected! - -[KM5_A] -YOU! How fitting you should choose this moment to show your worthless face! - -[KM5_B] -It would appear your attempts to dissuade the Jamaicans - -[KM5_B1] -from becoming bed fellows with the Cartel were wholly inadequate! - -[KM5_C] -Yardie pushers line Liberty's streets selling packets of SPANK like they were selling hotdogs! - -[KM5_D] -Those Cartel pigs are laughing at us, at me! - -[KM5_E] -I will give you one last chance to prove my sister's faith in you to be well founded! - -[KM5_F] -Run these scumbags into the ground and wash your shame in rivers of our enemies' blood!!! - -[KM5_3] -~r~You failed to kill at least ~1~ yardies. - -[KM5_4] -~g~Congratulations you killed ~1~ Yardies. - -[KM5_5] -~g~Congratulations you killed ~1~ Yardies. BONUS $~1~ - -[RM1] -'SILENCE THE SNEAK' - -[RM3] -'EVIDENCE DASH' - -[RM4] -'GONE FISHING' - -[RM5] -'PLASTER BLASTER' - -[RM1_D] -He's under armed protection in WitSec property down in Newport, some apartment behind the car park. - -[RM1_E] -Torch that place, that should flush 'em out, and you'll hunt 'em down, make sure he never talks to nobody. - -[RM1_1] -~g~Check out the witness protection house. - -[RM1_2] -~g~Take out McAffrey! - -[RM2_A1] -Hey kid over here! - -[RM2_A] -An old army buddy of mine runs a business in Rockford. - -[RM2_D] -He's gonna need some back-up and in return he'll give you knock-down rates on any hardware you buy. - -[RM2_E] -Ray phoned ahead....but I thought there'd be more of you. - -[RM2_F] -Well, three arms are better than one, so grab whatever you need. - -[RM2_G] -~g~Go and check on Phil! - -[RM2_H] -~r~Phil has been killed!! - -[RM2_L] -Heh-hey! If I'd teamed up with you in Nicaragua maybe I'd still have my arm! - -[RM2_N] -Leave the cash behind. Now get out of here, I'll handle the cops. - -[RM3_D] -The evidence is being driven across town. - -[RM3_E] -You are going to have to ram that car and collect each little bit of evidence as it falls out. - -[RM3_F] -When you've got it all, leave it in the car and torch it. - -[RM3_G] -We're both gonna do pretty well outta this kid. - -[RM3_1] -~g~Leave the evidence in a car then torch the car. - -[RM3_4] -~g~The Prosecution has dropped the evidence! - -[RM3_6] -~r~The photos will be washed up all over Liberty! - -[RM3_7] -~g~Now torch the car! - -[RM4_A] -I think my partner's a rat. - -[RM4_C] -He goes fishing out of his boat near the lighthouse on Portland Rock most nights. - -[RM4_D] -Steal a police boat and make sure his back stabbing plans are sunk! - -[RM4_1] -~g~Go and steal a police boat. - -[RM4_2] -~g~Get to the lighthouse and 'rub out' Ray's partner! - -[RM5_A] -You useless bastard! - -[RM5_A1] -You totally messed up! My ass is on the line and you can't even kill a god damned fly. - -[RM5_B] -I paid you good money to kill that witness and he ain't dead! - -[RM5_B1] -And today he's gonna make a Federal Deposition! - -[RM5_C] -He's being moved any second now from the Carson General Hospital up in Rockford. - -[RM5_D] -If he squeals, I squeal.... - -[RM5_E] -so go do the job you were paid for! - -[RM5_1] -~g~Intercept the ambulance. - -[RM5_2] -~g~You've been spotted!! - -[RM5_3] -~g~It was a decoy! - -[RM5_4] -~g~Bullets won't get through that armored bodycast!! - -[RM5_5] -~g~That armored bodycast is flame retardant!! - -[RM5_7] -~r~Witness has been delivered!! - -[RM5_8] -~g~Witness has drowned!! - -[LOVE2] -'WAKA-GASHIRA WIPEOUT!' - -[LOVE3] -'A DROP IN THE OCEAN' - -[LOVE1_A] -First of all, let me thank you for dealing with that personal matter. - -[LOVE1_F] -People will read something into anything these days. - -[LOVE1_D] -They're trying to extort additional funds from me but I don't believe in re-negotiation. - -[LOVE1_E] -A deal is a deal, so they'll not see a penny from me. - -[LOVE1_G] -Go and rescue my friend, do whatever it takes. - -[LOVE1_2] -~g~Rescue the Old Oriental Gentleman. - -[LOVE1_3] -~g~Take the Old Oriental Gentleman back to Donald Love's building. - -[LOVE1_4] -~g~The Old Oriental Gentleman must be in one of the garages.... - -[LOVE1_6] -~r~The Old Oriental Gentleman's guts are all over the street! - -[LOVE1_7] -~g~The gate will only open for a Colombian Gang-car. - -[LOVE2_A] -Nothing drives down real estate prices like a good old fashioned gang war, - -[LOVE2_B] -apart from an outbreak of plague......but that might be going too far in this case. - -[LOVE2_C] -I've noticed the Yakuza and the Colombians are far from friends. - -[LOVE2_D] -Let's capitalise on this business opportunity. - -[LOVE2_E] -I want you to kill the Yakuza Waka-gashira, Kenji Kasen. - -[LOVE2_F] -Kenji is attending a meeting at the top of the multi-story carpark in Newport. - -[LOVE2_G] -Get a Cartel gangcar and eliminate him! - -[LOVE2_H] -The Yakuza must blame the Cartel for this declaration of war. - -[LOVE2_1] -~g~Go to Fort Staunton and steal a Colombian gangcar! - -[LOVE2_2] -~g~Now get to the ~p~multi-storey in Newport~g~ and whack Kenji! - -[LOVE2_3] -~r~If you proceed without a Cartel car you will be identified!! - -[LOVE2_4] -~r~The Yakuza have identified you!! - -[LOVE2_6] -~r~You've killed all the witnesses!! - -[LOVE3_A] -In these days of moral hypocrisy certain valuable commodities can be hard to import. - -[LOVE3_C] -It will drop several packages into the water. - -[LOVE3_D] -Make sure you pick them up before anyone else does. - -[LOVE3_1] -~g~Get a ~r~boat~g~ and follow the ~y~plane~g~! - -[LOVE4] -'GRAND THEFT AERO' - -[LOVE5] -'ESCORT SERVICE' - -[LOVE4_A] -Thank you for retrieving those packages, but they were only a decoy. - -[LOVE4_B] -Sorry about that, but that's sometimes the way in business. - -[LOVE4_C] -My real objective was hidden on the plane all along. - -[LOVE4_F] -I've paid off the officials. - -[LOVE4_1] -~r~The Colombian Cartel is here!! - -[LOVE4_2] -~g~The package is gone! Track down the Colombians and retrieve it. - -[LOVE4_3] -~g~Panlantic Construction...? - -[LOVE4_5] -~g~The package should be in the plane.... - -[LOVE4_6] -~g~Take the lift up the tower! - -[LOVE5_B] -My Oriental friend will need an escort while he takes my latest acquisition to be authenticated. - -[LOVE5_1] -~g~Lets go! - -[LOVE5_2] -~g~You'll need a car! - -[LOVE5_3] -~g~Go ahead and scout the exit of the tunnel! - -[LOVE5_4] -~r~Protect the truck! - -[RM6] -'MARKED MAN' - -[RM6_A] -You weren't followed? Good. - -[RM6_B] -This is it, I'm way over my head and I'm starting to drown here! - -[RM6_D] -I'm a marked man, so I'm getting out of here. - -[RM6_E] -Get me to my flight at the airport and I'll make it worth your while! - -[RM6_666] -Take care of my bullet proof Patriot. See you in Miami, Ray - -[CAT1] -'RANSOM' - -[CAT2] -'THE EXCHANGE' - -[CAT1_A] -I've got your precious Maria. If you don't want her face to look like she fell out with the butcher. - -[CAT2_F] -I broke a nail, and my hair's ruined. Can you believe it? This one cost me fifty dollars! - -[CAT2_G] -I was so scared, but then I thought to myself, you're a big girl now. - -[CAT2_H] -Oh we're going to have such fun, cause, you know, my sister said she wanted to come to stay with her two kids, - -[CAT2_I] -because her husband's playing around again and.. - -[CAT1_E] -XXXX - -[CAT1_F] -Get to Catalina before the time runs out! - -[CAT_MON] -~g~You don't have enough money yet. You need $500,000. - -[BITCH_D] -~g~Maria's dead! - -[WEATHER] -FORCE WEATHER - -[WEATHE2] -WEATHER NORMAL - -[8001] -You failed miserably!! - -[1000] -YOU ARE DEAD - -[1001] -YOU ARE DEAD - -[1002] -YOU ARE DEAD - -[1003] -YOU ARE DEAD - -[1004] -YOU ARE DEAD - -[1005] -BUSTED - -[1006] -BUSTED - -[1007] -BUSTED - -[1008] -BUSTED - -[1009] -BUSTED - -[GA_4] -Car bombs are $1000 each - -[GA_5] -Your car is already fitted with a bomb. - -[GA_6] -Park it, prime it by pressing the ~h~~k~~PED_FIREWEAPON~ button~w~ and LEG IT! - -[GA_7] -Arm with ~h~~k~~PED_FIREWEAPON~ button~w~. Bomb will go off when engine is started. - -[GA_8] -Use the detonator to activate the bomb. - -[GA_9] -You collected ~1~ out of 10 special cars - -[GA_10] -Nice one. Here's your $~1~ - -[GA_11] -We got these wheels already. It's worthless to us! - -[GA_12] -Bomb armed - -[GA_13] -Delivered like a pro. Complete the list and there'll be a bonus for you. - -[GA_14] -All the cars. NICE! Here's a little something. - -[GA_15] -Hope you like the new color. - -[GA_16] -Respray is complementary. - -[GA_19] -We're not interested in that model. - -[GA_20] -We got more of these than we can shift. Sorry man, no deal. - -[CR_1] -Crane cannot lift this vehicle. - -[PU_MONY] -You don't have enough cash. - -[CO_ALL] -You got all of them. Here's a little something... - -[PAUSED] -GAME PAUSED - -[HEALTH1] -Get outta here! You're perfectly healthy. - -[HEALTH2] -Healthcare costs. - -[HEALTH3] -I'll just fix you up. - -[HEALTH4] -That will be $250. - -[FEB_STA] -Stats - -[FEB_BRI] -Briefs - -[FEB_CON] -Controls - -[FEB_AUD] -Audio - -[FEB_DIS] -Display - -[FEB_LAN] -Language - -[FEP_STA] -STATS - -[FEP_BRI] -BRIEFS - -[FEP_CON] -CONTROLS - -[FEP_AUD] -AUDIO - -[FEP_DIS] -DISPLAY - -[FEP_LAN] -LANGUAGE - -[FEF_ST1] -Who's the bad man? - -[FEF_ST2] -How much havoc have you caused - -[FEF_BR1] -Lost the plot? - -[FEF_CO1] -Need more control, freak? - -[FEF_CO2] -Choose the best contoller set-up for your playing style - -[FEF_SA1] -Keep your place in the pile! - -[FEF_SA2] -Save and load your games - -[FEF_AU1] -Pump up the volume! - -[FEF_AU2] -Select a radio station and sound effect - -[FEF_DI1] -Change the game! - -[FEF_DI2] -Customize the game for your TV - -[FEF_LA1] -What you talking about willis? - -[FEF_LA2] -Choose your preferred parlance - -[FEM_ON] -On - -[FEM_OFF] -Off - -[FEM_YES] -Yes - -[FEM_NO] -No - -[FEM_NON] -None - -[FEB_PMB] -Previous Mission Briefs: - -[FEC_NA] -NA - -[FEC_CWL] -Cycle Weapon left - -[FEC_CWR] -Cycle Weapon right - -[FEC_LOF] -Look forward - -[FEC_TAR] -Target - -[FEC_MOV] -Movement - -[FEC_CAM] -Camera modes - -[FEC_PAU] -Pause - -[FEC_ENV] -Enter vehicle - -[FEC_JUM] -Jump - -[FEC_ATT] -Attack or Fire weapon - -[FEC_RUN] -Run - -[FEC_FPC] -First person camera - -[FEC_LL] -Look left - -[FEC_LB1] -Look - -[FEC_LB2] -behind - -[FEC_LB] -Look behind - -[FEC_LR] -Look right - -[FEC_HOR] -Horn - -[FEC_VES] -Vehicle control - -[FEC_RSC] -Radio station cycle - -[FEC_BRA] -Brake or Reverse - -[FEC_HAB] -Hand brake - -[FEC_CAW] -Car weapon - -[FEC_ACC] -Accelerate - -[FEC_SMT] -Special mission trigger - -[FEC_CCF] -Configuration: - -[FEC_CF1] -Setup1 - -[FEC_CF2] -Setup2 - -[FEC_CF3] -Setup3 - -[FEC_CF4] -Setup4 - -[FEC_CDP] -Controller Display: - -[FEC_ONF] -On Foot - -[FEC_INC] -In Car - -[FEC_VIB] -Vibration: - -[FEA_MUS] -Music Volume - -[FEA_SFX] -SFX Volume - -[FEA_OUT] -Output: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_RSS] -Radio station select: - -[FEA_NON] -None - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -CHATTERBOX 109 - -[FED_BRI] -Brightness - -[FED_TRA] -Trails: - -[FEL_ENG] -English - -[FEL_FRE] -French - -[FEL_GER] -German - -[FEL_ITA] -Italian - -[FEL_SPA] -Spanish - -[FED_DBG] -Menu Debug - -[FED_RID] -Reload IDE - -[FED_RIP] -Reload IPL - -[FED_PAH] -Parse Heap - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Big White Debug Light Switched - -[FED_SPR] -Show Ped Road Groups - -[FED_SCR] -Show Car Road Grups - -[FED_SCZ] -Show Cull Zones - -[FED_DSR] -Debug Streaming Requests - -[FED_SCP] -gbShowCollisionPolys - -[FEM_MCM] -Memory Card Menu - -[FEM_RMC] -Register MemCard One - -[FEM_TFM] -Test Format MemCard One - -[FEM_TUM] -Test UnFormat MemCard One - -[FEM_CRD] -Create Root Dir - -[FEM_CLI] -Create And Load Icons - -[FEM_FFF] -Fill First File with Guff - -[FEM_SOG] -Save Only The Game - -[FEM_CES] -Check Every 0kB4 Save - -[FEM_STG] -Save The Game - -[FEM_STS] -Save The Game under GTA3 name - -[FEM_CPD] -Create copy protected mag directory - -[FEM_MC2] -Memory Card Menu 2 - -[FEM_TS] -Test Save: - -[FEM_TL] -Test Load: - -[FEM_TD] -Test Delete: - -[FEM_SL0] -Slot0 - -[FEM_SL1] -Slot1 - -[FEM_SL2] -Slot2 - -[FEM_SL3] -Slot3 - -[FEM_SL4] -Slot4 - -[FEM_SL5] -Slot5 - -[FEM_SL6] -Slot6 - -[FEM_SL7] -Slot7 - -[PL_STAT] -Player stats - -[PE_WAST] -People you've wasted - -[PE_WSOT] -People wasted by others - -[CAR_EXP] -Cars exploded - -[TM_BUST] -Times busted - -[M_WASTE] -Civilian males wasted - -[F_WASTE] -Civilian females wasted - -[PIG_WST] -Cops wasted - -[GNG_WST] -Gang members wasted - -[MED_WST] -Medics wasted - -[FIRE_WS] -Firemen wasted - -[DED_CRI] -Criminals wasted - -[DED_DED] -Deadbeats wasted - -[DED_HOK] -Hookers wasted - -[HEL_DST] -Helicopters destroyed - -[PER_COM] -Percentage completed - -[KGS_EXP] -Kgs of explosives used - -[ACCURA] -Accuracy - -[ELBURRO] -Best Turismo time in secs - -[CAR_CRU] -Cars crushed - -[HED_EX] -Heads exploded - -[TM_DED] -Hospital visits - -[DAYSPS] -Days passed in game - -[MMRAIN] -Mm rain fallen - -[MXCARD] -Max. INSANE Jump dist. (ft) - -[MXCARJ] -Max. INSANE Jump height (ft) - -[MXCARDM] -Max. INSANE Jump dist. (m) - -[MXCARJM] -Max. INSANE Jump height (m) - -[MXFLIP] -Max. INSANE Jump flips - -[MXJUMP] -Max. INSANE Jump rotation - -[BSTSTU] -Best INSANE stunt so far: - -[INSTUN] -Insane stunt - -[PRINST] -Perfect insane stunt - -[DBINST] -Double insane stunt - -[DBPINS] -Perfect double insane stunt - -[TRINST] -Triple insane stunt - -[PRTRST] -Perfect triple insane stunt - -[QUINST] -Quadruple insane stunt - -[PQUINS] -Perfect quadruple insane stunt - -[NOSTUC] -No INSANE stunts completed - -[NOUNIF] -Unique Jumps completed - -[NOUNGM] -Total Unique Jumps - -[NMISON] -Mission attempts - -[NMMISP] -Missions passed - -[PASDRO] -Passengers dropped off - -[MONTAX] -Cash made in taxi - -[DAYPLC] -Daily police spending - -[CRIMRA] -Criminal rating - -[GMSTOR] -Game Store - -[PREBRF] -Previous Briefs - -[CNTLS] -Controls - -[MUSMEN] -Music/SFX - -[GAMSET] -Game Settings - -[LANGUA] -Language - -[DSPLAY] -Display - -[DEBUGM] -Debug Menu - -[QUITOP] -Quit Options - -[CONTRL] -Control Configuration - -[SET1EN] -SetUp 1. Enabled - -[SET1] -SetUp 1. - -[SET2EN] -SetUp 2. Enabled - -[SET2] -SetUp 2 - -[SET3EN] -SetUp 3. Enabled - -[SET3] -SetUp 3 - -[SET4EN] -SetUp 4. Enabled - -[SET4] -SetUp 4 - -[GOBACK] -GoBack - -[SOUND] -SOUND - -[MUSVOL] -Music Volume - -[SFXVOL] -SFX Volume - -[SCROPT] -SCREEN OPTIONS - -[CTRSCR] -Center Screen - -[SCRFOR] -Screen format - -[GMSVLQ] -GAME SAVE-LOAD-QUIT - -[GMREST] -Restart Game - -[GMLOAD] -Load Game - -[GMSAVE] -Save Game - -[NOGMSV] -Can save only at your hideout. - -[DLFILE] -Delete Grand Theft Auto 3 Files - -[CHFILE] -CHOOSE FILE TO LOAD - -[CHFIDL] -CHOOSE FILE TO DELETE - -[SVCONF] -SAVE CONFIRMATION - -[SVFNAM] -Your saved file name is - -[LANGSL] -LANGUAGE SELECTION - -[ENGLIS] -English - -[GERMAN] -German - -[ITALIA] -Italian - -[FRENCH] -French - -[SPAIN] -Spanish - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[PARSHP] -Parse Heap - -[DBGFON] -CTheScripts::DbgFlag On - -[DBFOFF] -CTheScripts::DbgFlag Off - -[BGWHON] -Big White Debug Light Switched On - -[BGWOFF] -Big White Debug Light Switched Off - -[DSTRON] -Debug Streaming Requests On - -[DSTROFF] -Debug Streaming Requests Off - -[PDRGON] -ShowPedRoadGroups On - -[PRGOFF] -ShowPedRoadGroups Off - -[CRRGON] -ShowCarRoadGroups On - -[CRGOFF] -ShowCarRoadGroups Off - -[CLZOON] -Show Cull Zones On - -[CLZOOF] -Show Cull Zones Off - -[SHPLON] -gbShowCollisionPolys On - -[SHPLOF] -gbShowCollisionPolys Off - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[FORMM1] -FormatMemCard 1 (teststuff) - -[UNFRM1] -UnFormatMemCard 1 (teststuff) - -[GORLEV] -Gore Level - -[SICASS] -Sick Fuck - -[SICSIC] -Sick Fucker - -[SCASSL] -Sick Fuck Selected - -[SCSCSL] -Sick Fucker Selected - -[PRVMEN] -Previous Mission Briefs - -[FORMEN] -Format Menu - -[MEMTST] -MemoryCardTest screen - -[REGCAR] -Register MemoryCard One - -[TEFONE] -Test Format MemCard One - -[TEUFON] -Test UnFormat MemCard One - -[CRROOT] -CreateRootDir - -[CRLDIC] -Create and Load Icons - -[FLFSGF] -Fill First File With Guff - -[PUSAVE] -Save Only the game - -[CHEVOK] -CheckEveryOkB4Save - -[SVGMON] -SaveTheGame - -[CNTSAV] -Can't save the game. On a mission. - -[CNCSAV] -Can't save the game. You're in a car - -[CRMGSV] -Create copy protected magazine directory - -[MGSVCN] -MagazineDirectory Created - -[MGSVNC] -MagazineDirectory Not Created - -[YES] -Yes - -[NO] -No - -[X] -x - -[LAST] -Last message. - -[FEDS_XB] -Select - -[FEDS_TB] -Back - -[FEDS_ST] -START button - RESUME - -[FEST_OO] -out of - -[FED_SUB] -Subtitles: - -[FEC_TUC] -Turret control - -[FEC_SM3] -Special mission trigger (R3 button) - -[FEC_RS3] -Radio station cycle (L3 button) - -[FEC_HO3] -Horn (L3 button) - -[DIAB1] -'TURISMO' - -[DIAB2] -'I SCREAM, YOU SCREAM' - -[DIAB3] -'TRIAL BY FIRE' - -[DIAB4] -'BIG'N'VEINY' - -[DIAB1_A] -El Burro wants to offer you an opportunity. Get to the payphone in Hepburn Heights if you want more info. - -[DIAB1_C] -You drive a mean race. Drop by the payphone again and 'El Burro' may have some work for you. - -[DIAB1_1] -~g~3..2..1.. GO GO GO! - -[DIAB1_4] -~g~Get a fast car and get to the starting grid. - -[DIAB1_3] -~r~You couldn't win a raffle, LOSER! - -[DIAB1_2] -~g~Congratulations you won, with an incredible time of ~1~ seconds. - -[FIRST] -~g~1st - -[SECOND] -~g~2nd - -[THIRD] -~g~3rd - -[FOURTH] -~g~4th - -[DIAB2_1] -~g~Pick up the briefcase in Harwood. - -[DIAB2_2] -~g~Find an icecream van. - -[DIAB2_3] -~g~Park the icecream van down at Atlantic Quays. - -[DIAB2_4] -~g~Press the ~w~~k~~VEHICLE_HORN~ button ~g~to activate the Icecream jingle. - -[DIAB2_6] -~g~Press the ~w~~k~~VEHICLE_HORN~ button ~g~to activate the Icecream jingle. - -[DIAB2_7] -~g~Press the ~w~~k~~VEHICLE_HORN~ button ~g~to activate the Icecream jingle. - -[DIAB2_5] -~g~Exit the van then use the remote to detonate the Icecream van. - -[YD1] -'BLING-BLING SCRAMBLE' - -[YD2] -'UZI RIDER' - -[YD3] -'GANGCAR ROUND-UP' - -[YD4] -'KINGDOM COME' - -[YD_P] -King Courtney would like a word. Get to the payphone in Aspatria!! - -[YD1_A] -~w~This is King Courtney. - -[YD1_A1] -~w~My Yardie posse could do with a driver and you've got a reputation for hot moves. - -[YD1_B] -~w~Get to the waste ground opposite the stadium in a car and wait for the other hopefuls. - -[YD1_C] -~w~I've got men watching checkpoints all over Staunton. - -[YD1_D] -~w~First driver to a checkpoint gets a Grand, then it's on to the next stop. - -[YD1_D1] -~w~If you get more checkpoints than any other driver, I could have some work for you. - -[YD1_E] -~g~Prepare to race! - -[YD1_F] -~g~You jumped the start -I like your style!! - -[YD1_G] -~r~This is a CAR RACE. You need a CAR fool! - -[YD1GO] -~g~GO!! - -[YD1_1] -~r~1 - -[YD1_2] -~r~2 - -[YD1_3] -~r~3 - -[YD1_BON] -$1000!! - -[Y1_1ST] -~g~You came first with ~1~ successful checkpoints! - -[Y1_2ND] -~y~2nd with ~1~ successful checkpoints. ~y~Close, but you just ain't the best! - -[Y1_3RD] -~r~3rd with ~1~ successful checkpoints. ~r~I thought you said you were good! - -[Y1_LAST] -~r~You were last! ~r~You wasted my time FOOL! - -[Y1_J1ST] -~y~Joint 1st with ~1~ successful checkpoints. ~y~Good, but you gotta be the best to drive for Queen Lizzy! - -[Y1_J2ND] -~r~Joint 2nd with ~1~ successful checkpoints. You drive like a crazed monkey! - -[Y1JLAST] -~r~Joint last! You talk like a driver, but you drive like a talker! - -[Y1_TEST] -CAR IN WATER!! - -[YD2_A] -~w~I need to see if you're capable of doing my dirty work. - -[YD2_A1] -~w~See if you can be trusted. - -[YD2_B] -~w~Two of my boys will be there any second to take you for a ride, - -[YD2_B1] -~w~see if you are who you say you are. - -[YD2_C] -~w~We're going for a little ride into Hepburn Heights, whack us some filthy Diablos been dissing Queen Lizzy. - -[YD2_CC] -~w~Here, you'll need a 'piece'. - -[YD2_D] -~w~You do the driving and shooting. We'll make sure you don't get cold feet. - -[YD2_E] -~w~Let's drive!! - -[YD2_F] -~r~He's bailed out on us, cap his yellow ass!!! - -[YD2_G1] -~w~Hepburn Heights..Let's kill me some filthy Diablos... - -[YD2_G2] -~w~But remember, ~r~You don't leave this car!! - -[YD2_H] -~w~OK, Get us back to Yardie turf! GO GO GO!! - -[YD2_L] -~w~You did good, Reaperman! - -[YD2_M] -~r~He's wrecked my car! Waste him! - -[YD2_N] -~w~Get your ass back in this car! - -[YD3_A] -I want you to boost some gang cars - -[YD3_A1] -so we can do hits on our enemies' turf. - -[YD3_B] -I need a Mafia Sentinel, - -[YD3_B1] -a Yakuza Stinger and a - -[YD3_B2] -Diablo Stallion so we can hit any gang in Liberty. - -[YD3_C] -Drop them off at the garage in Newport and remember, - -[YD3_C1] -they're no use to us wrecked!! - -[YD3_D] -Spare text label - -[YD3_E] -~r~You've already boosted a diablo gangcar! - -[YD3_F] -~r~You've already boosted a Mafia gangcar! - -[YD3_G] -~r~You've already boosted a Yakuza gangcar! - -[YD3_H] -~g~Diablo gangcar boosted! - -[YD3_I] -~g~Mafia gangcar boosted! - -[YD3_J] -~g~Yakuza gangcar boosted! - -[YD3_K] -~r~The car's nearly wrecked! Get it repaired! - -[YD3_L] -~g~Take it to the ~p~garage! - -[YD3_M] -~r~You've flipped it! Get another one! - -[YD4_A] -Listen up! - -[YD4_A1] -Get over to Bedford Point. - -[YD4_A2] -There's a stash in an old car I need pronto! - -[YD4_B] -LETTER: I hear you've been a busy boy. Well I've been a busy girl. - -[YD4_C] -I think it's time you witnessed the real power of 'SPANK'! Besos y fuderes, Catalina, xxx. - -[YD4_D] -PS: DIE PEEG DOG, DIE!! - -[YD4_1] -~g~SPANKED-up madmen!! - -[YD4_2] -~g~Destroy the madmens' vans!! - -[HM_1] -'UZI MONEY' - -[HM_2] -'TOYMINATOR' - -[HM_3] -'RIGGED TO BLOW' - -[HM_5] -'RUMBLE' - -[HOOD1_A] -Get to the payphone in Wichita Gardens and we'll talk business. - -[HM1_A] -Yo! This is D-Ice of the Red Jacks! - -[HM1_C] -These young punks, they come onto the streets and they got nothing but guns and SPANK on their minds. - -[HM1_3] -~g~The 'Nines' walk their turf in Wichita Gardens. - -[HM2_3] -If you hit a vehicle's wheels the RC buggy will detonate! - -[HM2_4] -If it goes out of range the RC buggy will detonate! - -[HM2_5] -~r~Out of range! - -[HM3_1] -~g~Get to the garage but watch out if the car takes too much damage it will blow! - -[HM3_2] -~g~Take the car back it has to be in perfect condition - no damage! - -[HM3_3] -~g~Get the car repaired! - -[HM4_D] -~g~Get a vehicle! - -[HM4_E] -TEXT NO LONGER REQUIRED - -[HM4_1] -~g~Head to the location where the cargo is scattered, you need to collect 30 pieces of bullion. - -[HM4_2] -~g~Remember when the vehicle becomes too heavy and slow goto the garage and drop off the cargo. - -[HM5_3] -~r~You were told to use a baseball bat only! - -[HM5_4] -~r~Your contact's dead! - -[MEA1] -'THE CROOK' - -[MEA2] -'THE THIEVES' - -[MEA3] -'THE WIFE' - -[MEA4] -'HER LOVER' - -[MEAT1_A] -A friend said you could fix some problems I got. Get to the payphone in Trenton if you think you can help. - -[MEA1_B3] -~g~Go and meet the Bank Manager. - -[MEA1_B6] -~g~Take the car to the crusher to get rid of evidence, get out of the car and the crane will pick it up. - -[MEA1_1] -~r~The Bank Manager's dead! - -[MEA1_2] -~r~You were told to crush the vehicle! - -[MEA1_3] -~g~Get out of the car! - -[MEA1_4] -~r~You have left the Bank Manager behind! - -[MEA2_B3] -~g~Go and meet the thieves. - -[MEA2_B4] -~g~Take them to the Bitch'n' Dog Food Factory - -[MEA2_B6] -~g~Get the car resprayed to get rid of any evidence. - -[MEA2_1] -~r~You were told to crush the vehicle! - -[MEA2_2] -~r~A thief's dead! - -[MEA2_4] -~r~You have left a thief behind! - -[MEA3_B3] -~g~Go and collect Mrs. Chonks - -[MEA3_B6] -~g~Take the car and dump it into the sea, this will get rid of any evidence. - -[MEA3_1] -~r~The wife's dead! - -[MEA3_2] -~r~You were supposed to dump the vehicle in the water! - -[MEA3_3] -~r~You have left his wife behind! - -[MEA4_B3] -~g~Pick up his wife's lover - -[MEA4_B6] -It's far too late for that Marty. You had your chance, but now I'm taking over the business... - -[MEA4_1] -~r~Carlos is dead! - -[MEA4_3] -~r~You have left Carlos the loan shark behind! - -[LOOK_A] -Press and hold the ~h~~k~~VEHICLE_LOOKLEFT~ button ~w~or the ~h~~k~~VEHICLE_LOOKRIGHT~ button~w~ to look ~h~left~w~ or ~h~right~w~ while in a vehicle. Press both to look ~h~behind~w~. - -[LOVE6_1] -~g~Now lead the cops away from the warehouse! - -[LOVE6_2] -~r~You failed to lead the police far enough away! - -[RM4_3] -~r~Ray's partner has escaped! - -[RM6_C] -The CIA seem to have a vested interest in SPANK - -[RM6_C1] -and they don't like us screwing with the Cartel. - -[C_PASS] -THREAT ELIMINATED! - -[CTUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Vigilante missions on or off. - -[CTUTOR2] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Vigilante missions on or off. - -[COPCART] -~g~You have ~1~ seconds to return to a police vehicle before the mission ends. - -[C_FAIL] -Vigilante mission ended! - -[C_CANC] -~r~Vigilante mission cancelled! - -[C_ESCP] -~r~The suspect has escaped! - -[C_TIME] -~r~Your time as a law enforcer is over! - -[C_VIGIL] -VIGILANTE BONUS!! - -[A_FAIL2] -~r~Your lack of urgency has been fatal to the patient! - -[A_FAIL3] -~r~The patient is dead!! - -[A_PASS] -Rescued! - -[F_FAIL2] -~r~You're too late! - -[A_COMP2] -You will never get tired! - -[RM2_M] -If you need any firepower just drop by and take what you need from the lockers. - -[HEAL_A] -Your ~h~health~w~ is displayed in orange in the top right of the screen. - -[YD1_CNT] -~1~ of 15! - -[FM1_9] -~g~Thats the party up ahead, drop Maria off out front. - -[FM1_Y] -~w~You know I enjoyed myself for the first time in a long while, and you treated me really good. With respect and everything. - -[FM1_AA] -~w~Oh, I'd better go. I'll see you around I hope. - -[NOCONTE] -Please re-insert an analog controller (DUALSHOCK#) or analog controller (DUALSHOCK#2) in controller port 1 to continue. - -[WRCONT] -The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto 3 requires an analog controller (DUALSHOCK#) or analog controller (DUALSHOCK#2). - -[WRCONTE] -The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto 3 requires an analog controller (DUALSHOCK#) or analog controller (DUALSHOCK#2). - -[WRONGCD] -Incorrect disc. Please insert correct disc. - -[NOCD] -The disc tray is empty. Please insert disc. - -[OPENCD] -The disc tray is open. Please close the disc tray. - -[CDERROR] -Error reading the Grand Theft Auto 3 DVD - -[RESTART] -Starting new game - -[GA_3] -No more freebies. $1000 to respray! - -[GA_1] -Whoa! I don't touch nothing THAT hot! - -[GA_1A] -Come back when you're not so busy... - -[S_PROM2] -The garage next door can store one vehicle when you save your game. - -[STOCK] -out of stock - -[FM1_O] -~w~He's at the rail station at the Chinatown waterfront I think. - -[EBAL_B] -This is the place right here, let's get off the street and find a change of clothes! - -[EBAL_G] -This is Luigi's club. Let's go round the back and use the service door. - -[AM4_3] -You must be Asuka's new errand boy! - -[AM4_4] -You got the money? Is it all here? - -[AM4_5] -I know what you're thinking, another bent cop. - -[AM4_6] -Well, it's a bent world. - -[AM4_7] -Just 'cause I lost a few partners, those suckers from internal affairs have started sniffing around. - -[AM4_8] -Reckon they can smell me. - -[AM4_9] -Well, this city is just one big open sewer. - -[AM4_10] -But I'm gonna need some non-union help. - -[AM4_11] -And if you're interested you'll know where to find me. - -[CAM_A] -Press the ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~ button~w~ to change ~h~camera ~w~modes when on foot or in a vehicle. - -[CAM_B] -Press the ~h~directional button up~w~ and ~h~down~w~ to change ~h~camera ~w~modes when on foot or in a vehicle. - -[KM2_1] -~g~Repair the car, it's gotta be mint. - -[LM3_6] -Joey... - -[LM3_6A] -Am I goin' to play with your big end again? - -[LM3_9A] -there might be some work for you. - -[LM3_9B] -Alright? - -[AWAY2] -~r~They got away. - -[AWAY] -~r~He's clean out of here! - -[JM6_1] -Get to the bank on the main drag. - -[GA_6B] -Park it, prime it by pressing the ~h~~k~~PED_FIREWEAPON~ button~w~ and LEG IT! - -[GA_7B] -Arm with ~h~~k~~PED_FIREWEAPON~ button~w~. Bomb will go off when engine is started. - -[BAT1] -~g~Pick up the bat! - -[EBAL_O] -If you don't mess this up, maybe there be more work for you. Now get outta here! - -[HELP9_B] -Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. - -[HELP9_C] -Press the~h~ ~k~~PED_FIREWEAPON~ button ~w~to ~h~fire~w~ the sniper rifle. - -[JM6_8] -~r~You've lost all the robbers! - -[COLT_IN] -The Pistol is now in stock at Ammunation! - -[TAXI2] -~r~You're out of time! - -[TAXI3] -~r~Your passenger fled in terror! - -[TAXI7] -~r~Your car is trashed, get it repaired. - -[TAXI4] -Fare complete! - -[TAXI5] -SPEED BONUS!! - -[TAXI6] -Taxi mission over - -[FRANGO] -~g~Salvatore wants you to help Toni deal with the Triads first! - -[PAGEB12] -Police Bribe delivered to hideout - -[PAGEB13] -Health delivered to hideout - -[PAGEB14] -Adrenaline delivered to hideout - -[KM1_4] -~g~You need a cop car to do the job! - -[CAT1_B] -bring $500,000 to the Villa at Cedar Grove. - -[JM2_C] -He's got a noodle stand down in China Town. - -[RM6_1] -Here's a key to a lock-up. - -[RM6_2] -You'll find some cash and some 'supplies' I'd stashed in case things got tight. - -[RM6_3] -See y'around. - -[FE_INIP] -Initialising and loading Pause Menu... Please wait. - -[FESZ_CA] -Cancel - -[FESZ_QU] -Quit - -[FESZ_L1] -Game saved successfully! - -[FESZ_L2] -Your saved filename is: - -[FESZ_OK] -OK - -[FES_LGA] -Load Game - -[FES_DGA] -Delete Game - -[FES_NGA] -New Game - -[FES_CAN] -Cancel - -[FESZ_QL] -All unsaved progress in your current game will be lost. Proceed with loading? - -[FESZ_QD] -Proceed with deleting this saved game? - -[FESZ_QO] -Proceed with overwriting this saved game? - -[FESZ_QR] -Are you sure you want to start a new game? All progress since the last save game will be lost. Proceed? - -[FESZ_QS] -PROCEED WITH SAVE ? - -[T4X4_1] -'PATRIOT PLAYGROUND' - -[T4X4_2] -'A RIDE IN THE PARK' - -[T4X4_3] -'GRIPPED!' - -[MM_1] -'MULTISTOREY MAYHEM' - -[T4X4_1A] -~g~You have ~y~5 minutes~g~ to collect ~y~15~g~ checkpoints. ~g~You may collect them in ~y~ANY ORDER. - -[T4X4_1B] -~1~ of 15! - -[T4X4_1C] -~y~PASS THROUGH~g~ the first checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~20 SECONDS~g~. - -[T4X4_2A] -~g~You have ~y~2 minutes~g~ to collect ~y~12~g~ checkpoints!! ~g~You may collect them in ~y~ANY ORDER. - -[T4X4_2B] -~1~ of 12! - -[T4X4_2C] -~y~PASS THROUGH~g~ the first checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~10 SECONDS~g~. - -[T4X4_3A] -~g~You have ~y~5 minutes~g~ to collect ~y~20~g~ checkpoints. ~g~You may collect them in ~y~ANY ORDER. - -[T4X4_3B] -~y~PASS THROUGH~g~ the first checkpoint to start the timer. ~g~Each checkpoint will credit you with ~y~15 SECONDS~g~. - -[T4X4_3C] -~1~ of 20! - -[T4X4_F] -~r~You bailed! Too tough for you?! - -[MM_1_A] -~g~You have ~y~2 minutes~g~ to collect ~y~20 checkpoints~g~ in the multistorey! ~g~You may collect them in ~y~ANY ORDER. - -[MM_1_B] -~1~ of 20! - -[MM_1_C] -~g~That's 20 seconds, plus ~y~5 SECONDS~g~ for each checkpoint. ~g~The timer will start ~y~IMMEDIATELY. - -[FM2_14] -~r~You got too close and spooked Curly! - -[FM2_15] -~g~Don't get too close or Curly will suspect something! - -[UPSIDE] -~r~You flipped your wheels! - -[FM2_16] -SPOOKOMETER: - -[LM3_11] -~g~Misty won't ride in a bus get another vehicle! - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinel - -[PATRIOT] -Patriot - -[FIRETRK] -Firetruck - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mule - -[CHEETAH] -Cheetah - -[AMBULAN] -Ambulance - -[FBICAR] -Fbi Car - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -Mr Whoopee - -[BFINJC] -BF Injection - -[POLICAR] -Police - -[ENFORCR] -Enforcer - -[SECURI] -Securicar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Barracks OL - -[TRAIN] -Train - -[HELI] -Helicopter - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -RC Bandit - -[BELLYUP] -Triad Fish Van - -[MRWONGS] -Mr Wongs - -[MAFIACR] -Mafia Sentinel - -[YARDICR] -Yardie Lobo - -[YAKUZCR] -Yakuza Stinger - -[DIABLCR] -Diablo Stallion - -[COLOMCR] -Cartel Cruiser - -[HOODSCR] -Hoods Rumpo XL - -[AEROPL] -Aeroplane - -[SPEEDER] -Speeder - -[REEFER] -Reefer - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Borgnine - -[TOYZ] -TOYZ - -[FEST_DF] -Dist. travelled on foot (miles) - -[FEST_DC] -Dist. travelled by car (miles) - -[FESTDFM] -Distance travelled on foot (m) - -[FESTDCM] -Distance travelled by car (m) - -[FEST_R1] -Patriot Playground in secs - -[FEST_R2] -A Ride In The Park in secs - -[FEST_R3] -Gripped! in secs - -[FEST_RM] -Multistorey Mayhem in secs - -[FEST_LS] -People saved in an Ambulance - -[FEST_CC] -Criminals killed on Vigilante Mission - -[FEST_FE] -Total fires extinguished - -[FEST_LF] -Longest flight in Dodo - -[FEST_BD] -Best time for bomb defusal - -[FEST_RP] -Rampages passed - -[FEST_MP] -Missions passed - -[FEST_BB] -Bling-bling Scramble: - -[FEST_H0] -Most checkpoints - -[FEST_GC] -Gang Cars Totalled: - -[FEST_H1] -Diablo destruction - -[FEST_H2] -Mafia Massacre - -[FEST_H3] -Casino Calamity - -[FEST_H4] -Rumpo Wrecker - -[USJI1] -TEXT NO LONGER REQUIRED - -[USJI2] -TEXT NO LONGER REQUIRED - -[USJI3] -TEXT NO LONGER REQUIRED - -[USJ] -UNIQUE STUNT BONUS! - -[SPRAY] -Drive your vehicle into the spray shop to lose your ~h~wanted level~w~, ~h~repair ~w~and ~h~respray ~w~your vehicle. Cost - ~h~$1000. - -[HM1_1] -~g~Ice 20 Purple Nines in 2 minutes 30 seconds. - -[KM1_8A] -Press the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~activate the bomb,~w~ remember to get out of the way. - -[KM1_8D] -Press the~h~ ~k~~PED_FIREWEAPON~ button~w~ to ~h~activate the bomb,~w~ remember to get out of the way. - -[KM1_12] -~g~Get him to the dojo but get rid of the cops first! - -[RATNG1] -Pickpocket - -[RATNG2] -Bully - -[RATNG3] -Thug - -[RATNG4] -Hustler - -[RATNG5] -Goon - -[RATNG6] -Wheelman - -[RATNG7] -Hired muscle - -[RATNG8] -Fixer - -[RATNG9] -Associate - -[RATNG10] -Cleaner - -[RATNG11] -Assassin - -[RATNG12] -Right-hand man - -[RATNG13] -Executioner - -[RATNG14] -Capo - -[RATNG15] -Boss - -[1010] -~r~Your vehicle is upside down - -[1011] -~r~Your vehicle is upside down - -[1012] -~r~Your vehicle is upside down - -[1013] -~r~Your vehicle is upside down - -[1014] -~r~Your vehicle is upside down - -[JM4_10] -OK, Kid. Drive me to the laundry in Chinatown first, I got a bit of business to take care of. - -[JM4_11] -Those washer women aint been payin' their protection money. - -[JM4_12] -And watch the car, Joey just fixed this junk heap. - -[JM4_13] -So no fancy crap, OK? - -[KM4_11] -~g~Take the money back to the casino! - -[FEF_BR2] -Find it again by reading any mission briefs collected to date. - -[TRAIN_1] -Kurowski Station - -[TRAIN_2] -Rothwell Station - -[TRAIN_3] -Baillie Station - -[SUBWAY1] -Portland Station - -[SUBWAY2] -Rockford Station - -[SUBWAY3] -Staunton South Station - -[SUBWAY4] -Shoreside Terminal - -[MEA4_2] -~r~Marty Chonks is dead! - -[SPRAY1] -Drive your vehicle into the spray shop to lose your ~h~wanted level~w~, ~h~repair ~w~and ~h~respray ~w~your vehicle. Cost - ~h~$1000~w~. This time it's free. - -[JM4_A] -Yeah, I know Toni, I've tuned her real sweet. She purrs, you know what I mean? - -[JM4_5] -Drop by later and we'll give them something to launder, their own blood stained clothes! - -[AMMU_A] -Luigi said you'd need a piece... - -[AMMU_B] -Joey told me to tool you up... - -[AMMU_C] -So go around back of the shop. I left you a nine in the yard. - -[AMMU_D] -I got all your home defence needs. - -[AMMU_E] -You want a license too? - -[AMMU_F] -I don't need to see any I.D. you look trustworthy. - -[DETON] -DETONATION: - -[DRIVE_A] -Have an Uzi selected when entering a vehicle then look left or right and press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire. - -[DRIVE_B] -Have an Uzi selected when entering a vehicle then look left or right and press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire. - -[RECORD] -~g~NEW RECORD!! - -[NRECORD] -~r~NO NEW RECORD! - -[RCHELP] -Press ~k~~PED_FIREWEAPON~, or drive the RC car into a vehicle's wheels to detonate. - -[RCHELPA] -Press the ~k~~PED_FIREWEAPON~ button, or drive the RC car into a vehicle's wheels to detonate. - -[RC_1] -You have 2 minutes to blow up as many Diablo Gang Cars as possible! - -[RC_2] -You have 2 minutes to blow up as many Mafia Gang Cars as possible! - -[RC_3] -You have 2 minutes to blow up as many Yakuza Gang Cars as possible! - -[RC_4] -You have 2 minutes to blow up as many Yardie Gang Cars as possible! - -[RC_5] -You have 2 minutes to blow up as many Hood Gang Cars as possible! - -[RC_6] -You have 2 minutes to blow up as many Cartel Gang Cars as possible! - -[RAMPAGE] -RAMPAGE!! - -[RAMP_P] -RAMPAGE COMPLETE! - -[RAMP_F] -RAMPAGE FAILED - -[PAGE_00] -. - -[PAGE_01] -Murder ~1~ Diablos in 120 seconds! - -[PAGE_02] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_03] -Kill ~1~ Mafia in 120 seconds! - -[PAGE_04] -Kill ~1~ Triads in 120 seconds! - -[PAGE_05] -Kill ~1~ Triads in 120 seconds! - -[PAGE_06] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_07] -Pop ~1~ Yardie heads in 120 seconds! - -[PAGE_08] -Burn ~1~ Yakuza in 120 seconds! - -[PAGE_09] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_10] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_11] -Annihialate ~1~ Yardies in 120 seconds! - -[PAGE_12] -Torch ~1~ Yakuza in 120 seconds! - -[PAGE_13] -Explode ~1~ Yardies in 120 seconds! - -[PAGE_14] -Fry ~1~ Colombians in 120 seconds! - -[PAGE_15] -Splatter ~1~ Hoods in 120 seconds! - -[PAGE_16] -Destroy ~1~ vehicles in 120 seconds! - -[PAGE_17] -Splatter ~1~ Colombians with a car in 120 seconds! - -[PAGE_18] -Driveby and Destroy ~1~ vehicles in 120 seconds! - -[PAGE_19] -Remove ~1~ Colombian heads in 120 seconds! - -[PAGE_20] -Behead ~1~ Hoods in 120 seconds! - -[JM1_A] -Hey, I'm bored when you gonna drill me? - -[JM1_B] -In a moment sweet heart, I got a little business to take care of. - -[JM1_C] -I got a little job for you pal. - -[JM1_D] -The Forelli brothers have owed me money for too long - -[JM1_E] -and they need to be taught some respect. - -[JM1_F] -Lips Forelli is stuffing his fat face in St Marks Bistro, - -[JM1_G] -so steal his car and take it to 8-Ball's bomb shop up in Harwood. - -[JM1_H] -You know 8-Ball right? - -[JM1_I] -Once he's fitted it with a bomb, go park the car where you found it. - -[JM1_J] -Then sit back and watch the whole show. - -[JM1_K] -But hurry up, he won't be eating forever. - -[CAT2_A1] -Come on you dumb bitch! - -[CAT2_A] -The real question is, did you turn up to rescue Maria or to get me back? - -[CAT2_B] -Well I got news for you, - -[CAT2_B2] -shooting you will be a pleasure but dating you was only business. - -[CAT2_C] -You are muy peccinno amigo! - -[CAT2_D] -Throw over the cash. - -[CAT2_E] -You have been a busy boy! - -[CAT2_E2] -But you haven't learned, I'm not to be trusted. - -[CAT2_E3] -Kill the idiot. - -[CAT2_J] -Get this thing airborne!! - -[HM5_1] -Yo, Ice said was comin'. There rules. Bats only. No guns, no cars. - -[HM5_5] -This is a battle for respect, you cool? - -[HELP14] -To collect weapons walk through them. These cannot be collected while in a vehicle. - -[CRUSH] -Park in the marked area and exit your vehicle. The vehicle will then be crushed. - -[DIAB2_B] -A gang of no-goods has threatened to remove my starring member if I don't pay them a cut. - -[DIAB2_C] -They threaten the wrong man, amigo. - -[DIAB2_D] -They have a weakness for the icecream. - -[DIAB2_E] -Pick up the bomb I've hidden in Harwood, - -[DIAB2_F] -hijack the regular icecream van on its rounds. - -[DIAB2_G] -and lure these fools to their doom with the jeengle-jeengle. - -[DIAB2_H] -They hide in a warehouse on Atlantic Quay. - -[DIAB3_A] -Some insolent Triads stole my beautiful car last night, - -[DIAB3_B] -wrecked it and left it burning. - -[DIAB3_C] -Some of my most precious donkey memorabilia was in the trunk - - -[DIAB3_D] -real collectibles that are irreplaceable my friend. - -[DIAB3_E] -I've hidden a throbbing weapon on the edge of Chinatown. - -[DIAB3_F] -Take it and teach these Triad vandals to fear El Burro's well-endowed wrath. - -[DIAB3_G] -Ariba! - -[DIAB3_1] -KILL 25 TRIADS - -[DIAB4_A] -A thieving opportunist has stolen a van of my latest publication hot off the press! - -[DIAB4_B] -But that SPANKED-up idiot has left the rear doors open - -[DIAB4_C] -and now my beautifully produced, - -[DIAB4_D] -tastefully photographed adult literature is being dropped all over Liberty! - -[DIAB4_E] -Take the van and follow that trail of Donkey Does Dallas volumes 1, 2 and 3 - -[DIAB4_F] -collecting it as you go. - -[DIAB4_G] -When you've followed the trail to that thieving SPANK-head, waste him! - -[DIAB4_H] -Then deliver my donkey derby to XXX Mags in the Red Light District. - -[DIAB4_1] -~g~Take the van to the back of XXX Magazines. - -[HM1_E] -I want you to show these punk ass bitches how a real drive-by works. - -[HM1_H] -Take these nines off of here!! - -[HM2_A] -Those Nines are pressing me. - -[HM2_B] -These Bitches got armored cars and now they're running SPANK... - -[HM2_C] -and slinging it to brothers with no fear. - -[HM2_D] -There's a car parked up the way. - -[HM2_E] -There's some stuff in there to put these sissys on blass... - -[HM3_A] -Some effa has wired my wheels to blow. - -[HM3_B] -If I lose those wheels, my rep on the street will be dead. - -[HM3_C] -Pick up my car and take it over to the garage on St. Marks, a'right yo. - -[HM3_D] -Let them diffuse that, let them take care of that bomb. - -[HM3_E] -The clocks ticking and the wiring is messed up. - -[HM3_F] -One pot hole too many and that thing could blow. - -[HM3_G] -Now move it! - -[HM4_A] -Yo, a Federal Reserve flight just smashed down at Francis International. - -[HM4_B] -There's platinum all over the strip. - -[HM4_C] -Get a car and snatch up as much as you can. - -[HM4_F] -You can drop the bling off at one of my garages. - -[HM4_G] -This platinum is mad heavy and it will slow your wheels down some. - -[HM4_H] -So make regular drop off's at the garage. - -[HM5_A] -Them Nines are down to a few scabby herds... - -[HM5_B] -but they still wanna bring it. - -[HM5_C] -They agreed to go toe to toe. - -[HM5_D] -A gang of them against two of us, or rather... - -[HM5_E] -two of yaw - -[HM5_F] -I'd join you but... - -[HM5_G] -I ain't due my parole hearing for another three months now, - -[HM5_H] -y'know what I mean? - -[HM5_I] -Go and meet my baby brother, - -[HM5_J] -He'll show you where they are fighting a'right son. - -[MEA1_B] -The name's Chonks, Marty Chonks. - -[MEA1_C] -I run the Bitchin' Dog Food factory around the corner. - -[MEA1_D] -I got money troubles, but hey, who doesn't right? - -[MEA1_E] -I'm meeting my bank manager later. - -[MEA1_F] -He's a crooked bastard that keeps bumping up the loan repayments so he can cut a slice. - -[MEA1_G] -Take my car, pick him up and bring him back here. - -[MEA1_H] -I've got a little surprise for that blood sucking leech!! - -[MEA2_A] -I hired some thieves to break into my apartment... - -[MEA2_C] -The thieving bastards are threatening to tell the insurance company, - -[MEA2_D] -if I don't give them a cut. - -[MEA2_E] -Can you believe it? - -[MEA2_F] -I've left a car inside the factory gates. - -[MEA2_G] -Use it to go and pick them up from their turf in the Red Light district. - -[MEA2_H] -Then bring 'em back to the factory so I can make 'em see Marty's point of view. - -[MEA3_A] -The business is going to go under unless I get hold of some serious cash soon. - -[MEA3_B] -My wife has an insurance policy and all she's ever been to me is a hole in my pocket. - -[MEA3_C] -I've left a car in the usual place. - -[MEA3_D] -Go and pick up my wife from Classic Nails and bring her back to the factory. - -[MEA4_A] -Damn, I'm in trouble! - -[MEA4_B] -Turns out my wife was seeing some guy I owe money to. - -[MEA4_C] -He's got real angry and he's looking for payback! - -[MEA4_E] -he thinks I'm gonna pay him off... - -[MEA4_F] -but my guess is... - -[MEA4_G] -Liberty's dogs are gonna get yet another flavor this month! - -[WELCOME] -WELCOME TO - -[HM1_2] -~g~Get a vehicle, remember only Uzi drive by kills count! - -[HELP8_B] -Press the~h~ ~k~~PED_SNIPER_ZOOM_IN~ button ~w~to ~h~zoom in ~w~with the rifle and the~h~ ~k~~PED_SNIPER_ZOOM_OUT~ button ~w~to ~h~zoom out ~w~again. - -[LRQC_1] -Asuka and I are gonna have to talk, uh, - -[LRQC_2] -Why don't you go cruise around? - -[LRQC_3] -You'll need a place to lie low. - -[LRQC_4] -There's a warehouse at the edge of Belleville that should suit your needs. - -[LRQC_5] -Come back here to my Condo when you are ready, - -[LRQC_6] -and we can have a little chat. - -[JM6_5] -~g~You need a getaway vehicle, Idiot! - -[JM2_F] -If you need a piece go around back of AmmuNation opposite the subway. - -[LOVE4_7] -~g~There's a construction yard in Staunton Island, maybe they took the package there. - -[LOVE4_8] -~g~You'll need a car to open the garage. - -[TSCORE] -EARNINGS: $~1~ - -[AM1_9] -~r~Salvatore has escaped back into Luigi's Club! - -[AM1_6] -~g~If you hang around Luigi's club, the Mafia will spot you! - -[TM2_3] -~g~It's a trap! Waste them all!! - -[FM4_1] -This is Maria. The car's a trap! Meet me at the slip south of Callahan Bridge. - -[JM1_7] -~g~Close the car door! He'll notice! - -[KM5_1] -~g~DEALER MINCED!!. - -[KM5_6] -~g~You must murder at least 8 Yardie dealers. - -[KM5_7] -~g~Kill them quickly! Once they've pushed their SPANK they're off the streets. - -[RM3_8] -~r~That car is a decoy!! - -[LM3_8] -Hey, I'm Joey. - -[LM3_9] -Luigi said you were reliable so come back later, - -[KM3_5] -~g~Press the horn to get the deal going. - -[LOVE7] -LOVE'S DISAPPEARANCE - -[LOVE2_5] -~g~Kenji is fender meat! Get out of Newport and dump the car! - -[AS2_11] -~g~~1~ OF 9! - -[GARAGE1] -~g~Get out of the vehicle and walk outside. - -[KM3_11] -~g~The Cartel have been attacked and the briefcase has not been recovered. - -[KM3_12] -~g~Kill all of the Colombians, destory the vehicles and recover the briefcase. - -[KM3_13] -~g~Take the briefcase back to the casino. - -[RM5_6] -~g~He's bailed out!! Smash his bodycast with a vehicle or an explosion!! - -[PBOAT_1] -Press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire the boat cannons. - -[PBOAT_2] -Press the ~h~~k~~PED_FIREWEAPON~ button~w~ to fire the boat cannons. - -[DIAB1_B] -This is El Burro of the Diablos. - -[DIAB1_D] -You're new in Liberty, but already you are gaining a reputation on the streets. - -[DIAB1_E] -There's a street race starting by the old school hall near the Callahan Bridge. - -[DIAB1_F] -Get yourself some wheels and first through all the checkpoints wins the prize. - -[HM2_1] -Use the RC buggies to destroy the armored cars. Press the ~h~~k~~PED_FIREWEAPON~ button ~w~to detonate. - -[HM2_1A] -Use the RC buggies to destroy the armored cars. Press the ~h~~k~~PED_FIREWEAPON~ button ~w~to detonate. - -[HM2_2] -~r~You failed to destroy all the armored cars! - -[HM2_6] -~g~Armored Car destroyed! - -[RM3_A] -I know a real important man in town, a soft touch, - -[RM3_H] -with shall we say, exotic tastes and the money to indulge them. - -[RM3_B] -He's involved in a legal matter and the prosecution has some rather embarrassing photos of him - -[RM3_C] -at a morgue party or something. - -[LOVE6_A] -A lesson in business, my friend. - -[LOVE6_E] -If you have a unique commodity, the world and his wife will try to wrestle it from your grasp... - -[LOVE6_C] -SWAT teams have cordoned off the area around my associate and the package. - -[LOVE6_D] -Get over there, pick up the van and act as a decoy. - -[LOVE6_F] -Keep them busy and he should make good his escape. - -[AM3_C] -He's probably out in the bay as you read this! Steal a police boat, and sink his career! - -[FESZ_UC] -CANCEL - -[FEDS_SM] -L1,R1-CHANGE MENU - -[FEDS_AS] -;=-CHANGE SELECTION - -[FEDSAS2] -<>-CHANGE SELECTION - -[FEDS_SS] -L1,R1-CHANGE SELECTION - -[FEDSSC1] -;-FASTER SCROLLING - -[FEDSSC2] -=-STOP SCROLLING - -[MEA2_3] -~g~Bring the car back to the factory. - -[RM1_3] -~r~McAffrey escaped! - -[RM1_4] -~g~You have used all the grenades! Get some more from ammunation! - -[RM1_5] -~g~Go back and torch the safehouse! - -[RM6_4] -~g~Go over to the lockup and collect Ray's stash. - -[RM6_5] -~g~The CIA have the bridge under surveillance, find another route across. - -[HM2_F] -and wreck all their armored stuff. - -[HM_4] -'BULLION RUN' - -[MEA2_B5] -TEXT NO LONGER NEEDED - -[MEA1_B5] -TEXT NO LONGER NEEDED - -[MEA3_B5] -TEXT NO LONGER NEEDED - -[MEA4_B7] -but if you just step into my office... - -[MEA3_B4] -Marty wants to see me? Well it better be quick because I have to get my hair done. - -[KM3_7] -It's a Yakuza trap man! - -[FES_LOF] -Load Failed. - -[FES_SLO] -SAVE FILE - -[FES_ISC] -IS CORRUPTED - -[FESZ_TI] -SAVE Z1 - -[FESZ_SA] -Save game - -[MC_LDFL] -Load Failed! - -[MC_NWRE] -Now Restarting Game. - -[LOVE6_3] -~g~You have ~1~ seconds to return to the Securicar before you fail the mission. - -[LOVE6_4] -~r~You ditched the Decoy Securicar! - -[HELP1] -Stop in the center of the blue marker. - -[HELP12] -Walk into the center of the blue marker to trigger a mission. - -[HJSTAT] -Distance: ~1~.~1~m Height: ~1~.~1~m Flips: ~1~ Rotation: ~1~_ - -[HJSTATW] -Distance: ~1~.~1~m Height: ~1~.~1~m Flips: ~1~ Rotation: ~1~_ And what a great landing! - -[DIAB1_5] -RACE TIME: - -[LOVE3_4] -~r~You destroyed the plane!! - -[F_FAIL1] -Fire Truck mission ended. - -[F_CANC] -~r~Fire Fighter mission cancelled! - -[F_EXTIN] -FIRES: - -[A_COMP1] -Paramedic missions complete! - -[A_CANC] -~r~Paramedic mission cancelled! - -[A_COMP3] -Paramedic missions complete! You will never get tired when running! - -[ATUTOR] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Paramedic missions on or off. - -[ATUTOR3] -Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Paramedic missions on or off. - -[ALEVEL] -Paramedic Mission Level ~1~ - -[A_FAIL1] -Paramedic mission ended. - -[FEST_HA] -Highest Paramedic Mission level - -[A_SAVES] -PEOPLE SAVED: ~1~ - -[C_KILLS] -CRIMINALS KILLED: ~1~ - -[HM1_B] -I got a problem they tryin' to play me. - -[AM2_A] -Salvatore's death comes as pleasurable news, - -[AM2_A2] -you are an efficient killer. I like that in a man. - -[AM2_B] -This is my brother Kenji. - -[AM2_C] -Asuka has a little job for you, but when you're done, drop by my casino and we can talk. - -[AM2_D] -Just like Kenji, always trying to play with my toys. - -[AM2_E] -My police source indicates that the Mafia are watching our interests around the city - -[AM2_E2] -in a bid to track you down. - -[AM2_F] -We cannot continue our operations until they are dealt with. - -[AM2_G] -Take out these spying fools and end this vendetta once and for all. - -[F_START] -~g~Burning vehicle reported in the ~a~ area. Go and extinguish the fire. - -[AM4_1A] -Get to the Phone in West Belleville Park. - -[AM4_1B] -Get to the Phone on Liberty Campus. - -[AM4_1C] -Get to the Phone in South Belleville Park. - -[AM4_1D] -Meet me in the toilet block in the park. - -[HJSTATF] -Distance: ~1~ft Height: ~1~ft Flips: ~1~ Rotation: ~1~_ - -[HJSTAWF] -Distance: ~1~ft Height: ~1~ft Flips: ~1~ Rotation: ~1~_ And what a great landing! - -[HM1_F] -Watch your back though, there'll be Jacks on the street who'll think you're trying to blast them too! - -[HM1_D] -'Nines' is their tag and purple is their flag and each day they rock their colors... - -[HM1_G] -is another day the 'Jacks' look soft. - -[MEA2_B] -and steal some stuff so I could claim on the insurance as you do. - -[TM3_H] -~w~You did good back there kid, real good. - -[TM3_I] -~w~Come on, let's introduce you to the Don. - -[TM3_J] -~w~Heeyyy! Luigi! - -[TM3_K] -~w~Oh my girls have been missing you so long Salvatore, you been away too long. - -[TM3_L] -~w~You tell them that once this unfortunate business is taken care of, - -[TM3_M] -~w~we'll all go down to the club and celebrate, ok? - -[TM3_N] -~w~Here's my boy. - -[TM3_N2] -~w~How you doin' pop? - -[TM3_O] -~w~You got yourself a good woman yet? - -[TM3_P] -~w~Hey, your mother, god bless her soul, would be turning over in her grave - -[TM3_Q] -~w~to see you without a wife. - -[TM3_R] -~w~I know Pop, I'm working on it. - -[TM3_S] -~w~TONI! How's your Momma? - -[TM3_T] -~w~She's a great woman you know. Strong. Firenze. - -[TM3_U] -~w~She's good...fine. - -[TM3_V] -~w~Terrific, Terrific. Now listen you guys, you go inside while I talk to our new friend here. - -[TM3_W] -~w~I see nothing but good things for you my boy... - -[RM1_A] -That scumbag McAffrey, he took more bribes than anyone. - -[RM1_B] -He thinks he's gonna get an honorable discharge if he turns states evidence. - -[RM1_C] -He just squealed! - -[RM4_B] -We gotta shut him up, permanently. - -[RM4_E] -I want him sleeping with the fishes, not eating them. - -[LOVE3_B] -On its approach to the airport tonight, a light aircraft will pass over the bay. - -[LOVE4_D] -Unfortunately the port authorities seized the plane and were stripping it down - -[LOVE4_H] -until I intervened at great personal expense. - -[LOVE4_E] -Cross the bridge to Shoreside Vale and go to Francis International Airport. - -[GTAB_A] -Hey, let's get this out of here. God knows what it is - -[GTAB_B] -but he seems to want it badly enough so it must be worth something. - -[GTAB_C] -Who the Heck! - -[GTAB_D] -YOU! - -[GTAB_E] -Hey take it easy amigo! De nada! De nada! - -[GTAB_F] -I left you pouring your heart out into the gutter! - -[GTAB_G] -Don't shoot amigo. No problem. We all friends. Here, take this. - -[GTAB_H] -Don't be such a pussy! - -[GTAB_I] -We got no choice baby! - -[GTAB_J] -We always got a choice you dumb bastard! - -[GTAB_K] -I'm sorry about that crazy bitch man, they all the same...por favor?? - -[GTAB_L] -So the whore got away. - -[GTAB_M] -But you've done me a favor, - -[GTAB_N] -you're not the only one that has a score to settle with the Cartel, - -[GTAB_O] -this worm killed my brother! - -[GTAB_P] -I never killed no Yakuza! - -[GTAB_Q] -LIAR! We all saw the Cartel assassin. - -[GTAB_R] -We are going to hunt down and kill all you Colombian dogs! - -[GTAB_S] -I'll be operating on our friend here to extract information and a little pleasure. - -[GTAB_T] -You, drop by later, I'm sure I'll require your services. - -[GTAB_U] -Please amigo, don't leave me with her, she psycho chica! Amigo? Hey AMEEEGO!!!...Aiiieeeeaaargghh! - -[LOVE5_A] -You are proving to be a safe investment, a rare thing in these days of false hood. - -[KM3_1] -~g~The Cartel are expecting a Yardie Posse go and steal a Yardie car! Head north you'll find one in Newport. - -[LOVE1_1] -~g~Go 'jack a Colombian gang car, so you can infiltrate the hideout, head north you'll find one in Fort Staunton. - -[FM1_Q1] -~w~You looking for some fun? A little...hmm? Some SPANK? - -[FM1_R] -~w~Hi Chico. Nah, just the usual. - -[FM1_T] -~w~Thanks Chico. See you around. - -[FM1_W] -~w~Alright Fido, you wait here and look after the car while I go and shake my butt alright. - -[FM1_X] -~w~OK Fido, let's get out of here. Wooooh! - -[FM1_Q] -~w~Hey Maria! It's my favorite lady! - -[FM1_S1] -~w~Hey, maybe you should check out the warehouse party at the east end of Atlantic Quays. - -[FM1_U] -~w~Gracias and enjoy. That's good stuff. - -[FM1_V] -~w~C'mon Fido, let's go and check out this party! - -[FM1_SS] -~r~SCANNER: ~g~Four-five to all units: Assist narcotics raid Atlantic Quays... - -[LOVE6_B] -even if they have little understanding as to its true value. - -[TM3_A1] -~r~Joey's Fried! - -[TM3_A2] -~r~Joey and Luigi have been cremated! - -[TM3_A3] -~r~Joey, Luigi and Toni are Toast! - -[FM4_2] -Listen, Salvatore thinks that we're going behind his back, - -[FM4_3] -so he was offering you to the Cartel in order to make a deal. - -[FM4_4] -I couldn't let him do that, I mean the worst thing is, - -[FM4_4B] -it's all my fault... because I told him, we were an item. - -[FM4_5] -Don't ask me why. I don't know. - -[FM4_6] -Look you're a marked man on Mafia turf and I've got to get out of here too. - -[FM4_6B] -I've seen too much killing. Too much blood! - -[FM4_7] -This is a friend of mine ok, she's an old friend.. it's Asuka, she's someone we can trust. - -[FM4_8] -C'mon, Enough of the speeches. - -[FM4_9] -We better get out of here before we get more hysterical Italians wanting less friendly reunions. - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUCER - -[CRED003] -LESLIE BENZIES - -[CRED004] -ART DIRECTOR - -[CRED005] -AARON GARBUT - -[CRED006] -TECHNICAL DIRECTION - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -DESIGN - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -WRITTEN BY - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -CHARACTERS - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMATION & DIRECTION - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -AUTO DESIGN - -[CRED024] -PAUL KUROWSKI - -[CRED025] -ARTISTS - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODERS - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -SCORE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -SOUND DESIGN & MASTERING - -[CRED042] -ALLAN WALKER - -[CRED043] -AUDIO PROGRAMMING - -[CRED044] -RAYMOND USHER - -[CRED045] -TEST MANAGER - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -LEAD TESTERS - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRD050A] -TESTERS - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -TECHNICAL SUPPORT - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -EXECUTIVE PRODUCER - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUCER - -[CRED064] -DAN HOUSER - -[CRED065] -DIRECTOR OF DEVELOPMENT - -[CRED066] -JAMIE KING - -[CRED067] -TECHNICAL PRODUCER - -[CRED068] -GARY J. FOREMAN - -[CRED069] -ASSOCIATE PRODUCER - -[CRED070] -JEREMY POPE - -[CRED071] -MUSIC SUPERVISOR - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VP OF MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -TECHNICAL COORDINATOR - -[CRED088] -BRANDON ROSE - -[CRED089] -QA MANAGER - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -GAME ANALYST - -[CRED094] -RICHARD HUIE - -[CRED095] -TEST TEAM - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -LIBERTY TREE EDITORIAL - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -CUT-SCENES - -[CRED108] -SCRIPT BY DAN HOUSER AND JAMES WORRALL - -[CRED109] -AUDIO DIRECTED BY DAN HOUSER - -[CRED110] -AUDIO PRODUCED BY RENAUD SEBBANE - -[CRED111] -CAST - -[CRED112] -FRANK VINCENT AS SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO AS LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN AS TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT AS JOEY LEONE - -[CRED116] -DEBBI MAZAR AS MARIA - -[CRED117] -KYLE MACLACHLAN AS DONALD LOVE - -[CRED118] -ROBERT LOGGIA AS RAY MACHOWSKI - -[CRED119] -GURU AS 8-BALL - -[CRED120] -SONDRA JAMES AS MOMMA - -[CRED121] -LIANA PAI AS ASUKA - -[CRED122] -LES MAU AS KENJI - -[CRED123] -CYNTHIA FARRELL AS CATALINA - -[CRED124] -AL ESPINOSA AS MIGUEL - -[CRED125] -CHRIS PHILLIPS AS EL BURRO - -[CRED126] -HUNTER PLATIN AS CHICO - -[CRED127] -WALTER MUDU AS D-ICE - -[CRED128] -CURTIS MCCLARIN AS CURTLY - -[CRED129] -BILL FIORE AS DARKEL - -[CRED130] -CHRIS PHILLIPS AS MARTY CHONKS - -[CRED131] -HUNTER PLATIN AS CURLY BOB - -[CRED132] -WALTER MUDU AS KING COURTNEY - -[CRED133] -HUNTER PLATIN AS ONE-ARMED PHIL - -[CRED134] -KIM GURNEY AS MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATED BY - -[CRD136A] -ALEX HORTON - -[CRED137] -DIRECTED BY - -[CRD137A] -NAVID KHONSARI - -[CRED138] -PRODUCED BY - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRED139] -RECORDED AT MODERN UPRISING STUDIOS, BROOKLYN - -[CRED140] -ACTORS - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS. - -[CRED141] -PEDESTRIAN DIALOGUE - -[CRED142] -WRITTEN BY DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRECTED BY CRAIG CONNER, DAN HOUSER AND LAZLOW - -[CRED144] -PRODUCED BY RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -RADIO STATIONS AND MUSIC - -[CRED218] -PRODUCERS FOR DMA DESIGN - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED219] -SOUNDTRACK CO-ORDINATOR - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUCER FOR ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -EDITED BY - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER AND IMAGING WRITTEN BY - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -SPECIAL THANKS TO - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED254] -STUDIO MANAGER - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[CINCAM] -Cinematic Camera - -[KM1_13] -Drive the vehicle into the garage! - -[KM3_14] -~r~You have been spotted the deal is off! - -[EBAL_H] -Wait here man while I go in and talk to Luigi. - -[EBAL_M] -Remember no one messes with my girls! - -[LM2_F] -Then take his car, respray it. - -[LM2_D] -here, here take it. - -[LM1_9] -Hi I'm Misty. - -[LM4_A] -Some Diablo scumbag has been pimping his skuzzy bitches in my backyard. - -[FM2_B] -We got us a rat! - -[FM2_C] -He ain't pimpin' or pushin' so he must be talking. - -[FM3_CC] -~w~Come back brother when you have the money. - -[FEDS_AM] -<>-CHANGE MENU - -[LOVE5_5] -~r~You failed to protect the truck! - -[RM6_6] -~r~Ray is dead! - -[RM6_7] -~r~Ray has missed his flight. - -[RM6_8] -~g~You have left Ray behind, go back and get him. - -[FM1_10] -~g~You have left Maria behind, go back and pick her up. - -[LOVE4_9] -~r~The plane has been destroyed! - -[LOV4_10] -~r~The only lead to where the package has gone has been destroyed! - -[KM2_D] -Needless to say, we must give him the cars as a gift, to repay the debt that I owe him. - -[KM4_B] -The business's fortunate enough to have our protection settle their accounts today. - -[KM2_E] -You must obtain the cars on this list and deliver them to a garage behind the car park in Newport. - -[FM3_8I] -~w~Get a good vantage point then I'll head in when you fire the first shot. - -[LOVE1_B] -Experience has taught me that a man like you can be very loyal for the right price, - -[LOVE1_H] -but groups of men get greedy. - -[LOVE1_C] -A valued resource, an old oriental gentleman I know, - -[LOVE1_I] -has been kept hostage by some South Americans in Aspatria. - -[MEA4_D] -I've agreed to see him... - -[MEA4_B4] -Marty sent you huh? OK, I'm gonna show that creep the meaning of the word business. - -[MEA4_B5] -Carl, hi! i eerr, I need more time to get your money. - -[MEA1_B4] -Ah, Mr Chonks sent you did he. Let's go and pay the fellow a visit. - -[HM5_6] -Let's go crack some skulls... - -[LOVE1_5] -~g~Stop hanging around, get a Colombian Gang car and rescue Love's associate. - -[AS1_D] -~w~Act as the bait, and get the death squads to follow you to Pike Creek - -[AS1_E] -~w~where some of my men will be waiting for them. - -[AS2_C] -~w~The Cartel have a front company, The Kappa Coffee House. - -[AS2_E] -~w~We have no choice but to put these drug stands out of operation. - -[AS2_F] -~w~Smash them to splinters!! - -[AS2_A1] -~w~Miguel certainly has some of that famous Latin stamina. - -[AS2_A2] -~w~I'm quite exhausted. - -[SIREN_3] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[SIREN_4] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[AS3_C] -~w~Eeeeeeyoooo! What IS that gooey yellow stuff? - -[AS3_C1] -~w~Oh hi Babe. - -[AS3_F] -~w~She's got the makings of a natural this girl. - -[AS3_F1] -~w~She's managed to extract this little gem from our guest. - -[AS3_G] -~w~There is a plane coming into Francis International in 2 hours time. - -[AS3_G1] -~w~It is full of Catalina's poison. - -[AS3_H] -~w~You can avoid airport security by getting a boat out to the runway-light buoys - -[AS3_H1] -and shooting the plane down on its approach. - -[AS3_I] -~w~Collect the cargo from the debris and stash it! - -[AS3_J] -~w~Oh you be careful now, OK baby? - -[AS3_K] -~w~Now try the chilli oil..... - -[RM2_F1] -Those Colombians'll be here any minute! - -[RM2_K] -Goddam they're here!! LOCK'N'LOAD!! - -[LOVE2_7] -~g~ Now dump the car! - -[LOVE2_8] -~g~Now get out of Newport! - -[AM1_F] -Salvatore Leone will be leaving Luigi's in about three hours time. (~1~:~1~) - -[LOVE5_C] -I want you to follow him, and make sure both he and my package get to Pike Creek unharmed. - -[FESZ_SR] -Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again. - -[FESZ_FO] -Would you like to format the memory card (PS2) in MEMORY CARD slot 1? - -[FELZ_FO] -Memory card (PS2) in MEMORY CARD slot 1 is unformatted. - -[FES_NOC] -No memory card (PS2) in MEMORY CARD slot 1. - -[FES_LOE] -Load Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again. - -[FES_DEE] -Deleting Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again. - -[SLONFM] -Error formatting memory card (PS2) in MEMORY CARD slot 1. - -[SLONDR] -Insufficient space to save. Please insert a memory card (PS2) with at least 500KB of free space available into MEMORY CARD slot 1. - -[SLNSP] -Insufficient space to save. Please insert a memory card (PS2) with at least 200KB of free space available into MEMORY CARD slot 1. - -[FEFD_WR] -Formatting memory card (PS2) in MEMORY CARD slot 1. Please do not remove the memory card (PS2), reset or switch off the console. - -[FES_ISF] -NOT PRESENT - -[FES_SAG] -PRESENT - -[SLONNO] -No memory card (PS2) in MEMORY CARD slot 1. - -[SLONNF] -Memory card (PS2) in MEMORY CARD slot 1 is unformatted. - -[FESZ_FM] -Memory card (PS2) in MEMORY CARD slot 1 is unformatted. Would you like to format memory card (PS2) in MEMORY CARD slot 1? - -[FESZ_FF] -Format Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again. - -[MCDNSP] -There is insufficient space on the memory card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO) - -[MCGNSP] -There is insufficient space on the memory card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO) - -[FESZ_WR] -Saving data. Please do not remove the memory card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FESZ_OW] -Overwriting data. Please do not remove the memory card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FELD_WR] -Loading data. Please do not remove the memory card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FEDL_WR] -Deleting data. Please do not remove the memory card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[LM2_C] -Luigi said to, to give you this so... - -[LM3_G] -Joey ain't the kind you keep waiting, remember, this is your foot in the door... - -[LM5_E] -Get as many of them as you can before the cops drink away their green. - -[JM5_C] -Alright, there's a car stuffed with a stiff at the cafe near Callahan Point. - -[RM2_B] -We saw action in Nicaragua, back when the country knew what it was doing. - -[RM2_C] -Some Cartel scum roughed him up yesterday, said they'd be back for some of his stock today. - -[RM2_D1] -I'd go myself but the old sciatica's playing up again -cough cough- so, eerr-hhrrmmm, good luck. - -[CATINF1] -~g~Get Catalina! - -[CATINF2] -~g~Follow the chopper to find Catalina. - -[BOATIN1] -Jump into a boat and press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~to get in. - -[BOATIN2] -You can press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~if you are near a boat to get in it. - -[BOATIN3] -Jump into a boat and press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~to get in. - -[BOATIN4] -You can press the ~h~~k~~VEHICLE_ENTER_EXIT~ button ~w~if you are near a boat to get in it. - -[JM6] -'THE GETAWAY' - -[FM1] -'CHAPERONE' - -[JM1] -'MIKE LIPS LAST LUNCH' - -[FM21] -'BOMB DA BASE: ACT I' - -[FM3] -'BOMB DA BASE: ACT II' - -[AM1] -'SAYONARA SALVATORE' - -[AM2] -'UNDER SURVEILLANCE' - -[KM2] -'GRAND THEFT AUTO' - -[AS3] -'S.A.M.' - -[RM2] -'ARMS SHORTAGE' - -[LOVE6] -'DECOY' - -[LOVE1] -'LIBERATOR' - -[RC1] -'DIABLO DESTRUCTION' - -[RC2] -'MAFIA MASSACRE' - -[RC3] -'CASINO CALAMITY' - -[RC4] -'RUMPO RAMPAGE' - -[RM2_E1] -I can't believe those yellow-bellied bastards left me without proper cover again! - -[GREN_1] -The longer you hold the ~h~~k~~PED_FIREWEAPON~ button~w~, the further you will throw the grenade. - -[GREN_2] -The longer you hold the ~h~~k~~PED_FIREWEAPON~ button~w~, the further you will throw the grenade. - -[GREN_3] -The longer you hold the ~h~~k~~PED_FIREWEAPON~ button~w~, the further you will throw the grenade. - -[LOVE4_G] -My property will be waiting for you at the customs hanger in the aircraft's fuselage. - -[KABOOM] -KABOOOM! - -[SPLAT] -SPLAT! - -[PANCAK] -PANCAKED! - -[SOAKED] -SOAKED! - -[HEAD] -Head Radio - -[DBL_CLF] -Double Clef FM - -[FLASHB] -Flashback FM - -[RISE] -Rise FM - -[LIPS] -Lips 106 - -[CHAT] -Chatterbox FM - -[K_JAH] -K-Jah Radio - -[GAM_FM] -Game Radio FM - -[MSX_FM] -MSX FM - -[TUBE1] -When the subway opens you will be able to catch a train to Staunton Island. - -[TUBE2] -When Shoreside Vale opens you will be able to Exit Shoreside Terminal to Francis International Airport. - -[TUBE_2] -To board a subway train, press the ~h~'enter vehicle' button~w~. - -[LEGAL] -~g~Eliminate the criminal threat! - -[GA_2] -New engine and paint job. The cops won't recognize you! - -[LM1_8A] -To earn some extra cash, why not 'borrow' a taxi... - -[TAXIH1] -Stop near a highlighted pedestrian to pick them up then drive them to their destination before the time runs out. - -[LM5_7] -~g~Less than four girls working the ~p~Fuzz Ball~g~ and Luigi won't be happy! - -[KM2_3] -~g~Remember the ~r~cars~g~ have to be in mint condition to be accepted by the ~p~garage~g~. - -[KM5_2] -~g~A Yardie is off the streets. - -[BETRA_A] -Sorry, babe. - -[BETRA_B] -I'm an ambitious girl and you, - -[BETRA_C] -you're just small time. - -[JAILB_Q] -Come on! - -[JAILB_R] -Senor dickhead! - -[JAILB_S] -It's no problem to kill you. - -[JAILB_T] -You gonna be sorry. - -[JAILB_U] -A'right, a'right. Get lost. - -[HELP15] -When on foot press the ~h~~k~~PED_LOOKBEHIND~ button~w~ to ~h~look behind~w~. - -[FEC_LB3] -Look behind - -[FEC_R3] -(R3 button) - -[FES_AFO] -This memory card (PS2) is already formatted. - -[FEA_UP] -; - -[FEA_DO] -= - -[FEA_LE] -< - -[FEA_RI] -> - -[FEDSAS3] -- CHANGE SELECTION - -[FEDSAS4] -;=<> - CHANGE SELECTION - -[SPRAY_4] -Use the ~h~~k~~PED_FIREWEAPON~ button ~w~to fire the water cannon. - -[SPRAY_1] -Use the ~h~~k~~PED_FIREWEAPON~ button ~w~to fire the water cannon. - -[LITTLE] -LITTLE T - -[NICK] -NICK LOVE - -[AM1_10] -~g~Salvatore will be leaving Luigi's at about 0~1~:~1~ - -[FEDS_SE] -/ button - SELECT - -[FEDS_SB] -/ button - SELECT " button - BACK - -[TM4_A] -~w~Oh it's you. TONI ain't here. - -[TM4_A2] -~w~But he left one of his sugary love letters for you. - -[DIAB2_A] -I started my exotic entertainment business with nothing but the sizeable contents of my leather pants! - -[LM5_9] -GIRLS: - -[PERPIC] -Hidden Packages found - -[CO_ONE] -Hidden Package ~1~ of ~1~ - -[LOVE3_3] -~g~The plane has dropped ~1~ of 6 packages. - -[FARE11] -~g~Destination ~w~'Construction site' ~g~in Fort staunton. - -[GA_21] -You cannot store any more cars in this garage. - -[CHEAT1] -Cheat activated - -[CHEAT2] -Weapon cheat - -[CHEAT3] -Health cheat - -[CHEAT4] -Armor cheat - -[CHEAT5] -Wanted level cheat - -[CHEAT6] -Money cheat - -[CHEAT7] -Weather cheat - -[AS1_H] -~r~You failed to lead the Deathsquad into the Yakuza trap!! - -[FEDS_BA] -" button - BACK - -[FED_WIS] -Wide Screen: - -[RAMP_A] -ALL RAMPAGES COMPLETED! - -[USJ_ALL] -ALL UNIQUE STUNTS COMPLETED! - -[FARE23] -~g~Destination ~w~'import export garage' ~g~in Cochrane Dam district - -[L_TRN_1] -You can ride the L-train around Portland. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[L_TRN_2] -You can ride the L-train around Portland. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[S_TRN_1] -You can take the subway trains across Liberty. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[S_TRN_2] -You can take the subway trains across Liberty. Press the~h~ ~k~~VEHICLE_ENTER_EXIT~ button~w~ to ~h~enter ~w~or ~h~exit~w~ a train. - -[AS1_C] -~w~She has three death squads dotted around Liberty, whose sole job is to hunt you down. - -[AS1_G] -~r~All the Yakuza are dead!! - -[JAN] -Jan - -[FEB] -Feb - -[MAR] -Mar - -[APR] -Apr - -[MAY] -May - -[JUN] -Jun - -[JUL] -Jul - -[AUG] -Aug - -[SEP] -Sept - -[OCT] -Oct - -[NOV] -Nov - -[DEC] -Dec - -[DEFDT] ---:---:---- --:--:-- - -[BUGGY] -BUGGIES LEFT: - -[BONUS] -~g~BONUS $~1~ - -[HORN1] -Press the ~h~L3 button ~w~to activate the ~h~horn. - -[HORN2] -Press the ~h~L1 button ~w~to activate the ~h~horn - -[HORN3] -Press the ~h~R1 button ~w~to activate the ~h~horn - -[LM3_1A] -Press the~h~ ~k~~VEHICLE_HORN~ button~w~ to activate the ~h~horn~w~ and let Misty know you are here. - -[LM3_1B] -Press the~h~ ~k~~VEHICLE_HORN~ button~w~ to activate the ~h~horn~w~ and let Misty know you are here. - -[LM3_1C] -Press the~h~ ~k~~VEHICLE_HORN~ button~w~ to activate the ~h~horn~w~ and let Misty know you are here. - -[RADIO_A] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[RADIO_B] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[RADIO_C] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[RADIO_D] -Press the ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ button~w~ to cycle through the ~h~radio stations. - -[FEC_EXV] -Enter and exit vehicle - -[TAXI_M] -'TAXI DRIVER' - -[COP_M] -'VIGILANTE' - -[FIRE_M] -'FIREFIGHTER' - -[AMBUL_M] -'PARAMEDIC' - -[HJ_IS] -INSANE STUNT BONUS: $~1~ - -[HJ_PIS] -PERFECT INSANE STUNT BONUS: $~1~ - -[HJ_DIS] -DOUBLE INSANE STUNT BONUS: $~1~ - -[HJ_PDIS] -PERFECT DOUBLE INSANE STUNT BONUS: $~1~ - -[HJ_TIS] -TRIPLE INSANE STUNT BONUS: $~1~ - -[HJ_PTIS] -PERFECT TRIPLE INSANE STUNT BONUS: $~1~ - -[HJ_QIS] -QUADRUPLE INSANE STUNT BONUS: $~1~ - -[HJ_PQIS] -PERFECT QUADRUPLE INSANE STUNT BONUS: $~1~ - -[AM1_K] -Salvatore Leone will be leaving Luigi's in about three hours time. (0~1~:~1~) - -[IMPEXPP] -Import/Export garage, Portland Harbor. We have orders for various vehicles. Check our notice board for our requirements. - -[VANHSTP] -Any more Securicars you want cracked? Bring them to our garage in the Portland Harbor. - -[EMVHPUP] -Great rates paid for new and used Emergency Vehicles. Bring them to the crane in the north east of Portland Harbor. - -[STANDS] -STALLS WRECKED: - -[STASH] -~g~Stash the SPANK back at the ~p~construction site! - -[MCSTNS] -There is no memory card (PS2) in MEMORY CARD slot 1. Do you wish to start? (YES or NO) - -[LOVE3_5] -~g~The plane is now in range. - -[LOVE3_6] -~r~The Police got to the packages first! - -[SIREN_1] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[SIREN_2] -To turn on this vehicle's sirens tap the ~h~~k~~VEHICLE_HORN~ button~w~. - -[FM3_8C] -~w~I'll need $100,000 to cover expenses, - -[MCLOAD] -Loading Data. Please do not remove the memory card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FES_GME] -Error Reading memory card (PS2) in MEMORY CARD slot 1 please check and try again. - -[FESZ_QF] -Are you sure you wish to format the memory card (PS2) in MEMORY CARD slot 1? - -[FESZ_LS] -Load Successful. - -[RM3_5] -~g~You have ~1~ of 6 evidence packages. - -[LOVE3_2] -~g~You have all the packages! Take them back to Donald Love. - -[LOVE4_4] -~g~Take the package back to Donald Love! - -[FEB_SAV] -Load - -[FEP_SAV] -LOAD GAME - -[AS2_12A] -~g~After you trash the first stall, you will have 8 minutes before the Cartel warn their pushers! - -[AS3_1A] -~g~Now get to the ~b~marker buoy! - -[NOCONT] -Please reconnect analog controller (DUALSHOCK#) or analog controller (DUALSHOCK#2) to controller port 1 to continue - -[BET_JB] -BETRAYED BY HIS LOVER CATALINA AND LEFT FOR DEAD. CONVICTED AND SENTENCED, HE BEGINS HIS JOURNEY TO LIBERTY CITY PENITENTIARY. BUT ONLY ONE THOUGHT BURNS IN HIS CRIMINAL MIND......REVENGE! - -[END_A] -Residents in Cedar Grove have been coming to terms - -[END_B] -with the emotional aftermath of a full blown war - -[END_C] -that hit the area yesterday. - -[END_D] -Local resident, Clive Denver described to police - -[END_E] -a single gunman that he saw fleeing the scene, with a dark haired woman. - -[END_F] -Oh, you know, we're gonna have such fun, 'cos you know, you know, - -[END_G] -I love you, I, I, I, I really do, 'cos you're such a big strong man - -[END_H] -and that's just what I need. - -[END_I] -Anyway, what was I saying? - -[END_J] -Oh, you know, I forget. But you know what it's like, don't you? - -[END_K] -The sound of explosions shook nearby homes as people ran for cover. - -[END_L] -Several citizens were injured in the panic as ground fire was exchanged - -[END_M] -between ground forces and a helicopter circling the dam. - -[END_N] -Yeah, we got a good view from down here in the gardens. - -[END_O] -When the 'copter finally got taken out, - -[END_P] -better than the fireworks on the 4th of July. - -[END_Q] -With the death toll already over twenty, - -[END_R] -police are still finding bodies. - -[END_S] -There have been no official denials concerning rumours - -[END_T] -that the dead were members of the Colombian Cartel, - -[END_U] -and still no leads as to the cause of the massacre. - -[END_V] -I broke a nail and my hair is ruined, I mean can you believe it? - -[END_W] -This one cost me fifty dollars... - -[PAPER1] -* - -[PAPER2] -* - -[PAPER3] -* - -[JAILB_V] -* - -[JAILB_A] -* - -[JAILB_B] -* - -[JAILB_C] -* - -[JAILB_E] -* - -[JAILB_F] -* - -[JAILB_G] -* - -[JAILB_I] -* - -[JAILB_W] -* - -[JAILB_K] -* - -[JAILB_L] -* - -[JAILB_X] -* - -[JAILB_M] -* - -[JAILB_N] -* - -[JAILB_O] -* - -[JAILB_P] -* - -[JAILB_D] -* - -[JAILB_H] -* - -[JAILB_J] -* - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file diff --git a/utils/gxt/french.txt b/utils/gxt/french.txt deleted file mode 100644 index a6bbc0fd..00000000 --- a/utils/gxt/french.txt +++ /dev/null @@ -1,8211 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- - -[IN_VEH] -~g~Hé! Retourne dans ta caisse! - -[IN_VEH2] -~g~T'as besoin d'une caisse pour cette mission! - -[IN_BOAT] -~g~T'as besoin d'un bateau pour cette mission! - -[HEY] -~g~Te la joue pas perso, pense à tes potes! - -[HEY2] -~g~Restez groupés! - -[HEY3] -~g~T'as perdu ton meilleur homme, retournes-y et ramène-le! - -[HEY4] -~g~Perds Misty, et Luigi te fera sauter la tête ! Alors, retourne la chercher! - -[HEY5] -~g~L'une des filles manque à l'appel! Retourne la chercher! - -[HEY6] -~g~Ton honneur est lié à celui du Yakuza Kanbu. Tu dois le protéger! - -[HEY7] -~g~Un flingue de plus ferait pas de mal! Retourne en arrière et embarque ton contact! - -[HEY8] -~g~Dans protection, y'a protection, compris ? Alors protège le vieux bridé! - -[HEY9] -~g~Tu veux savoir ce qui se passe dans la rue ? Ben va voir ton contact! - -[HELP2_A] -Appuie sur la ~h~touche /~w~ quand tu cours pour piquer un ~h~sprint. - -[HELP3] -Tu ne peux sprinter que pendant une courte durée, avant d'être claqué! - -[HELP4_A] -Appuie sur la ~h~touche ~k~~VEHICLE_ACCELERATE~~w~ pour ~h~accélérer. - -[HELP4_D] -Pousse le ~h~stick analogique de droit~w~ vers le haut pour accélérer. - -[HELP5_A] -Appuie sur la~h~ touche ~k~~VEHICLE_BRAKE~~w~ pour ~h~freiner~w~ ou pour ~h~passer la marche arrière~w~ si ta caisse est à l'arrêt. - -[HELP5_D] -Pousse le ~h~stick analogique de droit~w~ vers le bas pour ~h~freiner~w~ ou pour ~h~passer la marche arrière~w~ si ta caisse est à l'arrêt. - -[HELP6_A] -Appuie sur la ~h~touche ~k~~VEHICLE_HANDBRAKE~~w~ pour utiliser le ~h~frein à main du véhicule. - -[HELP6_C] -Appuie sur la ~h~touche ~k~~VEHICLE_HANDBRAKE~~w~ pour utiliser le ~h~frein à main du véhicule. - -[HELP6_D] -Appuie sur la ~h~touche ~k~~VEHICLE_HANDBRAKE~~w~ pour utiliser le ~h~frein à main du caisse. - -[HELP7_A] -Maintiens la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée pour ~h~viser~w~ avec le fusil à lunette. - -[HELP7_D] -Maintiens la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée pour ~h~viser~w~ avec le fusil à lunette. - -[HELP8_A] -Appuie sur la ~h~touche ~k~~PED_SNIPER_ZOOM_IN~~w~ pour faire un ~h~zoom avant~w~ avec le fusil et sur la ~h~touche ~k~~PED_SNIPER_ZOOM_OUT~~w~ pour faire un ~h~zoom arrière~w~. - -[HELP9_A] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~tirer~w~ au fusil à lunette. - -[HELP10] -Ce badge t'indique que la police te recherche. - -[HELP11] -Plus il y a de badges, plus il y a de flics à tes trousses. - -[HELP13] -Tu as parfois intérêt à utiliser des chemins qui n'apparaissent pas sur le radar. - -[TIMER] -C'est une mission en temps limité, alors il faut la finir avant que le compte à rebours arrive à zéro! - -[MISTY1] -~r~Misty bouffe les pissenlits par la racine! - -[OUT_VEH] -~g~Sors du véhicule! - -[GARAGE] -Conduis ta caisse dans le garage et repars à pied. - -[WANTED1] -~g~Largue les flics pour en avoir moins à tes basques! - -[NODOORS] -~g~Hé, c'est pas des sardines! Trouve une caisse avec assez de sièges! - -[TRASH] -~g~T'as vachement bousillé ta bagnole ! Fais-la réparer ! - -[WRECKED] -~r~Le caisse est fortue! - -[HORN] -~g~Klaxonne! - -[HORN4] -Appuie sur la ~h~touche L3~w~ pour ~h~klaxonner. - -[NOMONEY] -~g~T'as besoin de thune! - -[OUTTIME] -~r~T'es lent, mec, t'es trop lent! - -[SPOTTED] -~r~Ils en ont après ta peau! - -[REWARD] -~1~$ de récompense - -[GAMEOVR] -FIN DE PARTIE - -[Z] -Valeur axe Z : ~1~ - -[M_FAIL] -ECHEC DE LA MISSION! - -[M_PASS] -MISSION REUSSIE! ~1~$ - -[O_PASS] -PETIT BOULOT REUSSI! - -[O_FAIL] -PETIT BOULOT RATE! - -[DEAD] -T'ES MORT! - -[BUSTED] -TU T'ES FAIT COFFRER! - -[S_PROMP] -Si tu n'es pas en mission, tu peux ~h~sauvegarder le jeu ici~w~, ça fera avancer la montre de six heures. - -[NUMBER] -~1~ - -[SCORE] -~1~$ - -[LOADCAR] -CHARGEMENT DU VEHICULE... - -[CARSOFF] -Trafic désactivé - -[CARS_ON] -Trafic activé - -[TEXTXYZ] -Ecriture des coordonnées sur le fichier... - -[CHEATON] -Mode Triche activé - -[CHEATOF] -Fonction tricher OFF - -[UZI_IN] -L'Uzi est disponible maintenant à Ammu-Nation! - -[IMPORT1] -Va dehors et attends ton véhicule. - -[PAGEB1] -Pistolet livré à la planque. - -[PAGEB2] -Uzi livré à la planque. - -[PAGEB3] -Armure livrée à la planque. - -[PAGEB4] -Fusil à pompe livré à la planque. - -[PAGEB5] -Grenades livrées à la planque. - -[PAGEB6] -Cokctails molotov livrés à la planque. - -[PAGEB7] -AK47 livré à la planque. - -[PAGEB8] -Fusil à lunette livré à la planque. - -[PAGEB9] -M16 livré à la planque. - -[PAGEB10] -Lance-roquettes livré à la planque. - -[PAGEB11] -Lance-flammes livré à la planque. - -[WANT_A] -Tu ne seras arrêté que si tu possèdes un ~h~indice de recherche. - -[WANT_B] -Ton ~h~indice de recherche~w~ est symbolisé par les étoiles dans le coin supérieur droit de l'écran. - -[WANT_C] -Ton ~h~indice de recherche~w~ est de 1... - -[WANT_D] -2... - -[WANT_E] -3... - -[WANT_F] -Plus ton ~h~indice de recherche~w~ augmente, plus les forces de l'ordre t'en veulent. - -[WANT_G] -Quand tu te fais ~h~choper~w~, tu es amené au poste de police le plus proche. - -[WANT_H] -Les flics se laisseront corrompre contre tes armes et une partie de ton oseille. - -[WANT_I] -Toute mission en cours sera automatiquement un échec. - -[WANT_J] -Plus tu joueras, plus tu trouveras de moyens de diminuer ton indice de recherche. - -[WANT_K] -En voiture, les ~h~ateliers de peinture~w~ te permettront d'~h~enrayer ton indice de recherche. - -[HEAL_B] -Quand tu es ~h~H.S.~w~, t'es amené à l'hosto le plus proche. - -[HEAL_C] -On te confisque alors toute ton artillerie et les toubibs te pompent ton flouze pour recoller les bouts. - -[HEAL_E] -En jouant, tu trouveras d'autres moyens de te soigner ou de te protéger. - -[DAM] -DEGATS : - -[KILLS] -VICTIMES : - -[FARES] -FRAIS : - -[BULL] -FRIC : - -[EVID] -PREUVES : - -[HEALTH] -ETAT DU VEHICULE : - -[COLLECT] -RECUPERE : - -[BOMB] -Conduis ton véhicule chez l'artificier et piège-le avec une ~h~bombe~w~. Coût - ~h~1.000 dollars. - -[SAVE1] -Franchis la porte pour ~h~sauvegarder la partie~w~. Tu ne peux pas sauvegarder en cours de mission. - -[SAVE2] -Tout véhicule laissé dans ce garage sera enregistré lors de la sauvegarde. - -[AMMU] -Va chez Ma-Gnum pour acheter une arme. - -[BRIDGE1] -Quand le pont Callahan sera réparé, tu pourras te rendre à l'île Staunton . - -[TUNNEL] -Quand le tunnel Porter aura réouvert, tu pourras te rendre à l'île Staunton . - -[LUIGI] -MISSIONS DE LUIGI - -[TONI] -MISSIONS DE TONI - -[JOEY] -MISSIONS DE JOEY - -[FRANK] -MISSIONS DE SALVATORE - -[DIABLO] -MISSIONS DE DIABLO - -[ASUKA] -MISSIONS D'ASUKA - -[B_SITE] -MISSIONS DE BANLIEUE D'ASUKA - -[KENJI] -MISSIONS DE KENJI - -[RAY] -MISSIONS DE RAY - -[LOVE] -MISSIONS DE LOVE - -[YARDIE] -MISSIONS DE YARDIE - -[HOOD] -MISSIONS DE HOOD - -[CITYZON] -Liberty City - -[IND_ZON] -Portland - -[PORT_W] -Point Callahan - -[PORT_S] -Atlantic Quays - -[PORT_E] -Port de Portland - -[PORT_I] -Trenton - -[S_VIEW] -Vue de Portland - -[CHINA] -Chinatown - -[EASTBAY] -Plage de Portland - -[LITTLEI] -Saint Mark's - -[REDLIGH] -Le Quartier Rouge - -[TOWERS] -Hauteurs de Hepburn - -[HARWOOD] -Harwood - -[ROADBR1] -Pont Callahan - -[ROADBR2] -Pont Callahan - -[TUNNELP] -Tunnel Porter - -[BOMB1] -Garage de 8-Ball - -[COM_ZON] -Ile de Staunton - -[STADIUM] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Campus Liberty - -[CONSTRU] -Fort Staunton - -[PARK] -Parc Belleville - -[COM_EAS] -Newport - -[SHOPING] -Point Bedford - -[YAKUSA] -Torrington - -[SUB_ZON] -Vallée Shoreside - -[AIRPORT] -Aéroport intl. Francis - -[PROJECT] -Jardins Wichita - -[SUB_IND] -Crique de Pike - -[SWANKS] -Bosquet Cedar - -[BIG_DAM] -Ecluse Cochrane - -[SUB_ZO2] -Vallée Shoreside - -[SUB_ZO3] -Vallée Shoreside - -[CAR_1] -Ambulance - -[CAR_2] -Camion de pompier - -[CAR_3] -Voiture de police - -[CAR_4] -Enforcer - -[CAR_5] -Barraquements - -[CAR_6] -Rhino - -[CAR_7] -Voiture du FBI - -[CAR_8] -Sécuricar - -[CAR_9] -Moonbeam - -[CAR_10] -Autobus - -[CAR_11] -Camion - -[CAR_12] -Linerunner - -[CAR_13] -Camion-poubelle - -[CAR_14] -Patriot - -[CAR_15] -M. Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinelle - -[CAR_25] -Guépard - -[CAR_26] -Banshee - -[CAR_27] -Stinger - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_30] -Kuruma - -[CAR_31] -Stretch - -[CAR_32] -Perennial - -[CAR_33] -Tout-terrain - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Etalon - -[CAR_37] -Taxi - -[CAR_38] -Tacot - -[CAR_39] -Buggy - -[LUIGIS] -Chez Luigi - -[GOAWAY] -~g~T'es déjà en mission, imbécile! - -[LUIGGO] -~g~Luigi fait passer un entretien à de nouvelles filles. Reviens plus tard! - -[JOEYGO] -~g~Joey est en ville avec Misty. Repasse plus tard! - -[TONIGO] -~g~Toni a emmené sa mère à l'opéra. Rappelle plus tard! - -[KEMUGO] -~g~Maria et Kenuri sont occupés. Reviens un peu plus tard! - -[KENJGO] -~g~Kenji est à un congrès de Yakuzas. Repasse plus tard. - -[RAYGO] -Ray a autre chose à faire que de voir ta tronche. Va faire un tour! - -[LOVEGO] -~g~Donald Love a d'autres chats à fouetter. Prends rendez-vous la prochaine fois! - -[KENSGO] -~g~Kenji est occupé. Repasse à un autre moment. - -[ASUSGO] -~g~Asuka n'est pas dispo pour l'instant. - -[HOODGO] -~g~Les Hoods ne sont pas là pour le moment. - -[WRONGT1] -~g~Repasse entre 05:00 et 21:00 pour du boulot. - -[WRONGT2] -~g~Repasse entre 06:00 et 14:00 pour du taf. - -[WRONGT3] -~g~Ramène ta fraise entre 15:00 et 00:00 pour bosser. - -[GUN_1A] -Sers-toi de la ~h~touche ~k~~PED_CYCLE_WEAPON_RIGHT~~w~ et de la ~h~touche ~k~~PED_CYCLE_WEAPON_LEFT~~w~ pour faire défiler tes armes. - -[GUN_2A] -Maintiens la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée pour ~h~viser automatiquement~w~ tes ennemis et appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer. Entraîne-toi sur les cibles... - -[GUN_2C] -Maintiens la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée pour ~h~viser automatiquement~w~ tes ennemis et appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer. Entraîne-toi sur les cibles... - -[GUN_2D] -Maintiens la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée pour ~h~viser automatiquement~w~ tes ennemis et appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer. Entraîne-toi sur les cibles... - -[GUN_3A] -Tout en appuyant sur la ~h~touche ~k~~PED_LOCK_TARGET~~w~, appuie sur la ~h~touche ~k~~PED_CYCLE_TARGET_LEFT~~w~ ou la ~h~touche ~k~~PED_CYCLE_TARGET_RIGHT~~w~ pour changer de cible. - -[GUN_3B] -Tout en appuyant sur la ~h~touche ~k~~PED_LOCK_TARGET~~w~, appuie sur la ~h~touche ~k~~PED_CYCLE_TARGET_LEFT~~w~ ou la ~h~touche ~k~~PED_CYCLE_TARGET_RIGHT~~w~ pour changer de cible. - -[GUN_4A] -Tu peux marcher ou courir tout en gardant la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée afin de verrouiller une cible. - -[GUN_4B] -Tu peux marcher ou courir tout en gardant la ~h~touche ~k~~PED_LOCK_TARGET~~w~ enfoncée afin de verrouiller une cible. - -[GUN_5] -Tu peux t'entraîner à cibler et tirer sur ces cibles en papier. Quand tu as finis, reprends ta mission. - -[TAXI1] -~g~Cherche une course. - -[FARE1] -~g~Destination : ~w~Le 'Club Sex Meeouch'~g~ dans Le Quartier Rouge. - -[FARE2] -~g~Destination : ~w~'Pribas'~g~ au Belvédère de Portland. - -[FARE3] -~g~Destination : ~w~la 'Vieille Ecole'~g~ à Chinatown. - -[FARE4] -~g~Destination : ~w~le 'Cafe greasy Joes' ~g~au Point Callahan. - -[FARE5] -~g~Destination : ~w~'AmmuNation'~g~ dans Le Quartier Rouge. - -[FARE6] -~g~Destination : ~w~'Caisses à crédit'~g~ à Saint Mark's. - -[FARE7] -~g~Destination : ~w~le 'Woody's topless bar' ~g~ dans le Quartier Rouge. - -[FARE8] -~g~Destination : ~w~le 'Bistro de Marco'~g~ à Saint Mark's. - -[FARE9] -~g~Destination : ~w~le 'Garage import export' ~g~au Port de Portland. - -[FARE10] -~g~Destination : ~w~'Têtes de Punk' ~g~ à Chinatown. - -[FARE12] -~g~Destination : ~w~le 'Stade de Football'~g~ à Aspatria. - -[FARE13] -~g~Destination : ~w~'L'église'~g~ au Point Bedford. - -[FARE14] -~g~Destination : ~w~'Le Casino'~g~ à Torrington. - -[FARE15] -~g~Destination : ~w~'Université de Liberty'~g~ au Campus Liberty. - -[FARE16] -~g~Destination : ~w~le 'Centre commercial~g~ dans le coin du Parc Belleville. - -[FARE17] -~g~Destination : ~w~le 'Musée'~g~ de Newport - -[FARE18] -~g~Destination : ~w~le 'Bâtiment Am'~g~ de Torrington. - -[FARE19] -~g~Destination : ~w~'Burgers bourgeois'~g~ à Point Bedford. - -[FARE20] -~g~Destination : ~w~'Le parc'~g~ à Belleville. - -[FARE21] -~g~Destination : ~w~'Aéroport internationnal Francis'~g~. - -[FARE22] -~g~Destination : ~w~'l'écluse de Cochrane'~g~. - -[FARE24] -~g~Destination : ~w~'L'hôpital'~g~ de la Crique Pike. - -[FARE25] -~g~Destination : ~w~le 'Parc'~g~ à la vallée Shoreside. - -[FARE26] -~g~Destination : ~w~les 'Tours North West'~g~ des jardins Wichita. - -[NEW_TAX] -PLUS GROS! PLUS RAPIDES! PLUS SOLIDES! Les taxis Borgnine s'installent à Harwood. Contactez-les dès aujourd'hui au 555-Borgnine! - -[TSCORE2] -~1~$ - -[IN_ROW] -~1~ DE SUITE! Bonus : ~1~$ - -[TTUTOR] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver l'affichage des missions taxi. - -[TTUTOR2] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver l'affichage des missions taxi. - -[ATUTOR2] -~g~Conduis les patients à l'hôpital. DOUCEMENT. Chaque secousse réduit leurs chances de survie. - -[A_TIME] -+~1~ secondes. - -[A_FULL] -~r~Ambulance pleine! - -[A_RANGE] -~g~La radio de l'ambulance ne capte plus rien. Rapproche-toi d'un hôpital! - -[FTUTOR] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions camion de pompier. - -[FTUTOR2] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions camion de pompier. - -[F_PASS1] -Feu éteint! - -[F_RANGE] -~g~La radio du camion de pompier ne capte plus rien. Rapproche-toi d'une caserne de pompiers! - -[C_BREIF] -~g~Suspect aperçu pour la dernière fois dans le secteur : ~a~. - -[C_RANGE] -~g~La radio de la voiture de police ne capte plus rien. Rapproche-toi d'un poste de police! - -[DODO_FT] -Tu as 'volé' pendant ~1~ secondes! - -[EBAL_A] -Je connais un coin dans Le Quartier Rouge où on pourra se planquer, - -[EBAL_A1] -faut que tu prennes le volant, mes mains tremblent trop. - -[EBAL_1] -Appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour ~h~monter~w~ ou ~h~sortir~w~ d'un véhicule. - -[EBAL_1B] -Appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour ~h~monter~w~ ou ~h~sortir~w~ d'un véhicule. - -[EBAL_2] -~g~Remonte dans la bagnole! - -[EBAL_3] -C'est le ~h~radar~w~. Utilise-le pour te repérer dans la ville, et suis le ~h~symbole~w~ sur le ~h~radar~w~ pour trouver la planque! - -[EBAL_D] -Je connais un mec qu'a des relations. Il s'appelle Luigi. - -[EBAL_D1] -On est pote, alors il pourra certainement te trouver du boulot. Viens, on y va. - -[EBAL_E] -Allez, viens, on va y faire un tour, histoire de te présenter. - -[EBAL_I] -Le patron viendra bientôt vous voir... - -[EBAL_J] -8-Ball a des trucs à faire en haut. - -[EBAL_K] -Tu peux peut-être me rendre un service. - -[EBAL_L] -Une de mes filles a besoin d'un taxi. Tire une bagnole et va chercher Misty à la clinique. Ensuite, ramène-la ici. - -[EBAL_N] -Et garde bien tes mains sur le volant, compris ? - -[EBAL_4] -~r~8-Ball est mort! - -[EBAL_5] -~g~Prenez une caisse! - -[EBAL_6] -~g~Va chercher Misty! - -[LM1] -'LES FILLES DE LUIGI' - -[LM2] -'PAS DE SPANK POUR LA PEPEE' - -[LM3] -'LA MYSTERIEUSE MISTY' - -[LM5] -'LE BAL A BALLES' - -[LM1_2] -~g~Emmène Misty au club de Luigi. - -[LM1_3] -~g~Klaxonne pour faire monter la fille. - -[LM1_6] -~g~Rentre dans la caisse! - -[LM1_7] -Arrête la bagnole près de Misty et laisse-la monter à bord. - -[LM1_8] -Tu peux retourner voir Luigi pour le boulot, ou visiter Liberty City. - -[LM2_A] -Y'a une nouvelle saloperie sur le marché. Ca s'appelle la SPANK. - -[LM2_E] -Un petit malin fourgue cette merde à mes filles du Port de Portland. - -[LM2_B] -Va lui foutre une raclée! - -[LM2_G] -Je me vengerai! - -[LM2_1] -~g~Pique sa caisse et fais-la repeindre. - -[LM2_2A] -Sers-toi de la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~donner un coup de poing~w~, ~h~un coup de pied~w~ ou un ~h~coup de batte~w~. - -[LM2_2C] -Sers-toi de la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~donner un coup de poing~w~, ~h~un coup de pied~w~ ou un ~h~coup de batte~w~. - -[LM2_2D] -Sers-toi de la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~donner un coup de poing~w~, ~h~un coup de pied~w~ ou un ~h~coup de batte~w~. - -[LM2_3] -~g~Planque la bagnole dans le garage de Luigi! - -[LM2_4] -~g~Repeins la bagnole! - -[LM3_A] -Hé, faut que je te cause... OK, Mick, je te parle plus tard. - -[LM3_B] -Comment ça va, gamin ? - -[LM3_C] -Le fils du Don, Joey Leone, il veut voir sa régulière, Misty. - -[LM3_D] -Va la chercher à Hauteurs de Hepburn... - -[LM3_E] -Mais fais gaffe, c'est le territoire de Diablo. - -[LM3_F] -Amène-la ensuite au garage de joey, à Trenton et vite! - -[LM3_H] -Donc tes yeux, ils regardent la route et pas Misty, ok ? - -[LM3_1D] -Appuie sur la ~h~touche L3~w~ pour ~h~klaxonner~w~ et indiquer à Misty que tu es là. - -[LM3_2] -~g~Emmène Misty chez Joey! - -[LM3_4] -~g~Va chercher Misty! - -[LM3_5] -Tu bosses pour Luigi, hein ? Il était temps qu'il se trouve un chauffeur digne de confiance. - -[LM3_7] -Je suis à toi dans une minute, poupée. - -[LM3_10] -~g~Trouve une caisse! - -[LM4_B] -Va t'occuper de cette affaire pour moi. - -[LM4_C] -Si t'as besoin d'un calibre, va derrière Ammu-Nation en face du métro. - -[LM5_A] -Le Bal de la police a lieu dans la vieille école près du Pont de Callahan. - -[LM5_B] -Alors les flics auront besoin d'action à l'ancienne! - -[LM5_C] -J'ai des filles partout dans les rues. - -[LM5_D] -Emmène-les au bal, histoire de faire d'une pierre deux coups : profit et détente! - -[LM5_1] -~g~Si tu les serres trop, elles vont avoir des bleus! ~g~Livre d'abord celles-la et reviens en chercher d'autres. - -[LM5_2] -~r~L'une des filles de Luigi est bonne pour la morgue! - -[LM5_3] -~g~T'as besoin d'un véhicule! - -[LM5_4] -~g~Va ramasser les filles qui tapinent à St. Mark's. - -[LM5_5] -~g~Emmène les filles au bal! - -[LM5_8] -~g~Filles au bal : ~1~ - -[JM2] -'AU REVOIR LEE' - -[JM4] -'LE CHAUFFEUR DE MONSIEUR' - -[JM5] -'TRANSPORT DE MARCHANDISES AVARIEES' - -[JM1_1] -~g~Amène la voiture de Forelli au garage de 8-Ball, au nord, derrière 'Caisses à crédit'. - -[JM1_2] -~g~Ramène la bagnole au Bistro de Marco. - -[JM1_3] -~g~Arme la bombe et CASSE-TOI EN VITESSE! - -[JM1_4] -~g~T'as bousillé la caisse! Fais-la réparer! - -[JM1_5] -~g~T'as pas armé la bombe! - -[JM1_6] -~g~Gare la bagnole correctement! - -[JM1_8A] -~y~Hé, c'est mon gars préféré! - -[JM1_8B] -~y~Chez l'artifier, tout est automatique. T'amènes la voiture, tu la gares, et le reste se fait tout seul! - -[JM1_8C] -~y~Viens, le premier est gratuit, mais juste le premier, compris ? - -[JM2_A] -Chunky Lee Chong fout la merde avec la Spank pour un nouveau gang de Colombie... ou du Colorado... un coin comme ça... - -[JM2_B] -J'en sais rien. On s'en fout, après tout. - -[JM2_D] -Il a dépassé les bornes! - -[JM2_E] -Il faut lui régler son compte! - -[JM2_G] -Débrouille-toi avec un 9 mm, tu sais où il se trouve, non ? - -[JM2_H] -Et souviens-toi : fais gaffe à Chinatown, c'est le territoire de la Triade. - -[JM3_A] -Bon, on va s'attaquer à un fourgon blindé. - -[JM3_B] -Il part de Chinatown tous les jours. - -[JM3_C] -Les balles traverseront pas son blindage, alors vole une caisse et rentre-lui dedans. - -[JM3_D] -Cogne bien fort et les larbins de sécurité devraient pas demander leur reste! - -[JM3_E] -Ensuite, t'emmènes le fourgon à l'entrepôt des docks et mes gars prennent le relais. - -[JM3_F] -Mais bon, ils vont pas faire leur ronde toute la journée, alors traîne pas en route! - -[JM3_1] -~g~Emmène le fourgon à la planque. - -[JM3_2] -~g~Fonce dans le fourgon jusqu'à ce que ses dégâts soient inférieurs à 70%. - -[JM4_B] -Hé! C'est le gars dont je te parlais! - -[JM4_C] -Ok. Ce gars, c'est pas un Italien, c'est pas un mécano, mais il peut réparer les choses. - -[JM4_D] -C'est Pops Capo, Toni Cipriani. - -[JM4_E] -Ouais, je suis Toni Cipriani. - -[JM4_F] -Emmène-le au resto de la Mamma, à St Mark's, ok ? - -[JM4_G] -Maintenant, écoute. Je prépare un truc et j'ai besoin d'un bon conducteur. Alors, passe me voir, ok ? - -[JM4_2] -Attends-moi ici. Et laisse tourner le moulin. C'est pas une visite de courtoisie. - -[JM4_3] -Une embuscade de la Triade! Sors-nous d'ici, gamin! - -[JM4_4] -La Triade pense qu'elle peut s'attaquer à moi! Hum! Tu te rends compte, A MOI! - -[JM4_6] -Hé, fais gaffe à la bagnole! J'ai dit pas de lézards! - -[JM4_7] -~g~Emmène Toni au restaurant de la Mamma. - -[JM4_8] -~r~Toni sert d'engrais aux chrisantèmes! - -[JM5_A] -Magnifique! Réellement magnifique! - -[JM5_B] -Très bien, c'est l'homme qu'il me fallait! - -[JM5_D] -Un des Forelli s'est cru un peu trop malin et il en a pris pour son grade! - -[JM5_E] -Emmène le corps au broyeur de Harwood, ok ? - -[JM5_1] -~g~Emmène-le au broyeur! - -[JM5_2] -~g~C'est les frères Forelli! - -[JM6_A] -Joli morceau, hein? - -[JM6_B] -Ok, écoute : choisis une caisse dans l'entrepôt de Saint Mark's et va chercher quelques potes à moi. - -[JM6_C] -Il font un retrait à la banque et ils ont besoin d'un taxi. - -[JM6_D] -J'ai dit que tu ferais parfaitement l'affaire, alors me déçois pas! - -[JM6_E] -Amène-les à la banque avant 5 heures, et sois pas en retard! - -[JM6_2] -Laisse le moulin tourner, y'en a pas pour longtemps! - -[JM6_3] -Sors-nous de là! - -[JM6_4] -Débarrasse-toi des poulets et amène-nous à l'entrepôt! - -[JM6_6] -~g~Va voler une caisse moins voyante! - -[JM6_7] -~g~Faut que tu prennes les 3 pour voler la banque! - -[TM1] -'LINGE SALE' - -[TM2] -'LA LIVRAISON' - -[TM3] -'LA RENCONTRE' - -[TM4] -'LE TRIANGLE DES TRIADES' - -[TM5] -'LA HUITIEME PLAIE' - -[TONI_P] -J'ai un boulot urgent pour toi! - -[TM1_A] -~w~Assieds-toi, gamin. Prends une de ces putains de chaises. - -[TM1_B] -~w~Alors, la laverie veut pas payer pour sa protection, hein ? - -[TM1_C] -~w~La Triade pense qu'elle peut se mêler de mes affaires ? - -[TM1_D] -~w~On va apprendre à ces faux durs ce que c'est que des vrais hommes! - -[TM1_E] -~w~Ouais, on va leur apprendre à nous respecter! Aucun de mes gars ne se laisse intimider par une Triade minable! - -[TM1_F] -~w~Ton père, qu'il repose en paix, se laissait pas faire par les Triades, à l'époque, en Sicile! - -[TM1_G] -~w~Pardon Ma. Oui Ma. - -[TM1_H] -~w~Je veux que tu détruises les camionnettes de la laverie. - -[TM1_I] -~w~Et roule sur tous les gars de la Triade que tu croiseras. - -[TM1_J] -~w~8-Ball te donnera ce dont tu as besoin. - -[TM2_A] -~w~Toni est parti en faire saigner plus d'un, ou du moins, il essaie. - -[TM2_AA] -Il ne sera jamais aussi fort que son papa. Il t'a laissé un mot sur la table. - -[TM2_B] -~w~La laverie a accepté de payer. C'est du bon boulot! - -[TM2_C] -~w~Va chercher la thune et ramène-la ici. Et fais gaffe à la Triade. - -[TM2_D] -~w~C'est comme les roquets : ça aboie, mais ça mord pas! - -[TM2_E] -~w~Personne, je dis bien PERSONNE, ne se mêle des affaires de TONY CIPRIANI! - -[TM2_1] -~g~Apporte le flouze à Toni! - -[TM2_2] -~g~Tu les as tous refroidis! - -[TM3_MA] -~w~Je ne sais pas où il est! - -[TM3_MB] -~w~Ce gamin, des fois, il sait même pas où il se trouve! - -[TM3_MC] -~w~Son père, c'est sûr, c'était différent. Toujours au top, sûr de lui, viril... - -[TM3_A] -~w~Don Salvatore a convoqué une assemblée. - -[TM3_B] -~w~J'ai besoin de toi pour aller chercher la Stretch et Joey, son fils, au garage. - -[TM3_C] -~w~Alors va chercher Luigi à son club et reviens ensuite me chercher. - -[TM3_D] -~w~On ira tous ensemble chez le don. - -[TM3_E] -~w~Ces Triades, elles savent jamais quand s'arrêter. - -[TM3_F] -~w~Elles veulent la guerre, elles auront la guerre. - -[TM3_G] -~w~Maintenant, faut y aller. - -[TM3_1] -~g~Prends la Stretch chez Joey. - -[TM3_2] -~g~Va chercher Luigi. - -[TM3_3] -~g~Va chercher Toni. - -[TM3_4] -~g~Conduis tout le monde chez Salvatore. - -[TM3_5] -~y~Une embuscade de la Triade! - -[TM4_B] -~w~Nous sommes en GUERRE! La Triade se sert d'une conserverie de poisson comme façade! - -[TM4_C] -~w~Ils règlent la majeure partie de leurs affaires au marché aux poissons de Chinatown. - -[TM4_D] -~w~Cette laverie doit toujours payer son assurance... - -[TM4_E] -~w~Ils pensent que la Triade les protège, donc il faut leur montrer que ce n'est pas le cas. - -[TM4_F] -~w~Prends les garçons avec toi pour éliminer les chefs de la Triade! - -[TM4_G] -~w~Et puis, si t'en as l'occasion, descends quelques-uns de leurs porte-flingues. - -[TM4_GAT] -~g~Tu as besoin d'un 'Camion de poisson de la Triade' pour entrer. - -[TM5_A] -TEXT NO LONGER REQUIRED - -[TM5_B] -~w~Ok, j'en ai marre de toutes ces conneries. - -[TM5_C] -~w~On va en finir une bonne fois pour toute avec la Triade de Liberty!. - -[TM5_D] -8-Ball a installé une bombe sur une benne à ordures. - -[TM5_E] -~w~Il y a un minuteur donc, si tu te chies dessus, y'aura pas de preuves. Va chercher la benne. - -[TM5_F] -~w~Fais gaffe, 8-Ball dit que c'est super-sensible et que la moindre secousse peut tout faire sauter. - -[TM5_G] -~w~La conserverie de poisson laissera entrer la benne, après ce sera à toi de jouer. - -[TM5_H] -~w~Gare-toi entre les bonbonnes de gaz et casse-toi en vitesse! - -[TM5_I] -~w~Je veux qu'il pleuve des maquereaux! - -[TM5_J] -~w~C'est du Cecil B. DeMille que je veux, pas de la série Z! - -[FM2] -'LA FILLE DU MOGHOL' - -[FM4] -'DERNIERES VOLONTES' - -[FM1_A] -~w~Moi et les gars, on a besoin de causer affaires. - -[FM1_B] -~w~Alors tu vas veiller sur ma fille pendant la soirée. - -[FM1_C] -~w~MARIA! RAMENE TES FESSES PAR ICI! - -[FM1_D] -~w~Cette petite conne fait toujours ça. - -[FM1_E] -~w~Et la voilà, la seule et unique reine de Saba! - -[FM1_F] -~w~Qu'est-ce que tu faisais là-bas ? - -[FM1_G] -~w~Enfin, peu importe, je parie que ça m'a coûté de l'argent! - -[FM1_H] -~w~Bon, tu crois quand même pas que je suis dans le coin pour te faire la conversation ? - -[FM1_I] -~w~Monte dans cette bagnole et ferme ta grande gueule! - -[FM1_J] -~w~Prends la Stretch, mais tu la ramènes en un seul morceau, compris? - -[FM1_K] -~w~Et surveille-la, elle peut foutre la merde! - -[FM1_L] -~w~Ouais, ouais, ouais, je suis sûr que le neurone de ton nouveau larbin a tout enregistré! - -[FM1_M] -~w~Et pis il est taillé comme une armoire normande, alors y'a pas de risque! - -[FM1_N] -~w~Allez, Fido. On va chez Chico s'éclater un peu! - -[FM1_P] -~g~C'est Chico, là! Arrête-moi à côté! - -[FM1_S] -~w~Bonsoir, jolie dame. - -[FM1_TT] -~w~22, V'LA LES FLICS! - -[FM1_1] -~g~Retourne dans la Stretch! - -[FM1_2] -~g~Monte dans la Stretch! - -[FM1_3] -~r~Si tu laisses Maria, Salvatore va l'avoir mauvaise, alors retourne la chercher! - -[FM1_4] -~g~Tu viens de larguer la femme du Don! Retourne à l'entrepôt et attends Maria! - -[FM1_5] -~g~Ramène Maria chez Salvatore! - -[FM1_6] -~g~Chico ne restera pas là tout le temps, alors emmène Maria voir la mer. - -[FM1_7] -~r~Maria est morte! Salvatore va être furax... - -[FM1_8] -~r~T'as trucidé le fournisseur de Maria! - -[FM2_J] -Laisse-nous seuls un moment. - -[FM2_A] -Le Cartel colombien fabrique de la SPANK quelque part à Liberty. - -[FM2_K] -Mais on sait pas où, et on dirait qu'ils sont au courant de nos moindres faits et gestes. - -[FM2_L] -Y'a un gars, Bob le frisé, qui bosse au bar chaz Luigi. - -[FM2_M] -Il dépense plus qu'il ne gagne... - -[FM2_N] -Il prend souvent un taxi pour rentrer chez lui après le boulot. Alors, suis-le. - -[FM2_O] -Et si c'est lui la balance, descends-le... - -[FM2_F] -Voilà notre copain. Monsieur grande gueule en personne. - -[FM2_G] -T'as été suivi ? Tu sais que ce qui se passe ici, c'est notre petit secret... - -[FM2_H] -Non, non, j'ai pas été suivi. T'as la came ? - -[FM2_I] -Voilà ta SPANK, alors crache le morceau. - -[FM2_P] -Ok, alors ce qui se passe, c'est que les Leone mènent la guerre sur deux fronts à la fois. - -[FM2_Q] -Y'a une guerre de territoire avec la Triade qu'est pas prête de finir - -[FM2_R] -et Joey Leone a foutu la merde avec les Forelli. - -[FM2_S] -Ils perdent du terrain et des hommes tous les jours. - -[FM2_T] -Salvatore devient de plus en plus irascible et parano chaque jour. Il soupçonne tout le monde. - -[FM2_U] -Ben, quand je te vois, je me dis qu'il a pas forcément tort... - -[FM2_1] -~g~Voilà Bob le frisé! - -[FM2_2] -~g~Bob a quitté le club, suis-le! - -[FM2_5] -~g~Amène-le au port de Portland. - -[FM2_6] -~r~Bob montera jamais dans un taxi bousillé! - -[FM2_7] -~r~Bob le frisé s'est dégonflé. Le rendez-vous est annulé. - -[FM2_8] -~g~Cogne Bob le frisé! - -[FM2_9] -~r~Bob le frisé est mort! - -[FM2_10] -~r~Bob le frisé s'est fait la malle! - -[FM2_11] -~g~Gare-toi devant le club de Luigi, Bob le frisé devrait pas tarder à sortir. - -[FM2_12] -~r~Il t'a faussé compagnie! - -[FM3_A] -~w~On devrait régler leur compte à ces bâtards de Colombiens. - -[FM3_B] -~w~Mais tant qu'on est en guerre avec les Triades, on n'est pas assez fort. - -[FM3_C] -~w~Les fonds du Cartel sont illimités, avec tout l'argent qu'ils se font sur la SPANK. - -[FM3_D] -~w~Si on les attaquait de front, ils nous lamineraient! - -[FM3_E] -~w~Ils doivent fabriquer la SPANK sur le bateau vers lequel Le frisé t'a conduit. - -[FM3_F] -~w~Va falloir utiliser nos cerveaux, ou plutôt un. Le tien! - -[FM3_G] -~w~Je te demande de détruire cette usine de SPANK comme une faveur, pour moi, Salvatore Leone. - -[FM3_H] -~w~Si tu y arrives, ton avenir est assuré, tu auras tout ce que tu veux! - -[FM3_I] -~w~Va voir 8-Ball, il te dira comment faire, c'est un expert en explosifs. - -[FM3_8A] -~w~Salut mon gars! Salvatore m'a téléphoné. - -[FM3_8B] -~w~Pour un boulot comme ça, il va te falloir un sacré paquet de feux d'artifices! - -[FM3_8D] -~w~Mais tu sais que tu en as toujours pour ton pognon avec moi! - -[FM3_8E] -~w~Ok, au boulot! - -[FM3_8F] -~w~Je peux régler le détonateur de ce bébé, mais je peux toujours pas utiliser un flingue avec ces mains. - -[FM3_8G] -~w~Tiens, cette pétoire devrait te servir à faire sauter quelques têtes. - -[FM3_4] -~g~Arrête la bagnole et laisse 8-Ball sortir. - -[FM3_7] -~r~8-Ball s'est fait refroidir! - -[FM3_8] -~r~Les gardes ont été prévenus! - -[FM4_A] -~w~Ah, voilà mon nettoyeur favori! - -[FM4_B] -~w~Je suis fier de toi, mon garçon, tu leur en as mis plein la gueule! - -[FM4_C] -~w~J'ai juste un autre petit travail à te confier avant de pouvoir sabrer le champagne. - -[FM4_D] -~w~Il y a une voiture devant le club de Luigi. - -[FM4_E] -~w~L'intérieur est tapissé de cervelle! - -[FM4_F] -~w~On a aidé un gars à se faire une idée, et y'a eu quelques salissures. - -[FM4_H] -~w~Emmène-le au broyeur avant que les flics ne le trouvent. - -[AM3] -'PURGE DE PAPARAZZI' - -[AM4] -'JOUR DE PAYE' - -[AM5] -'TANNER L'AGENT DOUBLE' - -[AM1_A] -Nous devons éclaircir certains points avant de poursuivre nos relations, - -[AM1_B] -affaires ou autres. Mettons cartes sur table. - -[AM1_C] -Moi, je suis Yakuza et je sais que tu travailles pour la famille de Salvatore Leone. - -[AM1_D] -Nous pouvons te donner du travail, - -[AM1_E] -mais il faut d'abord nous prouver que t'as plus aucun lien avec la mafia. - -[AM1_G] -Débrouille-toi pour qu'il n'arrive pas vivant à son club. - -[AM1_H] -Pendant ce temps-là, Maria et moi, nous nous remémorerons le bon vieux temps. - -[AM1_I] -Oh... Asuka, tu t'es trouvé un messager. - -[AM1_J] -Ce n'est pas un simple messager. - -[AM1_1] -~g~Salvatore part de chez Luigi! - -[AM1_2] -~r~Tu t'es fait repérer! - -[AM1_3] -~r~Tu as raté Salvatore! - -[AM1_4] -~r~Bravo, t'as effrayé la cible! Et t'es censé être un tireur d'élite, c'est ça ? - -[AM1_5] -~g~Va au Le Quartier Rouge et attends que Salvatore sorte du club. - -[AM1_7] -~r~Salvatore est chez lui, à siroter un whisky. T'es vraiment pas une flèche, toi! - -[AM1_8] -~g~Salvatore va sortir de chez Luigi à environ ~1~:~1~. - -[AM2_4] -~g~Ils t'ont vu venir aussi nettement que si t'étais un éléphant rose! - -[AM3_A] -Y'a un journaliste qui nous tourne autour. - -[AM3_B] -Maria et moi, on part en vacances, histoire de te laisser le temps de te débarrasser de ce voyeur pervers. - -[AM4_A] -Ah, mon meilleur homme! - -[AM4_B] -Maria est très occupée, mais je lui dirai que t'es passé. - -[AM4_C] -Qui est là ? Asuka ? Je sais que je n'ai pas été très sage, mais j'ai le droit d'aller toute seule au petit coin, ok ? - -[AM4_D] -Il est temps que tu rencontres notre homme au LPD. - -[AM4_E] -Voilà sa paye pour le dernier service qu'il nous a rendu. - -[AM4_F] -Il est terriblement prudent. - -[AM4_G] -Va à la cabine de téléphone de Torrington aussi vite que tu peux et attends ses instructions. - -[AM5_A] -Maria et moi, on est allé faire des courses. - -[AM5_B] -Notre informateur dans la police nous a dit qu'un de nos conducteurs est un flic sous couverture! - -[AM5_C] -Il ne vaut pas grand chose hors de sa voiture, alors on y a installé un capteur. - -[AM5_D] -Je veux qu'il souffre! - -[AM5_1] -Tanner est à tes trousses! - -[AS1] -'L'APPAT' - -[AS2] -'CAFE RAPIDO' - -[AS4] -'LA RANCON' - -[AS1_A] -~w~Miguel semble croire que je l'ai maltraité. - -[AS1_B] -Il nous a néanmoins révélé à quel point Catalina s'inquiète de ta soif de vengeance. - -[AS2_A] -~w~On a sous-estimé les ambitions de Catalina avec la SPANK. - -[AS2_B] -~w~Cela va plus loin qu'une vente à la sauvette dans les rues. - -[AS2_D] -~w~Il fourgue sa came sur des étals. - -[AS2_1] -~g~Tous les étals des vendeurs de café de Portland ont été renversés! - -[AS2_2] -~g~Tous les étals des vendeurs de café de l'île de Staunton ont été renversés! - -[AS2_3] -~g~Tous les étals des vendeurs de café la vallée Shoreside ont été renversés! - -[AS2_4] -~r~Le Cartel a mis en garde ses revendeurs! - -[AS2_5] -~g~Il y a toujours des stands de café à la vallée Shoreside et sur l'île Staunton! - -[AS2_6] -~g~Il y a toujours des stands de café à la vallée Shoreside! - -[AS2_7] -~g~Il y a toujours des stands de café sur l'île Staunton! - -[AS2_8] -~g~Il y a encore des étals de vendeurs de café à Portland! - -[AS2_9] -~g~Il y a toujours des stands de café dans Portland et la vallée Shoreside! - -[AS2_10] -~g~Il y a toujours des stands de café dans Portland et sur l'île Staunton! - -[AS2_12] -~g~Parcours les districts de Liberty pour trouver ~b~les étals de Café Rapido! - -[AS3_A] -~W~Est-ce qu'on le serre un peu plus maintenant ou on attend juste qu'il vire au noir et qu'il tombe tout seul? - -[AS3_B] -~w~Allez, encore un peu... - -[AS3_D] -~w~Mon homme à tout faire! - -[AS3_E] -~w~Je m'ennuyais alors je suis venue tenir compagnie à Asuka. - -[AS3_1] -~g~Trouve un ~r~bateau~g~ et rejoins la ~b~bouée repère! - -[AS3_3] -~g~Attends que l'~y~avion~g~ s'approche! - -[AS3_5] -~g~Récupère la marchandise! - -[AS3_4] -~g~Sers-toi d'un lance-roquettes pour descendre l'~y~avion~g~! - -[AS3_2] -~b~Va vers les bouées repères! ~y~L'avion est en phase d'approche! - -[AS3_6] -~g~~1~ SUR 8 - -[KM1] -'LA GRANDE EVASION' - -[KM3] -'NEGOCIATION' - -[KM4] -'SHIMA' - -[KM5] -'LES RIVIERES POURPRES' - -[KM1_A] -Ma soeur m'a parlé de toi en des termes élogieux, - -[KM1_E] -même si je suis toujours pas convaincu qu'un gaijin à autre chose à offrir que des déceptions. - -[KM1_B] -Quoique, tu pourrais peut-être m'aider à régler un petit problème. - -[KM1_F] -Bien sûr, un échec te serait fatal. - -[KM1_C] -Un kanbu Yakuza est en garde à vue, en attente d'un transfert au palais de justice. - -[KM1_G] -C'est un membre apprécié de notre famille. - -[KM1_H] -Libère-le et amène-le au dojo de Bedford Point. - -[KM1_D] -Nous te remercions pour ton aide désintéressée. Si toi aussi, tu as besoin d'aide un jour, le dojo te fournira avec plaisir deux hommes pour t'assister. - -[KM1_1] -~g~Vole une bagnole de flics! - -[KM1_2] -~g~Equipe-la d'une bombe! - -[KM1_3] -~g~Maintenant, emmène-la au dojo des Yakuzas! - -[KM1_5] -~g~Bien, maintenant, va au poste de police. - -[KM1_6] -~g~Equipe la voiture d'une bombe! - -[KM1_7] -~g~Réservé aux véhicules de police! - -[KM1_9] -~r~Tu n'as pas utilisé de voiture piégée pour détruire le mur. - -[KM1_10] -~r~Le Yakuza Kanbu est mort, tout comme ton honneur! - -[KM1_11] -~r~Tu t'es fouré tout seul dans le pétrin! - -[KM2_A] -Dans ce milieu, l'étiquette ne doit jamais être sous-estimée. Au contraire! - -[KM2_B] -J'ai honte mais un homme m'a autrefois rendu service et je n'ai jamais eu l'occasion de lui montrer ma reconnaissance. - -[KM2_C] -Cet homme est un passionné de voitures et il a demandé que nous lui fournissions certains modèles pour sa collection. - -[KM2_F] -Mon honneur m'interdit de refuser. - -[KM2_2] -~g~Voiture livrée. - -[KM3_A] -Face au danger, l'inconscient tourne le dos alors que le sage fait front. - -[KM3_B] -Nous avons prévenu à plusieurs reprises le Cartel colombien qu'il fallait laisser nos intérêts à Liberty tranquilles. - -[KM3_C] -En ce moment même, ils négocient avec les Jamaïcains pour se moquer encore plus de nous. - -[KM3_D] -Ils sont en train de passer un accord pour l'ensemble de la ville. - -[KM3_F] -Prends un de mes hommes, vole une bagnole de Yardie et va présenter nos respects aux Colombiens. - -[KM3_E] -Pour notre honneur, ils doivent tous mourir! - -[KM3_2] -~g~Va prendre ton contact. - -[KM3_3] -~g~La réunion a lieu sur le parking de l'hôpital de Rockford! - -[KM3_4] -~r~Ils ont filé! - -[KM3_6] -~g~Supprime-les, tue-les tous! - -[KM3_8] -~g~Il te faut une bagnole de Yardie pour ce boulot! - -[KM3_9] -~r~L'un des Colombiens est mort, l'accord est caduc. - -[KM3_10] -~r~Le contact est mort! - -[KM4_A] -La seule vraie force consiste à ne jamais montrer ses faiblesses. - -[KM4_C] -Va récupérer l'argent immédiatement pour qu'on puisse le placer sur les comptes du casino. - -[KM4_1] -Je peux pas vous payer et même si je pouvais, je le ferais pas! - -[KM4_9] -Un gang de jeunes vient de dévaliser cet endroit! Ils ont tout pris! - -[KM4_2] -Vous ne servez à rien! - -[KM4_10] -Quel genre de Yakuza êtes-vous? hein? - -[KM4_3] -C'est pas pour ça que je vous paye! Si j'avais voulu ce genre de protection, je me serais adressé directement aux flics! - -[KM4_4] -~g~Réglez son compte au gang et récupérez ~b~l'argent de la protection~g~! - -[KM4_7] -~r~Le commerçant est mort! - -[KM4_5] -Donald Love aimerait que vous passiez prendre le thé chez lui afin d'avoir une conversation avec vous. - -[KM4_6] -Tout l'argent est là! - -[KM4_8] -~g~Malette récupérée! - -[KM5_A] -TOI! Et c'est maintenant que tu te décides à te montrer! - -[KM5_B] -Il semblerait que ta tentative pour empêcher les Jamaïcains - -[KM5_B1] -de s'allier aux Colombiens ait complètement raté! - -[KM5_C] -Y a des dealers du gang des Caraïbes dans tout Liberty qui vendent des sachets de SPANK comme si c'était des friandises! - -[KM5_D] -Les membres du Cartel se foutent de nous et de moi surtout! - -[KM5_E] -Je te donne une dernière chance de me prouver que ma soeur avait raison de te faire confiance! - -[KM5_F] -Débarrasse-moi de tous ces rats et rachète-toi avec leur sang! - -[KM5_3] -~r~Tu n'as pas réussi à tuer au moins ~1~ Yardies. - -[KM5_4] -~g~Bravo, tu as tué ~1~ Yardies. - -[KM5_5] -~g~Bravo! Tu as tué ~1~ Yardies. Bonus : ~1~$ - -[RM1] -'EQUILIBRER LA BALANCE' - -[RM3] -'PREUVES A PROUVER' - -[RM4] -'PECHE AU GROS' - -[RM5] -'LE MARTEAU ET L'ENCLUME' - -[RM1_D] -Il est sous protection dans une propriété de WitSec à Newport, des appartements à l'arrière du parking. - -[RM1_E] -Enfume-moi cet endroit, ça devrait les faire sortir, et tu me les butes tous, fais en sorte que Mc Machin ne parle plus à personne. - -[RM1_1] -~g~Vérifie la maison du programme de protection des témoins. - -[RM1_2] -~g~Chope McAffrey! - -[RM2_A1] -Hé, gamin, par là! - -[RM2_A] -Un vieux pote à moi de l'armée a une affaire à Rockford. - -[RM2_D] -Il a besoin d'un coup de main et, en échange, il te fera des prix d'enfer sur son matos. - -[RM2_E] -Ray a téléphoné... mais je pensais que vous seriez plusieurs... - -[RM2_F] -Bon, trois bras valent mieux qu'un, alors prends ce qu'il te faut. - -[RM2_G] -~g~Va voir Phil! - -[RM2_H] -~r~Phil a été tué! - -[RM2_L] -Héhé! Si je t'avais eu comme partenaire au Nicaragua, j'aurais peut-être encore mes deux bras! - -[RM2_N] -Laisse le fric. Maintenant, dégage, je m'occupe des poulets. - -[RM3_D] -La pièce à conviction est en train de rouler dans la ville. - -[RM3_E] -Va falloir que tu tamponnes cette caisse et que tu récupères les preuves au fur et à mesure qu'elles tombent! - -[RM3_F] -Quand t'auras tout, laisse-les dans la voiture et brûle-la. - -[RM3_G] -C'est une bonne affaire pour tous les deux, tu sais, gamin. - -[RM3_1] -~g~Laisse les preuves dans la voiture et brûle-la. - -[RM3_4] -~g~L'accusation n'a pas tenu compte des pièces à conviction! - -[RM3_6] -~r~Ces photos seront dans tout Liberty! - -[RM3_7] -~g~Brûle la voiture! - -[RM4_A] -Mon partenaire est un rat. - -[RM4_C] -Il va souvent pêcher en bateau près du phare de Portland Rock, la nuit. - -[RM4_D] -Vole une vedette de la police et assure-toi que ses sales plans de traître tombent à l'eau! - -[RM4_1] -~g~Vole une vedette de la police. - -[RM4_2] -~g~Va jusqu'au phare et 'occupe-toi' du partenaire de Ray! - -[RM5_A] -Espèce de bon à rien! - -[RM5_A1] -Tu t'es chié dessus! Mon cul est en première ligne et t'es même pas foutu de buter une mouche! - -[RM5_B] -Je t'ai filé de la thune pour buter ce témoin et il est encore en vie! - -[RM5_B1] -Et il va faire une déposition devant les fédéraux aujourd'hui! - -[RM5_C] -Ils vont le transférer d'un moment à l'autre de l'Hôpital Général Carson à Rockford! - -[RM5_D] -S'il crache le morceau, je vais cracher mes dents, et plus encore... - -[RM5_E] -Alors fais ce putain de boulot pour lequel je t'ai payé! - -[RM5_1] -~g~Intercepte l'ambulance. - -[RM5_2] -~g~Tu t'es fait repérer! - -[RM5_3] -~g~C'était un piège à cons! - -[RM5_4] -~g~Les balles ne peuvent pas traverser cette armure! - -[RM5_5] -~g~Cette armure est recouverte d'amiante! - -[RM5_7] -~r~Le témoin est arrivé à bon port! - -[RM5_8] -~g~Le témoin s'est noyé! - -[LOVE2] -'HARA-KIRI WAKA-SHIRA' - -[LOVE3] -'RIEN QU'UNE GOUTTE DANS L'OCEAN' - -[LOVE1_A] -Tout d'abord, je tiens à te remercier pour m'avoir aidé à régler cette affaire privée. - -[LOVE1_F] -Les gens croient tout ce qu'on leur raconte de nos jours! - -[LOVE1_D] -Ils essaient de m'extorquer plus d'argent, mais j'aime pas renégocier mes accords! - -[LOVE1_E] -Un accord est un accord et il n'auront rien de plus de moi! - -[LOVE1_G] -Va aider mon ami, tu as carte blanche. - -[LOVE1_2] -~g~Sauve le vieux bridé. - -[LOVE1_3] -~g~Amène le vieux bridé à l'appartement de Donald Love. - -[LOVE1_4] -~g~Le vieux bridé doit se trouver dans un de ces garages... - -[LOVE1_6] -~r~Les tripes du vieux bridé sont étalées sur le trottoir. Attention, ça glisse! - -[LOVE1_7] -~g~Les portes ne s'ouvriront que pour laisser passer une voiture du gang des Colombiens. - -[LOVE2_A] -Rien de mieux qu'une bonne vieille guerre des gangs pour faire marcher l'immobilier, - -[LOVE2_B] -en dehors d'une bonne épidémie... mais ça serait peut-être un peu trop. - -[LOVE2_C] -J'ai remarqué que les Yakuzas et les Colombiens n'étaient pas très copains. - -[LOVE2_D] -C'est une opportunité que nous devons saisir! - -[LOVE2_E] -Je veux que tu tues le waka-gashira des Yakuzas, Kenji Kasen. - -[LOVE2_F] -Kenji est à une réunion au sommet du parking à plusieurs étages de Newport. - -[LOVE2_G] -Procure-toi une voiture du Cartel et tue-le! - -[LOVE2_H] -Les Yakuzas doivent accuser le Cartel de leur déclarer la guerre. - -[LOVE2_1] -~g~Va à Fort Staunton et vole une voiture du gang des Colombiens. - -[LOVE2_2] -~g~Maintenant, rends-toi au ~p~parking de Newport~g~ et élimine Kenji. - -[LOVE2_3] -~r~Si tu n'as pas de voiture du Cartel, tu seras démasqué! - -[LOVE2_4] -~r~Les Yakuzas t'ont reconnu! - -[LOVE2_6] -~r~Tu as tué tous les témoins! - -[LOVE3_A] -De nos jours, certaines marchandises de valeur sont difficiles à importer. - -[LOVE3_C] -Plusieurs paquets vont être jetés à l'eau. - -[LOVE3_D] -Récupère-les avant tout le monde. - -[LOVE3_1] -~g~Procure-toi un ~r~bateau~g~ et suis l'~y~avion~g~! - -[LOVE4] -'VOL AU VENT' - -[LOVE5] -'ACCORTE ESCORTE!' - -[LOVE4_A] -Merci beaucoup pour ces paquets, mais ils n'étaient qu'un leurre! - -[LOVE4_B] -Je suis désolé pour ça, mais c'est quelque fois comme ça dans les affaires. - -[LOVE4_C] -Mon réel objectif se trouvait depuis le début caché à bord de l'avion. - -[LOVE4_F] -J'avais graissé la patte aux autorités. - -[LOVE4_1] -~r~Les Colombiens sont là! - -[LOVE4_2] -~g~Le paquet est parti! Suis les Colombiens et récupère-le! - -[LOVE4_3] -~g~Panlantic construction ? - -[LOVE4_5] -~g~Le paquet devrait être à bord de l'avion... - -[LOVE4_6] -~g~Prends l'ascenseur pour accéder au sommet de la tour! - -[LOVE5_B] -Mon ami oriental a besoin d'une escorte pour l'accompagner pendant l'authentification de ma dernière acquisition. - -[LOVE5_1] -~g~Vas-y! - -[LOVE5_2] -~g~Tu vas avoir besoin d'une caisse! - -[LOVE5_3] -~g~Passe devant et contrôle la sortie du tunnel! - -[LOVE5_4] -~r~Protège le camion! - -[RM6] -'L'HOMME A ABATTRE!' - -[RM6_A] -T'as pas été suivi ? Parfait! - -[RM6_B] -Ca y est! Je suis cuit, déjà mort, en quelque sorte! - -[RM6_D] -J'ai un contrat sur ma tête, alors je me casse! - -[RM6_E] -Amène-moi à l'aéroport et t'auras un bon pourboire! - -[RM6_666] -Prends soin de ma Patriot blindée. On se verra à Miami, Ray! - -[CAT1] -'LA RANCON' - -[CAT2] -'L'ECHANGE' - -[CAT1_A] -C'est moi qui ai Maria. Je pense pas que t'aies l'envie que son visage ressemble à un foie de veau trop faisandé, hein ? - -[CAT2_F] -Je me suis cassé un ongle et ma mise en plis est foutue! Tu le crois, ça ? Ca m'avait coûté 50 dollars! - -[CAT2_G] -J'étais complètement flippée, mais, je me suis dit, Maria, t'es une grande fille maintenant. - -[CAT2_H] -Oh on va bien s'amuser, tu sais, parce que ma soeur, elle a dit qu'elle voulait venir s'installer avec nous, elle et ses deux gosses. - -[CAT2_I] -Son mec a recommencé à aller voir ailleurs et... - -[CAT1_F] -Rattrape Catalina avant la fin du temps imparti! - -[CAT_MON] -~g~T'as pas encore assez d'argent. T'as besoin de 500 000$. - -[BITCH_D] -~g~Maria est morte! - -[WEATHER] -METEO AGITEE - -[WEATHE2] -METEO NORMALE - -[8001] -Tu as échoué lamentablement! - -[1000] -TU ES MORT - -[1001] -TU ES MORT - -[1002] -TU ES MORT - -[1003] -TU ES MORT - -[1004] -TU ES MORT - -[1005] -CAPTURE! - -[1006] -CAPTURE! - -[1007] -CAPTURE! - -[1008] -CAPTURE! - -[1009] -CAPTURE! - -[GA_4] -Une voiture piégée coûte 1000$ pièce! - -[GA_5] -Ta voiture est déjà équipée d'une bombe. - -[GA_6] -Gare-la, arme la bombe avec la ~h~touche ~k~~PED_FIREWEAPON~~w~ et CASSE-TOI! - -[GA_7] -Arme la bombe avec la ~h~touche ~k~~PED_FIREWEAPON~~w~. Elle explose au démarrage. - -[GA_8] -Utilise le détonateur pour armer la bombe. - -[GA_9] -Tu as récupéré ~1~ des 10 voitures spéciales. - -[GA_10] -Beau morceau. Voilà tes ~1~$. - -[GA_11] -On en a déjà des comme ça. Ca nous sert à rien! - -[GA_12] -Bombe armée. - -[GA_13] -Comme un pro! Finis la liste et t'auras un bonus! - -[GA_14] -Toutes les voitures! Parfait! Tiens, voilà un petit quelque chose! - -[GA_15] -J'espère que t'aimes la nouvelle couleur! - -[GA_16] -La peinture est en option! - -[GA_19] -Ce modèle, ça nous intéresse pas! - -[GA_20] -On en a trop des comme ça! Désolé, mec. - -[CR_1] -La grue ne peut pas soulever ce véhicule. - -[PU_MONY] -T'as pas assez d'argent. - -[CO_ALL] -Tu les as toutes eues. Tiens, voilà pour toi... - -[PAUSED] -PAUSE - -[HEALTH1] -Sors de là! T'es en pleine forme! - -[HEALTH2] -Coût des soins - -[HEALTH3] -Je vais vous remettre sur pied! - -[HEALTH4] -Ca fera 250$. - -[FEB_STA] -Statistiques - -[FEB_BRI] -Briefings - -[FEB_CON] -Commandes - -[FEB_AUD] -Son - -[FEB_DIS] -Affichage - -[FEB_LAN] -Langue - -[FEP_STA] -STATISTIQUES - -[FEP_BRI] -BRIEFINGS - -[FEP_CON] -COMMANDES - -[FEP_AUD] -SON - -[FEP_DIS] -AFFICHAGE - -[FEP_LAN] -LANGUE - -[FEF_ST1] -C'est qui, le méchant ? - -[FEF_ST2] -T'as foutu un sacré merdier! - -[FEF_BR1] -T'as perdu le fil de l'histoire ? - -[FEF_CO1] -Tu veux prendre les commandes, c'est ça ? - -[FEF_CO2] -Choisis la configuration qui correspond le mieux à ta façon de jouer. - -[FEF_SA1] -Fais la queue! - -[FEF_SA2] -Sauvegarde et charge tes parties - -[FEF_AU1] -Fais péter la sono! - -[FEF_AU2] -Sélectionne une station de radio et des effets sonores - -[FEF_DI1] -Change de partie! - -[FEF_DI2] -Configure le jeu pour ta télé pourrie! - -[FEF_LA1] -Mais qu'est-ce que tu racontes ? - -[FEF_LA2] -Do tu hablar Deutsh ? - -[FEB_PMB] -Briefings de mission précédents: - -[FEC_NA] -Oups! - -[FEC_CWL] -Montrer les armes à gauche - -[FEC_CWR] -Montrer les armes à droite - -[FEC_LOF] -Regarder devant - -[FEC_TAR] -Cible - -[FEC_MOV] -Déplacement - -[FEC_CAM] -Modes caméra - -[FEC_PAU] -Pause - -[FEC_ENV] -Monter dans un véhicule - -[FEC_JUM] -Sauter - -[FEC_ATT] -Attaquer ou tirer - -[FEC_RUN] -Courir - -[FEC_FPC] -Vue subjective - -[FEC_LL] -Regarder à gauche - -[FEC_LB1] -Regarder - -[FEC_LB2] -derrière - -[FEC_LB] -Regarder derrière - -[FEC_LR] -Regarder à droite - -[FEC_HOR] -Klaxon - -[FEC_VES] -Commandes du véhicule - -[FEC_RSC] -Chang. les stations de radio - -[FEC_BRA] -Frein ou marche arrière - -[FEC_HAB] -Frein à main - -[FEC_CAW] -Arme du véhicule - -[FEC_ACC] -Accélérateur - -[FEC_SMT] -Déclencheur de mission spéciale - -[FEC_CCF] -Configuration: - -[FEC_CF1] -Config1 - -[FEC_CF2] -Config2 - -[FEC_CF3] -Config3 - -[FEC_CF4] -Config4 - -[FEC_CDP] -Affichage de la manette: - -[FEC_ONF] -A pied - -[FEC_INC] -Dans un véhicule - -[FEC_VIB] -Vibrations: - -[FEA_OUT] -Sortie audio: - -[FEA_ST] -Stéréo - -[FEA_MNO] -Mono - -[FEA_NON] -Aucune - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -CHATTERBOX 109 - -[FED_DBG] -Menu Debug - -[FEM_MCM] -Menu memory card - -[FEM_RMC] -Enregistrer memory card 1 - -[FEM_TFM] -Test memory card 1 formatée - -[FEM_TUM] -Test memory card 1 non formatée - -[FEM_CRD] -Créer rép. racine - -[FEM_CLI] -Créer et charger des icones - -[FEM_FFF] -Remplir le premier fichier de conneries - -[FEM_SOG] -Sauvegarder uniquement la partie - -[FEM_CES] -Vérifier chaque sauvegarde de 0kb4 - -[FEM_STG] -Sauvegarder la partie - -[FEM_STS] -Sauvegarder la partie sous le nom GTA3 - -[FEM_CPD] -Créer un répertoire protégé contre les copies - -[FEM_MC2] -Menu memory card 2 - -[FEM_TS] -Test de sauvegarde : - -[FEM_TL] -Test de chargement : - -[FEM_TD] -Test de suppression : - -[PL_STAT] -Statistiques du joueur - -[PE_WAST] -Victimes - -[PE_WSOT] -Personnes tuées par d'autres - -[CAR_EXP] -Véhicules détruits - -[TM_BUST] -Nb de fois capturé - -[M_WASTE] -Hommes tués - -[F_WASTE] -Femmes tuées - -[PIG_WST] -Flics tués - -[GNG_WST] -Gangsters tués - -[MED_WST] -Toubibs tués - -[FIRE_WS] -Pompiers tués - -[DED_CRI] -Criminels tués - -[DED_DED] -Parasites tués - -[DED_HOK] -Putes tuées - -[HEL_DST] -Hélicoptères détruits - -[PER_COM] -Pourcentage accompli - -[KGS_EXP] -Kilos d'explosif utilisés - -[ACCURA] -Précision - -[ELBURRO] -Meilleur temps en sec. - -[CAR_CRU] -Véhicules défoncés - -[HED_EX] -Têtes explosées - -[TM_DED] -Visites à l'hôpital - -[DAYSPS] -Jours de jeu - -[MMRAIN] -Mm de pluie tombés - -[MXCARD] -Distance max. de sauts dangereux (pieds) - -[MXCARJ] -Hauteur max de sauts dangereux (pieds) - -[MXCARDM] -Distance max. de sauts dangereux (m) - -[MXCARJM] -Hauteur max de sauts dangereux (m) - -[MXFLIP] -Saltos max. de sauts dangereux - -[MXJUMP] -Rotation max. de sauts dangereux - -[BSTSTU] -Meilleures cascades jusqu'à maintenant: - -[INSTUN] -Cascade dangereuse - -[PRINST] -Cascade dangereuse parfaite - -[DBINST] -Double cascade dangereuse - -[DBPINS] -Double cascade dangereuse parfaite - -[TRINST] -Triple cascade dangereuse - -[PRTRST] -Triple cascade dangereuse parfaite - -[QUINST] -Quadruple cascade dangereuse - -[PQUINS] -Quadruple cascade dangereuse parfaite - -[NOSTUC] -Aucune cascade dangereuse accomplie - -[NOUNIF] -Sauts uniques accomplis - -[NOUNGM] -Total sauts uniques - -[NMISON] -Missions commencées - -[NMMISP] -Missions réussies - -[PASDRO] -Passagers perdus - -[MONTAX] -Total courses en taxi - -[DAYPLC] -Dépenses quotidiennes de police - -[CRIMRA] -Taux de criminalité - -[GMSTOR] -Magasin du jeu - -[PREBRF] -Briefings précédents - -[CNTLS] -Commandes - -[MUSMEN] -Musique/Effets - -[GAMSET] -Paramètres du jeu - -[LANGUA] -Langue - -[DSPLAY] -Affichage - -[DEBUGM] -Menu Debug - -[QUITOP] -Options de fin - -[CONTRL] -Configuration des manettes - -[SET1EN] -Config 1. activée - -[SET1] -Config 1. - -[SET2EN] -Config 2. activée - -[SET2] -Config 2. - -[SET3EN] -Config 3. activée - -[SET3] -Config 3. - -[SET4EN] -Config 4. activée - -[SET4] -Config 4. - -[GOBACK] -Retour - -[SOUND] -AUDIO - -[MUSVOL] -Volume de la musique - -[SFXVOL] -Volume des effets - -[SCROPT] -OPTIONS D'AFFICHAGE - -[CTRSCR] -Centrer l'écran - -[SCRFOR] -Format d'écran - -[GMSVLQ] -SAUVEGARDER-CHARGER-QUITTER - -[GMREST] -Recommencer - -[NOGMSV] -Tu ne peux sauvegarder que depuis ta planque. - -[DLFILE] -Supprimer les fichiers de GTA3 - -[CHFILE] -CHOISIR LE FICHIER A CHARGER - -[CHFIDL] -CHOISIR LE FICHIER A SUPPRIMER - -[SVCONF] -CONFIRMER SAUVEGARDE - -[SVFNAM] -Le nom du fichier de sauvegarde est - -[SAVEDN] -Erreur. Echec de la sauvegarde. - -[LANGSL] -CHOIX DE LA LANGUE - -[ENGLIS] -Anglais - -[GERMAN] -Allemand - -[ITALIA] -Italien - -[FRENCH] -Français - -[SPAIN] -Espagnol - -[BGWHON] -Big White Debug Light Switched On - -[BGWOFF] -Big White Debug Light Switched Off - -[PRVMEN] -Briefings de mission précédents - -[DOSVGM] -Tu veux sauvegarder la partie ? - -[FORMEN] -Menu formatage - -[MEMTST] -Ecran de test memory card - -[REGCAR] -Enregistrer memory card 1 - -[TEFONE] -Test memory card 1 formatée - -[TEUFON] -Test memory card 1 non formatée - -[CRROOT] -Créer rép. racine - -[CRLDIC] -Créer et charger des icones - -[FLFSGF] -Remplir le premier fichier de conneries - -[PUSAVE] -Sauvegarder uniquement la partie - -[CHEVOK] -Vérifier chaque sauvegarde de 0kb4 - -[SVGMON] -Sauvegarder - -[CNTSAV] -Sauvegarde impossible. Tu es en mission. - -[CNCSAV] -Sauvegarde impossible. Tu es en voiture. - -[CRMGSV] -Créer un répertoire protégé contre les copies - -[MGSVCN] -Répertoire créé - -[MGSVNC] -Répertoire non créé - -[YES] -Oui - -[NO] -Non - -[X] -x - -[LAST] -Dernier message. - -[FEDS_XB] -Choisir - -[FEDS_ST] -touche START - REPRENDRE - -[FEST_OO] -sur - -[FEC_TUC] -Commandes tourelle - -[FEC_SM3] -Déclencheur mission spéciale (touche R3) - -[FEC_RS3] -Chang. les stations de radio (touche L3) - -[FEC_HO3] -Klaxonner (touche L3) - -[DIAB1] -'TOURISME' - -[DIAB2] -'DE LA GLACE, T'ES REFROIDI' - -[DIAB3] -'JUGÉ PAR LE FEU' - -[DIAB4] -'STAR DU X' - -[DIAB1_A] -El Burro veut te donner une chance. Va à la cabine téléphonique de Hauteurs de Hepburn si tu veux plus d'infos. - -[DIAB1_C] -Tu t'es bien défendu. Retourne à la cabine et El Burro aura peut-être du boulot pour toi. - -[DIAB1_1] -~g~3..2..1..GO GO GO! - -[DIAB1_4] -~g~Trouve une voiture rapide et va sur la grille de départ. - -[DIAB1_3] -~r~Tu ne pourrais même pas gagner à une tombol, blaireau! - -[DIAB1_2] -~g~Félicitations tu as gagné, avec un temps incroyable de ~1~ secondes - -[FIRST] -~g~1er - -[SECOND] -~g~2e - -[THIRD] -~g~3e - -[FOURTH] -~g~4e - -[DIAB2_1] -~g~Va prendre la malette à Harwood. - -[DIAB2_2] -~g~Trouve une camionnette de vendeur de glaces. - -[DIAB2_3] -~g~Gare la camionette à Atlantic Quays. - -[DIAB2_4] -~g~Appuie sur la ~w~touche ~k~~VEHICLE_HORN~ ~g~pour actionner la clochette. - -[DIAB2_6] -~g~Appuie sur la ~w~touche ~k~~VEHICLE_HORN~ ~g~pour actionner la clochette. - -[DIAB2_7] -~g~Appuie sur la ~w~touche ~k~~VEHICLE_HORN~ ~g~pour actionner la clochette. - -[DIAB2_5] -~g~Sors de la camionette et sers-toi de la télécommande pour faire exploser la camionnette. - -[YD1] -'LES FOUS DU VOLANT' - -[YD2] -'TOUS A L'UZI' - -[YD3] -'LA VALSE DES VOITURES' - -[YD4] -'A NOUS LE ROYAUME' - -[YD_P] -King Courtney voudrait te dire un mot. Va à la cabine d'Aspatria! - -[YD1_A] -~w~Voila King Courtney. - -[YD1_A1] -~w~Mon gang de Yardies aurait besoin d'un bon chauffeur et t'as une réputation de rapide. - -[YD1_B] -~w~Va à la décharge en face du stade et attends les autres joueurs. - -[YD1_C] -~w~J'ai des gars qui surveillent tous les points de passage de Staunton. - -[YD1_D] -~w~Le premier pilote qui franchit un point de passage gagne 1000$ et ainsi de suite. - -[YD1_D1] -~w~Si tu passes plus de checkpoints que tous les autres pilotes, j'aurais peut-être du boulot pour toi. - -[YD1_E] -~g~Prépare-toi à partir! - -[YD1_F] -~g~T'as foncé dès le départ. J'adore ton style! - -[YD1_G] -~r~C'est une course de bagnoles. T'as besoin d'une bagnole, patate! - -[YD1GO] -~g~GO! - -[YD1_1] -~r~1 - -[YD1_2] -~r~2 - -[YD1_3] -~r~3 - -[YD1_BON] -1000$! - -[Y1_1ST] -~g~T'es arrivé premier en franchissant ~1~ points de passage! - -[Y1_2ND] -~y~2e avec ~1~ points de passage gagnants. ~y~Pas mal, mais t'es pas le meilleur. - -[Y1_3RD] -~r~3e avec ~1~ points de passage gagnants. ~r~Je croyais que t'étais bon! - -[Y1_LAST] -~r~Tu es le dernier! ~r~Tu m'as fait perdre mon temps, imbécile! - -[Y1_J1ST] -~y~1er ex aequo avec ~1~ points de passage gagnants. ~y~C'est bien, mais tu dois être le meilleur pour courir sur Queen lizzy! - -[Y1_J2ND] -~r~2e ex aequo avec ~1~ points de passage gagnants. Tu conduis comme un vieux singe dingo! - -[Y1JLAST] -~r~Dernier ex æquo! Tu parles comme un pilote, mais tu pilotes comme un beau-parleur! - -[Y1_TEST] -VOITURE A L'EAU! - -[YD2_A] -~w~J'ai besoin de voir si tu peux faire mon sale boulot. - -[YD2_A1] -~w~Faut voir si on peut te faire confiance. - -[YD2_B] -~w~Deux de mes gars seront là-bas dans peu de temps pour te faire faire un tour, - -[YD2_B1] -~w~histoire de voir si tu vaux quelque chose... - -[YD2_C] -~w~On va aller faire un tour à Hauteurs de Hepburn, flingue-nous quelques Diablos qui font des misères à Queen Lizzy. - -[YD2_CC] -~w~Tiens, t'auras besoin d'un calibre. - -[YD2_D] -~w~Tu conduis et tu tires. On s'arrangera pour que tu te fasses pas descendre. - -[YD2_E] -~w~Allons-y!! - -[YD2_F] -~r~Il nous a échappé, colle-lui au cul!!! - -[YD2_G1] -~w~Hauteurs de Hepburn... On va se farcir quelques Diablos de malheur... - -[YD2_G2] -~w~Mais n'oublie pas, ~r~tu restes dans la bagnole!! - -[YD2_H] -~w~OK, ramène-nous sur le territoire des Yardies! Allez, FONCE! - -[YD2_L] -~w~Tu t'es bien débrouillé, le bourreau. - -[YD2_M] -~r~Il a bousillé ma bagnole! Descends-le! - -[YD2_N] -~w~Ramène ta fraise dans cette bagnole! - -[YD3_A] -Je veux que tu piques quelques bagnoles de gangs - -[YD3_A1] -comme ça, on pourra faire un carton chez nos ennemis. - -[YD3_B] -Je veux une Sentinelle de la Mafia, - -[YD3_B1] -une Stinger des Yakuzas et une - -[YD3_B2] -Stallion des Diablos comme ça, on pourra frapper dans tous les gangs de Liberty. - -[YD3_C] -Tu les amènes au garage de Newport et souviens-toi, - -[YD3_C1] -elles ne nous sont utiles qu'en bon état! - -[YD3_D] -Spare text label - -[YD3_E] -~r~Tu as déjà piqué une voiture des Diablos! - -[YD3_F] -~r~Tu as déjà piqué une voiture de la Mafia! - -[YD3_G] -~r~Tu as déjà piqué une voiture des Yazukas! - -[YD3_H] -~g~Bagnole des Diablos chourrée! - -[YD3_I] -~g~Bagnole de la Mafia chourrée! - -[YD3_J] -~g~Bagnole des Yasukas chourrée! - -[YD3_K] -~r~La bagnole est presque une épave! Fais-la réparer! - -[YD3_L] -Emmène-la au garage! - -[YD3_M] -~r~T'as fait un tonneau avec! Va en chercher une autre! - -[YD4_A] -Ecoute-moi bien! - -[YD4_A1] -Tu vas aller à Bedford Point. - -[YD4_A2] -Il y a de la came dont j'ai besoin rapidos dans une vieille bagnole! - -[YD4_B] -LETTRE : je sais que tu es très occupé. Eh bien moi aussi, je suis très occupée. - -[YD4_C] -Je pense qu'il est temps que tu te rendes compte de ce que c'est, de la SPANK! Catalina, Bisous. - -[YD4_D] -PS : CREVE SALE CHIEN, CREVE! - -[YD4_1] -Des drogués défoncés ! - -[YD4_2] -Détruis les camionnettes de SPANK !! - -[HM_1] -'DESCENTE A L'UZI' - -[HM_2] -'BUGGY FAIT DES RAVAGES' - -[HM_3] -'VOITURE PIEGEE' - -[HM_5] -'LA RIXE' - -[HOOD1_A] -Va à la cabine dans Wichita Gardens et on parlera affaires. - -[HM1_A] -Salut! C'est D-Ice des Red Jacks! - -[HM1_C] -Ces jeunes cons, ils viennent dans la rue et ils ont qu'une idée en tête, la SPANK et les flingues. - -[HM1_3] -~g~Les 'Nines' font leur business dans Wichita Gardens. - -[HM2_3] -Si tu touches les roues d'une bagnole, le buggy télécommandé explosera! - -[HM2_4] -Si le buggy télécommandé est hors de portée, il explosera! - -[HM2_5] -~r~Hors de portée! - -[HM3_1] -~g~Va au garage mais fais gaffe, si tu brusques trop la bagnole, elle va exploser! - -[HM3_2] -~g~Ramène la voiture en parfait état, pas de grabuge! - -[HM3_3] -~g~Fais réparer la voiture! - -[HM4_D] -~g~Trouve une caisse! - -[HM4_E] -TEXT NO LONGER REQUIRED - -[HM4_1] -~g~Va à l'endroit où la cargaison est tombée, tu dois ramasser 30 lingots. - -[HM4_2] -~g~Souviens-toi que quand la bagnole est trop chargée, elle se traîne alors quand c'est le cas, fonce au garage pour livrer la marchandise. - -[HM5_3] -~r~On t'a dit de te servir d'une batte de baseball et c'est tout! - -[HM5_4] -~r~Ton contact est mort! - -[MEA1] -'L'ESCROC' - -[MEA2] -'LES BRAQUEURS' - -[MEA3] -'LA FEMME' - -[MEA4] -'SON AMANT' - -[MEAT1_A] -Un ami m'a dit que tu pouvais régler certains de mes problèmes. Si tu penses que tu peux m'aider, va à la cabine de Trenton. - -[MEA1_B3] -~g~Va voir le banquier. - -[MEA1_B6] -~g~Amène la voiture à la casse pour se débarrasser des preuves. Une fois sur place, sors de la voiture et laisse faire la grue! - -[MEA1_1] -~r~Le banquier est mort! - -[MEA1_2] -~r~On t'a dit d'écrabouiller la voiture! - -[MEA1_3] -~g~Sors de la bagnole! - -[MEA1_4] -~r~T'as laissé le banquier derrière toi! - -[MEA2_B3] -~g~Va voir les braqueurs. - -[MEA2_B4] -~g~Amène-les à l'usine de pâtée pour chiens. - -[MEA2_B6] -~g~Fais repeindre la voiture, comme ça y'aura pas de preuve. - -[MEA2_1] -~r~On t'a dit d'écrabouiller la voiture! - -[MEA2_2] -~r~Un braqueur est mort! - -[MEA2_4] -~r~T'as laissé un des braqueurs derrière toi! - -[MEA3_B3] -~g~Va chercher Mme Chonks. - -[MEA3_B6] -~g~Prends la voiture et fous-la à l'eau, comme ça y'aura pas de preuve. - -[MEA3_1] -~r~La femme est morte! - -[MEA3_2] -~r~Tu étais censé balancer la bagnole à la mer! - -[MEA3_3] -~r~T'as laissé sa femme derrière! - -[MEA4_B3] -~g~Va chercher l'amant de sa femme. - -[MEA4_B6] -C'est beaucoup trop tard, Marty. Je t'ai donné une chance, mais maintenant je reprends tout en charge! - -[MEA4_1] -~r~Carlos est mort! - -[MEA4_3] -~r~T'as laissé Carlos l'usurier derrière! - -[LOOK_A] -Appuie et maintiens enfoncée la ~h~touche ~k~~VEHICLE_LOOKLEFT~ ~w~ou ~h~touche ~k~~VEHICLE_LOOKRIGHT~ ~w~ pour regarder ~h~à gauche~w~ ou ~h~à droite~w~ quand tu es en voiture. Appuie sur ces deux touches pour regarder ~h~derrière~w~. - -[LOVE6_1] -~g~Maintenant, attire les flics loin de l'entrepôt! - -[LOVE6_2] -~r~T'as pas réussi à attirer les flics assez loin! - -[RM4_3] -~r~L'associé de Ray s'est échappé! - -[RM6_C] -La CIA semble s'intéresser de près à la SPANK. - -[RM6_C1] -Et elle n'aime pas qu'on cherche des noises au Cartel. - -[C_PASS] -MENACE ENRAYEE! - -[CTUTOR] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions de caisse. - -[CTUTOR2] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions de caisse. - -[COPCART] -~g~Tu as ~1~ secondes pour retourner à une voiture de police avant que la mission ne s'achève. - -[C_FAIL] -Mission de caisse terminée! - -[C_CANC] -~r~Mission de caisse annulée! - -[C_ESCP] -~r~Le suspect s'est échappé! - -[C_TIME] -~r~Ta carrière de flic est terminée! - -[C_VIGIL] -BONUS POLICE! - -[A_FAIL2] -~r~Ton manque de précipitation a été fatal pour le patient! - -[A_FAIL3] -~r~Le patient est mort! - -[A_PASS] -Sauvé! - -[F_FAIL2] -~r~T'arrives trop tard! - -[A_COMP2] -T'en as jamais assez ? - -[RM2_M] -Si tu as besoin d'artillerie, passe prendre ce dont t'as besoin dans les armoires. - -[HEAL_A] -Ton niveau de ~h~santé~w~ s'affiche en orange en haut à droite de l'écran. - -[YD1_CNT] -~1~ sur 15! - -[FM1_9] -~g~C'est la fête un peu plus haut. Dépose Maria devant. - -[FM1_Y] -~w~Ça faisait longtemps que je m'étais pas amusée comme ça et tu m'as traitée vraiment bien ... avec respect et tout. - -[FM1_AA] -~w~Oh, faut que j'y aille, à bientôt j'espère. - -[NOCONTE] -Reconnecte la manette analogique (DUALSHOCK#) ou manette analogique (DUALSHOCK#2) au port de manette 1 pour continuer. - -[WRCONT] -La manette connectée au port de manette 1 n'est pas une manette compatible. GTA3 nécessite une manette analogique (DUALSHOCK#) ou manette analogique (DUALSHOCK#2). - -[WRCONTE] -La manette connectée au port de manette 1 n'est pas une manette compatible. GTA3 nécessite une manette analogique (DUALSHOCK#) ou manette analogique (DUALSHOCK#2). - -[WRONGCD] -Disque invalide. Veuillez insérer le bon disque. - -[NOCD] -Le compartiment à disque est vide. Veuillez insérer le disque. - -[OPENCD] -Le compartiment à disque est ouvert. Veuillez refermer le compartiment à disque. - -[CDERROR] -Erreur de lecture du DVD de GTA3 - -[RESTART] -Démarrage d'une nouvelle partie - -[GA_3] -Plus de cadeaux. 1000$ pour repeindre! - -[GA_1] -Oula! Je ne touche à rien d'aussi chaud, moi! - -[GA_1A] -Reviens quand tu seras moins occupé... - -[S_PROM2] -Le garage d'à côté peut garder une voiture quand tu sauvegardes la partie. - -[STOCK] -Stock épuisé - -[FM1_O] -~w~Je pense qu'il est à la gare sur le bord de mer de Chinatown. - -[EBAL_B] -Tiens c'est là! Allez, on va se garer et on va trouver de nouvelles fringues! - -[EBAL_G] -Ça, c'est la boîte de Luigi. Viens, on va rentrer par la porte de derrière. - -[AM4_3] -T'es le nouveau coursier d'Azuka! - -[AM4_4] -T'as le fric ? Le compte y est ? - -[AM4_5] -Je sais ce que tu penses, encore un ripoux. - -[AM4_6] -Ben, le monde est pourri. - -[AM4_7] -Parce que j'ai perdu quelques équipiers, ces enfoirés de poulets commencent à renifler partout. - -[AM4_8] -J'imagine qu'ils peuvent me sentir. - -[AM4_9] -Et oui, cette ville est un vrai dépotoir. - -[AM4_10] -Mais je vais avoir besoin d'aide. - -[AM4_11] -Si ça t'intéresse, tu sais où me trouver. - -[CAM_A] -Appuie sur la ~h~touche ~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ pour changer les modes ~h~caméra ~w~quand tu es à pied ou en voiture. - -[CAM_B] -~w~Appuie sur la ~h~touche directionnelle haut~w~ ou ~h~bas~w~ pour changer les modes ~h~caméra~w~ quand tu es à pied ou en voiture. - -[KM2_1] -~g~Répare la voiture, elle doit être comme neuve. - -[LM3_6] -Joey... - -[LM3_6A] -Est-ce que je vais jouer avec ton gros canon ? - -[LM3_9A] -Y'a peut-être du travail pour toi. - -[LM3_9B] -D'accord ? - -[AWAY2] -~r~Ils se sont enfuis. - -[AWAY] -~r~Il s'est barré d'ici! - -[JM6_1] -Va à la banque par la rue principale. - -[GA_6B] -Tu la gares, tu l'amorces en appuyant sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ et tu te barres! - -[GA_7B] -Pour armer la bombe, appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~. Elle explosera au démarrage. - -[BAT1] -~g~Ramasse la batte! - -[EBAL_O] -Si t'es réglo, j'ai du travail pour toi. Et maintenant, casse-toi! - -[HELP9_B] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~tirer~w~ avec le fusil à lunettes. - -[HELP9_C] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~tirer~w~ avec le fusil à lunettes. - -[JM6_8] -~r~T'as semé tous les braqueurs! - -[COLT_IN] -Le pistolet est disponible au Ma-Gnum. - -[TAXI2] -~r~Tu n'as plus le temps! - -[TAXI3] -~r~Ton client est parti terrorisé! - -[TAXI7] -~r~Ta voiture est endommagée, fais-la réparer. - -[TAXI4] -La course est finie! - -[TAXI5] -BONUS DE VITESSE! - -[TAXI6] -La mission Taxi est finie. - -[FRANGO] -~g~Salvatore veux que tu aides d'abord Toni à régler son affaire avec la Triade! - -[PAGEB12] -Pot-de-vin des flics livré à la planque - -[PAGEB13] -Santé livrée à la planque - -[PAGEB14] -Adrénaline livrée à la planque - -[KM1_4] -~g~T'as besoin d'une bagnole de flic pour ce job! - -[CAT1_B] -Apporte 500 000$ à la Villa de Cedar Grove. - -[JM2_C] -Il a un stand de nouilles dans Chinatown. - -[RM6_1] -Voilà la clé d'un coffre. - -[RM6_2] -T'y trouveras du cash et des provisions. J'avais mis ça de coté au cas où les choses tourneraient mal. - -[RM6_3] -A plus. - -[FE_INIP] -Initialisation et chargement du menu pause... Veuillez patienter. - -[FESZ_CA] -Annuler - -[FESZ_QU] -Quitter - -[FESZ_L1] -Partie sauvegardée avec succès! - -[FESZ_L2] -Le nom du fichier sauvegardé est : - -[FESZ_OK] -OK - -[FES_NGA] -Nouvelle partie - -[FES_CAN] -Annuler - -[FESZ_QL] -Toutes les étapes non sauvegardées de cette partie seront perdues. Charger la partie? - -[FESZ_QD] -Effacer cette sauvegarde? - -[FESZ_QO] -Ecraser cette sauvegarde? - -[FESZ_QR] -Veux-tu vraiment commencer une autre partie? Toutes vos données depuis la dernière partie sauvegardée seront perdues. Continuer? - -[FESZ_QS] -PASSEZ EN SAUVEGARDE? - -[SLONFP] -Port 1 Fichier Protégé. - -[T4X4_1] -'TERRAIN DE JEU DU PATRIOT' - -[T4X4_2] -'UN TOUR DANS LE PARC' - -[T4X4_3] -'ADHÉRENCE!' - -[MM_1] -'GAZ À TOUS LES ÉTAGES' - -[T4X4_1A] -~g~T'as ~y~5 minutes~g~ pour franchir ~y~15~g~ points de passage. - -[T4X4_1B] -~1~ sur 15! - -[T4X4_1C] -~g~Chaque point de passage te rapportera ~y~20 secondes~g~. - -[T4X4_2A] -~g~Tu as ~y~2 minutes~g~ pour franchir ~y~12~g~ points de passage! ~g~Tu peux les franchir dans ~y~n'importe quel ordre. - -[T4X4_2B] -~1~ sur 12! - -[T4X4_2C] -~y~ Passe le premier point de passage pour déclencher le chrono. ~y~ Chaque point de passage te rapportera ~y~10 secondes~g~. - -[T4X4_3A] -~g~Tu as ~y~5 minutes~g~ pour franchir ~y~20~g~ points de passage. ~g~Tu peux les franchir dans ~y~n'importe quel ordre. - -[T4X4_3B] -~y~Franchis~g~ le premier point de passage pour déclencher le chrono. ~g~Chaque point de passage te rapportera ~y~15 secondes~g~. - -[T4X4_3C] -~1~ sur 20! - -[T4X4_F] -~r~Tu t'es barré! Trop dur pour toi ?! - -[MM_1_A] -~g~Tu as ~y~2 minutes~g~ pour franchir les ~y~20 points de passage~g~ dans le parking à plusieurs étages! ~g~Tu peux les franchir dans n'importe quel ordre. - -[MM_1_B] -~1~ sur 20! - -[MM_1_C] -~g~Ca fait 20 secondes, plus ~y~5 secondes~g~ pour chaque point de passage. ~g~Le chrono commence ~y~immédiatement. - -[FM2_14] -~r~Tu t'es trop approché et Bill t'a vu! - -[FM2_15] -~g~Ne t'approche pas trop ou Bill va se douter de quelque chose! - -[UPSIDE] -~r~Tu t'es retourné! - -[FM2_16] -BALANÇOMETRE : - -[LM3_11] -~g~Misty ne montera pas dans un bus, trouve un autre véhicule! - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinelle - -[PATRIOT] -Patriot - -[FIRETRK] -Camion de pompier - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mule - -[CHEETAH] -Cheetah - -[AMBULAN] -Ambulance - -[FBICAR] -F.B.I. - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -M. Whoopee - -[BFINJC] -BF Injection - -[POLICAR] -Police - -[ENFORCR] -Enforcer - -[SECURI] -Sécuricar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Barracks OL - -[TRAIN] -Train - -[HELI] -Hélicoptère - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -RC Bandit - -[BELLYUP] -Triad - -[MRWONGS] -M. Wongs - -[MAFIACR] -Mafia - -[YARDICR] -Yardie - -[YAKUZCR] -Yakuza - -[DIABLCR] -Diablo - -[COLOMCR] -Cartel - -[HOODSCR] -Hoods - -[AEROPL] -Avion - -[SPEEDER] -Speeder - -[REEFER] -Reefer - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Borgnine - -[TOYZ] -TOYZ - -[FEST_DF] -Distance parcourue à pied (miles) - -[FEST_DC] -Distance parcourue en voiture (miles) - -[FESTDFM] -Distance parcourue à pied (m) - -[FESTDCM] -Distance parcourue en voiture (m) - -[FEST_R1] -Terrain de jeu du Patriot en secondes - -[FEST_R2] -Un tour dans le parc en secondes - -[FEST_R3] -Adhérence en secondes - -[FEST_RM] -Gaz à tous les étages en secondes - -[FEST_LS] -Nbre de personnes sauvées dans l'ambulance - -[FEST_CC] -Criminels tués dans la mission de police - -[FEST_FE] -Nombre total de feux éteints - -[FEST_LF] -Vol le plus long en Dodo - -[FEST_BD] -Meilleur temps pour désamorcer la bombe - -[FEST_RP] -Rodéos réussis - -[FEST_MP] -Missions réussies - -[FEST_BB] -Les fous du volants: - -[FEST_H0] -La plupart des points de passage - -[FEST_GC] -Nombre total de voitures de gang: - -[FEST_H1] -Destruction de Diablo - -[FEST_H2] -Massacre de la Mafia - -[FEST_H3] -Le désastre du casino - -[FEST_H4] -Le destructeur de Rumpo - -[USJI1] -TEXT NO LONGER REQUIRED - -[USJI2] -TEXT NO LONGER REQUIRED - -[USJI3] -TEXT NO LONGER REQUIRED - -[USJ] -BONUS POUR CASCADE UNIQUE! - -[SPRAY] -Amène ton véhicule à l'atelier de peinture pour annuler ton ~h~indice de recherche~w~, ~h~répare ~w~et ~h~repeins ~w~ton véhicule. Coût -~h~ 1000$. - -[HM1_1] -~G~Refroidis 20 Nines violets en 2 minutes et 30 secondes. - -[KM1_8A] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~activer la bombe~w~, n'oublie pas de t'éloigner. - -[KM1_8D] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour ~h~activer la bombe~w~, n'oublie pas de t'éloigner. - -[KM1_12] -~g~Amène-le au dojo mais débarrasse-toi des flics d'abord! - -[RATNG1] -Pickpocket - -[RATNG2] -Rascal - -[RATNG3] -Voyou - -[RATNG4] -Prostituée - -[RATNG5] -Idiot - -[RATNG6] -Pilote - -[RATNG7] -Gros Bras - -[RATNG8] -Réparateur - -[RATNG9] -Associé - -[RATNG10] -Nettoyeur - -[RATNG11] -Assassin - -[RATNG12] -Bras droit - -[RATNG13] -Exécutant - -[RATNG14] -Capo - -[RATNG15] -Patron - -[1010] -~r~Ta bagnole est sur le toit - -[1011] -~r~Ta bagnole est sur le toit - -[1012] -~r~Ta bagnole est sur le toit - -[1013] -~r~Ta bagnole est sur le toit - -[1014] -~r~Ta bagnole est sur le toit - -[JM4_10] -OK, Petit. Emmène-moi d'abord à la laverie de Chinatown, j'ai une affaire à régler. - -[JM4_11] -Cette petite laveuse ne paie pas pour sa protection. - -[JM4_12] -Et fais gaffe à la bagnole, Joey vient juste de la faire réparer. - -[JM4_13] -Alors pas de conneries, ok ? - -[KM4_11] -~g~Ramène la monnaie au casino! - -[FEF_BR2] -Retrouve-les en lisant les précédents briefings de missions. - -[TRAIN_1] -Station Kurowski - -[TRAIN_2] -Station Rothwell - -[TRAIN_3] -Station Baillie - -[SUBWAY1] -Station Portland - -[SUBWAY2] -Station Rockford - -[SUBWAY3] -Station Staunton South - -[SUBWAY4] -Terminal Shoreside - -[MEA4_2] -~r~Marty Chonks est mort! - -[SPRAY1] -Amène ton véhicule à l'atelier de peinture pour annuler ton ~h~indice de recherche~w~, ~h~répare ~w~et ~h~repeins ~w~ton véhicule. Coût -~h~ 1000$. Pour cette fois, c'est gratos. - -[JM4_A] -Ouais, je sais Tony, je l'ai défoncée en douceur. Elle miaule, tu vois ce que je veux dire ? - -[JM4_5] -Reviens plus tard et on leur donnera de la lessive à faire, leurs propres fringues avec leur sang dessus! - -[AMMU_A] -Luigi m'a dit que t'as besoin d'un calibre... - -[AMMU_B] -Joey m'a dit de t'équiper... - -[AMMU_C] -Alors tu vas aller derrière le magasin. Je t'ai laissé un 9mm dans le jardin. - -[AMMU_D] -J'ai tout ce qu'il faut en matière de sécurité. - -[AMMU_E] -Tu veux un permis aussi ? - -[AMMU_F] -J'ai pas besoin de tes papiers d'identité. Je pense qu'on peut te faire confiance. - -[DETON] -DETONATION : - -[DRIVE_A] -Selectionne un Uzi quand tu montes dans la voiture, regarde à gauche ou à droite et appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer. - -[DRIVE_B] -Selectionne un Uzi quand tu montes dans la voiture, regarde à gauche ou à droite et appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer. - -[RECORD] -~g~NOUVEAU RECORD! - -[NRECORD] -~r~PAS DE RECORD! - -[RCHELP] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ ou heurte une roue de voiture avec le véhicule télécommandé pour le faire exploser. - -[RCHELPA] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ ou heurte une roue de voiture avec le véhicule télécommandé pour le faire exploser. - -[RC_1] -Tu as 2 minutes pour faire péter autant de voitures de Diablo que tu peux! - -[RC_2] -Tu as 2 minutes pour faire péter autant de voitures de Mafia que tu peux! - -[RC_3] -Tu as 2 minutes pour faire péter autant de voitures de Yasuka que tu peux! - -[RC_4] -Tu as 2 minutes pour faire péter autant de voitures de Yardie que tu peux! - -[RC_5] -Tu as 2 minutes pour faire péter autant de voitures des Hoods que tu peux! - -[RC_6] -Tu as 2 minutes pour faire péter autant de voitures du Cartel que tu peux! - -[RAMPAGE] -RODEO! - -[RAMP_P] -RODEO REUSSI! - -[RAMP_F] -RODEO RATE - -[PAGE_00] -.. - -[PAGE_01] -Elimine ~1~ Diablos en 120 secondes! - -[PAGE_02] -Détruis ~1~ véhicules en 120 secondes! - -[PAGE_03] -Tue ~1~ Mafia en 120 secondes! - -[PAGE_04] -Tue ~1~ Triades en 120 secondes! - -[PAGE_05] -Tue ~1~ Triades en 120 secondes! - -[PAGE_06] -Détruis ~1~ véhicules en 120 secondes! - -[PAGE_07] -Dégomme ~1~ têtes de Yardies en 120 secondes! - -[PAGE_08] -Brûle ~1~ Yakuzas en 120 secondes! - -[PAGE_09] -Détruis ~1~ véhicules en 120 secondes! - -[PAGE_10] -Détruis ~1~ véhicules en 120 secondes! - -[PAGE_11] -Bute-moi ~1~ Yardies en 120 secondes! - -[PAGE_12] -Flambe ~1~ Yakuzas en 120 secondes! - -[PAGE_13] -Explose ~1~ Yardies en 120 secondes! - -[PAGE_14] -Grille-moi ~1~ Colombiens en 120 secondes! - -[PAGE_15] -Eclate ~1~ Hoods en 120 secondes! - -[PAGE_16] -Détruis ~1~ véhicules en 120 secondes! - -[PAGE_17] -Eclate ~1~ Colombiens avec une voiture en 120 secondes! - -[PAGE_18] -Détruis ~1~ véhicules en 120 secondes! - -[PAGE_19] -Fais sauter ~1~ têtes de Colombiens en 120 secondes! - -[PAGE_20] -Décapite ~1~ Hoods en 120 secondes! - -[JM1_A] -Hé, je m'fais chier, quand est-ce que tu me sautes ? - -[JM1_B] -Ça va pas tarder mon coeur, je dois juste m'occuper d'un truc. - -[JM1_C] -J'ai un petit boulot pour toi, mon gars. - -[JM1_D] -Les frères Forelli me doivent du fric depuis trop longtemps - -[JM1_E] -et ils ont besoin qu'on leur apprenne un peu ce que c'est que le respect. - -[JM1_F] -Forelli Grosses Babines est en train de s'empiffrer au Bistro de St. Marks, - -[JM1_G] -alors tu lui prends sa tire et tu l'amènes à l'atelier de 8-Ball, à Harwood. - -[JM1_H] -Tu connais 8-Ball, pas vrai ? - -[JM1_I] -Une fois qu'il l'a truffée avec une bombe, tu remets la voiture où tu l'as trouvée. - -[JM1_J] -Et puis tu t'assois et tu regardes le spectacle. - -[JM1_K] -Mais grouille, il va mettre trois plombes à bouffer. - -[CAT2_A1] -Viens là, petite pute! - -[CAT2_A] -La question est : tu es venu pour sauver Maria ou pour me récupérer ? - -[CAT2_B] -Eh bien, j'ai des infos pour toi, - -[CAT2_B2] -te tuer sera un vrai plaisir mais sortir avec toi faisait partie du business. - -[CAT2_C] -Tu estas muy peccino amigo! - -[CAT2_D] -Lance-moi l'argent - -[CAT2_E] -T'as été très occupé! - -[CAT2_E2] -Mais tu n'as rien appris, on ne peut pas me faire confiance. - -[CAT2_E3] -Descends cet idiot. - -[CAT2_J] -Fais-moi voler ça! - -[HM5_1] -Salut. D-Ice a dit que tu venais. Y'a des règles : juste des battes, pas de flingue, pas de bagnole. - -[HM5_5] -On se bat pour le respect, tu piges ? - -[HELP14] -Pour ramasser les armes, marche dessus. Tu ne peux pas en récupérer depuis un véhicule. - -[CRUSH] -Gare-toi sur l'emplacement indiqué et sors de la voiture. La voiture sera alors compressée. - -[DIAB2_B] -Un gang de bons à rien m'a menacé de me couper mon outil de travail si je ne leur paye pas un impôt. - -[DIAB2_C] -Ils ont menacé le mauvais gars, amigo. - -[DIAB2_D] -Je sais qu'ils ont un faible pour les glaces. - -[DIAB2_E] -Va chercher la bombe que j'ai planquée à Harwood - -[DIAB2_F] -et pique la camionnette du vendeur de glaces pendant sa tournée. - -[DIAB2_G] -Attire ces abrutis vers leur destinée fatale avec la clochette. - -[DIAB2_H] -Ils se planquent dans un entrepôt à Atlantic Quays. - -[DIAB3_A] -Des prétentieux de la Triade ont volé ma magnifique bagnole la nuit dernière, - -[DIAB3_B] -ils l'ont bousillée et l'ont brûlée. - -[DIAB3_C] -Quelques-uns de mes plus précieux objets étaient dans le coffre : - -[DIAB3_D] -des collectors irremplaçables! - -[DIAB3_E] -J'ai planqué une arme à la lisière de Chinatown. - -[DIAB3_F] -Prends-la et montre à ces vandales de la Triade qu'El Burro est en colère! - -[DIAB3_1] -TUE 25 TRIADES - -[DIAB4_A] -Un petit malin a piqué un camion plein de mes dernières publications fraîchement imprimées. - -[DIAB4_B] -Mais cet idiot camé à la Spank a laissé les portes de la camionette ouvertes - -[DIAB4_C] -et toutes les belles photos - -[DIAB4_D] -de ma dernière production pour adultes, sont semées à travers Liberty! - -[DIAB4_E] -Prends le camion et suis la piste des magazines Le Taureau se fait Suelen, volumes 1, 2 et 3. - -[DIAB4_F] -Dès que t'en trouves un, ramasse-le. - -[DIAB4_G] -Quand tu auras retrouvé ce voleur bourré à la Spank, descends-le! - -[DIAB4_H] -Après, tu iras livrer les magazines porno à XXX Mags dans Le Quartier Rouge. - -[DIAB4_1] -~g~Amène la camionnette à l'arrière de XXX Magazines. - -[HM1_E] -Je veux que tu montres à ces assoiffés de sang comment ça marche une vraie descente. - -[HM1_H] -Fais-moi déguerpir tous ces 'Nines'! - -[HM2_A] -Ces Nines me poussent à bout. - -[HM2_B] -Ces salauds ont des voitures blindées et maintenant ils dealent de la SPANK... - -[HM2_C] -et ils poussent à la conso chez nous sans être inquiétés. - -[HM2_D] -Y'a une bagnole garée plus haut. - -[HM2_E] -Y'a des trucs dedans pour mettre ces abrutis hors d'état de nuire... - -[HM3_A] -Y'en a qui ont piégé ma bagnole pour qu'elle saute. - -[HM3_B] -Si je perds ma bagnole, ma réputation est foutue. - -[HM3_C] -Va chercher ma caisse et amène-la au garage en haut de St. Marks, t'as pigé ? - -[HM3_D] -Laisse-les faire, laisse-les s'occuper de la bombe. - -[HM3_E] -L'horloge tourne et le cablage est un vrai bordel. - -[HM3_F] -Un nid de poule de trop et ça peut péter. - -[HM3_G] -Maintenant grouille! - -[HM4_A] -Un vol de la réserve fédérale s'est crashé à l'atterrissage, à l'aéroport Francis. - -[HM4_B] -Y'a du platine partout sur la piste. - -[HM4_C] -Prends une bagnole et va ramasser tout ce que tu peux. - -[HM4_F] -Tu peux balancer les lingots dans un de mes garages. - -[HM4_G] -Ce platine, ça pèse le poids d'un âne mort et ça va ralentir ta bagnole. - -[HM4_H] -Alors fais plusieurs voyages au garage. - -[HM5_A] -Les Nines se sont faits massacrer... - -[HM5_B] -mais ils veulent toujours la guerre. - -[HM5_C] -Ils sont d'accord pour un duel. - -[HM5_D] -Un de leurs gangs contre 2 des nôtres, ou plutôt - -[HM5_E] -deux des vôtres. - -[HM5_F] -J'irais bien mais... - -[HM5_G] -je suis en conditionnelle pour encore trois mois. - -[HM5_H] -Tu vois ce que je veux dire ? - -[HM5_I] -Va voir mon petit frère, - -[HM5_J] -il te montrera où il faut que t'ailles. - -[MEA1_B] -Mon nom est Chonks, Marty Chonks. - -[MEA1_C] -Je dirige l'usine de pâtée pour chiens juste à coté. - -[MEA1_D] -J'ai des problèmes de fric, mais qui n'en a pas, hein ? - -[MEA1_E] -Je dois rencontrer mon banquier plus tard. - -[MEA1_F] -C'est un sale voleur qui arrête pas d'augmenter les mensualités de mon emprunt pour s'en foutre une part dans la fouille. - -[MEA1_G] -Prends ma bagnole, va le chercher et ramène-le ici. - -[MEA1_H] -J'ai une petite surprise pour cette sangsue! - -[MEA2_A] -J'ai engagé des cambrioleurs pour braquer mon appart... - -[MEA2_C] -Ces bâtards menacent de tout dire à la compagnie d'assurance, - -[MEA2_D] -si je les arrose pas plus. - -[MEA2_E] -T'y crois toi ? - -[MEA2_F] -J'ai laissé une voiture dans l'usine. - -[MEA2_G] -Prends-la et va les chercher chez eux dans le Le Quartier Rouge. - -[MEA2_H] -Et puis tu les ramènes à l'usine, comme ça je vais pouvoir leur expliquer le point de vue de Marty. - -[MEA3_A] -si je trouve pas du cash tout de suite, mon affaire va couler. - -[MEA3_B] -Ma femme a une assurance-vie et tout ce qu'elle a jamais fait pour moi, c'est un trou dans mon budget. - -[MEA3_C] -J'ai laissé la voiture à sa place. - -[MEA3_D] -Va checher ma femme chez la manucure Classic Nails et ramène-la à l'usine. - -[MEA4_A] -Putain, je suis dans la merde! - -[MEA4_B] -Ben, ma femme voyait un mec à qui je dois de l'argent. - -[MEA4_C] -Il est est très fâché et lui, tout ce qu'il veut, c'est récupérer son pognon! - -[MEA4_E] -Il pense que je vais le rembourser... - -[MEA4_F] -mais moi je pense plutôt que... - -[MEA4_G] -les chiens de Liberty vont devoir s'habituer à une nouvelle pâtée ce mois-ci! - -[WELCOME] -BIENVENUE A - -[HM1_2] -~g~Trouve une bagnole et souviens-toi que seuls les meurtres à l'Uzi sont pris en considération! - -[HELP8_B] -Appuie sur la~h~ touche ~k~~PED_SNIPER_ZOOM_IN~ ~w~pour faire un ~h~zoom avant ~w~avec la lunette et sur la ~h~touche ~k~~PED_SNIPER_ZOOM_OUT~~w~ pour faire un ~h~zoom arrière~w~. - -[LRQC_1] -Asuka et moi, on doit parler, hein, - -[LRQC_2] -alors va faire un tour, ok ? - -[LRQC_3] -T'auras besoin d'un endroit pour te planquer. - -[LRQC_4] -Il y a un entrepôt au bord de Belleville qui te conviendra. - -[LRQC_5] -Reviens ici dans mon Condo quand tu es prêt - -[LRQC_6] -et on aura une petite conversation. - -[JM6_5] -~g~Il te faut une caisse pour t'enfuir, imbécile! - -[JM2_F] -Si t'as besoin d'un calibre, va derrière le AmmuNation, en face du métro. - -[LOVE4_7] -~g~Il y a un chantier à l'île Staunton . Ils ont peut-être amené la marchandise là-bas. - -[LOVE4_8] -~G~Tu auras besoin d'une voiture pour ouvrir le garage. - -[TSCORE] -GAINS : ~1~$ - -[AM1_9] -~r~Salvatore est retourné au club de Luigi! - -[AM1_6] -~g~Si tu restes autour du club de Luigi, la Mafia va te repérer! - -[TM2_3] -~g~C'est un piège! Descends-les tous! - -[FM4_1] -C'est Maria. La voiture est piégée! Rejoins-moi sur le quai au sud du pont de Callahan. - -[JM1_7] -~g~Ferme la portière! Il va nous repérer! - -[KM5_1] -~g~DEALER DESCENDU! - -[KM5_6] -~g~Tu dois tuer au moins 8 dealers de Yardie. - -[KM5_7] -~g~Ne perds pas de temps! Dès qu'ils auront dealer la SPANK, ils ne resteront pas dans les parages bien longtemps! - -[RM3_8] -~r~Cette bagnole est un leurre! - -[LM3_8] -Salut. Moi, c'est Joey. - -[LM3_9] -Luigi m'a dit que t'étais réglo alors reviens plus tard. - -[KM3_5] -~g~Klaxonne pour donner le signal. - -[LOVE7] -LA DISPARITION DE LOVE - -[LOVE2_5] -~g~Kenji est écrabouillé! Tire-toi de Newport et débarrasse-toi de la bagnole. - -[AS2_11] -~g~~1~ SUR 9! - -[GARAGE1] -~g~Sors de la bagnole et continue à pied. - -[KM3_11] -~g~Le Cartel a été attaqué et la malette n'a pas été retrouvée. - -[KM3_12] -~g~Tue tous les Colombiens, détruis les bagnoles et retrouve la malette. - -[KM3_13] -~g~Ramène la malette au casino. - -[RM5_6] -~g~Il s'est enfui! Bousille-lui son plâtre avec une bagnole ou une explosion! - -[PBOAT_1] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer avec les canons du bateau. - -[PBOAT_2] -Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer avec les canons du bateau. - -[DIAB1_B] -C'est El Burro des Diablos. - -[DIAB1_D] -T'es nouveau à Liberty mais tu t'es déjà fait une sacrée réputation dans la rue. - -[DIAB1_E] -Il y a une course de bagnoles qui va partir de la vieille école près du pont de Callahan. - -[DIAB1_F] -Trouve-toi une caisse et le premier qui franchit tous les points de passage, gagne le gros lot. - -[HM2_1] -Utilise les buggies télécommandés pour détruire les voitures blindées. Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour les faire exploser. - -[HM2_1A] -Utilise les buggies télécommandés pour détruire les voitures blindées. Appuie sur la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour les faire exploser. - -[HM2_2] -~r~T'as pas réussi à détruire toutes leurs voitures blindées! - -[HM2_6] -~g~Voiture blindée détruite! - -[RM3_A] -Je connais un mec important en ville, un coeur tendre, - -[RM3_H] -avec ce qu'on pourrait appeler des envies exotiques et l'argent pour les assouvir. - -[RM3_B] -Il est compromis dans une affaire et l'avocat général a des photos assez embarrassantes de lui, - -[RM3_C] -pendant une séance de tir ou quelque chose comme ça. - -[LOVE6_A] -Une leçon en affaires, mon ami. - -[LOVE6_E] -Si tu as quelque chose d'unique, le monde entier essaiera de te le subtiliser.. - -[LOVE6_C] -Les équipes spéciales de la police ont fermé le périmètre autour de mon associé et du paquet. - -[LOVE6_D] -Va là-bas, prends la camionnette et fais diversion. - -[LOVE6_F] -Occupe-les pour que nos hommes puissent s'échapper. - -[AM3_C] -Il est sûrement dans la baie à l'heure qu'il est! Vole un bateau de la police et fais-le couler! - -[FESZ_UC] -ANNULER - -[FEDS_SM] -L1,R1-CHANGER MENU - -[FEDS_AS] -;=-CHANGER SELECTION - -[FEDSAS2] -<>-CHANGER SELECTION - -[FEDS_SS] -L1,R1-CHANGER SELECTION - -[FEDSSC1] -;-DEFILEMENT RAPIDE - -[FEDSSC2] -=-ARRETER DEFILEMENT - -[MEA2_3] -~g~Ramène la voiture à l'usine. - -[RM1_3] -~r~McCaffrey s'est enfui! - -[RM1_4] -~g~T'as utilisé toutes les grenades! Va en chercher chez Ma-Gnum! - -[RM1_5] -~g~Retourne là-bas et brûle la barraque! - -[RM6_4] -~g~Va aux coffres et ramasse la came de Ray. - -[RM6_5] -~g~La CIA surveille le pont, trouve une autre route. - -[HM2_F] -Et bousille tous leurs fourgons blindés. - -[HM_4] -'LA COURSE AUX LINGOTS' - -[MEA2_B5] -TEXT NO LONGER NEEDED - -[MEA1_B5] -TEXT NO LONGER NEEDED - -[MEA3_B5] -TEXT NO LONGER NEEDED - -[MEA4_B7] -Mais si tu viens dans mon bureau... - -[MEA3_B4] -Marty veut me voir ? Ben, il a intérêt à se dépêcher parce que j'ai rendez-vous chez le coiffeur après. - -[KM3_7] -C'est un piège des Yakuzas, mec! - -[FES_LOF] -Echec du chargement. - -[P1INSA] -Port 1 carte mémoire insérée. ~1~Ko d'espace libre. ~1~Ko requis. - -[P1INSN] -Port 1 carte mémoire. Espace libre insuffisant. Veuillez effacer certains fichiers. - -[FES_SLO] -FICHIER - -[FES_ISC] -EST CORROMPUE - -[FESZ_TI] -SAUVEGARDER Z1 - -[FESZ_SA] -Sauvegarder la partie - -[P1NOIN] -Port 1. Carte mémoire non insérée. - -[P1INSE] -Port 1. Carte mémoire insérée. - -[MC_LDFL] -Echec du chargement. - -[MC_NWRE] -Redémarrage du jeu... - -[LOVE6_3] -~g~Tu as ~1~ secondes pour retourner au fourgon blindé avant de rater la mission. - -[LOVE6_4] -~r~Tu t'es débarrassé de la fausse Sécuricar! - -[HELP1] -Arrête-toi au centre du repère bleu. - -[HELP12] -Va au milieu du repère bleu pour lancer une mission. - -[HJSTAT] -Distance : ~1~.~1~m Hauteur : ~1~.~1~m Saltos :~1~ Rotation : ~1~' - -[HJSTATW] -Distance : ~1~.~1~m Hauteur : ~1~.~1~m Saltos : ~1~ Rotation : ~1~ Et quelle belle réception! - -[DIAB1_5] -TEMPS DE COURSE : - -[LOVE3_4] -~r~Tu as détruit l'avion! - -[F_FAIL1] -Mission Camion de Pompier terminée. - -[F_CANC] -~r~Mission Pompier annulée! - -[F_EXTIN] -FEUX : - -[A_COMP1] -Missions Ambulance réussies! - -[A_CANC] -~r~Mission Ambulance annulée! - -[A_COMP3] -Missions Ambulance réussies! Tu ne seras jamais fatigué en courant! - -[ATUTOR] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Ambulance. - -[ATUTOR3] -Appuie sur la ~h~touche ~k~~TOGGLE_SUBMISSIONS~~w~ pour activer ou désactiver les missions Ambulance. - -[ALEVEL] -Mission Ambulance Niveau ~1~ - -[A_FAIL1] -Mission Ambulance terminée. - -[FEST_HA] -Mission Ambulance Niveau Maximum - -[A_SAVES] -PERSONNES SAUVEES : ~1~ - -[C_KILLS] -CRIMINELS TUES : ~1~ - -[HM1_B] -J'ai un problème, ils essaient de me rouler. - -[AM2_A] -La mort de Salvatore est une bonne nouvelle, - -[AM2_A2] -tu es un tueur efficace, j'aime ça chez un homme. - -[AM2_B] -Voilà mon frère, Kenji. - -[AM2_C] -Asuka a un petit boulot pour toi, mais quand t'as fini, passe à mon casino et on va causer. - -[AM2_D] -C'est bien Kenji, faut toujours qu'il joue avec mes jouets. - -[AM2_E] -Mon indic à la police m'a dit que la Mafia surveille nos activités en ville - -[AM2_E2] -et qu'elle est à tes trousses. - -[AM2_F] -On ne peut pas reprendre nos activités, tant qu'ils sont dans les parages. - -[AM2_G] -Elimine ces fouille-merde et mets un terme à cette vendetta une bonne fois pour toutes. - -[F_START] -~g~Véhicule en feu signalé dans le secteur ~a~. Vas-y et éteins le feu. - -[AM4_1A] -Va à la cabine de parc de Belleville ouest. - -[AM4_1B] -Va à la cabine du campus de Liberty. - -[AM4_1C] -Va à la cabine du parc de Belleville sud. - -[AM4_1D] -Retrouve-moi dans les toilettes du parc. - -[HJSTATF] -Distance : ~1~ft Hauteur : ~1~ft Saltos :~1~ Rotation : ~1~- - -[HJSTAWF] -Distance : ~1~ft Hauteur : ~1~ft Saltos :~1~ Rotation : ~1~- Et quelle belle réception! - -[HM1_F] -Mais fais gaffe à toi, y'aura aussi des Jacks dans la rue qui vont croire que tu veux aussi les buter. - -[HM1_D] -Leur nom, c'est 'Nines' et leur drapeau est violet. Et chaque fois qu'ils font parader leurs couleurs... - -[HM1_G] -les 'Jacks' perdent la face. - -[MEA2_B] -et voler plein de trucs, comme ça l'assurance me remboursera. - -[TM3_H] -~w~T'as fait du bon boulot là-bas petit, c'est très bien. - -[TM3_I] -~w~Allez, on va te présenter au Don. - -[TM3_J] -~w~Hé! Luigi! - -[TM3_K] -~w~Oh tu as beaucoup manqué à mes filles, Salvatore, tu as été absent trop longtemps. - -[TM3_L] -Tu leur diras que, quand tous ces emmerdes seront terminés, - -[TM3_M] -on ira tous à la boîte pour fêter ça, ok ? - -[TM3_N] -~w~Voila mon petit. - -[TM3_N2] -~w~Comment ça va, Papa ? - -[TM3_O] -~w~Alors tu t'es enfin trouvé une femme ? - -[TM3_P] -~w~Ta mère, paix à son âme, se retournerait dans sa tombe - -[TM3_Q] -~w~de te voir sans femme. - -[TM3_R] -~w~Je sais 'Pa, j'y travaille. - -[TM3_S] -~w~Toni! Comment va ta mère ? - -[TM3_T] -~w~C'est une femme bien. Forte. De Florence. - -[TM3_U] -~w~Ça va... elle va bien. - -[TM3_V] -~w~Très bien. Bon les gars, entrez pendant que je parle à notre nouveau venu. - -[TM3_W] -~w~Je ne vois que des bonnes choses pour toi, mon petit... - -[RM1_A] -Cet enfoiré de McAffrey a accepté plus de pots-de-vin que n'importe qui. - -[RM1_B] -Il pense qu'il ne va pas être poursuivi s'il donne des preuves aux condés. - -[RM1_C] -Il a balancé! - -[RM4_B] -Faut qu'on le réduise au silence définitivement. - -[RM4_E] -Je le veux dormant avec les poissons, pas en train de les bouffer. - -[LOVE3_B] -Ce soir en approchant de l'aéroport de Liberty, un petit avion passera au dessus de la baie. - -[LOVE4_D] -Malheureusement, les autorités du port ont saisi l'avion et l'ont mis en pièces - -[LOVE4_H] -avant que je puisse intervenir et ça m'a coûté cher. - -[LOVE4_E] -Traverse le pont et va à l'aéroport International Francis. - -[GTAB_A] -Hé, débarrasse-toi de ça. On ne sait pas ce que c'est - -[GTAB_B] -mais il a l'air d'y tenir beaucoup, donc ça doit valoir quelque chose. - -[GTAB_C] -Qui est-ce qui... - -[GTAB_D] -TOI! - -[GTAB_E] -Hé calme-toi amigo! De nada! De nada! - -[GTAB_F] -Je t'ai laissé à moitié mort dans le caniveau! - -[GTAB_G] -Ne tire pas amigo. Pas de problèmes. On est tous amis. Tiens, prends ça. - -[GTAB_H] -Arrête de faire la tapette! - -[GTAB_I] -On n'a pas le choix, bébé! - -[GTAB_J] -On a toujours le choix, espèce d'abruti! - -[GTAB_K] -Je m'excuse pour cette pute hystérique mec, elles sont toutes les mêmes... por favor ?? - -[GTAB_L] -Alors la pute s'est barrée. - -[GTAB_M] -Mais tu m'as fait une fleur, - -[GTAB_N] -tu n'es pas le seul à avoir à régler des comptes avec le Cartel, - -[GTAB_O] -ce cafard a tué mon frère! - -[GTAB_P] -Je n'ai jamais tué de Yakuza! - -[GTAB_Q] -MENTEUR! On a tous vu l'assassin du Cartel. - -[GTAB_R] -On va tous vous retrouver et vous descendre, vous, les chiens de Colombiens! - -[GTAB_S] -Je vais travailler avec votre ami ici, pour obtenir des informations et un peu de plaisir. - -[GTAB_T] -Toi, tu reviens plus tard, je suis sûr que je vais avoir besoin de tes services. - -[GTAB_U] -S'il te plait amigo, ne me laisse pas avec elle, c'est une minette psychotique! Amigo ? Hé AMIIIGO!!!... Aïïïïïïïeeeeee! - -[LOVE5_A] -Tu as prouvé que tu étais un bon investissement, ce qui est rare en ces jours de récession. - -[KM3_1] -~g~Le Cartel s'attend à ce qu'un des Yardies vole une voiture de Yardie! Va vers le Nord, tu en trouveras une à Newport. - -[LOVE1_1] -~g~Va piquer une voiture du gang des Colombiens, comme ça tu pourras rentrer dans leur planque. Dirige-toi vers le Nord, tu en trouveras une à Fort Stanton. - -[FM1_Q1] -~w~Vous voulez vous amuser ? Un petit... hmm ? Du Spank ? - -[FM1_R] -~w~Salut Chico. Non, comme d'habitude. - -[FM1_T] -~w~Merci Chico. A plus tard. - -[FM1_W] -. ~w~Ok Fido, tu attends ici et tu surveilles la caisse pendant que je vais m'éclater. - -[FM1_X] -~w~Ok Fido, tirons-nous d'ici. Ouuulaa! - -[FM1_Q] -~w~Hé Maria! C'est ma plus belle jument! - -[FM1_S1] -~w~Tu devrais passer à la fête de l'entrepôt à l'est d'Atlantic Quays. - -[FM1_U] -~w~Gracias et éclate-toi. C'est de la bombe. - -[FM1_V] -~w~Allez Fido, on va aller faire un tour à cette fête! - -[FM1_SS] -~r~SCANNER : ~w~Quatre-Cinq à toutes les unités : rejoignez les stups à Atlantic Quays... - -[LOVE6_B] -Même s'ils n'ont pas la moindre idée de sa vraie valeur. - -[TM3_A1] -~r~Joey s'est fait avoir! - -[TM3_A2] -~r~Joey et Luigi se sont fait descendre! - -[TM3_A3] -~r~Joey, Luigi et Toni se sont fait buter! - -[FM4_2] -Salvatore pense qu'on le court-circuite, - -[FM4_3] -alors il voulait te donner au Cartel pour pouvoir faire un deal. - -[FM4_4] -Je pouvais pas le laisser faire, je veux dire, - -[FM4_4B] -tout ça, c'est de ma faute... parce que je lui ai dit qu'on était ensemble. - -[FM4_5] -Me demande pas pourquoi. J'en sais rien. - -[FM4_6] -T'es sur la liste rouge dans la Mafia et je veux me tirer d'ici, moi aussi. - -[FM4_6B] -J'ai vu trop de crimes. Trop de sang! - -[FM4_7] -C'est une amie à moi Ok, une vieille copine... Elle s'appelle Asuka, on peut lui faire confiance. - -[FM4_8] -Allez, on a assez causé. - -[FM4_9] -On ferait mieux de se barrer avant d'avoir tous ces Italiens hystériques aux fesses. - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUCER - -[CRED003] -LESLIE BENZIES - -[CRED004] -ART DIRECTOR - -[CRED005] -AARON GARBUT - -[CRED006] -TECHNICAL DIRECTION - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -DESIGN - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -WRITTEN BY - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -CHARACTERS - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMATION & DIRECTION - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -AUTO DESIGN - -[CRED024] -PAUL KUROWSKI - -[CRED025] -ARTISTS - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODERS - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -SCORE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -SOUND DESIGN & MASTERING - -[CRED042] -ALLAN WALKER - -[CRED043] -AUDIO PROGRAMMING - -[CRED044] -RAYMOND USHER - -[CRED045] -TEST MANAGER - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -LEAD TESTERS - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRD050A] -TESTERS - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -TECHNICAL SUPPORT - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -EXECUTIVE PRODUCER - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUCER - -[CRED064] -DAN HOUSER - -[CRED065] -DIRECTOR OF DEVELOPMENT - -[CRED066] -JAMIE KING - -[CRED067] -TECHNICAL PRODUCER - -[CRED068] -GARY J. FOREMAN - -[CRED069] -ASSOCIATE PRODUCER - -[CRED070] -JEREMY POPE - -[CRED071] -MUSIC SUPERVISOR - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VP OF MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -TECHNICAL COORDINATOR - -[CRED088] -BRANDON ROSE - -[CRED089] -QA MANAGER - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -GAME ANALYST - -[CRED094] -RICHARD HUIE - -[CRED095] -TEST TEAM - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -LIBERTY TREE EDITORIAL - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -CUT-SCENES - -[CRED108] -SCRIPT BY DAN HOUSER AND JAMES WORRALL - -[CRED109] -AUDIO DIRECTED BY DAN HOUSER - -[CRED110] -AUDIO PRODUCED BY RENAUD SEBBANE - -[CRED111] -CAST - -[CRED112] -FRANK VINCENT AS SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO AS LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN AS TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT AS JOEY LEONE - -[CRED116] -DEBBI MAZAR AS MARIA - -[CRED117] -KYLE MACLACHLAN AS DONALD LOVE - -[CRED118] -ROBERT LOGGIA AS RAY MACHOWSKI - -[CRED119] -GURU AS 8-BALL - -[CRED120] -SONDRA JAMES AS MOMMA - -[CRED121] -LIANA PAI AS ASUKA - -[CRED122] -LES MAU AS KENJI - -[CRED123] -CYNTHIA FARRELL AS CATALINA - -[CRED124] -AL ESPINOSA AS MIGUEL - -[CRED125] -CHRIS PHILLIPS AS EL BURRO - -[CRED126] -HUNTER PLATIN AS CHICO - -[CRED127] -WALTER MUDU AS D-ICE - -[CRED128] -CURTIS MCCLARIN AS CURTLY - -[CRED129] -BILL FIORE AS DARKEL - -[CRED130] -CHRIS PHILLIPS AS MARTY CHONKS - -[CRED131] -HUNTER PLATIN AS CURLY BOB - -[CRED132] -WALTER MUDU AS KING COURTNEY - -[CRED133] -HUNTER PLATIN AS ONE-ARMED PHIL - -[CRED134] -KIM GURNEY AS MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATED BY - -[CRD136A] -ALEX HORTON - -[CRED137] -DIRECTED BY - -[CRD137A] -NAVID KHONSARI - -[CRED138] -PRODUCED BY - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRED139] -RECORDED AT MODERN UPRISING STUDIOS, BROOKLYN - -[CRED140] -ACTORS - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS. - -[CRED141] -PEDESTRIAN DIALOGUE - -[CRED142] -WRITTEN BY DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRECTED BY CRAIG CONNER, DAN HOUSER AND LAZLOW - -[CRED144] -PRODUCED BY RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -RADIO STATIONS AND MUSIC - -[CRED218] -PRODUCERS FOR ROCKSTAR UK - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED219] -SOUNDTRACK CO-ORDINATOR - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUCER FOR ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -EDITED BY - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER AND IMAGING WRITTEN BY - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -SPECIAL THANKS TO - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[J_EP] -PRODUCTEUR EXECUTIF - -[N_EP] -SAM HOUSER - -[J_PROD] -PRODUCTEUR - -[N_PROD] -LESLIE BENZIES - -[J_AD] -DIRECTEUR ARTISTIQUE - -[N_AD] -AARON GARBUT - -[J_TD] -DIRECTEURS TECHNIQUES - -[N_TD1] -OBBE VERMEIJ - -[N_TD2] -ADAM FOWLER - -[J_COD] -ENCODEURS - -[N_COD1] -ALEXANDER ROGER - -[N_COD2] -GRAEME WILLIAMSON - -[N_COD3] -MARK HANLON - -[N_COD4] -ALAN CAMPBELL - -[N_COD5] -RAYMOND USHER - -[N_COD6] -ANDRZEJ MADAJCZYK - -[J_ART] -INFOGRAPHISTES - -[N_ART1] -ADAM COCHRANE - -[N_ART2] -ALISDAIR WOOD - -[N_ART3] -GARY MCADAM - -[N_ART4] -ANDREW SOOSAY - -[N_ART5] -KEIRAN BAILLIE - -[J_AUTO] -CONCEPTION AUTOMOBILE - -[N_AUTO] -PAUL KUROWSKI - -[J_CHAR] -PERSONNAGES - -[N_CHAR] -IAN MCQUE - -[J_ANIM] -ANIMATION ET REALISATION - -[N_ANIM1] -ALEX HORTON - -[N_ANIM2] -NAVID KHONSARI - -[N_ANIM3] -LEE MONTGOMERY - -[J_SND] -CONCEPTION SON - -[N_SND1] -ALLAN WALKER - -[J_SCR] -MUSIQUE - -[N_SCR1] -CRAIG CONNER - -[N_SCR2] -STUART ROSS - -[J_DSGN] -CONCEPTION - -[N_DSGN1] -CRAIG FILSHIE - -[N_DSGN2] -WILLIAM MILLS - -[N_DSGN3] -CHRIS ROTHWELL - -[N_DSGN4] -JAMES WORRALL - -[J_WRT] -SCENARIO - -[N_WRT1] -JAMES WORRALL - -[N_WRT2] -DAN HOUSER - -[N_WRT3] -PAUL KUROWSKI - -[J_IT] -ASSISTANCE TECHNIQUE - -[N_IT1] -LORRAINE ROY - -[N_IT2] -CHRISTINE CHALMERS - -[J_IQA] -RESPONSABLE DES TESTS - -[N_IQA1] -CRAIG ARBUTHNOTT - -[LEAD_T] -TESTEURS PRINCIPAUX - -[N_IQA2] -JOHN HAIME - -[N_IQA3] -NEIL CORBETT - -[N_IQA4] -ANDY DUTHIE - -[TEST] -TESTEURS - -[N_IQA5] -GRAEME JENNINGS - -[N_IQA6] -DAVID MURDOCH - -[N_IQA7] -DAVID BEDDOES - -[N_IQA8] -EDWIN SMITH - -[N_IQA9] -MARK FLETT - -[N_IQ10] -MICHAEL SUTHERLAND - -[J_EQA] -ROCKSTAR NEW YORK - -[N_EQA1] -JEFF ROSA - -[LEAD_T2] -TESTEUR PRINCIPAL - -[N_EQA2] -ADAM DAVIDSON - -[N_EQA3] -JOE HOWELL - -[N_EQA4] -JOE GREEN - -[N_EQA5] -RICH HUIE - -[N_EQA6] -JEREMY POPE - -[N_EQA7] -KAHLEEM POOLE - -[N_EQA8] -HAKLIN NG - -[N_EQA9] -MIKE HONG - -[N_EQA10] -BRIAN PLANAR - -[N_EQA11] -JAMEEL VEGA - -[CINCAM] -Caméra Cinématique - -[KM1_13] -Amène cette bagnole au garage! - -[KM3_14] -~r~Tu t'es fait repérer, le marché est annulé! - -[EBAL_H] -Attends-moi ici pendant que je vais aller parler à luigi. - -[EBAL_M] -Rappelle-toi que personne n'embrouille mes filles! - -[LM2_F] -Tu lui prends sa caisse et tu la repeins. - -[LM2_D] -Ben voilà, prends-le. - -[LM1_9] -Salut, je m'appelle Misty. - -[LM4_A] -Y'a des connards de Diablos qui font tapiner leurs sales putes sur mon territoire. - -[FM2_B] -On a une balance! - -[FM2_C] -Il fait pas le maquereau,ni le dealer, donc il doit parler. - -[FM3_CC] -~w~Reviens quand t'auras le pognon, frangin. - -[FEDS_AM] -<>-CHANGER MENU - -[LOVE5_5] -~r~T'as pas su protéger le camion! - -[RM6_6] -~r~Ray est mort! - -[RM6_7] -. ~r~Ray a raté son vol. - -[RM6_8] -~g~Tu as laissé tomber Ray, retourne le chercher. - -[FM1_10] -~g~Tu as laissé tomber Maria, retourne la chercher. - -[LOVE4_9] -~r~L'avion a été détruit! - -[LOV4_10] -~r~La seule piste pour retrouver le paquet est partie en fumée! - -[KM2_D] -Cela va sans dire, on va lui en faire cadeau, pour éponger la dette que j'ai envers lui. - -[KM4_B] -Les mecs qui ont la chance de bénéficier de notre protection, font leurs comptes aujourd'hui. - -[KM2_E] -Tu dois trouver les voitures qui sont sur cette liste et les livrer au garage derrière le parking de Newport. - -[FM3_8I] -~w~Trouve une bonne place et je rentrerai quand tu tireras le premier coup. - -[LOVE1_B] -L'expérience m'a appris que quelqu'un comme toi peut être très loyal si on le paye bien, - -[LOVE1_H] -mais ca fait des jaloux. - -[LOVE1_C] -Un vieux bridé que je connais, un homme de confiance, - -[LOVE1_I] -est retenu en otage par des Sud-Américains à Aspatria. - -[MEA4_D] -J'ai accepté de le voir... - -[MEA4_B4] -C'est Marty qui t'envoie, hein ? D'accord, je vais lui apprendre, moi, le sens des affaires. - -[MEA4_B5] -Carl, salut! Euh... j'ai besoin de plus de temps pour ton pognon. - -[MEA1_B4] -C'est M. Chonks qui t'envoie, n'est-ce pas ? Allons lui rendre visite. - -[HM5_6] -Allons fracasser des crânes... - -[LOVE1_5] -~g~Arrête de tourner en rond, trouve une bagnole des Colombiens et sauve l'associé de Love. - -[AS1_D] -~w~T'as qu'à faire l'appât et attirer les escadrons de la mort dans la Crique de Pike. - -[AS1_E] -~w~Mes hommes les attendront là-bas. - -[AS2_C] -~w~Le Cartel a une couverture : l'usine de café Kappa. - -[AS2_E] -~w~On a pas d'autre choix que de neutraliser ces charettes à drogue. - -[AS2_F] -~w~Fais-en des allumettes!! - -[AS2_A1] -~w~Miguel a sûrement un peu de cette fameuse énergie latine. - -[AS2_A2] -~w~Je suis crevé. - -[SIREN_3] -Pour activer la sirène, appuie sur la ~h~touche ~k~~VEHICLE_HORN~~w~. - -[SIREN_4] -Pour activer la sirène, appuie sur la ~h~touche ~k~~VEHICLE_HORN~~w~. - -[AS3_C] -~w~Oulala! C'est quoi ce truc jaune ? - -[AS3_C1] -~w~Salut ma poule. - -[AS3_F] -~w~Elle se classe tout de suite dans les meilleures, cette nana. - -[AS3_F1] -~w~Elle s'est arrangée pour dérober ce joli petit bijou à notre invité. - -[AS3_G] -~w~Y'a un avion qui arrive à l'aéroport international Francis dans 2 heures. - -[AS3_G1] -~w~Il est rempli de poison de Catalina. - -[AS3_H] -~w~Tu peux éviter la sécurité de l'aéroport en prenant un bateau jusqu'aux bouées lumineuses d'approche. - -[AS3_H1] -~w~Et dès que l'avion descends, tu l'explose! - -[AS3_I] -~w~Récupère la marchandise au milieu des débris. - -[AS3_J] -~w~Maintenant, fais attention ma poule! - -[AS3_K] -~w~Essaie avec l'huile pimentée... - -[RM2_F1] -Ces Colombiens seront là d'une minute à l'autre! - -[RM2_K] -Merde ils sont là!! Feu à volonté!! - -[LOVE2_7] -~g~Maintenant, largue la bagnole! - -[LOVE2_8] -~g~Dégage de Newport! - -[AM1_F] -Salvatore Leone va partir de chez Luigi vers ~1~:~1~. - -[LOVE5_C] -Je veux que tu le suives et que tu fasses en sorte que lui et mon paquet arrivent à la Crique de Pike sains et saufs. - -[FESZ_SR] -Echec de la sauvegarde! Vérifie la memory card (PS2) dans la fente pour MEMORY CARD 1 et réessaie. - -[FESZ_FO] -Veux-tu formater la memory card (PS2) dans la fente pour MEMORY CARD 1? - -[FELZ_FO] -La memory card (PS2) dans la fente pour MEMORY CARD 1 n'est pas formatée. - -[FES_NOC] -Aucune memory card (PS2) dans la fente pour MEMORY CARD 1. - -[FES_LOE] -Echec du chargement! Vérifie la memory card (PS2) dans la fente pour MEMORY CARD 1 et réessaie. - -[FES_DEE] -Echec de la suppression! Vérifie la memory card (PS2) dans la fente pour MEMORY CARD 1 et réessaie. - -[FORSUC] -Formatage réussi de la memory card (PS2) dans la fente pour MEMORY CARD 1. - -[ERFOUN] -Echec du formatage de la memory card (PS2) dans la fente pour MEMORY CARD 1. - -[ERMCNP] -Aucune memory card (PS2) dans la fente pour MEMORY CARD 1. - -[SVMEM1] -Sauvegarder sur la memory card (PS2) dans la fente pour MEMORY CARD 1. - -[FORSLO] -Formater la memory card (PS2) dans la fente pour MEMORY CARD 1. - -[SLONFM] -Erreur de formatage de la Memort Card (PS2) dans la fente pour MEMORY CARD 1. - -[SLONDR] -Espace insuffisant pour sauvegarder. Insère une memory card (PS2) dotée d'au moins 500 Ko d'espace disponible, dans la fente pour MEMORY CARD 1. - -[SLNSP] -Espace insuffisant pour sauvegarder. Insère une memory card (PS2) dotée d'au moins 200 Ko d'espace disponible, dans la fente pour MEMORY CARD 1. - -[FEFD_WR] -Formatage de la memory card (PS2) dans la fente pour MEMORY CARD 1. Ne pas retirer la memory card (PS2), ni réinitialiser ou éteindre la console. - -[FES_ISF] -ABSENT - -[FES_SAG] -EXISTANT - -[SLONNO] -Aucune memory card (PS2) dans la fente pour MEMORY CARD 1. - -[SLONNF] -La memory card (PS2) dans la fente pour MEMORY CARD 1 pas formatée. - -[FESZ_FM] -La memory card (PS2) dans la fente pour MEMORY CARD 1 n'est pas formatée. Veux-tu la formater? - -[FESZ_FF] -Echec du formatage! Vérifie la memory card (PS2) dans la fente pour MEMORY CARD 1 et réessaie. - -[MCDNSP] -Espace insuffisant sur la memory card (PS2) dans la fente pour MEMORY CARD 1. 500 Ko minimum sont requis pour sauvegarder. Veux-tu commencer? (OUI ou NON) - -[MCGNSP] -Espace insuffisant sur la memory card (PS2) dans la fente pour MEMORY CARD 1. 200 Ko minimum sont requis pour sauvegarder. Veux-tu commencer ? (OUI ou NON) - -[FESZ_WR] -Sauvegarde en cours. Ne pas retirer la memory card (PS2) de la fente pour MEMORY CARD 1, ni réinitialiser ou éteindre la console. - -[FESZ_OW] -Ecrasement en cours. Ne pas retirer la memory card (PS2) de la fente pour MEMORY CARD 1, ni réinitialiser ou éteindre la console. - -[FELD_WR] -Chargement en cours. Ne pas retirer la memory card (PS2) de la fente pour MEMORY CARD 1, ni réinitialiser ou éteindre la console. - -[FEDL_WR] -Effacement en cours. Ne pas retirer la memory card (PS2) de la fente pour MEMORY CARD 1, ni réinitialiser ou éteindre la console. - -[LM2_C] -Luigi m'a dit de te donner ça, alors... - -[LM3_G] -Joey n'est pas du genre à être patient, rappelle-toi, c'est ton ticket d'entrée... - -[LM5_E] -Ramènes-en autant que tu peux avant que ces poulets aient cramé tout leur blé. - -[JM5_C] -Y'a une bagnole avec un macchabée devant le café à coté de Point Callahan. - -[RM2_B] -On a fait le Nicaragua ensemble, à l'époque où ce pays savait ce qu'il faisait. - -[RM2_C] -Un enfoiré du Cartel l'a bousculé hier et lui a dit qu'ils reviendraient aujourd'hui pour de la marchandise. - -[RM2_D1] -J'y serais bien allé moi-même mais ma vieille sciatique s'est réveillée - hhurrh hhurrh - alors, bonne chance. - -[CATINF1] -~g~Chope Catalina! - -[CATINF2] -~g~Suis l'hélico pour trouver Catalina. - -[BOATIN1] -Saute dans un bateau et appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour entrer dedans. - -[BOATIN2] -Tu peux appuyer sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~ ~w~si tu es près d'un bateau pour te glisser à l'intérieur. - -[BOATIN3] -Saute dans un bateau et appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~ ~w~pour entrer dedans. - -[BOATIN4] -Tu peux appuyer sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~ ~w~si tu es près d'un bateau pour te glisser à l'intérieur. - -[JM6] -'L'EVASION' - -[FM1] -'LE CHAPERON' - -[JM1] -'LE DERNIER REPAS DE MIKE 'BABINES' - -[FM21] -'LA BOMBE : ACTE 1' - -[FM3] -'LA BOMBE : ACTE 2' - -[AM1] -'SAYONARA SALVATORE' - -[AM2] -'SOUS SURVEILLANCE' - -[KM2] -'GRAND THEFT AUTO' - -[AS3] -'S.A.M.' - -[RM2] -'PENURIE D'ARMES' - -[LOVE6] -'L'APPAT' - -[LOVE1] -'LIBERATEUR' - -[RC1] -'DESTRUCTION DE DIABLO' - -[RC2] -'MASSACRE DE LA MAFIA' - -[RC3] -'CALAMITÉ AU CASINO' - -[RC4] -'RODEO DE RUMPO' - -[RM2_E1] -Je peux pas croire que ce trouillard m'ait encore laissé sans protection! - -[GREN_1] -Plus tu maintiendras la ~h~touche ~k~~PED_FIREWEAPON~~w~ enfoncée, plus tu lanceras loin la grenade. - -[GREN_2] -Plus tu maintiendras la ~h~touche ~k~~PED_FIREWEAPON~~w~ enfoncée, plus tu lanceras loin la grenade. - -[GREN_3] -Plus tu maintiendras la ~h~touche ~k~~PED_FIREWEAPON~~w~ enfoncée, plus tu lanceras loin la grenade. - -[LOVE4_G] -Mon bien t'attendra dans le hangar des douanes à l'intérieur du fuselage de l'avion. - -[KABOOM] -KABOOOM! - -[SPLAT] -DESSOUDE! - -[PANCAK] -REFROIDI! - -[SOAKED] -FLINGUE! - -[HEAD] -Radio tête - -[DBL_CLF] -Radio double FM - -[FLASHB] -Nostalgia FM - -[RISE] -Lévitation FM - -[LIPS] -Love 106 - -[CHAT] -Causette FM - -[K_JAH] -K-Jah Radio - -[GAM_FM] -Echec FM - -[MSX_FM] -MSX FM - -[TUBE1] -Quand le métro ouvrira, tu pourras prendre une rame pour aller à l'île Staunton . - -[TUBE2] -Quand Shoreside Vale sera ouvert, tu pourras sortir au Shoreside Terminal pour aller à l'aéroport international Francis. - -[TUBE_2] -Pour prendre le métro, appuie sur la ~h~touche 'monter véhicule'~w~. - -[LEGAL] -~g~Enraye toute menace criminelle! - -[GA_2] -Nouveau moteur et nouvelle peinture. Les flics ne te reconnaîtront jamais! - -[LM1_8A] -Pour te faire du fric en plus, tu pourrais peut-être 'emprunter' un taxi... - -[TAXIH1] -Arrête-toi près d'un passage piéton pour prendre des passagers et emmène-les à destination avant la fin du temps imparti. - -[LM5_7] -~g~Y'a moins de quatre filles qui bossent au ~p~Bal~g~, Luigi va pas être content! - -[KM2_3] -~g~Rappelle-toi que les ~r~voitures~g~ doivent être en parfait état pour être acceptées par le ~p~garage~g~. - -[KM5_2] -~g~Un homme du gang de Yardie est hors d'état de nuire. - -[BETRA_A] -Désolé, chérie. - -[BETRA_B] -Je suis une fille ambitieuse et toi, - -[BETRA_C] -t'es juste un passe-temps. - -[HELP15] -A pied, appuie sur la ~h~touche ~k~~PED_LOOKBEHIND~~w~ pour ~h~regarder derrière~w~. - -[FEC_LB3] -Regarder derrière - -[FEC_R3] -(touche R3) - -[FES_AFO] -Cette memory card (PS2) est déjà formatée. - -[FEA_UP] -; - -[FEA_DO] -= - -[FEA_LE] -< - -[FEA_RI] -> - -[FEDSAS3] -- CHANGER SELECTION - -[FEDSAS4] -;=<> - CHANGER SELECTION - -[SPRAY_4] -Utilise la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer à l'aide du canon à eau. - -[SPRAY_1] -Utilise la ~h~touche ~k~~PED_FIREWEAPON~~w~ pour tirer à l'aide du canon à eau. - -[AM1_10] -~g~Salvatore Leone partira de chez Luigi vers 0~1~:~1~. - -[JAILB_V] -Liberty City est en état de choc! - -[JAILB_A] -La police et les services d'urgence s'occupent des conséquences - -[JAILB_B] -d'une attaque lancée contre un convoi de la police ce matin. - -[JAILB_C] -On n'a reçu aucune info sur les prisonniers qui étaient transférés ce matin. - -[JAILB_D] -Et aucun groupe, n'a revendiqué cette attaque. - -[JAILB_E] -Le convoi a quitté le Q.G. de la police tôt ce matin... - -[JAILB_F] -pour un transfert vers le pénitencier de Liberty. - -[JAILB_G] -L'attaque a eu lieu sur le pont de Callahan, - -[JAILB_H] -laissant peu de témoins et un pont gravement endommagé. - -[JAILB_I] -On suppose que certains prisonniers sont morts dans l'explosion... - -[JAILB_J] -qui a suivi la première attaque. - -[JAILB_W] -Le professionnalisme de cette attaque a pris de court la police, - -[JAILB_K] -lorsque l'identification des prisonniers évadés a été ralentie... - -[JAILB_L] -par la découverte d'un piratage informatique simultané des bases de données du Q.G. de la police. - -[JAILB_O] -Le chantier du tunnel Porter prenant de plus en plus de retard, - -[JAILB_P] -cette catastrophe laisse Portland isolé du reste de la ville. - -[JAILB_Q] -Allez, viens! - -[JAILB_R] -Monsieur tête de noeud - -[JAILB_S] -Ca me pose aucun problème de te tuer. - -[JAILB_T] -Tu vas le regretter. - -[JAILB_U] -D'accord, d'accord. Allez, dégage! - -[JAILB_M] -Le Maire O'Donovan a fait clairement comprendre que la police considérait - -[JAILB_N] -* - -[JAILB_X] -Dans une déclaration faite ce matin, - -[FEDS_SE] -Touche / - SELECTIONNER - -[FEDS_SB] -Touche / - SELECTIONNER Touche " - RETOUR - -[TM4_A] -~w~Oh, c'est toi. Toni n'est pas là. - -[TM4_A2] -~w~Mais il a laissé une de ses lettres d'amour pour toi. - -[DIAB2_A] -J'ai commencé dans les loisirs exotiques avec rien d'autre que le contenu, pas si négligeable que ça, de mon pantalon de cuir! - -[LM5_9] -FILLES : - -[PERPIC] -Paquets cachés trouvés - -[CO_ONE] -~1~ paquet caché sur ~1~ trouvé. - -[LOVE3_3] -~g~L'avion a largué ~1~ paquets sur 6. - -[FARE11] -~g~Destination : ~w~'Chantier'~g~ de Fort Staunton. - -[GA_21] -Impossible de garer plus de véhicules dans ce garage. - -[CHEAT1] -Codes activés - -[CHEAT2] -Code d'arme - -[CHEAT3] -Code de santé - -[CHEAT4] -Code d'armure - -[CHEAT5] -Code d'indice de recherche - -[CHEAT6] -Code d'argent - -[CHEAT7] -Code de météo - -[AS1_H] -~r~T'as pas réussi à amener l'escadron de la mort dans le piège des Yakuzas! - -[FEDS_BA] -Touche " - RETOUR - -[RAMP_A] -TOUS LES RODEOS ONT ETE ACCOMPLIS! - -[USJ_ALL] -TOUTES LES CASCADES ONT ETE ACCOMPLIES! - -[FARE23] -~g~Destination : ~w~'Transport-Export'~g~ au Barrage Cochrane. - -[L_TRN_1] -Tu peux prendre le train-L à Portland. Appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour ~h~monter~w~ ou ~h~descendre~w~ du train. - -[L_TRN_2] -Tu peux prendre le train-L à Portland. Appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour ~h~monter~w~ ou ~h~descendre~w~ du train. - -[S_TRN_1] -Tu peux prendre le métro à Liberty. Appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour ~h~monter~w~ ou ~h~descendre~w~ du train. - -[S_TRN_2] -Tu peux prendre le métro à Liberty. Appuie sur la ~h~touche ~k~~VEHICLE_ENTER_EXIT~~w~ pour ~h~monter~w~ ou ~h~descendre~w~ du train. - -[AS1_C] -~w~Il y a trois escadrons de la mort autour de Liberty et tout ce qu'ils veulent, c'est te buter! - -[AS1_G] -~r~Tous les Yakuzas sont morts! - -[JAN] -Jan - -[FEB] -Fév - -[MAR] -Mar - -[APR] -Avr - -[MAY] -Mai - -[JUN] -Juin - -[JUL] -Juil - -[AUG] -Août - -[SEP] -Sep - -[OCT] -Oct - -[NOV] -Nov - -[DEC] -Déc - -[DEFDT] -Date de sauvegarde invalide - -[BUGGY] -BUGGIES RESTANTS : - -[BONUS] -~g~BONUS ~1~$ - -[HORN1] -Appuie sur la ~h~touche L3 ~w~pour ~h~klaxonner. - -[HORN2] -Appuie sur la ~h~touche L1 ~w~pour ~h~klaxonner. - -[HORN3] -Appuie sur la ~h~touche R1 ~w~pour ~h~klaxonner. - -[LM3_1A] -Appuie sur la ~h~touche ~k~~VEHICLE_HORN~ ~w~pour ~h~klaxonner~w~ et prévenir Misty de ton arrivée. - -[LM3_1B] -Appuie sur la ~h~touche ~k~~VEHICLE_HORN~ ~w~pour ~h~klaxonner~w~ et prévenir Misty de ton arrivée. - -[LM3_1C] -Appuie sur la ~h~touche ~k~~VEHICLE_HORN~ ~w~pour ~h~klaxonner~w~ et prévenir Misty de ton arrivée. - -[RADIO_A] -Appuie sur la ~h~touche ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ pour faire défiler les ~h~stations de radio. - -[RADIO_B] -Appuie sur la ~h~touche ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ pour faire défiler les ~h~stations de radio. - -[RADIO_C] -Appuie sur la ~h~touche ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ pour faire défiler les ~h~stations de radio. - -[RADIO_D] -Appuie sur la ~h~touche ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ pour faire défiler les ~h~stations de radio. - -[FEC_EXV] -Entrer\sortir d'un véhicule - -[TAXI_M] -'TAXI DRIVER' - -[COP_M] -'POLICE' - -[FIRE_M] -'POMPIER' - -[AMBUL_M] -'AMBULANCE' - -[HJ_IS] -BONUS DE CASCADE DANGEREUSE : ~1~$ - -[HJ_PIS] -BONUS DE CASCADE DANGEREUSE PARFAITE : ~1~$ - -[HJ_DIS] -BONUS DE DOUBLE CASCADE DANGEREUSE : ~1~$ - -[HJ_PDIS] -BONUS DE DOUBLE CASCADE DANGEREUSE PARFAITE : ~1~$ - -[HJ_TIS] -BONUS DE TRIPLE CASCADE DANGEREUSE : ~1~$ - -[HJ_PTIS] -BONUS DE TRIPLE CASCADE DANGEREUSE PARFAITE : ~1~$ - -[HJ_QIS] -BONUS DE QUADRUPLE CASCADE DANGEREUSE : ~1~$ - -[HJ_PQIS] -BONUS DE QUADRUPLE CASCADE DANGEREUSE PARFAITE : ~1~$ - -[AM1_K] -Salvatore Leone partira de chez Luigi dans environ trois heures. (0~1~:~1~) - -[IMPEXPP] -Transport-Export, port de Portland. On a commandé différents véhicules. Consulte notre panneau d'affichage pour avoir plus d'infos. - -[VANHSTP] -Si t'arrives à choper d'autres Sécuricars, amène-les à notre garage dans le port de Portland. - -[EMVHPUP] -Achat de véhicules de secours neufs et d'occasion à très bons prix. Apporte-les à la grue, au nord-est du port de Portland. - -[STANDS] -ETALS RENVERSES : - -[STASH] -~g~Planque la SPANK sur le ~p~chantier! - -[MCSTNS] -Aucune memory card (PS2) dans la fente pour MEMORY CARD 1. Veux-tu commencer? (OUI ou NON) - -[LOVE3_5] -~g~L'avion est à portée. - -[LOVE3_6] -~r~La police a réussi à récupérer les paquets! - -[SIREN_1] -Pour déclencher la sirène de ce véhicule, appuie brièvement sur la ~h~touche ~k~~VEHICLE_HORN~~w~. - -[SIREN_2] -Pour déclencher la sirène de ce véhicule, appuie brièvement sur la ~h~touche ~k~~VEHICLE_HORN~~w~. - -[FM3_8C] -~w~J'ai besoin de 100 000$ pour couvrir mes dépenses, - -[MCLOAD] -Chargement des données. Ne pas retirer la memory card (PS2) de la fente pour MEMORY CARD 1, ni réinitialiser ou éteindre la console. - -[FES_GME] -Erreur de lecture sur la memory card (PS2) de la fente pour MEMORY CARD 1. Vérifie-la et réessaie. - -[FESZ_QF] -Veux-tu vraiment formater la memory card (PS2) de la fente pour MEMORY CARD 1? - -[FESZ_LS] -Chargement réussi. - -[RM3_5] -~g~Tu as ~1~ des 6 paquets de preuves. - -[LOVE3_2] -~g~Tu as récupéré tous les paquets! Rapporte-les à Donald Love. - -[LOVE4_4] -~g~Rapporte le paquet à Donald Love! - -[CLZOON] -Show Cull Zones On - -[CLZOOF] -Show Cull Zones Off - -[CRRGON] -ShowCarRoadGroups On - -[CRGOFF] -ShowCarRoadGroups Off - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[DBGFON] -CTheScripts::DbgFlag On - -[DBFOFF] -CTheScripts::DbgFlag Off - -[DSTRON] -Debug Streaming Requests On - -[DSTROFF] -Debug Streaming Requests Off - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Big White Debug Light Switched - -[FED_DSR] -Debug Streaming Requests - -[FED_PAH] -Parse Heap - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_RID] -Reload IDE - -[FED_RIP] -Reload IPL - -[FED_SCP] -gbShowCollisionPolys - -[FED_SCR] -Show Car Road Grups - -[FED_SCZ] -Show Cull Zones - -[FED_SPR] -Show Ped Road Groups - -[GORLEV] -Gore Level - -[LITTLE] -LITTLE T - -[NICK] -NICK LOVE - -[PARSHP] -Parse Heap - -[PDRGON] -ShowPedRoadGroups On - -[PRGOFF] -ShowPedRoadGroups Off - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[SCASSL] -Sick Fuck Selected - -[SCSCSL] -Sick Fucker Selected - -[SHPLON] -gbShowCollisionPolys On - -[SHPLOF] -gbShowCollisionPolys Off - -[SICSIC] -Sick Fucker - -[SICASS] -Sick Fuck - -[FEB_SAV] -Charger - -[FEP_SAV] -CHARGER PARTIE - -[AS2_12A] -~g~Quand t'auras renversé le premier étal, t'auras plus que 8 minutes avant que le Cartel prévienne ses revendeurs! - -[AS3_1A] -~g~Et maintenant, rejoins la ~b~bouée repère! - -[NOCONT] -Reconnecte une manette analogique (DUALSHOCK#) ou manette analogique (DUALSHOCK#2) au port de manette 1 pour continuer. - -[BET_JB] -TRAHI PAR CATALINA, SA PETITE AMIE, ET LAISSE POUR MORT. JUGE COUPABLE ET CONDAMNE A UNE PEINE DE PRISON, IL COMMENCE SA PEINE AU PENITENCIER DE LIBERTY. MAIS UNE SEULE ET UNIQUE PENSEE LE HANTE...... LA VENGEANCE ! - -[END_A] -Les habitants de Cedar Grove subissent les conséquences - -[END_B] -psychologiques de l'attentat qui a frappé - -[END_C] -leur quartier, hier. - -[END_D] -Un riverain, Clive Denver, a donné à la police la description - -[END_E] -d'un homme armé qu'il a vu fuir du secteur, accompagné d'une femme aux cheveux noirs. - -[END_F] -Oh, tu sais, on va bien s'amuser, parce que, tu sais, oui, tu le sais, - -[END_G] -je t'aime, hein, je t'aime de tout mon coeur, tu es si beau, si fort, - -[END_H] -tu es l'homme que j'ai toujours rêvé d'avoir à mes côtés ! - -[END_I] -Peu importe, j'en étais où, moi ? - -[END_J] -Oh, je sais plus. Mais tu sais ce que c'est, hein ? - -[END_K] -Les explosions ont retenti près des habitations, semant Le trouble dans le quartier. Les gens couraient dans tous les sens à la recherche d'un abri. - -[END_L] -Plusieurs civils ont été blessés dans la panique alors que les forces de l'ordre - -[END_M] -échangeaient des coups de feu avec un hélicoptère qui survolait le barrage. - -[END_N] -Ouais, d'ici, on a une vue imprenable sur les jardins. - -[END_O] -Lorsque l'hélico a enfin été bousillé, - -[END_P] -c'était encore plus grandiose qu'un feu d'artifices ! - -[END_Q] -On recense déjà plus de vingt morts mais - -[END_R] -la police continue à découvrir des corps sous les décombres. - -[END_S] -Les rumeurs selon lesquelles les morts appartenaient au cartel des Colombiens - -[END_T] -n'ont pas été officiellement démenties. - -[END_U] -Il n'y a toujours aucune piste qui expliquerait la raison de ce massacre. - -[END_V] -Je me suis cassé un ongle et ma mise en plis est foutue ! Tu le crois, ça ? - -[END_W] -Ca m'avait coûté 50 dollars... - -[PAPER1] -UN CRIMINEL TRAHI PAR SA PETITE AMIE ET COMPLICE. LES JURES RECONNAISSENT, LE VOLEUR ARME, COUPABLE A L'UNANIMITE! - -[PAPER2] -LOVE, CONDAMNE A DIX ANS FERME ! - -[FEB_CPC] -Configuration des commandes - -[FEC_PED] -Commandes à pied - -[FEC_VEH] -Commandes des véhicules - -[FEC_FPR] -Commandes en vue subjective - -[FEC_CMM] -Commandes principales - -[FEC_PWL] -Aller à gauche - -[FEC_PWR] -Aller à droite - -[FEC_PWF] -Avancer - -[FEC_PWT] -Avancer vers caméra - -[FEC_PLB] -Vue arrière - -[FEC_PFR] -Tirer - -[FEC_CLE] -Défilement Gauche des armes - -[FEC_CRI] -Défilement Droite des armes - -[FEC_LKT] -Verrouiller cible - -[FEC_PJP] -Saut à pied - -[FEC_PSP] -Sprint à pied - -[FEC_PSH] -Tir à pied - -[FEC_TLF] -Cible suivante Gauche - -[FEC_TRG] -Cible suivante Droite - -[FEC_CCM] -Centrer caméra derrière joueur - -[FEC_SZI] -Fusil à lunette zoom avant - -[FEC_SZO] -Fusil à lunette zoom arrière - -[FEC_LKL] -Regarder à gauche en vue subjective - -[FEC_LRT] -Regarder à droite en vue subjective First Person Look Right - -[FEC_LUP] -Regarder en haut en vue subjective - -[FEC_LDN] -Regarder en bas en vue subjective - -[FEC_LBH] -Regarder derrière le véhicule - -[FEC_LLF] -Regarder à gauche du véhicule - -[FEC_LRG] -Regarder à droite du véhicule - -[FEC_HRN] -Klaxon - -[FEC_HBR] -Frein à main - -[FEC_ACL] -Accélérer - -[FEC_BRK] -Freiner - -[FEC_TSM] -Activer/Désactiver sous-missions - -[FEC_CRD] -Changer la station de radio - -[FEC_ENT] -Entrer/Sortir d'un véhicule - -[FEC_WPN] -Tirer - -[FEC_PAS] -Pause - -[FEC_FPO] -Changer d'arme en vue subjective - -[FEC_SMS] -Afficher/Masquer curseur - -[FEC_CMS] -Changer de mode de caméra - -[FEC_TSS] -Faire une capture d'écran - -[FEN_NET] -Réseau - -[FEN_CON] -Connexion - -[FEN_GAM] -Trouver partie - -[FEN_TYP] -Type de partie - -[FEN_TY0] -Deathmatch - -[FEN_TY1] -Furtif en Deathmatch - -[FEN_TY2] -Deathmatch par équipes - -[FEN_TY3] -Furtif en Deathmatch par équipes - -[FEN_TY4] -Planquer l'argent - -[FEN_TY5] -Capturer le drapeau - -[FEN_TY6] -Rat Race - -[FEN_TY7] -Domination - -[FEN_NAM] -Nom : - -[FEN_GNA] -Nom partie : - -[FEM_MAP] -Choisir carte - -[FEN_PLS] -Réglages joueur - -[FEN_PLC] -Couleur joueur - -[FEM_MA0] -Liberty City - -[FEM_MA1] -Le Quartier Rouge - -[FEM_MA2] -Chinatown - -[FEM_MA3] -La Tour - -[FEM_MA4] -Le Dépotoir - -[FEM_MA5] -Le Parc Industriel - -[FEM_MA6] -Les Docks - -[FEM_MA7] -Staunton - -[FEC_EMS] -Touches clavier uniquement - -[FEC_DBG] -Menu Debug - -[FEC_TGD] -Alterner manette jeu/debug - -[FEC_TDO] -Désactiver caméra debug - -[FEC_IVH] -Inverser souris horizontale - -[FEC_MSL] -BGS - -[FEC_MSM] -BMS - -[FEC_MSR] -BDS - -[FEC_QUE] -??? - -[FEC_TWO] -Deux touches clavier au maximum - -[FEC_UMS] -Boutons souris uniquement - -[FEC_OMS] -Un bouton souris au maximum - -[FEC_UJS] -Un bouton joystick au maximum - -[FEC_OJS] -Un bouton joystick maximum par action - -[FEC_PTL] -Utiliser verrouillage de cible avec commande de tir gauche - -[FEC_PTR] -Utiliser verrouillage de cible avec commande de tir droite - -[FEC_LBC] -Utiliser regarder gauche avec regarder droite - -[FEC_JBO] -JOY ~1~ - -[NO_PAUZ] -Impossible de mettre en pause en multijoueur. Appuyez deux fois pour quitter ! - -[FEM_SL1] -Emplacement 1 libre - -[FEM_SL2] -Emplacement 2 libre - -[FEM_SL3] -Emplacement 3 libre - -[FEM_SL4] -Emplacement 4 libre - -[FEM_SL5] -Emplacement 5 libre - -[FEM_SL6] -Emplacement 6 libre - -[FEM_SL7] -Emplacement 7 libre - -[FEM_SL8] -Emplacement 8 libre - -[FEM_MM] -MENU PRINCIPAL - -[FEM_SNG] -Nouvelle partie - -[FEM_QTW] -Quitter - -[FEQ_SRE] -Etes-vous sûr de vouloir quitter ? Votre progression depuis la dernière sauvegarde sera perdue. Continuer ? - -[FEQ_SRW] -Etes-vous sûr de vouloir quitter la partie ? - -[FEG_SRV] -SERVEUR - -[FEG_MAP] -CARTE - -[FEG_PLY] -JOUEURS - -[FEG_TYP] -TYPE - -[FEG_PNG] -PING - -[FET_FG] -TROUVER PARTIE - -[FET_SP] -SOLO - -[FET_MP] -MULTIJOUEUR - -[FET_HG] -CREER UNE PARTIE - -[FET_PS] -CONFIG. JOUEURS - -[FET_CON] -CONNEXION - -[FET_AUD] -CONFIG. AUDIO - -[FET_GFX] -CONFIG. EFFETS SPECIAUX - -[FET_DIS] -CONFIG. AFFICHAGE - -[FET_LAN] -CHOIX LANGUE - -[FET_LG] -CHARGER PARTIE - -[FET_DG] -SUPPRIMER PARTIE - -[FET_NG] -NOUVELLE PARTIE - -[FET_SG] -SAUVEGARDER PARTIE - -[FET_MAP] -CHOISIR CARTE - -[FET_GT] -TYPE DE PARTIE - -[FET_CTL] -CONFIG. PERIPHERIQUE - -[FET_OPT] -OPTIONS - -[FET_QG] -QUITTER PARTIE - -[FET_STA] -STATISTIQUES - -[FET_BRE] -BRIEFINGS - -[FEC_WAR] -Avertissement - -[FEC_OKK] -O.K. - -[FED_CON] -Confirmation de suppression de fichier - -[FES_SSC] -Sauvegarde de la partie effectuée - -[DEL_FNM] -Suppression du fichier effectuée - -[PCLOAD] -Chargement des données du fichier - -[PCRESRT] -Redémarrage de Grand Theft Auto III - -[FEC_DLF] -Erreur lors de suppression - -[FEC_SVU] -Erreur lors de la sauvegarde - -[FEC_LUN] -Erreur lors du chargement. Fichier corrompu, veuillez le supprimer. - -[FEN_PLA] -Nombre de joueurs : - -[FET_NON] -AUCUNE PARTIE DISPONIBLE - -[FET_SFG] -RECHERCHE DE PARTIES... - -[FET_SRT] -TRI DES PARTIES... - -[FEF_LAN] -RESEAU - -[FEF_INT] -INTERNET - -[FET_REF] -Rafraîchir - -[FET_FIL] -Filtre - -[FET_JG] -Rejoindre - -[FEC_NTW] -Talk To Network - -[FEC_ESR] -Utilisation restreinte de la touche Echap - -[FEC_GSL] -Show head bob: - -[FIL_FLT] -FILTRER LISTE DES PARTIES - -[FET_SAN] -NOUVELLE PARTIE - -[FIL_MAP] -Carte : - -[FIL_SRV] -Serveur : - -[FIL_TYP] -Type de partie : - -[FIL_SPC] -Parties avec espace disponible ? - -[FIL_PNG] -Ping : - -[FEN_UKH] -Hôte inconnu - -[FEN_UKM] -Carte non trouvée - -[FEN_UKT] -Type de partie non trouvé - -[FEN_NCI] -VOUS N'ETES PAS CONNECTE A INTERNET - -[FET_PAU] -MENU PAUSE - -[FET_SGA] -COMMENCER PARTIE - -[FEC_SGJ] -Régler joystick - -[FEC_PAD] -Manette - -[FEC_JOY] -Joystick - -[FEC_WHL] -Volant - -[FEC_CNT] -Type de périphérique : - -[FET_APL] -APPLIQUER - -[FES_CSA] -Sélectionnez une apparence dans la liste suivante : - -[FES_SKN] -NOM DE L'APPARENCE - -[FES_DAT] -DATE - -[FES_NON] -AUCUNE APPARENCE DISPONIBLE - -[FEA_FM9] -LECTEUR MP3 - -[FESZ_QZ] -Etes-vous sûr de vouloir sauvegarder cette partie ? - -[FES_CGA] -Emplacements disponibles : - -[FES_SCG] -Sauvegarder la partie actuelle ? - -[FES_LCG] -Charger la partie et continuer à jouer ? - -[FEC_FIR] -Tirer - -[FEC_NWE] -Arme suivante - -[FEC_PWE] -Arme précédente - -[FEC_FOR] -Avant - -[FEC_BAC] -Arrière - -[FEC_LEF] -Gauche - -[FEC_RIG] -Droite - -[FEC_ZIN] -Zoom avant - -[FEC_ZOT] -Zoom arrière - -[FEC_EEX] -Entrer+sortir - -[FEC_RAD] -Radio - -[FEC_SUB] -Sous-mission - -[FEC_CMR] -Changer caméra - -[FEC_JMP] -Sauter - -[FEC_SPN] -Sprint - -[FEC_HND] -Frein à main - -[FEC_TUL] -Tourelle gauche - -[FEC_TUR] -Tourelle droite - -[FEC_LOL] -Regarder à gauche - -[FEC_LOR] -Regarder à droite - -[FEC_NTR] -Cible suivante - -[FEC_PTT] -Cible précédente - -[FEC_LBA] -Regarder en arrière - -[FEC_CEN] -Centrer caméra - -[FEC_UND] -(NON) - -[FET_CFT] -A PIED - -[FET_CCR] -EN VOITURE - -[CVT_MSG] -Conversion des textures vers un format optimal pour votre carte graphique - -[FET_CAC] -ACTION - -[FEC_IBT] -- - -[FEC_SPC] -ESP - -[FEC_MXO] -MXB1 - -[FEC_MXT] -MXB2 - -[FEC_UNB] -NON UTILISE - -[FET_CME] -TYPE DE COMMANDES - -[FET_RDK] -REDEFINIR COMMANDES - -[FET_AMS] -PARAMETRES SOURIS - -[FET_STI] -CONFIG. COMMANDES STANDARD - -[FET_CTI] -CONFIG. COMMANDES NORMALES - -[FET_MTI] -CONFIG. SOURIS - -[FET_DAM] -MODELAGE ACCOUST. DYNAMIQUE - -[FEC_TFL] -Tourelle Gauche - -[FEC_TFR] -Tourelle Droite - -[FEC_TFU] -Tourelle /Dodo Haut - -[FEC_TFD] -Tourelle /Dodo Bas - -[FEC_MWF] -MOLETTE HAUT - -[FEC_MWB] -MOLETTE BAS - -[FEC_ORR] -ou - -[FEC_NUS] -NON UTILISE - -[FEC_LUD] -Regarder Haut - -[FEC_LDU] -Regarder Bas - -[FEC_CMP] -COMBO : REGARDER G+D - -[FEC_NTT] -No Text Yet For This Key - -[FEC_FNC] -F~1~ - -[FEC_IRT] -INSER - -[FEC_DLL] -SUPPR - -[FEC_HME] -ORIG - -[FEC_END] -FIN - -[FEC_PGU] -PAGE HAUT - -[FEC_PGD] -PAGE BAS - -[FEC_UPA] -HAUT - -[FEC_DWA] -BAS - -[FEC_LFA] -GAUCHE - -[FEC_RFA] -DROITE - -[FEC_NUM] -PAV.NUM - -[FEC_NMN] -PAV.NUM~1~ - -[FEC_FWS] -PAV.NUM / - -[FEC_PLS] -PAV.NUM + - -[FEC_MIN] -PAV.NUM - - -[FEC_DOT] -PAV.NUM . - -[FEC_NLK] -VERR NUM - -[FEC_ETR] -ENTR - -[FEC_SLK] -ARRET DEFIL - -[FEC_PSB] -PAUSE - -[FEC_BSP] -RET. ARR. - -[FEC_TAB] -TAB - -[FEC_CLK] -VERR MAJ - -[FEC_RTN] -RETOUR - -[FEC_LSF] -MAJ. G - -[FEC_RSF] -MAJ. D - -[FEC_LCT] -CTRL G - -[FEC_RCT] -CTRL D - -[FEC_LAL] -ALT G - -[FEC_RAL] -ALT D - -[FEC_LWD] -WIN G - -[FEC_RWD] -WIN D - -[FEC_WRC] -CLIC WIN - -[WIN_TTL] -Grand Theft Auto III - -[WIN_95] -Grand Theft Auto III n'est pas compatible WINDOWS 95 - -[WIN_DX] -Grand Theft Auto III requiert la version 8.1 de DirectX minimum. - -[WIN_VDM] -Grand Theft Auto III requiert au moins 12 Mo de mémoire vidéo libre. - -[DIAB3_G] -Arriba ! - -[FEM_RES] -REPRENDRE PARTIE - -[FES_SNG] -NOUVELLE PARTIE - -[FEM_SP] -MODE SOLO - -[FEM_MP] -MODE MULTIJOUEUR - -[FEM_QT] -QUITTER - -[FES_SG] -NOUVELLE PARTIE - -[FES_LG] -CHARGER PARTIE - -[FEM_HST] -HEBERGER PARTIE - -[FEM_OPT] -OPTIONS - -[FEM_DBG] -DEBUG - -[FET_PSU] -PARAMETRES JOUEUR - -[FET_DEF] -PAR DEFAUT - -[FED_BRI] -LUMINOSITE - -[FED_TRA] -TRAINEES - -[FEM_LOD] -DISTANCE MODELES - -[FEM_VSC] -SYNCHRO VIDEO - -[FEM_FRM] -RESTRICTION VIDEO - -[FED_RES] -RESOLUTION ECRAN - -[FED_WIS] -PLEIN ECRAN - -[FEDS_TB] -RETOUR - -[FEA_MUS] -MUSIQUE - -[FEA_SFX] -EFFETS SPECIAUX - -[FEA_RSS] -STATION RADIO - -[FEL_ENG] -ANGLAIS - -[FEL_FRE] -FRANCAIS - -[FEL_GER] -ALLEMAND - -[FEL_ITA] -ITALIEN - -[FEL_SPA] -ESPAGNOL - -[FEA_3DH] -CONFIG. CARTE-SON - -[FEA_SPK] -CONFIG. HAUT-PARLEURS - -[FEA_2SP] -2 HAUT-PARLEURS - -[FEA_4SP] -PLUS DE 2 HAUT-PARLEURS - -[FEA_EAR] -CASQUE - -[FEA_NAH] -PAS DE CARTE-SON - -[FET_SNG] -NOUVELLE PARTIE - -[FEN_STA] -COMMENCER PARTIE - -[GMLOAD] -CHARGER PARTIE - -[GMSAVE] -SAUVEGARDER PARTIE - -[FES_DGA] -EFFACER PARTIE - -[FEM_NON] -AUCUN - -[FEC_IVV] -INVERSER SOURIS VERTIC. - -[FEC_MSH] -SENSIBILITE SOURIS - -[FET_CCN] -COMMANDES : NORMALES - -[FET_SCN] -COMMANDES : STANDARD - -[FES_SET] -UTILISER MODELE - -[GHOST] -Fantôme - -[WIN_RSZ] -Impossible de choisir la nouvelle résolution. - -[FET_APP] -BGS, RETOUR POUR APPLIQUER LE NOUV. PARAMETRE - -[FET_HRD] -PARAMETRES PAR DEFAUT RETABLIS - -[FET_MST] -DIRECTION CONTROLEE PAR LA SOURIS - -[FEC_STR] -ETOILE PAV.NUM. - -[FET_MIG] -GAUCHE, DROITE, MOLETTE SOURIS POUR REGLER - -[FET_CIG] -RETOUR ARRIERE POUR EFFACER - BGS, RETOUR POUR CHANGER - -[FET_RIG] -SELECTIONNEZ NOUV. TOUCHE POUR CETTE ACTION OU ECHAP POUR ANNULER - -[FET_EIG] -IMPOSSIBLE DE PARAMETRER UNE TOUCHE POUR CETTE ACTION - -[NO_PCCD] -Insérez le disque 2 de Grand Theft Auto III dans le lecteur ou appuyez sur ECHAP pour annuler. - -[CVT_ERR] -Espace disque épuisé. Libérez de la mémoire sur votre disque dur pour continuer. Appuyez sur ECHAP pour annuler. - -[FED_SUB] -SOUS-TITRES - -[FET_DSN] -Skin joueur par défaut.bmp - -[JM3] -'HAUT LES MAINS' - -[EBAL] -'A MOI LIBERTY' - -[LM4] -'MAQUEREAU EN BOITE' - -[REPLAY] -RALENTI - -[FEC_SFT] -MAJ - -[CRED254] -RESPONSABLE STUDIO - -[CVT_CRT] -Pour convertir les textures pour votre carte graphique, connectez-vous à un compte Administrateur. Pour quitter, appuyez sur ECHAP. - -[FEM_ON] -AVEC - -[FEM_OFF] -SANS - -[FEM_YES] -OUI - -[FEM_NO] -NON - -[FES_WAR] -Sauvegarde en cours... - -[FED_DLW] -Suppression en cours... - -[FED_LDW] -Chargement en cours... - -[FEC_SLC] -Emplacement corrompu - -[FED_LFL] -Echec du chargement de la sauvegarde. La partie va être relancée. - -[FET_RSO] -PARAMETRE D'ORIGINE RETABLI - -[FET_RSC] -MATERIEL INDISPONIBLE - PARAMETRE D'ORIGINE RETABLI - -[CRED270] -MIKE HONG - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file diff --git a/utils/gxt/german.txt b/utils/gxt/german.txt deleted file mode 100644 index c48d7757..00000000 --- a/utils/gxt/german.txt +++ /dev/null @@ -1,8028 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- - -[ARSE] -ü ß ã - -[IN_VEH] -~g~Hey! Zurück ins Auto!! - -[IN_VEH2] -~g~Du brauchst einen Schlitten für diesen Job! - -[IN_BOAT] -~g~Du brauchst ein Boot für diesen Job! - -[HEY] -~g~Keine Alleingãnge. Halt die Gang beisammen! - -[HEY2] -~g~Nicht aufteilen. Halt die Leute zusammen! - -[HEY3] -~g~Du hast deinen besten Mann verloren. Los, zurück! Hol 8-Ball! - -[HEY4] -~g~Wenn du Misty verlierst, kriegst du's mit Luigi zu tun. Los, hol sie. - -[HEY5] -~g~Eines der Girls fehlt. Los, zurück! Treib das Mãdchen auf! - -[HEY6] -~g~Du stehst mit deiner Ehre für den Yakuza Kanbu ein. Du musst ihn beschützen! - -[HEY7] -~g~Ein Mann mehr kann nicht schaden. Los, zurück. Hol deinen Kontaktmann ab! - -[HEY8] -~g~Beschützen heißt so viel wie beschützen - Beschütze den alten Asiaten! - -[HEY9] -~g~Du willst wissen, was so geredet wird? Sprich mit deinem Kontaktmann! - -[HELP2_A] -Drücke die ~h~/-Taste~w~, um zu ~h~sprinten. - -[HELP3] -Du kannst nur kurze Zeit sprinten, ohne müde zu werden. - -[HELP4_A] -Drücke die~h~ ~k~~VEHICLE_ACCELERATE~-Taste~w~, um zu ~h~beschleunigen. - -[HELP4_D] -Drücke den~h~ Rechten Analog-Stick nach oben, um zu ~h~beschleunigen. - -[HELP5_A] -Drücke die~h~ ~k~~VEHICLE_BRAKE~-Taste~w~, um zu ~h~bremsen~w~, oder um ~h~zurückzusetzen~w~, wenn das Fahrzeug steht. - -[HELP5_D] -Zieh den ~h~Rechten Analog-Stick~w~ zurück, um zu ~h~bremsen~w~, oder um ~h~zurückzusetzen~w~, wenn das Fahrzeug steht. - -[HELP6_A] -Drücke die~h~ ~k~~VEHICLE_HANDBRAKE~-Taste~w~, um die ~h~Handbremse anzuziehen. - -[HELP6_C] -Drücke die~h~ ~k~~VEHICLE_HANDBRAKE~-Taste~w~, um die ~h~Handbremse anzuziehen. - -[HELP6_D] -Drücke die~h~ ~k~~VEHICLE_HANDBRAKE~-Taste~w~, um die ~h~Handbremse anzuziehen. - -[HELP7_A] -Halte die~h~ ~k~~PED_LOCK_TARGET~-Taste ~w~gedrückt, um mit dem Prãzisionsgewehr zu zielen. - -[HELP7_D] -Halte die~h~ ~k~~PED_LOCK_TARGET~-Taste ~w~gedrückt, um mit dem Prãzisionsgewehr zu zielen. - -[HELP8_A] -Drücke die~h~ ~k~~PED_SNIPER_ZOOM_IN~-Taste~w~, um ~h~an das Ziel heranzuzoomen ~w~und die~h~ ~k~~PED_SNIPER_ZOOM_OUT~-Taste~w~,um ~h~herauszuzoomen ~w~. - -[HELP9_A] -Drücke die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um das Prãzisionsgewehr abzufeuern. - -[HELP10] -Dieser Stern zeigt an, dass du von der Polizei gesucht wirst. - -[HELP11] -Je mehr Sterne, desto dringender wirst du gesucht. - -[HELP13] -Manchmal musst du vielleicht Wege finden, die das Radar nicht zeigt. - -[TIMER] -Diese Mission hat ein Zeitlimit. Du musst sie beendet haben, bevor die Zeit um ist. - -[MISTY1] -~r~Misty ist hinüber! - -[OUT_VEH] -~g~Raus aus dem Fahrzeug! - -[GARAGE] -Fahr den Wagen in eine Garage und geh dann nach draußen. - -[WANTED1] -~g~Schüttle die Cops ab. Verringere deinen Fahndungslevel. - -[NODOORS] -~g~Das sind keine Sardinen! Besorg einen Wagen mit ausreichend Sitzplãtzen. - -[TRASH] -~g~Du hast deine Karre ziemlich geschrottet! Repariere sie! - -[WRECKED] -~r~Das Fahrzeug ist Schrott! - -[HORN] -~g~Drück auf die Hupe. - -[HORN4] -Drück die ~h~L3-Taste~w~, um zu hupen. - -[NOMONEY] -~g~Du brauchst mehr Cash! - -[OUTTIME] -~r~Zu langsam, Mann, zu langsam! - -[SPOTTED] -~r~Sie sind dir auf den Fersen! - -[REWARD] -BELOHNUNG $~1~ - -[GAMEOVR] -GAME OVER - -[Z] -Z-Achse Wert: ~1~ - -[M_FAIL] -MISSION FEHLGESCHLAGEN! - -[M_PASS] -MISSION ERFÜLLT! $~1~ - -[O_PASS] -JOB ERLEDIGT! - -[O_FAIL] -JOB FEHLGESCHLAGEN! - -[DEAD] -AUSSER GEFECHT! - -[BUSTED] -VERHAFTET! - -[S_PROMP] -Außerhalb einer Mission kannst du dein ~h~Spiel hier speichern~w~. Dies rückt die Uhr um sechs Stunden vor. - -[NUMBER] -~1~ - -[SCORE] -$~1~ - -[LOADCAR] -LADE FAHRZEUG... (ABBRECHEN MIT L1) - -[CARSOFF] -Deaktivierte Fahrzeuge. - -[CARS_ON] -Aktivierte Fahrzeuge. - -[TEXTXYZ] -Schreibe Koordinaten in Datei... - -[CHEATON] -Cheat Modus AN - -[CHEATOF] -Cheat Modus AUS - -[UZI_IN] -Die Uzi ist jetzt im AmmuNation zu haben! - -[IMPORT1] -Geh nach draußen und warte auf dein Fahrzeug. - -[PAGEB1] -Pistole wurde im Versteck angeliefert. - -[PAGEB2] -Uzi wurde im Versteck angeliefert. - -[PAGEB3] -Kugelsichere Weste wurde im Versteck angeliefert. - -[PAGEB4] -Schrotflinte wurde im Versteck angeliefert. - -[PAGEB5] -Granaten wurden im Versteck angeliefert. - -[PAGEB6] -Molotowcocktails wurden im Versteck angeliefert. - -[PAGEB7] -AK47 wurde im Versteck angeliefert. - -[PAGEB8] -Prãzisionsgewehr wurde im Versteck angeliefert. - -[PAGEB9] -M16 wurde im Versteck angeliefert. - -[PAGEB10] -Raketenwerfer wurde im Versteck angeliefert. - -[PAGEB11] -Flammenwerfer wurde im Versteck angeliefert. - -[WANT_A] -Verhaftet wirst du nur, wenn die Polizei nach dir ~h~fahndet. - -[WANT_B] -Dein ~h~Fahndungslevel~w~ wird durch die Reihe von Sternen oben rechts auf dem Bildschirm dargestellt. - -[WANT_C] -Du hast jetzt einen ~h~Fahndungslevel~w~ von eins... - -[WANT_D] -zwei... - -[WANT_E] -drei... - -[WANT_F] -Steigt dein ~h~Fahndungslevel~w~, wirst du von besser ausgebildeten Polizisten gejagt. - -[WANT_G] -Wirst du ~h~verhaftet~w~, wirst du zum nãchsten Polizeirevier gebracht. - -[WANT_H] -Die Cops werden dir alle Waffen abnehmen und kassieren ein wenig Bestechungsgeld von dir. - -[WANT_I] -Wenn dir das auf einer Mission passiert, ist die Mission fehlgeschlagen. - -[WANT_J] -Im Verlauf des Spiels wirst du Möglichkeiten entdecken, deinen Fahndungslevel zu reduzieren. - -[WANT_K] -Wenn du in einem Wagen sitzt, werden ~h~LACKIEREREIEN~w~ den Fahndungslevel ~h~annullieren. - -[HEAL_B] -Wenn du ~h~'außer Gefecht'~w~ bist, wirst du zur nãchsten Klinik gebracht. - -[HEAL_C] -Du verlierst alle Waffen, und die Ãrzte knöpfen dir ein wenig Cash für die Behandlung ab. - -[HEAL_E] -Je lãnger du spielst, desto mehr Wege wirst du finden, dich selbst zu verarzten oder zu schützen. - -[DAM] -SCHADEN: - -[KILLS] -HITS: - -[FARES] -FAHRTEN - -[BULL] -GOLDBARREN - -[EVID] -BEWEISMITTEL - -[HEALTH] -ZUSTAND AUTO - -[COLLECT] -GESAMMELT: - -[BOMB] -Fahr deinen Wagen in die Bombenwerkstatt, um eine ~h~Bombe~w~ anzubringen. Kosten - ~h~$1000. - -[SAVE1] -Geh durch den Eingang. So kannst du dein ~h~Spiel speichern~w~. Wãhrend einer Mission kannst du nicht speichern. - -[SAVE2] -Jedes Fahrzeug, das in dieser Garage abgestellt wird, wird für dich aufbewahrt, wenn das Spiel gespeichert wird. - -[AMMU] -Betritt den AmmuNation-Laden, um eine Waffe zu kaufen. - -[BRIDGE1] -Wenn die Callahan Bridge repariert ist, kannst du nach Staunton Island rüber fahren. - -[TUNNEL] -Wenn der Porter Tunnel geöffnet ist, kannst du nach Staunton Island rüber fahren. - -[LUIGI] -LUIGI MISSIONEN - -[TONI] -TONI MISSIONEN - -[JOEY] -JOEY MISSIONEN - -[FRANK] -SALVATORE MISSIONEN - -[DIABLO] -DIABLO MISSIONEN - -[ASUKA] -ASUKA MISSIONEN - -[B_SITE] -ASUKA VORSTADT-MISSIONEN - -[KENJI] -KENJI MISSIONEN - -[RAY] -RAY MISSIONEN - -[LOVE] -LOVE MISSIONEN - -[YARDIE] -YARDIE MISSIONEN - -[HOOD] -HOOD MISSIONEN - -[CITYZON] -Liberty City - -[IND_ZON] -Portland - -[PORT_W] -Callahan Point - -[PORT_S] -Atlantic Quays - -[PORT_E] -Portland Harbor - -[PORT_I] -Trenton - -[S_VIEW] -Portland View - -[CHINA] -Chinatown - -[EASTBAY] -Portland Beach - -[LITTLEI] -Saint Mark's - -[REDLIGH] -Rotlichtbezirk - -[TOWERS] -Hepburn Heights - -[HARWOOD] -Harwood - -[ROADBR1] -Callahan Bridge - -[ROADBR2] -Callahan Bridge - -[TUNNELP] -Porter Tunnel - -[BOMB1] -8-Balls Werkstatt - -[COM_ZON] -Staunton Island - -[STADIUM] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Liberty Campus - -[CONSTRU] -Fort Staunton - -[PARK] -Belleville Park - -[COM_EAS] -Newport - -[SHOPING] -Bedford Point - -[YAKUSA] -Torrington - -[SUB_ZON] -Shoreside Vale - -[AIRPORT] -Francis Int. Airport - -[PROJECT] -Wichita Gardens - -[SUB_IND] -Pike Creek - -[SWANKS] -Cedar Grove - -[BIG_DAM] -Cochrane Dam - -[SUB_ZO2] -Shoreside Vale - -[SUB_ZO3] -Shoreside Vale - -[CAR_1] -Krankenwagen - -[CAR_2] -Feuerwehrwagen - -[CAR_3] -Polizei - -[CAR_4] -Enforcer - -[CAR_5] -Barracks - -[CAR_6] -Rhino - -[CAR_7] -FBI-Wagen - -[CAR_8] -Securicar - -[CAR_9] -Moonbeam - -[CAR_10] -Kleinbus - -[CAR_11] -Lkw - -[CAR_12] -Linerunner - -[CAR_13] -Trashmaster - -[CAR_14] -Patriot - -[CAR_15] -Mr Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinel - -[CAR_25] -Cheetah - -[CAR_26] -Banshee - -[CAR_27] -Stinger - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_30] -Kuruma - -[CAR_31] -Stretch Limo - -[CAR_32] -Perennial - -[CAR_33] -Landstalker - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Stallion - -[CAR_37] -Taxi - -[CAR_38] -Cabbie - -[CAR_39] -Buggy - -[LUIGIS] -Luigis Club - -[GOAWAY] -~g~Du bist bereits auf einer Mission! - -[LUIGGO] -~g~Luigi checkt gerade ein paar neue Girls aus. Komm spãter wieder! - -[JOEYGO] -~g~Joey ist mit Misty in der Stadt unterwegs. Komm spãter wieder! - -[TONIGO] -~g~Toni ist mit seiner Mamma in der Oper. Probier's ein andermal! - -[KEMUGO] -~g~Maria und Kemuri sind gerade beschãftigt. Versuch's spãter nochmal! - -[KENJGO] -~g~Kenji ist bei einem Yakuza-Treffen. Schau ein andermal wieder vorbei. - -[RAYGO] -~g~Ray hãngt gerade auf irgend einem anderen Klo rum. Komm spãter wieder! - -[LOVEGO] -~g~Donald Love hat anderes zu tun. Vielleicht hat er spãter Zeit! - -[KENSGO] -~g~Kenji hat zu tun! Komm spãter wieder! - -[ASUSGO] -~g~Asuka hat gerade überhaupt keine Zeit! - -[HOODGO] -~g~Die Hoods haben gerade keine Zeit! - -[WRONGT1] -~g~Komm zwischen 05:00 und 21:00 wieder. Dann gibt's einen Job. - -[WRONGT2] -~g~Komm zwischen 06:00 und 14:00 wieder. Dann gibt's einen Job. - -[WRONGT3] -~g~Komm zwischen 15:00 und 00:00 wieder. Dann gibt's einen Job. - -[GUN_1A] -Benutze die ~h~~k~~PED_CYCLE_WEAPON_RIGHT~-Taste ~w~und die ~h~~k~~PED_CYCLE_WEAPON_LEFT~-Taste~w~, um zwischen deinen Waffen zu wechseln. - -[GUN_2A] -Halte die ~h~~k~~PED_LOCK_TARGET~-Taste ~w~gedrückt, um automatisch zu zielen. Drücke die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um zu feuern! Versuch, die Ziele zu treffen... - -[GUN_2C] -Halte die ~h~~k~~PED_LOCK_TARGET~-Taste ~w~gedrückt, um automatisch zu zielen. Drücke die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um zu feuern! Versuch, die Ziele zu treffen... - -[GUN_2D] -Halte die ~h~~k~~PED_LOCK_TARGET~-Taste ~w~gedrückt, um automatisch zu zielen. Drücke die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um zu feuern! Versuch, die Ziele zu treffen... - -[GUN_3A] -Halte die ~h~~k~~PED_LOCK_TARGET~-Taste~w~ gedrückt und drücke die ~h~~k~~PED_CYCLE_TARGET_LEFT~-Taste~w~ oder die ~h~~k~~PED_CYCLE_TARGET_RIGHT~-Taste, um das Ziel zu wechseln. - -[GUN_3B] -Halte die ~h~~k~~PED_LOCK_TARGET~-Taste~w~ gedrückt und drücke die ~h~~k~~PED_CYCLE_TARGET_LEFT~-Taste~w~ oder die ~h~~k~~PED_CYCLE_TARGET_RIGHT~-Taste, um das Ziel zu wechseln. - -[GUN_4A] -Mit gedrückter ~h~~k~~PED_LOCK_TARGET~-Taste~w~ kannst du gehen oder laufen und behãltst dein Ziel im Visier. - -[GUN_4B] -Mit gedrückter ~h~~k~~PED_LOCK_TARGET~-Taste~w~ kannst du gehen oder laufen und behãltst dein Ziel im Visier. - -[GUN_5] -An diesen Pappkameraden kannst du zielen und schießen üben. Wenn du fertig bist, widme dich wieder deiner Mission. - -[TAXI1] -~g~Besorg dir einen Passagier. - -[FARE1] -~g~Fahrziel: ~w~'Meeouch Sex Kitten Club' ~g~im Rotlichtbezirk. - -[FARE2] -~g~Fahrtziel: ~w~'Supa Save' ~g~in Portland View. - -[FARE3] -~g~Fahrtziel: ~w~'Alte Schulhalle' ~g~in Chinatown. - -[FARE4] -~g~Fahrtziel: ~w~'Greasy Joe's Cafe' ~g~in Callahan Point. - -[FARE5] -~g~Fahrtziel: ~w~'AmmuNation' ~g~im Rotlichtbezirk. - -[FARE6] -~g~Fahrtziel: ~w~'Easy Credit Autos' ~g~in Saint Mark's. - -[FARE7] -~g~Fahrtziel: ~w~'Woody's Topless Bar' ~g~im Rotlichtbezirk. - -[FARE8] -~g~Fahrtziel: ~w~'Marcos Bistro' ~g~in Saint Mark's. - -[FARE9] -~g~Fahrtziel: ~w~'Import-Export Garage' ~g~in Portland Harbour. - -[FARE10] -~g~Fahrtziel: ~w~'Punk Noodles' ~g~in Chinatown. - -[FARE12] -~g~Fahrtziel: ~w~'Football Stadion' ~g~in Aspatria. - -[FARE13] -~g~Fahrtziel: ~w~'Die Kirche' ~g~in Bedford Point. - -[FARE14] -~g~Fahrtziel: ~w~'Das Casino' ~g~in Torrington. - -[FARE15] -~g~Fahrtziel: ~w~'Liberty University' ~g~in Liberty Campus. - -[FARE16] -~g~Fahrtziel: ~w~'Einkaufszentrum' ~g~in der Belleville Park Area. - -[FARE17] -~g~Fahrtziel: ~w~'Museum' ~g~in Newport. - -[FARE18] -~g~Fahrtziel: ~w~'AmCo Gebãude' ~g~in Torrington. - -[FARE19] -~g~Fahrtziel: ~w~'Bolt Burgers' ~g~in Bedford Point. - -[FARE20] -~g~Fahrtziel: ~w~'Der Park' ~g~in Belleville. - -[FARE21] -~g~Fahrtziel: ~w~'Francis Int. Airport'. - -[FARE22] -~g~Fahrtziel: ~w~'Cochrane Dam'. - -[FARE24] -~g~Fahrtziel: ~w~'Die Klinik' ~g~in Pike Creek. - -[FARE25] -~g~Fahrtziel: ~w~'Der Park' ~g~in Shoreside Vale. - -[FARE26] -~g~Fahrtziel: ~w~'North West Towers' ~g~in Wichita Gardens. - -[NEW_TAX] -GRÖSSER! SCHNELLER! HÃRTER! Neu! Borgnine Taxis jetzt in Harwood! Rufen Sie 555-BORGNINE! Heute noch! - -[TSCORE2] -$~1~ - -[IN_ROW] -~1~ SERIEN-Bonus! $~1~ - -[TTUTOR] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Taxi-Missionen an- oder abzuschalten. - -[TTUTOR2] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Taxi-Missionen an- oder abzuschalten. - -[ATUTOR2] -~g~Fahre die Patienten VORSICHTIG in die Klinik. - -[A_TIME] -+~1~ Sekunden - -[A_FULL] -~r~Krankenwagen voll!! - -[A_RANGE] -~g~Du bist außer Reichweite des Notarztfunks. Fahr nãher an die Klinik heran! - -[FTUTOR] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Feuerwehr Missionen an- oder abzuschalten. - -[FTUTOR2] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Feuerwehr Missionen an- oder abzuschalten. - -[F_PASS1] -Feuer gelöscht! - -[F_RANGE] -~g~Du bist außer Reichweite des Feuerwehrfunks. Fahr nãher an eine Feuerwache heran! - -[C_BREIF] -~g~Verdãchtiger wurde zuletzt in der Gegend von ~a~ gesichtet. - -[C_RANGE] -~g~Du bist außer Reichweite des Polizeifunks. Fahr nãher an ein Polizeirevier heran! - -[DODO_FT] -Du bist ~1~ Sekunden geflogen! - -[EBAL_A] -Ich kenn ein Plãtzchen im Rotlichtbezirk, wo wir untertauchen können. - -[EBAL_A1] -Aber meine Hãnde sind im Eimer. Also, fahr du. - -[EBAL_1] -Drücke die~h~ ~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um in ein Fahrzeug ~h~ein- oder auszusteigen~w~. - -[EBAL_1B] -Drücke die~h~ ~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um in ein Fahrzeug ~h~ein- oder auszusteigen~w~. - -[EBAL_2] -~g~Steig wieder in den Wagen! - -[EBAL_3] -Dies ist das ~h~Radar~w~. Damit navigierst du durch die Stadt. Folge dem ~h~Leuchtpunkt~w~ auf dem ~h~Radar~w~, um das Versteck zu finden! - -[EBAL_D] -Ich kenn einen, der hat Beziehungen zur Mafia. Er heißt Luigi. - -[EBAL_D1] -Wir sind alte Bekannte. Vielleicht kann ich dir 'nen Job bei ihm verschaffen. Komm, hier rüber. - -[EBAL_E] -Komm, wir gehen zu ihm. Ich stell dich vor. - -[EBAL_I] -Der Boss kommt gleich zu dir raus... - -[EBAL_J] -8-Ball hat oben was zu erledigen. - -[EBAL_K] -Du könntest mir einen Gefallen tun. - -[EBAL_L] -Eines meiner Girls braucht 'nen Fahrer. Schnapp dir ein Auto, hol Misty von der Klinik ab und bring sie her. - -[EBAL_N] -Also lass die Hãnde am Lenkrad! - -[EBAL_4] -~r~8-Ball ist tot! - -[EBAL_5] -~g~Besorg dir ein Fahrzeug! - -[EBAL_6] -~g~Hol Misty ab! - -[LM1] -'LUIGIS GIRLS' - -[LM2] -'KEIN SPANK FÜR DIE LADIES' - -[LM3] -'MISTY UND DER MAFIOSO' - -[LM5] -'DER BULLEN-BALL' - -[LM1_2] -~g~Bring Misty zu Luigis Club. - -[LM1_3] -~g~Drück auf die Hupe, damit die Kleine einsteigt. - -[LM1_6] -~g~Steig wieder in den Wagen! - -[LM1_7] -Halte neben Misty an und lass sie einsteigen. - -[LM1_8] -Du kannst dir bei Luigi den nãchsten Job abholen oder Liberty City erkunden. - -[LM2_A] -Da ist eine neue Droge in Umlauf, sie heißt SPANK. - -[LM2_E] -Irgendein Kerl hat diesen Müll meinen Girls in Portland Harbour verabreicht. - -[LM2_B] -Fahr hin und verabreich ihm ein paar mit 'nem Baseballschlãger! - -[LM2_G] -Der Typ soll bezahlen für diese Beleidigung! - -[LM2_1] -~g~Nimm sein Auto und spritz es um. - -[LM2_2A] -Benutze die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um zu ~h~schlagen und zu treten~w~ oder um ~h~den Schlãger zu schwingen~w~! - -[LM2_2C] -Benutze die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um zu ~h~schlagen und zu treten~w~ oder um ~h~den Schlãger zu schwingen~w~! - -[LM2_2D] -Benutze die~h~ ~k~~PED_FIREWEAPON~-Taste~w~, um zu ~h~schlagen und zu treten~w~ oder um ~h~den Schlãger zu schwingen~w~! - -[LM2_3] -~g~Stell das Auto in Luigis Garage ab! - -[LM2_4] -~g~Lackiere das Auto um! - -[LM3_A] -He, ich muss mit dir reden... Okay, Mick, wir reden spãter. - -[LM3_B] -Na? Alles klar, mein Junge? - -[LM3_C] -Der Sohn des Don, Joey Leone, will seine kleine Misty sehen. - -[LM3_D] -Hol sie in Hepburn Heights ab. - -[LM3_E] -Aber Vorsicht, das ist Diablo-Gebiet. - -[LM3_F] -Dann bringst du sie rüber zu seiner Werkstatt in Trenton. Aber dalli. - -[LM3_H] -Also, Augen auf die Straße und nicht auf Misty! - -[LM3_1D] -Drücke die~h~ L3-Taste~w~, um zu ~h~hupen~w~. So weiß Misty, dass du da bist. - -[LM3_2] -~g~Fahr Misty zu Joey. - -[LM3_4] -~g~Hol Misty ab! - -[LM3_5] -Du arbeitest jetzt fest für Luigi? War auch Zeit, dass er 'nen verlãsslichen Fahrer anbringt. - -[LM3_7] -Ich bin gleich bei dir, Süße. - -[LM3_10] -~g~Besorg dir ein Auto! - -[LM4_B] -Fahr hin und regle das für mich. - -[LM4_C] -Wenn du 'ne Knarre brauchst, geh zum Hintereingang von AmmuNation, gegenüber der U-Bahn. - -[LM5_A] -Der Polizeiball findet in der alten Schulhalle nahe der Callahan Bridge statt, - -[LM5_B] -und bei solchen Bãllen möchten auch Cops ein wenig 'Action' haben. - -[LM5_C] -Ich hab Girls in der ganzen Stadt stehen. - -[LM5_D] -Bring sie zu dem Ball. Das bringt 'nen Haufen Kohle. - -[LM5_1] -~g~Wenn du zu viele Ladies ins Auto stopfst, holen sie sich Schrammen! ~g~Liefere erst diese Mãdchen ab und hol dann den Rest. - -[LM5_2] -~r~Eins von Luigis Girls ist hinüber! - -[LM5_3] -~g~Du brauchst ein Auto! - -[LM5_4] -~g~Hol die Girls, die in St. Mark's arbeiten. - -[LM5_5] -~g~Bring die Girls zum Polizeiball! - -[LM5_8] -~g~Girls auf dem Ball: ~1~ - -[JM2] -'ADIEU, 'CHUNKY' LEE CHONG' - -[JM3] -' DER GELDTRANSPORTER' - -[JM4] -'CIPRIANIS CHAUFFEUR' - -[JM5] -'DER TOTE PASSAGIER' - -[JM1_1] -~g~Bring Forellis Wagen zu 8-Balls Werkstatt nördlich von hier, hinter 'Easy Credit Autos'. - -[JM1_2] -~g~Park den Wagen wieder vor Marcos Bistro. - -[JM1_3] -~g~Aktiviere die Autobombe und dann nichts wie weg! - -[JM1_4] -~g~Du schrottest das Auto! Repariere es! - -[JM1_5] -~g~Die Autobombe ist nicht aktiviert! - -[JM1_6] -~g~Stell den Wagen wieder an den richtigen Platz. - -[JM1_8A] -~y~Hey, mein alter Freund! - -[JM1_8B] -~y~Die Bombenwerkstatt ist automatisiert. Einfach reinfahren und anhalten, der Rest passiert von selbst. - -[JM1_8C] -~y~Hier, die erste ist umsonst, jede weitere kostet aber. - -[JM2_A] -Chunky Lee Chong verhökert Spank für irgend so eine neue Gang aus Kolumbien oder Colorado oder so... - -[JM2_B] -Ich weiß nicht genau. Aber wen interessieren schon die Details? - -[JM2_D] -Diese Ratte hat seine letzte Frühlingsrolle verkauft. - -[JM2_E] -Ich möchte, dass du ihn erledigst. - -[JM2_G] -Besorg dir 'ne 9mm. Du weißt ja, wo du sie findest, oder? - -[JM2_H] -Und sei vorsichtig in Chinatown. Das ist Triaden-Gebiet. - -[JM3_A] -Also, wir überfallen den Transporter mit den Lohngeldern. - -[JM3_B] -Er startet jeden Tag an der Grenze zu Chinatown. - -[JM3_C] -Kugeln können der Karre nichts anhaben. Also besorg dir einen Wagen und ramm ihn von der Straße. - -[JM3_D] -Fahr ihm voll rein, dann dürften die Wachmãnner schnell abhauen. - -[JM3_E] -Fahr den Transporter dann zum Lagerhaus bei den Docks, von da an übernehmen meine Leute. - -[JM3_F] -Der Transporter ist nicht ewig unterwegs, also beeil dich. - -[JM3_1] -~g~Fahr den Transporter zu der Garage. - -[JM3_2] -~g~Ramm den Wagen, bis der Schadenswert unter 70 Prozent liegt. - -[JM4_B] -Oh! Da ist der Typ, von dem ich dir erzãhlt habe! - -[JM4_C] -Okay, hör zu. Der Typ ist kein Italiener und kein Mechaniker, aber er kann alles 'richten'. - -[JM4_D] -Das ist Paps' Capo, Toni Cipriani. - -[JM4_E] -Ja, ich bin Toni Cipriani. - -[JM4_F] -Bring ihn zu Mammas Restaurant in St. Mark's. - -[JM4_G] -Hör zu, ich plane eine Sache, da brauche ich einen guten Fahrer. Also komm spãter wieder, okay? - -[JM4_2] -Warte hier. Lass den Motor laufen. Das ist kein Freundschaftsbesuch. - -[JM4_3] -Ein Hinterhalt der Triaden! Bring uns hier raus! - -[JM4_4] -Die Triaden denken wohl, sie können mich fertigmachen. Die! MICH! - -[JM4_6] -Hey, Vorsicht! Ich sagte, keine künstlerischen Einlagen! - -[JM4_7] -~g~Fahr Toni zu Mammas Restaurant. - -[JM4_8] -~r~Toni ist tot! - -[JM5_A] -Großartig! Einfach großartig! - -[JM5_B] -Na also. Genau der, mit dem ich jetzt reden muss! - -[JM5_D] -Einer der Forellis meinte, er weiß zu viel, also hat er gekriegt, was er verdiente. - -[JM5_E] -Schaff die Leiche zu der Schrottpresse in Harwood, okay? - -[JM5_1] -~g~Bring ihn zu der Schrottpresse! - -[JM5_2] -~g~Die Forelli Brüder! - -[JM6_A] -Nicht schlecht, das Ding, was? - -[JM6_B] -Hör zu. Fahr mit einem Wagen zu der sicheren Wohnung in St. Mark's und hol ein paar Freunde von mir ab. - -[JM6_C] -Die überfallen eine Bank und brauchen einen Fahrer. - -[JM6_D] -Ich hab ihnen gesagt, du bist der richtige. Also, vermassle es nicht. - -[JM6_E] -Bring sie vor 5 Uhr zu der Bank, keine Minute spãter. - -[JM6_2] -Lass den Motor laufen. Wir sind gleich wieder da. - -[JM6_3] -Bring uns hier weg!! - -[JM6_4] -Hãng die Cops ab und bring uns in die sichere Wohnung! - -[JM6_6] -~g~Los, besorge ein weniger verdãchtiges Fahrzeug! - -[JM6_7] -~g~Du brauchst alle 3 für den Überfall! - -[TM1] -'SCHMUTZIGE WÃSCHE' - -[TM2] -'DER GELDBOTE' - -[TM3] -'DAS TREFFEN BEI SALVATORE' - -[TM4] -'TRIADEN UND ANDERE KLEINE FISCHE' - -[TM5] -'EXPLODIERENDE FISCHE' - -[TONI_P] -Ich habe einen dringenden Job für dich! -Toni - -[TM1_A] -~w~Setz dich, Junge. Los, mach's dir bequem. - -[TM1_B] -~w~Die Wãscherei will also kein Schutzgeld zahlen, was? - -[TM1_C] -~w~Denken die Triaden, sie können mich verscheißern? - -[TM1_D] -~w~Diesen Möchtegern-Gangstern werden wir eine Lektion erteilen. - -[TM1_E] -~w~Ja, ich werde denen Respekt beibringen. Die rühren keinen meiner Söhne ungestraft an. - -[TM1_F] -~w~Dein Vater - Gott hab ihn selig - hat sich von den Triaden nie etwas gefallen lassen. - -[TM1_G] -~w~Sorry, Ma. Ja, Ma. - -[TM1_H] -~w~Ich will, dass du ihre Wãscherei-Transporter zerstörst - -[TM1_I] -~w~und jeden Triaden-Tölpel niedermachst, der dir in die Quere kommt. - -[TM1_J] -~w~8-Ball liefert dir alles, was du dazu brauchst. - -[TM2_A] -~w~TONI ist unterwegs, um jemanden zu erledigen - oder er versucht es jedenfalls. - -[TM2_AA] -Er wird nie so sein wie sein Papa. Auf dem Tisch hat er dir eine Nachricht hinterlassen. - -[TM2_B] -~w~Die Wãscherei will jetzt bezahlen. Gute Arbeit, mein Junge! - -[TM2_C] -~w~Hol das Geld ab und bring es hierher. Pass auf die Triaden auf. - -[TM2_D] -~w~Die wollen dich wahrscheinlich zu Chop Suey verarbeiten, aber lass dir nichts gefallen. - -[TM2_E] -~w~Niemand, wirklich niemand, macht TONI CIPRIANI fertig! - -[TM2_1] -~g~Bring das Geld zu Toni!! - -[TM2_2] -~g~Du hast sie alle erledigt! - -[TM3_MA] -~w~Ich weiß nicht, wo er ist! - -[TM3_MB] -~w~Ach, mein Sohn weiß manchmal selbst nicht, wer er ist. - -[TM3_MC] -~w~Ja, sein Vater, der war da ganz anders. Immer auf Draht, top, ein echter Mann... - -[TM3_A] -~w~Don Salvatore hat ein Treffen angesetzt. - -[TM3_B] -~w~Du musst erst die Limo und seinen Sohn Joey aus der Werkstatt abholen. - -[TM3_C] -~w~Dann holst du Luigi aus seinem Club ab und dann kommst du wieder her und holst mich ab. - -[TM3_D] -~w~Dann fahren wir alle gemeinsam zum Boss. - -[TM3_E] -~w~Diese Triaden wissen einfach nicht, wann Schluss ist. - -[TM3_F] -~w~Wenn sie Krieg wollen, sollen sie Krieg haben. - -[TM3_G] -~w~Also, los jetzt. - -[TM3_1] -~g~Hol die Limousine bei Joey ab. - -[TM3_2] -~g~Jetzt hol Luigi ab. - -[TM3_3] -~g~Jetzt hol Toni ab. - -[TM3_4] -~g~Jetzt fahr die Mãnner zu Salvatore. - -[TM3_5] -~y~Ein Hinterhalt der Triaden!! - -[TM4_B] -~w~Es herrscht KRIEG! Die Triaden betreiben zur Tarnung einen Fischmarkt in Chinatown. - -[TM4_C] -~w~Die meisten ihrer Geschãfte werden auf diesem Fischmarkt durchgezogen. - -[TM4_D] -~w~Diese Wãscherei schuldet uns immer noch Geld. - -[TM4_E] -~w~Die denken, die Triaden beschützen sie jetzt. Ich schlage vor, wir führen eine Strafaktion durch. - -[TM4_F] -~w~Nimm dir diese Jungs und knöpf dir die Köpfe der Triaden vor! - -[TM4_G] -~w~Und wenn es geht, macht auch ein paar von deren Soldaten fertig. - -[TM4_GAT] -~g~Du brauchst einen 'Triaden-Packwagon', um da reinzukommen. - -[TM5_A] -TEXT NO LONGER REQUIRED - -[TM5_B] -~w~Okay, jetzt hab ich aber die Schnauze voll. - -[TM5_C] -~w~Wir machen die Triaden ein für alle Mal fertig. - -[TM5_D] -8-Ball hat einen Müllkarren mit einer Bombe prãpariert. - -[TM5_E] -~w~Sie hat einen Zeitzünder. Wenn du's vermasselst, hinterlassen wir keine Spuren. Hol den Müllkarren ab. - -[TM5_F] -~w~Fahr vorsichtig. 8-Ball sagt, die Bombe ist extrem empfindlich, das kleinste Schlagloch und sie geht hoch. - -[TM5_G] -~w~In ihrer Fischfabrik werden sie dich reinlassen mit dem Müllkarren. - -[TM5_H] -~w~Stell das Ding zwischen den Benzinkanistern ab und dann nichts wie weg. - -[TM5_I] -~w~Es soll rummsen, dass es Fische vom Himmel regnet. - -[TM5_J] -~w~Ne biblische Apokalypse will ich haben, nichts popeliges. - -[FM2] -'CURLYS GEHEIMKONTAKTE' - -[FM4] -'DER LETZTE WUNSCH' - -[FM1_A] -~w~Die Jungs und ich haben einiges zu besprechen, - -[FM1_B] -~w~du wirst dich heute abend um meine Kleine kümmern. - -[FM1_C] -~w~HEY, MARIA! WO BLEIBST DU? - -[FM1_D] -~w~Dãmliche Ziege. Jedes Mal dasselbe. - -[FM1_E] -~w~Und hier ist sie, die Königin der Nacht höchstpersönlich! - -[FM1_F] -~w~Was hast du denn da oben getrieben? - -[FM1_G] -~w~Was es auch war, jede Wette, es hat mich Geld gekostet. - -[FM1_H] -~w~Du glaubst doch nicht, ich bin zum Palavern hier, oder? - -[FM1_I] -~w~Halt die Klappe und steig in den Wagen. - -[FM1_J] -~w~Nimm die Limo, aber bring sie mir heil wieder, hörst du? - -[FM1_K] -~w~Und pass auf sie auf, sie kann eine Menge Ãrger machen. - -[FM1_L] -~w~Ja, ja, ja! Dein neues Schoßhündchen wird schon alles im Griff haben. - -[FM1_M] -~w~Er ist ja auch so groß und stark. - -[FM1_N] -~w~Hey, Fiffi, los, wir besuchen Chico und besorgen uns was zum 'Naschen'! - -[FM1_P] -~g~Da ist Chico. Halt neben ihm an. - -[FM1_S] -~w~Bitte sehr, die Dame. - -[FM1_TT] -~w~EINE POLIZEI-RAZZIA! - -[FM1_1] -~g~Zurück in die Limo! - -[FM1_2] -~g~Steig in die Limo! - -[FM1_3] -~r~Wenn du Maria im Stich lãsst, bringt Salvatore dich um. Kehr um und hol sie! - -[FM1_4] -~g~Du hast die Frau des Don im Stich gelassen! Los, zurück zur Lagerhalle! Warte dort auf Maria! - -[FM1_5] -~g~Bring Maria wohlbehalten zu Salvatore zurück! - -[FM1_6] -~g~Chico ist nicht ewig dort. Bring Maria zu diesem Ufer! - -[FM1_7] -~r~Maria ist tot! Das wird Salvatore nicht gefallen... - -[FM1_8] -~r~Du hast Marias Lieferanten erledigt! - -[FM2_J] -Lasst uns eine Minute alleine. - -[FM2_A] -Das kolumbianische Kartell stellt irgendwo in Liberty SPANK her. - -[FM2_K] -Aber wir wissen nicht wo. Und die scheinen jeden unserer Schritte im Voraus zu kennen. - -[FM2_L] -Es gibt da einen Typ namens Curly Bob. Er arbeitet in Luigis Bar. - -[FM2_M] -Der verpulvert schon dauernd mehr Geld als er verdient. - -[FM2_N] -Normalerweise fãhrt er nach der Arbeit mit dem Taxi nach Hause. Folge ihm. - -[FM2_O] -Und wenn er der Verrãter ist, mach ihn fertig. - -[FM2_F] -Da kommt ja unser kleiner, gesprãchiger Freund. - -[FM2_G] -Ist man dir gefolgt? Du weißt, was hier lãuft, muss unter uns bleiben. - -[FM2_H] -Nein, nein, niemand ist mir gefolgt. Hast du meinen Stoff? - -[FM2_I] -Hier ist dein SPANK, du Ratte, und jetzt rede. - -[FM2_P] -Okay. Die Leones führen einen Zwei-Fronten-Krieg. - -[FM2_Q] -Sie kãmpfen mit den Triaden um ein Territorium, und keiner der beiden gibt nach. - -[FM2_R] -Gleichzeitig hat Joey Leone Streit mit den Forellis angefangen. - -[FM2_S] -Jeden Tag verlieren sie Leute und Einfluss in der Stadt. - -[FM2_T] -Salvatore wird gefãhrlich und paranoid. Er verdãchtigt alles und jeden. - -[FM2_U] -Bei treuen Gefolgsleuten wie dir, wie kann er sich da nur Sorgen machen? - -[FM2_1] -~g~Da ist Curly Bob! - -[FM2_2] -~g~Curly hat den Club verlassen. Folge ihm! - -[FM2_5] -~g~Bring ihn nach Portland Harbour. - -[FM2_6] -~r~Curly steigt in kein geschrottetes Taxi! - -[FM2_7] -~r~Curly hat Angst! Das Treffen ist abgeblasen! - -[FM2_8] -~g~Knöpf dir Curly Bob vor! - -[FM2_9] -~r~Curly Bob ist tot! - -[FM2_10] -~r~Curly ist entwischt! - -[FM2_11] -~g~Parke vor Luigis Club, Curly Bob kommt gleich heraus. - -[FM2_12] -~r~Er ist dir entwischt! - -[FM3_A] -~w~Wir sollten diese kolumbianischen Mistkerle fertigmachen, - -[FM3_B] -~w~aber durch den Krieg mit den Triaden sind wir dazu zu geschwãcht. - -[FM3_C] -~w~Das Kartell hat unendlich Geld aus dem Handel mit diesem Mistzeug SPANK. - -[FM3_D] -~w~Wenn wir sie offen angreifen, putzen sie uns weg. - -[FM3_E] -~w~Die müssen das SPANK auf diesem großen Schiff machen, zu dem dich Curly geführt hat. - -[FM3_F] -~w~Wir müssen also mit Köpfchen vorgehen. Genauer gesagt, mit DEINEM Köpfchen. - -[FM3_G] -~w~Ich bitte dich, mir, Salvatore Leone zuliebe, dieses SPANK Labor zu zerstören. - -[FM3_H] -~w~Wenn du das für mich tust, bist du ein gemachter Mann. Du kriegst alles, was du willst. - -[FM3_I] -~w~Geh zu 8-Ball. Du brauchst einen Fachmann, um dieses Schiff hochzujagen. - -[FM3_8A] -~w~Hi, Kumpel! Salvatore hat schon angerufen, - -[FM3_8B] -~w~aber für so einen Job brauchst du eine Menge Chinaböller. - -[FM3_8D] -~w~Aber du kennst mich. Dafür scheppert's dann auch gewaltig. - -[FM3_8E] -~w~Okay, dann wollen wir mal! - -[FM3_8F] -~w~Ich kann das Baby scharf machen, aber eine Knarre kann ich mit diesen Hãnden immer noch nicht halten. - -[FM3_8G] -~w~Hier, das Gewehr hier wirst du sicher brauchen. - -[FM3_4] -~g~Halt an und lass 8-Ball aussteigen! - -[FM3_7] -~r~8-Ball hat's erwischt! - -[FM3_8] -~r~Die Wachmãnner wurden alarmiert! - -[FM4_A] -~w~Ah, sieh an! Mein bester Troubleshooter. - -[FM4_B] -~w~Ich bin stolz auf dich, meine Junge. Du hast es diesen Mistkerlen gezeigt. - -[FM4_C] -~w~Ich hab nur noch einen kleinen Job für dich, bevor wir alle feiern können. - -[FM4_D] -~w~Um die Ecke von Luigis Club steht ein Wagen. - -[FM4_E] -~w~Innen drin sieht's ziemlich aus. - -[FM4_F] -~w~Wir haben so einem Typ versehentlich ein Loch in den Kopf gemacht. - -[FM4_H] -~w~Bring den Wagen zur Schrottpresse, bevor die Cops ihn finden. - -[AM3] -'DER PAPARAZZO' - -[AM4] -'ZAHLTAG FÜR RAY' - -[AM5] -'V-MANN TANNER' - -[AM1_A] -Wir müssen ein paar Dinge klãren, bevor wir unsere Beziehungen fortsetzen, - -[AM1_B] -geschãftlich oder sonstwie. Legen wir also die Karten auf den Tisch. - -[AM1_C] -Ich bin eine Yakuza und ich weiß, dass du für Salvatore Leones Familie gearbeitet hast. - -[AM1_D] -Ich kann dir einen Job in unserer Organisation verschaffen, - -[AM1_E] -aber zuerst musst du mir beweisen, dass du dich wirklich von der Mafia losgesagt hast. - -[AM1_G] -Sorge dafür, dass er seinen Club nicht lebend erreicht. - -[AM1_H] -Maria und ich reden inzwischen ein bisschen über die alten Zeiten. - -[AM1_I] -Oh, Asuka, du hast einen Massagestab. - -[AM1_J] -Das ist kein Massagestab. - -[AM1_1] -~g~Salvatore verlãsst jetzt Luigis Club! - -[AM1_2] -~r~Man hat dich entdeckt! - -[AM1_3] -~r~Du hast Salvatore verpasst! - -[AM1_4] -~r~Na, prima! Du hast dein Opfer verscheucht. Und du willst ein Profi sein? - -[AM1_5] -~g~Begib dich in den Rotlichtbezirk und warte, bis Salvatore den Club verlãsst. - -[AM1_7] -~r~Salvatore sitzt bequem zu Hause und schlürft einen Cocktail. 'Der Schakal' bist du nicht gerade! - -[AM1_8] -~g~Salvatore wird Luigis Club um zirka ~1~:~1~ verlassen. - -[AM2_4] -~g~Du bist für die so unsichtbar wie ein Hochhaus! - -[AM3_A] -Ein Reporter hat rumgeschnüffelt. - -[AM3_B] -Maria und ich sind ein bisschen ins Grüne gefahren, bis du diesen miesen Voyeur beseitigt hast. - -[AM4_A] -Ah, mein hübsches Helferlein! - -[AM4_B] -Maria ist gerade beschãftigt, aber ich richte ihr aus, dass du hier warst. - -[AM4_C] -Wer ist da? Asuka? Ich weiß, ich war ein böses Mãdchen, aber ich muss dringend pinkeln! - -[AM4_D] -Wird Zeit dass du unseren Mann bei der Polizei kennenlernst. - -[AM4_E] -Das ist seine Bezahlung für den letzten Job, den er für uns erledigt hat. - -[AM4_F] -Verstãndlicherweise ist er vorsichtig. - -[AM4_G] -Begib dich so schnell wie möglich zu dem öffentlichen Fernsprecher in Torrington und warte auf seine Anweisungen. - -[AM5_A] -Maria und ich sind shoppen gegangen. - -[AM5_B] -Unser Spitzel hat uns informiert, dass einer unserer Fahrer ein übereifriger Undercover Cop ist! - -[AM5_C] -Ohne sein Auto ist er praktisch ein Nichts. Wir haben seinen Wagen mit einem Sender versehen. - -[AM5_D] -Knöpf ihn dir vor! - -[AM5_1] -Tanner hat dich bemerkt! - -[AS1] -'DER KÖDER' - -[AS2] -'ESPRESSO-2-GO!' - -[AS4] -'DAS LÖSEGELD' - -[AS1_A] -~w~Miguel findet anscheinend, dass ich ihn schlecht behandle. - -[AS1_B] -~w~Trotzdem hat er uns mitgeteilt, wie sehr Catalina deine Rache fürchtet. - -[AS2_A] -~w~Wir haben Catalinas Plãne mit dem SPANK unterschãtzt. - -[AS2_B] -~w~Das beschrãnkt sich bei weitem nicht darauf, dass die Yardies es an der Straßenecke verkaufen. - -[AS2_D] -~w~Die verkaufen SPANK über Kaffeestãnde. - -[AS2_1] -~g~Alle Espressostãnde in Portland zerstört!! - -[AS2_2] -~g~Alle Espressostãnde auf Staunton Island zerstört!! - -[AS2_3] -~g~Alle Espressostãnde in Shoreside Vale zerstört!! - -[AS2_4] -~r~Das Kartell hat seine Dealer gewarnt!! - -[AS2_5] -~g~Da sind noch Espressostãnde in Shoreside Vale und auf Staunton Island! - -[AS2_6] -~g~Da sind noch Espressostãnde in Shoreside Vale! - -[AS2_7] -~g~Da sind noch Espressostãnde auf Staunton Island! - -[AS2_8] -~g~Da sind noch Espressostãnde in Portland! - -[AS2_9] -~g~Da sind noch Espressostãnde in Portland und Shoreside Vale! - -[AS2_10] -~g~Da sind noch Espressostãnde in Portland und auf Staunton Island! - -[AS2_12] -~g~Suche in den Sadtteilen von Liberty City nach ~b~Espresso-2-Go-Stãnden! - -[AS3_A] -~W~Drücken wir noch fester zu oder warten wir, bis es von selbst abfãllt? - -[AS3_B] -~w~Hau einfach drauf... - -[AS3_D] -~w~Mein Helferlein! - -[AS3_E] -~w~Mir war langweilig, da dachte ich mir, ich leiste Asuka Gesellschaft. - -[AS3_1] -~g~Such dir ein ~r~Boot~g~ und fahre zu der ~b~Markierungsboje! - -[AS3_3] -~g~Warte, bis die ~y~Maschine~g~ zur Landung ansetzt! - -[AS3_5] -~g~Sammle die Ladung ein! - -[AS3_4] -~g~Benutze einen Raketenwerfer, um das ~y~Flugzeug~g~ abzuschießen!! - -[AS3_2] -~b~Fahr zu der Markierungsboje! ~y~Das Flugzeug landet gleich!! - -[AS3_6] -~g~~1~ VON 8 - -[KM1] -'DIE BEFREIUNG DES KANBU' - -[KM3] -'DER JAMAICA DEAL' - -[KM4] -'DIE GANG' - -[KM5] -'DIE ABRECHNUNG' - -[KM1_A] -Meine Schwester hãlt große Stücke auf dich, - -[KM1_E] -aber ich bin noch nicht überzeugt, dass ein Gajin wie du was auf dem Kasten hat. - -[KM1_B] -Vielleicht kannst du mir bei einer etwas kniffligen Sache helfen. - -[KM1_F] -Ein Fehlschlag wãre natürlich unverzeihlich. - -[KM1_C] -Ein Yakuza Kanbu sitzt in Haft und wartet auf seine Überführung zum Prozess. - -[KM1_G] -Er ist ein geschãtztes Mitglied der Familie. - -[KM1_H] -Befreie ihn aus der Haft und bring ihn in das Dojo beim Bedford Point. - -[KM1_D] -Wir danken dir für deinen selbstlosen Einsatz. Solltest du jemals Hilfe brauchen, wird das Dojo dir jederzeit zwei Mann zur Seite stellen. - -[KM1_1] -~g~Klau ein Polizeiauto! - -[KM1_2] -~g~Bau eine Bombe in den Wagen ein! - -[KM1_3] -~g~Jetzt bring ihn zu dem Yakuza Dojo. - -[KM1_5] -~g~Okay, jetzt fahr zum Polizeirevier. - -[KM1_6] -~g~Bau eine Bombe in das Auto ein! - -[KM1_7] -~g~Nur autorisierte Polizeifahrzeuge! - -[KM1_9] -~r~Du hast keine Autobombe benutzt, um die Wand zu sprengen. - -[KM1_10] -~r~Der Yakuza Kanbu ist tot - genau wie deine Ehre! - -[KM1_11] -~r~Du hast dich selbst in Schwierigkeiten gebracht! - -[KM2_A] -Gewisse Umgangsformen sind in diesem Beruf von nicht zu unterschãtzender Wichtigkeit. - -[KM2_B] -Es ist eine Schande. Jemand hat mir einmal einen Gefallen getan, und ich konnte mich nie dafür erkenntlich zeigen. - -[KM2_C] -Der Mann ist ein Autonarr, und er hat gebeten, dass wir ihm bestimmte Modelle für seine Sammlung besorgen. - -[KM2_F] -Mein Ehrgefühl verlangt das von mir. - -[KM2_2] -~g~Auto abgeliefert. - -[KM3_A] -Wenn Ungemach droht, wendet der Narr sich ab, wãhrend der Weise sich ihm stellt. - -[KM3_B] -Das kolumbianische Kartell hat unsere wiederholten Bitten ignoriert, unsere Interessen in Liberty zu berücksichtigen. - -[KM3_C] -Jetzt verhandeln die mit den Jamaikanern, um uns weiter zu demütigen. - -[KM3_D] -Sie wollen den Deal am anderen Ende der Stadt besiegeln. - -[KM3_F] -Nimm einen meiner Mãnner, klau einen Yardie-Wagen und statte den Kolumbianern einen Besuch ab. - -[KM3_E] -Unser Ehrgefühl verlangt es, dass niemand am Leben bleibt. - -[KM3_2] -~g~Hole deinen Kontaktmann ab. - -[KM3_3] -~g~Das Treffen findet auf dem Krankenhaus-Parkplatz in Rockford statt! - -[KM3_4] -~r~Sie sind entkommen! - -[KM3_6] -~g~Knöpf sie dir vor! Mach sie fertig! - -[KM3_8] -~g~Du brauchst einen Yardie-Wagen für diesen Job! - -[KM3_9] -~r~Einer der Kolumbianer ist tot. Der Deal ist geplatzt. - -[KM3_10] -~r~Der Kontaktmann ist tot! - -[KM4_A] -Um wahrhaft stark zu sein, darfst du niemals Schwãche zeigen. - -[KM4_C] -Sammle die Gelder umgehend ein, damit wir sie in unsere Casinos stecken können. - -[KM4_1] -Ich kann euch nicht bezahlen, und selbst wenn ich könnte, würde ich es nicht tun. - -[KM4_9] -Eine Jugendbande hat mich gerade überfallen! Sie haben mir alles genommen! - -[KM4_2] -Ihr seid zu nichts nutze. - -[KM4_10] -Was sind SIE denn eigentlich für ein Yakuza..? - -[KM4_3] -Dafür bezahle ich euch Gangster nicht. Diese Art von Schutz kann ich auch von der verdammten Polizei bekommen! - -[KM4_4] -~g~Bestrafe die verantwortliche Gang und stelle das ~b~Schutzgeld~g~ sicher! - -[KM4_7] -~r~Der Ladenbesitzer hat sein Leben verröchelt. - -[KM4_5] -Donald Love möchte dich in seinem Teegarten sehen, um mit dir zu reden. - -[KM4_6] -Da ist das Geld. Es ist alles da! - -[KM4_8] -~g~Tasche aufgesammelt! - -[KM5_A] -DU! Wie passend, dass du ausgerechnet jetzt dein ehrloses Gesicht zeigst! - -[KM5_B] -Es scheint, deine Versuche, die Jamaikaner davon abzuhalten, - -[KM5_B1] -sich mit dem Kartell einzulassen, sind komplett fehlgeschlagen! - -[KM5_C] -Yardie-Pusher verdealen pãckchenweise SPANK in den Straßen von Liberty, als würden sie Hotdogs verkaufen! - -[KM5_D] -Die Mistkerle vom Kartell lachen uns aus, lachen MICH aus! - -[KM5_E] -Ich gebe dir eine letzte Chance das Vertrauen zu rechtfertigen, das meine Schwester in dich setzt! - -[KM5_F] -Mach diese Dreckskerle fertig und wasch deine befleckte Ehre im Blut unserer Feinde rein!!! - -[KM5_3] -~r~Du hast mindestens ~1~ der Yardies nicht erwischt. - -[KM5_4] -~g~Du hast ~1~ der Yardies erwischt. - -[KM5_5] -~g~Du hast ~1~ der Yardies erwischt. BONUS $~1~ - -[RM1] -'DAS SCHWEIGEN DES VERRÃTERS' - -[RM3] -'BRENNENDE BEWEISE' - -[RM4] -'TÖDLICHE BOOTSFAHRT' - -[RM5] -'DER GEPANZERTE ZEUGE' - -[RM1_D] -Er steht unter Zeugenschutz und sitzt mit bewaffneten Leibwãchtern in einer Wohnung in Newport, irgendwo hinter dem Parkplatz. - -[RM1_E] -Zünde die Bude an, und wenn sie rausgerannt kommen, kannst du sie dir vornehmen. Sorge dafür, dass er mit niemandem redet. - -[RM1_1] -~g~Check das Zeugenschutz-Haus aus. - -[RM1_2] -~g~Knöpf dir McAffrey vor! - -[RM2_A1] -Hey, Junge! Hier rüber! - -[RM2_A] -Ein alter Kumpel aus der Army macht Geschãfte in Rockford. - -[RM2_D] -Er braucht Hilfe. Zum Dank will er dir Superpreise machen für alles, was du bei ihm kaufst. - -[RM2_E] -Ray hat schon angerufen... Aber ich dachte, er schickt mehr Leute. - -[RM2_F] -Na ja, drei Arme sind besser als einer, also nimm dir, was du brauchst. - -[RM2_G] -~g~Sieh nach Phil! - -[RM2_H] -~r~Phil hat's erwischt!! - -[RM2_L] -Heh-hey! Wãre ich mit DIR in Nicaragua gewesen, hãtte ich vielleicht meinen Arm noch! - -[RM2_N] -Lass das Geld da. Und jetzt verschwinde. Ich regle das mit den Cops. - -[RM3_D] -Das Beweismaterial wird gerade quer durch die Stadt transportiert. - -[RM3_E] -Du wirst diesen Wagen rammen und jedes kleine Beweisstück einsammeln, wenn es rausfãllt. - -[RM3_F] -Wenn du alles hast, lass das Zeug im Wagen und zünde ihn an. - -[RM3_G] -Das bringt uns beiden eine Stange Geld ein, mein Junge. - -[RM3_1] -~g~Lass das Beweismaterial in einem Auto und zünde das Auto dann an. - -[RM3_4] -~g~Der Staatsanwalt hat die Beweisfotos verloren! - -[RM3_6] -~r~Die Fotos werden sich über ganz Liberty verteilen! - -[RM3_7] -~g~Steck jetzt das Auto in Brand! - -[RM4_A] -Ich glaube, mein Partner ist ein Verrãter. - -[RM4_C] -Meistens fãhrt er abends mit seinem Boot fischen, nahe dem Leuchtturm auf dem Portland Rock. - -[RM4_D] -Klau ein Polizeiboot und mach seinen miesen Machenschaften ein Ende! - -[RM4_1] -~g~Klau ein Polizeiboot. - -[RM4_2] -~g~Fahr zum Leuchtturm und nimm dir Rays Partner vor! - -[RM5_A] -Du unfãhiger Idiot! - -[RM5_A1] -Du hast alles vermasselt! Es geht um mein Leben, und du kannst nicht mal eine Fliege totschlagen! - -[RM5_B] -Ich hab dir viel Geld gezahlt, dafür, dass du diesen Zeugen beseitigst, aber er lebt! - -[RM5_B1] -Und heute wird er vor dem FBI aussagen! - -[RM5_C] -Er muss jeden Moment aus dem Carson General Hospital in Rockford rausgebracht werden. - -[RM5_D] -Wenn er singt, singe ich auch... - -[RM5_E] -Also los, erledige den Job, für den ich dich bezahlt habe! - -[RM5_1] -~g~Fang den Krankenwagen ab. - -[RM5_2] -~g~Man hat dich bemerkt!! - -[RM5_3] -~g~Das war ein Ablenkungsmanöver! - -[RM5_4] -~g~Kugel können den Panzer nicht durchschlagen!! - -[RM5_5] -~g~Der Panzer ist feuersicher!! - -[RM5_7] -~r~Zeuge wurde abgeliefert!! - -[RM5_8] -~g~Zeuge ist ertrunken!! - -[LOVE2] -'DAS KENJI-KOMPLOTT' - -[LOVE3] -'NÃCHTLICHER FISCHZUG' - -[LOVE1_A] -Zunãchst möchte ich dir danken, dass du diese Sache für mich geregelt hast. - -[LOVE1_F] -Die Leute interpretieren heute in alles etwas hinein. - -[LOVE1_D] -Sie versuchen, mir immer noch mehr Geld abzupressen, aber ich halte nichts von Verhandlungen. - -[LOVE1_E] -Deal ist Deal, die sehen keinen Penny von mir. - -[LOVE1_G] -Befreie meinen Freund, egal wie. - -[LOVE1_2] -~g~Rette den alten asiatischen Gentleman. - -[LOVE1_3] -~g~Bring den alten Asiaten zu Love. - -[LOVE1_4] -~g~Der alte Asiate muss in einer der Garagen sein... - -[LOVE1_6] -~r~Der alte Asiate ist von uns gegangen! - -[LOVE1_7] -~g~Das Tor öffnet sich nur für Autos der kolumbianischen Gang. - -[LOVE2_A] -Nichts lãsst die Grundstückspreise so tief purzeln wie ein guter alter Bandenkrieg, - -[LOVE2_B] -außer vielleicht eine Pestepidemie... Aber das ginge hier wohl zu weit. - -[LOVE2_C] -Wie ich bemerkt habe, sind die Yakuza und die Kolumbianer nicht eben Busenfreunde. - -[LOVE2_D] -Daraus sollte man Kapital schlagen. - -[LOVE2_E] -Ich möchte, dass du dir den Yakuza WAKA-Gashira Kenji Kasen vornimmst. - -[LOVE2_F] -Kenji ist bei einem Treffen auf dem Dach der Parkgarage in Newport. - -[LOVE2_G] -Besorg dir einen Wagen des Kartells und nimm ihn dir vor. - -[LOVE2_H] -Die Yakuza werden das als Kriegserklãrung des Kartells auffassen. - -[LOVE2_1] -~g~Klau in Fort Staunton einen Wagen der kolumbianischen Gang! - -[LOVE2_2] -~g~Fahre jetzt zu dem ~p~Parkhaus in Newport~g~ und zieh Kenji aus dem Verkehr! - -[LOVE2_3] -~r~Wenn du nicht mit einem Auto des Kartells aufkreuzt, wird man dich erkennen! - -[LOVE2_4] -~r~Die Yakuza haben dich erkannt! - -[LOVE2_6] -~r~ Du hast alle Zeugen aus dem Weg gerãumt!! - -[LOVE3_A] -In scheinheiligen Zeiten wie diesen sind bestimmte wertvolle Waren schwer zu importieren. - -[LOVE3_C] -Es wird einige kleine Pãckchen ins Wasser abwerfen. - -[LOVE3_D] -Sammle sie ein, bevor es ein anderer tut. - -[LOVE3_1] -~g~Besorg dir ein ~r~Boot~g~ und folge dem ~y~Flugzeug~g~! - -[LOVE4] -'DER FLUGHAFEN-COUP' - -[LOVE5] -'BODYGUARD ACTION' - -[LOVE4_A] -Danke, dass du die Pãckchen geholt hast. Aber die sollten nur als Köder dienen. - -[LOVE4_B] -Sorry, aber so lãuft das manchmal in dem Geschãft. - -[LOVE4_C] -Die Ware, um die es mir wirklich geht, ist noch in dem Flugzeug versteckt. - -[LOVE4_F] -Ich habe die Beamten bestochen. - -[LOVE4_1] -~r~Das kolumbianische Kartell ist da!! - -[LOVE4_2] -~g~Das Pãckchen ist weg! Du musst die Kolumbianer finden und es ihnen abjagen. - -[LOVE4_3] -~g~Bauunternehmen Panlantic...? - -[LOVE4_5] -~g~Das Pãckchen müsste im Flugzeug sein... - -[LOVE4_6] -~g~Nimm den Lift nach oben in den Tower! - -[LOVE5_B] -Mein asiatischer Freund braucht einen Bodyguard. Er lãsst meine neue Lieferung auf Qualitãt überprüfen. - -[LOVE5_1] -~g~Los! - -[LOVE5_2] -~g~Du wirst ein Auto brauchen! - -[LOVE5_3] -~g~Los, sieh nach, ob am Tunnelende die Luft rein ist. - -[LOVE5_4] -~r~Dem Truck darf nichts passieren! - -[RM6] -'IM FADENKREUZ' - -[RM6_A] -Dir ist niemand gefolgt? Gut. - -[RM6_B] -Es wird langsam brenzlig, ich stecke bis zum Hals in der Scheiße! - -[RM6_D] -Die haben mich im Visier, ich muss mich absetzen. - -[RM6_E] -Wenn du mich rechtzeitig zum Flughafen bringst, lass ich ordentlich was springen. - -[RM6_666] -Pass gut auf meinen kugelsicheren Patriot auf, Ray. Wir sehen uns in Miami. - -[CAT1] -'LÖSEGELD' - -[CAT2] -'DIE ÜBERGABE' - -[CAT1_A] -Ich habe deine Maria. Wenn ihr Gesicht nicht aussehen soll, als wãr's in einen Fleischwolf geraten, - -[CAT2_F] -Ich hab mir 'nen Fingernagel abgebrochen und meine Frisur ist hin! Fünfzig Dollar im Eimer! - -[CAT2_G] -Mann, hatte ich Angst. Aber dann dachte ich mir, du bist doch kein kleines Mãdchen mehr. - -[CAT2_H] -Du, das wird lustig, weißt du, meine Schwester will nãmlich mit ihren zwei Kindern eine zeitlang bei uns wohnen, - -[CAT2_I] -weil ihr Mann gerade mal wieder fremdgeht und... - -[CAT1_C] -XXXX - -[CAT1_D] -XXXX - -[CAT1_E] -XXXX - -[CAT1_F] -Du musst rechtzeitig bei Catalina sein! - -[CAT1_G] -XXXX - -[CAT1_H] -XXXX - -[CAT1_I] -XXXX - -[CAT1_J] -XXXX - -[CAT1_K] -XXXX - -[CAT1_L] -XXXX - -[AS4_1] -XXXX - -[CAT_MON] -~g~Du hast noch nicht genug Geld. Du brauchst $500.000. - -[BITCH_D] -~g~Maria ist tot! - -[WEATHER] -WETTER ÃNDERN - -[WEATHE2] -WETTER NORMAL - -[8001] -Du hast komplett versagt! - -[1000] -DU BIST TOT - -[1001] -DU BIST TOT - -[1002] -DU BIST TOT - -[1003] -DU BIST TOT - -[1004] -DU BIST TOT - -[1005] -VERHAFTET - -[1006] -VERHAFTET - -[1007] -VERHAFTET - -[1008] -VERHAFTET - -[1009] -VERHAFTET - -[GA_4] -Autobomben kosten $1000 pro Stück. - -[GA_5] -In deinem Wagen ist schon eine Autobombe. - -[GA_6] -Park die Karre, mach sie durch Drücken der ~h~~k~~PED_FIREWEAPON~-Taste~w~ scharf, und dann nichts wie weg! - -[GA_7] -Mach die Bombe mit der ~h~~k~~PED_FIREWEAPON~-Taste~w~ scharf. Dann geht sie hoch, wenn der Wagen angelassen wird. - -[GA_8] -Benutze den Zünder, um die Bombe hochgehen zu lassen. - -[GA_9] -Du hast ~1~ von zehn Spezialautos beschafft. - -[GA_10] -Hübsche Karre. Hier sind deine $~1~. - -[GA_11] -So eine Karre haben wir schon. Die können wir nicht gebrauchen. - -[GA_12] -Bombe ist scharf. - -[GA_13] -Auf dich ist Verlass. Wenn du alle, die auf der Liste stehen, abgeliefert hast, kriegst du einen Bonus. - -[GA_14] -Du hast alle georderten Karren geliefert. Sehr gut. Hier, für dich. - -[GA_15] -Hoffentlich gefãllt dir die neue Farbe. - -[GA_16] -Das Umspritzen ist gratis. - -[GA_19] -An dem Modell haben wir kein Interesse. - -[GA_20] -Von der Sorte haben wir schon mehr als genug. Sorry, da kommen wir nicht ins Geschãft. - -[CR_1] -Kran kann dieses Fahrzeug nicht anheben. - -[PU_MONY] -Du hast nicht genug Geld. - -[CO_ALL] -Du hast sie alle geliefert. Hier, für dich. - -[PAUSED] -PAUSE - -[HEALTH1] -Stell dich nicht so an! Dir fehlt doch überhaupt nichts. - -[HEALTH2] -Medizinische Versorgung ist teuer. - -[HEALTH3] -Ich flick dich wieder zusammen. - -[HEALTH4] -Das macht $250. - -[FEB_STA] -Statistik - -[FEB_BRI] -Mission - -[FEB_CON] -Steuerung - -[FEB_AUD] -Audio - -[FEB_DIS] -Anzeige - -[FEB_LAN] -Sprache - -[FEP_STA] -STATISTIKEN - -[FEP_BRI] -MISSIONSINFOS - -[FEP_CON] -STEUERUNG - -[FEP_AUD] -AUDIO - -[FEP_DIS] -ANZEIGE - -[FEP_LAN] -SPRACHE - -[FEF_ST1] -Wer ist der Schurke? - -[FEF_ST2] -Wie viel Chaos hast du angerichtet? - -[FEF_BR1] -Du blickst bei der Story nicht mehr durch? - -[FEF_CO1] -Taste dich ran, Mann! - -[FEF_CO2] -Wãhle das Controller-Setup, das zu deinem Spielstil am besten passt - -[FEF_SA1] -Bring deine Daten in Sicherheit! - -[FEF_SA2] -Spiele laden und speichern - -[FEF_AU1] -Volle Dröhnung gefãllig? - -[FEF_AU2] -Radiosender und Soundeffekt auswãhlen - -[FEF_DI1] -Andere Optik? - -[FEF_DI2] -Spiel für deinen Fernseher optimieren - -[FEF_LA1] -Was für ein Gefasel! - -[FEF_LA2] -Sprache auswãhlen - -[FEB_PMB] -Vorherige Missionsinfos: - -[FEC_NA] -Nicht verfügbar - -[FEC_CWL] -Eine Waffe nach links - -[FEC_CWR] -Eine Waffe nach rechts - -[FEC_LOF] -Nach vorne schauen - -[FEC_TAR] -Zielen - -[FEC_MOV] -Bewegung - -[FEC_CAM] -Blickwinkel - -[FEC_PAU] -Pause - -[FEC_ENV] -In Fahrzeug einsteigen - -[FEC_JUM] -Springen - -[FEC_ATT] -Angreifen\Waffe abfeuern - -[FEC_RUN] -Rennen - -[FEC_FPC] -Subjektive Kamera - -[FEC_LB1] -Schau - -[FEC_LL] -Nach links schauen - -[FEC_LB2] -nach hinten - -[FEC_LB] -Nach hinten schauen - -[FEC_LR] -Nach rechts schauen - -[FEC_HOR] -Hupe - -[FEC_VES] -Fahrzeug steuern - -[FEC_RSC] -Radiosender auswãhlen - -[FEC_BRA] -Bremsen\rückwãrts fahren - -[FEC_HAB] -Handbremse - -[FEC_CAW] -Fahrzeugwaffe - -[FEC_ACC] -Beschleunigen - -[FEC_SMT] -Spezialmission aktivieren - -[FEC_CCF] -Konfiguration: - -[FEC_CF1] -Konfig1 - -[FEC_CF2] -Konfig2 - -[FEC_CF3] -Konfig3 - -[FEC_CF4] -Konfig4 - -[FEC_CDP] -Controller-Anzeige: - -[FEC_ONF] -Zu Fuß - -[FEC_INC] -Im Auto - -[FEC_VIB] -Vibration: - -[FEA_OUT] -Tonausgabe: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_NON] -Keinen - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -CHATTERBOX 109 - -[FED_DBG] -Menu Debug - -[FED_RID] -Reload IDE - -[FED_RIP] -Reload IPL - -[FED_PAH] -Parse Heap - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Big White Debug Light Switched - -[FED_SPR] -Show Ped Road Groups - -[FED_SCR] -Show Car Road Grups - -[FED_SCZ] -Show Cull Zones - -[FED_DSR] -Debug Streaming Requests - -[FED_SCP] -gbShowCollisionPolys - -[FEM_MCM] -Memory Card Menü - -[FEM_RMC] -Register MemCard One - -[FEM_TFM] -Test Format MemCard One - -[FEM_TUM] -Test UnFormat MemCard One - -[FEM_CRD] -Create Root Dir - -[FEM_CLI] -Create And Load Icons - -[FEM_FFF] -Fill First File with Guff - -[FEM_SOG] -Save Only The Game - -[FEM_CES] -Check Every 0kB4 Save - -[FEM_STG] -Save The Game - -[FEM_STS] -Save The Game under GTA3 name - -[FEM_CPD] -Create copy protected mag directory - -[FEM_MC2] -Memory Card Menu 2 - -[FEM_TS] -Test Save: - -[FEM_TL] -Test Load: - -[FEM_TD] -Test Delete: - -[PL_STAT] -Spielerstatistiken - -[PE_WAST] -Von dir abservierte Personen - -[PE_WSOT] -Von anderen abservierte Personen - -[CAR_EXP] -Explodierte Autos - -[TM_BUST] -Zahl deiner Verhaftungen - -[M_WASTE] -Mãnnliche Passanten - -[F_WASTE] -Weibliche Passanten - -[PIG_WST] -Cops - -[GNG_WST] -Gang-Mitglieder - -[MED_WST] -Sanitãter - -[FIRE_WS] -Feuerwehrmãnner - -[DED_CRI] -Kriminelle - -[DED_DED] -Schnorrer - -[DED_HOK] -Girls - -[HEL_DST] -Zerstörte Helikopter - -[PER_COM] -Absolviert (in Prozent) - -[KGS_EXP] -Sprengstoffverbrauch in kg - -[ACCURA] -Treffsicherheit - -[ELBURRO] -Beste Turismo-Zeit in Sekunden - -[CAR_CRU] -Geschrottete Autos - -[HED_EX] -Köpfe - -[TM_DED] -Krankenhausbesuche - -[DAYSPS] -Im Spiel verstrichene Tage - -[MMRAIN] -Regenfãlle in mm - -[MXCARD] -Weitester IRRSINNS-Sprung (in Fuß) - -[MXCARJ] -Höchster IRRSINNS-Sprung (in Fuß) - -[MXCARDM] -Weitester IRRSINNS-Sprung (m) - -[MXCARJM] -Höchster IRRSINNS-Sprung (m) - -[MXFLIP] -Max. Anzahl Saltos - -[MXJUMP] -Max. Drehungen im Sprung - -[BSTSTU] -Bester IRRSINNS-Stunt bisher: - -[INSTUN] -Irrsinns-Stunt - -[PRINST] -Super Irrsinns-Stunt - -[DBINST] -Doppelter Irrsinns-Stunt - -[DBPINS] -Super-Doppel-Irrsinns-Stunt - -[TRINST] -Dreifacher Irrsinns-Stunt - -[PRTRST] -Super-Dreifach-Irrsinns-Stunt - -[QUINST] -Vierfacher Irrsinns-Stunt - -[PQUINS] -Super-Vierfach-Irrsinns-Stunt - -[NOSTUC] -Bisher keine Stunts geschafft - -[NOUNIF] -Monster-Stunts geschafft - -[NOUNGM] -Monster-Stunts insgesamt - -[NMISON] -Begonnene Missionen - -[NMMISP] -Erfüllte Missionen - -[PASDRO] -Beförderte Fahrgãste - -[MONTAX] -Mit Taxi verdientes Geld - -[DAYPLC] -Tagesetat für Polizei - -[CRIMRA] -Punktzahl: - -[GMSTOR] -Spielarchiv - -[PREBRF] -Vorherige Missionsinfos - -[CNTLS] -Steuerung - -[MUSMEN] -Musik SFX - -[GAMSET] -Spieleinstellungen - -[LANGUA] -Sprache - -[DSPLAY] -Anzeige - -[DEBUGM] -Debug Menu - -[QUITOP] -Optionen verlassen - -[CONTRL] -Konfiguration d. Steuerung - -[SET1EN] -Konfiguration 1 aktiviert - -[SET1] -Konfiguration 1 - -[SET2EN] -Konfiguration 2 aktiviert - -[SET2] -Konfiguration 2 - -[SET3EN] -Konfiguration 3 aktiviert - -[SET3] -Konfiguration 3 - -[SET4EN] -Konfiguration 4 aktiviert - -[SET4] -Konfiguration 4 - -[GOBACK] -Zurück - -[SOUND] -SOUND - -[MUSVOL] -Lautstãrke Musik - -[SFXVOL] -Lautstãrke SFX - -[SCROPT] -BILDSCHIRMOPTIONEN - -[CTRSCR] -Bildschirm zentrieren - -[SCRFOR] -Bildschirmformat - -[GMSVLQ] -SPEICHERN-LADEN-BEENDEN - -[GMREST] -Spiel neu starten - -[NOGMSV] -Du kannst nur in deinem Unterschlupf speichern. - -[DLFILE] -GTA3 Dateien löschen - -[CHFILE] -ZU LADENDE DATEI AUSWÃHLEN - -[CHCDLD] -Wãhle Memory Card (PS2) von der geladen werden soll - -[CDUNFR] -Memory Card (PS2) ist nicht formatiert. - -[CHFIDL] -ZU LÖSCHENDE DATEI AUSWÃHLEN - -[SVCONF] -SPEICHERBESTÃTIGUNG - -[SVFNAM] -Dateiname des gespeicherten Spiels: - -[SAVEDN] -Fehler - Speicherung nicht vollstãndig. - -[LANGSL] -SPRACHAUSWAHL - -[ENGLIS] -Englisch - -[GERMAN] -Deutsch - -[ITALIA] -Italienisch - -[FRENCH] -Französisch - -[SPAIN] -Spanisch - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[PARSHP] -Parse Heap - -[DBGFON] -CTheScripts::DbgFlag On - -[DBFOFF] -CTheScripts::DbgFlag Off - -[BGWHON] -Big White Debug Light Switched On - -[BGWOFF] -Big White Debug Light Switched Off - -[DSTRON] -Debug Streaming Requests On - -[DSTROFF] -Debug Streaming Requests Off - -[PDRGON] -ShowPedRoadGroups On - -[PRGOFF] -ShowPedRoadGroups Off - -[CRRGON] -ShowCarRoadGroups On - -[CRGOFF] -ShowCarRoadGroups Off - -[CLZOON] -Show Cull Zones On - -[CLZOOF] -Show Cull Zones Off - -[SHPLON] -gbShowCollisionPolys On - -[SHPLOF] -gbShowCollisionPolys Off - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[FORMM1] -FormatMemCard 1 (teststuff) - -[UNFRM1] -UnFormatMemCard 1 (teststuff) - -[GORLEV] -Gewalt-Level - -[SICASS] -Mittel - -[SICSIC] -Hoch - -[SCASSL] -Gewalt-Level 'mittel' gewãhlt - -[SCSCSL] -Gewalt-Level 'hoch' gewãhlt - -[PRVMEN] -Vorherige Missionsinfos - -[DOSVGM] -Spiel speichern? - -[FORMEN] -Formatierungsmenü - -[MEMTST] -Memory Card-Testmenü - -[REGCAR] -Memory Card 1 registrieren - -[TEFONE] -Memory Card 1 testweise formatieren - -[TEUFON] -Memory Card 1 testweise de-formatieren - -[CRROOT] -CreateRootDir - -[CRLDIC] -Create and Load Icons - -[FLFSGF] -Fill First File With Guff - -[PUSAVE] -Save Only the game - -[CHEVOK] -CheckEveryOkB4Save - -[SVGMON] -SaveTheGame - -[CNTSAV] -Spiel kann nicht gespeichert werden. Mitten in Mission. - -[CNCSAV] -Spiel kann nicht gespeichert werden. Du bist im Auto. - -[CRMGSV] -Create copy protected magazine directory - -[MGSVCN] -MagazineDirectory Created - -[MGSVNC] -MagazineDirectory Not Created - -[YES] -Ja - -[NO] -Nein - -[X] -x - -[LAST] -Letzte Nachricht - -[FEDS_XB] -Auswãhlen - -[FEDS_ST] -START-Taste - WEITER - -[FEST_OO] -von - -[FEC_TUC] -Geschützsteuerung - -[FEC_SM3] -Spezialmission aktivieren (R3-Taste) - -[FEC_RS3] -Radiosender auswãhlen (L3-Taste) - -[FEC_HO3] -Hupe (L3-Taste) - -[DIAB1] -'GRAN TURISMO' - -[DIAB2] -'BRANDHEISSE EISCREME' - -[DIAB3] -'FEUERTAUFE' - -[DIAB4] -'JÃGER DES VERLORENEN SCHUNDES' - -[DIAB1_A] -El Burro bietet dir eine Chance. Über den öffentlichen Fernsprecher in Hepburn Heights erfãhrst du nãheres. - -[DIAB1_C] -Du bist kein übler Fahrer. Komm wieder zu dem Telefon. Vielleicht hat El Burro noch mehr Jobs für dich. - -[DIAB1_1] -~g~3...2...1... LOS. LOS, LOS! - -[DIAB1_4] -~g~Schnapp dir einen schnellen Wagen und fahr zum Start. - -[DIAB1_3] -~r~Du würdest nicht mal beim Sackhüpfen gewinnen, du LOSER! - -[DIAB1_2] -~g~Gratulation! Du hast gesiegt. In der unglaublichen Zeit von ~1~ Sekunden. - -[FIRST] -~g~1. - -[SECOND] -~g~2. - -[THIRD] -~g~3. - -[FOURTH] -~g~4. - -[DIAB2_1] -~g~Hol die Aktentasche in Harwood ab. - -[DIAB2_2] -~g~Such dir einen Eis-Wagen. - -[DIAB2_3] -~g~Parke den Eis-Wagen unten bei den Atlantic Quays. - -[DIAB2_4] -~g~Drücke die ~w~~k~~VEHICLE_HORN~-Taste~g~, um den Eiscreme-Jingle abzuspielen. - -[DIAB2_6] -~g~Drücke die ~w~~k~~VEHICLE_HORN~-Taste~g~, um den Eiscreme-Jingle abzuspielen. - -[DIAB2_7] -~g~Drücke die ~w~~k~~VEHICLE_HORN~-Taste~g~, um den Eiscreme-Jingle abzuspielen. - -[DIAB2_5] -~g~Steig aus und sprenge den Eis-Wagen mit dem Fernzünder. - -[YD1] -'SCHNELLE AUTOS, SCHNELLES GELD' - -[YD2] -'UZI RIDER' - -[YD3] -'DER GROSSE AUTOKLAU' - -[YD4] -'TAG DER RACHE' - -[YD_P] -King Courtney will dich sprechen - am Telefon in Aspatria!! - -[YD1_A] -~w~Hier spricht King Courtney. - -[YD1_A1] -~w~Meine Yardies könnten einen Fahrer brauchen, und du hast keinen schlechten Ruf. - -[YD1_B] -~w~Fahr mit einem Wagen zu dem Gelãnde gegenüber dem Stadion und warte auf die anderen Mitbewerber. - -[YD1_C] -~w~Meine Mãnner beobachten Checkpoints überall in Staunton. - -[YD1_D] -~w~Wer einen Checkpoint als erster erreicht, kriegt $1000. Dann geht's weiter zur nãchsten Station. - -[YD1_D1] -~w~Wenn du mehr Checkpoints als die anderen gewinnst, habe ich vielleicht Arbeit für dich. - -[YD1_E] -~g~Fertigmachen zum Start! - -[YD1_F] -~g~Du bist zu früh gestartet. Das gefãllt mir!! - -[YD1_G] -~r~Dies ist ein AUTORENNEN. Du brauchst ein AUTO, Hirni! - -[YD1GO] -~g~LOS!! - -[YD1_1] -~r~1 - -[YD1_2] -~r~2 - -[YD1_3] -~r~3 - -[YD1_BON] -$1000!! - -[Y1_1ST] -~g~Du bist Erster mit ~1~ gewonnenen Checkpoints! - -[Y1_2ND] -~y~Zweiter mit ~1~ gewonnenen Checkpoints. ~y~Tja, knapp daneben ist auch versagt! - -[Y1_3RD] -~r~Dritter mit ~1~ gewonnenen Checkpoints. ~r~Findest du das okay? - -[Y1_LAST] -~r~Du bist Letzter! ~r~Du vergeudest meine Zeit, BLÖDMANN! - -[Y1_J1ST] -~y~Du teilst dir den 1. Platz. ~1~ gewonnene Checkpoints. ~y~Gut, aber du musst der Beste sein, um für Queen Lizzy zu fahren! - -[Y1_J2ND] -~r~Du teilst dir den 2. Platz. ~1~ gewonnene Checkpoints. Du Schlãfer! - -[Y1JLAST] -~r~Du bist unter den Letzten! Wo hast du deinen Führerschein gemacht? - -[Y1_TEST] -AUTO IM WASSER!! - -[YD2_A] -~w~Ich will sehen, ob du die Drecksjobs für mich machen kannst. - -[YD2_A1] -Mal sehen, ob man dir trauen kann. - -[YD2_B] -Gleich kommen zwei meiner Jungs und holen dich ab. - -[YD2_B1] -Wollen sehen, ob du so gut bist, wie du sagst. - -[YD2_C] -~w~Wir fahren nach Hepburn Heights und nehmen uns ein paar Diablos vor, die Queen Lizzy angemacht haben. - -[YD2_CC] -~w~Hier, du wirst 'ne Knarre brauchen. - -[YD2_D] -~w~Du fãhrst UND ballerst. Wir achten drauf, dass du keine kalten Füße kriegst. - -[YD2_E] -~w~Los geht's!! - -[YD2_F] -~r~Er haut ab! Schnapp dir den Feigling!!! - -[YD2_G1] -~w~Hepburn Heights. Knöpf dir ein paar Diablos vor. - -[YD2_G2] -~w~ Aber denk dran, ~r~du steigst nicht aus dem Wagen!! - -[YD2_H] -~w~Okay, fahr uns zurück auf Yardie-Gebiet! LOS, LOS, LOS!! - -[YD2_L] -~w~Gut gemacht, Sichler! - -[YD2_M] -~r~Er hat mein Auto geschrottet! Mach ihn fertig! - -[YD2_N] -~w~Steig sofort wieder in den Wagen! - -[YD3_A] -Besorg ein paar Bandenautos, - -[YD3_A1] -damit wir auf Feindgebiet operieren können. - -[YD3_B] -Ich brauche einen Mafia Sentinel, - -[YD3_B1] -einen Yakuza Stinger und einen - -[YD3_B2] -Diablo Stallion. So können wir jede Gang in Liberty angreifen. - -[YD3_C] -Stell sie in der Garage in Newport ab. Aber denk dran: , - -[YD3_C1] -Geschrottet nützen sie uns nichts!! - -[YD3_D] -Spare text label - -[YD3_E] -~r~Du hast bereits einen Diablo-Wagen! - -[YD3_F] -~r~Du hast bereits einen Mafia-Wagen! - -[YD3_G] -~r~Du hast bereits einen Yakuza-Wagen! - -[YD3_H] -~g~Diablo-Wagen besorgt! - -[YD3_I] -~g~Mafia-Wagen besorgt! - -[YD3_J] -~g~Yakuza-Wagen besorgt! - -[YD3_K] -~r~Das Auto ist praktisch Schrott! Repariere es! - -[YD3_L] -~g~Fahr das Auto zu der ~p~Garage! - -[YD3_M] -~r~Du hast dich überschlagen! Besorg ein anderes Auto! - -[YD4_A] -Hör zu! - -[YD4_A1] -Komm nach Bedford Point. - -[YD4_A2] -In einem alten Wagen ist etwas versteckt. Das brauche ich pronto! - -[YD4_B] -BRIEF: Man hört, du bist ein viel beschãftigter Mann. Nun, ich bin eine viel beschãftigte Frau. - -[YD4_C] -Es wird Zeit, dass du die wahre Macht von 'SPANK' kennen lernst! Besos y fuderes, Catalina, xxx. - -[YD4_D] -PS: FAHR ZUR HÖLLE!! - -[YD4_1] -Irre auf SPANK!! - -[YD4_2] -~g~Zerstöre die SPANK-Lieferwagen!! - -[HM_1] -'DRIVE-BY ACTION' - -[HM_2] -'TÖDLICHES SPIELZEUG' - -[HM_3] -'DAS HÖLLENFAHRTSKOMMANDO' - -[HM_5] -'SHOWDOWN' - -[HOOD1_A] -Komm zu dem Fernsprecher in Wichita Gardens. Es gibt Arbeit. - -[HM1_A] -Yo! Hier spricht D-Ice von den Red Jacks! - -[HM1_C] -Diese pubertãren Idioten treiben sich hier rum und haben nichts als Knarren und SPANK im Sinn. - -[HM1_3] -~g~Die 'Nines' hãngen in ihrem Gebiet in Wichita Gardens rum. - -[HM2_3] -Wenn du die Reifen eines Wagens triffst, explodiert der Buggy! - -[HM2_4] -Wenn er außer Reichweite kommt, explodiert der Buggy! - -[HM2_5] -~r~Außer Reichweite! - -[HM3_1] -~g~Fahr zur Garage. Aber Vorsicht: Wird der Wagen zu stark beschãdigt, explodiert er! - -[HM3_2] -~g~Bring den Wagen zurück. Er muss in 1A Zustand sein. Keine Delle! - -[HM3_3] -~g~Repariere den Wagen! - -[HM4_D] -~g~Besorg dir ein Fahrzeug! - -[HM4_E] -TEXT NO LONGER REQUIRED - -[HM4_1] -~g~Begib dich an den Ort, wo die Ladung herumliegt. Du musst 30 Goldbarren einsammeln. - -[HM4_2] -~g~Denk dran: Wird der Wagen zu schwer und zu langsam, fahr in die Garage und lade das Zeug aus. - -[HM5_3] -~r~Du solltest nur einen Baseball-Schlãger verwenden! - -[HM5_4] -~r~Deine Kontaktperson ist tot! - -[MEA1] -'DER ABKOCHER' - -[MEA2] -'DIE DIEBE' - -[MEA3] -'DIE FRAU' - -[MEA4] -'IHR LIEBHABER' - -[MEAT1_A] -Man sagt, du kannst mir bei einigen Problemen helfen. Wenn das so ist, komm zu dem Fernsprecher in Trenton. - -[MEA1_B3] -~g~Triff dich mit dem Bankier. - -[MEA1_B6] -~g~Fahr das Auto zur Schrottpresse, um Beweise zu beseitigen. Steig aus, der Kran hebt das Auto rein. - -[MEA1_1] -~r~Der Bankier ist tot! - -[MEA1_2] -~r~Du solltest den Wagen doch verschrotten! - -[MEA1_3] -~g~Steig aus dem Wagen! - -[MEA1_4] -~r~Du hast den Bankier nicht mitgenommen! - -[MEA2_B3] -~g~Triff dich mit den Dieben. - -[MEA2_B4] -~g~Bring sie zur Bitchin' Dog Food Fleischfabrik. - -[MEA2_B6] -~g~Spritz den Wagen um, um Beweise zu beseitigen. - -[MEA2_1] -~r~Du solltest den Wagen doch verschrotten! - -[MEA2_2] -~r~Ein Dieb ist tot! - -[MEA2_4] -~r~Du hast einen Dieb nicht mitgenommen! - -[MEA3_B3] -~g~Hole Mrs. Chonks ab. - -[MEA3_B6] -~g~Versenke den Wagen im Meer, um Beweismaterial zu beseitigen. - -[MEA3_1] -~r~Die Frau ist tot! - -[MEA3_2] -~r~Du solltest den Wagen doch im Meer versenken! - -[MEA3_3] -~r~Du hast die Frau nicht mitgenommen! - -[MEA4_B3] -~g~Hol den Liebhaber seiner Frau ab. - -[MEA4_B6] -Dazu ist es jetzt zu spãt, Marty. Du hattest deine Chance. Jetzt übernehme ich den Laden hier. - -[MEA4_1] -~r~Carlos ist tot! - -[MEA4_3] -~r~Du hast Carlos den Kredithai nicht mitgenommen! - -[LOOK_A] -Halte die ~h~~k~~VEHICLE_LOOKLEFT~-Taste ~w~oder die ~h~~k~~VEHICLE_LOOKRIGHT~-Taste~w~ gedrückt, um im Wagen sitzend nach ~h~links~w~ oder ~h~rechts~w~ zu sehen. Drücke beide Tasten, um nach ~h~hinten~w~ zu sehen. - -[LOVE6_1] -~g~Locke jetzt die Cops vom Lagerhaus weg! - -[LOVE6_2] -~r~Du hast die Cops nicht weit genug weggelockt! - -[RM4_3] -~r~Rays Partner ist entkommen! - -[RM6_C] -Die CIA scheint sich sehr für SPANK zu interessieren. - -[RM6_C1] -Sie wollen, dass wir das Kartell in Ruhe lassen. - -[C_PASS] -BEDROHUNG AUSGERÃUMT! - -[CTUTOR] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Bürgerwehr Missionen zu aktivieren oder zu deaktivieren. - -[CTUTOR2] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Bürgerwehr Missionen zu aktivieren oder zu deaktivieren. - -[COPCART] -~g~Du hast ~1~ Sekunden, um zu einem Polizeiwagen zurückzukehren, bevor die Mission endet. - -[C_FAIL] -Mission beendet! - -[C_CANC] -~r~Bürgerwehr Mission abgebrochen! - -[C_ESCP] -~r~Der Verdãchtige ist entwischt! - -[C_TIME] -~r~Deine Zeit als Gesetzeshüter ist vorbei! - -[C_VIGIL] -BÜRGERWEHR BONUS!! - -[A_FAIL2] -~r~Deine Bummelei war tödlich für den Patienten! - -[A_FAIL3] -~r~Der Patient ist tot!! - -[A_PASS] -Gerettet! - -[F_FAIL2] -~r~Du kommst zu spãt! - -[A_COMP2] -Du ermüdest nie! - -[RM2_M] -Wenn du eine Waffe brauchst, komm vorbei und nimm dir aus den Kãsten, was du brauchst. - -[HEAL_A] -Dein ~h~Gesundheit~w~ wird rechts oben auf dem Bildschirm in Orange angezeigt. - -[YD1_CNT] -~1~ von 15! - -[FM1_9] -~g~Da vorne ist die Party. Setz Maria vor dem Gebãude ab. - -[FM1_Y] -~w~Das war seit langem mal wieder ein guter Abend. Und du hast mich wirklich gut behandelt, mit Respekt und so. - -[FM1_AA] -~w~Oh, ich geh jetzt besser. Ich hoffe, wir sehen uns. - -[NOCONTE] -Bitte stecken Sie einen Analog Controller (DUALSHOCK#) oder einen Analog Controller (DUALSHOCK#2) in Controller-Anschluss 1, um fortzufahren. - -[WRCONT] -Der Controller an Controller-Anschluss 1 wird nicht unterstützt. GTA3 benötigt einen Analog Controller (DUALSHOCK#) oder einen Analog Controller (DUALSHOCK#2). - -[WRCONTE] -Der Controller an Controller-Anschluss 1 wird nicht unterstützt. GTA3 benötigt einen Analog Controller (DUALSHOCK#) oder einen Analog Controller (DUALSHOCK#2). - -[WRONGCD] -Falsche DVD. Bitte legen Sie die richtige DVD ein. - -[NOCD] -Die DVD-Lade ist leer. Bitte DVD einlegen. - -[OPENCD] -Die DVD-Lade ist offen. Bitte schließen. - -[CDERROR] -Fehler beim Lesen der GTA3 DVD. - -[RESTART] -Neues Spiel wird gestartet - -[GA_3] -Keine Gratisjobs mehr. Umspritzen kostet $1000! - -[GA_1] -So was heißes rühre ich nicht an! - -[GA_1A] -Komm wieder, wenn du nicht so viel zu tun hast... - -[S_PROM2] -In die Garage nebenan kann 1 Fahrzeug eingestellt werden, wenn du das Spiel speicherst. - -[STOCK] -Nicht vorrãtig - -[FM1_O] -~w~Er ist beim Bahnhof am Chinatown-Ufer, glaube ich. - -[EBAL_B] -Hier ist es! Los, wir tauchen ab und besorgen uns neue Klamotten! - -[EBAL_G] -Hier ist Luigis Club. Wir gehen hinten rum und nehmen den Lieferanteneingang. - -[AM4_3] -Du musst Asukas neuer Botenjunge sein! - -[AM4_4] -Hast du das Geld? Die ganze Summe? - -[AM4_5] -Ich weiß, was du denkst. Wieder so ein korrupter Cop. - -[AM4_6] -Tja, die Welt ist schlecht. - -[AM4_7] -Nur weil ich ein paar Partner verloren habe, sitzen mir die Typen von der Dienstaufsicht im Genick. - -[AM4_8] -Die glauben, ich habe Dreck am Stecken. - -[AM4_9] -Tja, die ganze Stadt ist ein einziges Dreckloch. - -[AM4_10] -Aber ich brauch Hilfe von außerhalb der Polizei. - -[AM4_11] -Falls du interessiert bist... du weißt, wo du mich findest. - -[CAM_A] -Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~-taste~w~, um den ~h~Blickwinkel ~w~zu verãndern, wenn du zu Fuß oder in einem Fahrzeug unterwegs bist. - -[CAM_B] -Drücke die ~h~Richtungstaste Oben~w~ und die ~h~Richtungstaste Unten~w~, um den ~h~Blickwinkel ~w~zu verãndern, wenn du zu Fuß oder in einem Fahrzeug unterwegs bist. - -[KM2_1] -~g~Repariere den Wagen. Er muss top aussehen. - -[LM3_6] -Joey... - -[LM3_6A] -Na, ein bisschen Nahkampf mit deiner Braut gefãllig? - -[LM3_9A] -Vielleicht gibt's Arbeit für dich. - -[LM3_9B] -Okay? - -[AWAY2] -~r~Sie sind entkommen. - -[AWAY] -~r~Er ist verschwunden! - -[JM6_1] -Fahr zu der Bank auf dem Boulevard. - -[GA_6B] -Park die Karre, mach sie durch Drücken der ~h~~k~~PED_FIREWEAPON~-Taste~w~ scharf, und dann HAU AB! - -[GA_7B] -Mach die Bombe mit der ~h~~k~~PED_FIREWEAPON~-Taste~w~ scharf. Sie geht hoch, wenn der Wagen angelassen wird. - -[BAT1] -~g~Nimm dir den Schlãger! - -[EBAL_O] -Wenn du deine Sache gut machst, gibt's vielleicht noch mehr Jobs für dich. Und jetzt verschwinde! - -[HELP9_B] -Drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~, um mit dem Prãzisionsgewehr zu ~h~feuern~w~. - -[HELP9_C] -Drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~, um mit dem Prãzisionsgewehr zu ~h~feuern~w~. - -[JM6_8] -~r~Du hast alle Rãuber verloren! - -[COLT_IN] -Die Pistole ist jetzt im AmmuNation vorrãtig! - -[TAXI2] -~r~Die Zeit ist um! - -[TAXI3] -~r~Dein Fahrgast ist entsetzt geflohen! - -[TAXI7] -~r~Dein Wagen ist Schrott. Repariere ihn. - -[TAXI4] -Fahrt abgeschlossen! - -[TAXI5] -SPEED BONUS!! - -[TAXI6] -Taxi-Mission beendet - -[FRANGO] -~g~Salvatore sagt, du sollst zuerst Toni mit den Triaden helfen. - -[PAGEB12] -Polizei-Schmiergelder wurde im Versteck angeliefert. - -[PAGEB13] -Gesundheits-Powerups wurde im Versteck angeliefert. - -[PAGEB14] -Adrenalin wurde im Versteck vorrãtig. - -[KM1_4] -~g~Du brauchst einen Polizeiwagen für diesen Job! - -[CAT1_B] -dann bring $500 000 zu der Villa in Cedar Grove. - -[JM2_C] -Er hat eine Imbissbude in Chinatown. - -[RM6_1] -Hier ist ein Schlüssel für eine Garage. - -[RM6_2] -Darin findest du Bargeld und ein paar 'Requisiten' für alle Fãlle. - -[RM6_3] -Bis dann. - -[FE_INIP] -Initalisiere und lade Pausenmenü. Bitte warten. - -[FESZ_CA] -Abbrechen - -[FESZ_QU] -Beenden - -[FESZ_L1] -Spiel erfolgreich gespeichert! - -[FESZ_L2] -Spiel gespeichert unter: - -[FESZ_OK] -OK - -[FES_LGA] -Spiel laden - -[FES_NGA] -Neues Spiel - -[FES_CAN] -Abbrechen - -[FESZ_QL] -Alle nicht gespeicherten Daten des aktuellen Spiels werden verlorengehen. Ladevorgang fortsetzen? - -[FESZ_QD] -Dieses gespeicherte Spiel wirklich löschen? - -[FESZ_QO] -Dieses gespeicherte Spiel wirklich überschreiben? - -[FESZ_QR] -Wirklich ein neues Spiel beginnen? Alle Daten seit dem letzten Speichern werden verlorengehen. Weiter? - -[FESZ_QS] -SPEICHERN FORTSETZEN? - -[SLONFP] -MEMORY CARD-Steckplatz 1: Datei geschützt. - -[T4X4_1] -'PATRIOT RALLYE' - -[T4X4_2] -'SPAZIERFAHRT IM PARK' - -[T4X4_3] -'CHECKPOINT FIEBER' - -[MM_1] -'VOLLGAS IM PARKHAUS' - -[T4X4_1A] -~g~Du hast ~y~5 Minuten~g~, um ~y~15~g~ Checkpoints abzufahren. ~g~Die ~y~REIHENFOLGE IST BELIEBIG. - -[T4X4_1B] -~1~ von 15! - -[T4X4_1C] -~y~PASSIERE~g~ den ersten Checkpoint, dann lãuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~20 SEKUNDEN~g~. - -[T4X4_2A] -~g~Du hast ~y~2 Minuten~g~, um ~y~12~g~ Checkpoints abzufahren. ~g~Die ~y~REIHENFOLGE IST BELIEBIG. - -[T4X4_2B] -~1~ von 12! - -[T4X4_2C] -~y~PASSIERE~g~ den ersten Checkpoint, dann lãuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~10 SEKUNDEN~g~. - -[T4X4_3A] -~g~Du hast ~y~5 Minuten~g~, um ~y~20~g~ Checkpoints abzufahren. ~g~Die ~y~REIHENFOLGE IST BELIEBIG. - -[T4X4_3B] -~y~PASSIERE~g~ den ersten Checkpoint, dann lãuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~15 SEKUNDEN~g~. - -[T4X4_3C] -~1~ von 20! - -[T4X4_F] -~r~Du hast gekniffen! Schon überfordert? - -[MM_1_A] -~g~Du hast ~y~2 Minuten~g~, um ~y~20 Checkpoints~g~ in dem Parkhaus abzufahren! ~g~Die ~y~REIHENFOLGE IST BELIEBIG. - -[MM_1_B] -~1~ von 20! - -[MM_1_C] -~g~Das macht 20 Sekunden plus ~y~5 SEKUNDEN~g~ für jeden Checkpoint. ~g~Die Zeit lãuft ~y~AB SOFORT. - -[FM2_14] -~r~Du warst zu nah dran und hast Curly aufgeschreckt! - -[FM2_15] -~g~Nicht zu nahe ran, sonst schöpft Curly Verdacht! - -[UPSIDE] -~r~Du hast dich überschlagen! - -[FM2_16] -SCHRECK-O-METER: - -[LM3_11] -~g~Misty steigt in keinen Bus. Besorg ein anderes Fahrzeug! - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinel - -[PATRIOT] -Patriot - -[FIRETRK] -Feuerwehrwagen - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mule - -[CHEETAH] -Cheetah - -[AMBULAN] -Krankenwagen - -[FBICAR] -F.B.I. - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -Mr Whoopee - -[BFINJC] -BF Injection - -[POLICAR] -Polizei - -[ENFORCR] -Enforcer - -[SECURI] -Securicar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Barracks OL - -[TRAIN] -Zug - -[HELI] -Helikopter - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -RC Bandit - -[BELLYUP] -Triad - -[MRWONGS] -Mr Wongs - -[MAFIACR] -Mafia - -[YARDICR] -Yardie - -[YAKUZCR] -Yakuza - -[DIABLCR] -Diablo - -[COLOMCR] -Cartel - -[HOODSCR] -Hoods - -[AEROPL] -Flugzeug - -[SPEEDER] -Speeder - -[REEFER] -Reefer - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Borgnine - -[TOYZ] -TOYZ - -[FEST_DF] -Zu Fuß zurückgel. Meilen - -[FEST_DC] -Mit Auto gefahrene Meilen - -[FESTDFM] -Zu Fuß zurückgel. Meter - -[FESTDCM] -Mit Auto gefahrene Meter - -[FEST_R1] -Patriot Rallye in Sek. - -[FEST_R2] -Spazierfahrt im Park in Sek. - -[FEST_R3] -Checkpoint-Fieber in Sek. - -[FEST_RM] -Vollgas durch die Parkgarage in Sek. - -[FEST_LS] -Mit Krankenwagen gerettete Menschen - -[FEST_CC] -Kriminelle bei Bürgerwehr Mission - -[FEST_FE] -Gelöschte Feuer gesamt - -[FEST_LF] -Lãngster Flug in Dodo - -[FEST_BD] -Bestzeit Bombenentschãrfung - -[FEST_RP] -Bestandene Amokfahrten - -[FEST_MP] -Erledigte Missionen - -[FEST_BB] -Schnelle Autos, Schnelles Geld: - -[FEST_H0] -Meiste Checkpoints - -[FEST_GC] -Geschrottete Gang-Autos: - -[FEST_H1] -Im Dschungel der Diablos - -[FEST_H2] -Mafia-Massaker - -[FEST_H3] -Der Casino-Coup - -[FEST_H4] -Rock'n'Roll mit Rumpo - -[USJI1] -TEXT NO LONGER REQUIRED - -[USJI2] -TEXT NO LONGER REQUIRED - -[USJI3] -TEXT NO LONGER REQUIRED - -[USJ] -MONSTER-STUNT-BONUS! - -[SPRAY] -Fahre deinen Wagen in die Lackiererei, um deinen ~h~Fahndungslevel~w~ loszuwerden und das Auto zu ~h~reparieren~w~ und ~h~umzuspritzen~w~. Kosten - ~h~$1000. - -[HM1_1] -~g~Fertige 20 Purple Nines in 2 Min. 30 Sek. ab. - -[KM1_8A] -Drücke die~h~ ~k~~PED_FIREWEAPON~-Taste~w~ zum ~h~Zünden der Bombe~w~. Aber geh vorher in Deckung! - -[KM1_8D] -Drücke die~h~ ~k~~PED_FIREWEAPON~-Taste~w~ zum ~h~Zünden der Bombe~w~. Aber geh vorher in Deckung! - -[KM1_12] -~g~Bring ihm zum Dojo, aber hãng vorher die Cops ab! - -[RATNG1] -Taschendieb - -[RATNG2] -Laufbursche - -[RATNG3] -Gauner - -[RATNG4] -Soldat - -[RATNG5] -Profi - -[RATNG6] -Fahrer - -[RATNG7] -Gangster - -[RATNG8] -Obergangster - -[RATNG9] -Partner - -[RATNG10] -Troubleshooter - -[RATNG11] -Vollstrecker - -[RATNG12] -Capo - -[RATNG13] -Rechte Hand - -[RATNG14] -Vize - -[RATNG15] -Boss - -[1010] -~r~Dein Fahrzeug liegt auf dem Kopf - -[1011] -~r~Dein Fahrzeug liegt auf dem Kopf - -[1012] -~r~Dein Fahrzeug liegt auf dem Kopf - -[1013] -~r~Dein Fahrzeug liegt auf dem Kopf - -[1014] -~r~Dein Fahrzeug liegt auf dem Kopf - -[JM4_10] -Okay, Junge. Fahr mich zuerst in die Wãscherei in Chinatown. Ich hab da was zu erledigen. - -[JM4_11] -Die Waschweiber da haben ihr Schutzgeld nicht bezahlt. - -[JM4_12] -Und pass auf den Wagen auf. Joey hat ihn gerade repariert. - -[JM4_13] -Also, keine Dummheiten, okay? - -[KM4_11] -~g~Bring das Geld ins Casino! - -[FEF_BR2] -Orientiere dich, indem du alle bisherigen Einsatzbesprechungen durchsiehst. - -[TRAIN_1] -Kurowski Station - -[TRAIN_2] -Rothwell Station - -[TRAIN_3] -Baillie Station - -[SUBWAY1] -Portland Station - -[SUBWAY2] -Rockford Station - -[SUBWAY3] -Staunton South Station - -[SUBWAY4] -Shoreside Terminal - -[MEA4_2] -~r~Marty Chonks ist tot! - -[SPRAY1] -Fahre deinen Wagen in die Lackiererei, um deinen ~h~Fahndungslevel~w~ loszuwerden und das Auto zu ~h~reparieren~w~ und ~h~umzuspritzen~w~. Kosten - ~h~$1000~w~. Diesmal kostet es nichts. - -[JM4_A] -Ja, ich weiß, Toni, ich hab sie gut erzogen. Sie schnurrt, falls du verstehst, was ich meine. - -[JM4_5] -Komm spãter wieder, dann zeigen wir den Kerlen, was Sache ist. - -[AMMU_A] -Luigi sagt, du brauchst 'ne Knarre... - -[AMMU_B] -Joey sagt, ich soll dich 'ausrüsten'... - -[AMMU_C] -Geh hinten um den Laden herum. Ich hab eine 9mm im Hof deponiert. - -[AMMU_D] -Ich hab alles, was man so zur Selbstverteidigung braucht. - -[AMMU_E] -Willst du auch 'nen Waffenschein? - -[AMMU_F] -Auf den Ausweis verzichte ich. Du siehst vertrauenswürdig aus. - -[DETON] -DETONATION: - -[DRIVE_A] -Halt eine Uzi im Anschlag, wenn du in ein Fahrzeug steigst. Schau dann nach links oder rechts und drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~, um zu feuern. - -[DRIVE_B] -Halt eine Uzi im Anschlag, wenn du in ein Fahrzeug steigst. Schau dann nach links oder rechts und drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~, um zu feuern. - -[RECORD] -~g~NEUER REKORD!! - -[NRECORD] -~r~KEIN NEUER REKORD! - -[RCHELP] -Drücke die ~k~~PED_FIREWEAPON~-Taste oder fahre das ferngesteuerte Auto in die Rãder eines Fahrzeugs, um es zu sprengen. - -[RCHELPA] -Drücke die ~k~~PED_FIREWEAPON~-Taste oder fahre das ferngesteuerte Auto in die Rãder eines Fahrzeugs, um es zu sprengen. - -[RC_1] -Du hast 2 Minuten, um so viele Diablo-Autos wie möglich zu sprengen! - -[RC_2] -Du hast 2 Minuten, um so viele Mafia-Autos wie möglich zu sprengen! - -[RC_3] -Du hast 2 Minuten, um so viele Yakuza-Autos wie möglich zu sprengen! - -[RC_4] -Du hast 2 Minuten, um so viele Yardie-Autos wie möglich zu sprengen! - -[RC_5] -Du hast 2 Minuten, um so viele Hood-Autos wie möglich zu sprengen! - -[RC_6] -Du hast 2 Minuten, um so viele Kartell-Autos wie möglich zu sprengen! - -[RAMPAGE] -AMOKLAUF!! - -[RAMP_P] -AMOKLAUF BEENDET! - -[RAMP_F] -AMOKLAUF FEHLGESCHLAGEN - -[PAGE_00] -. - -[PAGE_01] -Dein Job: ~1~ Diablos in 120 Sekunden! - -[PAGE_02] -Zerstöre ~1~ Fahrzeuge in 120 Sekunden! - -[PAGE_03] -Dein Job: ~1~ Mafiosi in 120 Sekunden! - -[PAGE_04] -Dein Job: ~1~ Triaden in 120 Sekunden! - -[PAGE_05] -Dein Job: ~1~ Triaden in 120 Sekunden! - -[PAGE_06] -Zerstöre ~1~ Fahrzeuge in 120 Sekunden! - -[PAGE_07] -Dein Job: ~1~ Yardies in 120 Sekunden! - -[PAGE_08] -Dein Job: ~1~Yakuza in 120 Sekunden! - -[PAGE_09] -Zerstöre ~1~ Fahrzeuge in 120 Sekunden! - -[PAGE_10] -Zerstöre ~1~ Fahrzeuge in 120 Sekunden! - -[PAGE_11] -Dein Job: ~1~ Yardies in 120 Sekunden! - -[PAGE_12] -Dein Job: ~1~Yakuza in 120 Sekunden! - -[PAGE_13] -Dein Job: ~1~ Yardies in 120 Sekunden! - -[PAGE_14] -Dein Job: ~1~ Kolumbianer in 120 Sekunden! - -[PAGE_15] -Dein Job: ~1~ Hoods in 120 Sekunden! - -[PAGE_16] -Zerstöre ~1~ Fahrzeuge in 120 Sekunden! - -[PAGE_17] -Nimm dir mit einem Auto ~1~ Kolumbianer in 120 Sekunden vor! - -[PAGE_18] -Zerstöre ~1~ Fahrzeuge mit einem Drive-by in 120 Sekunden! - -[PAGE_19] -Dein Job: ~1~ Kolumbianer in 120 Sekunden! - -[PAGE_20] -Dein Job: ~1~ Hoods in 120 Sekunden! - -[JM1_A] -Mir ist langweilig. Wann lãuft hier endlich mal was ab? - -[JM1_B] -Gleich, Schãtzchen. Muss nur schnell was erledigen. - -[JM1_C] -Ich hab 'nen kleinen Job für dich. - -[JM1_D] -Die Forelli Brüder zahlen ihre Schulden nicht. - -[JM1_E] -Ich muss ihnen ein bisschen Respekt einblãuen. - -[JM1_F] -Lips Forelli stopft sich gerade in Marcos Bistro seinen fetten Bauch voll. - -[JM1_G] -Klau ihm sein Auto und bring es in 8-Balls Bombenwerkstatt in Harwood. - -[JM1_H] -Du kennst doch 8-Ball, oder? - -[JM1_I] -Sobald er 'ne Bombe eingebaut hat, parkst du die Karre an ihrem alten Platz. - -[JM1_J] -Dann lehn dich zurück und sieh dir die Show an. - -[JM1_K] -Aber Beeilung. Der Typ isst nicht ewig. - -[CAT2_A1] -Komm schon, du dummes Luder! - -[CAT2_A] -Bist du eigentlich gekommen, um Maria zu retten, oder weil du heiß auf mich bist? - -[CAT2_B] -Falls du's noch nicht weißt: - -[CAT2_B2] -Die Dates mit dir waren Arbeit - dich fertig zu machen, wird ein Vergnügen. - -[CAT2_C] -Du bist ein armes Würstchen, Amigo. - -[CAT2_D] -Wirf die Kohle rüber! - -[CAT2_E] -Du bist an sich ein fãhiger Bursche. - -[CAT2_E2] -Aber du kapierst nicht, dass man mir nicht trauen kann. - -[CAT2_E3] -Macht den Idioten fertig. - -[CAT2_J] -Bring das Ding in die Luft!! - -[HM5_1] -Yo, Ice hat dich angekündigt. Es gibt hier Regeln. Nur Schlãger. Keine Knarren, keine Autos. - -[HM5_5] -Hier geht's um Respekt und Achtung, klar? - -[HELP14] -Um Waffen aufzunehmen, gehe darüber hinweg. Dies funktioniert nicht, wenn du in einem Fahrzeug sitzt. - -[CRUSH] -Parke in der markierten Zone und steig aus. Das Fahrzeug wird dann geschrottet. - -[DIAB2_B] -Eine Bande von Taugenichtsen will mir ans Leder, falls ich sie nicht an meinen Geschãften beteilige. - -[DIAB2_C] -Aber da sind sie an den Falschen geraten, Amigo. - -[DIAB2_D] -Die haben eine Schwãche für Eiscreme. - -[DIAB2_E] -Hol die Bombe ab, die ich in Harwood versteckt habe, - -[DIAB2_F] -schnapp dir einen normalen Eis-Wagen, der rumfãhrt - -[DIAB2_G] -und locke diese Idioten mit dem Eis-Jingle in ihr Verderben. - -[DIAB2_H] -Sie verstecken sich in einem Lagerhaus auf den Atlantic Quays. - -[DIAB3_A] -Irgendwelche frechen Triaden haben gestern Nacht meinen Traumwagen geklaut, - -[DIAB3_B] -geschrottet und ausbrennen lassen. - -[DIAB3_C] -Im Kofferraum waren einige sehr wertvolle Erinnerungsstücke, - -[DIAB3_D] -unersetzliche Sammlerstücke, mein Freund. - -[DIAB3_E] -Ich hab eine ziemlich heiße Waffe am Rand von Chinatown versteckt. - -[DIAB3_F] -Hol sie dir und lehre die Triaden, El Burros Zorn zu fürchten. - -[DIAB3_1] -NIMM DIR 25 TRIADEN VOR - -[DIAB4_A] -Ein mieser Dieb hat einen Transporter mit der gesamten neuen Ausgabe meines Magazins gestohlen! - -[DIAB4_B] -Aber dieser SPANK-Junkie hat die Hecktüren offen gelassen - -[DIAB4_C] -und jetzt verteilt sich mein wunderschönes, - -[DIAB4_D] -geschmackvoll fotografiertes Magazin gleichmãßig über ganz Liberty! - -[DIAB4_E] -Nimm den Transporter, folge der Spur von 'Donkey Does Dallas' Nr. 1, 2 und 3. - -[DIAB4_F] -Und sammle das Zeug wieder ein. - -[DIAB4_G] -Wenn du bei diesem diebischen Junkie angekommen bist, nimm ihn dir vor! - -[DIAB4_H] -Und dann lieferst du meine Magazine an das XXX Mags im Rotlichtviertel. - -[DIAB4_1] -~g~Fahr den Transporter zur Rückseite des XXX Mags. - -[HM1_E] -Ich möchte, dass du diesen Vollidioten zeigst, wie ein echter Driveby aussieht. - -[HM1_H] -Schaff mir diese Nines vom Hals!! - -[HM2_A] -Die Nines bringen mich in die Klemme. - -[HM2_B] -Die Kerle haben gepanzerte Autos, und jetzt verhökern sie SPANK - -[HM2_C] -an meine Brüder, als wãre das gar nichts. - -[HM2_D] -Auf dem Weg steht ein Wagen geparkt. - -[HM2_E] -Da ist was drin, was diesen Feiglingen Beine machen wird. - -[HM3_A] -Irgend so ein Mistkerl hat 'ne Bombe in meine Karre eingebaut. - -[HM3_B] -Wenn ich die Karre verliere, stehe ich als Trottel da. - -[HM3_C] -Hol meinen Wagen ab und bring ihn in die Werkstatt in St. Mark's. - -[HM3_D] -Die sollen die Bombe da entschãrfen. - -[HM3_E] -Die Uhr tickt und die Drãhte sind locker. - -[HM3_F] -Ein Schlagloch zuviel, und das Ding geht hoch. - -[HM3_G] -Also, Beeilung! - -[HM4_A] -Yo, ein Flugzeug der Staatsbank ist gerade beim Francis Int. Airport abgestürzt. - -[HM4_B] -Auf dem ganzen Rollfeld liegt Platin rum - -[HM4_C] -Schnapp dir ein Auto und sack so viel wie möglich davon ein. - -[HM4_F] -Du kannst das Zeug in einer meiner Garagen abladen. - -[HM4_G] -Platin ist verdammt schwer. Dein Auto wird etwas langsamer laufen. - -[HM4_H] -Also, lade regelmãßig etwas davon in einer Garage ab. - -[HM5_A] -Die Nines sind nur noch ein versprengter Haufen... - -[HM5_B] -aber sie machen immer noch Stress. - -[HM5_C] -Jetzt wollen sie's endgültig wissen. - -[HM5_D] -Eine Gang von denen gegen zwei von uns. Oder vielmehr... - -[HM5_E] -zwei von euch. - -[HM5_F] -Ich wãre ja dabei, aber... - -[HM5_G] -ich hab noch drei Monate Bewãhrung, - -[HM5_H] -verstehst du, was ich meine? - -[HM5_I] -Triff dich mit meinem kleinen Bruder. - -[HM5_J] -Er zeigt dir, wo der Fight stattfindet, okay? - -[MEA1_B] -Mein Name ist Chonks, Marty Chonks. - -[MEA1_C] -Mir gehört die Bitchin' Dog Food Fleischfabrik um die Ecke. - -[MEA1_D] -Ich hab Geldsorgen, aber wer hat die nicht, was? - -[MEA1_E] -Ich treff mich spãter mit meinem Banker. - -[MEA1_F] -Das ist ein linker Sãger, der mir dauernd die Kreditraten raufsetzt, um sich 'ne Scheibe abzuschneiden. - -[MEA1_G] -Nimm mein Auto, hol ihn ab und bring ihn hierher. - -[MEA1_H] -Ich habe eine kleine Überraschung für diesen Blutsauger!! - -[MEA2_A] -Ich hab Diebe angeheuert, um in meine Wohnung einzubrechen. - -[MEA2_C] -Jetzt drohen diese Dreckskerle, sie erzãhlen alles der Versicherung, - -[MEA2_D] -wenn ich sie nicht beteilige. - -[MEA2_E] -Ist das zu fassen? - -[MEA2_F] -Ich hab einen Wagen innerhalb der Fabrik abgestellt. - -[MEA2_G] -Hol damit die Kerle in ihrem Revier im Rotlichtbezirk ab. - -[MEA2_H] -Bring sie in die Fabrik, damit ich ihnen meinen Standpunkt klarmachen kann. - -[MEA3_A] -Wenn nicht bald ein Haufen Geld ins Haus kommt, gehe ich pleite. - -[MEA3_B] -Meine Frau hat eine Versicherung, aber mir hat sie immer nur das Geld aus der Tasche gezogen. - -[MEA3_C] -Ich hab ein Auto am gewohnten Ort abgestellt. - -[MEA3_D] -Hol damit meine Frau vom Classic Nails Studio ab und bring sie in die Fabrik. - -[MEA4_A] -Mist, ich steck in der Klemme! - -[MEA4_B] -Meine Frau hatte was mit einem Typen, dem ich Geld schulde. - -[MEA4_C] -Der ist jetzt ziemlich sauer und will sich rãchen! - -[MEA4_E] -Der denkt, er kann mich erpressen... - -[MEA4_F] -aber ich glaube eher, - -[MEA4_G] -dass auch dieser gute Mann als Hundefutter enden wird. - -[WELCOME] -WILLKOMMEN IN - -[HM1_2] -~g~Besorg dir ein Fahrzeug. Beachte: Hier zãhlt nur die Uzi! - -[HELP8_B] -Drücke die ~h~~k~~PED_SNIPER_ZOOM_IN~-Taste~w~ zum ~h~Heranzoomen~w~ mit dem Gewehr, und die ~h~~k~~PED_SNIPER_ZOOM_OUT~-Taste~w~ zum ~h~Wegzoomen~w~. - -[LRQC_1] -Asuka und ich haben was zu besprechen. - -[LRQC_2] -Fahr doch ein bisschen durch die Gegend. - -[LRQC_3] -Du wirst einen Unterschlupf brauchen. - -[LRQC_4] -Am Rand von Belleville ist ein Lagerhaus. Das könnte was für dich sein. - -[LRQC_5] -Komm wieder hierher, wenn du fertig bist. - -[LRQC_6] -Dann können wir uns ein bisschen unterhalten. - -[JM6_5] -~g~Du brauchst einen Fluchtwagen, du Idiot! - -[JM2_F] -Wenn du 'ne Knarre brauchst, geh zum Hintereingang vom AmmuNation gegenüber der U-Bahn. - -[LOVE4_7] -~g~Es gibt einen Bauhof auf Staunton Island. Vielleicht haben sie das Pãckchen dorthin gebracht. - -[LOVE4_8] -~g~Du brauchst ein Auto, um die Garage zu öffnen. - -[TSCORE] -EINKÜNFTE: $~1~ - -[AM1_9] -~r~Salvatore hat sich in Luigis Club abgesetzt! - -[AM1_6] -~g~Wenn du vor Luigis Club rumhãngst, bemerken dich die Mafiosi! - -[TM2_3] -~g~Das ist eine Falle! Nimm sie dir alle vor! - -[FM4_1] -Hier Maria. Das mit dem Wagen ist eine Falle! Komm zu dem Steg südlich der Callahan Bridge. - -[JM1_7] -~g~Mach die Wagentür zu, sonst merkt er was! - -[KM5_1] -~g~DEALER ERLEDIGT!! - -[KM5_6] -~g~Du musst mind. 8 Yardie Dealer außer Gefecht setzen. - -[KM5_7] -~g~Beeilung! Sobald sie ihr SPANK verhökert haben, verschwinden sie wieder. - -[RM3_8] -~r~Dieser Wagen dient nur zur Ablenkung!! - -[LM3_8] -Hi, ich bin Joey. - -[LM3_9] -Luigi sagt, du bist verlãsslich. Also komm spãter wieder. - -[KM3_5] -~g~Drück die Hupe, damit der Deal in Gang kommt. - -[LOVE7] -LOVES VERSCHWINDEN - -[LOVE2_5] -~g~Auftrag erledigt. Verschwinde aus Newport und dann weg mit dem Wagen! - -[AS2_11] -~g~~1~ VON 9! - -[GARAGE1] -~g~Steig aus und geh nach draußen. - -[KM3_11] -~g~Das Kartell wurde angegriffen. Die Aktentasche wurde nicht sichergestellt. - -[KM3_12] -~g~Nimm dir sãmtliche Kolumbianer vor, zerstöre die Fahrzeuge und stell die Aktentasche sicher. - -[KM3_13] -~g~Bring die Aktentasche ins Casino. - -[RM5_6] -~g~Er ist abgehauen! Zerstöre seine Panzerung mit einem Auto oder einer Explosion!! - -[PBOAT_1] -Drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~, um die Bordkanonen abzufeuern. - -[PBOAT_2] -Drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~, um die Bordkanonen abzufeuern. - -[DIAB1_B] -Hier El Burro, von den Diablos. - -[DIAB1_D] -Du bist neu in Liberty, aber du hast bereits eine guten Ruf auf der Straße. - -[DIAB1_E] -Bei der alten Schulhalle nahe der Callahan Bridge findet ein Rennen statt. - -[DIAB1_F] -Besorg dir 'nen fahrbaren Untersatz. Wer als erster alle Checkpoints abfãhrt, ist Sieger. - -[HM2_1] -Zerstöre die gepanzerten Fahrzeuge mit den Buggies. Zur Zündung drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~. - -[HM2_1A] -Zerstöre die gepanzerten Fahrzeuge mit den Buggies. Zur Zündung drücke die ~h~~k~~PED_FIREWEAPON~-Taste~w~. - -[HM2_2] -~r~Du hast nicht alle gepanzerten Fahrzeuge zerstört! - -[HM2_6] -~g~Gepanzertes Fahrzeug zerstört! - -[RM3_A] -Ich kenne einen wichtigen Mann in der Stadt, mit - -[RM3_H] -sagen wir mal, einem Sinn für's Exotische und dem nötigen Kleingeld dafür. - -[RM3_B] -Er steht unter Anklage und der Staatsanwalt hat einige ziemlich peinliche Fotos von ihm - -[RM3_C] -auf einer Friedhofsparty oder so. - -[LOVE6_A] -Kleine Lektion in Sachen Business, mein Freund: - -[LOVE6_E] -Hast du eine hochinteressante Ware, wird Gott und die Welt sie dir abjagen wollen... - -[LOVE6_C] -Spezialeinheiten haben die Gegend um meinen Geschãftsfreund und das Pãckchen abgeriegelt. - -[LOVE6_D] -Mach, dass du hinkommst, nimm den Transporter und lenk sie ab. - -[LOVE6_F] -Beschãftige die Typen, damit er sich absetzen kann. - -[AM3_C] -Vermutlich ist er in der Bucht draußen, wãhrend du dies liest. Nimm mein Boot und mach seiner Karriere ein Ende! - -[FESZ_UC] -ABBRECHEN - -[FEDS_SM] -L1, R1-MENÜ WECHSELN - -[FEDS_AS] -;=-AUSWAHL ÃNDERN - -[FEDSAS2] -<>-AUSWAHL ÃNDERN - -[FEDS_SS] -L1, R1-AUSWAHL ÃNDERN - -[FEDSSC1] -;-SCHNELLER BILDLAUF - -[FEDSSC2] -=-BILDLAUF STOP - -[MEA2_3] -~g~Bring das Auto zurück zur Fabrik. - -[RM1_3] -~r~McAffrey ist entkommen! - -[RM1_4] -~g~Du hast alle Granaten verbraucht! Hol neue im AmmuNation! - -[RM1_5] -~g~Zurück! Zünde die sichere Wohnung an! - -[RM6_4] -~g~Du musst zu der Garage und Rays Auto mit den Waffen holen. - -[RM6_5] -~g~Die Brücke wird von der CIA überwacht. Such dir eine andere Route. - -[HM2_F] -Und zerstöre alle ihre gepanzerten Wagen. - -[HM_4] -'GOLDRAUSCH' - -[MEA2_B5] -TEXT NO LONGER NEEDED - -[MEA1_B5] -TEXT NO LONGER NEEDED - -[MEA3_B5] -TEXT NO LONGER NEEDED - -[MEA4_B7] -aber wenn du in mein Büro kommst, könnte ich... - -[MEA3_B4] -Marty will mich sehen? Das muss aber schnell gehen, ich hab nãmlich einen Friseurtermin. - -[KM3_7] -Das ist eine Falle der Yakuza, Mann! - -[FES_LOF] -Laden fehlgeschlagen. - -[P1INSA] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1: ~1~K freier Speicherplatz. Erforderlich: ~1~K. - -[P1INSN] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1: Kein freier Speicherplatz. Bitte einige Dateien löschen. - -[FES_SLO] -DATEI - -[FES_ISC] -IST BESCHÃDIGT - -[FESZ_TI] -Z1 SPEICHERN - -[FESZ_SA] -Spiel speichern - -[P1NOIN] -Keine Memory Card (PS2) in MEMORY CARD-Steckplatz 1 - -[P1INSE] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 vorhanden - -[MC_LDFL] -Laden fehlgeschlagen! - -[MC_NWRE] -Spiel wird neu gestartet - -[LOVE6_3] -~g~Du hast ~1~ Sekunden, um zu dem Securicar zurückzukehren, bevor die Mission fehlschlãgt. - -[LOVE6_4] -~r~Du hast den falschen Securicar abgehãngt! - -[HELP1] -Halte in der Mitte der blauen Markierung. - -[HELP12] -Geh ins Zentrum der blauen Markierung, um eine Mission zu starten. - -[HJSTAT] -Distanz: ~1~.~1~m Höhe: ~1~.~1~m Saltos: ~1~ Drehungen: ~1~_ - -[HJSTATW] -Distanz: ~1~.~1~m Höhe: ~1~.~1~m Saltos: ~1~ Drehungen: ~1~_ Und was für eine Landung! - -[DIAB1_5] -ZEIT: - -[LOVE3_4] -~r~Du hast das Flugzeug zerstört! - -[F_FAIL1] -Feuerwehr -Mission beendet - -[F_CANC] -~r~Feuerwehr -Mission abgebrochen! - -[F_EXTIN] -FEUER: - -[A_COMP1] -Krankenwagen Missionen abgeschlossen! - -[A_CANC] -~r~Krankenwagen Mission abgebrochen! - -[A_COMP3] -Krankenwagen Missionen abgeschlossen! Du wirst beim Laufen nie ermüden! - -[ATUTOR] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Krankenwagen Missionen an- oder abzuschalten. - -[ATUTOR3] -Drücke die ~h~~k~~TOGGLE_SUBMISSIONS~-Taste~w~, um Krankenwagen Missionen an- oder abzuschalten. - -[ALEVEL] -Krankenwagen Mission Level ~1~ - -[A_FAIL1] -Krankenwagen Mission beendet - -[FEST_HA] -Höchster Krankenwagen Missions Level - -[A_SAVES] -GERETTETE MENSCHEN: ~1~ - -[C_KILLS] -KRIMINELLE: ~1~ - -[HM1_B] -Ich hab 'n Problem. Die wollen mich verscheißern. - -[AM2_A] -Sehr erfreulich, dass Salvatore nicht mehr unter uns weilt. - -[AM2_A2] -Du bist ein effizienter Mann - das gefãllt mir. - -[AM2_B] -Das ist mein Bruder Kenji. - -[AM2_C] -Asuka hat einen kleinen Job für dich, aber wenn du fertig bist, komm in mein Casino, dann reden wir. - -[AM2_D] -Typisch Kenji, immer will er mit meinen Spielsachen spielen. - -[AM2_E] -Mein Spitzel bei der Polizei hat mir gesteckt, dass die Mafia unsere Aktivitãten im Auge behãlt. - -[AM2_E2] -Sie wollen dich aufstöbern. - -[AM2_F] -Wir müssen unsere Operationen ruhen lassen, bis wir ihnen das Handwerk gelegt haben. - -[AM2_G] -Zieh die Kerle aus dem Verkehr und mach dieser Vendetta ein für alle mal ein Ende. - -[F_START] -~g~Brennendes Fahrzeug in der Gegend von ~a~ gemeldet. Lösche den Brand. - -[AM4_1A] -Komm zu dem Fernsprecher im West Belleville Park. - -[AM4_1B] -Komm zu dem Fernsprecher auf dem Liberty Campus. - -[AM4_1C] -Komm zu dem Fernsprecher im South Belleville Park. - -[AM4_1D] -Wir treffen uns im Toilettenhãuschen im Park. - -[HJSTATF] -Distanz: ~1~Fuß Höhe: ~1~Fuß Saltos: ~1~ Drehungen: ~1~_ - -[HJSTAWF] -Distanz: ~1~Fuß Höhe: ~1~Fuß Saltos: ~1~ Drehungen: ~1~_ Und was für eine Landung! - -[HM1_F] -Aber pass auf. Es werden Jacks da sein, und die werden denken, du willst auch ihnen ans Leder! - -[HM1_D] -Sie nennen sich 'Nines' und ihre Farbe ist 'Lila'. Und jeder Tag im Zeichen dieser Farbe... - -[HM1_G] -ist ein Tag, an dem die Jacks schlecht aussehen. - -[MEA2_B] -Und stiehl ein paar Sachen, damit ich die Versicherung kassieren kann. - -[TM3_H] -~w~Das hast du gut gemacht vorhin, wirklich gut, mein Junge. - -[TM3_I] -~w~Komm, wir stellen dich dem Don vor. - -[TM3_J] -~w~Heeyyy! Luigi! - -[TM3_K] -~w~Meine Girls fragen andauernd nach dir, Salvatore. Du warst so lange nicht mehr bei uns. - -[TM3_L] -~w~Sag ihnen, wenn diese lãstige Geschichte hier vorbei ist, - -[TM3_M] -~w~gehen wir alle in den Club und feiern, okay? - -[TM3_N] -~w~Ah, mein Junge! - -[TM3_N2] -~w~ Hallo, Paps. - -[TM3_O] -~w~Hast du endlich eine Frau gefunden? - -[TM3_P] -~w~Hey, Deine Mutter - Gott hab sie selig - würde sich im Grab umdrehen, - -[TM3_Q] -~w~wenn du keine abkriegen würdest. - -[TM3_R] -~w~Ich weiß, Paps, ich arbeite dran. - -[TM3_S] -~w~TONI! Wie geht's deiner Mamma? - -[TM3_T] -~w~Sie ist eine großartige Frau! Stark. Florentinerin eben. - -[TM3_U] -~w~Es geht ihr gut. Sehr gut. - -[TM3_V] -~w~Hervorragend. Okay, geht schon mal vor, ich hab was mit unserem neuen Freund hier zu bereden. - -[TM3_W] -~w~Ich sehe goldene Zeiten auf dich zukommen, mein Junge... - -[RM1_A] -Dieser McAffrey! Der hat mehr Bestechungsgeld kassiert als jeder andere. - -[RM1_B] -Jetzt denkt er, er wird ehrenhaft entlassen, wenn er als Kronzeuge aussagt. - -[RM1_C] -Er ist einfach ein Verrãter. - -[RM4_B] -Wir müssen ihn zum Schweigen bringen - für immer. - -[RM4_E] -Er soll bei den Fischen schlafen, statt sie zu essen. - -[LOVE3_B] -Beim Landeanflug auf den Flughafen wird ein kleines Flugzeug die Bucht überfliegen. - -[LOVE4_D] -Leider hat sich die Hafenbehörde die Maschine geschnappt und wollte sie auseinandernehmen, - -[LOVE4_H] -bis ich das mit erheblichen Unkosten verhindert habe. - -[LOVE4_E] -Fahr über die Brücke nach Shoreside Vale und dann zum Francis Int. Airport. - -[GTAB_A] -Hey, schaffen wir das hier weg. Weiß der Teufel, was das ist. - -[GTAB_B] -Aber da er's unbedingt haben will, muss es wohl was wert sein. - -[GTAB_C] -Wer zum Teufel...? - -[GTAB_D] -DU! - -[GTAB_E] -Hey, ganz ruhig, Amigo! De nada! De nada! - -[GTAB_F] -Ich dachte, ich hãtte dich erledigt! - -[GTAB_G] -Nicht schießen, Amigo! Kein Problem. Wir sind alle Freunde. Hier, nimm. - -[GTAB_H] -Nicht so memmenhaft! - -[GTAB_I] -Wir haben keine Wahl, Baby! - -[GTAB_J] -Wir haben immer eine Wahl, du dãmlicher Idiot! - -[GTAB_K] -Sorry wegen dem abgedrehten Flittchen, Mann. Die sind doch alle gleich. Por favor? - -[GTAB_L] -Das Luder ist also entwischt. - -[GTAB_M] -Aber du hast mir einen Gefallen getan. - -[GTAB_N] -Du bist nicht der einzige, der eine Rechnung mit dem Kartell offen hat. - -[GTAB_O] -Dieser Wurm hat meinen Bruder auf dem Gewissen! - -[GTAB_P] -I hab nie einen Yakuza umgebracht! - -[GTAB_Q] -Lügner! Wir alle haben den Kartell-Attentãter gesehen. - -[GTAB_R] -Wir werden euch kolumbianische Hunde alle erledigen! - -[GTAB_S] -Ich befasse mich mit unserem Freund. Mal sehen, was ich aus ihm rauskriege. - -[GTAB_T] -Komm spãter wieder. Ich werde deine Dienste brauchen. - -[GTAB_U] -Bitte, Amigo, lass mich nicht hier bei ihr! Die ist 'n Psycho! Amigo? Hey, AMIIIGO!!!...Aiiieeeeaaargghh! - -[LOVE5_A] -Du bist eine sichere Bank. So etwas ist selten in diesen schlechten Zeiten. - -[KM3_1] -~g~Das Kartell erwartet eine Yardie Gang. Klau einen Yardie-Wagen! Fahr nach Norden. In Newport fndest du einen. - -[LOVE1_1] -~g~Mit einem Wagen der Kolumbianer kommst du in ihren Unterschlupf rein. Im Norden, in Fort Staunton, findest du einen. - -[FM1_Q1] -~w~Na, kleine Erfrischung gefãllig? Ein bisschen SPANK? - -[FM1_R] -~w~Hi, Chico. Nein, nur das übliche. - -[FM1_T] -~w~Danke, Chico. Bis bald. - -[FM1_W] -~w~Okay, Fiffi, du passt hier auf den Wagen auf, ich geh ein bisschen abtanzen. - -[FM1_X] -~w~Okay, Fiffi, lass uns 'nen Abgang machen. Huuh! - -[FM1_Q] -~w~ Hey, Maria! Meine Traumfrau! - -[FM1_S1] -~w~Vielleicht solltest du mal die Party in der Lagerhalle am Ostende von Atlantic Quays auschecken. - -[FM1_U] -~w~ Gracias. Und viel Spaß. Ist gutes Zeug. - -[FM1_V] -~w~Na los, Fiffi, sehen wir uns mal die Party an! - -[FM1_SS] -~r~SCANNER: ~g~4-5 an alle Einheiten: Assistieren Sie bei der Rauschgift-Razzia in Atlantic Quays... - -[LOVE6_B] -Auch wenn kaum einer weiß, wie viel sie wirklich wert ist. - -[TM3_A1] -~r~Joey ist hinüber! - -[TM3_A2] -~r~Joey und Luigi sind hinüber! - -[TM3_A3] -~r~Joey, Luigi und Toni sind hinüber! - -[FM4_2] -Hör zu, Salvatore denkt, ich betrüge ihn mit dir, - -[FM4_3] -da hat er dem Kartell deinen Kopf angeboten, um einen Deal mit denen zu machen. - -[FM4_4] -Das kann ich nicht zulassen. Das ist alles meine Schuld. - -[FM4_4B] -Ich hab ihm erzãhlt, dass wir uns gut verstehen. - -[FM4_5] -Frag mich nicht wieso. Ich weiß es nicht. - -[FM4_6] -Auf Mafia-Gebiet bist du Freiwild, und ich muss auch abhauen. - -[FM4_6B] -Ich hab genug von all der Gewalt, all dem Blut. - -[FM4_7] -Das ist eine Freundin von mir, eine alte Freundin. Sie heißt Asuka. Ihr können wir trauen. - -[FM4_8] -Kommt. Genug geredet. - -[FM4_9] -Wir verschwinden lieber, bevor uns noch mehr hysterische Italiener unbedingt wiedersehen möchten. - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUCER - -[CRED003] -LESLIE BENZIES - -[CRED004] -ART DIRECTOR - -[CRED005] -AARON GARBUT - -[CRED006] -TECHNICAL DIRECTION - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -DESIGN - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -WRITTEN BY - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -CHARACTERS - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMATION & DIRECTION - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -AUTO DESIGN - -[CRED024] -PAUL KUROWSKI - -[CRED025] -ARTISTS - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODERS - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -SCORE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -SOUND DESIGN & MASTERING - -[CRED042] -ALLAN WALKER - -[CRED043] -AUDIO PROGRAMMING - -[CRED044] -RAYMOND USHER - -[CRED045] -TEST MANAGER - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -LEAD TESTERS - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRD050A] -TESTERS - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -TECHNICAL SUPPORT - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -EXECUTIVE PRODUCER - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUCER - -[CRED064] -DAN HOUSER - -[CRED065] -DIRECTOR OF DEVELOPMENT - -[CRED066] -JAMIE KING - -[CRED067] -TECHNICAL PRODUCER - -[CRED068] -GARY J. FOREMAN - -[CRED069] -ASSOCIATE PRODUCER - -[CRED070] -JEREMY POPE - -[CRED071] -MUSIC SUPERVISOR - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VP OF MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -TECHNICAL COORDINATOR - -[CRED088] -BRANDON ROSE - -[CRED089] -QA MANAGER - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -GAME ANALYST - -[CRED094] -RICHARD HUIE - -[CRED095] -TEST TEAM - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -LIBERTY TREE EDITORIAL - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -CUT-SCENES - -[CRED108] -SCRIPT BY DAN HOUSER AND JAMES WORRALL - -[CRED109] -AUDIO DIRECTED BY DAN HOUSER - -[CRED110] -AUDIO PRODUCED BY RENAUD SEBBANE - -[CRED111] -CAST - -[CRED112] -FRANK VINCENT AS SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO AS LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN AS TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT AS JOEY LEONE - -[CRED116] -DEBBI MAZAR AS MARIA - -[CRED117] -KYLE MACLACHLAN AS DONALD LOVE - -[CRED118] -ROBERT LOGGIA AS RAY MACHOWSKI - -[CRED119] -GURU AS 8-BALL - -[CRED120] -SONDRA JAMES AS MOMMA - -[CRED121] -LIANA PAI AS ASUKA - -[CRED122] -LES MAU AS KENJI - -[CRED123] -CYNTHIA FARRELL AS CATALINA - -[CRED124] -AL ESPINOSA AS MIGUEL - -[CRED125] -CHRIS PHILLIPS AS EL BURRO - -[CRED126] -HUNTER PLATIN AS CHICO - -[CRED127] -WALTER MUDU AS D-ICE - -[CRED128] -CURTIS MCCLARIN AS CURTLY - -[CRED129] -BILL FIORE AS DARKEL - -[CRED130] -CHRIS PHILLIPS AS MARTY CHONKS - -[CRED131] -HUNTER PLATIN AS CURLY BOB - -[CRED132] -WALTER MUDU AS KING COURTNEY - -[CRED133] -HUNTER PLATIN AS ONE-ARMED PHIL - -[CRED134] -KIM GURNEY AS MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATED BY - -[CRD136A] -ALEX HORTON - -[CRED137] -DIRECTED BY - -[CRD137A] -NAVID KHONSARI - -[CRED138] -PRODUCED BY - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRED139] -RECORDED AT MODERN UPRISING STUDIOS, BROOKLYN - -[CRED140] -ACTORS - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS. - -[CRED141] -PEDESTRIAN DIALOGUE - -[CRED142] -WRITTEN BY DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRECTED BY CRAIG CONNER, DAN HOUSER AND LAZLOW - -[CRED144] -PRODUCED BY RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -RADIO STATIONS AND MUSIC - -[CRED218] -PRODUCERS FOR ROCKSTAR UK - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED219] -SOUNDTRACK CO-ORDINATOR - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUCER FOR ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -EDITED BY - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER AND IMAGING WRITTEN BY - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -SPECIAL THANKS TO - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[CINCAM] -Cinematic-Kamera - -[KM1_13] -Fahr das Fahrzeug in die Garage! - -[KM3_14] -~r~Du bist gesehen worden. Der Deal fãllt flach! - -[EBAL_H] -Warte hier. Ich gehe rein und rede mit Luigi. - -[EBAL_M] -Und merk dir: Finger weg von meinen Girls. - -[LM2_F] -Dann schnapp dir seine Karre und spritze sie um. - -[LM2_D] -Hier. Hier, nimm. - -[LM1_9] -Hi. Ich bin Misty. - -[LM4_A] -So ein Mistkerl von den Diablos hat in meinem Gebiet Mãdchen laufen. - -[FM2_B] -Wir haben einen Verrãter unter uns! - -[FM2_C] -Er verdient kein Geld mit Mãdchen oder Dealen, also wird er Informationen verkaufen. - -[FM3_CC] -~w~Komm wieder, wenn du die Kohle hast, Bruder. - -[FEDS_AM] -<>-MENÜ WECHSELN - -[LOVE5_5] -~r~Du hast es nicht geschafft, den Truck zu beschützen! - -[RM6_6] -~r~Ray ist tot! - -[RM6_7] -~r~Ray hat seinen Flug verpasst. - -[RM6_8] -~g~Du hast Ray zurückgelassen. Kehr um und hol ihn. - -[FM1_10] -~g~Du hast Maria zurückgelassen. Kehr um und hol sie. - -[LOVE4_9] -~r~Das Flugzeug ist zerstört worden! - -[LOV4_10] -~r~Die einzige Spur auf den Verbleib des Pãckchens ist vernichtet worden. - -[KM2_D] -Unnötig zu sagen, dass wir ihm die Autos schenken müssen, um meine Schuld bei ihm zu begleichen. - -[KM4_B] -Für Lãden, die das Glück haben, unter unserem Schutz zu stehen, ist heute Zahltag. - -[KM2_E] -Du musst die Autos auf der Liste besorgen und zu einer Garage hinter dem Parkplatz in Newport bringen. - -[FM3_8I] -~w~Such dir eine günstige Position. Ich geh rein, wenn du den ersten Schuss abfeuerst. - -[LOVE1_B] -Ich weiß, dass einer wie du sehr loyal sein kann, wenn das Geld stimmt. - -[LOVE1_H] -Aber je mehr Leute, desto größer die Gier. - -[LOVE1_C] -Ein werter Geschãftsfreund, ein alter Asiate, - -[LOVE1_I] -wird von irgendwelchen Südamerikanern in Aspatria als Geisel festgehalten. - -[MEA4_D] -Ich habe ein Treffen mit ihm vereinbart... - -[MEA4_B4] -Marty schickt dich also? Dem Penner werde ich zeigen, was es heißt, mit mir Geschãfte zu machen. - -[MEA4_B5] -Carl, hi. Ich, ãh, ich brauche noch ein bisschen Zeit, um dein Geld aufzutreiben. - -[MEA1_B4] -Mr Chonks schickt dich also. Wollen wir dem Burschen doch mal einen Besuch abstatten. - -[HM5_6] -Dann wollen wir doch mal ein paar Leute aufmischen... - -[LOVE1_5] -~g~Hãng hier nicht rum, besorg dir ein Auto der Kolumbianer und rette Loves Geschãftsfreund. - -[AS1_D] -~w~Spiel den Köder und locke die Killerkommandos nach Pine Creek, - -[AS1_E] -~w~wo meine Leute sie erwarten werden. - -[AS2_C] -~w~Das Kartell betreibt eine Scheinfirma zur Tarnung - das Kappa Coffee House. - -[AS2_E] -~w~Wir haben keine Wahl. Wir müssen diese Drogenbuden zerstören. - -[AS2_F] -~w~Zerleg diese Dinger!! - -[AS2_A1] -~w~Miguel ist ein echter Latin Lover. Der hat ein Stehvermögen! - -[AS2_A2] -~w~Ich bin völlig erschöpft. - -[SIREN_3] -Um die Sirenen dieses Fahrzeugs einzuschalten, drücke die ~h~~k~~VEHICLE_HORN~-Taste~w~. - -[SIREN_4] -Um die Sirenen dieses Fahrzeugs einzuschalten, drücke die ~h~~k~~VEHICLE_HORN~-Taste~w~. - -[AS3_C] -~w~Iiiiiiiiiiih! Was ist denn das für ein gelbes Glibberzeug? - -[AS3_C1] -~w~Oh, hi, Baby. - -[AS3_F] -~w~Das Mãdchen ist ein Naturtalent. - -[AS3_F1] -~w~Sie hat unserem Gast eine kleine Info entlockt. - -[AS3_G] -~w~In 2 Stunden landet ein Flugzeug auf dem Francis Int. Airport. - -[AS3_G1] -~w~Es ist voll mit Catalinas Giftzeug. - -[AS3_H] -~w~Du entgehst den Security Checks am Flughafen, wenn du dir ein Boot besorgst, zu den Leuchtbojen rausfãhrst - -[AS3_H1] -und die Maschine im Anflug abschießt. - -[AS3_I] -~w~Krame die Ladung aus den Trümmern! - -[AS3_J] -~w~Und sei vorsichtig, okay, Baby? - -[AS3_K] -~w~Versuch's mal mit Chili-Öl... - -[RM2_F1] -Die Kolumbianer müssen jeden Moment hier sein! - -[RM2_K] -Verdammt, da sind sie!! LOS, LADEN!! - -[LOVE2_7] -~g~ Jetzt lass den Wagen stehen! - -[LOVE2_8] -~g~Jetzt verschwinde aus Newport! - -[AM1_F] -Salvatore Leone wird Luigis Club in zirka drei Stunden verlassen (~1~:~1~). - -[LOVE5_C] -Folge ihm und sorg dafür, dass er und mein Pãckchen wohlbehalten in Pike Creek ankommen. - -[FESZ_SR] -Speicherung fehlgeschlagen! Bitte Memory Card (PS2) in MEMORY CARD-Steckplatz 1 überprüfen und noch einmal versuchen. - -[FESZ_FO] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 formatieren? - -[FELZ_FO] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 ist nicht formatiert. - -[FES_NOC] -Keine Memory Card (PS2) in MEMORY CARD-Steckplatz 1. - -[FES_LOE] -Laden fehlgeschlagen! Bitte Memory Card (PS2) in MEMORY CARD-Steckplatz 1 überprüfen und noch einmal versuchen. - -[FES_DEE] -Löschen fehlgeschlagen! Bitte Memory Card (PS2) in MEMORY CARD-Steckplatz 1 überprüfen und noch einmal versuchen. - -[FORSUC] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 wurde formatiert. - -[ERFOUN] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 konnte nicht formatiert werden. - -[ERMCNP] -Keine Memory Card (PS2) in MEMORY CARD-Steckplatz 1. - -[SVMEM1] -Speichern auf Memory Card (PS2) in MEMORY CARD-Steckplatz 1. - -[FORSLO] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 formatieren. - -[SLONFM] -Fehler beim Formatieren der Memory Card (PS2) in MEMORY CARD-Steckplatz 1. - -[SLONDR] -Nicht genug Speicherplatz. Bitte eine Memory Card (PS2) mit mindestens 500KB freiem Speicherplatz in MEMORY CARD-Steckplatz 1 einstecken. - -[SLNSP] -Nicht genug Speicherplatz. Bitte eine Memory Card (PS2) mit mindestens 200KB freiem Speicherplatz in MEMORY CARD-Steckplatz 1 einstecken. - -[FEFD_WR] -Formatiere Memory Card (PS2) in MEMORY CARD-Steckplatz 1. Bitte die Memory Card (PS2) nicht entfernen, kein Reset vornehmen und die Konsole nicht ausschalten. - -[FES_ISF] -NICHT VORHANDEN - -[FES_SAG] -VORHANDEN - -[SLONNO] -Keine Memory Card (PS2) in MEMORY CARD-Steckplatz 1. - -[SLONNF] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 ist nicht formatiert. - -[FESZ_FM] -Memory Card (PS2) in MEMORY CARD-Steckplatz 1 ist nicht formatiert. Soll die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 formatiert werden? - -[FESZ_FF] -Formatierung fehlgeschlagen. Bitte die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 überprüfen und noch einmal versuchen. - -[MCDNSP] -Nicht genug Platz auf Memory Card (PS2) in MEMORY CARD-Steckplatz 1. Es werden mind. 500KB Speicherplatz benötigt, um Spieldaten zu speichern. Trotzdem starten? (JA oder NEIN) - -[MCGNSP] -Nicht genug Platz auf Memory Card (PS2) in MEMORY CARD-Steckplatz 1. Es werden mind. 200KB Speicherplatz benötigt, um Spieldaten zu speichern. Trotzdem starten? (JA oder NEIN) - -[FESZ_WR] -Daten werden gespeichert. Bitte die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 nicht entfernen, kein Reset vornehmen und die Konsole nicht ausschalten. - -[FESZ_OW] -Daten werden überschrieben. Bitte die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 nicht entfernen, kein Reset vornehmen und die Konsole nicht ausschalten. - -[FELD_WR] -Daten werden geladen. Bitte die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 nicht entfernen, kein Reset vornehmen und die Konsole nicht ausschalten. - -[FEDL_WR] -Daten werden gelöscht. Bitte die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 nicht entfernen, kein Reset vornehmen und die Konsole nicht ausschalten. - -[LM2_C] -Luigi sagt, das soll ich dir geben... - -[LM3_G] -Joey ist einer, den man nicht warten lãsst. Das ist deine Chance. - -[LM5_E] -Bring so viele wie möglich hin, bevor die Cops ihr ganzes Geld versaufen. - -[JM5_C] -Vor dem Cafe in der Nãhe vom Callahan Point steht ein Auto mit einem Toten drin. - -[RM2_B] -Wir waren zusammen in Nicaragua, als dieses Land noch wusste, was es tut. - -[RM2_C] -Irgendwelche Dreckskerle vom Kartell haben ihn gestern verprügelt und kommen heute wieder, um ihm seine Ware abzunehmen. - -[RM2_D1] -Ich würde es selbst machen, aber meine Bronchien melden sich wieder. Tja, ãh, viel Glück. - -[CATINF1] -~g~Schnapp dir Catalina! - -[CATINF2] -~g~Um Catalina zu finden, folge dem Hubschrauber. - -[BOATIN1] -Spring auf ein Boot und drücke die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um hinein zu gelangen. - -[BOATIN2] -Wenn du in der Nãhe eines Bootes bist, kannst du die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste ~w~benutzen, um an Bord zu gelangen. - -[BOATIN3] -Spring auf ein Boot und drücke die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um hinein zu gelangen. - -[BOATIN4] -Wenn du in der Nãhe eines Bootes bist, kannst du die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste ~w~benutzen, um an Bord zu gelangen. - -[JM6] -'DIE FLUCHT' - -[FM1] -'AUF PISTE MIT MARIA' - -[JM1] -'MIKE 'LIPS' LETZTE LASAGNE' - -[FM21] -'DER BOMBENANSCHLAG, TEIL 1' - -[FM3] -'DER BOMBENANSCHLAG, TEIL 2' - -[AM1] -'SAYONARA SALVATORE' - -[AM2] -'UNTER ÜBERWACHUNG' - -[KM2] -'GTA' - -[AS3] -'DER ABFANGJÃGER' - -[RM2] -'DAS WAFFENARSENAL' - -[LOVE6] -'LOCKVOGEL' - -[LOVE1] -'DIE BEFREIUNGSAKTION' - -[RC1] -'IM DSCHUNGEL DER DIABLOS' - -[RC2] -'DAS MAFIA-MASSAKER' - -[RC3] -'DER CASINO-COUP' - -[RC4] -'ROCK'N ROLL MIT RUMPO' - -[RM2_E1] -Unglaublich, dass die feigen Sãcke mich wieder ohne ausreichenden Schutz ins Gefecht schicken. - -[GREN_1] -Je lãnger du die ~h~~k~~PED_FIREWEAPON~-Taste~w~ gedrückt hãltst, desto weiter kannst du die Granate werfen. - -[GREN_2] -Je lãnger du die ~h~~k~~PED_FIREWEAPON~-Taste~w~ gedrückt hãltst, desto weiter kannst du die Granate werfen. - -[GREN_3] -Je lãnger du die ~h~~k~~PED_FIREWEAPON~-Taste~w~ gedrückt hãltst, desto weiter kannst du die Granate werfen. - -[LOVE4_G] -Die Maschine mit meiner Ware steht im Zollhangar. - -[KABOOM] -KAWUMM! - -[SPLAT] -WUSCH! - -[PANCAK] -PLATT! - -[SOAKED] -AARGH! - -[HEAD] -Head Radio - -[DBL_CLF] -Double Clef FM - -[FLASHB] -Flashback FM - -[RISE] -Rise FM - -[LIPS] -Lips 106 - -[CHAT] -Chatterbox FM - -[K_JAH] -K-Jah Radio - -[GAM_FM] -Game Radio FM - -[MSX_FM] -MSX FM - -[TUBE1] -Wenn der U-Bahnhof öffnet, kannst du die U-Bahn nach Staunton Island nehmen. - -[TUBE2] -Wenn der U-Bahnhof in Shoreside Vale aufmacht, dann kannst du das Shoreside Terminal in Richtung Francis Int. Airport verlassen. - -[TUBE_2] -Um in eine U-Bahn einzusteigen, ~h~'Einsteigen'-Taste~w~ drücken. - -[LEGAL] -~g~Schalte die kriminelle Bedrohung aus! - -[GA_2] -Neuer Motor und neue Lackierung. Die Cops werden dich nicht identifizieren! - -[LM1_8A] -Warum nicht ein Taxi 'ausleihen', um dir was dazu zu verdienen...? - -[TAXIH1] -Halte neben einem gehighlighteten Fußgãnger, um ihn einsteigen zu lassen, dann bringe ihn rechtzeitig an sein Fahrtziel. - -[LM5_7] -~g~Wenn weniger als vier Girls bei dem ~p~Polizeiball~g~ auftauchen, wird Luigi sauer! - -[KM2_3] -~g~Die ~r~Autos~g~ müssen in 1A-Zustand sein, damit die ~p~Garage~g~ sie annimmt. - -[KM5_2] -~g~Ein Yardie ist weg. - -[BETRA_A] -Sorry, Baby. - -[BETRA_B] -Ich bin ein anspruchsvolles Mãdchen und du... - -[BETRA_C] -... du bist ein kleiner Fisch. - -[JAILB_C] -Noch gibt es keine nãheren Informationen zu den Hãftlingen, die mit dem Konvoi transportiert wurden, - -[JAILB_E] -Der Konvoi war am frühen Morgen vom Polizei-Hauptquartier aus - -[JAILB_F] -zu einem Gefangenentransport mit Ziel Haftanstalt Liberty aufgebrochen. - -[JAILB_G] -Der Anschlag erfolgte an der Callahan-Brücke. - -[JAILB_P] -ist Portland durch diese Katastrophe vom Rest der Stadt abgeschnitten. - -[JAILB_Q] -Los jetzt! - -[JAILB_R] -Vollidiot! - -[JAILB_S] -Kein Problem, dich alle zu machen. - -[JAILB_T] -Das wird dir noch leid tun. - -[JAILB_U] -Okay, okay. Hau ab. - -[HELP15] -Wenn zu Fuß unterwegs, drücke die ~h~~k~~PED_LOOKBEHIND~-Taste~w~, um ~h~nach hinten zu schauen~w~. - -[FEC_LB3] -Nach hinten schauen - -[FEC_R3] -(R3-Taste) - -[FES_AFO] -Diese Memory Card (PS2) ist bereits formatiert. - -[FEA_UP] -; - -[FEA_DO] -= - -[FEA_LE] -< - -[FEA_RI] -> - -[FEDSAS3] -- AUSWAHL ÃNDERN - -[FEDSAS4] -;=<> - AUSWAHL ÃNDERN - -[SPRAY_4] -~h~~k~~PED_FIREWEAPON~-Taste ~w~benutzen, um die Wasserkanone abzufeuern. - -[SPRAY_1] -~h~~k~~PED_FIREWEAPON~-Taste ~w~benutzen, um die Wasserkanone abzufeuern. - -[LITTLE] -LITTLE T - -[NICK] -NICK LOVE - -[AM1_10] -~g~Salvatore Leone wird Luigis Club um zirka 0~1~:~1~ verlassen. - -[JAILB_V] -Liberty City ist heute vom Schrecken gezeichnet. - -[JAILB_A] -Polizei und Noteinsatzkrãfte arbeiten unter Hochdruck, nachdem heute morgen - -[JAILB_B] -ein verheerender Anschlag auf einen Polizeikonvoi verübt wurde. - -[JAILB_W] -Nach stundenlangen Ermittlungen wurde klar, dass der Anschlag das Werk von Profis war. - -[JAILB_K] -Die Identifizierung der noch vermissten Kriminellen wurde darüber hinaus - -[JAILB_L] -durch eine Hacker-Attacke auf den Zentral-Computer der Polizei erschwert. - -[JAILB_M] -stellte Bürgermeister O'Donovan klar, dass die Polizei - -[JAILB_N] -* - -[JAILB_O] -Da die Fertigstellung des Porter Tunnels sich verzögert, - -[JAILB_X] -In einer ersten Stellungnahme - -[FEDS_SE] -/-Taste - AUSWAHL - -[FEDS_SB] -/-Taste - AUSWAHL "-Taste - ZURÜCK - -[TM4_A] -~w~Ach, du bist es. Toni ist nicht da. - -[TM4_A2] -~w~Aber er hat wieder ein Liebesbriefchen für dich hinterlassen. - -[DIAB2_A] -Ich habe mein Entertainment-Business mit nichts als dem üppigen Inhalt meiner Lederhose gestartet. - -[LM5_9] -GIRLS: - -[PERPIC] -Versteckte Pãckchen gefunden - -[CO_ONE] -Verstecktes Pãckchen ~1~ von ~1~ - -[LOVE3_3] -~g~Das Flugzeug hat ~1~ von 6 Pãckchen abgeworfen. - -[FARE11] -~g~Fahrziel: ~w~'Baustelle' ~g~in Fort Staunton. - -[GA_21] -In dieser Garage bringst du keine Autos mehr unter. - -[CHEAT1] -Cheat aktiviert - -[CHEAT2] -Waffen-Cheat - -[CHEAT3] -Health-Cheat - -[CHEAT4] -Panzerungs-Cheat - -[CHEAT5] -Fahndungslevel-Cheat - -[CHEAT6] -Geld-Cheat - -[CHEAT7] -Wetter-Cheat - -[AS1_H] -~r~Es ist dir nicht gelungen, das Killerkommando in die Yakuza-Falle zu locken! - -[FEDS_BA] -"-Taste - ZURÜCK - -[RAMP_A] -ALLE AMOKLÃUFE BEENDET! - -[USJ_ALL] -ALLE MONSTER-STUNTS ABSOLVIERT! - -[FARE23] -~g~Fahrtziel: ~w~'Import-Export Garage' ~g~im Cochrane Dam Distrikt. - -[L_TRN_1] -Mit der U-Bahnlinie L kannst du in Portland herumfahren. Drücke die~h~ ~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um in eine U-Bahn ~h~ein- oder auszusteigen~w~. - -[L_TRN_2] -Mit der U-Bahnlinie L kannst du in Portland herumfahren. Drücke die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um in eine U-Bahn ~h~ein- oder auszusteigen~w~. - -[S_TRN_1] -Mit der U-Bahn kannst du in Liberty herumfahren. Drücke die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um in eine U-Bahn ~h~ein- oder auszusteigen~w~. - -[S_TRN_2] -Mit der U-Bahn kannst du in Liberty herumfahren. Drücke die ~h~~k~~VEHICLE_ENTER_EXIT~-Taste~w~, um in eine U-Bahn ~h~ein- oder auszusteigen~w~. - -[AS1_C] -~w~Sie hat drei Killerkommandos in Liberty verteilt, die dich zur Strecke bringen sollen. - -[AS1_G] -~r~Alle Yakuza sind erledigt! - -[JAN] -Jan - -[FEB] -Feb - -[MAR] -Mãr - -[APR] -Apr - -[MAY] -Mai - -[JUN] -Jun - -[JUL] -Jul - -[AUG] -Aug - -[SEP] -Sept - -[OCT] -Okt - -[NOV] -Nov - -[DEC] -Dez - -[DEFDT] ---:---:---- --:--:-- - -[BUGGY] -VERBLEIBENDE BUGGIES: - -[BONUS] -~g~BONUS $~1~ - -[HORN1] -Drück die ~h~L3-Taste~w~, um zu ~h~hupen. - -[HORN2] -Drück die ~h~L1-Taste~w~, um zu ~h~hupen. - -[HORN3] -Drück die ~h~R1-Taste~w~, um zu ~h~hupen. - -[LM3_1A] -Drück die ~h~~k~~VEHICLE_HORN~-Taste~w~, um zu ~h~hupen. So weiß Misty, dass du da bist. - -[LM3_1B] -Drück die~h~ ~k~~VEHICLE_HORN~-Taste~w~, um zu ~h~hupen. So weiß Misty, dass du da bist. - -[LM3_1C] -Drück die~h~ ~k~~VEHICLE_HORN~-Taste~w~, um zu ~h~hupen. So weiß Misty, dass du da bist. - -[RADIO_A] -Drück die ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~-Taste~w~, um die verschiedenen ~h~Radiosender zu hören. - -[RADIO_B] -Drück die ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~-taste~w~, um die verschiedenen ~h~Radiosender zu hören. - -[RADIO_C] -Drück die ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~-Taste~w~, um die verschiedenen ~h~Radiosender zu hören. - -[RADIO_D] -Drück die ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~-Taste~w~, um die verschiedenen ~h~Radiosender zu hören. - -[FEC_EXV] -In Fahrzeug ein-\aussteigen - -[TAXI_M] -'TAXI DRIVER' - -[COP_M] -'BÜRGERWEHR' - -[FIRE_M] -'FEUERWEHR' - -[AMBUL_M] -'KRANKENWAGEN' - -[HJ_IS] -IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PIS] -SUPER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_DIS] -DOPPELTER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PDIS] -SUPER-DOPPEL-IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_TIS] -DREIFACHER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PTIS] -SUPER-DREIFACH-IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_QIS] -VIERFACHER IRRSINNS-STUNT-BONUS: $~1~ - -[HJ_PQIS] -SUPER-VIERFACH-IRRSINNS-STUNT-BONUS: $~1~ - -[AM1_K] -Salvatore Leone wird Luigis Club in zirka drei Stunden verlassen. (0~1~:~1~) - -[IMPEXPP] -Import-Export Garage, Portland Harbor. Wir haben Bestellungen für verschiedene Fahrzeuge. Nãheres steht auf unserem Schwarzen Brett. - -[VANHSTP] -Willst du noch mehr Securicars aufgebrochen haben? Bring sie zu unserer Garage in Portland Harbor. - -[EMVHPUP] -Zahlen Bestpreise für Neu- und Gebrauchtwagen. Bring sie zum Kran im Nordosten von Portland Harbor. - -[STANDS] -ZERSTÖRTE ESPRESSOSTÃNDE: - -[STASH] -~g~Deponiere das SPANK auf der ~p~Baustelle! - -[MCSTNS] -Keine Memory Card (PS2) in MEMORY CARD-Steckplatz 1. Trotzdem starten? (JA oder NEIN) - -[LOVE3_5] -~g~Das Flugzeug ist jetzt in Reichweite. - -[LOVE3_6] -~r~Die Polizei war vor dir bei den Pãckchen! - -[SIREN_1] -Um die Sirenen dieses Fahrzeugs einzuschalten, drücke die ~h~~k~~VEHICLE_HORN~-Taste~w~. - -[SIREN_2] -Um die Sirenen dieses Fahrzeugs einzuschalten, drücke die ~h~~k~~VEHICLE_HORN~-Taste~w~. - -[FM3_8C] -~w~Ich brauch $100 000 für Auslagen. - -[MCLOAD] -Daten werden geladen. Bitte die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 nicht entfernen, kein Reset vornehmen und die Konsole nicht ausschalten. - -[FES_GME] -Fehler beim Lesen der Memory Card (PS2) in MEMORY CARD-Steckplatz 1! Bitte überprüfen und noch einmal versuchen. - -[FESZ_QF] -Soll die Memory Card (PS2) in MEMORY CARD-Steckplatz 1 wirklich formatiert werden? - -[FESZ_LS] -Ladevorgang abgeschlossen. - -[RM3_5] -~g~Du hast ~1~ von 6 Pãckchen mit Beweisfotos. - -[LOVE3_2] -~g~Du hast alle Pãckchen. Bring sie zu Donald Love. - -[LOVE4_4] -~g~Bring das Pãckchen zu Donald Love! - -[FEB_SAV] -Laden - -[FEP_SAV] -SPIEL LADEN - -[AS2_12A] -~g~Wenn du den ersten Espressostand zerstört hast, hast du 8 Minuten Zeit, bis das Kartell seine Dealer warnt! - -[AS3_1A] -~g~Jetzt fahr zu der ~b~Markierungsboje! - -[NOCONT] -Bitte stecken Sie einen Analog Controller (DUALSHOCK#) oder einen Analog Controller (DUALSHOCK#2) in Controller-Anschluss 1, um fortzufahren. - -[BET_JB] -VON CATALINA, SEINER GELIEBTEN, IM STICH GELASSEN, FÜR SCHULDIG BEFUNDEN UND VERURTEILT, BEFINDET ER SICH AUF DEM WEG INS GEFÃNGNIS VON LIBERTY CITY. DOCH IN SEINEM KOPF HÃMMERT EIN GEDANKE... MIT EUCH BIN ICH NOCH NICHT FERTIG! - -[END_A] -Die Bewohner von Cedar Grove erholen sich langsam - -[END_B] -von dem Schock der schrecklichen Ereignisse, - -[END_C] -die sich gestern hier abgespielt haben. - -[END_D] -Clive Denver, ein Augenzeuge, beschrieb der Polizei - -[END_E] -den Tãter, den er zusammen mit einer dunkelhaarigen Frau flüchten sah. - -[END_F] -Hör mal, wir werden sehr viel Spaß miteinander haben. Weißt du, - -[END_G] -ich liebe dich nãmlich. Wirklich, du bist so groß und stark, - -[END_H] -und genau so einen Mann brauche ich. - -[END_I] -Jedenfalls - was wollte ich gerade sagen? - -[END_J] -Weiß nicht mehr. Aber du verstehst doch, was ich meine, oder? - -[END_K] -Der Donner von Explosionen erschütterte umliegende Hãuser. Menschen rannten in Deckung. - -[END_L] -Mehrere Anwohner wurden verletzt, als es in dem Chaos zu einem Schusswechsel - -[END_M] -zwischen Bodeneinheiten und einem Helikopter kam, der über dem Damm kreiste. - -[END_N] -Ja, von hier in den Gãrten konnten wir alles genau beobachten. - -[END_O] -Wie sie den Helikopter dann abgeschossen haben, - -[END_P] -das war ein ziemliches Feuerwerk. - -[END_Q] -Die Zahl der Toten ist inzwischen auf über 20 angestiegen - -[END_R] -und die Polizei findet immer noch weitere Leichen. - -[END_S] -Die Gerüchte, dass es sich bei den Opfern um Angehörige des kolumbianischen Kartells - -[END_T] -handelt, wurden von offizieller Seite bisher nicht dementiert. - -[END_U] -Und es gibt nach wie vor keine Anhaltspunkte für das Motiv der Tat. - -[END_V] -Ich hab mir 'nen Fingernagel abgebrochen und meine Frisur ist hin! - -[END_W] -Fünfzig Dollar im Eimer! - -[PAPER1] -GANGSTER VON KOMPLIZIN, DIE ER LIEBT, VERRATEN. GERICHT BEFINDET RÃUBER EINSTIMMIG FÜR SCHULDIG. - -[PAPER2] -ZEHN JAHRE AUS LIEBE! - -[JAILB_D] -und es hat sich bisher auch keine kriminelle Vereinigung zu dem Attentat bekannt. - -[JAILB_H] -Die meisten Zeugen kamen ums Leben und die Brücke wurde schwer beschãdigt. - -[JAILB_I] -Man geht davon aus, dass auch einige der Hãftlinge bei der sich ereignenden Explosion umkamen. - -[JAILB_J] -* - -[FEB_CPC] -Konfiguration d. Steuerung - -[FEC_PED] -Steuerung zu Fuß - -[FEC_VEH] -Steuerung in Fahrzeug - -[FEC_FPR] -Steuerung für First-Person - -[FEC_CMM] -Allgemeine Steuerung - -[FEC_PWL] -Nach links - -[FEC_PWR] -Nach rechts - -[FEC_PWF] -Vorwãrts gehen - -[FEC_PWT] -Auf Kamera zugehen - -[FEC_PLB] -Nach hinten schauen - -[FEC_PFR] -Waffe abfeuern - -[FEC_CLE] -Eine Waffe nach links - -[FEC_CRI] -Eine Waffe nach rechts - -[FEC_LKT] -Ziel fixieren - -[FEC_PJP] -Fußgãnger springen - -[FEC_PSP] -Fußgãnger sprinten - -[FEC_PSH] -Fußgãnger schießen - -[FEC_TLF] -Ein Ziel nach links - -[FEC_TRG] -Ein Ziel nach rechts - -[FEC_CCM] -Kamera hinter Spieler zentrieren - -[FEC_SZI] -Mit Prãzisionsgewehr heranzoomen - -[FEC_SZO] -Mit Prãzisionsgewehr herauszoomen - -[FEC_LKL] -First-Person nach links schauen - -[FEC_LRT] -First-Person nach rechts schauen - -[FEC_LUP] -First-Person nach oben schauen - -[FEC_LDN] -First-Person nach unten schauen - -[FEC_LBH] -Aus Fahrzeug nach hinten schauen - -[FEC_LLF] -Aus Fahrzeug nach links schauen - -[FEC_LRG] -Aus Fahrzeug nach rechts schauen - -[FEC_HRN] -Hupe - -[FEC_HBR] -Handbremse - -[FEC_ACL] -Gas geben - -[FEC_BRK] -Bremsen - -[FEC_TSM] -Spezialmissionen An/Aus - -[FEC_CRD] -Radiosender wechseln - -[FEC_ENT] -In Fahrzeug Ein-/Aussteigen - -[FEC_WPN] -Waffe abfeuern - -[FEC_PAS] -Pause - -[FEC_FPO] -First Person Weapons Toggle. - -[FEC_SMS] -Mauszeiger An/Aus - -[FEC_CMS] -Blickwinkel wechseln. - -[FEC_TSS] -Screen Shot - -[FEN_NET] -Netzwerk - -[FEN_CON] -Verbindung - -[FEN_GAM] -Spiel suchen - -[FEN_TYP] -Spiel-Typ - -[FEN_TY0] -Deathmatch - -[FEN_TY1] -Deathmatch Stealth - -[FEN_TY2] -Team Deathmatch - -[FEN_TY3] -Team Deathmatch Stealth - -[FEN_TY4] -Stash the Cash - -[FEN_TY5] -Capture the Flag - -[FEN_TY6] -Rat Race - -[FEN_TY7] -Domination - -[FEN_NAM] -Name: - -[FEN_GNA] -Spiel-Name: - -[FEM_MAP] -Karte auswãhlen - -[FEN_PLS] -Spieler-Einstellungen - -[FEN_PLC] -Spieler-Farbe - -[FEM_MA0] -Liberty City - -[FEM_MA1] -Rotlichtbezirk - -[FEM_MA2] -Chinatown - -[FEM_MA3] -Der Tower - -[FEM_MA4] -Die Kanalisation - -[FEM_MA5] -Industriepark - -[FEM_MA6] -Docks - -[FEM_MA7] -Staunton - -[FEC_DBG] -Debug-Menü - -[FEC_TGD] -Mit Pad zwischen Spiel- u. Debug-Modus wechseln - -[FEC_TDO] -Debug-Kamera Aus - -[FEC_IVH] -Maus horizontal invertieren - -[FEC_MSL] -MAUSTASTE L - -[FEC_MSM] -MAUSTASTE M - -[FEC_MSR] -MAUSTASTE R - -[FEC_QUE] -??? - -[FEC_TWO] -Nur zwei Tastaturtasten erlaubt - -[FEC_OMS] -Nur eine Maustaste erlaubt - -[FEC_OJS] -Nur ein Joystick-Button pro Aktion erlaubt - -[FEC_PTL] -"Ziel fixieren" u. "Waffenauswahl links" gleichzeitig drücken. - -[FEC_PTR] -"Ziel fixieren" u. "Waffenauswahl rechts" gleichzeitig drücken. - -[FEC_LBC] -"Nach links schauen" u. "Nach rechts schauen" gleichzeitig drücken. - -[FEC_JBO] -JOY ~1~ - -[NO_PAUZ] -Pause in Multiplayer nicht möglich. Zum Beenden zwei Mal drücken! - -[FEM_SL1] -Speicherplatz 1 ist frei - -[FEM_SL2] -Speicherplatz 2 ist frei - -[FEM_SL3] -Speicherplatz 3 ist frei - -[FEM_SL4] -Speicherplatz 4 ist frei - -[FEM_SL5] -Speicherplatz 5 ist frei - -[FEM_SL6] -Speicherplatz 6 ist frei - -[FEM_SL7] -Speicherplatz 7 ist frei - -[FEM_SL8] -Speicherplatz 8 ist frei - -[FEM_MM] -HAUPTMENÜ - -[FEM_SNG] -Neues Spiel starten - -[FEM_QTW] -Beenden - -[FEQ_SRE] -Wirklich beenden? Alle Daten seit dem letzten Speichern werden verlorengehen. Weiter? - -[FEQ_SRW] -Spiel wirklich beenden? - -[FEG_SRV] -SERVER - -[FEG_MAP] -KARTE - -[FEG_PLY] -SPIELER - -[FEG_TYP] -TYP - -[FEG_PNG] -PING - -[FET_FG] -SPIEL SUCHEN - -[FET_SP] -SINGLEPLAYER - -[FET_MP] -MULTIPLAYER - -[FET_HG] -SPIEL HOSTEN - -[FET_PS] -SPIELER SETUP - -[FET_CON] -VERBINDUNG - -[FET_AUD] -AUDIO-SETUP - -[FET_GFX] -GRAFIK-SETUP - -[FET_DIS] -ANZEIGEN-SETUP - -[FET_LAN] -SPRACHEN-SETUP - -[FET_LG] -SPIEL LADEN - -[FET_DG] -SPIEL LÖSCHEN - -[FET_NG] -NEUES SPIEL - -[FET_SG] -SPIEL SPEICHERN - -[FET_MAP] -KARTE AUSWÃHLEN - -[FET_GT] -SPIEL-TYP - -[FET_CTL] -CONTROLLER-SETUP - -[FET_OPT] -OPTIONEN - -[FET_QG] -SPIEL BEENDEN - -[FET_STA] -STATISTIK - -[FET_BRE] -MISSIONSINFOS - -[FEC_WAR] -Achtung! - -[FEC_OKK] -OK - -[FED_CON] -Löschen bestãtigen - -[FES_SSC] -Spiel wurde gespeichert. - -[DEL_FNM] -Datei wurde gelöscht. - -[PCLOAD] -Datei wird geladen - -[PCRESRT] -GTA 3 wird neu gestartet - -[FEC_DLF] -Löschen fehlgeschlagen. - -[FEC_SVU] -Speichern fehlgeschlagen. - -[FEC_LUN] -Laden fehlgeschlagen. Datei beschãdigt. Bitte löschen. - -[FEN_PLA] -Anzahl der Spieler: - -[FET_NON] -KEINE SPIELE VERFÜGBAR - -[FET_SFG] -SPIELE WERDEN GESUCHT... - -[FET_SRT] -SPIELE WERDEN SORTIERT... - -[FEF_LAN] -LAN - -[FEF_INT] -INTERNET - -[FET_REF] -Aktualisieren - -[FET_FIL] -Filter - -[FET_JG] -Beitreten - -[FEC_NTW] -Talk To Network - -[FEC_ESR] -Esc-Taste nicht zugelassen - -[FEC_GSL] -Show head bob: - -[FIL_FLT] -SPIELE-LISTE FILTERN - -[FET_SAN] -NEUES SPIEL STARTEN - -[FIL_MAP] -Karte: - -[FIL_SRV] -Server: - -[FIL_TYP] -Spiel-Typ - -[FIL_SPC] -Offene Spiele? - -[FIL_PNG] -Ping: - -[FEN_UKH] -Unbekannter Host - -[FEN_UKM] -Map nicht gefunden - -[FEN_UKT] -Spiel-Typ nicht gefunden - -[FEN_NCI] -KEINE INTERNET-VERBINDUNG - -[FET_PAU] -PAUSENMENÜ - -[FET_SGA] -SPIEL STARTEN - -[FEC_PAD] -Gamepad - -[FEC_JOY] -Joystick - -[FEC_WHL] -Lenkrad - -[FEC_CNT] -Controller-Typ: - -[FET_APL] -ÜBERNEHMEN - -[FES_CSA] -Wãhlen Sie eine Skin aus der Liste aus: - -[FES_SKN] -SKIN-NAME - -[FES_DAT] -DATUM - -[FES_NON] -KEINE SKINS VERFÜGBAR - -[FEA_FM9] -SPIELER MP3 - -[FESZ_QZ] -Dieses Spiel wirklich speichern? - -[FES_CGA] -Momentan verfügbare Speicherplãtze: - -[FES_SCG] -Laufendes Spiel speichern? - -[FES_LCG] -Spiel laden und weiterspielen? - -[FEC_FIR] -Feuern - -[FEC_NWE] -Nãchste Waffe - -[FEC_PWE] -Vorherige Waffe - -[FEC_FOR] -Vorwãrts - -[FEC_BAC] -Rückwãrts - -[FEC_LEF] -Links - -[FEC_RIG] -Rechts - -[FEC_ZIN] -Heranzoomen - -[FEC_ZOT] -Herauszoomen - -[FEC_EEX] -Ein-/Aussteigen - -[FEC_RAD] -Radio - -[FEC_SUB] -Spezialmission - -[FEC_CMR] -Blickwinkel ãndern - -[FEC_JMP] -Springen - -[FEC_SPN] -Sprinten - -[FEC_HND] -Handbremse - -[FEC_TUL] -Geschütz links - -[FEC_TUR] -Geschütz rechts - -[FEC_LOL] -Nach links schauen - -[FEC_LOR] -Nach rechts schauen - -[FEC_NTR] -Nãchstes Ziel - -[FEC_PTT] -Vorheriges Ziel - -[FEC_LBA] -Nach hinten schauen - -[FEC_CEN] -Kamera zentrieren - -[FEC_UND] -(NEIN) - -[FET_CFT] -ZU FUSS - -[FET_CCR] -IN FAHRZEUG - -[CVT_MSG] -Texturen werden in optimales Format für Ihre Grafikkarte konvertiert - -[FET_CAC] -AKTION - -[FEC_IBT] -- - -[FEC_SPC] -LEERT. - -[FEC_MXO] -MXB1 - -[FEC_MXT] -MXB2 - -[FEC_UNB] -NICHT BEL. - -[FET_CME] -STEUERUNGSART - -[FET_RDK] -STEUERUNG ÃNDERN - -[FET_AMS] -MAUS-EINSTELLG. - -[FET_STI] -STANDARD STEURUNGSKONFIG. - -[FET_CTI] -CLASSIC STEURUNGSKONFIG. - -[FET_MTI] -MAUS STEURUNGSKONFIG. - -[FET_DAM] -DYNAMISCHE AKUSTIK - -[FEC_TFL] -Geschütz Links - -[FEC_TFR] -Geschütz Rechts - -[FEC_TFU] -Geschütz /Dodo aufwãrts - -[FEC_TFD] -Geschütz /Dodo abwãrts - -[FEC_MWF] -RAD AUFW. - -[FEC_MWB] -RAD ABW. - -[FEC_ORR] -oder - -[FEC_NUS] -NICHT VERWENDET - -[FEC_LUD] -Aufw. Sehen - -[FEC_LDU] -Abw. Sehen - -[FEC_CMP] -COMBO: L+R SEHEN - -[FEC_NTT] -Noch kein Text für diese Taste - -[FEC_FNC] -F~1~ - -[FEC_IRT] -EINFG - -[FEC_DLL] -ENTF - -[FEC_HME] -POS1 - -[FEC_END] -ENDE - -[FEC_PGU] -BILD AUF - -[FEC_PGD] -BILD AB - -[FEC_UPA] -AUF - -[FEC_DWA] -AB - -[FEC_LFA] -LINKS - -[FEC_RFA] -RECHTS - -[FEC_NUM] -NUM - -[FEC_NMN] -NUM~1~ - -[FEC_FWS] -NUM / - -[FEC_PLS] -NUM + - -[FEC_MIN] -NUM - - -[FEC_DOT] -NUM , - -[FEC_NLK] -NUMLOCK - -[FEC_ETR] -ENT - -[FEC_SLK] -ROLLEN - -[FEC_PSB] -UNTBR - -[FEC_BSP] -RÜCKT. - -[FEC_TAB] -TAB - -[FEC_CLK] -CAPSLOCK - -[FEC_RTN] -RET - -[FEC_LSF] -LUMSCHALT - -[FEC_RSF] -RUMSCHALT - -[FEC_LCT] -LSTRG - -[FEC_RCT] -RSTRG - -[FEC_LAL] -LALT - -[FEC_RAL] -RALT - -[FEC_LWD] -LWIN - -[FEC_RWD] -RWIN - -[FEC_WRC] -WINKLICK - -[WIN_TTL] -GTA 3 - -[WIN_95] -GTA 3 lãuft nicht unter Windows 95 - -[WIN_DX] -GTA 3 benötigt mind. DirectX Version 8.1 - -[WIN_VDM] -GTA 3 benötigt mind. 12MB freien Grafikspeicher - -[DIAB3_G] -Arriba! - -[FEM_RES] -SPIEL FORTSETZEN - -[FES_SNG] -NEUES SPIEL STARTEN - -[FEM_SP] -SINGLEPLAYER - -[FEM_MP] -MULTIPLAYER - -[FEM_QT] -SPIEL BEENDEN - -[FES_SG] -NEUES SPIEL STARTEN - -[FES_LG] -SPIEL LADEN - -[FEM_HST] -SPIEL HOSTEN - -[FEM_OPT] -OPTIONEN - -[FEM_DBG] -DEBUG - -[FET_PSU] -SPIELER SETUP - -[FET_DEF] -STANDARD WIEDERHERST. - -[FED_BRI] -HELLIGKEIT - -[FED_TRA] -UNSCHÃRFE-FX - -[FEM_LOD] -DISTANZ-DARSTELLG. - -[FEM_VSC] -FRAME SYNC - -[FEM_FRM] -FRAME LIMITER - -[FED_RES] -BILDSCHIRMAUFLSG. - -[FED_WIS] -BREITBILD - -[FEDS_TB] -ZURÜCK - -[FEA_MUS] -MUSIK VOLUME - -[FEA_SFX] -SFX VOLUME - -[FEA_RSS] -RADIOSENDER - -[FEL_ENG] -ENGLISCH - -[FEL_FRE] -FRANZ. - -[FEL_GER] -DEUTSCH - -[FEL_ITA] -ITALIEN. - -[FEL_SPA] -SPANISCH - -[FEA_3DH] -AUDIO HARDWARE - -[FEA_SPK] -BOXEN KONFIGURATION - -[FEA_2SP] -2 BOXEN - -[FEA_4SP] -MEHR ALS 2 BOXEN - -[FEA_EAR] -KOPFHÖRER - -[FEA_NAH] -KEINE AUDIO HARDWARE - -[FET_SNG] -NEUES SPIEL STARTEN - -[FEN_STA] -SPIEL STARTEN - -[GMLOAD] -SPIEL LADEN - -[GMSAVE] -SPIEL SPEICHERN - -[FES_DGA] -SPIEL LÖSCHEN - -[FEM_NON] -KEIN - -[FEC_IVV] -MAUS VERTIKAL INVERTIEREN - -[FEC_MSH] -MAUSEMPFINDLICHKEIT - -[FET_CCN] -STEUERUNG: CLASSIC - -[FET_SCN] -STEUERUNG: STANDARD - -[FES_SET] -SKIN VERWENDEN - -[GHOST] -Ghost - -[WIN_RSZ] -Neue Auflösung konnte nicht aktiviert werden - -[FET_APP] -LMT,RETURN,UM NEUE EINSTLLG. ZU SPEICHERN - -[FET_HRD] -STANDARDEINSTLLG. WIEDERHERGESTELLT - -[FET_MST] -MAUSSTEUERUNG - -[FEC_STR] -NUM STERN - -[FET_MIG] -LINKS,RECHTS,MAUSRAD ZUR EINSTLLG. - -[FET_CIG] -RÜCKT. ZUM LÖSCHEN - LMT,RETURN ZUM ÃNDERN - -[FET_RIG] -NEUE STEUERUNG FÜR DIESE AKTION WÃHLEN ODER ESC FÜR ABBRUCH - -[FET_EIG] -KANN DIESER AKTION KEINE STEUERUNG ZUWEISEN - -[NO_PCCD] -Bitte legen Sie die GTA 3 Disk 2 ein oder drücken Sie ESC zum Abbrechen - -[CVT_ERR] -Kein Platz mehr auf der Festplatte. Bitte schaffen Sie Speicherplatz, bevor Sie fortfahren. ESC zum Abbrechen. - -[FED_SUB] -UNTERTITEL - -[FET_DSN] -Standard-Player Skin.bmp - -[EBAL] -'GIB MIR LIBERTY' - -[LM4] -'PUMP-ACTION-THRILLER' - -[REPLAY] -WIEDERHOLUNG - -[FEC_SFT] -UMSCHALT - -[CRED254] -STUDIO MANAGER - -[CVT_CRT] -Texturen können nicht für Ihre Grafikkarte konvertiert werden. Sie müssen sich als Administrator einloggen, damit dies möglich ist. Verlassen mit ESC. - -[FEM_ON] -AN - -[FEM_OFF] -AUS - -[FEM_YES] -JA - -[FEM_NO] -NEIN - -[FES_WAR] -Speichere Daten, bitte warten... - -[FED_DLW] -Lösche Daten, bitte warten... - -[FED_LDW] -Lade Daten, bitte warten... - -[FEC_SLC] -Slot ist beschãdigt - -[FED_LFL] -Spiel konnte nicht geladen werden. Das Spiel wird neu gestartet. - -[FET_RSO] -ORIGINAL-EINSTELLG. WIEDERHERGESTELLT - -[FET_RSC] -HARDWARE NICHT VERFÜGBAR - ORIGINAL-EINSTELLG. WIEDERHERGESTELLT - -[CRED270] -MIKE HONG - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file diff --git a/utils/gxt/italian.txt b/utils/gxt/italian.txt deleted file mode 100644 index 822a30b8..00000000 --- a/utils/gxt/italian.txt +++ /dev/null @@ -1,8040 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBFàèéìòùÀÈÉÌÒÙ - -[DEFNAM] -Claude---------------------- - -[IN_VEH] -~g~Ehi! Torna nel veicolo! - -[IN_VEH2] -~g~Avrai bisogno di un veicolo per questo lavoro! - -[IN_BOAT] -~g~Hai bisogno di un'imbarcazione per questo lavoro! - -[HEY] -~g~Non procedere da solo, stai insieme ai tuoi compagni! - -[HEY2] -~g~Non dividetevi, tieni il gruppo compatto! - -[HEY3] -~g~Hai abbandonato il tuo uomo! Torna indietro e recupera 8-Ball! - -[HEY4] -~g~Se abbandoni Misty, Luigi ti fa a pezzi! Vai a recuperarla! - -[HEY5] -~g~Manca una ragazza alla lista! Vai a recuperarla! - -[HEY6] -~g~Hai perso l'onore insieme a Yakuza Kanbu. Devi proteggerlo! - -[HEY7] -~g~Un'arma extra può tornare utile. Torna indietro e recupera il tuo contatto! - -[HEY8] -~g~Forse non hai ben presente il concetto di protezione: non abbandonare il vecchietto orientale! - -[HEY9] -~g~Vuoi sapere cosa si dice in giro? Fa'una visita al tuo contatto! - -[HELP2_A] -Premi il ~h~tasto /~w~ mentre corri per effettuare uno ~h~scatto~w~. - -[HELP3] -Ricorda che puoi eseguire uno scatto solo per brevi tratti. - -[HELP4_A] -Premi il ~h~tasto ~k~~VEHICLE_ACCELERATE~~w~ per ~h~accelerare~w~. - -[HELP4_D] -Sposta la ~h~levetta analogica destra~w~ verso l'alto per ~h~accelerare~w~. - -[HELP5_A] -Premi il ~h~tasto ~k~~VEHICLE_BRAKE~~w~ per ~h~frenare~w~ o, se il veicolo è fermo, per inserire la ~h~retromarcia~w~. - -[HELP5_D] -Sposta la ~h~levetta analogica destra~w~ verso il basso per ~h~frenare~w~ o, se il veicolo è fermo, per inserire la ~h~retromarcia~w~. - -[HELP6_A] -Premi il ~h~tasto ~k~~VEHICLE_HANDBRAKE~~w~ per tirare il ~h~freno a mano~w~. - -[HELP6_C] -Premi il ~h~tasto ~k~~VEHICLE_HANDBRAKE~~w~ per tirare il ~h~freno a mano~w~. - -[HELP6_D] -Premi il ~h~tasto ~k~~VEHICLE_HANDBRAKE~~w~ per tirare il ~h~freno a mano~w~. - -[HELP7_A] -Tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ con il fucile di precisione. - -[HELP7_D] -Tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~ per ~h~mirare~w~ con il fucile di precisione. - -[HELP8_A] -Premi il ~h~tasto ~k~~PED_SNIPER_ZOOM_IN~~w~ per ~h~zoomare~w~ col fucile e il ~h~tasto ~k~~PED_SNIPER_ZOOM_OUT~~w~ per ~h~allargare il campo~w~. - -[HELP9_A] -Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ con il fucile di precisione. - -[HELP10] -Questo distintivo indica che hai un livello di sospetto. - -[HELP11] -Più distintivi hai, maggiore è il tuo livello di sospetto. - -[HELP13] -In alcuni casi potresti dover utilizzare passaggi non indicati sul radar. - -[TIMER] -Questa è una missione a tempo: devi completarla prima che il contatore raggiunga lo zero. - -[MISTY1] -~r~Mistry è pronta per l'obitorio! - -[OUT_VEH] -~g~Esci dal veicolo! - -[GARAGE] -Porta l'auto dentro il garage e poi esci a piedi all'esterno. - -[WANTED1] -~g~Semina i poliziotti per perdere il tuo livello di sospetto. - -[NODOORS] -~g~Non sono sardine! Trova un veicolo con sedili a sufficienza. - -[TRASH] -~g~Hai ridotto proprio male il tuo veicolo! Vedi di farlo riparare! - -[WRECKED] -~g~Il veicolo è a pezzi! - -[HORN] -~g~Suona il clacson. - -[HORN4] -Premi il ~h~tasto R3~w~ per attivare il ~h~clacson~w~. - -[NOMONEY] -~g~Ti servono più soldi! - -[OUTTIME] -~r~Troppo lento, troppo lento! - -[SPOTTED] -~r~Ti hanno visto! - -[REWARD] -RICOMPENSA ~1~$ - -[GAMEOVR] -GAME OVER - -[Z] -Valore asse Z: ~1~ - -[M_FAIL] -MISSIONE FALLITA! - -[M_PASS] -MISSIONE COMPIUTA! ~1~$ - -[O_PASS] -LAVORO OCCASIONALE ESEGUITO! - -[O_FAIL] -LAVORO OCCASIONALE FALLITO! - -[DEAD] -MASSACRATO! - -[BUSTED] -BECCATO! - -[S_PROMP] -Quando non stai eseguendo una missione, puoi ~h~salvare la partita qui~w~ in questo modo il tempo avanzerà di sei ore. - -[NUMBER] -~1~ - -[SCORE] -~1~$ - -[LOADCAR] -CARICAMENTO VEICOLO... (PREMI L1 PER ANNULLARE) - -[CARSOFF] -Veicoli disabilitati. - -[CARS_ON] -Veicoli attivati. - -[TEXTXYZ] -Scrittura delle coordinate sul file... - -[CHEATON] -Modalità trucchi attivata - -[CHEATOF] -Modalità trucchi disattivata - -[UZI_IN] -L'Uzi adesso e' disponibile da AmmuNation! - -[IMPORT1] -Esci fuori e aspetta il tuo veicolo. - -[PAGEB1] -Pistola depositata nel nascondiglio - -[PAGEB2] -Uzi depositato nel nascondiglio - -[PAGEB3] -Armatura depositata nel nascondiglio - -[PAGEB4] -Fucile a pompa depositato nel nascondiglio - -[PAGEB5] -Granate depositate nel nascondiglio - -[PAGEB6] -Molotov depositate nel nascondiglio - -[PAGEB7] -AK47 depositato nel nascondiglio - -[PAGEB8] -Fucile di precisione depositato nel nascondiglio - -[PAGEB9] -M16 depositato nel nascondiglio - -[PAGEB10] -Lanciamissili depositato nel nascondiglio - -[PAGEB11] -Lanciafiamme depositato nel nascondiglio - -[WANT_A] -Non puoi essere arrestato se il tuo ~h~livello di sospetto~w~ è nullo. - -[WANT_B] -Il tuo ~h~livello di sospetto~w~ è rappresentato da una riga di stelle nell'angolo superiore destro dello schermo. - -[WANT_C] -Adesso hai un ~h~livello di sospetto~w~ pari a uno... - -[WANT_D] -due... - -[WANT_E] -tre... - -[WANT_F] -Man mano che il tuo ~h~livello di sospetto~w~ aumenta, attirerai l'attenzione di forze dell'ordine sempre più potenti. - -[WANT_G] -Se vieni ~h~'beccato'~w~, verrai portato alla più vicina stazione di polizia. - -[WANT_H] -I poliziotti prenderanno tutte le tue armi e parte dei tuoi risparmi come bustarella. - -[WANT_I] -Qualsiasi missione stessi affrontando, sarà considerata fallita. - -[WANT_J] -Scoprirai alcuni modi per ridurre il tuo livello di sospetto procedendo nel gioco. - -[WANT_K] -Se sei in un veicolo, i ~h~carozzieri~w~ potranno ~h~azzerare il tuo livello di sospetto~w~. - -[HEAL_B] -Quando sei ~h~'massacrato'~w~, verrai trasportato al più vicino ospedale. - -[HEAL_C] -Perderai tutte le tue armi e i dottori prenderanno parte dei tuoi risparmi per rimetterti in sesto. - -[HEAL_E] -Scoprirai alcuni modi per curarti o per proteggerti dagli attacchi procedendo nel gioco. - -[DAM] -DANNO: - -[KILLS] -UCCISIONI: - -[FARES] -CLIENTI: - -[BULL] -LINGOTTI: - -[EVID] -PROVE: - -[HEALTH] -CONDIZIONI VEICOLO: - -[COLLECT] -RACCOLTO: - -[BOMB] -Guida il veicolo dentro un'armeria per installare una ~h~bomba~w~. Costo - ~h~1000$~w~. - -[SAVE1] -Passa attraverso la porta per ~h~salvare la partita~w~. Non puoi salvare durante una missione. - -[SAVE2] -Qualsiasi veicolo parcheggiato nel garage verrà salvato insieme alla partita. - -[AMMU] -Entra in AmmuNation per comprare un'arma. - -[BRIDGE1] -Quando verrà riparato il ponte Callahan, potrai raggiungere Staunton Island. - -[TUNNEL] -Quando il sottopassaggio Porter verrà inaugurato, potrai raggiungere Staunton Island. - -[LUIGI] -MISSIONI LUIGI - -[TONI] -MISSIONI TONI - -[JOEY] -MISSIONI JOEY - -[FRANK] -MISSIONI SALVATORE - -[DIABLO] -MISSIONI DIABLO - -[ASUKA] -MISSIONI ASUKA - -[B_SITE] -MISSIONI SUBURBANE ASUKA - -[KENJI] -MISSIONI KENJI - -[RAY] -MISSIONI RAY - -[LOVE] -MISSIONI LOVE - -[YARDIE] -MISSIONI YARDIE - -[HOOD] -MISSIONI HOOD - -[CITYZON] -Città di Liberty - -[IND_ZON] -Portland - -[PORT_W] -Callahan Point - -[PORT_S] -Molo atlantico - -[PORT_E] -Porto di Portland - -[PORT_I] -Trenton - -[S_VIEW] -Portland View - -[CHINA] -Chinatown - -[EASTBAY] -Spiaggia di Portland - -[LITTLEI] -Saint Mark - -[REDLIGH] -Distretto a luci rosse - -[TOWERS] -Hepburn Heights - -[HARWOOD] -Harwood - -[ROADBR1] -Ponte Callahan - -[ROADBR2] -Ponte Callahan - -[TUNNELP] -Sottopassaggio Porter - -[BOMB1] -Garage di 8-Ball - -[COM_ZON] -Staunton Island - -[STADIUM] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Campus Liberty - -[CONSTRU] -Fort Staunton - -[PARK] -Parco Belleville - -[COM_EAS] -Newport - -[SHOPING] -Bedford Point - -[YAKUSA] -Torrington - -[SUB_ZON] -Shoreside Vale - -[AIRPORT] -Aeroporto Francis - -[PROJECT] -Giardini Wichita - -[SUB_IND] -Pike Creek - -[SWANKS] -Cedar Grove - -[BIG_DAM] -Diga Cochrane - -[SUB_ZO2] -Shoreside Vale - -[SUB_ZO3] -Shoreside Vale - -[CAR_1] -Ambulanza - -[CAR_2] -Camion dei pompieri - -[CAR_3] -Polizia - -[CAR_4] -Cellulare - -[CAR_5] -Caserma - -[CAR_6] -Rhino - -[CAR_7] -Auto dell'FBI - -[CAR_8] -Securicar - -[CAR_9] -Moonbeam - -[CAR_10] -Coach - -[CAR_11] -Flatbed - -[CAR_12] -Linerunner - -[CAR_13] -Trashmaster - -[CAR_14] -Patriot - -[CAR_15] -Mr Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinel - -[CAR_25] -Cheetah - -[CAR_26] -Banshee - -[CAR_27] -Stinger - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_30] -Kuruma - -[CAR_31] -Stretch - -[CAR_32] -Familiare - -[CAR_33] -Landstalker - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Stallion - -[CAR_37] -Taxi - -[CAR_38] -Vecchio taxi - -[CAR_39] -Maggiolino - -[LUIGIS] -Club Luigi's - -[GOAWAY] -~g~Stai già svolgendo una missione! - -[LUIGGO] -~g~Luigi sta intervistando delle nuove ragazze. Torna più tari! - -[JOEYGO] -~g~Joey è fuori città con Misty. Passa più tardi! - -[TONIGO] -~g~Toni ha portato sua madre a teatro. Passa un'altra volta! - -[KEMUGO] -~g~Maria e Kemuri sono impegnati la momento. Passa più tardi! - -[KENJGO] -~g~Kenji è a una riunione della Yakuza. Passa un'altra volta! - -[RAYGO] -~g~Ray è andato a un centro estetico. Passa un'altra volta! - -[LOVEGO] -~g~Donald Love si sta occupando di affari urgenti. Prendi un appuntamento più tardi! - -[KENSGO] -~g~Kenji e' occupato! Torna più tardi! - -[ASUSGO] -~g~Asuka adesso non è disponibile! - -[HOODGO] -~g~Gli Hood non sono disponibili! - -[WRONGT1] -~g~Passa tra le 05:00 e le 21:00 per un lavoro - -[WRONGT2] -~g~Passa tra le 06:00 e le 14:00 per un lavoro - -[WRONGT3] -~g~Passa tra le 15:00 e le 00:00 per un lavoro - -[GUN_1A] -Usa il ~h~tasto ~k~~PED_CYCLE_WEAPON_RIGHT~~w~ e il ~h~tasto ~k~~PED_CYCLE_WEAPON_LEFT~~w~ per passare in rassegna le armi. - -[GUN_2A] -Tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~ per la ~h~mira automatica~w~ e premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare! Allenati con i bersagli... - -[GUN_2C] -Tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~ per la ~h~mira automatica~w~ e premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare! Allenati con i bersagli... - -[GUN_2D] -Tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~ per la ~h~mira automatica~w~ e premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare! Allenati con i bersagli... - -[GUN_3A] -Mentre tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~, premi il ~h~tasto ~k~~PED_CYCLE_TARGET_LEFT~~w~ o il ~h~tasto ~k~~PED_CYCLE_TARGET_RIGHT~~w~ per cambiare bersaglio. - -[GUN_3B] -Mentre tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~, premi il ~h~tasto ~k~~PED_CYCLE_TARGET_LEFT~~w~ o il ~h~tasto ~k~~PED_CYCLE_TARGET_RIGHT~~w~ per cambiare bersaglio. - -[GUN_4A] -Mentre tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~, puoi camminare o correre tenendo sotto mira il bersaglio. - -[GUN_4B] -Mentre tieni premuto il ~h~tasto ~k~~PED_LOCK_TARGET~~w~, puoi camminare o correre tenendo sotto mira il bersaglio. - -[GUN_5] -Puoi far pratica sparando a questi bersagli di carta. Quando hai finito, riprendi la missione. - -[TAXI1] -~g~Trova un passeggero. - -[FARE1] -~g~Destinazione: ~w~'Meeouch Sex Kitten Club' ~g~nel distretto a luci rosse. - -[FARE2] -~g~Destinazione: ~w~'Supa Save' ~g~a Portland View. - -[FARE3] -~g~Destinazione: ~w~'l'auditorio della scuola' ~g~a Chinatown. - -[FARE4] -~g~Destinazione: ~w~'Greasy Joe's Cafe' ~g~a Callahan Point. - -[FARE5] -~g~Destinazione: ~w~'AmmuNation' ~g~nel distretto a luci rosse. - -[FARE6] -~g~Destinazione: ~w~'Easy Credit Autos' ~g~a Saint Mark. - -[FARE7] -~g~Destinazione: ~w~'Woody's topless bar' ~g~nel distretto a luci rosse. - -[FARE8] -~g~Destinazione: ~w~'Marcos Bistro' ~g~a Saint Mark. - -[FARE9] -~g~Destinazione: ~w~'Garage importazioni-esportazioni' ~g~al porto di Portland. - -[FARE10] -~g~Destinazione: ~w~'Punk Noodles' ~g~a Chinatown. - -[FARE12] -~g~Destinazione: ~w~'lo stadio di football' ~g~in Aspatria. - -[FARE13] -~g~Destinazione: ~w~'la chiesa' ~g~a Bedford Point. - -[FARE14] -~g~Destinazione: ~w~'il Casinò' ~g~in Torrington. - -[FARE15] -~g~Destinazione: ~w~'università di Liberty' ~g~al campus di Liberty. - -[FARE16] -~g~Destinazione: ~w~'il grande magazzino' ~g~nel parco Belleville. - -[FARE17] -~g~Destinazione: ~w~'il museo' ~g~a Newport. - -[FARE18] -~g~Destinazione: ~w~'AmCo Building' ~g~a Torrington. - -[FARE19] -~g~Destinazione: ~w~'Bolt Burgers' ~g~a Bedford Point. - -[FARE20] -~g~Destinazione: ~w~'il parco' ~g~a Belleville. - -[FARE21] -~g~Destinazione: ~w~'Aeroporto Francis'~g~. - -[FARE22] -~g~Destinazione: ~w~'la diga di Cochrane'~g~. - -[FARE24] -~g~Destinazione: ~w~'l'ospedale' ~g~a Pike Creek. - -[FARE25] -~g~Destinazione: ~w~'il parco' ~g~a Shoreside Vale. - -[FARE26] -~g~Destinazione: ~w~'North West Towers' ~g~ai giardini Wichita. - -[NEW_TAX] -PIÙ GRANDI! PIÙ VELOCI! PIÙ ROBUSTI! I nuovi taxi Borgnine disponibili ad Harwood. Chiamate subito il numero 555-BORGNINE! - -[TSCORE2] -~1~$ - -[IN_ROW] -Bonus ~1~ di seguito! ~1~$ - -[TTUTOR] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Taxi. - -[TTUTOR2] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Taxi. - -[A_TIME] -+~1~ secondi - -[A_FULL] -~r~Ambulanza piena! - -[A_RANGE] -~g~Sei fuori dal raggio d'azione della radio. Ritorna in prossimità dell'ospedale! - -[FTUTOR] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Camion dei pompieri. - -[FTUTOR2] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Camion dei pompieri. - -[F_PASS1] -Incendio spento! - -[F_RANGE] -~g~Sei fuori dal raggio d'azione della radio. Ritorna in prossimità della stazione dei pompieri! - -[C_BREIF] -~g~Sospetto visto in prossimità dell'area ~a~. - -[C_RANGE] -~g~Sei fuori dal raggio d'azione della radio. Ritorna in prossimità della stazione di polizia! - -[DODO_FT] -Hai volato per ~1~ secondi! - -[EBAL_A] -Conosco un posto nei dintorni del distretto a luci rosse dove si puo'parlare, - -[EBAL_A1] -ma le mie mani sono a pezzi, quindi è meglio se guidi te, fratello. - -[EBAL_1] -Premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per ~h~entrare~w~ o ~h~uscire~w~ da un veicolo. - -[EBAL_1B] -Premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per ~h~entrare~w~ o ~h~uscire~w~ da un veicolo. - -[EBAL_2] -~g~Rientra in macchina! - -[EBAL_3] -Questo è il ~h~radar~w~: usalo per orientarti nella città. Segui il ~h~puntino~w~ sul ~h~radar~w~ per trovare il nascondiglio! - -[EBAL_D] -Conosco un tipo, è nel giro. Si chiama Luigi. - -[EBAL_D1] -Forza, raggiungiamolo, magari riesco a procurarti qualche lavoretto. - -[EBAL_E] -Forza, facciamo un salto. Te lo voglio presentare. - -[EBAL_I] -Il boss sara' con voi al più presto... - -[EBAL_J] -8-Ball ha alcune faccende da sbrigare al piano di sopra. - -[EBAL_K] -Forse potresti farmi un favore. - -[EBAL_L] -Una delle mie ragazze ha bisogno di un passaggio, prendi una macchina, recupera Misty dalla clinica e portala qua. - -[EBAL_N] -E tieni le mani sul volante! - -[EBAL_4] -~r~8-Ball è morto! - -[EBAL_5] -~g~Trova un veicolo! - -[EBAL_6] -~g~Recupera Misty! - -[LM1] -'LE RAGAZZE DI LUIGI' - -[LM2] -'NIENTE SPANK PER LE RAGAZZE' - -[LM3] -'PORTA IN GIRO MISTY PER ME' - -[LM5] -'FESTA DEGLI SBIRRI' - -[LM1_2] -~g~Porta Misty al club Luigi's. - -[LM1_3] -~g~Premi il clacson per far entrare la ragazza in macchina. - -[LM1_6] -~g~Torna in macchina! - -[LM1_7] -~g~Ferma il veicolo in prossimità di Misty per permetterle di salire. - -[LM1_8] -Puoi tornare da Luigi per altri lavori o gironzolare per la città di Liberty. - -[LM2_A] -C'è una nuova droga in giro per la città chiamata SPANK. - -[LM2_E] -Qualche farabutto ne ha passata un po' alle mie ragazze giù al porto di Portland. - -[LM2_B] -Raggiungi lo spacciatore e gioca a baseball con la sua testa! - -[LM2_G] -Voglio soddisfazione per questo insulto! - -[LM2_1] -~g~Prendi la sua macchina e falla riverniciare. - -[LM2_2A] -Usa il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per tirare ~h~pugni~w~ e ~h~calci~w~ o per ~h~usare~w~ la mazza! - -[LM2_2C] -Usa il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per tirare ~h~pugni~w~ e ~h~calci~w~ o per ~h~usare~w~ la mazza! - -[LM2_2D] -Usa il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per tirare ~h~pugni~w~ e ~h~calci~w~ o per ~h~usare~w~ la mazza! - -[LM2_3] -~g~Parcheggia la macchina nel rifugio di Luigi! - -[LM2_4] -~g~Rivernicia la macchina! - -[LM3_A] -Ehi, devo parlarti... Va bene Mick, ne discutiamo più tardi. - -[LM3_B] -Come va ragazzo? - -[LM3_C] -Il figlio del Don, Joey Leone, ha bisogno delle doti di Misty, la sua ragazza. - -[LM3_D] -Valla a prendere a Hepburn Heights... - -[LM3_E] -ma fa attenzione: è il territorio dei Diablo. - -[LM3_F] -Poi portala in fretta fino al suo garage in Trenton. - -[LM3_H] -Mi raccomando, tieni gli occhi sulla strada e lontano da Misty! - -[LM3_1D] -Premi il ~h~tasto L3~w~ per suonare il ~h~clacson~w~ e avvertire Misty che sei arrivato. - -[LM3_2] -~g~Porta Misty da Joey. - -[LM3_4] -~g~Vai a prendere Misty! - -[LM3_5] -Adesso lavori regolarmente per Luigi, vero? Era ora che trovasse un autista di cui ci si può fidare! - -[LM3_7] -Sarò da te fra un minuto, stellina mia. - -[LM3_10] -~g~Recupera un veicolo! - -[LM4_B] -Occupati di ciò che ti ho chiesto. - -[LM4_C] -Se ti serve un'arma, vai sul retro di AmmuNation dal lato opposto della metropolitana. - -[LM5_A] -La festa degli sbirri viene tenuta in una vecchia scuola presso il ponte Callahan. - -[LM5_B] -A quanto sembra vogliono un po' di azione vecchio stile... - -[LM5_C] -Ora ho ragazze su tutti i marciapiedi della città. - -[LM5_D] -Portale alla festa il prima possibile. - -[LM5_1] -~g~Non sovraffollate il mezzo o mi sciuperai le ragazze! ~g~Scarica subito queste e poi vai a cercarne altre. - -[LM5_2] -~r~Una delle ragazze di Luigi è ridotta a pezzi! - -[LM5_3] -~g~Hai bisogno di un mezzo! - -[LM5_4] -~g~Raccogli le ragazze che lavorano presso St. Marks. - -[LM5_5] -~g~Porta le ragazze alla festa degli sbirri! - -[LM5_8] -~g~Ragazze alla festa: ~1~ - -[JM2] -'ADDIO 'CHUNKY' LEE CHONG' - -[JM4] -'L'AUTISTA DI CIPRIANI' - -[JM5] -'CADAVERE NEL BAGAGLIAIO' - -[JM1_1] -~g~Porta la macchina di Forelli al garage di 8-Ball a nord di qui, dietro a 'Easy Credit Autos'. - -[JM1_2] -~g~Parcheggia la macchina nuovamente di fronte al Marco's Bistro. - -[JM1_3] -~g~Attiva la bomba e vattene in fretta! - -[JM1_4] -~g~Hai rovinato il veicolo! Fallo riparare! - -[JM1_5] -~g~La bomba non è stata piazzata! - -[JM1_6] -~g~Parcheggia la macchina nel posto giusto. - -[JM1_8A] -~y~Ehi, amico mio! - -[JM1_8B] -~y~L'armeria è automatizzata: entra dentro, ferma la macchina e il resto dell'operazione verrà eseguito automaticamente. - -[JM1_8C] -~y~La prima volta è gratis, ma le altre volte dovrai pagare. - -[JM2_A] -Chunky Lee Chong sta spacciando SPANK per una nuova gang dalla Colombia... o dal Colorado...o qualcosa del genere... - -[JM2_B] -Non ricordo bene... ma del resto che importa? - -[JM2_D] -Quel verme ha venduto la sua roba per l'ultima volta. - -[JM2_E] -Voglio che tu lo elimini! - -[JM2_G] -Equipaggiati con una calibro nove: sai dove trovarla, vero? - -[JM2_H] -Guardati le spalle a Chinatown: è territorio della Triade. - -[JM3_A] -Bene, colpiremo il furgone portavalori. - -[JM3_B] -Esce da Chinatown tutti i giorni. - -[JM3_C] -I proiettili non scalfiscono neanche la sua blindatura, per cui prendi una macchina e fallo uscire fuori strada. - -[JM3_D] -Colpiscilo forte e le guardie dovrebbero arrendersi. - -[JM3_E] -Ora portalo fino al magazzino vicino agli impianti portuali e i miei ragazzi si occuperanno del resto. - -[JM3_F] -Ricorda che non starà in giro per delle ore, per cui non perdere tempo. - -[JM3_1] -~g~Porta il furgone a destinazione. - -[JM3_2] -~g~Sperona il furgone finché non è danneggiato oltre al 70 percento. - -[JM4_B] -Oh! Ecco il tipo di cui ti stavo parlando. - -[JM4_C] -Bene, ascolta: questo tipo non è italiano e non è un meccanico, ma sa come riparare le cose. - -[JM4_D] -Il suo nome è Toni Cipriani. - -[JM4_E] -Piacere, Toni Cipriani. - -[JM4_F] -Portalo al ristorante Momma's a St Marks, OK? - -[JM4_G] -Adesso ascolta, sto pianificando un lavoro che richiede un buon autista, per cui passa a trovarmi un giorno di questi, OK? - -[JM4_2] -Aspetta qua! Tieni il motore acceso, potrebbero esserci grane. - -[JM4_3] -È un'imboscata della Triade! Portaci via di qua, ragazzo! - -[JM4_4] -La Triade pensa di potersi prendere gioco di me, la Triade... di ME! - -[JM4_6] -Fai attenzione alla macchina! Ti ho detto di non fare stronzate. - -[JM4_7] -~g~Accompagna Toni al ristorante Momma's. - -[JM4_8] -~r~Toni è stato ucciso! - -[JM5_A] -Perfetto! Semplicemente perfetto. - -[JM5_B] -Sei proprio la persona di cui avevo bisogno! - -[JM5_D] -Uno dei Forelli ha voluto fare il furbo e si è beccato quello che si meritava. - -[JM5_E] -Porta il cadavere al rottamatore ad Hardwood, OK? - -[JM5_1] -~g~Porta il cadavere al rottamatore! - -[JM5_2] -~g~Sono i fratelli Forelli! - -[JM6_A] -Ci si prospetta una bella corsetta, vero? - -[JM6_B] -Bene, recupera un veicolo e raggiungi il rifugio a St. Marks e recupera alcuni miei amici. - -[JM6_C] -Stanno per fare un colpo a una banca e hanno bisogno dell'autista. - -[JM6_D] -Ho dato loro la mia parola che tu sei il migliore sul mercato. - -[JM6_E] -Portali in banca prima delle cinque, non un minuto più tardi! - -[JM6_2] -Tieni il motore acceso: torneremo in un attimo! - -[JM6_3] -Portaci via di qua!! - -[JM6_4] -Semina i poliziotti e portaci al rifugio! - -[JM6_6] -~g~Prendi un veicolo meno appariscente! - -[JM6_7] -~g~Hai bisogno di tutti e tre per rapinare la banca! - -[TM1] -'RIPULIRE LA LAVANDERIA' - -[TM2] -'LA RACCOLTA' - -[TM3] -'SALVATORE RICHIEDE UN INCONTRO' - -[TM4] -'TRIADE E TRIBOLAZIONE' - -[TM5] -'PESCE ESPLOSIVO' - -[TONI_P] -Ho un lavoro urgente per te! -Toni - -[TM1_A] -~w~Prendi una sedia, ragazzo, prendi una maledetta sedia. - -[TM1_B] -~w~Allora la lavanderia non intende pagare il pizzo, eh? - -[TM1_C] -~w~La Triade pensa di poter mettersi contro di me? - -[TM1_D] -~w~Insegniamo a questi presuntuosi cosa significa fare sul serio. - -[TM1_E] -~w~Sì, insegniamo loro un po' di rispetto. Nessun mio figliolo si fa fregare dalla Triade. - -[TM1_F] -Tuo padre, pace all'anima sua, non si è mai fatto fregare da quelli della Triade in Sicilia. - -[TM1_G] -~w~Scusa mamma. Sì mamma. - -[TM1_H] -~w~Voglio che tu distrugga i furgoni della lavanderia - -[TM1_I] -~w~e faccia a pezzi qualsiasi idiota della Triade che oserà mettersi in mezzo. - -[TM1_J] -~w~8-Ball ti fornirà qualsiasi cosa di cui tu possa aver bisogno. - -[TM2_A] -~w~Toni vuole fare il duro, - -[TM2_AA] -ma non riuscirà mai a eguagliare suo padre. Ha lasciato una nota per te sul tavolo. - -[TM2_B] -~w~La lavanderia ha accettato di pagare: bel lavoro, ragazzo! - -[TM2_C] -~w~Vai a recuperare i contanti e portali qua. Fai attenzione alla Triade. - -[TM2_D] -~w~Potrebbero volerti ficcare qualche petardo nel sedere, ma tu non farti impressionare. - -[TM2_E] -~w~Nessuno, e intendo nessuno, fa le scarpe a TONI CIPRIANI! - -[TM2_1] -~g~Riporta i contanti a Toni!!! - -[TM2_2] -~g~Li hai freddati tutti! - -[TM3_MA] -~w~Non so dove sia! - -[TM3_MB] -~w~Giuro che ogni tanto anche lui non si rende conto di cosa fa. - -[TM3_MC] -~w~Suo padre invece era diverso. Sempre in prima linea, sempre in carica, coraggioso... - -[TM3_A] -~w~Don Salvatore richiede un incontro. - -[TM3_B] -~w~Recupera la limousine da suo garage e il suo ragazzo, Joey. - -[TM3_C] -~w~Poi passa a prendere Luigi dal suo club e torna qua a prendere me. - -[TM3_D] -~w~Poi andremo tutti assieme al luogo dell'incontro. - -[TM3_E] -~w~Quelli della Triade non sanno quando è l'ora di fermarsi. - -[TM3_F] -~w~Se vogliono la guerra, avranno la guerra! - -[TM3_G] -~w~Adesso muoviamoci. - -[TM3_1] -~g~Prendi la limousine da Joey. - -[TM3_2] -~g~Ora vai a prendere Luigi. - -[TM3_3] -~g~Ora vai a prendere Toni. - -[TM3_4] -~g~Porta i tuoi passeggeri da Salvatore. - -[TM3_5] -~y~Un'imboscata della Triade!!! - -[TM4_B] -~w~Siamo in GUERRA! La Triade utilizza uno stabilimento per il pesce come facciata. - -[TM4_C] -~w~La maggior parte del loro lavoro si svolge nel mercato del pesce di Chinatown. - -[TM4_D] -~w~La lavanderia ha smesso nuovamente di pagarci il pizzo. - -[TM4_E] -~w~Pensano di essere sotto la protezione della Triade, per cui si meritano una punizione esemplare. - -[TM4_F] -~w~Prendi questi ragazzi e fai fuori i signori della Triade! - -[TM4_G] -~w~E se ne hai il tempo, elimina anche qualcuno dei loro scagnozzi. - -[TM4_GAT] -~w~Avrai bisogno di un 'furgone del pesce della Triade' per riuscire a entrare. - -[TM5_A] -TESTO NON PIÙ NECESSARIO - -[TM5_B] -~w~Basta, ne ho avuto abbastanza! - -[TM5_C] -~w~Elimineremo una volta per tutte la Triade da Liberty! - -[TM5_D] -8-Ball ha messo una bomba in un camion della nettezza urbana. - -[TM5_E] -~w~La bomba è collegata a un timer, per cui se fai errori non resteranno prove. Vai a prendere il camion. - -[TM5_F] -~w~Fai attenzione: 8-Ball ha detto che il sistema è molto sensibile e potrebbe esplodere se prendi un colpo. - -[TM5_G] -~w~Il loro stabilimento aprirà i cancelli al camion. - -[TM5_H] -~w~Parcheggia tra i due serbatoi del gas e allontanati in fretta! - -[TM5_I] -~w~Voglio che piovano sgombri. - -[TM5_J] -~w~Stiamo facendo le cose in grande, basta con gli scherzi. - -[FM2] -'TAGLIARE L'ERBA' - -[FM4] -'ULTIME RICHIESTE' - -[FM1_A] -~w~Io e i ragazzi dobbiamo parlare di lavoro, - -[FM1_B] -~w~per cui dovrai occuparti della mia ragazza questa sera. - -[FM1_C] -~w~EHI MARIA! MUOVI IL CULO! - -[FM1_D] -~w~Quella vacca fa sempre così. - -[FM1_E] -~w~Ed eccola qua, la vera e unica regina di Sheba! - -[FM1_F] -~w~Cosa stavi facendo di sopra? - -[FM1_G] -~w~Qualsiasi cosa fosse, sono certo che mi è costato molto. - -[FM1_H] -~w~Beh, credevo non mi volessi attorno quando parli di lavoro, vero? - -[FM1_I] -~w~Entra in macchina e tieni chiusa la boccaccia. - -[FM1_J] -~w~Prendi la limousine, ma riportala indietro come nuova, capito? - -[FM1_K] -~w~E fai attenzione alla ragazza, può causarti dei problemi. - -[FM1_L] -~w~Tranquillo, sono certa che il tuo nuovo cagnolino sa cosa deve fare: - -[FM1_M] -~w~non è grande e grosso a sufficienza? - -[FM1_N] -~w~Ehi, Fido: andiamo a far visita a Chico e prendiamo della roba per divertirci. - -[FM1_P] -~g~Ecco, quello è Chico. Fermati vicino a lui. - -[FM1_S] -~w~Buongiorno signora. - -[FM1_TT] -~w~È UN RETATA DELLA POLIZZIA! - -[FM1_1] -~g~Torna nella limousine! - -[FM1_2] -~g~Rientra nella limousine! - -[FM1_3] -~r~Se abbandoni Maria, Salvatore ti farà ammazzare! Torna indietro a prenderla. - -[FM1_4] -~g~Hai scaricato la donna del Don. Torna al magazzino e aspetta Maria! - -[FM1_5] -~g~Riporta Maria sana e salva a Salvatore! - -[FM1_6] -~g~Chico non aspetterà per sempre. Porta Maria al porto. - -[FM1_7] -~r~Maria è morta! Salvatore non ne sarà entusiasta... - -[FM1_8] -~r~Hai fatto fuori lo spacciatore di Maria! - -[FM2_J] -Lasciaci da soli per un minuto. - -[FM2_A] -Il Cartello Colombiano sta producendo SPANK da qualche parte a Liberty. - -[FM2_K] -Non sappiamo però dove, e loro sembrano conoscere ogni nostra mossa in anticipo. - -[FM2_L] -C'è un tipo chiamato Ricciolino Bob che lavora al bar di Luigi. - -[FM2_M] -Sta spendendo molti più soldi di quanti ne guadagna. - -[FM2_N] -Normalmente prende un taxi per tornare a casa. Voglio che tu lo segua. - -[FM2_O] -E se ci sta vendendo... fallo fuori! - -[FM2_F] -Ecco il nostro caro amico: mister bocca larga. - -[FM2_G] -Sei stato seguito? Lo sai che questo deve restare un nostro segreto. - -[FM2_H] -No, no... nessuno mi ha seguito. Hai la mia roba? - -[FM2_I] -Ecco il tuo SPANK, e adesso parla! - -[FM2_P] -OK, i Leone stanno combattendo su due fronti. - -[FM2_Q] -Sono ai ferri corti con la Triade e sembra che nessuno dei due sia intenzionato a cedere. - -[FM2_R] -Contemporaneamente, Joey Leone si è fatto dei nemici tra i Forelli. - -[FM2_S] -Ogni giorno perdono uomini e influenza sulla città. - -[FM2_T] -Salvatore sta diventando pericoloso e paranoico. Sospetta di tutto e di tutti. - -[FM2_U] -Con persone fedeli come te, non capisco di cosa si preoccupi. - -[FM2_1] -~g~Ecco Ricciolino Bob! - -[FM2_2] -~g~Ricciolino ha lasciato il club: seguilo! - -[FM2_5] -~g~Andiamo al porto di Portland. - -[FM2_6] -~r~Ricciolino non salirà su un taxi distrutto! - -[FM2_7] -~r~Ricciolino è spaventato! L'appuntamento è saltato! - -[FM2_8] -~g~Elimina Ricciolino Bob! - -[FM2_9] -~r~Ricciolino Bob è morto! - -[FM2_10] -~r~Ricciolino è scappato! - -[FM2_11] -~g~Parcheggia di fronte al club Luigi's: Ricciolino Bob uscirà fra poco. - -[FM2_12] -~r~Ti ha seminato! - -[FM3_A] -~w~Dovremmo eliminare i fottuti Colombiani, - -[FM3_B] -~w~ma siamo già in guerra con la Triade e non siamo abbastanza forti. - -[FM3_C] -~w~Il Cartello ha fondi infiniti grazie allo smercio dello SPANK. - -[FM3_D] -~w~Se li attacchiamo apertamente, ci spazzeranno via come foglie secche. - -[FM3_E] -~w~Probalbimente producono lo SPANK sull'imbarcazione dove si è diretto Ricciolino. - -[FM3_F] -~w~Per cui dovremo usare la testa... meglio ancora la tua testa. - -[FM3_G] -~w~Ti chiedo di distruggere la fabbrica di SPANK come favore personale a me, Salvatore Leone. - -[FM3_H] -~w~Se ci riuscirai, sarai una persona felice: potrai avere tutto ciò che vuoi. - -[FM3_I] -~w~Vai a trovare 8-Ball: avrai bisogno della sua esperienza per far saltare l'imbarcazione. - -[FM3_8A] -~w~Ehi amico, Salvatore ha appena chiamato: - -[FM3_8B] -~w~per un lavoro come questo avrai bisogno di una bella potenza di fuoco. - -[FM3_8D] -~w~ma tu sai che sono soldi spesi bene. - -[FM3_8E] -~w~OK, procediamo allora! - -[FM3_8F] -~w~Posso impostare questo bambino e farlo esplodere, ma non posso sparare con queste mani. - -[FM3_8G] -~w~Prendi questo fucile e fai saltare un po' di teste! - -[FM3_4] -~g~Ferma il veicolo e fai scendere 8-Ball! - -[FM3_7] -~r~8-Ball è stato freddato! - -[FM3_8] -~r~Le guardie sono state messe in guardia! - -[FM4_A] -~w~Sei l'uomo delle pulizie che preferisco. - -[FM4_B] -~w~Sono fiero di te, hai saputo prendere a calci quei maledetti! - -[FM4_C] -~w~Ho un ultimo lavoro per te prima di celebrare. - -[FM4_D] -~w~C'è una macchina vicino al club Luigi's. - -[FM4_E] -~w~All'interno è schizzato cervello dappertutto. - -[FM4_F] -~w~Abbiamo dovuto far ragionare un tipo e la cosa si è rilevata un po', ehm, sporca. - -[FM4_H] -~w~Portala al rottamatore prima che la trovino i poliziotti. - -[AM3] -'STRONCA I PAPARAZZI' - -[AM4] -'GIORNO DI PAGA PER RAY' - -[AM5] -'DOPPIA FACCIA' - -[AM1_A] -Ci sono alcuni punti da chiarire prima di procedere con la nostra relazione di lavoro. - -[AM1_B] -Direi che è il caso di mostrare le carte. - -[AM1_C] -Io sono della Yakuza e so che hai lavorato per la famiglia di Salvatore Leone. - -[AM1_D] -La mia organizzazione può darti lavoro, - -[AM1_E] -ma prima devi dimostrare che i tuoi legami con la Mafia sono definitivamente chiusi. - -[AM1_G] -Assicurati che non raggiunga vivo il suo club. - -[AM1_H] -Nel frattempo io e Maria discuteremo dei tempi passati. - -[AM1_I] -Oh... Asuka, hai un massaggiatore. - -[AM1_J] -Non è un massaggiatore. - -[AM1_1] -~g~Salvatore sta lasciando adesso il club Luigi's! - -[AM1_2] -~r~Sei stato avvistato! - -[AM1_3] -~r~Hai mancato Salvatore! - -[AM1_4] -~r~Ma bravo, hai spaventato il bersaglio! E tu dovresti essere un professionista? - -[AM1_5] -~g~Raggiungi il distretto a luci rosse e aspetta che Salvatore esca dal club. - -[AM1_7] -~r~Salvatore è arrivato a casa e si sta bevendo un cocktail. Ma non ti chiamavano lo sciacallo? - -[AM1_8] -~g~Salvatore uscirà dal club Luigi's attorno alle ~1~:~1~ - -[AM2_4] -~g~Sei più appariscente di un elefante fluorescente! - -[AM3_A] -Un reporter ci è ronzato troppo attorno. - -[AM3_B] -Io e Maria ci prenderemo un po' di vacanza fino a quando non ti sarai liberato di questo guardone. - -[AM4_A] -Il mio truffatore preferito! - -[AM4_B] -Maria è molto presa al momento: le dirò che sei passato. - -[AM4_C] -Chi è? Asuka? Lo so, sono stata una bambina cattiva, ma devo andare in bagno! OK? - -[AM4_D] -È giunta l'ora che incontri il nostro uomo nella polizia. - -[AM4_E] -Ecco la ricompensa per l'ultimo lavoro che ha svolto per noi. - -[AM4_F] -È un tipo molto cauto. - -[AM4_G] -Raggiungi in fretta il telefono pubblico a Torrington e aspetta le istruzioni. - -[AM5_A] -Maria e io siamo andati a fare spese. - -[AM5_B] -La nostra fonte alla polizia ci ha informato che uno dei nostri autisti è un maledetto infiltrato! - -[AM5_C] -Fuori dalla sua macchina è particolarmente vulnerabile: gli abbiamo posizionato addosso un tracciante. - -[AM5_D] -Fallo sanguinare! - -[AM5_1] -Ben fatto! - -[AS1] -'ESCA' - -[AS2] -'ESPRESSO E VIA!' - -[AS4] -'RISCATTO' - -[AS1_A] -~w~Miguel pensa non lo stia trattando correttamente. - -[AS1_B] -~w~Ciò nonostante, mi ha rilevato quanta paura ha Catalina di una tua possibile vendetta. - -[AS2_A] -~w~Abbiamo sottovalutato i piani di Catalina per lo SPANK. - -[AS2_B] -~w~È ben più avanti dei Yardie nelle vendite per strada. - -[AS2_D] -~w~Sembra spaccino lo SPANK attraverso i chioschi per strada. - -[AS2_1] -~g~Distrutti tutti i chioschi a Portland!!! - -[AS2_2] -~g~Distrutti tutti i chioschi a Staunton Island!!! - -[AS2_3] -~g~Distrutti tutti i chioschi a Shoreside Vale!!! - -[AS2_4] -~r~Il Cartello ha avvertito i loro spacciatori! - -[AS2_5] -~g~Ci sono ancora dei chioschi a Shoreside Vale e a Staunton Island! - -[AS2_6] -~g~Ci sono ancora dei chioschi a Shoreside Vale! - -[AS2_7] -~g~Ci sono ancora dei chioschi a Staunton Island! - -[AS2_8] -~g~Ci sono ancora dei chioschi a Portland! - -[AS2_9] -~g~Ci sono ancora dei chioschi a Portland e a Shoreside Vale! - -[AS2_10] -~g~Ci sono ancora dei chioschi a Portland e a Staunton Island! - -[AS2_12] -~g~Gira per Liberty alla ricerca dei ~b~chioschi~g~! - -[AS3_A] -~w~Dovremmo stringerlo ancora un po' o aspettare che diventi nero e cada? - -[AS3_B] -~w~Diamogli uno sprone... - -[AS3_D] -~w~Caro il mio truffatore! - -[AS3_E] -~w~Mi stavo annoiando, così sono venuto a fare compagnia a Asuka. - -[AS3_1] -~g~Trova una ~r~barca~g~ e raggiungi la ~b~boa segnalatrice~g~! - -[AS3_3] -~g~Attendi fino a quando l'~y~aeroplano~g~ non inizia l'atterraggio! - -[AS3_5] -~g~Raccogli il carico! - -[AS3_4] -~g~Usa un lanciamissili per abbattere l'~g~aeroplano~g~!!! - -[AS3_2] -~b~Raggiungi la boa di segnalazione della pista! ~y~L'aereo sta per atterrare! - -[AS3_6] -~g~~1~ SU 8 - -[KM1] -'LA FUGA DI KANBU' - -[KM3] -'STRONCA IL PATTO' - -[KM4] -'SHIMA' - -[KM5] -'VENDETTA' - -[KM1_A] -Mia sorella mi ha parlato bene di te, - -[KM1_E] -anche se credo ancora che voi gaijin siete tutti quanti deludenti. - -[KM1_B] -Forse mi potresti aiutare a risolvere una situazione che si sta rilevando svantaggiosa. - -[KM1_F] -Chiaramente il fallimento ha le sue conseguenze. - -[KM1_C] -Un Kambu della Yakuza è tenuto in custodia per essere processato. - -[KM1_G] -È un elemento importante della famiglia. - -[KM1_H] -Liberalo e portalo al dojo a Bedford Point. - -[KM1_D] -Grazie per la tua azione altruista. Se avrai mai bisogno di aiuto, il dojo sarà onorato di fornirti due uomini pronti ad affiancarti. - -[KM1_1] -~g~Ruba una macchina della polizia! - -[KM1_2] -Installa una bomba sulla macchina! - -[KM1_3] -~g~Raggiungi il dojo della Yakuza. - -[KM1_5] -~g~Adesso raggiungi la stazione di polizia. - -[KM1_6] -Installa una bomba sulla macchina! - -[KM1_7] -~g~Solo mezzi della polizia autorizzati! - -[KM1_9] -~r~Non hai utilizzato un'auto esplosiva per distruggere il muro! - -[KM1_10] -~r~Il Kandu della Yakuza è morto - insieme al tuo onore! - -[KM1_11] -~r~Hai attirato la sventura su di te! - -[KM2_A] -Non è consigliabile sottovalutare l'importanza dell'etichetta in questo ambiente. - -[KM2_B] -Un uomo mi ha fatto una volta un favore e io non ho avuto l'opportunità di ricambiare la sua gentilezza. - -[KM2_C] -La persona in questione ha la passione delle automobili e mi ha richiesto alcuni modelli per la sua collezione. - -[KM2_F] -Il mio onore lo richiede. - -[KM2_2] -~g~Macchine consegnate. - -[KM3_A] -Quando i problemi insorgono, lo stolto mostra la schiena mentre il saggio si prepara ad affrontarli. - -[KM3_B] -Il Cartello Colombiano ha ignorato ripetutamente le nostre richieste di non interferire con i nostri interessi a Liberty. - -[KM3_C] -Adesso stanno negoziando con i Giamaicani per nel tentativo di umiliarci ulteriormente. - -[KM3_D] -Stanno completando un accordo in città. - -[KM3_F] -Prendi uno dei miei uomini, ruba una macchina degli Yardie e vai a porgere i miei saluti ai Colombiani. - -[KM3_E] -Il nostro onore richiede che nessuno di loro sopravviva. - -[KM3_2] -~g~Vai a prendere il tuo contatto. - -[KM3_3] -~g~L'incontro si svolge nel parcheggio dell'ospedale a Rockford! - -[KM3_4] -~r~Sono fuggiti! - -[KM3_6] -~g~Uccidili, uccidili tutti quanti! - -[KM3_8] -~g~Hai bisogno di una macchia degli Yardie per completare questa missione! - -[KM3_9] -~r~Uno dei Colombiani è morto: l'accordo è saltato. - -[KM3_10] -~r~Il contatto è morto! - -[KM4_A] -Per essere veramente forte, non devi mai mostrare debolezze. - -[KM4_C] -Vai e raccogli immediatamente i soldi per farli riciclare dal Casinò. - -[KM4_1] -Non ti posso pagare e non lo fare neanche se potessi! - -[KM4_9] -Alcuni delinquenti da strapazzo mi hanno appena rapinato! Hanno preso tutto quanto! - -[KM4_2] -La vostra protezione è nulla. - -[KM4_10] -E tu saresti della Yakuza? Con quella faccia? - -[KM4_3] -Non è per questo che vi pago; se volevo essere protetto così bene mi affidavo alla polizia. - -[KM4_4] -~g~Punisci la gang responsabile del furto dei ~b~soldi~g~! - -[KM4_7] -~r~Il negoziante ha respirato per l'ultima volta! - -[KM4_5] -Donald Love vorrebbe che tu passassi a trovarlo nel suo giardino. - -[KM4_6] -Ci sono soldi dappertutto! - -[KM4_8] -~g~Valigetta raccolta! - -[KM5_A] -TU! Che piacevole coincidenza vedere il tuo sporco muso proprio adesso! - -[KM5_B] -Sembrerebbe che i tuoi vani tentativi di dissuadere i Giamaicani - -[KM5_B1] -a collaborare con il Cartello siano miseramente falliti! - -[KM5_C] -Gli spacciatori Yardie stanno vendendo lo SPANK per ogni strada come se si trattasse di hotdog! - -[KM5_D] -I maiali del Cartello stanno ridendoci dietro! - -[KM5_E] -Ti darò un'ultima possibilità per provarmi che la fiducia a te data da mia sorella non era del tutto infondata. - -[KM5_F] -Abbatti tutti i nostri avversari e lava il tuo onore nel loro sangue!!! - -[KM5_3] -~r~Hai fallito nell'eliminare almeno ~1~ Yardie. - -[KM5_4] -~g~Congratulazioni, hai eliminato ~1~ Yardie. - -[KM5_5] -~g~Congratulazioni, hai eliminato ~1~ Yardie. BONUS ~1~$ - -[RM1] -'FAI TACERE L'UCCELLINO' - -[RM3] -'ELIMINA LE PROVE' - -[RM4] -'FUORI A PESCARE' - -[RM5] -'STRONCA L'INFILTRATO' - -[RM1_D] -Si trova sotto protezione in un palazzo della sicurezza testimoni. Il suo appartamento è dietro al parcheggio. - -[RM1_E] -Dai fuoco al palazzo per farlo uscire allo scoperto e fai in modo che non parli mai più. - -[RM1_1] -~g~Controlla l'appartamento della sicurezza testimoni. - -[RM1_2] -~g~Elimina McAffrey! - -[RM2_A1] -Ehi ragazzo, da questa parte! - -[RM2_A] -Un mio vecchio amico ha uno spaccio d'armi a Rockford. - -[RM2_D] -Ha bisogno di una mano ed è pronto a farti uno scontro sui migliori armamenti in circolazione. - -[RM2_E] -Ray ha appena chiamato... non credevo però che saresti venuto da solo. - -[RM2_F] -Bene, tre pistole sono meglio di una: prendete ciò che vi serve. - -[RM2_G] -~g~Vai a parlare con Phil! - -[RM2_H] -~r~Phil è stato ucciso!!! - -[RM2_L] -Ehi! Se avessi avuto te come compagno in Nicaragua, probabilmente avrei ancora il braccio. - -[RM2_N] -Lascia qua il bottino e vattene: mi occuperò io dei poliziotti. - -[RM3_D] -Le prove sono trasportate da un veicolo attraverso la città. - -[RM3_E] -Dovrai speronare quella macchina e raccogliere ogni prova che lascerà cadere. - -[RM3_F] -Quando le avrai raccolte tutte, lasciale in macchina e dalle fuoco. - -[RM3_G] -Sono sicuro che non avrai problemi a gestire la faccenda. - -[RM3_1] -~g~Lascia le prove in macchina e dalle fuoco. - -[RM3_4] -~g~L'accusa ha fatto cadere delle prove! - -[RM3_6] -~r~Le foro saranno sparse per tutta Liberty! - -[RM3_7] -~g~Adesso dai fuco alla macchina! - -[RM4_A] -Inizio a pensare che il mio socio sia una talpa. - -[RM4_C] -Esce fuori a pescare sulla sua imbarcazione quasi tutte le notti vicino al faro di Portland. - -[RM4_D] -Ruba una lancia della polizia e manda a fondo i suoi piani doppiogiochisti! - -[RM4_1] -~g~Ruba una lancia della polizia. - -[RM4_2] -~g~Raggiungi il faro e affonda il socio di Ray! - -[RM5_A] -Fottuto inutile! - -[RM5_A1] -Hai combinato un vero casino! Sono con il culo scoperto perché non sei neanche capace di ammazzare una mosca. - -[RM5_B] -Ti ho pagato profumatamente per eliminare il testimone ed è ancora vivo! - -[RM5_B1] -E oggi deve fare una deposizione ai federali! - -[RM5_C] -Sta per essere trasferito dall'ospedale Carson fino a Rockford. - -[RM5_D] -Se canta sono fregato... - -[RM5_E] -per cui vai ed esegui il lavoro per cui sei stato pagato! - -[RM5_1] -~g~Intercetta l'ambulanza. - -[RM5_2] -~g~Sei stato individuato!!! - -[RM5_3] -~g~Era un diversivo! - -[RM5_4] -~g~I proiettili non scalfiranno la blindatura!!! - -[RM5_5] -~g~La blindatura è ignifuga!!! - -[RM5_7] -~r~Il testimone è arrivato a destinazione!!! - -[RM5_8] -~g~Il testimone è affogato!!! - -[LOVE2] -'SPAZZA VIA WAKA-GASHIRA' - -[LOVE3] -'UNA GOCCIA NELL'OCEANO' - -[LOVE1_A] -Prima di tutto grazie per aver risolto il problema personale... - -[LOVE1_F] -La gente crede a tutto in questi giorni. - -[LOVE1_D] -Stanno cercando di estorcermi altri fondi, ma a me non piace chi ritratta all'ultimo minuto. - -[LOVE1_E] -Un patto è un patto, per cui non gli sgancerò neppure un altro penny. - -[LOVE1_G] -Vai a salvare il mio amico: fai tutto ciò che si rivelerà necessario. - -[LOVE1_2] -~g~Salva il vecchietto orientale. - -[LOVE1_3] -~g~Riporta il vecchietto orientale all'edificio di Donald Love. - -[LOVE1_4] -~g~Il vecchietto orientale deve trovarsi in uno dei garage... - -[LOVE1_6] -~r~Le interiora del vecchietto orientale sono sparse per tutta la strada! - -[LOVE1_7] -~g~Il cancello verrà aperto solo per un'auto dei Colombiani. - -[LOVE2_A] -Niente abbassa i prezzi degli immobili quanto una bella guerra fra gang... - -[LOVE2_B] -tranne forse un'epidemia di peste... ma potrebbe non essere la soluzione migliore in questo caso. - -[LOVE2_C] -È evidente chi la Yakuza e i Colombiani non sono amici per la pelle. - -[LOVE2_D] -Perché non investire in questa opportunità? - -[LOVE2_E] -Voglio che tu uccida il Waka-Gashira della Yakuza, Kenji Kasen. - -[LOVE2_F] -Kenji partecipa a un incontro al parcheggio all'ultimo piano di un palazzo a Newport. - -[LOVE2_G] -Recupera una macchina del Cartello ed eliminalo! - -[LOVE2_H] -La Yakuza deve dare la colpa al Cartello per questa dichiarazione di guerra. - -[LOVE2_1] -~g~Raggiungi Fort Staunton e ruba una macchina dei Colombiani! - -[LOVE2_2] -~g~Raggiungi il ~p~palazzo a Newport~g~ ed elimina Kenji! - -[LOVE2_3] -~r~Se procedi con una macchina non del Cartello, verrai identificato!!! - -[LOVE2_4] -~r~Gli uomini della Yakuza ti hanno identificato!!! - -[LOVE2_6] -~r~Hai ucciso tutti i testimoni!!! - -[LOVE3_A] -In questi giorni di ipocrisia globale, alcune piacevoli comodità potrebbero essere difficili da importare. - -[LOVE3_C] -Farò depositare alcuni pacchi in mare. - -[LOVE3_D] -Assicurati di raccoglierli prima che qualcun altro lo faccia. - -[LOVE3_1] -~g~Recupera un'~r~imbarcazione~g~ e insegui l'~y~aeroplano~g~! - -[LOVE4] -'GRAND THEFT AERO' - -[LOVE5] -'SERVIZIO DI SCORTA' - -[LOVE4_A] -Grazie per aver recuperato i pacchi, ma si trattava solo di un diversivo. - -[LOVE4_B] -Mi dispiace, ma sono gli inconvenienti del mestiere. - -[LOVE4_C] -Il mio vero obiettivo era nascosto all'interno dell'aereo. - -[LOVE4_F] -Ho corrotto gli ufficiali. - -[LOVE4_1] -~r~Il Cartello Colombiano è in zona!!! - -[LOVE4_2] -~g~Il pacco è scomparso! Scova i Colombiani e recuperalo! - -[LOVE4_3] -~g~Panlantic Construction...? - -[LOVE4_5] -~g~Il pacco dovrebbe essere a bordo dell'aereo... - -[LOVE4_6] -~g~Prendi l'ascensore fino alla cima della torre! - -[LOVE5_B] -Il mio amico orientale ha bisogno di una scorta mentre porta la mia ultima acquisizione a far autenticare. - -[LOVE5_1] -~g~Procedi! - -[LOVE5_2] -~g~Avrai bisogno di una macchina! - -[LOVE5_3] -~g~Vai avanti a esplorare l'uscita dal sottopassaggio! - -[LOVE5_4] -~r~Proteggi il camion! - -[RM6] -'RICERCATO' - -[RM6_A] -Non sei stato seguito? Bene. - -[RM6_B] -Adesso basta, sono nei guai fino alla gola e sto iniziando a sprofondare! - -[RM6_D] -Sono ricercato, me la batto. - -[RM6_E] -Portami al mio volo all'aeroporto e non te ne pentirai! - -[RM6_666] -Prenditi cura della mia Patriot antiproiettile. Ci vediamo a Miami! Ray - -[CAT1] -'RISCATTO' - -[CAT2] -'LO SCAMBIO' - -[CAT1_A] -Ho la tua cara Maria. Non credo tu voglia che la sua faccia finisca come una polpetta per cani, vero? - -[CAT2_F] -Mi sono rotta un'unghia e i miei capelli sono un disastro. Ma ci puoi credere? Mi è costato 50 dollari! - -[CAT2_G] -Ero così spaventata, ma mi sono detta: adesso sei una signorina. - -[CAT2_H] -Oh, ci divertiremo un mondo! Mia sorella mi ha detto che verrà a stare con me insieme ai suoi due figli - -[CAT2_I] -poiché suo marito continua a tradirla a ogni occasione... - -[CAT1_C] -XXXX - -[CAT1_D] -XXXX - -[CAT1_E] -XXXX - -[CAT1_F] -Raggiungi Catalina prima dello scadere del tempo! - -[CAT1_G] -XXXX - -[CAT1_H] -XXXX - -[CAT1_I] -XXXX - -[CAT1_J] -XXXX - -[CAT1_K] -XXXX - -[CAT1_L] -XXXX - -[AS4_1] -XXXX - -[CAT_MON] -~g~Non hai abbastanza soldi. Ti servono 500.000$. - -[BITCH_D] -~g~Maria è morta! - -[WEATHER] -TEMPO AVVERSO - -[WEATHE2] -TEMPO NORMALE - -[8001] -Hai fallito miseramente!!! - -[1000] -SEI MORTO - -[1001] -SEI MORTO - -[1002] -SEI MORTO - -[1003] -SEI MORTO - -[1004] -SEI MORTO - -[1005] -SEI STATO CATTURATO - -[1006] -SEI STATO CATTURATO - -[1007] -SEI STATO CATTURATO - -[1008] -SEI STATO CATTURATO - -[1009] -SEI STATO CATTURATO - -[GA_4] -Le bombe per le macchine costano 1000$ - -[GA_5] -La tua macchina ha già una bomba installata. - -[GA_6] -Parcheggiala, attivala premendo il ~h~tasto ~k~~PED_FIREWEAPON~~w~ e DATTELA A GAMBE! - -[GA_7] -Arma la bomba con il ~h~tasto ~k~~PED_FIREWEAPON~~w~: esploderà non appena qualcuno cercherà di avviarla. - -[GA_8] -Usa il detonatore per attivare la bomba. - -[GA_9] -Hai raccolto ~1~ su 10 macchine speciali - -[GA_10] -Non male. Eccoti ~1~$ - -[GA_11] -Ne abbiamo già una. A noi non serve! - -[GA_12] -Bomba innescata - -[GA_13] -Un furto da manuale. Completa la lista e ci sarà un bonus per te. - -[GA_14] -Hai portato tutte le macchine. BENE! Eccoti un riconoscimento... - -[GA_15] -Spero che ti piaccia il nuovo colore. - -[GA_16] -La riverniciatura non è necessaria. - -[GA_19] -Non siamo interessati a questo modello. - -[GA_20] -Di questo modello ne abbiamo in abbondanza. Mi dispiace, non siamo interessati. - -[CR_1] -La gru non può alzare questo veicolo. - -[PU_MONY] -Non hai abbastanza soldi. - -[CO_ALL] -Li hai presi tutti. Eccoti un piccolo extra... - -[PAUSED] -PAUSA - -[HEALTH1] -Via di qui! Sei in perfetta forma. - -[HEALTH2] -L'assistenza medica costa. - -[HEALTH3] -Ti rimetterò in sesto. - -[HEALTH4] -Fanno 250$. - -[FEB_STA] -Statistiche - -[FEB_BRI] -Briefing - -[FEB_CON] -Comandi - -[FEB_AUD] -Audio - -[FEB_DIS] -Video - -[FEB_LAN] -Lingua - -[FEP_STA] -STATISTICHE - -[FEP_BRI] -BRIEFING - -[FEP_CON] -COMANDI - -[FEP_AUD] -AUDIO - -[FEP_DIS] -VIDEO - -[FEP_LAN] -LINGUA - -[FEF_ST1] -Chi è il vero cattivo? - -[FEF_ST2] -Che casino hai scatenato? - -[FEF_BR1] -Hai perso il filo? - -[FEF_CO1] -Hai bisogno di altri controlli? - -[FEF_CO2] -Scegli la configurazione più adatta al tuo stile di gioco - -[FEF_SA1] -Pensa alla tua posizione, salvala! - -[FEF_SA2] -Salva e carica le partite - -[FEF_AU1] -Pompa il volume! - -[FEF_AU2] -Scegli la stazione radio e gli effetti - -[FEF_DI1] -Cambia il gioco! - -[FEF_DI2] -Personalizza il gioco per la tua TV - -[FEF_LA1] -What you talking about willis? Che cavolo stai dicendo Willis? - -[FEF_LA2] -Scegli il tuo gergo preferito - -[FEB_PMB] -Brifing di missione precedenti: - -[FEC_NA] -NA - -[FEC_CWL] -Scorri armi a sinistra - -[FEC_CWR] -Scorri armi a destra - -[FEC_LOF] -Guarda avanti - -[FEC_TAR] -Bersaglio - -[FEC_MOV] -Movimento - -[FEC_CAM] -Modalità telecamera - -[FEC_PAU] -Pausa - -[FEC_ENV] -Sali sul veicolo - -[FEC_JUM] -Salta - -[FEC_ATT] -Attacca o fuoco con arma - -[FEC_RUN] -Corri - -[FEC_FPC] -Visuale in prima persona - -[FEC_LL] -Guarda a sinistra - -[FEC_LB1] -Guarda - -[FEC_LB2] -indietro - -[FEC_LB] -Guarda indietro - -[FEC_LR] -Guarda a destra - -[FEC_HOR] -Clacson - -[FEC_VES] -Comandi veicolo - -[FEC_RSC] -Cambia stazione radio - -[FEC_BRA] -Freno o retromarcia - -[FEC_HAB] -Freno a mano - -[FEC_CAW] -Arma vettura - -[FEC_ACC] -Accelera - -[FEC_SMT] -Attivatore missione speciale - -[FEC_CCF] -Configurazione: - -[FEC_CF1] -Config1 - -[FEC_CF2] -Config2 - -[FEC_CF3] -Config3 - -[FEC_CF4] -Config4 - -[FEC_CDP] -Schermata controller: - -[FEC_ONF] -A piedi - -[FEC_INC] -In macchina - -[FEC_VIB] -Vibrazione: - -[FEA_OUT] -Uscita: - -[FEA_ST] -Stereo - -[FEA_MNO] -Mono - -[FEA_NON] -Nessuna - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -CHATTERBOX 109 - -[FED_DBG] -Menu Debug - -[FED_RID] -Reload IDE - -[FED_RIP] -Reload IPL - -[FED_PAH] -Parse Heap - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Big White Debug Light Switched - -[FED_SPR] -Show Ped Road Groups - -[FED_SCR] -Show Car Road Grups - -[FED_SCZ] -Show Cull Zones - -[FED_DSR] -Debug Streaming Requests - -[FED_SCP] -gbShowCollisionPolys - -[FEM_MCM] -Memory Card Menu - -[FEM_RMC] -Registra MEMORY CARD uno - -[FEM_TFM] -Test Format MemCard One - -[FEM_TUM] -Test UnFormat MemCard One - -[FEM_CRD] -Create Root Dir - -[FEM_CLI] -Crea e carica icone - -[FEM_FFF] -Riempi il primo file con fuffa - -[FEM_SOG] -Salva solo la partita - -[FEM_CES] -Verifica ogni salvataggio 0kB4 - -[FEM_STG] -Salva la partita - -[FEM_STS] -Salva la partita con il nome GTA3 - -[FEM_CPD] -Crea una cartella mag protetta - -[FEM_MC2] -Memory Card Menu 2 - -[FEM_TS] -Prova salvataggio: - -[FEM_TL] -Prova caricamento: - -[FEM_TD] -Prova eliminazione: - -[PL_STAT] -Statistiche giocatore - -[PE_WAST] -Persone massacrate - -[PE_WSOT] -Persone massacrate da altri - -[CAR_EXP] -Macchine esplose - -[TM_BUST] -Tempi battuti - -[M_WASTE] -Uomini civili massacrati - -[F_WASTE] -Donne civili massacrate - -[PIG_WST] -Poliziotti massacrati - -[GNG_WST] -Membri delle gang massacrati - -[MED_WST] -Medici massacrati - -[FIRE_WS] -Pompieri massacrati - -[DED_CRI] -Criminali massacrati - -[DED_DED] -Scrocconi massacrati - -[DED_HOK] -Prostitute massacrate - -[HEL_DST] -Elicotteri distrutti - -[PER_COM] -Percentuale completata - -[KGS_EXP] -Kg di esplosivi utilizzati - -[ACCURA] -Accuratezza - -[ELBURRO] -Miglior tempo di corsa in sec - -[CAR_CRU] -Macchine distrutte - -[HED_EX] -Teste esplose - -[TM_DED] -Visite in ospedale - -[DAYSPS] -Giorni trascorsi nel gioco - -[MMRAIN] -Pioggia caduta in mm - -[MXCARD] -Distanza max salto FOLLE (ft) - -[MXCARJ] -Altezza max salto FOLLE (ft) - -[MXCARDM] -Distanza max salto FOLLE (m) - -[MXCARJM] -Altezza max salto FOLLE (m) - -[MXFLIP] -Numero max ribaltamenti FOLLI in aria - -[MXJUMP] -Numero max rotazioni FOLLI in aria - -[BSTSTU] -Migliore acrobazia FOLLE: - -[INSTUN] -Acrobazia folle - -[PRINST] -Acrobazia folle perfetta - -[DBINST] -Doppia acrobazia folle - -[DBPINS] -Doppia acrobazia folle perfetta - -[TRINST] -Tripla acrobazia folle - -[PRTRST] -Tripla acrobazia folle perfetta - -[QUINST] -Quadrupla acrobazia folle - -[PQUINS] -Quadrupla acrobazia folle perfetta - -[NOSTUC] -Nessuna acrobazia FOLLE effettuata - -[NOUNIF] -Acrobazie uniche effettuate - -[NOUNGM] -Acrobazie uniche complessive - -[NMISON] -Missioni provate - -[NMMISP] -Missioni superate - -[PASDRO] -Passeggeri scaricati - -[MONTAX] -Soldi guadagnati in taxi - -[DAYPLC] -Spesa giornaliera polizia - -[CRIMRA] -Livello criminalità: - -[GMSTOR] -Negozio dei giochi - -[PREBRF] -Briefing precedenti - -[CNTLS] -Comandi - -[MUSMEN] -Musica-FX - -[GAMSET] -Impostazioni - -[LANGUA] -Lingua - -[DSPLAY] -Video - -[DEBUGM] -Menu di debug - -[QUITOP] -Esci dalle opzioni - -[CONTRL] -Configurazione comandi - -[SET1EN] -Configurazione 1. Abilitata. - -[SET1] -Configurazione 1 - -[SET2EN] -Configurazione 2. Abilitata. - -[SET2] -Configurazione 2 - -[SET3EN] -Configurazione 3. Abilitata. - -[SET3] -Configurazione 3 - -[SET4EN] -Configurazione 4. Abilitata. - -[SET4] -Configurazione 4 - -[GOBACK] -Indietro - -[SOUND] -SONORO - -[MUSVOL] -Volume musica - -[SFXVOL] -Volume FX - -[SCROPT] -OPZIONI SCHERMO - -[CTRSCR] -Centra schermo - -[SCRFOR] -Formato schermo - -[GMSVLQ] -SALVA-CARICA-ESCI - -[GMREST] -Ricomincia partita - -[NOGMSV] -Puoi salvare solo al tuo nascondiglio. - -[DLFILE] -Elimina i file di Grand Theft Auto III - -[CHFILE] -SCEGLI IL FILE DA CARICARE - -[CHCDLD] -Choose Card to Load From - -[CDUNFR] -Card is unformatted. - -[CHFIDL] -SCEGLI IL FILE DA CANCELLARE - -[SVCONF] -SALVA CONFERMA - -[SVFNAM] -Il nome del tuo salvataggio è - -[SAVEDN] -Errore. Salvataggio non completato. - -[LANGSL] -SCELTA LINGUA - -[ENGLIS] -Inglese - -[GERMAN] -Tedesco - -[ITALIA] -Italiano - -[FRENCH] -Francese - -[SPAIN] -Spagnolo - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[PARSHP] -Parse Heap - -[DBGFON] -CTheScripts::DbgFlag On - -[DBFOFF] -CTheScripts::DbgFlag Off - -[BGWHON] -Big White Debug Light Switched On - -[BGWOFF] -Big White Debug Light Switched Off - -[DSTRON] -Debug Streaming Requests On - -[DSTROFF] -Debug Streaming Requests Off - -[PDRGON] -ShowPedRoadGroups On - -[PRGOFF] -ShowPedRoadGroups Off - -[CRRGON] -ShowCarRoadGroups On - -[CRGOFF] -ShowCarRoadGroups Off - -[CLZOON] -Show Cull Zones On - -[CLZOOF] -Show Cull Zones Off - -[SHPLON] -gbShowCollisionPolys On - -[SHPLOF] -gbShowCollisionPolys Off - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[FORMM1] -FormatMemCard 1 (teststuff) - -[UNFRM1] -UnFormatMemCard 1 (teststuff) - -[GORLEV] -Livello violenza - -[SICASS] -Stupro - -[SICSIC] -Stupratore - -[SCASSL] -Stupro selezionato - -[SCSCSL] -Stupratore selezionato - -[PRVMEN] -Briefing di missione precedente - -[DOSVGM] -Vuoi salvare la partita? - -[FORMEN] -Format Menu - -[MEMTST] -MemoryCardTest screen - -[REGCAR] -Register MemoryCard One - -[TEFONE] -Test Format MemCard One - -[TEUFON] -Test UnFormat MemCard One - -[CRROOT] -CreaDirRoot - -[CRLDIC] -Crea e carica icone - -[FLFSGF] -Riempi il primo file con fuffa - -[PUSAVE] -Salva solo il gioco - -[CHEVOK] -VerificaOgniSalvataggioOKB4 - -[SVGMON] -SalvaIlGioco - -[CNTSAV] -Impossibile salvare il gioco, sei in missione. - -[CNCSAV] -Impossibile salvare il gioco, sei in macchina. - -[CRMGSV] -Crea cartella magazine protetta - -[MGSVCN] -Cartella Magazine creata - -[MGSVNC] -Cartella Magazine non creata - -[YES] -Sì - -[NO] -No - -[X] -x - -[LAST] -Ultimo messaggio. - -[FEDS_XB] -Selezione - -[FEDS_ST] -Tasto START - RIPRENDI - -[FEST_OO] -su - -[FEC_TUC] -Torretta di controllo - -[FEC_SM3] -Attivazione missione speciale (tasto R3) - -[FEC_RS3] -Stazioni radio (tasto L3) - -[FEC_HO3] -Clacson (tasto L3) - -[DIAB1] -'TURISMO' - -[DIAB2] -'IO GRIDO, TU GRIDI' - -[DIAB3] -'BATTESIMO DEL FUOCO' - -[DIAB4] -'GROSSO E ARTERIOSO' - -[DIAB1_A] -El Burro ti vuole offrire un'opportunità. Vai alla cabina telefonica di Hepburn Heights se vuoi saperne di più. - -[DIAB1_C] -Sei un pilota provetto. Ripassa per la cabina telefonica, 'El Burro' potrebbe avere altro lavoro per te. - -[DIAB1_1] -~g~3..2..1.. VIA VIA VIA! - -[DIAB1_4] -~g~Procurati un'auto veloce e vai alla griglia di partenza. - -[DIAB1_3] -~r~Non riusciresti a vincere neanche una lotteria, FALLITO! - -[DIAB1_2] -~g~Congratulazioni, hai vinto con l'incredibile tempo di ~1~ secondi. - -[FIRST] -~g~Primo - -[SECOND] -~g~Secondo - -[THIRD] -~g~Terzo - -[FOURTH] -~g~Quarto - -[DIAB2_1] -~g~Prendi la valigia ad Harwood. - -[DIAB2_2] -~g~Trova un furgone dei gelati. - -[DIAB2_3] -~g~Parcheggia il furgone dei gelati al molo atlantico. - -[DIAB2_4] -~g~Premi il ~w~tasto ~k~~VEHICLE_HORN~ ~g~per attivare il campanello. - -[DIAB2_6] -~g~Premi il ~w~tasto ~k~~VEHICLE_HORN~ ~g~per attivare il campanello. - -[DIAB2_7] -~g~Premi il ~w~tasto ~k~~VEHICLE_HORN~ ~g~per attivare il campanello. - -[DIAB2_5] -~g~Esci dal furgone dei gelati e usa il telecomando per farlo esplodere. - -[YD1] -'BLING-BLING SCRAMBLE' - -[YD2] -'UZI RIDER' - -[YD3] -'CORSA TRA GANGSTER' - -[YD4] -'VENGA IL TUO REGNO' - -[YD_P] -King Courtney vuole parlarti. Vai alla cabina telefonica ad Aspatria! - -[YD1_A] -~w~Sono King Courtney. - -[YD1_A1] -~w~Alla mia cricca Yardie servirebbe un buon autista e tu hai un'ottima reputazione. - -[YD1_B] -~w~Vai in macchina alla discarica dalla parte opposta dello stadio e aspetta gli altri aspiranti. - -[YD1_C] -~w~Ho uomini di guardia in postazioni sparse per tutta Staunton. - -[YD1_D] -~w~Il primo pilota che raggiunge una postazione prende $1000, e cosi via fino alla tappa successiva. - -[YD1_D1] -~w~Se raggiungi per primo più postazioni degli altri piloti, potrei avere del lavoro per te. - -[YD1_E] -~g~Preparati alla gara! - -[YD1_F] -~g~Hai anticipato la partenza; mi piace il tuo stile! - -[YD1_G] -~r~È una GARA AUTOMOBILISTICA. Ti serve un'AUTO, idiota! - -[YD1GO] -~g~VIA! - -[YD1_1] -~r~1 - -[YD1_2] -~r~2 - -[YD1_3] -~r~3 - -[YD1_BON] -$1000! - -[Y1_1ST] -~g~Sei arrivato primo con ~1~ postazioni! - -[Y1_2ND] -~y~Sei arrivato secondo con ~1~ postazioni. ~y~Non male, ma non sei il migliore! - -[Y1_3RD] -~r~Sei arrivato terzo con ~1~ postazioni. ~r~Credevo avessi detto di essere in gamba! - -[Y1_LAST] -~r~Sei arrivato ultimo! ~r~Mi hai fatto perdere tempo, IDIOTA! - -[Y1_J1ST] -~y~Primo a pari merito con ~1~ postazioni. ~y~Bravo, ma devi essere il migliore per guidare per Queen Lizzy! - -[Y1_J2ND] -~r~Secondo a pari merito con ~1~ postazioni. Guidi come una scimmia impazzita! - -[Y1JLAST] -~r~Ultimo a pari merito! Sei più veloce con la lingua che con l'auto! - -[Y1_TEST] -AUTO IN ACQUA! - -[YD2_A] -~w~Devo vedere se sei in grado di eseguire certi lavoretti per me. - -[YD2_A1] -~w~Vediamo se ci si può fidare di te. - -[YD2_B] -~w~Due dei miei ragazzi saranno lì a momenti per accompagnarti in un giro: - -[YD2_B1] -~w~vedremo se sei davvero chi dici di essere. - -[YD2_C] -~w~Andiamo a fare un giro a Hepburn Heights: levaci di torno alcuni di quei luridi Diablo che mancano di rispetto a Queen Lizzy. - -[YD2_CC] -~w~Prendi, ti serviranno 'i ferri del mestiere'. - -[YD2_D] -~w~Dovrai guidare e sparare. Noi faremo in modo che tu non finisca al creatore. - -[YD2_E] -~w~Comincia a guidare! - -[YD2_F] -~r~Ci è scappato! Facciamo secco quel bastardo muso giallo!!! - -[YD2_G1] -~w~Hepburn Heights... Facciamo fuori qualche lurido Diablo... - -[YD2_G2] -~w~Ma ricorda: ~r~non pensare di uscire da quest'auto! - -[YD2_H] -~w~OK, riportaci nel territorio di Yardie! VIA VIA VIA!!! - -[YD2_L] -~w~Bel lavoro, Cecchino! - -[YD2_M] -~r~Ha distrutto la mia auto! Fallo secco! - -[YD2_N] -~w~Rimetti il culo in macchina! - -[YD3_A] -Devi rubare alcune auto delle gang avversarie - -[YD3_A1] -per poter colpire nel loro territorio. - -[YD3_B] -Mi serve una Sentinel della Mafia, - -[YD3_B1] -una Stinger della Yakuza e uno - -[YD3_B2] -Stallion dei Diablo per poter attaccare qualunque gang di Liberty. - -[YD3_C] -Parcheggiale nel garage a Newport e ricorda, - -[YD3_C1] -se le distruggi sono inutilizzabili! - -[YD3_D] -Etichetta testo aggiuntiva - -[YD3_E] -~r~Hai già rubato un'auto dei Diablo! - -[YD3_F] -~r~Hai già rubato un'auto della Mafia! - -[YD3_G] -~r~Hai già rubato un'auto della Yakuza! - -[YD3_H] -~g~Auto dei Diablo rubata! - -[YD3_I] -~g~Auto della Mafia rubata! - -[YD3_J] -~g~Auto della Yakuza rubata! - -[YD3_K] -~r~L'auto è quasi un rottame! Falla riparare! - -[YD3_L] -~g~Portala al ~p~garage! - -[YD3_M] -~r~Hai cappottato l'auto! Procuratene un'altra! - -[YD4_A] -Stammi a sentire! - -[YD4_A1] -Arriva fino a Bedford Point. - -[YD4_A2] -C'è della roba nascosta in una vecchia automobile che mi serve subito! - -[YD4_B] -LETTERA: Ho saputo che ti sei dato da fare. Beh mi sono data da fare anch'io. - -[YD4_C] -Credo sia ora che tu provi il vero potere dello 'SPANK'! Baci e abbracci, Catalina, con amore. - -[YD4_D] -PS: MUORI CANE BASTARDO, MUORI! - -[YD4_1] -Pazzi strafatti di SPANK! - -[YD4_2] -Distruggi i camion di SPANK! - -[HM_1] -'SOLDI E UZI' - -[HM_2] -'STERMINATOR' - -[HM_3] -'PRONTO A ESPLODERE' - -[HM_5] -'RISSA' - -[HOOD1_A] -Raggiungi il telefono pubblico dei giardini Wichita se vuoi parlare d'affari. - -[HM1_A] -Ehi, sono D-Ice dei Red Jack! - -[HM1_C] -Questi stronzetti scorrazzano per le strade con nient'altro che armi e SPANK nella testa. - -[HM1_3] -~g~I 'Nine' controllano il territorio dei giardini Wichita. - -[HM2_3] -Se colpisci i pneumatici, il maggiolino radiocomandato esploderà! - -[HM2_4] -Se supera la portata massima, il maggiolino radiocomandato esploderà! - -[HM2_5] -~r~Fuori dalla portata massima! - -[HM3_1] -~g~Vai al garage, ma stai attento: se l'auto viene danneggiata troppo, salterà in aria! - -[HM3_2] -~g~Riporta l'auto in ottime condizioni: nessun danno! - -[HM3_3] -~g~Fai riparare l'auto! - -[HM4_D] -~g~Prendi un veicolo! - -[HM4_E] -TESTO NON PIÙ NECESSARIO - -[HM4_1] -~g~Dirigiti nel posto dove il carico s'è rovesciato: dovrai raccogliere almeno 30 lingotti. - -[HM4_2] -~g~Ricorda di raggiungere il garage e depositare il carico quando il veicolo diventa troppo pesante e lento. - -[HM5_3] -~r~Dovevi usare solo una mazza da baseball! - -[HM5_4] -~r~Il tuo intermediario è morto! - -[MEA1] -'L'IMBROGLIONE' - -[MEA2] -'I LADRI' - -[MEA3] -'LA MOGLIE' - -[MEA4] -'L'AMANTE' - -[MEAT1_A] -Un amico mi ha detto che puoi risolvermi dei problemi. Vai alla cabina telefonica a Trenton se credi di essere la persona giusta. - -[MEA1_B3] -~g~Devi incontrare il direttore della banca. - -[MEA1_B6] -~g~Porta l'auto dal rottamatore per distruggere le prove: esci dall'auto e la gru la raccoglierà. - -[MEA1_1] -~r~Il direttore della banca è morto! - -[MEA1_2] -~r~Ti era stato detto di rottamare il veicolo! - -[MEA1_3] -~g~Esci dalla macchina! - -[MEA1_4] -~r~Ti sei dimenticato del direttore della banca! - -[MEA2_B3] -~g~Vai a incontrare i ladri. - -[MEA2_B4] -~g~Accompagnali alla fabbrica di cibo per cani Bitch'n' Dog. - -[MEA2_B6] -~g~Fai riverniciare l'auto per eliminare ogni prova. - -[MEA2_1] -~r~Ti era stato detto di far rottamare il veicolo! - -[MEA2_2] -~r~Un ladro è morto! - -[MEA2_4] -~r~Ti sei dimenticato un ladro! - -[MEA3_B3] -~g~Vai a prelevare la signora Chonks. - -[MEA3_B6] -~g~Prendi l'auto e scaricala in mare: questo cancellerà ogni prova. - -[MEA3_1] -~r~La moglie è morta! - -[MEA3_2] -~r~Dovevi scaricare il veicolo in mare! - -[MEA3_3] -~r~Ti sei dimenticato di della moglie! - -[MEA4_B3] -~g~Vai a prendere l'amante della moglie. - -[MEA4_B6] -È davvero troppo tardi per farlo, Marty. Ti ho dato una chance, ma adesso prenderò io il controllo del tuo business... - -[MEA4_1] -~r~Carlos è morto! - -[MEA4_3] -~r~Ti sei dimenticato di Carlos lo strozzino! - -[LOOK_A] -Tieni premuto il ~h~tasto ~k~~VEHICLE_LOOKLEFT~ ~w~o il ~h~tasto ~k~~VEHICLE_LOOKRIGHT~~w~ per guardare a ~h~sinistra~w~ o a ~h~destra~w~ mentre sei nel veicolo. Premi entrambi i tasti per guardare ~h~indietro~w~. - -[LOVE6_1] -~g~Adesso attira gli sbirri lontano dai magazzini! - -[LOVE6_2] -~r~Non sei riuscito ad attirare gli sbirri abbastanza lontano! - -[RM4_3] -~r~Il socio di Ray è fuggito! - -[RM6_C] -La CIA sembra interessata allo SPANK - -[RM6_C1] -e non vogliono che interferiamo con il Cartello. - -[C_PASS] -MINACCIA ELIMINATA! - -[CTUTOR] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Vigilante. - -[CTUTOR2] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Vigilante. - -[COPCART] -~g~Hai ~1~ secondi per tornare a un mezzo della polizia prima che termini la missione. - -[C_FAIL] -Missione Vigilante terminata! - -[C_CANC] -~r~Missione Vigilante annullata! - -[C_ESCP] -~r~Il sospetto è fuggito! - -[C_TIME] -~r~È scaduto il tuo tempo come tutore della legge! - -[C_VIGIL] -BONUS VIGILANTE! - -[A_FAIL2] -~r~La tua scarsa sollecitudine è stata fatale al paziente! - -[A_FAIL3] -~r~Il paziente è morto! - -[A_PASS] -Salvato! - -[F_FAIL2] -~r~Sei arrivato tardi! - -[A_COMP2] -Non ti stancherai mai! - -[RM2_M] -Se ti servono armi da fuoco, passa di qui e prendi ciò che ti serve dagli armadietti. - -[HEAL_A] -La tua ~h~salute~w~ è indicata in color arancione in alto a destra sullo schermo. - -[YD1_CNT] -~1~ su 15! - -[FM1_9] -~g~Lì davanti c'è il party: fai scendere Maria all'ingresso. - -[FM1_Y] -~w~Sai, non mi divertivo così tanto da una vita, e mi hai trattato proprio bene. Con molto rispetto. - -[FM1_AA] -~w~Oh, devo andare. Spero di rivederti. - -[NOCONTE] -Ricollega il controller analogico (DUALSHOCK#) o controller analogico (DUALSHOCK#2) all'ingresso controller 1 per continuare. - -[WRCONT] -Il controller collegato all'ingresso controller 1 non è supportato. Grand Theft Auto III richiede un controller analogico (DUALSHOCK#) o (DUALSHOCK#2). - -[WRCONTE] -Il controller collegato all'ingresso controller 1 non è supportato. Grand Theft Auto III richiede un controller analogico (DUALSHOCK#) o controller analogico (DUALSHOCK#2). - -[WRONGCD] -Disco errato. Inserisci il disco corretto. - -[NOCD] -Il vano cassetto del disco è vuoto. Inserisci il disco. - -[OPENCD] -Il vano cassetto del disco è aperto. Chiudi il vano. - -[CDERROR] -Errore di lettura del DVD Grand Theft Auto III. - -[RESTART] -Avvio di una nuova partita - -[GA_3] -Niente più sconti. $1000 per la riverniciatura! - -[GA_1] -Wow! Non tocco niente di COSÌ caldo! - -[GA_1A] -Torna quando non sarai così occupato... - -[S_PROM2] -Nel garage qua accanto puoi parcheggiare un veicolo quando salvi la partita. - -[STOCK] -scorte esaurite - -[FM1_O] -~w~Credo si trovi alla stazione vicino al porto di Chinatown. - -[EBAL_B] -Siamo arrivati, togliamoci dalla strada e cerchiamo di cambiarci d'abito! - -[EBAL_G] -Questo è il club Luigi's. Passiamo dal retro attraverso la porta di servizio. - -[AM4_3] -Tu devi essere il nuovo tuttofare di Asuka! - -[AM4_4] -Hai i soldi? Tutto qui? - -[AM4_5] -So cosa pensi, un altro sbirro corrotto. - -[AM4_6] -Beh, il mondo è corrotto. - -[AM4_7] -Solo perché ho perso dei partner, quegli idioti degli Affari Interni hanno cominciato a curiosare. - -[AM4_8] -Immagino che sentano puzza di bruciato. - -[AM4_9] -Beh, questa città è una grande fogna. - -[AM4_10] -Mi servirà aiuto anche fuori dai sindacati. - -[AM4_11] -Se sei interessato, sai dove trovarmi. - -[CAM_A] -Premi il ~h~tasto ~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ per cambiare le ~h~modalità di visuale ~w~quando sei a piedi o in un veicolo. - -[CAM_B] -Premi il ~h~tasto direzionale in alto~w~ e ~h~in basso~w~ per cambiare le ~h~modalità di visuale ~w~quando sei a piedi o in un veicolo. - -[KM2_1] -~g~Ripara l'auto, sarà come nuova. - -[LM3_6] -Joey... - -[LM3_6A] -Mi farai giocare ancora col tuo pistone? - -[LM3_9A] -Potrebbe esserci del lavoro per te. - -[LM3_9B] -OK? - -[AWAY2] -~r~Sono scappati. - -[AWAY] -~r~È scomparso nel nulla! - -[JM6_1] -Raggiungi la banca sulla strada principale. - -[GA_6B] -Parcheggiala, innesca la bomba schiacciando il ~h~tasto ~k~~PED_FIREWEAPON~~w~ e BATTITELA! - -[GA_7B] -Innescala col ~h~tasto ~k~~PED_FIREWEAPON~~w~. La bomba esploderà quando si tenterà di avviare il motore. - -[BAT1] -~g~Prendi la mazza! - -[EBAL_O] -Se andrà tutto liscio, forse potrei darti altro lavoro. Adesso fuori di qui! - -[HELP9_B] -Premere il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisione. - -[HELP9_C] -Premere il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisione. - -[JM6_8] -~r~Hai perso tutti i rapinatori! - -[COLT_IN] -La pistola è adesso disponibile da AmmuNation! - -[TAXI2] -~r~Tempo scaduto! - -[TAXI3] -~r~Il passeggero è fuggito terrorizzato! - -[TAXI7] -~r~La tua auto è distrutta, falla riparare. - -[TAXI4] -Tariffa completa! - -[TAXI5] -BONUS VELOCITÀ! - -[TAXI6] -Missione taxi terminata - -[FRANGO] -~g~Salvatore vuole che tu aiuti prima Toni ad affrontare le Triadi! - -[PAGEB12] -Tangente per la Polizia consegnata al nascondiglio - -[PAGEB13] -Salute consegnata al nascondiglio - -[PAGEB14] -Adrenalina consegnata al nascondiglio - -[KM1_4] -~g~Ti serve un'auto della polizia per svolgere il lavoro! - -[CAT1_B] -Porta 500.000$ alla Villa a Cedar Grove. - -[JM2_C] -Ha un chiosco di spaghetti cinesi a China Town. - -[RM6_1] -Eccoti la chiave di un deposito. - -[RM6_2] -Troverai del denaro e alcune 'dotazioni' da utilizzare nei momenti difficili. - -[RM6_3] -Ci vediamo. - -[FE_INIP] -Inizializzazione e caricamento menu pausa... Un momento. - -[FESZ_CA] -Annulla - -[FESZ_QU] -Esci - -[FESZ_L1] -Partita salvata con successo! - -[FESZ_L2] -Il nome del file salvato è: - -[FESZ_OK] -OK - -[FES_LGA] -Carica partita - -[FES_NGA] -Nuova partita - -[FES_CAN] -Annulla - -[FESZ_QL] -Tutti i progressi della partita attuale non ancora salvati andranno perduti. Vuoi procedere con il caricamento? - -[FESZ_QD] -Vuoi eliminare questa partita salvata? - -[FESZ_QO] -Vuoi procedere con la sovrascrittura di questa partita salvata? - -[FESZ_QR] -Sei sicuro di voler iniziare una nuova partita? Tutti i progressi fatti fino all'ultimo salvataggio andranno perduti. Vuoi procedere? - -[FESZ_QS] -VUOI PROCEDERE CON IL SALVATAGGIO? - -[SLONFP] -Ingresso 1. File protetto. - -[T4X4_1] -'CAMPO DEL PATRIOTA' - -[T4X4_2] -'UN GIRO NEL PARCO' - -[T4X4_3] -'AFFERRATO' - -[MM_1] -'MASSACRO NEL PALAZZO' - -[T4X4_1A] -~g~Hai ~y~5 minuti~g~ per attraversare ~y~15~g~ punti di controllo. ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE~g~. - -[T4X4_1B] -~1~ su 15! - -[T4X4_1C] -~y~ATTRAVERSA~g~ il primo punto di controllo per attivare il timer. ~g~Ogni punto di controllo ti fornirà ~y~20 SECONDI~g~ extra. - -[T4X4_2A] -~g~Hai ~y~2 minuti~g~ per attraversare ~y~12~g~ punti di controllo!!! ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE~g~. - -[T4X4_2B] -~1~ su 12! - -[T4X4_2C] -~y~ATTRAVERSA~g~ il primo punto di controllo per attivare il timer. ~g~Ogni punto di controllo ti fornirà ~y~10 SECONDI~g~ extra. - -[T4X4_3A] -~g~Hai ~y~5 minuti~g~ per attraversare ~y~20~g~ punti di controllo!!! ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE~g~. - -[T4X4_3B] -~y~ATTRAVERSA~g~ il primo punto di controllo per attivare il timer. ~g~Ogni punto di controllo ti fornirà ~y~10 SECONDI~g~ extra. - -[T4X4_3C] -~1~ su 20! - -[T4X4_F] -~r~Sei scappato! Troppo difficile per te? - -[MM_1_A] -~g~Hai ~y~2 minuti~g~ per attraversare ~y~20 punti di controllo~g~ nel palazzo! ~g~Puoi attraversarli in ~y~QUALSIASI ORDINE~g~. - -[MM_1_B] -~1~ su 20! - -[MM_1_C] -~g~Sono 20 secondi più ~y~5 secondi~g~ per ogni punto di controllo. ~g~Il timer partirà ~y~IMMEDIATAMENTE~g~. - -[FM2_14] -~r~Ti sei avvicinato troppo e hai spaventato Ricciolino! - -[FM2_15] -~g~Non ti avvicinare troppo o Ricciolino si insospettirà! - -[UPSIDE] -~r~Hai cappottato la macchina! - -[FM2_16] -PAURIMETRO: - -[LM3_11] -~g~Misty non sale su un autobus, prendi un altro veicolo! - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinel - -[PATRIOT] -Patriot - -[FIRETRK] -Camion dei pompieri - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mulo - -[CHEETAH] -Cheetah - -[AMBULAN] -Ambulanza - -[FBICAR] -F.B.I. - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -Mr Whoopee - -[BFINJC] -BF Injection - -[POLICAR] -Polizia - -[ENFORCR] -Cellulare - -[SECURI] -Securicar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Caserma OL - -[TRAIN] -Treno - -[HELI] -Elicottero - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -Bandito RC - -[BELLYUP] -Triad - -[MRWONGS] -Mr Wongs - -[MAFIACR] -Mafia - -[YARDICR] -Yardie - -[YAKUZCR] -Yakuza - -[DIABLCR] -Diablo - -[COLOMCR] -Cartel - -[HOODSCR] -Hoods - -[AEROPL] -Aeroplano - -[SPEEDER] -Speeder - -[REEFER] -Reefer - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Borgnine - -[TOYZ] -TOYZ - -[FEST_DF] -Distanza percorsa a piedi (miglia) - -[FEST_DC] -Distanza percorsa in auto (miglia) - -[FESTDFM] -Distanza percorsa a piedi (m) - -[FESTDCM] -Distanza percorsa in auto (m) - -[FEST_R1] -Campo del Patriota (secondi) - -[FEST_R2] -un Giro nel Parco (secondi) - -[FEST_R3] -Afferrato! (secondi) - -[FEST_RM] -Massacro Multi-livello (secondi) - -[FEST_LS] -Persone salvate in ambulanza - -[FEST_CC] -Missione Vigilante - Criminali uccisi - -[FEST_FE] -Totale incendi spenti - -[FEST_LF] -Volo più lungo nel Dodo - -[FEST_BD] -Disinnesco bomba - Miglior tempo - -[FEST_RP] -Violenze eseguite - -[FEST_MP] -Missioni eseguite - -[FEST_BB] -Bling-bling Scramble: - -[FEST_H0] -Maggior numero di checkpoints - -[FEST_GC] -Auto delle gang distrutte: - -[FEST_H1] -Distruzione Diablo - -[FEST_H2] -Massacro Mafioso - -[FEST_H3] -Calamità al Casinò - -[FEST_H4] -Demolizioni Rumpo - -[USJI1] -TESTO NON PIÙ RICHIESTO - -[USJI2] -TESTO NON PIÙ RICHIESTO - -[USJI3] -TESTO NON PIÙ RICHIESTO - -[USJ] -BONUS PER ACROBAZIA UNICA! - -[SPRAY] -Porta l'auto dal carrozziere per perdere il ~h~livello di sospetto~w~, ~h~riparare~w~ e ~h~riverniciare~w~ il veicolo. Costo - ~h~1000$~w~. - -[HM1_1] -~g~Fredda 20 Purple Nine in 2 minuti e 30 secondi. - -[KM1_8A] -Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per ~h~attivare la bomba~w~: ricorda di toglierti di mezzo! - -[KM1_8D] -Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per ~h~attivare la bomba~w~: e ricorda di toglierti di mezzo! - -[KM1_12] -~g~Portalo nel dojo, ma prima sbarazzati degli sbirri! - -[RATNG1] -Borsaiolo - -[RATNG2] -Prepotente - -[RATNG3] -Teppista - -[RATNG4] -Attaccabrighe - -[RATNG5] -Gorilla - -[RATNG6] -Autista - -[RATNG7] -Aiutante - -[RATNG8] -Riparatore - -[RATNG9] -Socio - -[RATNG10] -Uomo delle pulizie - -[RATNG11] -Assassino - -[RATNG12] -Braccio destro - -[RATNG13] -Boia - -[RATNG14] -Capo - -[RATNG15] -Boss - -[1010] -~r~Il tuo veicolo si è ribaltato - -[1011] -~r~Il tuo veicolo si è ribaltato - -[1012] -~r~Il tuo veicolo si è ribaltato - -[1013] -~r~Il tuo veicolo si è ribaltato - -[1014] -~r~Il tuo veicolo si è ribaltato - -[JM4_10] -OK, ragazzo. Accompagnami prima alla lavanderia di Chinatown, devo occuparmi di alcuni affari. - -[JM4_11] -La donna della lavanderia non mi ha pagato i soldi del pizzo. - -[JM4_12] -E bada all'auto: Joey ha appena riparato questo rottame. - -[JM4_13] -Quindi, niente colpi di testa, OK? - -[KM4_11] -~g~Riporta i soldi al Casinò! - -[FEF_BR2] -Ritrovalo leggendo i sommari di missione che hai già ricevuto. - -[TRAIN_1] -Stazione Kurowski - -[TRAIN_2] -Stazione Rothwell - -[TRAIN_3] -Stazione Baillie - -[SUBWAY1] -Stazione Portland - -[SUBWAY2] -Stazione Rockford - -[SUBWAY3] -Stazione Sud Staunton - -[SUBWAY4] -Capolinea Shoreside - -[MEA4_2] -~r~Marty Chonks è morto! - -[SPRAY1] -Porta l'auto dal carrozziere per perdere il ~h~livello di sospetto~w~, ~h~riparare~w~ e ~h~rivernicirea~w~ il veicolo. Costo - ~h~1000$~w~. Per questa volta è gratis. - -[JM4_A] -Sì, lo so Toni, l'ho sistemata per bene. Il motore fa le fusa, non so se mi spiego. - -[JM4_5] -Ripassa più tardi e darò loro qualcosa da lavare... i panni macchiati del loro sangue! - -[AMMU_A] -Luigi dice che ti serve 'un ferro del mestiere'... - -[AMMU_B] -Joey mi ha detto di equipaggiarti... - -[AMMU_C] -Vai sul retro del negozio. Ti ho lasciato una calibro nove in cortile. - -[AMMU_D] -Ho tutto quello che ti serve per la tua auto-difesa. - -[AMMU_E] -Vuoi anche una licenza? - -[AMMU_F] -Non mi serve che mi mostri i documenti, hai una faccia fidata. - -[DETON] -DETONAZIONE: - -[DRIVE_A] -Seleziona un Uzi quando entri in un veicolo, poi guarda a destra o a sinistra e premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare. - -[DRIVE_B] -Seleziona un Uzi quando entri in un veicolo, poi guarda a destra o a sinistra e premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare. - -[RECORD] -~g~NUOVO RECORD!!! - -[NRECORD] -~r~NESSUN NUOVO RECORD! - -[RCHELP] -Premi il tasto ~k~~PED_FIREWEAPON~ o dirigi l'auto radiocomandata contro i pneumatici di un veicolo per provocarne la detonazione. - -[RCHELPA] -Premi il tasto ~k~~PED_FIREWEAPON~ o dirigi l'auto radiocomandata contro i pneumatici di un veicolo per provocarne la detonazione. - -[RC_1] -Hai 2 minuti per far esplodere quante più auto dei Diablo possibile! - -[RC_2] -Hai 2 minuti per far esplodere quante più auto Mafiose possibile! - -[RC_3] -Hai 2 minuti per far esplodere quante più auto della Yakuza possibile! - -[RC_4] -Hai 2 minuti per far esplodere quante più auto degli Yardie possibile! - -[RC_5] -Hai 2 minuti per far esplodere quante più auto degli Hood possibile! - -[RC_6] -Hai 2 minuti per far esplodere quante più auto del Cartello possibile! - -[RAMPAGE] -VIOLENZA!! - -[RAMP_P] -VIOLENZA COMPIUTA! - -[RAMP_F] -VIOLENZA FALLITA - -[PAGE_00] -. - -[PAGE_01] -Uccidi ~1~ Diablo in 120 secondi! - -[PAGE_02] -Distruggi ~1~ veicoli in 120 secondi! - -[PAGE_03] -Uccidi ~1~ Mafiosi in 120 secondi! - -[PAGE_04] -Uccidi ~1~ elementi della Triade in 120 secondi! - -[PAGE_05] -Uccidi ~1~ elementi della Triade in 120 secondi! - -[PAGE_06] -Distruggi ~1~ veicoli in 120 secondi! - -[PAGE_07] -Fai saltare la testa a ~1~ Yardie in 120 secondi! - -[PAGE_08] -Brucia ~1~ elementi della Yakuza in 120 secondi! - -[PAGE_09] -Distruggi ~1~ veicoli in 120 secondi! - -[PAGE_10] -Distruggi ~1~ veicoli in 120 secondi! - -[PAGE_11] -Annienta ~1~ Yardie in 120 secondi! - -[PAGE_12] -Carbonizza ~1~ elementi della Yakuza in 120 secondi! - -[PAGE_13] -Fai esplodere ~1~ Yardie in 120 secondi! - -[PAGE_14] -Fai fuori ~1~ ColombianI in 120 secondi! - -[PAGE_15] -Polverizza ~1~ Hood in 120 secondi! - -[PAGE_16] -Distruggi ~1~ veicoli in 120 secondi! - -[PAGE_17] -Investi in macchina ~1~ Colombiani in 120 secondi! - -[PAGE_18] -Distruggi guidando ~1~ veicoli in 120 secondi! - -[PAGE_19] -Stacca la testa a ~1~ Colombiani in 120 secondi! - -[PAGE_20] -Decapita ~1~ Hood in 120 secondi! - -[JOEY_1] -TESTO NON PIÙ RICHIESTO - -[JM1_A] -Ehi, sono stufa, quand'è che si passa ai fatti? - -[JM1_B] -Tra un minuto, cocca, ho una cosetta da sbrigare. - -[JM1_C] -Ho un lavoretto per te, amico. - -[JM1_D] -I fratelli Forelli mi devono soldi da troppo tempo - -[JM1_E] -e occorre insegnargli un po' di rispetto. - -[JM1_F] -'Labbra' Forelli si sta ingozzando come un porco al St Mark's Bistro, - -[JM1_G] -quindi rubagli l'auto e portala nell'armeria di 8-Ball ad Harwood. - -[JM1_H] -Conosci 8-Ball, vero? - -[JM1_I] -Dopo che sarà stata installata una bomba, parcheggia l'auto dove l'hai trovata. - -[JM1_J] -Poi rilassati e goditi lo spettacolo. - -[JM1_K] -Ma fai in fretta, non starà a pranzo una vita. - -[CAT2_A1] -Forza, brutta deficiente! - -[CAT2_A] -La domanda è: sei venuto a salvare Maria o a riportarmi indietro? - -[CAT2_B] -Beh, stammi a sentire, - -[CAT2_B2] -spararti sarà un piacere, ma uscire con te è stato solo lavoro. - -[CAT2_C] -Sei il mio peccinno amigo! - -[CAT2_D] -Butta qui la grana. - -[CAT2_E] -Ti sei dato molto da fare! - -[CAT2_E2] -Ma non hai imparato che non devi fidarti di me. - -[CAT2_E3] -Ammazzate quell'idiota. - -[CAT2_J] -Fai decollare questo affare! - -[HM5_1] -Ehi, Ice mi ha detto che saresti arrivato. Ecco le regole. Solo mazze. Niente pistole, niente auto. - -[HM5_5] -È una battaglia per il rispetto, chiaro?. - -[HELP14] -Per raccogliere le armi, passaci sopra a piedi. Non puoi raccoglierle mentre sei in un veicolo. - -[CRUSH] -Parcheggia nell'area contrassegnata ed esci dal veicolo. Il veicolo verrà rottamato. - -[DIAB2_B] -Un gruppo di gentaglia mi ha minacciato di asportare il mio attributo di tutto rispetto se non gli sgancio dei soldi. - -[DIAB2_C] -Hanno minacciato l'uomo sbagliato, amigo. - -[DIAB2_D] -Hanno un debole per il gelato. - -[DIAB2_E] -Prendi la bomba che ho nascosto ad Harwood, - -[DIAB2_F] -dirotta il furgone dei gelati durante i suoi spostamenti - -[DIAB2_G] -e attira quegli idioti verso il loro destino con il campanello. - -[DIAB2_H] -Si nascondono in un magazzino ad Atlantic Quay. - -[DIAB3_A] -Qualche insolente della Triade ha rubato la mia stupenda macchina ieri notte, - -[DIAB3_B] -l'ha distrutta e carbonizzata. - -[DIAB3_C] -Uno dei miei più cari escrementi asinini si trovava nel bagagliaio - -[DIAB3_D] -veri oggetti da collezione, insostituibili amico mio. - -[DIAB3_E] -Ho nascosto un'arma lancinante alla periferia di Chinatown. - -[DIAB3_F] -Prendila e insegna ai vandali della Triade a temere l'ira super-dotata di El Burro! - -[DIAB3_1] -UCCIDI 25 ELEMENTI DELLA TRIADE - -[DIAB4_A] -Un ladruncolo approfittatore ha rubato un furgone carico di copie delle mie ultime pubblicazioni! - -[DIAB4_B] -Ma quell'idiota fatto di SPANK ha lasciato lo sportello posteriore aperto, - -[DIAB4_C] -per cui tutto quello splendido capolavoro patinato - -[DIAB4_D] -con intriganti foto pornografiche è stato sparso per tutta Liberty! - -[DIAB4_E] -Prendi il furgone e segui la scia di copie di Un Asino si fa Dallas volume 1, 2 e 3 - -[DIAB4_F] -raccogliendole lungo la strada. - -[DIAB4_G] -Quando raggiungi quel ladruncolo imbottito di SPANK, fallo fuori! - -[DIAB4_H] -Poi consegna il mio materiale asinino a Riviste XXX nel quartiere a luci rosse. - -[DIAB4_1] -~g~Porta il furgone nel retro di Riviste XXX. - -[HM1_E] -Devi far vedere a queste depravate come si fa una vera sparatoria. - -[HM1_H] -Togli di torno questi Nine! - -[HM2_A] -Questi Nine mi stanno causando problemi. - -[HM2_B] -Queste stronze hanno auto blindate e adesso stanno spacciando SPANK... - -[HM2_C] -e lo smerciano senza paura ai miei fratelli. - -[HM2_D] -C'è un'auto parcheggiata in strada. - -[HM2_E] -Dentro c'è della roba che metterà le sorelline fuori combattimento... - -[HM3_A] -Qualche bastardo ha messo una bomba nella mia auto. - -[HM3_B] -Se perdo l'auto, la mia reputazione nel giro sarà finita. - -[HM3_C] -Prendi la mia macchina e portala al garage a St. Marks, chiaro? - -[HM3_D] -Fagli disinnescare la bomba, lascia che se ne occupino loro. - -[HM3_E] -Il tempo corre e l'ordigno è tutto incasinato. - -[HM3_F] -Se becchi una buca potrebbe saltare tutto in aria. - -[HM3_G] -Adesso muoviti! - -[HM4_A] -Ehi, un aereo federale portavalute si è appena schiantato all'aeroporto Francis. - -[HM4_B] -C'è del platino sparso per tutta la pista. - -[HM4_C] -Prendi un'auto e raccogline quanto ne puoi! - -[HM4_F] -Puoi scaricare il malloppo in uno dei miei garage. - -[HM4_G] -Il platino è molto pesante e rallenterà un po' l'automobile. - -[HM4_H] -Quindi fai diverse consegne nel garage. - -[HM5_A] -Quei Nine sono rimasti in una manciata di rognosi... - -[HM5_B] -ma insistono ancora. - -[HM5_C] -Ci siamo accordati per uno scontro. - -[HM5_D] -Un gruppo dei loro contro due di noi, anzi... - -[HM5_E] -due di te. - -[HM5_F] -Ti accompagnerei, ma... - -[HM5_G] -non sarò in libertà vigilata per altri tre mesi. - -[HM5_H] -Tu mi capisci, vero? - -[HM5_I] -Vai a trovare il mio fratellino, - -[HM5_J] -Ti accompagnerà sul luogo della rissa, amico. - -[MEA1_B] -Mi chiamo Chonks, Marty Chonks. - -[MEA1_C] -Gestisco la fabbrica di cibo per cani Bitch'n'Dog qui vicino. - -[MEA1_D] -Ho dei problemi finanziari, ma in fondo chi non ne ha? - -[MEA1_E] -Più tardi mi incontrerò col direttore della mia banca. - -[MEA1_F] -È un imbroglione schifoso che continua a far crescere gli interessi di un prestito per arricchirsi. - -[MEA1_G] -Usa la mia auto, vallo a prendere e portalo qui. - -[MEA1_H] -Ho una sorpresina per quella maledetta sanguisuga! - -[MEA2_A] -Ho assunto dei ladri per entrare nel mio appartamento... - -[MEA2_C] -Quei ladruncoli bastardi minacciano di dire tutto all'assicurazione, - -[MEA2_D] -se non do loro una percentuale. - -[MEA2_E] -Roba da non credere! - -[MEA2_F] -Ho parcheggiato un'auto dietro i cancelli della fabbrica. - -[MEA2_G] -Usala e valli a prelevare nel loro territorio nel quartiere a luci rosse. - -[MEA2_H] -Poi portali qui in fabbrica così che comprendano il mio punto di vista. - -[MEA3_A] -L'azienda farà bancarotta se non riesco a procurarmi in fretta parecchi contanti. - -[MEA3_B] -Mia moglie ha un'assicurazione e l'unica cosa che sa fare è sperperare i miei soldi. - -[MEA3_C] -Ho lasciato un'auto al solito posto. - -[MEA3_D] -Vai a prendere mia moglie al salone di bellezza Classic Nails e accompagnala alla fabbrica. - -[MEA4_A] -Maledizione, sono nei guai! - -[MEA4_B] -Sembra che mia moglie avesse una storia con un tipo a cui devo dei soldi. - -[MEA4_C] -È molto arrabiato e vuole vendetta! - -[MEA4_E] -Lui si aspetta che cercherò di patteggiare... - -[MEA4_F] -ma io credo che... - -[MEA4_G] -i cani di Liberty assaggeranno dei bocconcini extra questo mese! - -[WELCOME] -BENVENUTI A - -[HM1_2] -~g~Prendi un veicolo e ricorda: contano solo le uccisioni fatte con l'Uzi mentre guidi! - -[HELP8_B] -Premi il ~h~tasto ~k~~PED_SNIPER_ZOOM_IN~ ~w~per ~h~zoomare ~w~col fucile e il~h~ tasto ~k~~PED_SNIPER_ZOOM_OUT~~w~ per ~h~allargare il campo~w~. - -[LRQC_1] -Asuka e io dobbiamo parlare, OK? - -[LRQC_2] -Perché non ti fai un giro? - -[LRQC_3] -Ti servira un posto dove nasconderti. - -[LRQC_4] -C'è un magazzino al confine di Bellville che farà al caso tuo. - -[LRQC_5] -Ritorna qui nel mio appartamento quando sei pronto, - -[LRQC_6] -Così possiamo chiacchierare un po'. - -[JM6_5] -~g~Ti serve un veicolo per la fuga, idiota! - -[JM2_F] -Se ti serve un'arma, vai sul retro di AmmuNation dal lato opposto della metropolitana. - -[LOVE4_7] -~g~C'è un cantiere edile a Staunton Island, forse hanno portato lì il pacco. - -[LOVE4_8] -~g~Ti servirà un'auto per accedere al garage. - -[TSCORE] -GUADAGNI: ~1~$ - -[AM1_9] -~r~Salvatore è fuggito di nuovo dentro il club Luigi's! - -[AM1_6] -~g~Se ti aggiri attorno al club Luigi's, la Mafia ti avvisterà! - -[TM2_3] -~g~È una trappola! Falli fuori tutti!!! - -[FM4_1] -Sono Maria. L'auto è una trappola! Incontriamoci alla rampa a sud del ponte Callahan. - -[JM1_7] -~g~Chiudi la portiera! Lo noterà! - -[KM5_1] -~g~TRITATO DI SPACCIATORE! - -[KM5_6] -~g~Devi uccidere almeno 8 spacciatori Yardie. - -[KM5_7] -~g~Uccidili in fretta! Dopo aver venduto lo SPANK spariscono dalla circolazione. - -[RM3_8] -~r~Quell'auto è un tranello!!! - -[LM3_8] -Ehi, sono Joey. - -[LM3_9] -Luigi mi ha detto che sei affidabile, quindi torna più tardi, - -[KM3_5] -~g~Suona il clacson per avviare l'affare. - -[LOVE7] -LA SCOMPARSA DI LOVE - -[LOVE2_5] -~g~Kenji è un tritato di carne! Allontanati da Newport e abbandona l'auto! - -[AS2_11] -~g~~1~ SU 9! - -[GARAGE1] -~g~Esci dal veicolo ed esci fuori. - -[KM3_11] -~g~Il Cartello è stato attaccato e la valigia non è stata recuperata. - -[KM3_12] -~g~Uccidi tutti i Colombiani, distruggi i veicoli e recupera la valigia. - -[KM3_13] -~g~Riconsegna la valigia al Casinò. - -[RM5_6] -~g~Ci è scappato! Spaccagli la corazza con un veicolo o con una bella esplosione! - -[PBOAT_1] -Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare con i cannoni della barca. - -[PBOAT_2] -Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare con i cannoni della barca. - -[DIAB1_B] -Sono El Burro dei Diablo. - -[DIAB1_D] -Sei da poco a Liberty, ma ti sei già guadagnato una reputazione in città. - -[DIAB1_E] -C'e una corsa d'auto con inizio alla vecchia scuola vicino al ponte Callahan. - -[DIAB1_F] -Procurati un mezzo, il primo che attraversa tutti i posti di blocco vince il premio. - -[HM2_1] -Usa i maggiolini radiocomandati per distruggere le auto blindate. Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per farli esplodere. - -[HM2_1A] -Usa i maggiolini radiocomandati per distruggere le auto blindate. Premi il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per farli esplodere. - -[HM2_2] -~r~Non sei riuscito a distruggere tutte le auto blindate! - -[HM2_6] -~g~Auto blindata distrutta! - -[RM3_A] -Conosco un uomo molto importante in città, di manica larga, - -[RM3_H] -con gusti, diciamo, esotici e i soldi per permetterseli. - -[RM3_B] -È coinvolto in un processo e l'accusa ha delle sue foto piuttosto imbarazzanti - -[RM3_C] -in cui appare in un party all'obitorio. - -[LOVE6_A] -Una lezione d'affari, amico. - -[LOVE6_E] -Se possiedi qualcosa di unico, il mondo intero cercherà di strappartelo dalle mani... - -[LOVE6_C] -Squadre speciali di polizia hanno circondato la zona attorno al mio socio e al pacco. - -[LOVE6_D] -Vai li, prendi il furgone e fuggi per attirarli dietro di te. - -[LOVE6_F] -Tienili occupati, così che lui possa sfuggire! - -[AM3_C] -Probabilmente quando lo leggerai questo sarà in alto mare! Ruba un'imbarcazione della polizia e mandalo a picco! - -[FESZ_UC] -ANNULLA - -[FEDS_SM] -L1,R1-CAMBIA MENU - -[FEDS_AS] -;=-CAMBIA SELEZIONE - -[FEDSAS2] -<>-CAMBIA SELEZIONE - -[FEDS_SS] -L1,R1-CAMBIA SELEZIONE - -[FEDSSC1] -;-SCORRIMENTO RAPIDO - -[FEDSSC2] -=-FERMA SCORRIMENTO - -[MEA2_3] -~g~Riporta l'auto alla fabbrica. - -[RM1_3] -~r~McAffrey è scappato! - -[RM1_4] -~g~Hai usato tutte le granate! Procuratene altre da AmmuNation! - -[RM1_5] -~g~Torna indietro e incendia il rifugio! - -[RM6_4] -~g~Vai al nascondiglio e preleva la roba di Ray. - -[RM6_5] -~g~La CIA ha messo il ponte sotto sorveglianza, trova un altro punto d'accesso. - -[HM2_F] -e distruggi tutte le loro attrezzature blindate. - -[HM_4] -'CORSA AL LINGOTTO' - -[MEA2_B5] -TESTO NON PIÙ NECESSARIO - -[MEA1_B5] -TESTO NON PIÙ NECESSARIO - -[MEA3_B5] -TESTO NON PIÙ NECESSARIO - -[MEA4_B7] -ma se entri un attimo nel mio ufficio... - -[MEA3_B4] -Marty vuole vedermi? È meglio che si sbrighi perché devo acconciarmi i capelli. - -[KM3_7] -È un esperto in trappole della Yakuza! - -[FES_LOF] -Caricamento fallito. - -[P1INSA] -Ingresso 1. memory card (PS2) inserita. ~1~ K di spazio disponibile per salvare. ~1~ K necessari. - -[P1INSN] -Ingresso 1. memory card (PS2). Spazio disponibile insufficiente. Elimina alcuni file. - -[FES_SLO] -SALVA FILE - -[FES_ISC] -CORROTTO - -[FESZ_TI] -SALVA Z1 - -[FESZ_SA] -Salva partita - -[P1NOIN] -Ingresso 1. memory card (PS2) non inserita - -[P1INSE] -Ingresso 1. memory card (PS2) inserita. - -[MC_LDFL] -Caricamento fallito! - -[MC_NWRE] -Partita in fase di riavvio. - -[LOVE6_3] -~g~Hai ~1~ secondi per tornare alla Securicar prima di fallire la missione. - -[LOVE6_4] -~r~Hai distrutto la Securicar da depistaggio! - -[HELP1] -Fermati nel centro del segnale blu. - -[HELP12] -Cammina nel centro del segnale blu per attivare una missione. - -[HJSTAT] -Distanza: ~1~.~1~m Altezza: ~1~.~1~m Ribaltamenti: ~1~ Rotazioni: ~1~_ - -[HJSTATW] -Distanza: ~1~.~1~m Altezza: ~1~.~1~m Ribaltamenti: ~1~ Rotazioni: ~1~_ E che grande atterraggio! - -[DIAB1_5] -TEMPO DI GARA: - -[LOVE3_4] -~r~Hai distrutto l'aereo!!! - -[F_FAIL1] -Missione Camion dei pompieri terminata. - -[F_CANC] -~r~Missione Pompieri annullata! - -[F_EXTIN] -INCENDI: - -[A_COMP1] -Missioni Infermieri completate! - -[A_CANC] -~r~Missione Infermieri annullata! - -[A_COMP3] -Missioni Infermieri completate! Ora non ti stancherai mai mentre corri! - -[ATUTOR] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Infermieri. - -[ATUTOR3] -Premi il ~h~tasto ~k~~TOGGLE_SUBMISSIONS~~w~ per attivare o disattivare le missioni Infermieri. - -[ALEVEL] -Missione Infermieri Livello ~1~ - -[A_FAIL1] -Missione Infermieri terminata. - -[FEST_HA] -Missione Infermieri - Livello Max. - -[A_SAVES] -PERSONE SALVATE: ~1~ - -[C_KILLS] -CRIMINALI UCCISI: ~1~ - -[HM1_B] -Ho un problema. Stanno cercando di farsi gioco di me. - -[AM2_A] -La morte di Salvatore è un'ottima notizia, - -[AM2_A2] -sei un killer efficiente. Mi piace come qualità in un uomo. - -[AM2_B] -Lui è mio fratello Kenji. - -[AM2_C] -Asuka ha un lavoretto per te: quando hai finito, passa al Casinò così parliamo. - -[AM2_D] -Proprio come Kenji, che cerca sempre di usare i miei giocattoli. - -[AM2_E] -La mia fonte alla polizia mi ha informato che la Mafia sta studiando le nostre operazioni nella città - -[AM2_E2] -nel tentativo di scovarti. - -[AM2_F] -Non possiamo continuare le nostre operazioni fino a quando il problema non verrà risolto. - -[AM2_G] -Elimina questi insulsi spioni e termina questa vendetta una volta per tutte. - -[F_START] -~g~Veicolo in fiamme avvistato nell'area ~a~. Vai a spegnere il fuoco. - -[AM4_1A] -Vai al telefono al parco Belleville ovest. - -[AM4_1B] -Vai al telefono nel campus Liberty. - -[AM4_1C] -Vai al telefono al parco Belleville sud. - -[AM4_1D] -Incontriamoci nei bagni pubblici nel parco. - -[HJSTATF] -Distanza: ~1~ piedi Altezza: ~1~ piedi Ribaltamenti: ~1~ Rotazioni: ~1~_ - -[HJSTAWF] -Distanza: ~1~ piedi Altezza: ~1~ piedi Ribaltamenti: ~1~ Rotazioni: ~1~_ E che grande atterraggio! - -[HM1_F] -Stai in guardia, però. Ci saranno dei Jack in giro che penseranno che vuoi far fuori anche loro! - -[HM1_D] -'Nine' è il loro nome e la loro bandiera è porpora e ogni giorno che portano i loro colori... - -[HM1_G] -è un giorno in cui i 'Jack' appaiono rammolliti. - -[MEA2_B] -e ruba qualcosa così che io possa incassare l'assicurazione come fai tu. - -[TM3_H] -~w~Hai fatto un bel lavoro laggiù, molto bravo. - -[TM3_I] -~w~Forza, adesso ti presento al Don. - -[TM3_J] -~w~Eehi!!! Luigi! - -[TM3_K] -~w~Oh, le mie ragazze hanno sentito la sua mancanza, Don Salvatore, è mancato per molto tempo. - -[TM3_L] -~w~Dì loro che una volta risolta questa situazione spiacevole, - -[TM3_M] -~w~andremo tutti al club a festeggiare, OK? - -[TM3_N] -~w~Ecco il mio ragazzo! - -[TM3_N2] -~w~Come va, papà? - -[TM3_O] -~w~Ti sei trovato una brava mogliettina? - -[TM3_P] -~w~Ehi, tua madre, pace all'anima sua, si rivolterebbe nella tomba - -[TM3_Q] -~w~vedendoti ancora senza moglie. - -[TM3_R] -~w~Lo so, papà, ci sto pensando su. - -[TM3_S] -~w~TONI! Come sta tua madre? - -[TM3_T] -~w~È una donna eccezionale. Forte. - -[TM3_U] -~w~Sta bene... tutto OK. - -[TM3_V] -~w~Bene, bene. Voi ragazzi entrate pure, mentre io chiacchiero col nostro nuovo amico. - -[TM3_W] -~w~Vedo un futuro roseo per te, figghiu miu... - -[RM1_A] -Quell'infame di McAffrey, si prende più bustarelle di chiunque. - -[RM1_B] -Pensa di venir assolto dignitosamente presentando delle prove inequivocabili. - -[RM1_C] -Ha appena cantato! - -[RM4_B] -Dobbiamo metterlo a tacere, per sempre. - -[RM4_E] -Voglio che dorma con i pesci, in senso letterale. - -[LOVE3_B] -Avvicinandosi all'aeroporto stasera, un piccolo aereo sorvolerà la baia. - -[LOVE4_D] -Sfortunatamente le autorità aeroportuali avevano già iniziato a smantellare l'aereo - -[LOVE4_H] -finché non sono intervenuto sborsando una fortuna. - -[LOVE4_E] -Attraversa il ponte per Shoreside Vale e vai all'aeroporto internazionale Francis. - -[GTAB_A] -Ehi, portiamo questo fuori di qui. Dio solo sa cos'è - -[GTAB_B] -ma sembra che lui lo voglia davvero, quindi dovrà pur valere qualcosa. - -[GTAB_C] -Chi diavolo è! - -[GTAB_D] -TU! - -[GTAB_E] -Ehi, in gamba amigo, stai calmo, amigo! Di niente, di niente! - -[GTAB_F] -Ti ho lasciato sfogare! - -[GTAB_G] -Non sparare amigo. Nessun problema. Siamo tutti amici. Ecco, prendi questo. - -[GTAB_H] -Non fare la femminuccia! - -[GTAB_I] -Non abbiamo scelta, baby! - -[GTAB_J] -C'è sempre una scelta, stupido bastardo! - -[GTAB_K] -Mi spiace per quella cretina, amigo, sono tutte uguali... por favor? - -[GTAB_L] -Allora la puttana è scappata. - -[GTAB_M] -Ma mi hai fatto un favore, - -[GTAB_N] -non sei il solo che ha un conto in sospeso col Cartello, - -[GTAB_O] -questo verme ha ucciso mio fratello! - -[GTAB_P] -Non ho mai ucciso nessun Yakuza! - -[GTAB_Q] -BUGIARDO! Abbiamo visto tutti l'assassino del Cartello. - -[GTAB_R] -Daremo la caccia ed elimineremo tutti voi cani Colombiani! - -[GTAB_S] -Farò un'operazione al nostro amichetto per strappargli qualche informazione e per divertirmi. - -[GTAB_T] -Tu, passa più tardi, sono certo che avrò bisogno del tuo aiuto. - -[GTAB_U] -Ti prego, amigo, non lasciarmi con lei, è tutta matta! Amigo? Ehi Amiiigooo!!! Aieeeeeeaaaaahh!!! - -[LOVE5_A] -Ti stai dimostrando un buon investimento, cosa rara in questi giorni. - -[KM3_1] -~g~Il Cartello aspetta una gang di Yardie. Vai a rubare una loro auto! Dirigiti a nord, ne troverai una a Newport. - -[LOVE1_1] -~g~Procurati un'auto dei gangster Colombiani per infiltrarti nel loro nascondiglio: dirigiti a nord, ne troverai una a Fort Staunton. - -[FM1_Q1] -~w~Ti va di divertirti? Un po' di... hmmm? Un po' di SPANK? - -[FM1_R] -~w~Ciao Chico. No, il solito. - -[FM1_T] -~w~Grazie Chico, a presto. - -[FM1_W] -~w~OK, Fido, aspetta qui e tieni d'occhio l'auto mentre io vado a sculettare un po'. - -[FM1_X] -~w~OK, Fido, andiamocene via di qui. Uuuhhh! - -[FM1_Q] -~w~Ehi, Maria! La mia ragazza preferita! - -[FM1_S1] -~w~Ehi, forse dovresti dare un'occhiata al party nei magazzini sulla costa est del molo atlantico. - -[FM1_U] -~w~Gracias e buon divertimento. È roba buona. - -[FM1_V] -~w~Forza, Fido, facciamo un salto a questo party! - -[FM1_SS] -~r~SCANNER: ~g~4-5 a tutte le unità: rinforzi per l'operazione antinarcotici al molo atlantico... - -[LOVE6_B] -Anche se hanno scarsa comprensione del suo autentico valore. - -[TM3_A1] -~r~Joey è spacciato! - -[TM3_A2] -~r~Joey e Luigi sono stati cremati! - -[TM3_A3] -~r~Joey, Luigi e Toni sono fritti! - -[FM4_2] -Ascolta, Salvatore pensa che vogliamo tradirlo, - -[FM4_3] -per cui ti stava per consegnare al Cartello per raggiungere un accordo. - -[FM4_4] -Non potevo lasciarglielo fare, e poi la cosa peggiore è che - -[FM4_4B] -è tutta colpa mia... perché gli ho detto che stavamo insieme. - -[FM4_5] -Non chiedermi il perché. Non lo so. - -[FM4_6] -Senti, sei un uomo spacciato in territorio mafioso, e anch'io devo svignarmela. - -[FM4_6B] -Ho visto troppi omicidi. Troppo sangue! - -[FM4_7] -Questa è una mia vecchia amica, OK, di vecchia data. È Asuka, ed è una tipa fidata. - -[FM4_8] -Forza, basta con i discorsi. - -[FM4_9] -Dovremmo andarcene prima che arrivino altri italiani isterici poco propensi a una discussione amichevole. - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUTTORE - -[CRED003] -LESLIE BENZIES - -[CRED004] -DIREZIONE ARTISTICA - -[CRED005] -AARON GARBUT - -[CRED006] -DIREZIONE TECNICA - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -DESIGN - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -SCRITTO DA - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -PERSONAGGI - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMAZIONE E REGIA - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -DESIGN AUTOMOBILI - -[CRED024] -PAUL KUROWSKI - -[CRED025] -GRAFICI - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODIFICATORI - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -MUSICHE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -DESIGN AUDIO E MASTERIZZAZIONE - -[CRED042] -ALLAN WALKER - -[CRED043] -PROGRAMMAZIONE AUDIO - -[CRED044] -RAYMOND USHER - -[CRED045] -DIRETTORE TESTING - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -TESTER PRINCIPALI - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRD050A] -TESTER - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -SUPPORTO TECNICO - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -PRODUTTORE ESECUTIVO - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUTTORE - -[CRED064] -DAN HOUSER - -[CRED065] -DIRETTORE DI SVILUPPO - -[CRED066] -JAMIE KING - -[CRED067] -PRODUTTORE TECNICO - -[CRED068] -GARY J. FOREMAN - -[CRED069] -PRODUTTORE ASSOCIATO - -[CRED070] -JEREMY POPE - -[CRED071] -SUPERVISORE MUSICHE - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VICEPRESIDENTE MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -COORDINATORE TECNICO - -[CRED088] -BRANDON ROSE - -[CRED089] -RESPONSABILE CONTROLLO QUALITÀ - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -ANALISTA DEL GIOCO - -[CRED094] -RICHARD HUIE - -[CRED095] -SQUADRA TESTING - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -PIANTA DI LIBERTY - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -SEQUENZE ANIMATE - -[CRED108] -COPIONE SCRITTO DA DAN HOUSER E JAMES WORRALL - -[CRED109] -REGISTRAZIONE AUDIO DIRETTA DA DAN HOUSER - -[CRED110] -AUDIO PRODOTTO DA RENAUD SEBBANE - -[CRED111] -CASTING - -[CRED112] -FRANK VINCENT NEL RUOLO DI SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO NEL RUOLO DI LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN NEL RUOLO DI TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT NEL RUOLO DI JOEY LEONE - -[CRED116] -DEBBI MAZAR NEL RUOLO DI MARIA - -[CRED117] -KYLE MACLACHLAN NEL RUOLO DI DONALD LOVE - -[CRED118] -ROBERT LOGGIA NEL RUOLO DI RAY MACHOWSKI - -[CRED119] -GURU NEL RUOLO DI 8-BALL - -[CRED120] -SONDRA JAMES NEL RUOLO DI MOMMA - -[CRED121] -LIANA PAI NEL RUOLO DI ASUKA - -[CRED122] -LES MAU NEL RUOLO DI KENJI - -[CRED123] -CYNTHIA FARRELL NEL RUOLO DI CATALINA - -[CRED124] -AL ESPINOSA NEL RUOLO DI MIGUEL - -[CRED125] -CHRIS PHILLIPS NEL RUOLO DI EL BURRO - -[CRED126] -HUNTER PLATIN NEL RUOLO DI CHICO - -[CRED127] -WALTER MUDU NEL RUOLO DI D-ICE - -[CRED128] -CURTIS MCCLARIN NEL RUOLO DI CURTLY - -[CRED129] -BILL FIORE NEL RUOLO DI DARKEL - -[CRED130] -CHRIS PHILLIPS NEL RUOLO DI MARTY CHONKS - -[CRED131] -HUNTER PLATIN NEL RUOLO DI RICCIOLINO BOB - -[CRED132] -WALTER MUDU NEL RUOLO DI KING COURTNEY - -[CRED133] -HUNTER PLATIN NEL RUOLO DI ONE-ARMED PHIL - -[CRED134] -KIM GURNEY NEL RUOLO DI MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATO DA - -[CRD136A] -ALEX HORTON - -[CRED137] -DIRETTO DA - -[CRD137A] -NAVID KHONSARI - -[CRED138] -PRODOTTO DA - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRED139] -REGISTRATO PRESSO GLI STUDI MODERN UPRISING, BROOKLYN - -[CRED140] -ATTORI - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS - -[CRED141] -DIALOGO DEI PEDONI - -[CRED142] -SCRITTO DA DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRETTO DA CRAIG CONNER, DAN HOUSER E LAZLOW - -[CRED144] -PRODOTTO DA RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -STAZIONI RADIO E MUSICA - -[CRED218] -PRODUTTORI PER ROCKSTAR UK - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED219] -COORDINATORE COLONNA SONORA - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUTTORE PER ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -POST-PRODOTTA DA - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER E IMAGING SCRITTE DA - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -RINGRAZIAMENTI SPECIALI A - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[CRED270] -MIKE HONG - -[CINCAM] -Camera mobile - -[KM1_13] -Entra in auto dentro il garage! - -[KM3_14] -~r~Sei stato scoperto, l'affare è saltato! - -[EBAL_H] -Aspetta qui mentre entro a parlare con Luigi. - -[EBAL_M] -Ricorda, niente casini con le mie ragazze! - -[LM2_F] -Poi prendi la sua macchina, riverniciala. - -[LM2_D] -tieni, prendi. - -[LM1_9] -Ciao, sono Misty. - -[LM4_A] -I papponi dei Diablo hanno messo a battere le loro mignotte nella mia zona. - -[FM2_B] -C'è di mezzo una spia. - -[FM2_C] -Non è ne un pusher ne un pappone, quindi dev'essere una spia. - -[FM3_CC] -~w~Fratello, torna quando avrai i soldi. - -[LOVE5_5] -~r~Non sei riuscito a proteggere il camion! - -[RM6_6] -~r~Ray è morto! - -[RM6_7] -~r~Ray ha perso il volo. - -[RM6_8] -~g~Ti sei dimenticato Ray, torna a prenderlo. - -[FM1_10] -~g~Ti sei dimenticato Maria, torna a prenderla. - -[LOVE4_9] -~r~L'aereo è stato distrutto! - -[LOV4_10] -~r~Il solo indizio che indicasse dov'è finito il pacco è stato distrutto! - -[KM2_D] -Non occorre dire che dobbiamo donargli le auto, per ripagare il debito che gli è dovuto. - -[KM4_B] -Le imprese che godono della nostra protezione oggi salderanno i conti. - -[KM2_E] -Devi procurarti le auto nella lista e consegnarle nel garage dietro il parcheggio a Newport. - -[FM3_8I] -~w~Scegli una postazione vantaggiosa, poi io entrerò dopo che hai sparato il primo colpo. - -[LOVE1_B] -L'esperienza mi ha insegnato che un uomo come te sa essere molto leale se ben pagato, - -[LOVE1_H] -ma gruppi di uomini diventano avidi. - -[LOVE1_C] -Un personaggio chiave, un vecchietto orientale che conosco, - -[LOVE1_I] -è ostaggio di alcuni sud-americani in Aspatria. - -[MEA4_D] -Ho preso accordi per vederlo... - -[MEA4_B4] -Ti manda Marty, eh? OK, mostrerò a quello schifoso il significato della parola affari. - -[MEA4_B5] -Carl, ciao! Mi, uh, mi serve più tempo per pagarti. - -[MEA1_B4] -Ah, ti manda il signor Chonk, vero? Andiamo a fargli un visita. - -[HM5_6] -Andiamo a spaccare qualche cranio... - -[LOVE1_5] -~g~Non perdere altro tempo, procurati un'auto dei Colombiani e salva il socio di Love. - -[AS1_D] -~w~Agisci da esca e fatti inseguire dai plotoni d'esecuzione fino a Pike Creek - -[AS1_E] -~w~dove i miei uomini li aspetteranno. - -[AS2_C] -~w~Il Cartello ha un negozio di copertura, la compagnia Kappa Coffee House. - -[AS2_E] -~w~Non abbiamo scelta, dobbiamo mettere questi spacciatori ambulanti fuori combattimento. - -[AS2_F] -~w~Riducili in poltiglia!! - -[AS2_A1] -~w~Miguel ha di certo un po' di quella famosa prestanza latina. - -[AS2_A2] -~w~Io non ce la faccio più. - -[SIREN_3] -Per attivare la sirena di questo veicolo premi il ~h~tasto ~k~~VEHICLE_HORN~~w~. - -[SIREN_4] -Per attivare la sirena di questo veicolo premi il ~h~tasto ~k~~VEHICLE_HORN~~w~. - -[AS3_C] -~w~Eeeeyooo! Cos'è quella roba gialla e collosa? - -[AS3_C1] -~w~Oh, ciao pupa. - -[AS3_F] -~w~Ha un talento naturale questa ragazza. - -[AS3_F1] -~w~È riuscita a strappare questa perla al nostro ospite. - -[AS3_G] -~w~C'è un aereo in arrivo all'aeroporto internazionale Francis in 2 ore. - -[AS3_G1] -~w~È pieno del veleno di Catalina. - -[AS3_H] -~w~Puoi evitare la sicurezza dell'aeroporto andando in barca vicino alle boe di segnalazione della pista di atterraggio - -[AS3_H1] -e abbattendo l'aereo quando si avvicina. - -[AS3_I] -~w~Raccogli il carico dalle macerie! - -[AS3_J] -~w~Oh, adesso fa attenzione, OK baby? - -[AS3_K] -~w~Adesso prova l'olio di chili... - -[RM2_F1] -Quei Colombiani dovrebbero essere qui a momenti! - -[RM2_K] -Maledizione, sono arrivati!!! CARICA LE ARMI!!! - -[LOVE2_7] -~g~Adesso abbandona l'auto! - -[LOVE2_8] -~g~Ora allontanati da Newport! - -[AM1_F] -Salvatore Leone lascerà Luigi's all'incirca alle ~1~:~1~. - -[LOVE5_C] -Voglio che tu lo segua che ti accerti che lui e il mio pacco giungano a Pine Creex illesi. - -[FESZ_SR] -Salvataggio fallito! Controlla la memory card (PS2) nell'ingresso MEMORY CARD 1 e riprova. - -[FESZ_FO] -Vuoi formattare la memory card (PS2) nell'ingresso MEMORY CARD 1? - -[FELZ_FO] -La memory card (PS2) nell'ingresso MEMORY CARD 1 non è formattata. - -[FES_NOC] -Nessuna memory card (PS2) nell'ingresso MEMORY CARD 1. - -[FES_LOE] -Caricamento fallito! Controlla la memory card (PS2) nell'ingresso MEMORY CARD 1 e riprova. - -[FES_DEE] -Eliminazione fallita! Controlla la memory card (PS2) nell'ingresso MEMORY CARD 1 e riprova. - -[FORSUC] -Formattazione della memory card (PS2) nell'ingresso MEMORY CARD 1 completata. - -[ERFOUN] -Formattazione della memory card (PS2) nell'ingresso MEMORY CARD 1 fallita. - -[ERMCNP] -Nessuna memory card (PS2) nell'ingresso MEMORY CARD 1. - -[SVMEM1] -Salva sulla memory card (PS2) nell'ingresso MEMORY CARD 1. - -[FORSLO] -Formatta la memory card (PS2) nell'ingresso MEMORY CARD 1. - -[SLONFM] -Errore di formattazione della memory card (PS2) nell'ingresso MEMORY CARD 1. - -[SLONDR] -Spazio insufficiente. Inserire una memory card (PS2) con almeno 500KB di spazio libero nell'ingresso MEMORY CARD 1. - -[SLNSP] -Spazio insufficiente. Inserire una memory card (PS2) con almeno 200KB di spazio libero nell'ingresso MEMORY CARD 1. - -[FEFD_WR] -Formattazione della memory card (PS2) nell'ingresso MEMORY CARD 1. Non rimuovere la memory card (PS2), riavviare o spegnere la console. - -[FES_ISF] -NON PRESENTE - -[FES_SAG] -PRESENTE - -[SLONNO] -Nessuna memory card (PS2) nell'ingresso MEMORY CARD 1. - -[SLONNF] -Memory card (PS2) nell'ingresso MEMORY CARD 1 non formattata. - -[FESZ_FM] -Memory card (PS2) nell'ingresso MEMORY CARD 1 non formattata. Vuoi formattare la memory card (PS2) nell'ingresso MEMORY CARD 1? - -[FESZ_FF] -Formattazione fallita! Controlla la memory card (PS2) nell'ingresso MEMORY CARD 1 e riprova. - -[MCDNSP] -Spazio insufficiente sulla memory card (PS2) nell'ingresso MEMORY CARD 1. Sono necessari almeno 500KB di spazio libero. Si desidera procedere? (SÌ o NO) - -[MCGNSP] -Spazio insufficiente sulla memory card (PS2) nell'ingresso MEMORY CARD 1. Sono necessari almeno 200KB di spazio libero. Si desidera procedere? (SÌ o NO) - -[FESZ_WR] -Salvataggio dati. Non rimuovere la memory card (PS2) dall'ingresso MEMORY CARD 1, riavviare o spegnere la console. - -[FESZ_OW] -Sovrascrittura dati. Non rimuovere la memory card (PS2) dall'ingresso MEMORY CARD 1, riavviare o spegnere la console. - -[FELD_WR] -Caricamento dati. Non rimuovere la memory card (PS2) dall'ingresso MEMORY CARD 1, riavviare o spegnere la console. - -[FEDL_WR] -Eliminazione dati. Non rimuovere la memory card (PS2) dall'ingresso MEMORY CARD 1, riavviare o spegnere la console. - -[LM2_C] -Luigi dice di, di darti questo, quindi... - -[LM3_G] -Joey non è tipo da aspettare: ricorda, questa è la tua grande occasione... - -[LM5_E] -Portane più che puoi prima che gli sbirri si bevano tutto lo stipendio. - -[JM5_C] -OK, c'è un'auto con ripieno di cadavere al bar vicino Callahan Point. - -[RM2_B] -Abbiamo visto i casini in Nicaragua, ai tempi in cui la nazione aveva ancora un senso. - -[RM2_C] -Qualche bastardo del Cartello l'ha maltrattato ieri e ha detto che ritornerà oggi per la sua merce. - -[RM2_D1] -Andrei io, ma la mia vecchia sciatica si fa sentire -cough cough- quindi, uhh, in bocca al lupo. - -[CATINF1] -~g~Prendi Catalina! - -[CATINF2] -~g~Segui l'elicottero per trovare Catalina. - -[BOATIN1] -Salta su una barca e premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per entrare. - -[BOATIN2] -Se sei vicino a una barca, puoi premere il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per tirarla verso di te. - -[BOATIN3] -Salta su una barca e premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per entrare. - -[BOATIN4] -Se sei vicino a una barca, puoi premere il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per tirarla verso di te. - -[JM6] -'LA PARTENZA' - -[FM1] -L'AUTISTA - -[JM1] -'L'ULTIMA CENA DI MIKE 'LABBRA'' - -[FM21] -'BOMBARDA LA BASE: ATTO PRIMO' - -[FM3] -'BOMBARDA LA BASE: ATTO SECONDO' - -[AM1] -'SAYONARA SALVATORE' - -[AM2] -'SOTTO SORVEGLIANZA' - -[KM2] -'GRAND THEFT AUTO' - -[AS3] -'S.A.M.' - -[RM2] -'A CORTO D'ARMI' - -[LOVE6] -'TRANELLO' - -[LOVE1] -'LIBERATORE' - -[RC1] -'DISTRUZIONE DEI DIABLO' - -[RC2] -'MASSACRO MAFIOSO' - -[RC3] -'CALAMITÀ AL CASINÒ' - -[RC4] -'LA FURIA DI RUMPO' - -[RM2_E1] -Non posso credere che quei bastardi musi gialli se ne siano andati lasciandomi di nuovo senza copertura! - -[GREN_1] -Quanto più a lungo tieni premuto il ~h~tasto ~k~~PED_FIREWEAPON~~w~, tanto più lontano lancerai la granata. - -[GREN_2] -Quanto più a lungo tieni premuto il ~h~tasto ~k~~PED_FIREWEAPON~~w~, tanto più lontano lancerai la granata. - -[GREN_3] -Quanto più a lungo tieni premuto il ~h~tasto ~k~~PED_FIREWEAPON~~w~, tanto più lontano lancerai la granata. - -[LOVE4_G] -Le mie proprietà ti aspettano all'interno dell'aereo nell'hangar doganale. - -[KABOOM] -KABOOOM! - -[SPLAT] -SPIACCICATO! - -[PANCAK] -SCHIACCIATO! - -[SOAKED] -ANNEGATO! - -[HEAD] -Head Radio - -[DBL_CLF] -Double Clef FM - -[FLASHB] -Flashback FM - -[RISE] -Rise FM - -[LIPS] -Lips 106 - -[CHAT] -Chatterbox FM - -[K_JAH] -K-Jah Radio - -[GAM_FM] -Game Radio FM - -[MSX_FM] -MSX FM - -[TUBE1] -Quando aprirà la metropolitana potrai prendere un treno verso Staunton Island. - -[TUBE2] -Quando aprirà Shoreside Vale potrai uscire dallo Shoreside terminal verso l'aeroporto internazionale Francis. - -[TUBE_2] -Per salire sulla metropolitana, premi il ~h~tasto 'entra nel veicolo'~w~. - -[LEGAL] -~g~Elimina la minaccia criminale! - -[GA_2] -Motore nuovo e carrozzeria riverniciata. Gli sbirri non ti riconosceranno! - -[LM1_8A] -Per guadagnare qualche soldo extra, perché non 'prendere in prestito' un taxi... - -[TAXIH1] -Fermati vicino a un pedone evidenziato per farlo salire a bordo e portarlo a destinazione prima che scada il tempo. - -[LM5_7] -~g~Se ci sono meno di quattro ragazze alla ~p~festa degli sbirri~g~, Luigi sarà nero! - -[KM2_3] -~g~Ricorda, le ~r~macchine~g~ devono essere in condizioni eccellenti per essere accolte nel ~p~garage~g~. - -[KM5_2] -~g~Uno Yardie è in giro per strada. - -[BETRA_A] -Scusa baby. - -[BETRA_B] -Sono una ragazza ambiziosa e tu, - -[BETRA_C] -sei una mezza calzetta. - -[JAILB_C] -Nessun dettaglio è stato fornito riguardo i prigionieri che venivano trasferiti dalla scorta, - -[JAILB_E] -La scorta aveva lasciato la centrale di polizia questa mattina presto... - -[JAILB_F] -per un trasferimento ordinario verso il penitenziario di Liberty. - -[JAILB_G] -L'attacco è avvenuto sul ponte Callahan, - -[JAILB_I] -Alcuni dei detenuti sembrerebbero essere deceduti a seguito dell'esplosione... - -[JAILB_P] -questo disastro lascia Portland isolata dal resto della città. - -[JAILB_Q] -Forza! - -[JAILB_R] -Signor stronzo! - -[JAILB_S] -Non è un problema ucciderti. - -[JAILB_T] -Te ne pentirai. - -[JAILB_U] -Va bene, va bene. Sparisci. - -[HELP15] -Quando sei a piedi, premi il ~h~tasto ~k~~PED_LOOKBEHIND~~w~ per ~h~guardare indietro~w~. - -[FEC_LB3] -Guarda indietro - -[FEC_R3] -(tasto R3) - -[FES_AFO] -Questa memory card (PS2) è già formattata. - -[FEA_UP] -; - -[FEA_DO] -= - -[FEA_LE] -< - -[FEA_RI] -> - -[FEDSAS3] -- CAMBIA SELEZIONE - -[FEDSAS4] -;=<> - CAMBIA SELEZIONE - -[SPRAY_4] -Usa il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare col cannone ad acqua. - -[SPRAY_1] -Usa il ~h~tasto ~k~~PED_FIREWEAPON~~w~ per sparare col cannone ad acqua. - -[LITTLE] -LITTLE T - -[NICK] -NICK LOVE - -[AM1_10] -Salvatore uscirà da Luigi's attorno alle 0~1~:~1~. - -[JAILB_V] -La città di Liberty è sotto shock. - -[JAILB_A] -Mentre la polizia e i servizi di emergenza affrontano le conseguenze... - -[JAILB_B] -di un devastante attacco alla scorta avvenuto questa mattina. - -[JAILB_W] -Rivelazioni sulla professionalità dell'attacco hanno sconvolto le forze dell'ordine, - -[JAILB_K] -Inoltre, l'identificazione dei detenuti scomparsi è stata ulteriormente ostacolata... - -[JAILB_L] -da un attacco informatico al computer principale della centrale di Polizia. - -[JAILB_M] -Il Sindaco O'Donovan ha dichiarato che la polizia considera l'attentato... - -[JAILB_N] -* - -[JAILB_O] -Considerato il ritardo nella costruzione del sottopassaggio Porter, - -[JAILB_X] -In un'affermazione resa nota ieri, - -[FEDS_SE] -Tasto / - SELEZIONA - -[FEDS_SB] -Tasto / - SELEZIONA Tasto " - INDIETRO - -[TM4_A] -~w~Oh, sei te. TONI non è qua. - -[TM4_A2] -~w~Ma ha lasciato una delle sue dolci lettere per te. - -[DIAB2_A] -Ho iniziato a lavorare nel business dell'intrattenimento solo grazie al voluminoso contenuto dei miei pantaloni di pelle! - -[LM5_9] -RAGAZZE: - -[PERPIC] -Pacchetti speciali recuperati - -[CO_ONE] -Pacchetto speciale ~1~ su ~1~ - -[LOVE3_3] -~g~L'aeroplano ha fatto cadere ~1~ dei 6 pacchi. - -[FARE11] -~g~Destinazione: ~w~'il cantiere costruzioni'~g~ a Fort Staunton. - -[GA_21] -Non puoi parcheggiare altri veicoli in questo garage. - -[CHEAT1] -Trucco attivato - -[CHEAT2] -Trucco armi - -[CHEAT3] -Trucco salute - -[CHEAT4] -Trucco armatura - -[CHEAT5] -Trucco livello di sospetto - -[CHEAT6] -Trucco soldi - -[CHEAT7] -Trucco tempo atmosferico - -[AS1_H] -~r~Hai fallito nel far cadere la squadra della morte nella trappola della Yakuza!!! - -[FEDS_BA] -Tasto " - INDIETRO - -[RAMP_A] -TUTTE LE VIOLENZE COMPLETATE! - -[USJ_ALL] -TUTTE LE ACROBAZIE UNICHE COMPLETATE - -[FARE23] -~g~Destinazione: ~w~'Garage importazioni-esportazioni' ~g~nel distretto della diga Cochrane. - -[L_TRN_1] -Puoi prendere il treno sopraelevato a Portland. Premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per ~h~entrare~w~ o ~h~uscire~w~ da un vagone. - -[L_TRN_2] -Puoi prendere il treno sopraelevato a Portland. Premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per ~h~entrare~w~ o ~h~uscire~w~ da un vagone. - -[S_TRN_1] -Puoi prendere la metropolitana attraverso Liberty. Premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per ~h~entrare~w~ o ~h~uscire~w~ da un vagone. - -[S_TRN_2] -Puoi prendere la metropolitana attraverso Liberty. Premi il ~h~tasto ~k~~VEHICLE_ENTER_EXIT~~w~ per ~h~entrare~w~ o ~h~uscire~w~ da un vagone. - -[AS1_C] -~w~Ha tre squadre della morte in giro per Liberty il cui unico scopo è beccarti. - -[AS1_G] -~r~Tutti i membri della Yakuza sono morti!!! - -[JAN] -Gen - -[FEB] -Feb - -[MAR] -Mar - -[APR] -Apr - -[MAY] -Mag - -[JUN] -Giu - -[JUL] -Lug - -[AUG] -Ago - -[SEP] -Set - -[OCT] -Ott - -[NOV] -Nov - -[DEC] -Dic - -[DEFDT] -Nessun salvataggio valido - -[BUGGY] -MAGGIOLINI RIMASTI: - -[BONUS] -~g~BONUS $~1~$ - -[HORN1] -Premi il ~h~tasto L3~w~ per suonare il ~h~clacson~w~. - -[HORN2] -Premi il ~h~tasto L1~w~ per suonare il ~h~clacson~w~. - -[HORN3] -Premi il ~h~tasto R1~w~ per suonare il ~h~clacson~w~. - -[LM3_1A] -Premi il ~h~tasto ~k~~VEHICLE_HORN~~w~ per suonare il ~h~clacson~w~ e avvertire Misty che sei arrivato. - -[LM3_1B] -Premi il ~h~tasto ~k~~VEHICLE_HORN~~w~ per suonare il ~h~clacson~w~ e avvertire Misty che sei arrivato. - -[LM3_1C] -Premi il ~h~tasto ~k~~VEHICLE_HORN~~w~ per suonare il ~h~clacson~w~ e avvertire Misty che sei arrivato. - -[RADIO_A] -Premi il ~h~tasto ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ per passare in rassegna le ~h~stazioni radio~w~. - -[RADIO_B] -Premi il ~h~tasto ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ per passare in rassegna le ~h~stazioni radio~w~. - -[RADIO_C] -Premi il ~h~tasto ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ per passare in rassegna le ~h~stazioni radio~w~. - -[RADIO_D] -Premi il ~h~tasto ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ per passare in rassegna le ~h~stazioni radio~w~. - -[FEC_EXV] -Entra o esci dal veicolo - -[TAXI_M] -'TAXISTA' - -[COP_M] -'VIGILANTE' - -[FIRE_M] -'POMPIERE' - -[AMBUL_M] -'PARAMEDICO' - -[HJ_IS] -BONUS ACROBAZIA FOLLE: ~1~$ - -[HJ_PIS] -BONUS ACROBAZIA FOLLE PERFETTA: $~1~ - -[HJ_DIS] -BONUS DOPPIA ACROBAZIA FOLLE: $~1~ - -[HJ_PDIS] -BONUS DOPPIA ACROBAZIA FOLLE PERFETTA: $~1~ - -[HJ_TIS] -BONUS TRIPLA ACROBAZIA FOLLE: $~1~ - -[HJ_PTIS] -BONUS TRIPLA ACROBAZIA FOLLE PERFETTA: $~1~ - -[HJ_QIS] -BONUS QUADRUPLA ACROBAZIA FOLLE: $~1~ - -[HJ_PQIS] -BONUS QUADRUPLA ACROBAZIA FOLLE PERFETTA: $~1~ - -[AM1_K] -Salvatore Leone uscirà da Luigi's fra circa tre ore. (0~1~:~1~) - -[IMPEXPP] -Garage importazioni-esportazioni, porto di Portland. Abbiamo richieste per vari mezzi: consulta la bacheca per le saperne di più. - -[VANHSTP] -Hai scassinato altre Securicar? Portale al nostro garage al porto di Portland. - -[EMVHPUP] -Ottimi prezzi per veicoli di soccorso nuovi o usati. Portali vicino alla gru a nord est del porto di Portland. - -[STANDS] -CHIOSCHI DISTRUTTI: - -[STASH] -~g~Nascondi lo SPANK nel ~p~cantiere edile~g~! - -[MCSTNS] -Nessuna memory card (PS2) nell'ingresso MEMORY CARD 1. Vuoi procedere comunque? (SÌ o NO) - -[LOVE3_5] -~g~L'aeroplano è a tiro. - -[LOVE3_6] -~r~La polizia è arrivata ai pacchi per prima! - -[SIREN_1] -Per accendere le sirene di questo veicolo, premi il ~h~tasto ~k~~VEHICLE_HORN~~w~. - -[SIREN_2] -Per accendere le sirene di questo veicolo, premi il ~h~tasto ~k~~VEHICLE_HORN~~w~. - -[FM3_8C] -~w~Avrò bisogno di 100.000$ per coprire le spese, - -[MCLOAD] -Caricamento dati. Non rimuovere la memory card (PS2) dall'ingresso MEMORY CARD 1, riavviare o spegnere la console. - -[FES_GME] -Errore di lettura della memory card (PS2) nell'ingresso MEMORY CARD 1! Controlla la memory card (PS2) e riprova. - -[FESZ_QF] -Sei sicuro di voler formattare la memory card (PS2) nell'ingresso MEMORY CARD 1? - -[FESZ_LS] -Caricamento riuscito. - -[RM3_5] -~g~Hai raccolto ~1~ su 6 prove. - -[LOVE3_2] -~g~Hai tutti i pacchi! Riportali subito a Donald Love. - -[LOVE4_4] -~g~Riporta il pacco a Donald Love. - -[FEDS_AM] -<>-CAMBIA MENU - -[FEB_SAV] -Carica - -[FEP_SAV] -CARICA PARTITA - -[AS2_12A] -~g~Dopo aver distrutto il primo chiosco, avrai 8 minuti prima che il Cartello informi i propri spacciatori! - -[AS3_1A] -~g~Adesso raggiungi la ~b~boa segnalatrice~g~! - -[NOCONT] -Ricollega il controller analogico (DUALSHOCK#) o controller analogico (DUALSHOCK#2) all'ingresso controller 1 per continuare. - -[BET_JB] -TRADITO DALLA SUA AMANTE CATALANA E ABBANDONATO MEZZO MORTO. GIUDICATO COLPEVOLE, INIZIA LA SUA AVVENTURA NEL PENITENZIARIO DELLA CITTÀ DI LIBERTY. HA UN SOLO PENSIERO FISSO NELLA TESTA... LA VENDETTA! - -[END_A] -I residenti in Cedar Grove si sono finalmente ripresi - -[END_B] -dallo spavento per i violenti scontri - -[END_C] -avvenuti ieri nell'area. - -[END_D] -Un abitante della zona, Clive Denver, ha dichiarato alla polizia - -[END_E] -di aver visto un uomo armato che sia allontanava dalla scena del crimine con una donna dai capelli neri. - -[END_F] -Oh, lo sai, vedrai che ci divertiremo, perché lo sai, cioè, - -[END_G] -io ti amo, io... io ti amo davvero perché sei un vero uomo - -[END_H] -ed è ciò di cui ho bisogno. - -[END_I] -Comunque, cosa stavo dicendo? - -[END_J] -Oh, lo sai, me lo sono dimenticato. Sai com'è che succede, vero? - -[END_K] -Il suono delle esplosioni ha fatto tremare le case mentre la gente correva al riparo. - -[END_L] -Molti cittadini sono rimasti feriti per il panico mentre venivano sparati colpi - -[END_M] -tra le forze terrestri e l'elicottero che sorvolava la diga. - -[END_N] -Sì, c'è proprio una bella vista da qui in giardino. - -[END_O] -Quando hanno fatto saltare l'elicottero - -[END_P] -è stato meglio dei fuochi d'artificio del 4 luglio. - -[END_Q] -Il numero di cadaveri recuperati ha già superato la ventina, - -[END_R] -ma la polizia continua a trovare nuovi corpi. - -[END_S] -Non sono state smentite le voci secondo cui - -[END_T] -i morti appartenessero al Cartello Colombiano, - -[END_U] -ciò nonostante, non ci sono indizi sulle ragioni di questa strage. - -[END_V] -Mi sono rotta un'unghia e i miei capelli sono un disastro. Ma ci puoi credere? - -[END_W] -Mi è costato 50 dollari... - -[PAPER1] -CRIMINALE FERITO DALLA FIDANZATA COMPLICE. LA CORTE GIUDICA IL RAPINATORE COLPEVOLE CON VERDETTO UNANIME. - -[PAPER2] -DIECI ANNI PER L'AMORE! - -[JAILB_J] -che è seguita all'attacco iniziale. - -[JAILB_D] -E nessun gruppo ha rivendicato l'attentato. - -[JAILB_H] -lasciando pochi testimoni e il ponte stesso seriamente danneggiato. - -[FEB_CPC] -Configurazione comandi - -[FEC_PED] -Comandi a piedi - -[FEC_VEH] -Comandi in un veicolo - -[FEC_FPR] -Comandi in prima persona - -[FEC_CMM] -Comandi comuni - -[FEC_PWL] -Cammina a sinistra - -[FEC_PWR] -Cammina a destra - -[FEC_PWF] -Cammina in avanti - -[FEC_PWT] -Cammina verso la telecamera - -[FEC_PLB] -Guardati indietro - -[FEC_PFR] -Spara con l'arma - -[FEC_CLE] -Arma precedente - -[FEC_CRI] -Arma successiva - -[FEC_LKT] -Aggancia bersaglio - -[FEC_PJP] -Salto Ped - -[FEC_PSP] -Scatto Ped - -[FEC_PSH] -Sparo Ped - -[FEC_TLF] -Bersaglio successivo a sinistra - -[FEC_TRG] -Bersaglio successivo a destra - -[FEC_CCM] -Centra visuale dietro al giocatore - -[FEC_SZI] -Ingrandimento fucile di precisione - -[FEC_SZO] -Riduzione fucile di precisione - -[FEC_LKL] -Sguardo a sinistra - -[FEC_LRT] -Sguardo a destra - -[FEC_LUP] -Sguardo verso l'alto - -[FEC_LDN] -Sguardo verso il basso - -[FEC_LBH] -Guarda dietro al veicolo - -[FEC_LLF] -Guarda a sinistra del veicolo - -[FEC_LRG] -Guarda a destra del veicolo - -[FEC_HRN] -Clacson - -[FEC_HBR] -Freno a mano - -[FEC_ACL] -Acceleratore - -[FEC_BRK] -Freno - -[FEC_TSM] -Attiva/Disattiva sottomissioni - -[FEC_CRD] -Cambia stazione radio - -[FEC_ENT] -Entra/Esci da un veicolo - -[FEC_WPN] -Spara con l'arma - -[FEC_PAS] -Pausa - -[FEC_FPO] -Attiva/Disattiva visuale di puntamento - -[FEC_SMS] -Mostra/Nascondi puntatore del mouse - -[FEC_CMS] -Cambia la modalità di visuale in qualsiasi situazione - -[FEC_TSS] -Salva un'immagine di gioco - -[FEN_NET] -Rete - -[FEN_CON] -Connessione - -[FEN_GAM] -Trova partite - -[FEN_TYP] -Modalità - -[FEN_TY0] -Deathmatch - -[FEN_TY1] -Deathmatch stealth - -[FEN_TY2] -Deathmatch a squadre - -[FEN_TY3] -Deathmatch stealth a squadre - -[FEN_TY4] -Accumula denaro - -[FEN_TY5] -Cattura la bandiera - -[FEN_TY6] -Rat Race - -[FEN_TY7] -Dominazione - -[FEN_NAM] -Nome: - -[FEN_GNA] -Nome partita: - -[FEM_MAP] -Seleziona mappa - -[FEN_PLS] -Impostazioni giocatore - -[FEN_PLC] -Colore giocatore - -[FEM_MA0] -Città di Liberty - -[FEM_MA1] -Luci rosse - -[FEM_MA2] -Chinatown - -[FEM_MA3] -La torre - -[FEM_MA4] -Le fogne - -[FEM_MA5] -Area industriale - -[FEM_MA6] -Porto - -[FEM_MA7] -Staunton - -[FEC_EMS] -Un tasto può essere assegnato a un solo comando! - -[FEC_DBG] -Menu debug - -[FEC_TGD] -Pad game/Debug - -[FEC_TDO] -Disabilita visuale debug - -[FEC_IVH] -Inverti mouse orizzontalmente - -[FEC_MSL] -PULSANTE SX - -[FEC_MSM] -PULSANTE CEN - -[FEC_MSR] -PULSANTE DX - -[FEC_QUE] -??? - -[FEC_TWO] -Un massimo di due tasti per comando. - -[FEC_UMS] -Un pulsante del mouse può essere assegnato a un solo comando! - -[FEC_OMS] -Solo un pulsante del mouse. - -[FEC_UJS] -Un pulsante del joystick può essere usato per un solo comando! - -[FEC_OJS] -Solo un pulsante del joystick. - -[FEC_PTL] -Usa Aggancia bersaglio con Arma precedente - -[FEC_PTR] -Usa Aggancia bersaglio con Arma successiva - -[FEC_LBC] -Usa Guarda a sinistra con Guarda a destra - -[FEC_JBO] -JOY ~1~ - -[NO_PAUZ] -Pausa non disponibile in modalità multigiocatore. Premi ancora per uscire. - -[FEM_SL1] -Blocco 1 libero - -[FEM_SL2] -Blocco 2 libero - -[FEM_SL3] -Blocco 3 libero - -[FEM_SL4] -Blocco 4 libero - -[FEM_SL5] -Blocco 5 libero - -[FEM_SL6] -Blocco 6 libero - -[FEM_SL7] -Blocco 7 libero - -[FEM_SL8] -Blocco 8 libero - -[FEM_MM] -MENU PRINCIPALE - -[FEM_SNG] -Nuova partita - -[FEM_QTW] -Esci - -[FEQ_SRE] -Sei sicuro di voler uscire? Tutti i progressi dall'ultimo salvataggio verranno persi. Vuoi procedere? - -[FEQ_SRW] -Sei sicuro di voler uscire dal gioco? - -[FEG_SRV] -SERVER - -[FEG_MAP] -MAPPA - -[FEG_PLY] -GIOCATORI - -[FEG_TYP] -MODALITÀ - -[FEG_PNG] -PING - -[FET_FG] -TROVA PARTITA - -[FET_SP] -GIOCATORE SINGOLO - -[FET_MP] -MULTIGIOCATORE - -[FET_HG] -OSPITA PARTITA - -[FET_PS] -IMPOSTAZIONI GIOCATORE - -[FET_CON] -CONNESSIONE - -[FET_AUD] -IMPOSTAZIONI AUDIO - -[FET_GFX] -IMPOSTAZIONI GRAFICA - -[FET_DIS] -IMPOSTAZIONI VIDEO - -[FET_LAN] -IMPOSTAZIONI LINGUA - -[FET_LG] -CARICA PARTITA - -[FET_DG] -ELIMINA PARTITA - -[FET_NG] -NUOVA PARTITA - -[FET_SG] -SALVA PARTITA - -[FET_MAP] -SELEZIONA MAPPA - -[FET_GT] -MODALITÀ DI GIOCO - -[FET_CTL] -IMPOSTAZIONI DEI COMANDI - -[FET_OPT] -OPZIONI - -[FET_QG] -ESCI DAL GIOCO - -[FET_STA] -STATISTICHE - -[FET_BRE] -MISSIONI - -[FEC_WAR] -Attenzione - -[FEC_OKK] -OK - -[FED_CON] -Conferma eliminazione file - -[FES_SSC] -Partita salvata con successo - -[DEL_FNM] -File eliminato con successo. - -[PCLOAD] -Caricamento dati in corso - -[PCRESRT] -Riavvio di Grand Theft Auto III - -[FEC_DLF] -Eliminazione fallita. - -[FEC_SVU] -Salvataggio fallito. - -[FEC_LUN] -Caricamento fallito. File corrotto: è necessario eliminarlo. - -[FEN_PLA] -Numero di giocatori: - -[FET_NON] -NESSUNA PARTITA DISPONIBILE - -[FET_SFG] -RICERCA DI PARTITE... - -[FET_SRT] -CLASSIFICAZIONE PARTITE... - -[FEF_LAN] -LAN - -[FEF_INT] -INTERNET - -[FET_REF] -Aggiorna - -[FET_FIL] -Filtra - -[FET_JG] -Partecipa - -[FEC_NTW] -Talk To Network - -[FEC_ESR] -Il tasto ESC è riservato - -[FEC_GSL] -Show head bob: - -[FIL_FLT] -FILTRA ELENCO PARTITE - -[FET_SAN] -NUOVA PARTITA - -[FIL_MAP] -Mappa: - -[FIL_SRV] -Server: - -[FIL_TYP] -Modalità: - -[FIL_SPC] -Partite non piene? - -[FIL_PNG] -Ping: - -[FEN_UKH] -Host sconosciuto - -[FEN_UKM] -Mappa non trovata - -[FEN_UKT] -Modalità non trovata - -[FEN_NCI] -NON CONNESSO A INTERNET - -[FET_PAU] -MENU PAUSA - -[FET_SGA] -AVVIA PARTITA - -[FEC_SGJ] -Imposta joystick - -[FEC_PAD] -Gamepad - -[FEC_JOY] -Joystick - -[FEC_WHL] -Volante - -[FEC_CNT] -Periferica di controllo: - -[FET_APL] -APPLICA - -[FES_CSA] -Seleziona una skin dalla seguente lista: - -[FES_SKN] -NOME SKIN - -[FES_DAT] -DATA - -[FES_NON] -NESSUNA SKIN DISPONIBILE - -[FEA_FM9] -RIPRODUTTORE MP3 - -[FESZ_QZ] -Sei sicuro di voler salvare la partita? - -[FES_CGA] -Blocchi di gioco disponibili: - -[FES_SCG] -Vuoi salvare la partita attuale? - -[FES_LCG] -Vuoi caricare e continuare la partita? - -[FEC_FIR] -Fuoco - -[FEC_NWE] -Arma successiva - -[FEC_PWE] -Arma precedente - -[FEC_FOR] -Avanti - -[FEC_BAC] -Indietro - -[FEC_LEF] -Sinistra - -[FEC_RIG] -Destra - -[FEC_ZIN] -Ingrandimento - -[FEC_ZOT] -Riduzione - -[FEC_EEX] -Entra/Esci - -[FEC_RAD] -Radio - -[FEC_SUB] -Sottomissioni - -[FEC_CMR] -Cambia visuale - -[FEC_JMP] -Salto - -[FEC_SPN] -Scatto - -[FEC_HND] -Freno a mano - -[FEC_TUL] -Torretta a sx - -[FEC_TUR] -Torretta a dx - -[FEC_LOL] -Guarda a sinistra - -[FEC_LOR] -Guarda a destra - -[FEC_NTR] -Bersaglio successivo - -[FEC_PTT] -Bersaglio precedente - -[FEC_LBA] -Guarda indietro - -[FEC_CEN] -Centra visuale - -[FEC_UND] -(NO) - -[FET_CFT] -A PIEDI - -[FET_CCR] -IN MACCHINA - -[CVT_MSG] -Conversione texture per prestazioni ottimali con la tua scheda video - -[FET_CAC] -AZIONE - -[FEC_IBT] -- - -[FEC_SPC] -BARRA - -[FEC_MXO] -P1MX - -[FEC_MXT] -P2MX - -[FEC_UNB] -NESSUNO - -[FET_CME] -METODO DI CONTROLLO - -[FET_RDK] -RIDEFINISCI COMANDI - -[FET_AMS] -IMPOSTAZIONI MOUSE - -[FET_STI] -CONFIGURAZIONE PREDEFINITA - -[FET_CTI] -CONFIGURAZIONE CLASSICA - -[FET_MTI] -CONFIGURAZIONE COL MOUSE - -[FET_DAM] -MODELLAZIONE ACUSTICA DINAMICA - -[FEC_TFL] -Torretta a sinistra - -[FEC_TFR] -Torretta a destra - -[FEC_TFU] -Torretta /Aereo su - -[FEC_TFD] -Torretta /Aereo giù - -[FEC_MWF] -VOLANTE SU - -[FEC_MWB] -VOLANTE GIÙ - -[FEC_ORR] -o - -[FEC_NUS] -NON USATO - -[FEC_LUD] -Sguardo su - -[FEC_LDU] -Sguardo giù - -[FEC_CMP] -COMBO: SGUARDO S+D - -[FEC_NTT] -Nessun testo assegnato a questo tasto - -[FEC_FNC] -F~1~ - -[FEC_IRT] -INS - -[FEC_DLL] -CANC - -[FEC_HME] -HOME - -[FEC_END] -FINE - -[FEC_PGU] -PAG SU - -[FEC_PGD] -PAG GIÙ - -[FEC_UPA] -SU - -[FEC_DWA] -GIÙ - -[FEC_LFA] -SINISTRA - -[FEC_RFA] -DESTRA - -[FEC_NUM] -NUM - -[FEC_NMN] -NUM~1~ - -[FEC_FWS] -NUM / - -[FEC_PLS] -NUM + - -[FEC_MIN] -NUM - - -[FEC_DOT] -NUM . - -[FEC_NLK] -BLOC NUM - -[FEC_ETR] -INVIO - -[FEC_SLK] -BLOC SCORR - -[FEC_PSB] -PAUSA - -[FEC_BSP] -INDIETRO - -[FEC_TAB] -TAB - -[FEC_CLK] -BLOC MAIUSC - -[FEC_RTN] -RET - -[FEC_LSF] -MAIUSC SX - -[FEC_RSF] -MAIUSC DX - -[FEC_LCT] -CTRL SX - -[FEC_RCT] -CTRL DX - -[FEC_LAL] -ALT SX - -[FEC_RAL] -ALT DX - -[FEC_LWD] -WIN SX - -[FEC_RWD] -WIN DX - -[FEC_WRC] -CLIC WIN - -[WIN_TTL] -Grand Theft Auto III - -[WIN_95] -Grand Theft Auto III non è supportato da Windows 95 - -[WIN_DX] -Grand Theft Auto III richiede DirectX versione 8.1 o superiore - -[WIN_VDM] -Grand Theft Auto III richiede almeno 12 MB di memoria video disponibile - -[DIAB3_G] -Arriba! - -[FEM_RES] -RIPRENDI PARTITA - -[FES_SNG] -NUOVA PARTITA - -[FEM_SP] -GIOCATORE SINGOLO - -[FEM_MP] -MULTIGIOCATORE - -[FEM_QT] -ESCI DAL GIOCO - -[FES_SG] -NUOVA PARTITA - -[FES_LG] -CARICA PARTITA - -[FEM_HST] -OSPITA PARTITA - -[FEM_OPT] -OPZIONI - -[FEM_DBG] -DEBUG - -[FET_PSU] -IMPOSTAZIONI GIOCATORE - -[FET_DEF] -RIPRISTINA PREDEFINITI - -[FED_BRI] -LUMINOSITÀ - -[FED_TRA] -TRACCE - -[FEM_LOD] -DISTANZA VISUALE - -[FEM_VSC] -SINCRONIA FRAME - -[FEM_FRM] -LIMITATORE FRAME - -[FED_RES] -RISOLUZIONE - -[FED_WIS] -SCHERMO 16:9 - -[FEDS_TB] -INDIETRO - -[FEA_MUS] -VOLUME MUSICA - -[FEA_SFX] -VOLUME EFFETTI - -[FEA_RSS] -STAZIONE RADIO - -[FEL_ENG] -INGLESE - -[FEL_FRE] -FRANCESE - -[FEL_GER] -TEDESCO - -[FEL_ITA] -ITALIANO - -[FEL_SPA] -SPAGNOLO - -[FEA_3DH] -HARDWARE AUDIO - -[FEA_SPK] -CONFIGURAZIONE ALTOPARLANTI - -[FEA_2SP] -DUE CASSE - -[FEA_4SP] -PIÙ DI DUE CASSE - -[FEA_EAR] -CUFFIE - -[FEA_NAH] -NESSUN HARDWARE AUDIO - -[FET_SNG] -NUOVA PARTITA - -[FEN_STA] -AVVIA LA PARTITA - -[GMLOAD] -CARICA PARTITA - -[GMSAVE] -SALVA PARTITA - -[FES_DGA] -ELIMINA PARTITA - -[FEM_NON] -NESSUNO - -[FEC_IVV] -INVERTI MOUSE VERTICALMENTE - -[FEC_MSH] -SENSIBILITÀ MOUSE - -[FET_CCN] -COMANDI: CLASSICO - -[FET_SCN] -COMANDI: PREDEFINITO - -[FES_SET] -USA SKIN - -[GHOST] -Fantasma - -[WIN_RSZ] -Impossibile impostare la nuova risoluzione - -[FET_APP] -PULSANTE SX, INVIO PER APPLICARE LE NUOVE IMPOSTAZIONI - -[FET_HRD] -IMPOSTAZIONI PREDEFINITE RIPRISTINATE - -[FET_MST] -STERZO VIA MOUSE - -[FEC_STR] -NUM ASTERISCO - -[FET_MIG] -SINISTRA, DESTRA, ROTELLA PER MODIFICARE - -[FET_CIG] -INDIETRO PER AZZERARE - PULSANTE SX, INVIO PER MODIFICARE - -[FET_RIG] -SELEZIONA UN NUOVO COMANDO PER QUESTA AZIONE O PREMI ESC PER ANNULLARE - -[FET_EIG] -IMPOSSIBILE ASSEGNARE UN COMANDO A QUESTA AZIONE - -[NO_PCCD] -Inserisci il disco 2 di Grand Theft Auto III nel lettore o premi ESC per annullare - -[CVT_ERR] -Spazio su disco esaurito; è necessario liberare dello spazio prima di poter procedere. Premi ESC per annullare. - -[FED_SUB] -SOTTOTITOLI - -[FET_DSN] -Skin predefinita.bmp - -[JM3] -'RAPINA AL FURGONE' - -[EBAL] -'GIVE ME LIBERTY' - -[LM4] -'ARMI PRONTE ALL'AZIONE' - -[ATUTOR2] -~g~Porta i pazienti all'ospedale! Qualsiasi scossone ridurrà le probabilità che arrivino vivi. - -[REPLAY] -REPLAY - -[FEC_SFT] -MAIUSC - -[CRED254] -RESPONSABILE STUDIO - -[CVT_CRT] -Impossibile convertire le texture per la scheda video. Deve collegarti come Amministratore per poterlo fare. Premi ESC per uscire. - -[FEM_ON] -ON - -[FEM_OFF] -OFF - -[FEM_YES] -SÌ - -[FEM_NO] -NO - -[FES_WAR] -Salvataggio, attendere... - -[FED_DLW] -Eliminazione, attendere... - -[FED_LDW] -Caricamento, attendere... - -[FEC_SLC] -Slot non valido - -[FED_LFL] -Caricamento posizione salvata fallito. Il gioco verrà riavviato. - -[FET_RSO] -RIPRISTINATE IMPOSTAZIONI ORIGINALI - -[FET_RSC] -HARDWARE NON DISPONIBILE - RIPRISTINATE IMPOSTAZIONI ORIGINALI - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file diff --git a/utils/gxt/russian.txt b/utils/gxt/russian.txt deleted file mode 100644 index 4598dad5..00000000 --- a/utils/gxt/russian.txt +++ /dev/null @@ -1,7979 +0,0 @@ -[1000] -ТЫ ПОКОЙНИК - -[1001] -ТЫ ПОКОЙНИК - -[1002] -ТЫ ПОКОЙНИК - -[1003] -ТЫ ПОКОЙНИК - -[1004] -ТЫ ПОКОЙНИК - -[1005] -АРЕСТОВАН - -[1006] -АРЕСТОВАН - -[1007] -АРЕСТОВАН - -[1008] -АРЕСТОВАН - -[1009] -АРЕСТОВАН - -[1010] -~r~Твоя тачка перевернулась - -[1011] -~r~Твоя тачка перевернулась - -[1012] -~r~Твоя тачка перевернулась - -[1013] -~r~Твоя тачка перевернулась - -[1014] -~r~Твоя тачка перевернулась - -[8001] -Тебе крупно не повезло!! - -[ACCURA] -Меткость - -[AEROPL] -Самолет - -[AIRPORT] -Аэропорт Фрэнсис - -[ALEVEL] -Скорая помощь. Задание ~1~ - -[AM1] -'САЙОНАРА, САЛЬВАТОРЕ' - -[AM1_1] -~g~Сейчас Сальваторе выходит из клуба Луиджи! - -[AM1_10] -~g~Сальваторе уйдет от Луиджи в 0~1~:~1~ - -[AM1_2] -~r~Тебя засекли! - -[AM1_3] -~r~Ты упустил Сальваторе! - -[AM1_4] -~r~Кретин, ты его спугнул! Какой ты к черту киллер? - -[AM1_5] -~g~Отправляйся в квартал красных фонарей и жди, когда Сальваторе выйдет из клуба. - -[AM1_6] -~g~Если ты будешь болтаться около клуба Луиджи, то тебя увидит мафия! - -[AM1_7] -~r~Сальваторе дома в безопасности попивает коктейль. Все с тобой ясно, шакал! - -[AM1_8] -~g~Сальваторе уйдет от Луиджи примерно в ~1~:~1~ - -[AM1_9] -~r~Сальваторе скрылся в клубе Луиджи! - -[AM1_A] -Нам нужно кое что прояснить, прежде чем начнем налаживать какие-либо отношения, - -[AM1_B] -деловые или нет. Давай раскроем карты. - -[AM1_C] -Я из Якудзы и знаю, что ты работал на семью Сальваторе Леоне. - -[AM1_D] -Я могу дать тебе работу в нашей организации, - -[AM1_E] -но сначала тебе придется доказать, что ты на самом деле порвал с мафией. - -[AM1_F] -Сальваторе Леоне выйдет от Луиджи примерно через три часа. (~1~:~1~) - -[AM1_G] -Постарайся, чтобы он не добрался до дома живым. - -[AM1_H] -Ну а мы с Марией пока вспомним былые времена. - -[AM1_I] -О, Асука, у тебя новый массажист. - -[AM1_J] -Это не массажист. - -[AM1_K] -Сальваторе Леоне выйдет от Луиджи примерно в три часа. (0~1~:~1~) - -[AM2] -'ПОД НАДЗОРОМ' - -[AM2_4] -~g~Они тебя засекли, ты шел как слепой слон! - -[AM2_A] -Смерть Сальваторе - очень приятная новость, - -[AM2_A2] -ты отличный киллер. Мне нравятся такие мужики. - -[AM2_B] -Это мой брат Кенжи. - -[AM2_C] -У Асуки для тебя есть работа, но как только освободишься - загляни ко мне в казино. - -[AM2_D] -Кенжи как всегда тянет руки к моим игрушкам. - -[AM2_E] -Мои люди в полиции собщили, что мафия следит за всеми нашими делами в городе, - -[AM2_E2] -так они пытаются выйти на тебя. - -[AM2_F] -Они мешают нам работать. Нужно устранить эту проблему. - -[AM2_G] -Разберись с этими шпионами-самоучками и прекрати вендетту раз и навсегда. - -[AM3] -'ПРОЩАЙ, ПАПАРАЦЦИ' - -[AM3_A] -Тут один журналист что-то вынюхивает. - -[AM3_B] -Мы с Марией немного отдохнем, пока ты не избавишься от этого назойливого писаки. - -[AM3_C] -Пока ты это читаешь, он, вероятно, в гавани! Угони полицейский катер и 'потопи' его карьеру! - -[AM4] -'ДЕНЬГИ ДЛЯ РЭЯ' - -[AM4_10] -Знаешь, я тоже иногда могу подкинуть работенку. - -[AM4_11] -Если что - ты знаешь, где меня найти. - -[AM4_1A] -Доберись до телефона к западу от парка Бельвиль. - -[AM4_1B] -Доберись до телефона в Учебном городке. - -[AM4_1C] -Доберись до телефона к югу от парка Бельвиль. - -[AM4_1D] -Встречаемся в туалете, расположенном в парке. - -[AM4_3] -Ты, должно быть, новый посыльный Асуки! - -[AM4_4] -Ты принес мне деньги? Это все? - -[AM4_5] -Я знаю, ты думаешь - еще один продажный коп. - -[AM4_6] -Да, мы живем в продажном мире. - -[AM4_7] -Мной занялась служба внутреннего расследования только из-за того, что я потерял двух напарников. - -[AM4_8] -Приходится быть начеку. - -[AM4_9] -Да, весь этот город - одна большая помойная яма. - -[AM4_A] -Да это же мой красавчик! - -[AM4_B] -Мария сейчас очень занята, но я ей передам, что ты заходил. - -[AM4_C] -Асука, кто это? Я бы и сама вышла, но я очень хочу писать, окей? - -[AM4_D] -Ты должен встретиться с моим знакомым копом. - -[AM4_E] -Это деньги за его последнюю работу, что он сделал для нас. - -[AM4_F] -Разумеется, он очень осторожен. - -[AM4_G] -Немедленно отправляйся к телефону-автомату в Торрингтоне и жди его инструкций. - -[AM5] -'ДВУЛИКИЙ ТАННЕР' - -[AM5_1] -Таннер у тебя на хвосте! - -[AM5_A] -Мы с Марией пошли по магазинам. - -[AM5_B] -Мой человек в полиции сообщил, что один из наших водил, на самом деле - полицейский под прикрытием! - -[AM5_C] -Он не вылезает из своей тачки, поэтому мы прикрепили к ней маячок. - -[AM5_D] -Пусти ему кровь! - -[AMBULAN] -Скорая - -[AMBUL_M] -'СКОРАЯ ПОМОЩЬ' - -[AMMU] -Чтобы купить оружие - зайди в магазин. - -[AMMU_A] -Луиджи сказал, тебе нужен ствол... - -[AMMU_B] -Джоуи кое что для тебя заказал... - -[AMMU_C] -Иди во двор магазина, я там тебе кое-что припас. - -[AMMU_D] -У меня есть все что тебе понадобится. - -[AMMU_E] -Тебе и лицензия нужна? - -[AMMU_F] -Документов можешь не показывать, я и так тебе верю. - -[APR] -Апр - -[AS1] -'НАЖИВКА' - -[AS1_A] -~w~Мигель считает, что я плохо с ним обращаюсь. - -[AS1_B] -~w~Но он все-таки рассказал, что Каталина жутко боится твоей мести. - -[AS1_C] -~w~Она послала в город три группы убийц, чтобы они выследили и прикончили тебя. - -[AS1_D] -~w~Тебе придется побыть наживкой и постараться заманить их в Пайк Крик, - -[AS1_E] -~w~там их уже будут поджидать мои люди. - -[AS1_G] -~r~Все якудза перебиты! - -[AS1_H] -~r~Тебе не удалось заманить убийц в ловушку Якудзы! - -[AS2] -'КОФЕ НА ВЫНОС!' - -[AS2_1] -~g~В Портланде уничтожены все кофейные ларьки! - -[AS2_10] -~g~Кофейные ларьки еще стоят в Портланде и на острове Стаунтон. - -[AS2_11] -~g~~1~ ИЗ 9! - -[AS2_12] -~g~Объедь все районы города и отыщи ~b~кофейные ларьки~g~! - -[AS2_12A] -~g~После того как ты уничтожишь первый ларек, у тебя будет 8 минут, прежде чем Картель забьет тревогу! - -[AS2_2] -~g~На острове Стаунтон уничтожены все кофейные ларьки! - -[AS2_3] -~g~В Шорсайд Вейл уничтожены все кофейные ларьки! - -[AS2_4] -~r~Картель предупредил продавцов наркоты! - -[AS2_5] -~g~Кофейные ларьки еще стоят в Шорсайд Вейл и на острове Стаунтон! - -[AS2_6] -~g~Кофейные ларьки еще стоят в Шорсайд Вейл! - -[AS2_7] -~g~Кофейные ларьки еще стоят на острове Стаунтон! - -[AS2_8] -~g~Кофейные ларьки еще стоят в Портланде! - -[AS2_9] -~g~Кофейные ларьки еще стоят в Портланде и в Шорсайд Вейл! - -[AS2_A] -~w~Мы недооценили план Каталины по реализации СПАНКа. - -[AS2_A1] -~w~Мигель вынослив, как настоящий латиноамериканец. - -[AS2_A2] -~w~Я уже выдохлась. - -[AS2_B] -~w~Ярди - торгующие СПАНКом по всему городу - это мелкие сошки. - -[AS2_C] -~w~Картель действует через свою компанию 'The Kappa Coffee House'. - -[AS2_D] -~w~Они продают СПАНК через сеть уличных ларьков. - -[AS2_E] -~w~Нам не остается ничего другого, кроме как прикрыть все эти лавочки. - -[AS2_F] -~w~Разнеси их в щепки! - -[AS3] -'БЫЛО ВАШЕ, СТАЛО НАШЕ' - -[AS3_1] -~g~Найди ~r~катер~g~ и встань около ~b~буя~g~! - -[AS3_1A] -~g~Теперь двигайся к ~b~бую~g~! - -[AS3_2] -~b~Двигайся к буям на посадочной полосе! ~y~Самолет уже на подлете! - -[AS3_3] -~g~Подожди, пока не покажется ~y~самолет~g~! - -[AS3_4] -~g~Сбей ~y~самолет~g~ из ракетницы! - -[AS3_5] -~g~Собирай товар! - -[AS3_6] -~g~~1~ ИЗ 8 - -[AS3_A] -~W~Ну что, затянем немного потуже, или просто подождем, пока почернеет и отвалится? - -[AS3_B] -~w~Ну ка, давай посмотрим... - -[AS3_C] -~w~Фууууууууу! что это за желтая липкая гадость? - -[AS3_C1] -~w~Привет малыш. - -[AS3_D] -~w~Мой работничек! - -[AS3_E] -~w~Мне было скучно, и я решила составить Асуке компанию. - -[AS3_F] -~w~Похоже она очень одаренная девочка. - -[AS3_F1] -~w~Ей удалось узнать кое что важное у нашего гостя. - -[AS3_G] -~w~В два часа в аэропорт Фрэнсис Интернешнл прибывает самолет. - -[AS3_G1] -~w~Он просто набит отравой Каталины. - -[AS3_H] -~w~Чтобы тебе не мешалась служба безопасности, возьми катер чтобы добраться до буев - -[AS3_H1] -и взорвать самолет, когда тот пойдет на посадку. - -[AS3_I] -~w~Найди среди обломков груз и забери его! - -[AS3_J] -~w~Малыш, будь поосторожней там, Окей? - -[AS3_K] -~w~Попробуй-ка соус чили... - -[AS4] -'ВЫКУП' - -[ASUKA] -ЗАДАНИЯ АСУКИ - -[ATUTOR] -Чтобы получить задание Скорой или отказаться от него нажми ~h~~k~~TOGGLE_SUBMISSIONS~~w~. - -[ATUTOR2] -~g~ОСТОРОЖНО отвози пациентов в больницу. Каждое столкновение ухудшает их состояние. - -[ATUTOR3] -Чтобы получить задание Скорой или отказаться от него нажми ~h~~k~~TOGGLE_SUBMISSIONS~~w~. - -[AUG] -Авг - -[AWAY] -~r~Он свалил отсюда! - -[AWAY2] -~r~Они свалили. - -[A_CANC] -~r~Задание скорой отменено! - -[A_COMP1] -Все задания скорой выполнены! - -[A_COMP2] -Ты никогда не будешь уставать! - -[A_COMP3] -Все задания скорой выполнены! Ты никогда не будешь уставать при быстром беге! - -[A_FAIL1] -Задание скорой прервано. - -[A_FAIL2] -~r~Из-за твоей медлительности скончался пациент! - -[A_FAIL3] -~r~Пациент скончался! - -[A_FULL] -~r~Скорая переполнена! - -[A_PASS] -Спасен! - -[A_RANGE] -~g~Рация в скорой не ловит сигнал, подъедь ближе к больнице! - -[A_SAVES] -ЛЮДЕЙ СПАСЕНО: ~1~ - -[A_TIME] -+~1~ секунд - -[BANSHEE] -Банши - -[BARRCKS] -Барракс OL - -[BAT1] -~g~Возьми биту! - -[BELLYUP] -Фургон Триад - -[BETRA_A] -Прости, детка. - -[BETRA_B] -У меня свои планы, а ты... - -[BETRA_C] -Ты мне больше не нужен. - -[BET_JB] -ПРЕДАННЫЙ СВОЕЙ ВОЗЛЮБЛЕННОЙ КАТАЛИНОЙ, БРОСИВШЕЙ ЕГО УМИРАТЬ. ОСУЖДЕННЫЙ И ПРИГОВОРЕННЫЙ, ОН УЖЕ НА ПУТИ В ТЮРЬМУ. ОН НЕ МОЖЕТ ДУМАТЬ НИ О ЧЕМ ИНОМ, КРОМЕ...... МЕСТИ! - -[BFINJC] -Иджэкшен BF - -[BGWHON] -Big White Debug Light Switched On - -[BGWOFF] -Big White Debug Light Switched Off - -[BIG_DAM] -Плотина Кокрейн - -[BITCH_D] -~g~Мария мертва! - -[BLISTA] -Блиста - -[BOATIN1] -Запрыгни в катер и нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~ чтобы сесть за руль. - -[BOATIN2] -Если ты рядом с катером, то нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~, чтобы в него сесть. - -[BOATIN3] -Запрыгни в катер и нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~ чтобы сесть за руль. - -[BOATIN4] -Если ты рядом с катером, то нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~, чтобы в него сесть. - -[BOBCAT] -Рысь - -[BOMB] -Чтобы установить ~h~бомбу~w~ - поставь тачку в гараж. Стоимость бомбы - ~h~$1000~w~. - -[BOMB1] -Гараж Лысого - -[BONUS] -~g~ПРИЗ $~1~ - -[BORGNIN] -Борнини - -[BRIDGE1] -Как только отремонтируют мост Каллахан, ты сможешь попасть на остров Стаунтон. - -[BSTSTU] -Лучший БЕЗУМНЫЙ трюк: - -[BUGGY] -ОСТАЛОСЬ: - -[BULL] -СЛИТКОВ: - -[BUS] -Автобус - -[BUSTED] -АРЕСТОВАН! - -[B_SITE] -ЗАДАНИЯ АСУКИ (ПРИГОРОД) - -[CABBIE] -Кэб - -[CAM_A] -Чтобы сменить расположение ~h~камеры~w~, нажми ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~. - -[CAM_B] -Чтобы сменить расположение ~h~камеры~w~, нажми ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~. - -[CARSOFF] -Машины выключены. - -[CARS_ON] -Машины включены. - -[CAR_1] -Ambulance - -[CAR_10] -Coach - -[CAR_11] -Flatbed - -[CAR_12] -Linerunner - -[CAR_13] -Trashmaster - -[CAR_14] -Patriot - -[CAR_15] -Mr Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_2] -Firetruck - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinel - -[CAR_25] -Cheetah - -[CAR_26] -Banshee - -[CAR_27] -Stinger - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_3] -Police - -[CAR_30] -Kuruma - -[CAR_31] -Stretch - -[CAR_32] -Perennial - -[CAR_33] -Landstalker - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Stallion - -[CAR_37] -Taxi - -[CAR_38] -Cabbie - -[CAR_39] -Buggy - -[CAR_4] -Enforcer - -[CAR_5] -Barracks - -[CAR_6] -Rhino - -[CAR_7] -FBIcar - -[CAR_8] -Securicar - -[CAR_9] -Moonbeam - -[CAR_CRU] -Машин разбито - -[CAR_EXP] -Машин взорвано - -[CAT1] -'ВЫКУП' - -[CAT1_A] -Твоя драгоценная Мария у меня. Если не хочешь, чтобы ее личико было похоже на мясной фарш, - -[CAT1_B] -привези мне $500,000 на виллу в Кедровой роще. - -[CAT1_E] -XXXX - -[CAT1_F] -Езжай к Каталине, пока не вышло время! - -[CAT2] -'ОБМЕН' - -[CAT2_A] -Интересно, ты пришел ради того, чтобы спасти Марию или вернуться ко мне? - -[CAT2_A1] -Да пошла ты, глупая сучка! - -[CAT2_B] -Хочу сказать тебе кое-что, - -[CAT2_B2] -мне так и хочется тебя пристрелить, но бизнес прежде всего. - -[CAT2_C] -Ты просто находка для меня, амиго! - -[CAT2_D] -Давай бабки. - -[CAT2_E] -О, да ты без дела не шатался! - -[CAT2_E2] -Но ты так и не понял, что мне нельзя верить. - -[CAT2_E3] -Пристрелите кретина. - -[CAT2_F] -Я сломала ноготь, и моя прическа растрепалась. А она обошлась мне в 50 долларов, представляешь? - -[CAT2_G] -Я была так напугана, но потом я сказала себе - ты уже взрослая девочка. - -[CAT2_H] -О, у нас будет так весело, потому что, ты знаешь, моя сестра сказала, что она поживет у нас со своими детьми, - -[CAT2_I] -потому что у ее мужа снова интрижка и... - -[CAT2_J] -Быстрее, взлетаем! - -[CATINF1] -~g~Убей Каталину! - -[CATINF2] -~g~Чтобы найти Каталину - следуй за вертушкой. - -[CAT_MON] -~g~У тебя недостаточно зелени. Необходимо $500,000 баксов. - -[CDERROR] -Ошибка чтения диска с игрой Grand Theft Auto III - -[CHAT] -Chatterbox FM - -[CHEAT1] -Чит-код активирован - -[CHEAT2] -Чит-код: оружие - -[CHEAT3] -Чит-код: здоровье - -[CHEAT4] -Чит-код: броня - -[CHEAT5] -Чит-код: в розыске - -[CHEAT6] -Чит-код: деньги - -[CHEAT7] -Чит-код: погода - -[CHEATOF] -Режим чит-кодов Выкл. - -[CHEATON] -Режим чит-кодов Вкл. - -[CHEETAH] -Гепард - -[CHEVOK] -CheckEveryOkB4Save - -[CHFIDL] -ВЫБЕРИТЕ ЗАПИСЬ ДЛЯ УДАЛЕНИЯ - -[CHFILE] -ВЫБЕРИТЕ ИГРУ ДЛЯ ЗАГРУЗКИ - -[CHINA] -Чайнатаун - -[CINCAM] -Вид из телекамеры - -[CITYZON] -Либерти Сити - -[CLZOOF] -Show Cull Zones Off - -[CLZOON] -Show Cull Zones On - -[CNCSAV] -Нельзя сохранить игру, сидя в тачке. - -[CNTLS] -Управление - -[CNTSAV] -Во время задания запись невозможна. - -[COACH] -Автобус-люкс - -[COLLECT] -СОБРАНО: - -[COLOMCR] -Круизер картеля - -[COLT_IN] -В магазин завезли пистолеты! - -[COM_EAS] -Ньюпорт - -[COM_ZON] -Остров Стаунтон - -[CONSTRU] -Форт Стаунтон - -[CONTRL] -Задание управления - -[COPCART] -~g~У тебя есть ~1~ секунд чтобы вернуться в полицейскую машину, иначе задание будет отменено. - -[COP_M] -'ПОЛИЦЕЙСКИЙ' - -[CO_ALL] -Ты взял всех преступников. Вот тебе кое-что... - -[CO_ONE] -Особые пакеты: ~1~ из ~1~ - -[CRD050A] -ТЕСТЕРЫ - -[CRD136A] -ALEX HORTON - -[CRD137A] -NAVID KHONSARI - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS. - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUCER - -[CRED003] -LESLIE BENZIES - -[CRED004] -ART DIRECTOR - -[CRED005] -AARON GARBUT - -[CRED006] -TECHNICAL DIRECTION - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -ДИЗАЙН - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -АВТОРЫ СЮЖЕТА - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -ГЕРОИ - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMATION & DIRECTION - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -AUTO DESIGN - -[CRED024] -PAUL KUROWSKI - -[CRED025] -ARTISTS - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODERS - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -SCORE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -SOUND DESIGN & MASTERING - -[CRED042] -ALLAN WALKER - -[CRED043] -AUDIO PROGRAMMING - -[CRED044] -RAYMOND USHER - -[CRED045] -TEST MANAGER - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -LEAD TESTERS - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -TECHNICAL SUPPORT - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -EXECUTIVE PRODUCER - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUCER - -[CRED064] -DAN HOUSER - -[CRED065] -DIRECTOR OF DEVELOPMENT - -[CRED066] -JAMIE KING - -[CRED067] -TECHNICAL PRODUCER - -[CRED068] -GARY J. FOREMAN - -[CRED069] -ASSOCIATE PRODUCER - -[CRED070] -JEREMY POPE - -[CRED071] -MUSIC SUPERVISOR - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VP OF MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -TECHNICAL COORDINATOR - -[CRED088] -BRANDON ROSE - -[CRED089] -QA MANAGER - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -GAME ANALYST - -[CRED094] -RICHARD HUIE - -[CRED095] -TEST TEAM - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -LIBERTY TREE EDITORIAL - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -CUT-SCENES - -[CRED108] -SCRIPT BY DAN HOUSER AND JAMES WORRALL - -[CRED109] -AUDIO DIRECTED BY DAN HOUSER - -[CRED110] -AUDIO PRODUCED BY RENAUD SEBBANE - -[CRED111] -CAST - -[CRED112] -FRANK VINCENT AS SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO AS LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN AS TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT AS JOEY LEONE - -[CRED116] -DEBBI MAZAR AS MARIA - -[CRED117] -KYLE MACLACHLAN AS DONALD LOVE - -[CRED118] -ROBERT LOGGIA AS RAY MACHOWSKI - -[CRED119] -GURU AS 8-BALL - -[CRED120] -SONDRA JAMES AS MOMMA - -[CRED121] -LIANA PAI AS ASUKA - -[CRED122] -LES MAU AS KENJI - -[CRED123] -CYNTHIA FARRELL AS CATALINA - -[CRED124] -AL ESPINOSA AS MIGUEL - -[CRED125] -CHRIS PHILLIPS AS EL BURRO - -[CRED126] -HUNTER PLATIN AS CHICO - -[CRED127] -WALTER MUDU AS D-ICE - -[CRED128] -CURTIS MCCLARIN AS CURTLY - -[CRED129] -BILL FIORE AS DARKEL - -[CRED130] -CHRIS PHILLIPS AS MARTY CHONKS - -[CRED131] -HUNTER PLATIN AS CURLY BOB - -[CRED132] -WALTER MUDU AS KING COURTNEY - -[CRED133] -HUNTER PLATIN AS ONE-ARMED PHIL - -[CRED134] -KIM GURNEY AS MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATED BY - -[CRED137] -DIRECTED BY - -[CRED138] -PRODUCED BY - -[CRED139] -RECORDED AT MODERN UPRISING STUDIOS, BROOKLYN - -[CRED140] -ACTORS - -[CRED141] -PEDESTRIAN DIALOGUE - -[CRED142] -WRITTEN BY DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRECTED BY CRAIG CONNER, DAN HOUSER AND LAZLOW - -[CRED144] -PRODUCED BY RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -RADIO STATIONS AND MUSIC - -[CRED218] -PRODUCERS FOR ROCKSTAR UK - -[CRED219] -SOUNDTRACK CO-ORDINATOR - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUCER FOR ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -EDITED BY - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER AND IMAGING WRITTEN BY - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -SPECIAL THANKS TO - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED254] -STUDIO MANAGER - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[CRED270] -MIKE HONG - -[CRGOFF] -ShowCarRoadGroups Off - -[CRIMRA] -Ваш рейтинг: - -[CRLDIC] -Создание и загрузка иконок - -[CRMGSV] -Create copy protected magazine directory - -[CRRGON] -ShowCarRoadGroups On - -[CRROOT] -CreateRootDir - -[CRUSH] -Поставь машину в голубой круг и выйди из нее. После этого машина будет утилизирована. - -[CR_1] -Кран не может поднять эту машину. - -[CTRSCR] -Центровка экрана - -[CTUTOR] -Нажми ~h~~k~~TOGGLE_SUBMISSIONS~~w~, чтобы заняться работой полицейского или отказаться от нее. - -[CTUTOR2] -Нажми ~h~~k~~TOGGLE_SUBMISSIONS~~w~, чтобы заняться работой полицейского или отказаться от нее. - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[CVT_CRT] -Конвертация текстур не выполнена. Чтобы ее выполнить, вам нужно войти под администраторским паролем. Нажмите ESC для отмены. - -[CVT_ERR] -У вас закончилось место на жестком диске. Пожалуйста, освободите место перед запуском игры. Нажмите ESC для отмены. - -[CVT_MSG] -Конвертация текстур в формат оптимальный для вашей видеокарты. - -[C_BREIF] -~g~~a~ - там в последний раз видели подозреваемого. - -[C_CANC] -~r~Миссия полицейского прервана! - -[C_ESCP] -~r~Подозреваемый скрылся! - -[C_FAIL] -Миссия полицейского не выполнена! - -[C_KILLS] -ПРЕСТУПНИКОВ УБИТО: ~1~ - -[C_PASS] -СПРАВЕДЛИВОСТЬ ВОСТОРЖЕСТВОВАЛА! - -[C_RANGE] -~g~Полицейская рация не ловит сигнал, надо подъехать ближе к участку! - -[C_TIME] -~r~Время выполнения задания вышло! - -[C_VIGIL] -НАГРАДА ОТ ПОЛИЦИИ! - -[DAM] -ПОВРЕЖДЕНИЯ: - -[DAYPLC] -Ежедневные расходы полиции - -[DAYSPS] -Дней проведенных за игрой - -[DBFOFF] -CTheScripts::DbgFlag Off - -[DBGFON] -CTheScripts::DbgFlag On - -[DBINST] -Двойной безумный трюк - -[DBL_CLF] -Double Clef FM - -[DBPINS] -Идеальный безумный трюк - -[DEAD] -ВЫРУБИЛСЯ! - -[DEBUGM] -Отладочное меню - -[DEC] -Дек - -[DED_CRI] -Убито преступников - -[DED_DED] -Убито должников - -[DED_HOK] -Убито шлюх - -[DEFDT] ---:---:---- --:--:-- - -[DEFNAM] -Клод---------------------- - -[DEL_FNM] -Файл удален. - -[DETON] -ВЗРЫВ ЧЕРЕЗ: - -[DIAB1] -'ГОНКА' - -[DIAB1_1] -~g~3..2..1.. СТАРТ! - -[DIAB1_2] -~g~Поздравляем, ты победил с отличным результатом: ~1~ секунд. - -[DIAB1_3] -~r~Куда тебе с нами тягаться, НЕУДАЧНИК! - -[DIAB1_4] -~g~Найди быструю тачку, и приезжай на старт. - -[DIAB1_5] -ВРЕМЯ: - -[DIAB1_A] -Эль Бурро хочет предложить тебе одно дельце. Двигай к телефону в Хепберн Хейтс, если тебя это заинтересовало. - -[DIAB1_B] -Это Эль Бурро из банды Дьяволов. - -[DIAB1_C] -Не так уж ты и крут. Подойди к телефону, и возможно Эль Бурро предложит тебе работенку. - -[DIAB1_D] -Ты новичок в городе, но на улицах о тебе уже ходят слухи. - -[DIAB1_E] -Мы решили устроить гонку, которая начнется у старой школы, что у моста Каллахан. - -[DIAB1_F] -Достань себе тачку получше, и если выиграешь гонку, получишь приз. - -[DIAB2] -'СМЕРТЬ ОТ МОРОЖЕНОГО' - -[DIAB2_1] -~g~Возьми дипломат в Харвуде. - -[DIAB2_2] -~g~Найди фургон с мороженым. - -[DIAB2_3] -~g~Припаркуй фургон с мороженым на пристани Атлантик. - -[DIAB2_4] -~g~Понажимай ~w~~k~~VEHICLE_HORN~~g~ чтобы включить на фургоне колокольчик. - -[DIAB2_5] -~g~Выйди из фургона и затем с помощью дистанционника взорви его. - -[DIAB2_6] -~g~Понажимай ~w~~k~~VEHICLE_HORN~~g~ чтобы включить на фургоне колокольчик. - -[DIAB2_7] -~g~Понажимай ~w~~k~~VEHICLE_HORN~~g~ чтобы включить колокольчик на фургоне. - -[DIAB2_A] -Когда я начал свой экзотический бизнес, моим единственным активом было содержимое моих кожаных штанов! - -[DIAB2_B] -Одна банда стала угрожать, что лишит меня этой штуки, если я не буду отстегивать им процент. - -[DIAB2_C] -Они не с тем связались, амиго. - -[DIAB2_D] -Эти кретины западают на мороженое. - -[DIAB2_E] -Возьми бомбу, что я спрятал в Харвуде, - -[DIAB2_F] -и угони фургон с мороженым, что катается по городу. - -[DIAB2_G] -Эти глупцы побегут на верную смерть, услышав колокольчик фургона. - -[DIAB2_H] -Они прячутся на складе пристани Атлантик. - -[DIAB3] -'ИСПЫТАНИЕ ОГНЕМ' - -[DIAB3_1] -УБЕЙ 25 ТРИАДОВЦЕВ - -[DIAB3_A] -Какой-то наглый триадовец прошлой ночью спер мою тачку, - -[DIAB3_B] -разбил ее и бросил догорать. - -[DIAB3_C] -В багажнике было несколько моих любимых безделушек - - -[DIAB3_D] -настоящая гордость коллекционера, таких сейчас не достать. - -[DIAB3_E] -Неподалеку от Чайнатауна я припрятал огнемет. - -[DIAB3_F] -Возьми его и научи этих вандалов из Триады бояться грозного орудия Эль Бурро. - -[DIAB3_G] -Арриба! - -[DIAB4] -'ПОРНОКРАД' - -[DIAB4_1] -~g~Подгони фургон на задний двор магазина порнухи. - -[DIAB4_A] -Один слишком шустрый делец угнал фургон с последним тиражом моего издания! - -[DIAB4_B] -Но этот обкурившийся кретин не закрыл дверцы фургона, - -[DIAB4_C] -и теперь все мои прекрасные - -[DIAB4_D] -порножурналы с изумительными фотографиями разбросаны по всему городу! - -[DIAB4_E] -Садись в фургон и иди по следу 'Петушка из Портленда' выпусков 1, 2 и 3, - -[DIAB4_F] -ну и собирай их заодно по пути. - -[DIAB4_G] -Как только выследишь этого шустрого отморозка - разберись с ним! - -[DIAB4_H] -Затем отгони мой фургон с грузом к сексшопу в квартале красных фонарей. - -[DIABLCR] -Жеребец Дьяволов - -[DIABLO] -ЗАДАНИЯ ДЬЯВОЛОВ - -[DLFILE] -Удаление файлов игры GTA3 - -[DODO] -Додо - -[DODO_FT] -Вы были в воздухе ~1~ секунд! - -[DRIVE_A] -Садясь в машину, возьми в руки Узи. Посмотри вправо или влево и нажми ~h~~k~~PED_FIREWEAPON~~w~ для выстрела. - -[DRIVE_B] -Садясь в машину, возьми в руки Узи. Посмотри вправо или влево и нажми ~h~~k~~PED_FIREWEAPON~~w~ для выстрела. - -[DSPLAY] -Экран - -[DSTROFF] -Debug Streaming Requests Off - -[DSTRON] -Debug Streaming Requests On - -[EASTBAY] -Портланд Бич - -[EBAL] -'НА СВОБОДУ' - -[EBAL_1] -Нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~, чтобы ~h~сесть за руль ~w~или ~h~выйти~w~ из машины. - -[EBAL_1B] -Нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~, чтобы ~h~сесть за руль ~w~или ~h~выйти~w~ из машины. - -[EBAL_2] -~g~Возвращайся в машину! - -[EBAL_3] -Это ~h~радар~w~. Он очень полезен для навигации в городе. Сейчас ~h~цветная отметка~w~ на нем показывает расположение укрытия! - -[EBAL_4] -~r~Лысый погиб! - -[EBAL_5] -~g~Достань тачку! - -[EBAL_6] -~g~Подбери Мисти! - -[EBAL_A] -Я знаю место на углу квартала Красных фонарей, где мы сможем залечь, - -[EBAL_A1] -но я хреновый водитель, так что, браток, лучше садись ты за руль. - -[EBAL_B] -Вот и приехали. Давай зайдем внутрь и сменим эти чертовы шмотки! - -[EBAL_D] -Я знаю одного парня с большими связями, его зовут Луиджи. - -[EBAL_D1] -Я с ним работал раньше, так что, может, он и тебе работенку подкинет. Давай, съездим к нему. - -[EBAL_E] -Давай, пошли, я тебя представлю. - -[EBAL_G] -Это клуб Луиджи. Давай не будем светиться и пройдем через черный ход. - -[EBAL_H] -Погоди меня тут, пока я схожу и потолкую с Луиджи. - -[EBAL_I] -Босс решил выйти и взглянуть на тебя... - -[EBAL_J] -У Лысого какие-то дела там наверху. - -[EBAL_K] -Сделай мне одолжение, парень. - -[EBAL_L] -Одной из моих девиц нужно прокатиться, так что бери тачку, забирай Мисти из клиники и вези сюда. - -[EBAL_M] -Запомни, никто не лапает моих девок! - -[EBAL_N] -Так что держи свои руки на баранке! - -[EBAL_O] -Если не завалишь это дело, то может найтись и другая работенка. Все, проваливай! - -[ELBURRO] -Лучший результат в гонке (сек) - -[EMVHPUP] -Мы заплатим хорошие бабки за старые и новые машины скорой помощи. Подгони их к крану на северо-востоке порта Портланда. - -[END_A] -Жители Кедровой рощи едва успели оправиться - -[END_B] -от шока, вызванного настоящей криминальной войной, - -[END_C] -всполошившей вчера весь район. - -[END_D] -Местный житель Клив Денвер рассказал полиции, - -[END_E] -что видел, как с места происшествия убегал бандит и какая-то брюнетка. - -[END_F] -Ой, ты знаешь, нам будет так клево, потому что, ну... знаешь, - -[END_G] -я люблю тебя, я, я, я правда люблю, потому что ты такой крутой сильный мужик - -[END_H] -и ты именно тот, кто мне нужен. - -[END_I] -Ой, о чем это я? - -[END_J] -Ну вот, я забыла. Но ты понял, что я имела в виду, правда? - -[END_K] -Люди бросились в укрытия, когда взрывы стали сотрясать ближайшие дома. - -[END_L] -Несколько жителей пострадало во время ожесточенной перестрелки - -[END_M] -между бандитами и вертолетом, кружившим над плотиной. - -[END_N] -Да, из садов открывался отличный вид на это зрелище! - -[END_O] -Когда вертолет наконец сбили, - -[END_P] -был фейерверк получше, чем на Четвертое июля! - -[END_Q] -Хотя найдено уже более двадцати тел, - -[END_R] -полиция все еще находит останки. - -[END_S] -Мы не получили официального опровержения слухов, о том, - -[END_T] -что все тела принадлежат членам колумбийского Картеля. - -[END_U] -Истинные причины этой бойни до сих пор неизвестны. - -[END_V] -Представляешь, я сломала ноготь и испортила прическу! - -[END_W] -А она обошлась мне в пятьдесят баксов... - -[ENFORCR] -Энфорсер - -[ENGLIS] -English - -[ESPERAN] -Эсперанто - -[EVID] -УЛИКИ: - -[FARE1] -~g~Едем в ~w~'Клуб секс кошечек' ~g~в Квартале красных фонарей. - -[FARE10] -~g~Едем в ~w~'Лапшу по-китайски' ~g~в Чайнатауне. - -[FARE11] -~g~Едем на ~w~строительную площадку ~g~в форте Стаунтон. - -[FARE12] -~g~Едем на ~w~футбольный стадион ~g~на Аспатрии. - -[FARE13] -~g~Едем в ~w~церковь ~g~в Бедфорд Поинт. - -[FARE14] -~g~Едем в ~w~казино ~g~в Торрингтоне. - -[FARE15] -~g~Едем к ~w~зданию университета ~g~в учебном городке. - -[FARE16] -~g~Едем в ~w~торговый комплекс ~g~в в Районе парка Бельвиль. - -[FARE17] -~g~Едем в ~w~музей ~g~в Ньюпорте. - -[FARE18] -~g~Едем к ~w~зданию 'Амко' ~g~в Торрингтоне. - -[FARE19] -~g~Едем в ~w~'Болт Бургер' ~g~в Бедфорд Поинт. - -[FARE2] -~g~Едем в ~w~'Сюпа Сейв' ~g~на Портланд Вью. - -[FARE20] -~g~Едем в ~w~парк ~g~в Бельвиле. - -[FARE21] -~g~Едем в ~w~аэропорт Фрэнсис~g~. - -[FARE22] -~g~Едем к ~w~плотине Кокрейн~g~. - -[FARE23] -~g~Едем к ~w~автосалону ~g~ рядом с плотиной Кокрейн. - -[FARE24] -~g~Едем в ~w~больницу ~g~в Пайк Крик. - -[FARE25] -~g~Едем в ~w~парк ~g~в Шорсайд Вейл. - -[FARE26] -~g~Едем к ~w~Северо-западным башням ~g~в Садах Вичита. - -[FARE3] -~g~Едем к ~w~старой школе ~g~в Чайнатауне. - -[FARE4] -~g~Едем в ~w~'Кафе Грейзи Джо' ~g~на мысе Каллахан. - -[FARE5] -~g~Едем в ~w~оружейный магазин ~g~в квартале красных фонарей. - -[FARE6] -~g~Едем в ~w~'Автомобили в кредит' ~g~на Сент-Марк. - -[FARE7] -~g~Едем в ~w~'Топлесс-Бар Вуди' ~g~в квартале красных фонарей. - -[FARE8] -~g~Едем в ~w~бистро Марко ~g~на Сент-Марк. - -[FARE9] -~g~Едем в ~w~Автосалон ~g~в гавани Портланда. - -[FARES] -ОТВЕЗЕНО: - -[FBICAR] -Машина ФБР - -[FEA_2SP] -ДВЕ КОЛОНКИ - -[FEA_3DH] -СПОСОБ ВЫВОДА ЗВУКА - -[FEA_4SP] -БОЛЬШЕ ДВУХ КОЛОНОК - -[FEA_DO] -= - -[FEA_EAR] -НАУШНИКИ - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -ПУСТОМЕЛЯ 109 - -[FEA_FM9] -ПРОИГРЫВАТЕЛЬ MP3 - -[FEA_LE] -< - -[FEA_MNO] -Моно - -[FEA_MUS] -ГРОМКОСТЬ МУЗЫКИ - -[FEA_NAH] -НЕТ ЗВУКОВОЙ КАРТЫ - -[FEA_NON] -Нет - -[FEA_OUT] -Выход: - -[FEA_RI] -> - -[FEA_RSS] -РАДИОСТАНЦИЯ - -[FEA_SFX] -ГРОМКОСТЬ ЗВУКОВ - -[FEA_SPK] -ТИП АКУСТИКИ - -[FEA_ST] -Стерео - -[FEA_UP] -; - -[FEB] -Фев - -[FEB_AUD] -Аудио - -[FEB_BRI] -Сообщения - -[FEB_CON] -Управление - -[FEB_CPC] -Настройка управления - -[FEB_DIS] -Экран - -[FEB_LAN] -Язык - -[FEB_PMB] -Задание предыдущей миссии: - -[FEB_SAV] -Загрузить - -[FEB_STA] -Статистика - -[FEC_ACC] -Газ - -[FEC_ACL] -Педаль газа - -[FEC_ATT] -Удар или выстрел из оружия - -[FEC_BAC] -Назад - -[FEC_BRA] -Тормоз / Задний ход - -[FEC_BRK] -Педаль тормоза - -[FEC_BSP] -ЗАБОЙ - -[FEC_CAM] -Расположение камеры - -[FEC_CAW] -Оружие в машине - -[FEC_CCF] -Конфигурация: - -[FEC_CCM] -Поставить камеру сзади игрока. - -[FEC_CDP] -Показ контроллера: - -[FEC_CEN] -Центровка камеры - -[FEC_CF1] -Setup1 - -[FEC_CF2] -Setup2 - -[FEC_CF3] -Setup3 - -[FEC_CF4] -Setup4 - -[FEC_CLE] -Прокрутка оружия влево - -[FEC_CLK] -CAPSLOCK - -[FEC_CMM] -Общее управления - -[FEC_CMP] -ВМЕСТЕ: ВЗГЛЯД ВЛЕВО + ВЗГЛЯД ВПРАВО - -[FEC_CMR] -Выбор позиции камеры - -[FEC_CMS] -Изменение расположения камеры для всех вариантов. - -[FEC_CNT] -Тип управления: - -[FEC_CRD] -Перебор радиостанций - -[FEC_CRI] -Прокрутка оружия вправо - -[FEC_CWL] -Прокрутка оружия влево - -[FEC_CWR] -Прокрутка оружия вправо - -[FEC_DBG] -ОТЛАДОЧНОЕ МЕНЮ - -[FEC_DLF] -Удаление невозможно. - -[FEC_DLL] -DEL - -[FEC_DOT] -ДОП. - -[FEC_DWA] -СТРЕЛКА ВНИЗ - -[FEC_EEX] -В машину /Из машины - -[FEC_EMS] -Эту клавишу назначить нельзя. - -[FEC_END] -END - -[FEC_ENT] -В машину /Из машины - -[FEC_ENV] -Сесть в машину - -[FEC_ESR] -Клавишу ESC задавать нельзя - -[FEC_ETR] -ДОП ВВОД - -[FEC_EXV] -В машину /Из машины - -[FEC_FIR] -Выстрел - -[FEC_FNC] -F~1~ - -[FEC_FOR] -Вперед - -[FEC_FPC] -Вид от первого лица - -[FEC_FPO] -Оружие человека - -[FEC_FPR] -Управление от первого лица - -[FEC_FWS] -ДОП / - -[FEC_GSL] -Покачивание камеры при ходьбе: - -[FEC_HAB] -Ручной тормоз - -[FEC_HBR] -Ручной тормоз машины - -[FEC_HME] -HOME - -[FEC_HND] -Тормоз - -[FEC_HO3] -Сигнал (кнопка L3) - -[FEC_HOR] -Сигнал - -[FEC_HRN] -Сигнал - -[FEC_IBT] -- - -[FEC_INC] -В машине - -[FEC_IRT] -INS - -[FEC_IVH] -Инвертирование мыши по горизонтали: - -[FEC_IVV] -ИНВЕРТИРОВАНИЕ МЫШИ ПО ВЕРТИКАЛИ - -[FEC_JBO] -ДЖ. ~1~ - -[FEC_JMP] -Прыжок - -[FEC_JOY] -Джойстик - -[FEC_JUM] -Прыжок - -[FEC_LAL] -ЛЕВ.ALT - -[FEC_LB] -Оглянуться назад - -[FEC_LB1] -Взгляд - -[FEC_LB2] -назад - -[FEC_LB3] -Оглянуться назад - -[FEC_LBA] -Оглянуться назад - -[FEC_LBC] -Нажать взгляд Влево и Вправо. - -[FEC_LBH] -Посмотреть назад - -[FEC_LCT] -ЛЕВ.CTRL - -[FEC_LDN] -Посмотреть вниз - -[FEC_LDU] -Посмотреть вниз - -[FEC_LEF] -Влево - -[FEC_LFA] -СТРЕЛКА ВЛЕВО - -[FEC_LKL] -Посмотреть влево - -[FEC_LKT] -Зафиксировать цель - -[FEC_LL] -Посмотреть налево - -[FEC_LLF] -Взгляд налево из машины - -[FEC_LOF] -Посмотреть вперед - -[FEC_LOL] -Посмотреть налево - -[FEC_LOR] -Посмотреть направо - -[FEC_LR] -Посмотреть направо - -[FEC_LRG] -Взгляд вправо из машины - -[FEC_LRT] -Посмотреть вправо - -[FEC_LSF] -ЛЕВ.SHIFT - -[FEC_LUD] -Посмотреть вверх - -[FEC_LUN] -Загрузка невозможна. Файл поврежден, пожалуйста удалите эту запись. - -[FEC_LUP] -Посмотреть вверх - -[FEC_LWD] -ЛЕВ.WIN - -[FEC_MIN] -ДОП - - -[FEC_MOV] -Движение - -[FEC_MSH] -ЧУВСТВИТЕЛЬНОСТЬ МЫШИ - -[FEC_MSL] -ЛЕВ.КН.МЫШИ - -[FEC_MSM] -СРЕД.КН.МЫШИ - -[FEC_MSR] -ПРАВ.КН.МЫШИ - -[FEC_MWB] -КОЛЕСО МЫШИ ВНИЗ - -[FEC_MWF] -КОЛЕСО МЫШИ ВВЕРХ - -[FEC_MXO] -MXB1 - -[FEC_MXT] -MXB2 - -[FEC_NA] -НЕТ - -[FEC_NLK] -NUMLOCK - -[FEC_NMN] -ДОП ~1~ - -[FEC_NTR] -Следующая цель - -[FEC_NTT] -Неизвестная клавиша - -[FEC_NTW] -Разговор по сети - -[FEC_NUM] -ДОП - -[FEC_NUS] -НЕ ИСПОЛЬЗУЕТСЯ - -[FEC_NWE] -Следующее оружие - -[FEC_OJS] -Для каждого действия можно назначить лишь одну кнопку джойстика - -[FEC_OKK] -О.К. - -[FEC_OMS] -Для действия можно задать лишь одну кнопку мыши - -[FEC_ONF] -Пешком - -[FEC_ORR] -или - -[FEC_PAD] -Геймпад - -[FEC_PAS] -Пауза - -[FEC_PAU] -Пауза - -[FEC_PED] -Управление героем - -[FEC_PFR] -Выстрел из оружия - -[FEC_PGD] -PGDN - -[FEC_PGU] -PGUP - -[FEC_PJP] -Прыжок - -[FEC_PLB] -Взгляд назад. - -[FEC_PLS] -ДОП + - -[FEC_PSB] -BREAK - -[FEC_PSH] -Выстрел - -[FEC_PSP] -Бежать - -[FEC_PTL] -Use LockTarget with Weapon Switch Left. - -[FEC_PTR] -Use LockTarget with Weapon Switch Right. - -[FEC_PTT] -Предыдущая цель - -[FEC_PWE] -Предыдущее оружие - -[FEC_PWF] -Идти вперед - -[FEC_PWL] -Идти влево - -[FEC_PWR] -Идти вправо - -[FEC_PWT] -Движение относительно камеры - -[FEC_QUE] -??? - -[FEC_R3] -(R3 button) - -[FEC_RAD] -Радио - -[FEC_RAL] -ПР.ALT - -[FEC_RCT] -ПР.CTRL - -[FEC_RFA] -СТРЕЛКА ВПРАВО - -[FEC_RIG] -Вправо - -[FEC_RS3] -Перебор радиостанций (L3 button) - -[FEC_RSC] -Перебор радиостанций - -[FEC_RSF] -ПР.SHIFT - -[FEC_RTN] -ВВОД - -[FEC_RUN] -Бежать - -[FEC_RWD] -ПР.WIN - -[FEC_SFT] -SHIFT - -[FEC_SGJ] -Настройка джойстика - -[FEC_SLC] -Slot is corrupted - -[FEC_SLK] -SCROLL LOCK - -[FEC_SM3] -Special mission trigger (R3 button) - -[FEC_SMS] -Показывать указатель мыши - -[FEC_SMT] -Вызов спецзадания - -[FEC_SPC] -ПРОБЕЛ - -[FEC_SPN] -Бежать - -[FEC_STR] -ДОП ЗВЕЗДОЧКА - -[FEC_SUB] -Задание доп. миссий - -[FEC_SVU] -Запись не удалась. - -[FEC_SZI] -Снайперский прицел + - -[FEC_SZO] -Снайперский прицел - - -[FEC_TAB] -TAB - -[FEC_TAR] -Цель - -[FEC_TDO] -Камера отладки ВЫКЛ. - -[FEC_TFD] -Башню /Додо вниз - -[FEC_TFL] -Башню влево - -[FEC_TFR] -Башню вправо - -[FEC_TFU] -Башню /Додо вверх - -[FEC_TGD] -Toggle Pad Game/Debug - -[FEC_TLF] -Следующая цель слева - -[FEC_TRG] -Следующая цель справа - -[FEC_TSM] -Задание доп. миссий - -[FEC_TSS] -Записать картинку с экрана - -[FEC_TUC] -Управление башней - -[FEC_TUL] -Башню влево - -[FEC_TUR] -Башню вправо - -[FEC_TWO] -Можно задать не более двух клавиш. - -[FEC_UJS] -Эту кнопку джойстика назначить нельзя. - -[FEC_UMS] -Эту кнопку мыши назначить нельзя. - -[FEC_UNB] -НЕ ЗАДАНО - -[FEC_UND] -(НЕТ) - -[FEC_UPA] -СТРЕЛКА ВВЕРХ - -[FEC_VEH] -Управление машиной - -[FEC_VES] -Управление машиной - -[FEC_VIB] -Vibration: - -[FEC_WAR] -Внимание! - -[FEC_WHL] -Рулевое управление - -[FEC_WPN] -Выстрел из оружия - -[FEC_WRC] -WINCLICK - -[FEC_ZIN] -Приблизить - -[FEC_ZOT] -Отдалить - -[FEDL_WR] -Deleting data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FEDSAS2] -<>-CHANGE SELECTION - -[FEDSAS3] -- CHANGE SELECTION - -[FEDSAS4] -;=<> - CHANGE SELECTION - -[FEDSSC1] -;-FASTER SCROLLING - -[FEDSSC2] -=-STOP SCROLLING - -[FEDS_AM] -<>-CHANGE MENU - -[FEDS_AS] -;=-CHANGE SELECTION - -[FEDS_BA] -" button - BACK - -[FEDS_SB] -/ button - SELECT " button - BACK - -[FEDS_SE] -/ button - SELECT - -[FEDS_SM] -L1,R1-CHANGE MENU - -[FEDS_SS] -L1,R1-CHANGE SELECTION - -[FEDS_ST] -START button - RESUME - -[FEDS_TB] -НАЗАД - -[FEDS_XB] -Выбор - -[FED_BRI] -ЯРКОСТЬ - -[FED_CON] -Подтвердите удаление записи - -[FED_DBG] -Отладочное меню - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Большая отладочная лампа переключена - -[FED_DLW] -Идет удаление. Пожалуйста, подождите... - -[FED_DSR] -Debug Streaming Requests - -[FED_LDW] -Идет загрузка. Пожалуйста, подождите... - -[FED_LFL] -Игру загрузить не удалось. Игра будет перезапущена. - -[FED_PAH] -Parse Heap - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_RES] -РАЗРЕШЕНИЕ ЭКРАНА - -[FED_RID] -Reload IDE - -[FED_RIP] -Reload IPL - -[FED_SCP] -gbShowCollisionPolys - -[FED_SCR] -Show Car Road Grups - -[FED_SCZ] -Show Cull Zones - -[FED_SPR] -Show Ped Road Groups - -[FED_SUB] -СУБТИТРЫ - -[FED_TRA] -ШЛЕЙФ ОТ ДВИЖУЩИХСЯ ОБЪЕКТОВ - -[FED_WIS] -ШИРОКИЙ ЭКРАН - -[FEFD_WR] -Formatting Memory Card (PS2) in MEMORY CARD slot 1. Please do not remove the Memory Card (PS2), reset or switch off the console. - -[FEF_AU1] -Прибавьте громкости! - -[FEF_AU2] -Выберите радиостанцию и звуковой эффект - -[FEF_BR1] -Не знаете, что делать? - -[FEF_BR2] -Прочтите тексты последних заданий, отсортированных по дате. - -[FEF_CO1] -Вас не устраивает такой способ управления? - -[FEF_CO2] -Выберите наиболее удобное для вас управление - -[FEF_DI1] -Игра изменена! - -[FEF_DI2] -Настройка игры под ваш телевизор - -[FEF_INT] -ИНТЕРНЕТ - -[FEF_LA1] -О чем ты, черт побери, говоришь? - -[FEF_LA2] -Выбери такую манеру выражаться, какая тебя устроит. - -[FEF_LAN] -ЛОКАЛЬНАЯ СЕТЬ - -[FEF_SA1] -Борись за свое место в списке! - -[FEF_SA2] -Загрузка и сохранение вашей игры - -[FEF_ST1] -Кто тут у нас плохой? - -[FEF_ST2] -Сколько ты вызвал аварий - -[FEG_MAP] -КАРТА - -[FEG_PLY] -ИГРОКИ - -[FEG_PNG] -ПИНГ - -[FEG_SRV] -СЕРВЕР - -[FEG_TYP] -ТИП - -[FELD_WR] -Loading data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FELZ_FO] -Memory Card (PS2) in MEMORY CARD slot 1 is unformatted. - -[FEL_ENG] -АНГЛИЙСКИЙ - -[FEL_FRE] -ФРАНЦУЗСКИЙ - -[FEL_GER] -НЕМЕЦКИЙ - -[FEL_ITA] -ИТАЛЬЯНСКИЙ - -[FEL_SPA] -ИСПАНСКИЙ - -[FEM_CES] -Check Every 0kB4 Save - -[FEM_CLI] -Создание и загрузка иконок - -[FEM_CPD] -Create copy protected mag directory - -[FEM_CRD] -Create Root Dir - -[FEM_DBG] -ОТЛАДКА - -[FEM_FFF] -Fill First File with Guff - -[FEM_FRM] -ОГРАНИЧЕНИЕ КОЛИЧЕСТВА КАДРОВ - -[FEM_HST] -СОЗДАТЕЛЬ ИГРЫ - -[FEM_LOD] -ДАЛЬНОСТЬ ПРОРИСОВКИ - -[FEM_MA0] -Либерти Сити - -[FEM_MA1] -Кв. красных фонарей - -[FEM_MA2] -Чайнатаун - -[FEM_MA3] -Башня - -[FEM_MA4] -Канализация - -[FEM_MA5] -Промышленный парк - -[FEM_MA6] -Доки - -[FEM_MA7] -Стаунтон - -[FEM_MAP] -Выбор карты - -[FEM_MC2] -Memory Card Menu 2 - -[FEM_MCM] -Memory Card Menu - -[FEM_MM] -ГЛАВНОЕ МЕНЮ - -[FEM_MP] -ИГРА ПО СЕТИ - -[FEM_NO] -НЕТ - -[FEM_NON] -НЕТ - -[FEM_OFF] -ВЫКЛ - -[FEM_ON] -ВКЛ - -[FEM_OPT] -НАСТРОЙКИ - -[FEM_QT] -ВЫХОД - -[FEM_RES] -ВЕРНУТЬСЯ В ИГРУ - -[FEM_RMC] -Register MemCard One - -[FEM_SL1] -Ячейка 1 свободна - -[FEM_SL2] -Ячейка 2 свободна - -[FEM_SL3] -Ячейка 3 свободна - -[FEM_SL4] -Ячейка 4 свободна - -[FEM_SL5] -Ячейка 5 свободна - -[FEM_SL6] -Ячейка 6 свободна - -[FEM_SL7] -Ячейка 7 свободна - -[FEM_SL8] -Ячейка 8 свободна - -[FEM_SOG] -Save Only The Game - -[FEM_SP] -ОДИН ИГРОК - -[FEM_STG] -Запись игры - -[FEM_STS] -Save The Game under GTA3 name - -[FEM_TD] -Test Delete: - -[FEM_TFM] -Test Format MemCard One - -[FEM_TL] -Test Load: - -[FEM_TS] -Test Save: - -[FEM_TUM] -Test UnFormat MemCard One - -[FEM_VSC] -СИНХРОНИЗАЦИЯ КАДРОВ - -[FEM_YES] -ДА - -[FEN_CON] -Подключение - -[FEN_GAM] -Поиск игр - -[FEN_GNA] -Имя игры: - -[FEN_NAM] -Имя: - -[FEN_NCI] -НЕТ СВЯЗИ С ИНТЕРНЕТОМ - -[FEN_NET] -Сеть - -[FEN_PLA] -Число игроков: - -[FEN_PLC] -Цвет игрока - -[FEN_PLS] -Настройки игрока - -[FEN_STA] -НАЧАТЬ ИГРУ - -[FEN_TY0] -Сражение - -[FEN_TY1] -Партизанская война - -[FEN_TY2] -Командный бой - -[FEN_TY3] -Командная партизанская война - -[FEN_TY4] -Кража денег - -[FEN_TY5] -Захват флага - -[FEN_TY6] -Крысиные гонки - -[FEN_TY7] -Доминатор - -[FEN_TYP] -Тип игры - -[FEN_UKH] -Неизвестный сервер - -[FEN_UKM] -Карта не найдена - -[FEN_UKT] -Неизвестный тип игры - -[FEP_AUD] -ЗВУК - -[FEP_BRI] -СООБЩЕНИЯ - -[FEP_CON] -УПРАВЛЕНИЕ - -[FEP_DIS] -ЭКРАН - -[FEP_LAN] -ЯЗЫК - -[FEP_SAV] -ПРОДОЛЖИТЬ ИГРУ - -[FEP_STA] -СТАТИСТИКА - -[FEQ_SRE] -Вы точно решили выйти? Все что вы успели сделать после последнего сохранения будет потеряно. Выходим? - -[FEQ_SRW] -Вы точно решили выйти из игры? - -[FESTDCM] -Расстояние, пройденное на машине (м) - -[FESTDFM] -Расстояние, пройденное пешком (м) - -[FEST_BB] -Быстрые тачки - легкие деньги: - -[FEST_BD] -Лучшее время деактивации бомбы - -[FEST_CC] -Убито преступников во время работы полицейским - -[FEST_DC] -Расстояние, пройденное на машине (миль) - -[FEST_DF] -Расстояние, пройденное пешком (миль) - -[FEST_FE] -Потушено пожаров - -[FEST_GC] -Взорвано бандитских машин: - -[FEST_H0] -Пройдено контрольных точек - -[FEST_H1] -Драка с Дьяволами - -[FEST_H2] -Мордобой с мафией - -[FEST_H3] -Катастрофа в казино - -[FEST_H4] -Разборка с растаманами - -[FEST_HA] -Максимальный уровень заданий 'скорой' - -[FEST_LF] -Лучшее время полета на Додо - -[FEST_LS] -Спасено людей во время работы на 'скорой' - -[FEST_MP] -Заданий выполнено - -[FEST_OO] -из - -[FEST_R1] -'Пэтриот Ралли' (сек) - -[FEST_R2] -'Гонка в парке' (сек) - -[FEST_R3] -Догнал! за (сек) - -[FEST_RM] -'Гонка по гаражу' (сек) - -[FEST_RP] -Схваток завершено - -[FESZ_CA] -Отмена - -[FESZ_FF] -Format Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[FESZ_FM] -Memory Card (PS2) in MEMORY CARD slot 1 is unformatted. Would you like to format Memory Card (PS2) in MEMORY CARD slot 1? - -[FESZ_FO] -Would you like to format the Memory Card (PS2) in MEMORY CARD slot 1? - -[FESZ_L1] -Игра успешно сохранена! - -[FESZ_L2] -Игра сохранена в файле: - -[FESZ_LS] -Загрузка завершена. - -[FESZ_OK] -OK - -[FESZ_OW] -Overwriting data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FESZ_QD] -Вы точно решили удалить эту запись игры? - -[FESZ_QF] -Are you sure you wish to format the Memory Card (PS2) in MEMORY CARD slot 1? - -[FESZ_QL] -Все что вы успели сделать после последнего сохранения будет потеряно. Вы точно решили загрузить сохраненную игру? - -[FESZ_QO] -Вы решили записать игру на место предыдущей записи? - -[FESZ_QR] -Вы точно решили начать новую игру? Все что вы успели сделать после последнего сохранения будет потеряно. Начнем? - -[FESZ_QS] -ЗАПИСАТЬ ИГРУ ? - -[FESZ_QU] -Выход - -[FESZ_QZ] -Вы уверены, что хотите сохранить игру? - -[FESZ_SA] -Запись игры - -[FESZ_SR] -Save Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[FESZ_TI] -SAVE Z1 - -[FESZ_UC] -ОТМЕНА - -[FESZ_WR] -Saving data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[FES_AFO] -This Memory Card (PS2) is already formatted. - -[FES_CAN] -Отмена - -[FES_CGA] -Доступные ячейки для сохранения: - -[FES_CSA] -Выберите одежду из списка: - -[FES_DAT] - ДАТА - -[FES_DEE] -Deleting Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[FES_DGA] -УДАЛЕНИЕ ЗАПИСЕЙ - -[FES_GME] -Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again. - -[FES_ISC] -ПОВРЕЖДЕН - -[FES_ISF] -ОТСУТСТВУЕТ - -[FES_LCG] -Продолжить игру с того места, где вы записались? - -[FES_LG] -ЗАГРУЗКА ИГРЫ - -[FES_LGA] -Загрузить игру - -[FES_LOE] -Load Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again. - -[FES_LOF] -Загрузка не удалась. - -[FES_NGA] -Новая игра - -[FES_NOC] -No Memory Card (PS2) in MEMORY CARD slot 1. - -[FES_NON] -ВАРИАНТЫ ОДЕЖДЫ ОТСУТСТВУЮТ - -[FES_SAG] -ИМЕЕТСЯ - -[FES_SCG] -Сохранить текущую игру? - -[FES_SET] -ПЕРЕОДЕТЬСЯ - -[FES_SG] -НАЧАТЬ НОВУЮ ИГРУ - -[FES_SKN] -НАЗВАНИЕ ОДЕЖДЫ - -[FES_SLO] -ФАЙЛ ЗАПИСИ - -[FES_SNG] -НАЧАТЬ НОВУЮ ИГРУ - -[FES_SSC] -Игра успешно сохранена. - -[FES_WAR] -Идет запись, подождите... - -[FET_AMS] -НАСТРОЙКА МЫШИ - -[FET_APL] - ОК? - -[FET_APP] -ЛЕВАЯ КНОПКА МЫШИ ИЛИ ВВОД ДЛЯ ПРИНЯТИЯ ИЗМЕНЕНИЙ - -[FET_AUD] -НАСТРОЙКА ЗВУКА - -[FET_BRE] -СООБЩЕНИЯ - -[FET_CAC] -ДЕЙСТВИЯ - -[FET_CCN] -УПРАВЛЕНИЕ: СТАНДАРТНОЕ - -[FET_CCR] -В МАШИНЕ - -[FET_CFT] -ПЕШКОМ - -[FET_CIG] -ЗАБОЙ - УБРАТЬ КЛАВИШИ, ЛЕВАЯ КНОПКА МЫШИ ИЛИ ВВОД - ЗАДАТЬ - -[FET_CME] -ТИП УПРАВЛЕНИЯ - -[FET_CON] -СОЕДИНЕНИЕ - -[FET_CTI] -СТАНДАРТНЫЙ ТИП УПРАВЛЕНИЯ - -[FET_CTL] -НАСТРОЙКА УПРАВЛЕНИЯ - -[FET_DAM] -ДИНАМИЧЕСКАЯ МОДЕЛЬ АКУСТИКИ - -[FET_DEF] -СТАНДАРТНЫЕ НАСТРОЙКИ - -[FET_DG] -УДАЛЕНИЕ ИГРЫ - -[FET_DIS] -НАСТРОЙКА ГРАФИКИ - -[FET_DSN] -Обычная}одежда.bmp - -[FET_EIG] -ДЛЯ ЭТОГО ДЕЙСТВИЯ НЕЛЬЗЯ ЗАДАТЬ КНОПКУ - -[FET_FG] -НАЙТИ ИГРУ - -[FET_FIL] -Фильтр - -[FET_GFX] -НАСТРОЙКА ГРАФИКИ - -[FET_GT] -ТИП ИГРЫ - -[FET_HG] -СОЗДАТЬ ИГРУ - -[FET_HRD] -УСТАНОВЛЕНЫ СТАНДАРТНЫЕ НАСТРОЙКИ - -[FET_JG] -Подключиться - -[FET_LAN] -ВЫБОР ЯЗЫКА - -[FET_LG] -ЗАГРУЗКА ИГРЫ - -[FET_MAP] -ВЫБОР КАРТЫ - -[FET_MIG] -ВЫБОР ПАРАМЕТРА СТРЕЛКАМИ ВЛЕВО, ВПРАВО И КОЛЕСИКОМ МЫШИ - -[FET_MP] -ИГРА ПО СЕТИ - -[FET_MST] -РУЛИТЬ МЫШЬЮ - -[FET_MTI] -ЗАДАНИЕ ПАРАМЕТРОВ МЫШИ - -[FET_NG] -НОВАЯ ИГРА - -[FET_NON] -НЕТ ДОСТУПНЫХ ИГР - -[FET_OPT] -НАСТРОЙКИ - -[FET_PAU] -ПАУЗА В ИГРЕ - -[FET_PS] -ВЫБОР ОДЕЖДЫ - -[FET_PSU] -ВЫБОР ОДЕЖДЫ - -[FET_QG] -ВЫХОД - -[FET_RDK] -ЗАДАТЬ УПРАВЛЕНИЕ - -[FET_REF] -Частота обновления - -[FET_RIG] -ВЫБЕРИТЕ КНОПКУ ДЛЯ ЭТОГО ДЕЙСТВИЯ ИЛИ НАЖМИТЕ ESC ДЛЯ ОТМЕНЫ - -[FET_RSC] -НЕВОЗМОЖНО УСТАНОВИТЬ ЭТОТ ПАРАМЕТР - -[FET_RSO] -ВОССТАНОВЛЕНЫ СТАНДАРТНЫЕ НАСТРОЙКИ - -[FET_SAN] -НАЧАТЬ НОВУЮ ИГРУ - -[FET_SCN] -УПРАВЛЕНИЕ: ОБЫЧНОЕ - -[FET_SFG] -ПОИСК ИГР... - -[FET_SG] -СОХРАНЕНИЕ ИГРЫ - -[FET_SGA] -НАЧАТЬ ИГРУ - -[FET_SNG] -НАЧАТЬ НОВУЮ ИГРУ - -[FET_SP] -ОДИН ИГРОК - -[FET_SRT] -СОРТИРОВКА ИГР... - -[FET_STA] -СТАТИСТИКА - -[FET_STI] -ОБЫЧНЫЙ ТИП УПРАВЛЕНИЯ - -[FE_INIP] -Инициализация и загрузка меню... Подождите. - -[FIL_FLT] -ФИЛЬТР СПИСКА ИГР - -[FIL_MAP] -Карта: - -[FIL_PNG] -Пинг: - -[FIL_SPC] -Доступна игра одному? - -[FIL_SRV] -Создатель: - -[FIL_TYP] -Тип игры: - -[FIRETRK] -Пожарная - -[FIRE_M] -'ПОЖАРНЫЙ' - -[FIRE_WS] -Пожарник погиб - -[FIRST] -~g~первый - -[FLASHB] -Flashback FM - -[FLATBED] -Флетбед - -[FLFSGF] -Fill First File With Guff - -[FM1] -'ПРОГУЛКА' - -[FM1_1] -~g~Вернись назад в Стретч! - -[FM1_10] -~g~Ты проехал мимо Марии, возвращайся и посади ее в машину. - -[FM1_2] -~g~Залезай в Стретч! - -[FM1_3] -~r~Вернись за Марией, иначе Сальваторе с тобой рассчитается. - -[FM1_4] -~g~Ты бросил дочь дона! Возвращайся на склад и жди Марию! - -[FM1_5] -~g~Отвези Марию назад к Сальваторе! - -[FM1_6] -~g~Чико не будет ждать вечно! Отвези Марию на берег! - -[FM1_7] -~r~Мария мертва! Сальваторе это не понравится... - -[FM1_8] -~r~Ты замочил дилера Марии! - -[FM1_9] -~g~Там какая-то гулянка, высади Марию неподалеку. - -[FM1_A] -~w~Мне с приятелями нужно поговорить о деле, - -[FM1_AA] -~w~Я лучше пойду. Надеюсь, увидимся попозже. - -[FM1_B] -~w~Этим вечером тебе придется присматривать за моей девочкой. - -[FM1_C] -~w~ЭЙ МАРИЯ! ПОДНИМАЙ СВОЮ ЗАДНИЦУ! - -[FM1_D] -~w~Эту глупую девку постоянно приходится звать. - -[FM1_E] -~w~А вот и она, единственная и неповторимая королева красоты! - -[FM1_F] -~w~Чем ты там занималась? - -[FM1_G] -~w~Наверняка просаживала мои деньги. - -[FM1_H] -~w~Ну ты же не хочешь, чтобы я крутилась тут и мешала вашему разговору? - -[FM1_I] -~w~Заткнись и иди в машину. - -[FM1_J] -~w~Возьми мой лимузин, но верни его в целости и сохранности, понял? - -[FM1_K] -~w~И смотри чтобы она не влипла в историю. - -[FM1_L] -~w~Да, да, да! Я думаю, твой новый пес может обо мне позаботиться - - -[FM1_M] -~w~вон он какой здоровый. - -[FM1_N] -~w~Эй, Тузик, давай разживемся гостинцами у Чико! - -[FM1_O] -~w~Я думаю, он где-то на железнодорожной станции, у берега Чайнатауна. - -[FM1_P] -~g~А вот и Чико, давай рули к нему. - -[FM1_Q] -~w~Привет, Мария! Прелесть моя! - -[FM1_Q1] -~w~Хочешь поразвлечься? Ну немного... а? Может СПАНКа? - -[FM1_R] -~w~Привет, Чико. Нет, я как обычно. - -[FM1_S] -~w~Держи, золотце. - -[FM1_S1] -~w~Эй, может ты заглянешь ко мне на вечеринку на складе к востоку от пристаней Атлантик. - -[FM1_SS] -~r~РАЦИЯ: ~g~Четыре-пять всем подразделениям: Требуется помощь в облаве на наркоторговцев у пристаней Атлантик... - -[FM1_T] -~w~Спасибо Чико. До скорого. - -[FM1_TT] -~w~ЭТО ОБЛАВА! - -[FM1_U] -~w~Благодарствую, наслаждайтесь. Это хороший товар. - -[FM1_V] -~w~Давай, Тузик, скатаемся на его вечеринку! - -[FM1_W] -~w~Хорошо, Тузик, присматривай за тачкой и жди меня, а я пока пойду подвигаю попой. - -[FM1_X] -~w~Эй, Тузик, давай сматываться отсюда. Ихууу! - -[FM1_Y] -~w~Знаешь, я уже давно так не веселилась, и ты хорошо со мной обращался. С уважением и все такое. - -[FM2] -'СТРИЖКА ТРАВЫ' - -[FM21] -'БОМБА НА БАЗЕ: ЧАСТЬ I' - -[FM2_1] -~g~А вот и Кудрявый Боб! - -[FM2_10] -~r~Кудрявый слинял! - -[FM2_11] -~g~Встань у клуба Луиджи, Кудрявый Боб скоро выйдет. - -[FM2_12] -~r~Он улизнул от тебя! - -[FM2_14] -~r~Ты подошел слишком близко к Кудрявому и спугнул его! - -[FM2_15] -~g~Не приближайся к Кудрявому, а то он заподозрит неладное! - -[FM2_16] -ИСПУГ БОБА: - -[FM2_2] -~g~Кудрявый вышел из клуба, начинай следить! - -[FM2_5] -~g~Отвези его в гавань Портланда. - -[FM2_6] -~r~Кудрявый не сядет в разбитое такси! - -[FM2_7] -~r~Кудрявый испугался! Оне не пойдет на встречу! - -[FM2_8] -~g~Разделайся с Кудрявым Бобом! - -[FM2_9] -~r~Кудрявый Боб мертв! - -[FM2_A] -Колумбийский картель производит СПАНК где-то в городе, - -[FM2_B] -У нас завелась крыса! - -[FM2_C] -Телками или дурью он не торгует - значит, стучит. - -[FM2_F] -А вот и наш дружок - мистер Болтун. - -[FM2_G] -За тобой следили? Лучше, чтобы никто не знал про наш маленький секрет. - -[FM2_H] -Нет..нет, за мной нет хвоста. Дурь у тебя? - -[FM2_I] -Вот твой СПАНК, нытик, теперь выкладывай. - -[FM2_J] -Оставь нас одних, нам нужно поговорить. - -[FM2_K] -но мы не знаем где, а вот они, похоже, знают о каждом нашем шаге, еще до того как мы его сделаем. - -[FM2_L] -Есть один парень - Кудрявый Боб, он работает в баре у Луиджи. - -[FM2_M] -Он тратит больше бабок, чем зарабатывает. - -[FM2_N] -Домой он обычно ездит на такси. Выследи его, - -[FM2_O] -и, если он и есть та самая крыса... прикончи его. - -[FM2_P] -В общем, так: семья Леоне воюет на два фронта. - -[FM2_Q] -Они дерутся за сферы влияния с Триадой, но пока ни одна из сторон не уступает. - -[FM2_R] -А тем временем Джоуи Леоне пустил немного крови Форелли. - -[FM2_S] -Каждый день они теряют людей и свое влияние в городе. - -[FM2_T] -Сальваторе становится опасным параноиком. Он всюду видит одни заговоры. - -[FM2_U] -С такими преданными людьми, как ты, ему не о чем беспокоиться. - -[FM3] -'БОМБА НА БАЗЕ: ЧАСТЬ II' - -[FM3_4] -~g~Останови тачку и дай Лысому выйти! - -[FM3_7] -~r~Лысого замочили! - -[FM3_8] -~r~Охранники подняли тревогу! - -[FM3_8A] -~w~Здорово, друган! Сальваторе мне уже звонил. - -[FM3_8B] -~w~Для этой работенки потребуется много взрывчатки. - -[FM3_8C] -~w~Мне нужно $100,000, чтобы покрыть расходы, - -[FM3_8D] -~w~но ты же знаешь, что я отработаю каждый доллар. - -[FM3_8E] -~w~Окей, давай провернем это дельце! - -[FM3_8F] -~w~Я бы взорвал эту крошку, но пока еще не могу удержать оружие в руках. - -[FM3_8G] -~w~Вот, это ружьишко поможет тебе снести несколько голов! - -[FM3_8I] -~w~Займи удобную позицию, я пойду сразу, после твоего первого высрела. - -[FM3_A] -~w~Мы должны убрать этих колумбийских ублюдков, - -[FM3_B] -~w~но эта война с Триадой сильно истощила наши ряды. - -[FM3_C] -~w~У Картеля очень много зелени, полученной с продажи этого СПАНКа. - -[FM3_CC] -~w~Браток, приходи, когда наскребешь бабок. - -[FM3_D] -~w~Если мы пойдем в открытую атаку, то они просто размажут нас по стенке. - -[FM3_E] -~w~Похоже, они производят СПАНК на том большом корабле, к которому тебя вывел Кудрявый. - -[FM3_F] -~w~Так что нам придется пораскинуть мозгами. Твоими мозгами. - -[FM3_G] -~w~Я, Сальваторе Леоне, лично прошу тебя сделать мне одолжение и уничтожить эту фабрику по производству СПАНКа. - -[FM3_H] -~w~Если ты провернешь для меня это дело - проси все что пожелаешь. - -[FM3_I] -~w~Иди к Лысому. Без его помощи тебе эту работу не сделать. - -[FM4] -'ПОСЛЕДНЯЯ ПРОСЬБА' - -[FM4_1] -Это Мария. Эта машина - ловушка! Давай встретимся южнее моста Каллахан. - -[FM4_2] -Послушай, Сальваторе думает что мы за его спиной крутим роман, - -[FM4_3] -поэтому он заключил с картелем сделку и заложил тебя. - -[FM4_4] -Я не могла этого допустить, ведь тебя бы прикончили, - -[FM4_4B] -и это была бы моя вина... потому что я сказала, что мы были вместе. - -[FM4_5] -Я сама не знаю, почему я это ему сказала. - -[FM4_6] -Похоже теперь за тобой будет охотиться мафия, да и за мной, видимо, тоже. - -[FM4_6B] -Я уже устала от убийств. От этих рек крови! - -[FM4_7] -Это моя хорошая знакомая, она старый друг... это Асука, она из тех, кому можно доверять. - -[FM4_8] -Пошли, хватит распинаться. - -[FM4_9] -Нам лучше убираться, пока здесь не появились наши старые друзья, которым уже нельзя доверять. - -[FM4_A] -~w~А, мой лучший чистильщик. - -[FM4_B] -~w~Я горжусь тобой, мальчик, ты выбил дерьмо из этих жирных свиней. - -[FM4_C] -~w~Но выполни еще одно маленькое задание, прежде чем мы отпразднуем победу. - -[FM4_D] -~w~Рядом с клубом Луиджи стоит одна машина. - -[FM4_E] -~w~Внутри все залито кровью. - -[FM4_F] -~w~Мы вправили одному парню мозги, но получилось не очень аккуратно. - -[FM4_H] -~w~Отгони машину в утилизатор, чтобы не смущать копов. - -[FORMEN] -Format Menu - -[FORMM1] -FormatMemCard 1 (teststuff) - -[FOURTH] -~g~четвертый - -[FRANGO] -~g~Сальваторе хочет, чтобы ты сперва помог Тони разобраться с Триадой! - -[FRANK] -ЗАДАНИЯ САЛЬВАТОРЕ - -[FRENCH] -Французкий - -[FTUTOR] -Нажми кнопку ~h~~k~~TOGGLE_SUBMISSIONS~~w~, чтобы заняться работой пожарного, или отказаться от нее. - -[FTUTOR2] -Нажми кнопку ~h~~k~~TOGGLE_SUBMISSIONS~~w~, чтобы заняться работой пожарного, или отказаться от нее. - -[F_CANC] -~r~Задание пожарного прервано! - -[F_EXTIN] -ПОЖАРЫ: - -[F_FAIL1] -Задание не выполнено. - -[F_FAIL2] -~r~Ты опоздал! - -[F_PASS1] -Огонь потушен! - -[F_RANGE] -~g~Рация в машине не ловит сигнал, подъедь поближе к пожарной части! - -[F_START] -~g~Место возгорания машины: ~a~. Езжай и сбей огонь. - -[F_WASTE] -Женщин убито - -[GAMEOVR] -ИГРА ОКОНЧЕНА - -[GAMSET] -Настройки игры - -[GAM_FM] -Радио Game FM - -[GARAGE] -Поставь машину в гараж и выйди наружу. - -[GARAGE1] -~g~Вылазь из машины и выходи из гаража. - -[GA_1] -Ух, ты! Я не трогал ничего БОЛЕЕ горячего! - -[GA_10] -Отлично. Вот тебе ~1~ баксов. - -[GA_11] -У нас уже есть такая тачка. Больше нам уже не нужно! - -[GA_12] -Бомба активирована - -[GA_13] -Отличная работа! Пригонишь остальные - получишь вознаграждение. - -[GA_14] -Все тачки. КРУТО! Вот тебе за это. - -[GA_15] -Надеюсь, тебе понравится этот цвет. - -[GA_16] -Перекраска бесплатно. - -[GA_19] -Нам такая колымага не нужна. - -[GA_1A] -Возвращайся, когда будешь свободен... - -[GA_2] -Машина отремонтирована и перекрашена. Теперь копы тебя не узнают! - -[GA_20] -У нас этого хлама больше чем нужно. Прости, сделка не состоится. - -[GA_21] -Больше в этот гараж поставить машин нельзя. - -[GA_3] -Подарков больше не будет. Окраска стоит $1000! - -[GA_4] -Установка бомбы в машину стоит $1000 - -[GA_5] -Я уже поставил в бомбу в эту тачку. - -[GA_6] -Припаркуй тачку на место, нажми ~h~~k~~PED_FIREWEAPON~~w~ и ДЕЛАЙ НОГИ! - -[GA_6B] -Припаркуй тачку на место, нажми ~h~~k~~PED_FIREWEAPON~~w~ и ДЕЛАЙ НОГИ! - -[GA_7] -Включи бомбу, нажав на ~h~~k~~PED_FIREWEAPON~~w~. Бомба взорвется как только заведется мотор. - -[GA_7B] -Включи бомбу, нажав на ~h~~k~~PED_FIREWEAPON~~w~. Бомба взорвется как только заведется мотор. - -[GA_8] -Взорви бомбу с помощью детонатора. - -[GA_9] -Ты собрал ~1~ из 10 особых тачек - -[GERMAN] -German - -[GHOST] -Призрак - -[GMLOAD] -ПРОДОЛЖИТЬ ИГРУ - -[GMREST] -Перезапуск игры - -[GMSAVE] -СОХРАНЕНИЕ ИГРЫ - -[GMSTOR] -Game Store - -[GMSVLQ] -GAME SAVE-LOAD-QUIT - -[GNG_WST] -Убито членов банд - -[GOAWAY] -~g~Ты уже на задании! - -[GOBACK] -GoBack - -[GORLEV] -Уровень крови - -[GREN_1] -Чем дольше ты держишь ~h~~k~~PED_FIREWEAPON~~w~, тем дальше ты бросишь гранату. - -[GREN_2] -Чем дольше ты держишь ~h~~k~~PED_FIREWEAPON~~w~, тем дальше ты бросишь гранату. - -[GREN_3] -Чем дольше ты держишь ~h~~k~~PED_FIREWEAPON~~w~, тем дальше ты бросишь гранату. - -[GTAB_A] -Эй, давайте уберите это отсюда. Черт его знает, что это такое, - -[GTAB_B] -но раз он так хотел это заполучить, то это, наверное, что-то ценное. - -[GTAB_C] -Что за черт! - -[GTAB_D] -ТЫ! - -[GTAB_E] -Успокойся, амиго! Де нада! Де нада! - -[GTAB_F] -Я порежу тебя и брошу в канаву истекать кровью! - -[GTAB_G] -Не стреляй, амиго. Без базара. Мы все друзья. Вот, забирай. - -[GTAB_H] -Не будь таким засранцем! - -[GTAB_I] -У нас нет выбора, крошка! - -[GTAB_J] -Выбор есть всегда, ты чертов ублюдок! - -[GTAB_K] -Прости, это все эта бешеная сучка, это все она...пор фавор? - -[GTAB_L] -Итак, этой сучки больше нет. - -[GTAB_M] -Но ты оказал мне услугу, - -[GTAB_N] -ты не единственный, у кого есть счеты с Картелем, - -[GTAB_O] -эта мразь убила моего брата! - -[GTAB_P] -Я никогда не убивал якудза! - -[GTAB_Q] -ЛЖЕЦ. Мы все видели убийцу Картеля. - -[GTAB_R] -Мы выследим и убьем всех вас, колумбийских собак! - -[GTAB_S] -Я поиграю немного с твоим другом, чтобы получить информацию и доставить себе удовольствие. - -[GTAB_T] -Я жду тебя позже, я уверена, мне понадобятся твои услуги. - -[GTAB_U] -Пожалуйста, амиго, не оставляй меня с ней, она ненормальная! Друг? Эй, ДРУУУГ!!!... Аииииаааахххх! - -[GUN_1A] -Для смены оружия используй ~h~~k~~PED_CYCLE_WEAPON_RIGHT~~w~ и ~h~~k~~PED_CYCLE_WEAPON_LEFT~. - -[GUN_2A] -Держи ~h~~k~~PED_LOCK_TARGET~~w~, чтобы ~h~прицелиться~w~, а затем нажимай ~h~~k~~PED_FIREWEAPON~~w~, чтобы выстрелить! Потренируйся на мишенях... - -[GUN_2C] -Держи ~h~~k~~PED_LOCK_TARGET~~w~, чтобы ~h~прицелиться~w~, а затем нажимай ~h~~k~~PED_FIREWEAPON~~w~, чтобы выстрелить! Потренируйся на мишенях... - -[GUN_2D] -Держи ~h~~k~~PED_LOCK_TARGET~~w~ чтобы ~h~прицелиться~w~, а затем нажимай ~h~~k~~PED_FIREWEAPON~~w~ чтобы выстрелить! Потренируйся на мишенях... - -[GUN_3A] -Чтобы сменить цель, удерживая ~h~~k~~PED_LOCK_TARGET~~w~, нажимай ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~ или ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~. - -[GUN_3B] -Чтобы сменить цель, удерживая ~h~~k~~PED_LOCK_TARGET~~w~, нажимай ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~ или ~h~~k~~PED_CYCLE_TARGET_RIGHT~~w~. - -[GUN_4A] -Когда ты держишь ~h~~k~~PED_LOCK_TARGET~~w~, то можешь ходить или бегать, не выпуская цель из перекрестия. - -[GUN_4B] -Когда ты держишь ~h~~k~~PED_LOCK_TARGET~~w~, то можешь ходить или бегать, не выпуская цель из перекрестия. - -[GUN_5] -Ты можешь попрактиковаться на этих мишенях в прицеливании и стрельбе. Как только закончишь - возвращайся к заданию. - -[HARWOOD] -Харвуд - -[HEAD] -Head Radio - -[HEALTH] -ЦЕЛОСТНОСТЬ: - -[HEALTH1] -Проваливай! Ты полностью здоров. - -[HEALTH2] -Лечение не бесплатное. - -[HEALTH3] -Сейчас я тебя подлатаю. - -[HEALTH4] -Это будет стоить тебе $250. - -[HEAL_A] -Твое ~h~здоровье~w~ отображается оранжевыми цифрами в верхнем правом углу экрана. - -[HEAL_B] -Когда ты ~h~вырубаешься,~w~ тебя отвозят в ближайший госпиталь - -[HEAL_C] -При этом ты теряешь все свое оружие и доктора берут с тебя немного денег за лечение. - -[HEAL_E] -Во время игры ты найдешь способы, как подлечиться или сберечь свое здоровье. - -[HED_EX] -Голов расколото - -[HELI] -Вертолет - -[HELP1] -Остановите машину в центре голубого круга. - -[HELP10] -Эти значки показывают, насколько сильно стремление копов арестовать тебя. - -[HELP11] -Чем больше этих значков, тем более усердно тебя преследует полиция. - -[HELP12] -Войди в голубой круг, чтобы получить новое задание. - -[HELP13] -Иногда тебе придется ехать по дорогам, которые не показаны на радаре. - -[HELP14] -Чтобы подобрать оружие, тебе нужно к нему подойти. Сидя в машине, ты оружие не возьмешь. - -[HELP15] -Когда ты без машины, то, нажав ~h~~k~~PED_LOOKBEHIND~~w~, можешь ~h~оглянуться назад~w~. - -[HELP2_A] -Чтобы ~h~разогнаться~w~, держи ~h~кнопку /~w~ во время бега. - -[HELP3] -Мчаться ты можешь лишь до тех пор, пока не устанешь. - -[HELP4_A] -Чтобы ~h~поехать вперед~w~, держи кнопку ~h~ ~k~~VEHICLE_ACCELERATE~~w~. - -[HELP4_D] -Push the~h~ right analog stick~w~ up to ~h~accelerate. - -[HELP5_A] -Держи кнопку~h~ ~k~~VEHICLE_BRAKE~~w~, чтобы ~h~затормозить~w~, или ~h~поехать назад~w~ после того, как машина остановится. - -[HELP5_D] -Pull the ~h~right analog stick~w~ back to ~h~brake~w~, or to ~h~reverse~w~ if the vehicle has stopped. - -[HELP6_A] -Держи кнопку~h~ ~k~~VEHICLE_HANDBRAKE~~w~, чтобы воспользоваться ~h~ручным тормозом. - -[HELP6_C] -Держи кнопку~h~ ~k~~VEHICLE_HANDBRAKE~~w~, чтобы воспользоваться ~h~ручным тормозом. - -[HELP6_D] -Держи кнопку~h~ ~k~~VEHICLE_HANDBRAKE~~w~, чтобы воспользоваться ~h~ручным тормозом. - -[HELP7_A] -Нажми и удерживай~h~ ~k~~PED_LOCK_TARGET~~w~ кнопку, чтобы ~h~прицелиться~w~ из снайперской винтовки. - -[HELP7_D] -Нажми и удерживай~h~ ~k~~PED_LOCK_TARGET~~w~ кнопку, чтобы ~h~прицелиться~w~ из снайперской винтовки. - -[HELP8_A] -Нажми ~h~ ~k~~PED_SNIPER_ZOOM_IN~~w~, чтобы ~h~увеличить ~w~ изображение или ~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~, чтобы ~h~уменьшить~w~ его при при прицеливании из снайперской винтовки. - -[HELP8_B] -Нажми ~h~ ~k~~PED_SNIPER_ZOOM_IN~~w~, чтобы ~h~увеличить ~w~ изображение или ~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~, чтобы ~h~уменьшить~w~ его при при прицеливании из снайперской винтовки. - -[HELP9_A] -Нажми ~h~ ~k~~PED_FIREWEAPON~~w~, чтобы ~h~выстрелить~w~ из снайперской винтовки. - -[HELP9_B] -Нажми ~h~ ~k~~PED_FIREWEAPON~~w~, чтобы ~h~выстрелить~w~ из снайперской винтовки. - -[HELP9_C] -Нажми ~h~ ~k~~PED_FIREWEAPON~~w~, чтобы ~h~выстрелить~w~ из снайперской винтовки. - -[HEL_DST] -Сбито вертолетов - -[HEY] -~g~Не ходи в одиночку, иди с компанией! - -[HEY2] -~g~Не разделяйтесь, идите вместе! - -[HEY3] -~g~Ты потерял своего напарника, вернись к Лысому! - -[HEY4] -~g~Потеряешь Мисти - к Луиджи лучше не возвращайся! Иди и найди ее! - -[HEY5] -~g~Для полного кайфа не хватает еще одной телки. Сгоняй за ней! - -[HEY6] -~g~Твоя честь зависит от якудза Канбу. Ты должен защищать его! - -[HEY7] -~g~Возможно стоит получше вооружиться. Иди и забери своего напарника! - -[HEY8] -~g~Защита - это значит 'защищать Старого Азиата'! - -[HEY9] -~g~Хочешь совет? Иди, встреться с напарником! - -[HJSTAT] -Дальность: ~1~.~1~м Высота: ~1~.~1~м Переворотов: ~1~ Поворот на: ~1~_ - -[HJSTATF] -Дальность: ~1~ft Высота: ~1~ft Переворотов: ~1~ Поворот на: ~1~_ - -[HJSTATW] -Дальность: ~1~.~1~м Высота: ~1~.~1~м Переворотов: ~1~ Поворот на: ~1~_ И отличное приземление! - -[HJSTAWF] -Дальность: ~1~ft Высота: ~1~ft Переворотов: ~1~ Поворот на: ~1~_ И отличное приземление! - -[HJ_DIS] -ПРИЗ ЗА ДВОЙНОЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_IS] -ПРИЗ ЗА БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_PDIS] -ПРИЗ ЗА ИДЕАЛЬНЫЙ ДВОЙНОЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_PIS] -ПРИЗ ЗА ИДЕАЛЬНЫЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_PQIS] -ПРИЗ ЗА ИДЕАЛЬНЫЙ ЧЕТВЕРНОЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_PTIS] -ПРИЗ ЗА ИДЕАЛЬНЫЙ ТРОЙНОЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_QIS] -ПРИЗ ЗА ЧЕТВЕРНОЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HJ_TIS] -ПРИЗ ЗА ТРОЙНОЙ БЕЗУМНЫЙ ТРЮК: $~1~ - -[HM1_1] -~g~Прикончи 20 Пурпурных Девяток за 2 минуты 30 секунд. - -[HM1_2] -~g~Возьми тачку, но не забывай, что из машины можно стрелять лишь из Узи! - -[HM1_3] -~g~'Девятки' любят шататься в Садах Вичита. - -[HM1_A] -Йо! Это ДиАйс из Красных Валетов! - -[HM1_B] -Тут кое кто решил со мной поиграть. - -[HM1_C] -У этих молодых панков, что заполонили весь город, головы забиты лишь СПАНком и оружием. - -[HM1_D] -'Девятка' - это их знак, они придумали себе пурпурный флаг и готовы трясти им целыми днями... - -[HM1_E] -Я хочу, чтобы ты показал этим малолетним ублюдкам, как работают профессионалы. - -[HM1_F] -Будь поосторожней. На улицах могут оказаться Валеты, которые решат, что ты и их решил заодно мочкануть! - -[HM1_G] -эти засранцы начинают теснить 'Валетов'. - -[HM1_H] -Сделай так, чтобы этих Девяток здесь не было! - -[HM2_1] -Используй радоуправляемые машинки, чтобы подорвать броневики. Взрыв бомбы - ~h~~k~~PED_FIREWEAPON~~w~. - -[HM2_1A] -Используй радоуправляемые машинки, чтобы подорвать броневики. Взрыв бомбы - ~h~~k~~PED_FIREWEAPON~~w~. - -[HM2_2] -~r~Ты так и не смог подорвать все броневики! - -[HM2_3] -Если машинка стукнется о колесо, то она взорвется! - -[HM2_4] -Если машинка окажется вне действия радиоуправления, то она взорвется! - -[HM2_5] -~r~Вне зоны приема сигнала! - -[HM2_6] -~g~Броневик уничтожен! - -[HM2_A] -Эти Девятки достали меня. - -[HM2_B] -Уроды раздобыли где-то броневики и развозят на них СПАНК... - -[HM2_C] -и без страха впаривают его желающим. - -[HM2_D] -Выше по улице припаркована тачка. - -[HM2_E] -В ней для тебя я кое-что припас, чтобы ты смог проучить этих тупиц... - -[HM2_F] -и раздолбать их бронированные игрушки. - -[HM3_1] -~g~Двигай к гаражу, но смотри, если сильно помнешь тачку - она взорвется! - -[HM3_2] -~g~Забирай тачку, теперь она в полном порядке! - -[HM3_3] -~g~Отремонтируй тачку! - -[HM3_A] -Какая-то сволочь установила мне бомбу в тачку. - -[HM3_B] -Если я потеряю колеса, то лишусь своей репутации в районе. - -[HM3_C] -Давай отгони мою колымагу в гараж на Сент-Марк, ты понял, йо. - -[HM3_D] -Как снять бомбу - это уже пусть они сами думают. - -[HM3_E] -Часы уже тикают, давай, гони. - -[HM3_F] -Но учти, одного столкновения достаточно, чтобы взлететь на воздух. - -[HM3_G] -Ну же, вперед! - -[HM4_1] -~g~Отправляйся к месту крушения самолета, тебе нужно собрать не менее 30 слитков. - -[HM4_2] -~g~Запомни, по мере заполнения тачка будет тяжелеть и хуже слушаться руля, съезди в гараж и вывали там груз. - -[HM4_A] -Йо, рейсовый самолет, перевозящий федеральные деньги разбился в аэропорту Фрэнсис. - -[HM4_B] -Слитки платины валяются по всей взлетной полосе. - -[HM4_C] -Бери тачку и сопри, сколько сможешь. - -[HM4_D] -~g~Возьми тачку! - -[HM4_E] -TEXT NO LONGER REQUIRED - -[HM4_F] -Ты можешь возить слитки в один из моих гаражей. - -[HM4_G] -Эти слитки чертовски тяжелые и будут замедлять движение. - -[HM4_H] -Так что не забывай почаще сваливать груз. - -[HM5_1] -Йо, Айс сказал ты придешь. Правила просты. Только биты. Никаких пушек, никаких машин. - -[HM5_3] -~r~Тебе же сказали, что можно пускать в ход лишь биту! - -[HM5_4] -~r~Твой напарник мертв! - -[HM5_5] -Эта драка для поднятия авторитета, ты въехал? - -[HM5_6] -Пошли, расколем несколько черепушек... - -[HM5_A] -Эти Девятки уже в полном дерьме... - -[HM5_B] -но им не терпится поквитаться. - -[HM5_C] -Они согласились прийти на разборку. - -[HM5_D] -Их банда против нас двоих, или точнее... - -[HM5_E] -вас двоих, - -[HM5_F] -я с тобой идти не могу... - -[HM5_G] -мне еще три месяца нельзя светиться, у меня условное, - -[HM5_H] -ты уловил, о чем я? - -[HM5_I] -Мой младшенький встретит тебя, - -[HM5_J] -он и покажет, где намечается устроить разборку, успехов, сынок. - -[HM_1] -'РАБОТА ДЛЯ УЗИ' - -[HM_2] -'ИГРУШЕЧНАЯ ВОЙНА' - -[HM_3] -'ТАЧКА С БОМБОЙ' - -[HM_4] -'МАННА НЕБЕСНАЯ' - -[HM_5] -'РАЗБОРКА' - -[HOOD] -ЗАДАНИЯ КАПЮШОНОВ - -[HOOD1_A] -Сними трубку телефона стоящего в Садах Вичита, и мы обсудим одно дело. - -[HOODGO] -~g~Сейчас у Капюшонов нет заданий! - -[HOODSCR] -Рампо XL Капюшонов - -[HORN] -~g~Посигналь. - -[HORN1] -Press the ~h~L3 button ~w~to activate the ~h~horn. - -[HORN2] -Press the ~h~L1 button ~w~to activate the ~h~horn - -[HORN3] -Press the ~h~R1 button ~w~to activate the ~h~horn - -[HOSPI_2] -Рокфорд - -[IDAHO] -Айдахо - -[IMPEXPP] -Автосалон в Портланде. Есть заказы на различные машины. Подробности - на нашей доске объявлений. - -[IMPORT1] -Выйди наружу и жди, когда тебе подадут тачку. - -[IND_ZON] -Портланд - -[INFERNS] -Инфернус - -[INSTUN] -Обычный безумный трюк - -[IN_BOAT] -~g~Без катера тебе это задание не выполнить! - -[IN_ROW] -Приз за ~1~ ПОДРЯД! $~1~ - -[IN_VEH] -~g~Эй! Ты куда? Давай садись за руль! - -[IN_VEH2] -~g~Без машины тебе это задание не выполнить! - -[ITALIA] -Italian - -[JAILB_A] -Утром полиция и служба спасения напряженно работали над устранением - -[JAILB_B] -чрезвычайной ситуации, вызванной нападением на полицейский конвой. - -[JAILB_C] -У нас пока нет никаких сведений ни о том, кого сегодня перевозили, - -[JAILB_D] -ни о том, какая преступная группировка ответственна за это дерзкое нападение. - -[JAILB_E] -Как обычно, ранним утром полицейский конвой покинул участок, - -[JAILB_F] -чтобы перевезти заключенных в городскую тюрьму. - -[JAILB_G] -Нападение произошло на мосту Каллахан. - -[JAILB_H] -Большинство свидетелей преступления погибло при взрыве, который сильно повредил мост. - -[JAILB_I] -Полиция полагает, что при взрыве также могли погибнуть - -[JAILB_J] -и некоторые заключенные. - -[JAILB_K] -Выяснение личностей сбежавших преступников осложнено - -[JAILB_L] -из-за атаки хакеров, испортивших базу данных полиции. - -[JAILB_M] -Мэр ОТДонован объяснил, что полиция - -[JAILB_N] -* - -[JAILB_O] -Из-за этой катастрофы район Портланда оказался изолирован от города, - -[JAILB_P] -так как прокладка туннеля Портер все еще не завершена. - -[JAILB_Q] -Ну же, открывайте! - -[JAILB_R] -А, мистер членоголовый! - -[JAILB_S] -Я бы мог спокойно тебя пристрелить. - -[JAILB_T] -Вы еще об этом пожалеете. - -[JAILB_U] -Эй, вы, давайте, смывайтесь. - -[JAILB_V] -Либерти Сити был потрясен сегодняшним преступлением. - -[JAILB_W] -Полиция считает, что это нападение - несомненно, дело рук профессионалов. - -[JAILB_X] -По предварительным данным - -[JAN] -Янв - -[JM1] -'ПОСЛЕДНИЙ УЖИН ГУБАСТОГО' - -[JM1_1] -~g~Отгони машину Форелли в гараж к Лысому, он на севере отсюда за 'Автомобилями в кредит'. - -[JM1_2] -~g~Припаркуй тачку на стоянке у бистро Марко. - -[JM1_3] -~g~Включи бомбу и быстрее сваливай! - -[JM1_4] -~g~Ты помял тачку! Ее нужно отремонтировать! - -[JM1_5] -~g~Ты не включил бомбу! - -[JM1_6] -~g~Поставь машину так, как она стояла раньше. - -[JM1_7] -~g~Закрой дверцу машины, а то он заподозрит неладное! - -[JM1_8A] -~y~Эй, это мой главный работник! - -[JM1_8B] -~y~Здесь все автоматизировано. Просто заезжай внутрь и жди, пока установят бомбу. - -[JM1_8C] -~y~Вот, первый раз даром, но потом плати бабки. - -[JM1_A] -Эй, мне скучно, может, потрахаемся? - -[JM1_B] -Погоди, дорогуша, мне тут нужно одно дельце провернуть. - -[JM1_C] -Для тебя, друг, есть одна работенка. - -[JM1_D] -Братья Форелли забыли мне вернуть старый должок. - -[JM1_E] -Надо бы преподать им хороший урок, чтоб все знали. - -[JM1_F] -Губастый Форелли сейчас набивает пузо в бистро на Сент-Марк, - -[JM1_G] -отгони его машину в гараж Лысого, тот что в Харвуде. - -[JM1_H] -Ты же знаком с Лысым? - -[JM1_I] -Как только он установит бомбу, верни машину туда, где взял. - -[JM1_J] -Ну а потом тебе останется только наблюдать. - -[JM1_K] -Но давай живее, толстяк не будет жрать вечно. - -[JM2] -'ПРОЩАЙ, ЧАНКИ ЛИ ЧОНГ' - -[JM2_A] -Чанки Ли Чонг толкает СПАНК новой банде из Колумбии... или Колорадо... или как там... - -[JM2_B] -Короче, я не знаю точно, да это и не важно. - -[JM2_C] -У него киоск с лапшой в центре Чайнатауна. - -[JM2_D] -Лучше бы этот крысеныш лишь свою жратву толкал. - -[JM2_E] -Я хочу, чтобы ты с ним разобрался! - -[JM2_F] -Если тебе нужен ствол, зайди во двор оружейного магазина, который рядом с метро. - -[JM2_G] -Знаешь, где этот магазинчик? Возьмешь там пистолет. - -[JM2_H] -Да, не забывай, что Чайнатаун - территория Триады, будь там поосторожней. - -[JM3] -'ОГРАБЛЕНИЕ ФУРГОНА' - -[JM3_1] -~g~Отгони фургон в гараж. - -[JM3_2] -~g~Тарань фургон до тех пор, пока не разобьешь его на 70%. - -[JM3_A] -Мы решили грабануть инкассаторский фургон. - -[JM3_B] -Он каждый день выезжает из Чайнатауна. - -[JM3_C] -Пули его броню не возьмут, так что тебе придется таранить его своей тачкой - -[JM3_D] -Хорошенько его помни, и сраный охранник сам его бросит. - -[JM3_E] -Потом отгони его на склад в доках, а мои парни сделают все остальное. - -[JM3_F] -Давай за работу. Фургон не будет вечно кататься по городу. - -[JM4] -'ШОФЕР СИПРИАНИ' - -[JM4_10] -Окей, парень. Сначала мы заглянем в прачечную в Чайнатауне, у меня там есть кое-какие дела. - -[JM4_11] -Эти прачки не желают платить крыше. - -[JM4_12] -И поаккуратней веди, Джоуи только что починил эту развалюху. - -[JM4_13] -Не превращай ее снова в груду металла, окей? - -[JM4_2] -Подожди здесь! Не глуши мотор, мало ли что может случиться. - -[JM4_3] -Это засада Триады! Парень, сваливаем отсюда! - -[JM4_4] -Триада думает, что может безнаказанно перейти мне дорогу, Триада, МНЕ! - -[JM4_5] -Зайди ко мне попозже, зададим им работенку - отстирывать с одежды собственную кровь! - -[JM4_6] -Эй, аккуратней! Я же тебе говорил. - -[JM4_7] -~g~Отвези Тони в мамочкин ресторан. - -[JM4_8] -~r~Тони загасили! - -[JM4_A] -Да, я знаю, Тони, я все отрегулировал. Она прямо мурлычет, послушай сам. - -[JM4_B] -О! А вот и тот парень, о котором я тебе говорил! - -[JM4_C] -Познакомься. Этот парень не итальянец, и не механик, но с работой справляется. - -[JM4_D] -Это Папс Капо, Тони Сиприани. - -[JM4_E] -Хай, я Тони Сиприани. - -[JM4_F] -Отвези его в мамочкин ресторан на Сент-Марк, хорошо? - -[JM4_G] -И еще, зайди ко мне попозже, я планирую одно дельце и мне понадобится хороший водила. - -[JM5] -'КАТАФАЛК СО СКУНСОМ' - -[JM5_1] -~g~Отвези его в утилизатор! - -[JM5_2] -~g~Это братья Форелли! - -[JM5_A] -Прекрасно! Просто великолепно. - -[JM5_B] -Отлично, с тобой-то я и хотел поговорить! - -[JM5_C] -В-общем, у кафе рядом с мысом Каллахан стоит катафалк со жмуриком. - -[JM5_D] -Один из братьев Форелли решил, что он слишком умный, ну и получил за это по заслугам. - -[JM5_E] -Отвези его тело к утилизатору в Харвуд, ладно? - -[JM6] -'БЕГСТВО' - -[JM6_1] -Поехали к банку по главной улице. - -[JM6_2] -Не глуши мотор, мы по-быстрому. Туда и обратно. - -[JM6_3] -Быстрее, сваливаем! - -[JM6_4] -Стряхни копов с хвоста и гони в укрытие! - -[JM6_5] -~g~Понадобится быстрая тачка, идиот! - -[JM6_6] -~g~Иди, найди менее заметную тачку! - -[JM6_7] -~g~Чтобы ограбить банк, тебе нужны все трое! - -[JM6_8] -~r~Ты потерял всех налетчиков! - -[JM6_A] -Классная будет тачка, да? - -[JM6_B] -Короче слушай. Достань тачку получше и езжай к убежищу на Сент-Марк, где подберешь моих друзей. - -[JM6_C] -Они решили взять банк, но им нужен водила. - -[JM6_D] -Я замолвил за тебя словечко, так что не напортачь. - -[JM6_E] -Отвези их к банку до пяти часов, и ни минутой позже. - -[JOEY] -ЗАДАНИЯ ЗОУИ - -[JOEYGO] -~g~Джоуи развлекается в городе вместе с Мисти. Приходи позже! - -[JUL] -Июл - -[JUN] -Июн - -[KABOOM] -БАБАХ! - -[KEMUGO] -~g~Мария и Кемури сейчас заняты. Загляни попозже! - -[KENJGO] -~g~Кенжи сейчас на собрании Якудзы. Заходи как-нибудь потом! - -[KENJI] -ЗАДАНИЯ КЕНДЖИ - -[KENSGO] -~g~Кенжи занят! Зайди попозже! - -[KGS_EXP] -Использовано взрывчатки (Кг.) - -[KILLS] -УБИТО: - -[KM1] -'ОСВОБОЖДЕНИЕ КАНБУ' - -[KM1_1] -~g~Укради полицейскую машину! - -[KM1_10] -~r~Якудза Канбу погиб - как и твоя честь! - -[KM1_11] -~r~Ты поджарил сам себя! - -[KM1_12] -~g~Отвези его к Доджо, но сперва разберись с полицейскими! - -[KM1_13] -Поставь машину в гараж! - -[KM1_2] -~g~Начини машину взрывчаткой! - -[KM1_3] -~g~Теперь вези его к Доджо Якудзы. - -[KM1_4] -~g~Для этого задания тебе понадобится полицейская машина! - -[KM1_5] -~g~Отлично, теперь вали к полицейскому участку. - -[KM1_6] -~g~Установи в машину бомбу! - -[KM1_7] -~g~Проезд только для полицейских! - -[KM1_8A] -Чтобы ~h~подорвать бомбу~w~, нажми ~h~~k~~PED_FIREWEAPON~~w~, но не забудь отойти подальше от машины. - -[KM1_8D] -Чтобы ~h~подорвать бомбу~w~, нажми ~h~~k~~PED_FIREWEAPON~~w~, но не забудь отойти подальше от машины. - -[KM1_9] -~r~Установленной в машине бомбой ты должен был взорвать стену! - -[KM1_A] -Моя сестра хорошо о тебе отзывается, - -[KM1_B] -Возможно, ты сможешь урегулировать одну ситуацию, которая ставит меня в неловкое положение. - -[KM1_C] -Якудза Канбу сейчас в участке и ждет отправки в суд. - -[KM1_D] -Мы благодарны тебе за такой самоотверженный поступок. Если тебе вдруг понадобится помощь, то Доджо даст тебе двух своих лучших людей. - -[KM1_E] -но я, пока что, не видел от вас, гайдзинов, ничего, кроме разочарований. - -[KM1_F] -Разумеется, в случае провала мы опозоримся. - -[KM1_G] -Он очень ценный член семьи. - -[KM1_H] -Вызволи его из заключения и отвези к Доджо на Бедфорд Поинт. - -[KM2] -'ВЕЛИКИЙ АВТОВОР' - -[KM2_1] -~g~Отремонтируй тачку, она должна сверкать. - -[KM2_2] -~g~Тачка пригнана. - -[KM2_3] -~g~Запомни, ~r~тачка~g~ должна быть в идеальном состоянии, иначе ее не примут в ~p~гараже~g~. - -[KM2_A] -Ты даже не представляешь, сколько в нашей работе внимания приходится уделять этикету. - -[KM2_B] -К моему великому стыду, один человек оказал мне услугу, а я так и не смог отплатить ему за его доброту. - -[KM2_C] -Его слабость - машины. Он просил, чтобы мы приобрели для его коллекции несколько редких экземпляров. - -[KM2_D] -Эти автомобили мы преподнесем ему как подарок, в счет погашения моего долга. - -[KM2_E] -Ты должен раздобыть эти машины и доставить в гараж за стоянкой в Ньюпорте. - -[KM2_F] -Для меня это дело чести. - -[KM3] -'ДОГОВОР' - -[KM3_1] -~g~Картель ожидает прибытия ямайцев, иди и укради тачку Ярди! Ты найдешь ее к северу отсюда, в Ньюпорте. - -[KM3_10] -~r~Напарник убит! - -[KM3_11] -~g~Картель атакован и дипломат забрать не удастся. - -[KM3_12] -~g~Убей всех колумбийцев, взорви их тачки и забери дипломат. - -[KM3_13] -~g~Отвези дипломат назад в казино. - -[KM3_14] -~r~Тебя опознали, ты напортачил! - -[KM3_2] -~g~Езжай и подбери своего напарника. - -[KM3_3] -~g~Они встречаются на автостоянке больницы в Рокфорде! - -[KM3_4] -~r~Они смылись! - -[KM3_5] -~g~Чтобы дела пошли - посигналь. - -[KM3_6] -~g~Убей их, убей их всех! - -[KM3_7] -Это подстава Якудзы! - -[KM3_8] -~g~Чтобы выполнить эту работу, тебе нужна тачка Ярди! - -[KM3_9] -~r~Один из Колумбийцев мертв, дело не выгорит. - -[KM3_A] -Дурак подставляет опасности спину, а умный смотрит ей в лицо. - -[KM3_B] -Колумбийский Картель проигнорировал наши многочисленные требования убраться из нашей сферы влияния. - -[KM3_C] -Сейчас они договариваются о сотрудничестве с Ямайцами, чтобы сообща выступить против нас. - -[KM3_D] -Сейчас в городе они ведут последнюю стадию переговоров. - -[KM3_E] -Это дело чести, чтобы ты их там всех порешил. - -[KM3_F] -Возьми моего человека, укради машину Ярди, иди и окажи уважение Колумбийцам. - -[KM4] -'ШИМА' - -[KM4_1] -Мне нечем платить, но я не стал бы платить, даже если бы мог! - -[KM4_10] -Да какие ВЫ к черту якудза...? - -[KM4_11] -~g~Верни деньги назад в казино! - -[KM4_2] -От вас никакого толка. - -[KM4_3] -Я не за этим вам плачу. Если бы мне нужна была такая защита, я обратился бы к этим сраным копам. - -[KM4_4] -~g~Разберись с этой бандой и верни ~b~дань~g~, принадлежащую Якудзе! - -[KM4_5] -Дональд Лав желает принять тебя в своем чайном саду, и обсудить кое-какие дела. - -[KM4_6] -Вот деньги, все как договаривались! - -[KM4_7] -~r~Хозяин магазина сдох! - -[KM4_8] -~g~Ты взял чемоданчик! - -[KM4_9] -Какие-то юные бандиты обчистили это место! Они забрали все что было! - -[KM4_A] -Чтобы быть действительно сильным, важно никогда не проявлять слабость. - -[KM4_B] -Дела идут довольно успешно, сегодня как раз нужно собрать дань. - -[KM4_C] -Иди и немедленно забери деньги, чтобы мы могли положить их на счет в казино. - -[KM5] -'РАЗЪЯСНЕНИЯ' - -[KM5_1] -~g~ПРОДАВЕЦ УБИТ! - -[KM5_2] -~g~Ярди слинял. - -[KM5_3] -~r~Ты не успел убить даже ~1~ Ярди. - -[KM5_4] -~g~Поздравляем, ты прикончил ~1~ Ярди. - -[KM5_5] -~g~Поздравляем, ты прикончил ~1~ Ярди. ПРИЗ $~1~ - -[KM5_6] -~g~Ты должен убить как минимум 8 торговцев-Ярди. - -[KM5_7] -~g~Убивай их побыстрее! Продав СПАНК, они смоются. - -[KM5_A] -ТЫ! Отличный момент чтобы прийти и показать свою тупую морду! - -[KM5_B] -Ты в курсе, что твоя прошлая попытка объяснить ямайцам, - -[KM5_B1] -что им не стоит водить дружбу с Картелем, не принесла никаких плодов? - -[KM5_C] -Ярди заполонили весь город, и торгуют пакетиками со СПАНКом, словно горячими пирожками! - -[KM5_D] -Эти Картельные свиньи смеются над нами, надо мной! - -[KM5_E] -Я даю тебе последний шанс доказать, что моя сестра в тебе не ошиблась! - -[KM5_F] -Иди же, прикончи этих подонков, и пусть твой позор смоют реки крови врагов!!! - -[KURUMA] -Курума - -[K_JAH] -Радио K-Jah - -[LANDSTK] -Лэндсталкер - -[LANGSL] -ВЫБОР ЯЗЫКА - -[LANGUA] -Язык - -[LAST] -Последнее сообщение. - -[LEGAL] -~g~Разберитесь с преступником! - -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBFабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ - -[LINERUN] -Лайнранер - -[LIPS] -Губки 106 - -[LITTLE] -LITTLE T - -[LITTLEI] -Сент-Марк - -[LM1] -'ДЕВОЧКИ ЛУИДЖИ' - -[LM1_2] -~g~Отвези Мисти в клуб к Луиджи. - -[LM1_3] -~g~Посигналь, чтобы девица подошла к машине. - -[LM1_6] -~g~Вернись в машину! - -[LM1_7] -Остановись рядом с Мисти и подожди, пока она не сядет в тачку. - -[LM1_8] -Ты можешь пойти к Луиджи и получить у него задание, или покататься по городу. - -[LM1_8A] -Чтобы подзаработать немного деньжат, можно 'одолжить' такси... - -[LM1_9] -Привет, я Мисти. - -[LM2] -'ОТВАЛИ ОТ МОИХ ТЕЛОК' - -[LM2_1] -~g~Отгони его тачку в мастерскую для перекраски. - -[LM2_2A] -Нажав на ~h~ ~k~~PED_FIREWEAPON~~w~ ты ~h~ударишь~w~, ~h~пнешь~w~, или ~h~двинешь~w~ битой противника! - -[LM2_2C] -Нажав на ~h~ ~k~~PED_FIREWEAPON~~w~ ты ~h~ударишь~w~, ~h~пнешь~w~, или ~h~двинешь~w~ битой противника! - -[LM2_2D] -Нажав на ~h~ ~k~~PED_FIREWEAPON~~w~ ты ~h~ударишь~w~, ~h~пнешь~w~, или ~h~двинешь~w~ битой противника! - -[LM2_3] -~g~Отгони машину в гараж к Луиджи! - -[LM2_4] -~g~Перекрась машину! - -[LM2_A] -На улицах появился новый наркотик под названием СПАНК. - -[LM2_B] -Иди и впарь ему битой по морде! - -[LM2_C] -Луиджи велел передать тебе... - -[LM2_D] -вот это, держи. - -[LM2_E] -Какой-то умник впаривает эту дрянь моим девкам в Портландской гавани. - -[LM2_F] -Потом возьми его тачку и перекрась ее. - -[LM2_G] -Я требую возмещения морального ущерба! - -[LM3] -'ПРИВЕЗИ МНЕ МИСТИ' - -[LM3_10] -~g~Достань тачку! - -[LM3_11] -~g~Мисти в автобусе не ездит, достань нормальную тачку! - -[LM3_1A] -Нажми ~h~ ~k~~VEHICLE_HORN~~w~, чтобы ~h~посигналить~w~ и вызвать Мисти из дома. - -[LM3_1B] -Нажми ~h~ ~k~~VEHICLE_HORN~~w~, чтобы ~h~посигналить~w~ и вызвать Мисти из дома. - -[LM3_1C] -Нажми ~h~ ~k~~VEHICLE_HORN~~w~, чтобы ~h~посигналить~w~ и вызвать Мисти из дома. - -[LM3_2] -~g~Отвези Мисти к Джоуи. - -[LM3_4] -~g~Отправляйся за Мисти! - -[LM3_5] -Ты работаешь на Луиджи, да? Похоже, он наконец нашел водилу, которому можно доверять! - -[LM3_6] -Джоуи... - -[LM3_6A] -Твоя большая штука опять по мне соскучилась? - -[LM3_7] -Иди, я сейчас, заводная моя. - -[LM3_8] -Хай, я Джоуи. - -[LM3_9] -Луиджи сказал, что ты свой парень, так что заходи как-нибудь, - -[LM3_9A] -может, и у меня будет для тебя работенка. - -[LM3_9B] -Ладно. - -[LM3_A] -Эй, иди сюда, потолкуем... Мик, я с тобой попозже закончу. - -[LM3_B] -Как поживаешь, парень? - -[LM3_C] -Джоуи Леоне, сын дона, хочет поразвлечься со своей девчонкой Мисти. - -[LM3_D] -Сгоняй за ней в Хепберн Хейтс... - -[LM3_E] -но учти, этот район контролируют Дьяволы. - -[LM3_F] -Отвези ее к нему в гараж на Трентоне, да поживее, - -[LM3_G] -Джоуи не из тех, кто привык ждать, так что одна нога здесь... - -[LM3_H] -да, и советую смотреть на дорогу, а не на Мисти! - -[LM4] -'ОСАТАНЕЛЫЙ СУТЕНЕР' - -[LM4_A] -Какой-то урод из Дьяволов поставил своих потаскух работать на моей территории. - -[LM4_B] -Иди, разберись с этим козлом. - -[LM4_C] -Если нужен ствол - возьми его во дворе магазина, который напротив метро. - -[LM5] -'ВЕЧЕРИНКА У КОПОВ' - -[LM5_1] -~g~У тебя телок в тачке, как сельдей в бочке! ~g~Отвези их на вечеринку и приезжай за новыми. - -[LM5_2] -~r~Девка Луиджи теперь похожа на мешок с мясом! - -[LM5_3] -~g~Тебе нужна тачка! - -[LM5_4] -~g~Подбери телок работающих на бульваре Св.Марка. - -[LM5_5] -~g~Отвези девок на вечеринку к копам! - -[LM5_7] -~g~Луиджи хочет, чтобы на ~p~вечеринке у копов~g~ было не менее четырех девок! - -[LM5_8] -~g~Телок на вечеринке: ~1~ - -[LM5_9] -ДЕВОЧЕК: - -[LM5_A] -Копы решили устроить вечеринку в зале старой школы, которая рядом с мостом Каллахан, - -[LM5_B] -и их теперь потянуло на старые школьные забавы. - -[LM5_C] -Но сейчас все мои девки работают на панели. - -[LM5_D] -Привези им побольше моих телок, доставь всем удовольствие. - -[LM5_E] -Привези побольше, пока копы не пропили все свои бабки. - -[LOADCAR] -LOADING VEHICLE... (PRESS L1 TO CANCEL) - -[LOOK_A] -Удерживай кнопку ~h~~k~~VEHICLE_LOOKLEFT~~w~ или ~h~~k~~VEHICLE_LOOKRIGHT~~w~, чтобы посмотреть из машины ~h~налево~w~ или ~h~направо~w~. Если нажать обе, то посмотришь ~h~назад~w~. - -[LOV4_10] -~r~Ты уничтожил единственный способ выяснить, куда делся пакет! - -[LOVE] -ЗАДАНИЯ ДОНАЛЬДА - -[LOVE1] -'СПАСИТЕЛЬ' - -[LOVE1_1] -~g~Чтобы попасть в логово колумбийцев, тебе понадобится одна из их тачек. Возможно, ты ее найдешь в форте Стаунтона. - -[LOVE1_2] -~g~Спасай Старого Азиата. - -[LOVE1_3] -~g~Отвези старого азиата к Дональду Лаву. - -[LOVE1_4] -~g~Старый Азиат должен быть в одном из этих гаражей... - -[LOVE1_5] -~g~Хватит болтаться без дела, достань машину колумбийцев и спаси товарища Дональда. - -[LOVE1_6] -~r~Да... теперь кишки азиата размазаны по всей улице! - -[LOVE1_7] -~g~Через эти ворота пропускают лишь машины колумбийской банды. - -[LOVE1_A] -Во первых, я хочу поблагодарить вас за ту услугу, которую вы мне оказали. - -[LOVE1_B] -Но, жизненный опыт подсказывает мне, что преданность такого человека, как вы, можно купить, - -[LOVE1_C] -У меня есть один очень ценный знакомый - старый азиат. - -[LOVE1_D] -Они пытаются увеличить сумму назначенного ранее выкупа, но я не привык менять условия сделки. - -[LOVE1_E] -Сделка есть сделка, они не получат ни пенса больше. - -[LOVE1_F] -Люди всегда пытаются истолковать все по-своему. - -[LOVE1_G] -Вы должны спасти моего друга любой ценой. - -[LOVE1_H] -в отличие от преданности банды. - -[LOVE1_I] -Его держат в заложниках какие-то южноамериканцы в Аспатрии. - -[LOVE2] -'КОНЕЦ ВАКАГАСИРА!' - -[LOVE2_1] -~g~Отправляйся в форт Стаунтон и достань тачку колумбийцев! - -[LOVE2_2] -~g~Теперь заезжай в ~p~многоэтажный гараж в Ньюпорте~g~ и прихлопни Кенжи! - -[LOVE2_3] -~r~Если ты будешь без машины Картеля, тебя сразу узнают! - -[LOVE2_4] -~r~Якудза узнали тебя! - -[LOVE2_5] -~g~Кенжи теперь похож на бифштекс! Сваливай из Ньюпорта и уничтожь машину! - -[LOVE2_6] -~r~Ты замочил всех свидетелей! - -[LOVE2_7] -~g~Теперь уничтожь машину! - -[LOVE2_8] -~g~Быстрее сваливай из Ньюпорта! - -[LOVE2_A] -Ничто так не сбивает цены на недвижимость, как старая добрая гангстерская война, - -[LOVE2_B] -не считая, конечно, вспышки чумы......но она может доставить куда больше проблем. - -[LOVE2_C] -Я слышал о натянутых отношениях между Якудзой и колумбийцами. - -[LOVE2_D] -Нам стоит погреть руки на их дурацкой вражде. - -[LOVE2_E] -Я хочу чтобы вы прикончили вакагасира, Кенжи Касена. - -[LOVE2_F] -Сейчас у Кенжи деловая встреча на крыше многоэтажного гаража а Ньюпорте. - -[LOVE2_G] -Достаньте машину Картеля и разделайтесь с ним! - -[LOVE2_H] -Якудза решит, что это убийство - дело рук картеля, и объявит войну. - -[LOVE3] -'ГРУЗ В ОКЕАНЕ' - -[LOVE3_1] -~g~Возьми ~r~катер~g~ и следуй за ~y~самолетом~g~! - -[LOVE3_2] -~g~Ты собрал весь груз! Отвези его Дональду Лаву. - -[LOVE3_3] -~g~Самолет сбросил ~1~ из 6 упаковок. - -[LOVE3_4] -~r~Ты уничтожил самолет! - -[LOVE3_5] -~g~Самолет уже рядом. - -[LOVE3_6] -~r~Упаковка досталась полиции! - -[LOVE3_A] -Некоторые ценные товары очень сложно импортировать из-за лицемерия властей. - -[LOVE3_B] -Сегодня ночью один маленький самолетик на подлете к аэродрому откроет свой трюм. - -[LOVE3_C] -Он сбросит в воду несколько ценных упаковок. - -[LOVE3_D] -Постарайтесь опередить полицию и собрать груз первым. - -[LOVE4] -'ВЕЛИКИЙ АЭРОВОР' - -[LOVE4_1] -~r~Картель уже здесь! - -[LOVE4_2] -~g~Посылки нет! Выследи колумбийцев и забери у них груз. - -[LOVE4_3] -~g~Панлантик Констракшн...? - -[LOVE4_4] -~g~Доставь посылку к Дональду Лаву! - -[LOVE4_5] -~g~Посылка должна быть в самолете.... - -[LOVE4_6] -~g~Отправляйся на лифте в башню! - -[LOVE4_7] -~g~На острове Стаунтон есть одна стройка, возможно они повезли груз туда. - -[LOVE4_8] -~g~Без машины ты в гараж не попадешь. - -[LOVE4_9] -~r~Самолет уничтожен! - -[LOVE4_A] -Спасибо, что привезли мне этот груз, но он был всего лишь приманкой. - -[LOVE4_B] -Простите, но ради крупного дела на это приходится идти. - -[LOVE4_C] -По настоящему важный груз до сих пор все еще в самолете. - -[LOVE4_D] -К несчастью, власти аэаропорта все же решили задержать и обыскать самолет, - -[LOVE4_E] -Поезжайте через мост в Шорсайд Вейл и затем в Международный аэропорт Фрэнсис. - -[LOVE4_F] -Деньги властям уже уплачены. - -[LOVE4_G] -Моя посылка ожидает вас в фюзеляже самолета, который стоит в ангаре на таможне. - -[LOVE4_H] -так что мне пришлось заплатить им за издержки. - -[LOVE5] -'ЭСКОРТ' - -[LOVE5_1] -~g~Поехали! - -[LOVE5_2] -~g~Тебе нужна тачка! - -[LOVE5_3] -~g~Езжай вперед и посмотри, что там в конце тоннеля! - -[LOVE5_4] -~r~Защищай грузовик! - -[LOVE5_5] -~r~Ты не сумел защитить грузовик! - -[LOVE5_A] -На вас можно положиться, друг мой. Что ни говори, а это сейчас большая редкость. - -[LOVE5_B] -Мой азиатский друг повезет доставленный вами товар по назначению, но ему потребуется эскорт. - -[LOVE5_C] -Я бы хотел, чтобы вы помогли ему в целости и сохранности доставить этот груз в Пайк Крик - -[LOVE6] -'ПРИМАНКА' - -[LOVE6_1] -~g~Теперь уводи копов подальше от склада! - -[LOVE6_2] -~r~Тебе не удалось увести полицию на достаточное расстояние! - -[LOVE6_3] -У тебя ~1~ секунд, чтобы вернуться к инкассаторской машине, иначе задание будет провалено. - -[LOVE6_4] -~r~Ты разбил приманку для копов! - -[LOVE6_A] -Урок бизнеса, мой друг. - -[LOVE6_B] -даже если она вообще не представляет его истинной ценности. - -[LOVE6_C] -Полиция оцепила весь район, в котором сейчас находится мой друг с грузом. - -[LOVE6_D] -Отправляйтесь туда и используйте фургон как приманку для копов. - -[LOVE6_E] -Если у вас есть особый товар, то каждая собака будет пытаться его у вас отнять... - -[LOVE6_F] -Пусть они за вами погоняются, а он тем временем уйдет. - -[LOVE7] -ИСЧЕЗНОВЕНИЕ ЛАВА - -[LOVEGO] -~g~У Дональда Лава возникли неотложные дела. Заходи попозже! - -[LRQC_1] -Нам с Асукой нужно кое-что обсудить, - -[LRQC_2] -а ты пока можешь тут осмотреться. - -[LRQC_3] -Тебе нужно место, где бы ты мог залечь. - -[LRQC_4] -На углу Бельвилля есть склад, в котором есть все, что тебе нужно. - -[LRQC_5] -Приходи ко мне сюда, когда будешь готов, - -[LRQC_6] -и я обсужу с тобой кое-какие дела. - -[LUIGGO] -~g~Луиджи осматривает новых девочек. Загляни попозже! - -[LUIGI] -ЗАДАНИЯ ЛУИДЖИ - -[LUIGIS] -Жилище Луиджи - -[L_TRN_1] -Ты можешь попасть в другой район Портланда, воспользовавшись метро. Нажми~h~ ~k~~VEHICLE_ENTER_EXIT~~w~, чтобы ~h~сесть~w~ или ~h~выйти~w~ из поезда. - -[L_TRN_2] -Ты можешь попасть в другой район Портланда, воспользовавшись метро. Нажми~h~ ~k~~VEHICLE_ENTER_EXIT~~w~, чтобы ~h~сесть~w~ или ~h~выйти~w~ из поезда. - -[MAFIACR] -Сентинел Мафии - -[MANANA] -Манана - -[MAR] -Мар - -[MAY] -Май - -[MCDNSP] -There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO) - -[MCGNSP] -There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO) - -[MCLOAD] -Loading Data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console. - -[MCSTNS] -There is no Memory Card (PS2) in MEMORY CARD slot 1. Do you wish to start? (YES or NO) - -[MC_LDFL] -Загрузка не прошла! - -[MC_NWRE] -Идет перезапуск игры. - -[MEA1] -'МОШЕННИК' - -[MEA1_1] -~r~Управляющий банка мертв! - -[MEA1_2] -~r~Тебе же сказали уничтожить машину! - -[MEA1_3] -~g~Выбирайся из машины! - -[MEA1_4] -~r~Ты проехал мимо управляющего банка! - -[MEA1_B] -Я Чонкс, Марти Чонкс. - -[MEA1_B3] -~g~Езжай и встреть управляющего банка. - -[MEA1_B4] -А, тебя послал мистер Чонкс. Ну поехали, нанесем ему визит. - -[MEA1_B5] -TEXT NO LONGER NEEDED - -[MEA1_B6] -~g~Отгони машину в утилизатор, чтобы избавиться от улик. Выйди из машины и ее подцепит кран. - -[MEA1_C] -Я тут на углу построил заводик по производству корма для кошек и собак. - -[MEA1_D] -У меня возникли проблемы с финансами, но у кого их не бывает? - -[MEA1_E] -Я собирался встретиться с управляющим из банка. - -[MEA1_F] -Этот мерзкий мошенник решил поживиться за мой счет, и поднял процент займа. - -[MEA1_G] -Возьми мою тачку, встреть его и привези сюда. - -[MEA1_H] -Я приготовил небольшой сюрприз для этого кровопийцы! - -[MEA2] -'КРАЖА' - -[MEA2_1] -~r~Тебе же сказали уничтожить тачку! - -[MEA2_2] -~r~Вор мертв! - -[MEA2_3] -~g~Отгони машину назад на фабрику. - -[MEA2_4] -~r~Ты проехал мимо вора! - -[MEA2_A] -Я нанял воров, чтобы они забрались в мой офис... - -[MEA2_B] -и кое-что вынесли. А я бы потом смог потребовать страховку. - -[MEA2_B3] -~g~Езжай, встреть воров. - -[MEA2_B4] -~g~Отвези их к фабрике по производству корма. - -[MEA2_B5] -TEXT NO LONGER NEEDED - -[MEA2_B6] -~g~Перекрась машину, чтобы избавиться от улик. - -[MEA2_C] -Но эти ублюдки теперь угрожают тем, что расскажут все страховой компании, - -[MEA2_D] -если я с ними не поделюсь. - -[MEA2_E] -Нет, ты представляешь? - -[MEA2_F] -За воротами фабрики я поставил машину. - -[MEA2_G] -Возьми ее и сгоняй за ними. Они тусуются где-то в квартале красных фонарей. - -[MEA2_H] -Привези их ко мне на фабрику и я покажу им кузькину мать. - -[MEA3] -'ЖЕНА' - -[MEA3_1] -~r~Жена мертва! - -[MEA3_2] -~r~Ты должен был утопить тачку! - -[MEA3_3] -~r~Ты проехал мимо его жены! - -[MEA3_A] -Чтобы продолжить свой бизнес, мне нужно как быстрее решить финансовые проблемы. - -[MEA3_B] -У моей жены хорошая страховка жизни, и к тому же она постоянно транжирит мои деньги. - -[MEA3_B3] -~g~Езжай и подбери миссис Чонкс. - -[MEA3_B4] -Марти хочет меня видеть? Давай быстрее, а то мне нужно еще успеть в парикмахерскую. - -[MEA3_B5] -TEXT NO LONGER NEEDED - -[MEA3_B6] -~g~Чтобы избавиться от улик, утопи тачку. - -[MEA3_C] -Я поставил машину в обычном месте. - -[MEA3_D] -Забери мою жену из маникюрного салона и привези ко мне на фабрику. - -[MEA4] -'ЛЮБОВНИК' - -[MEA4_1] -~r~Карлос мертв! - -[MEA4_2] -~r~Марти Чонкс мертв! - -[MEA4_3] -~r~Ты проехал мимо Карлоса! - -[MEA4_A] -Проклятье, у меня проблемы! - -[MEA4_B] -Оказалось, что моя жена спала с тем, кому я задолжал. - -[MEA4_B3] -~g~Подбери любовника жены Чонкса. - -[MEA4_B4] -Тебя послал Марти, да? Я объясню этой мерзкой крысе, что такое настоящий бизнес. - -[MEA4_B5] -Карл, привет! Мне эээ... нужно время, чтобы отдать долг. - -[MEA4_B6] -Нет, Марти, прошло и так много времени. У тебя был шанс, а теперь я забираю эту фабрику... - -[MEA4_B7] -Ну ты хоть ко мне в офис зайди... - -[MEA4_C] -Он очень зол и требует, чтобы я вернул ему деньги! - -[MEA4_D] -Мне нужно с ним поговорить... - -[MEA4_E] -он думает, что я отдам ему долг... - -[MEA4_F] -но я решил... - -[MEA4_G] -что в этом месяце городских дворняг ждет новое блюдо! - -[MEAT1_A] -Друзья посоветовали мне обратиться к тебе, чтобы решить все мои проблемы. Если ты согласен, подойди к телефону в Трентоне. - -[MED_WST] -Убито медиков - -[MEMTST] -MemoryCardTest screen - -[MGSVCN] -MagazineDirectory Created - -[MGSVNC] -MagazineDirectory Not Created - -[MISTY1] -~r~Мисти теперь лучше везти в морг! - -[MMRAIN] -Количество выпавших осадков (мм) - -[MM_1] -'ГОНКА ПО ГАРАЖУ' - -[MM_1_A] -~g~У тебя ~y~2 минуты~g~, чтобы проехать ~y~20 контрольных пунктов~g~ в высотном гараже! ~g~Ты можешь проезжать их ~y~В ЛЮБОМ ПОРЯДКЕ~g~. - -[MM_1_B] -~1~ из 20! - -[MM_1_C] -~g~У тебя 20 секунд, после прохождения каждого контрольного пункта тебе будут добавлять по ~y~5 секунд~g~. ~g~Время ~y~УЖЕ~g~ пошло. - -[MONTAX] -Денег заработано на такси - -[MOONBM] -Лунный луч - -[MRWONGS] -М-р.Вонг - -[MSX_FM] -MSX FM - -[MULE] -Тягач - -[MUSMEN] -Музыка/Звуки - -[MUSVOL] -Громкость музыки - -[MXCARD] -Длина лучшего БЕЗУМНОГО прыжка (ft) - -[MXCARDM] -Длина лучшего БЕЗУМНОГО прыжка (м) - -[MXCARJ] -Высота лучшего БЕЗУМНОГО прыжка (ft) - -[MXCARJM] -Высота лучшего БЕЗУМНОГО прыжка (м) - -[MXFLIP] -Переворотов в лучшем БЕЗУМНОМ прыжке - -[MXJUMP] -Разворот в лучшем БЕЗУМНОМ прыжке - -[M_FAIL] -ЗАДАНИЕ ПРОВАЛЕНО! - -[M_PASS] -ЗАДАНИЕ ВЫПОЛНЕНО! $~1~ - -[M_WASTE] -Мужчин убито - -[NEW_TAX] -БОЛЬШЕ! БЫСТРЕЕ! ЛУЧШЕ! В Харвуде открылся новый таксопарк Борнини. Звоните 555-БОРНИНИ! - -[NICK] -НИК ЛАВ - -[NMISON] -Заданий начато - -[NMMISP] -Заданий завершено - -[NO] -Нет - -[NOCD] -CD-привод пуст. Пожалуйста, вставьте диск. - -[NOCONT] -Please reconnect an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). to controller port 1 to continue - -[NOCONTE] -Please re-insert the analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2) in controller port 1 to continue - -[NODOORS] -~g~Они все туда не влезут! Достань тачку попросторней! - -[NOGMSV] -Записаться можно лишь в твоем гараже. - -[NOMONEY] -~g~У тебя не хватает денег! - -[NOSTUC] -Не выполнено ни одного БЕЗУМНОГО трюка - -[NOUNGM] -Всего уникальных прыжков - -[NOUNIF] -Выполнено уникальных прыжков - -[NOV] -Ноя - -[NO_PAUZ] -При игре по сети пауза не работает. Чтобы выйти нажми ESC дважды! - -[NO_PCCD] -Пожалуйста, вставьте второй диск игры GTA3 в CDROM привод, или нажмите ESC для выхода из игры. - -[NRECORD] -~r~РЕКОРД НЕ ПОБИТ! - -[NUMBER] -~1~ - -[OCT] -Окт - -[OPENCD] -CRDOM-привод открыт. Пожалуйста, закройте CDROM-привод. - -[OUTTIME] -~r~Очень медленно, друг, очень медленно! - -[OUT_VEH] -~g~Выйди из тачки! - -[O_FAIL] -ДОПОЛНИТЕЛЬНОЕ ЗАДАНИЕ ПРОВАЛЕНО! - -[O_PASS] -ДОПОЛНИТЕЛЬНОЕ ЗАДАНИЕ ВЫПОЛНЕНО! - -[PAGEB1] -В убежище доставлен пистолет - -[PAGEB10] -В убежище доставлена ракетница - -[PAGEB11] -В убежище доставлен огнемет - -[PAGEB12] -В убежище доставлена взятка для полиции - -[PAGEB13] -В убежище доставлено лекарство - -[PAGEB14] -В убежище доставлен адреналин - -[PAGEB2] -В убежище доставлен 'Узи' - -[PAGEB3] -В убежище доставлена броня - -[PAGEB4] -В убежище доставлен дробовик - -[PAGEB5] -В убежище доставлены гранаты - -[PAGEB6] -В убежище доставлены коктейли Молотова - -[PAGEB7] -В убежище доставлен AK-47 - -[PAGEB8] -В убежище доставлена снайперская винтовка - -[PAGEB9] -В убежище доставлена винтовка M16 - -[PAGE_00] -. - -[PAGE_01] -Убей ~1~ Дьяволов за 120 секунд! - -[PAGE_02] -Уничтожь ~1~ машин за 120 секунд! - -[PAGE_03] -Убей ~1~ мафиози за 120 секунд! - -[PAGE_04] -Убей ~1~ триадовцев за 120 секунд! - -[PAGE_05] -Убей ~1~ триадовцев за 120 секунд! - -[PAGE_06] -Уничтожь ~1~ машин за 120 секунд! - -[PAGE_07] -Расколи ~1~ голов Ярди за 120 секунд! - -[PAGE_08] -Сожги ~1~ членов Якудзы за 120 секунд! - -[PAGE_09] -Уничтож ~1~ машин за 120 секунд! - -[PAGE_10] -Уничтожь ~1~ машин за 120 секунд! - -[PAGE_11] -Истреби ~1~ Ярди за 120 секунд! - -[PAGE_12] -Подожги ~1~ членов Якудзы за 120 секунд! - -[PAGE_13] -Взорви ~1~ Ярди за 120 секунд! - -[PAGE_14] -Поджарь ~1~ колумбийцев за 120 секунд! - -[PAGE_15] -Задави ~1~ Капюшонов за 120 секунд! - -[PAGE_16] -Уничтожь ~1~ машин за 120 секунд! - -[PAGE_17] -Задави ~1~ колумбийцев за 120 секунд! - -[PAGE_18] -Уничтожь ~1~ машин за 120 секунд! - -[PAGE_19] -Лиши голов ~1~ колумбийцев за 120 секунд! - -[PAGE_20] -Обезглавь ~1~ Капюшонов за 120 секунд! - -[PANCAK] -РАСПЛЮЩИЛ! - -[PANLANT] -Панлантик - -[PAPER1] -* - -[PAPER2] -* - -[PAPER3] -* - -[PARK] -Парк Бельвиль - -[PARSHP] -Parse Heap - -[PASDRO] -Потеряно пассажиров - -[PATRIOT] -Пэтриот - -[PAUSED] -ИГРА ОСТАНОВЛЕНА - -[PBOAT_1] -Чтобы выстрелить из орудия катера нажми ~h~~k~~PED_FIREWEAPON~~w~. - -[PBOAT_2] -Чтобы выстрелить из орудия катера нажми ~h~~k~~PED_FIREWEAPON~~w~. - -[PCLOAD] -Loading File Data - -[PCRESRT] -Перезапуск Grand Theft Auto III - -[PDRGON] -ShowPedRoadGroups On - -[PEREN] -Многолетник - -[PERPIC] -Найдено особых пакетов - -[PER_COM] -Процент завершения игры - -[PE_WAST] -Убито вами людей - -[PE_WSOT] -Убито преступниками людей - -[PIG_WST] -Убито копов - -[PL_STAT] -ДАННЫЕ ОБ ИГРОКЕ - -[POLICAR] -Полицейская - -[PONY] -Пони - -[PORT_E] -Порт Портланда - -[PORT_I] -Трентон - -[PORT_S] -Пристань Атлантик - -[PORT_W] -Мыс Каллахан - -[PQUINS] -Идеальный четверной безумный трюк - -[PREBRF] -Предыдущие сообщения - -[PREDATR] -Хищник - -[PRGOFF] -ShowPedRoadGroups Off - -[PRINST] -Идеальный безумный трюк - -[PROJECT] -Сады Вичита - -[PRTRST] -Идеальный тройной безумный трюк - -[PRVMEN] -Задание предыдущей миссии - -[PUSAVE] -Save Only the game - -[PU_MONY] -Не хватает денег. - -[QUINST] -Четверной безумный трюк - -[QUITOP] -Quit Options - -[RADIO_A] -Нажимай ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ ~w~, чтобы менять ~h~ радиоволну. - -[RADIO_B] -Нажимай ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ ~w~, чтобы менять ~h~ радиоволну. - -[RADIO_C] -Нажимай ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ ~w~, чтобы менять ~h~ радиоволну. - -[RADIO_D] -Нажимай ~h~~k~~VEHICLE_CHANGE_RADIO_STATION~ ~w~, чтобы менять ~h~ радиоволну. - -[RAMPAGE] -СХВАТКА!! - -[RAMP_A] -ВСЕ СХВАТКИ ПРОЙДЕНЫ! - -[RAMP_F] -СХВАТКА ПРОИГРАНА - -[RAMP_P] -СХВАТКА ВЫИГРАНА! - -[RATNG1] -Воришка - -[RATNG10] -Чистильщик - -[RATNG11] -Профессионал - -[RATNG12] -Киллер - -[RATNG13] -Правая рука - -[RATNG14] -Главарь - -[RATNG15] -Босс - -[RATNG2] -Мошенник - -[RATNG3] -Хулиган - -[RATNG4] -Шестерка - -[RATNG5] -Грабитель - -[RATNG6] -Громила - -[RATNG7] -Бандит - -[RATNG8] -Головорез - -[RATNG9] -Братан - -[RAY] -ЗАДАНИЯ РЭЯ - -[RAYGO] -~g~Рэй пошел в другой туалет. Зайди сюда попозже! - -[RC1] -'ДРАКА С ДЬЯВОЛАМИ' - -[RC2] -'МОРДОБОЙ С МАФИЕЙ' - -[RC3] -'КАТАСТРОФА В КАЗИНО' - -[RC4] -'РАЗБОРКА С РАСТАМАНАМИ' - -[RCBANDT] -Багги Бандит - -[RCHELP] -Чтобы подорвать машинку, нажми ~k~~PED_FIREWEAPON~, или врежься в колесо жертвы. - -[RCHELPA] -Чтобы подорвать машинку, нажми ~k~~PED_FIREWEAPON~, или врежься в колесо жертвы. - -[RC_1] -У тебя 2 минуты, чтобы подорвать как можно больше машин Дьяволов! - -[RC_2] -У тебя 2 минуты, чтобы подорвать как можно больше машин мафии! - -[RC_3] -У тебя 2 минуты, чтобы подорвать как можно больше машин Якудзы! - -[RC_4] -У тебя 2 минуты, чтобы подорвать как можно больше машин Ярди! - -[RC_5] -У тебя 2 минуты, чтобы подорвать как можно больше машин Капюшонов! - -[RC_6] -У тебя 2 минуты, чтобы подорвать как можно больше машин Картеля! - -[RECORD] -~g~НОВЫЙ РЕКОРД!! - -[REDLIGH] -Квартал красных фонарей - -[REEFER] -Рифер - -[REGCAR] -Register MemoryCard One - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[REPLAY] -ПОВТОР - -[RESTART] -Новая игра - -[REWARD] -НАГРАДА $~1~ - -[RHINO] -Носорог - -[RISE] -Rise FM - -[RM1] -'КОНЕЦ СТУКАЧА' - -[RM1_1] -~g~Осмотри дом защиты свидетелей. - -[RM1_2] -~g~Прикончи МакАффри! - -[RM1_3] -~r~МакАффри скрылся! - -[RM1_4] -~g~Ты использовал все гранаты! Иди купи в магазине еще! - -[RM1_5] -~g~Вернись и подожги дом! - -[RM1_A] -Этот подонок МакАффри брал взяток больше, чем кто-либо. - -[RM1_B] -Он решил всех заложить, и таким образом оправдать все свои темные делишки. - -[RM1_C] -Хренов стукач! - -[RM1_D] -Он в центре Ньюпорта под вооруженной охраной в здании защиты свидетелей, которое позади стоянки. - -[RM1_E] -Чтобы выкурить его наружу - подожги этот дом, ну а потом, я думаю, ты сможешь заставить его замолчать. - -[RM2] -'РУКА ПОМОЩИ' - -[RM2_A] -Мой старый армейский друг организовал бизнес в Рокфорде. - -[RM2_A1] -Эй, парень, сюда! - -[RM2_B] -Мы с ним были в Никарагуа в те годы, когда правительство знало, что делает. Ну так вот. - -[RM2_C] -Его вчера избили какие-то сволочи из Картеля, и сказали что сегодня заберут кое-что из его товара. - -[RM2_D] -Ему нужно помочь. Ну, а он в долгу тоже не останется - даст тебе затовариться 'скобяными изделиями'. - -[RM2_D1] -Я бы, конечно, и сам помог ему, но старость не радость - кхе кхе - вот, в-общем, удачи тебе. - -[RM2_E] -Рэй мне звонил... но я думал, он пришлет побольше народу. - -[RM2_E1] -Я не могу поверить, что эти трусливые ублюдки снова оставили меня без прикрытия! - -[RM2_F] -Ну, три руки лучше чем одна, так что бери все, что тебе пригодится. - -[RM2_F1] -Колумбийцы прибудут с минуты на минуту! - -[RM2_G] -~g~Проверь, как дела у Фила! - -[RM2_H] -~r~Фила убили! - -[RM2_K] -Проклятье, вот они! ПОЛУЧАЙТЕ! - -[RM2_L] -Эй! Если бы ты тогда был в Никарагуа, глядишь, я и не потерял бы руку! - -[RM2_M] -Если тебе понадобится оружие, то не стесняйся, бери все что нужно из ящиков. - -[RM2_N] -Только не забудь заплатить. А сейчас сваливай, с копами я все улажу. - -[RM3] -'УНИЧТОЖЕНИЕ УЛИК' - -[RM3_1] -~g~Оставь улики в машине и подожги ее. - -[RM3_4] -~g~Обвинение лишилось улик! - -[RM3_5] -~g~У тебя ~1~ из 6 пакетов с уликами. - -[RM3_6] -~r~Фотографии разлетятся по всему городу! - -[RM3_7] -~g~Теперь поджигай тачку! - -[RM3_8] -~r~Эта тачка была приманкой! - -[RM3_A] -Я знаю одного очень важного человека в городе, - -[RM3_B] -Против него выдвинуто обвинение. Есть какие-то непристойные фотки, где его сняли - -[RM3_C] -на вечеринке в морге или еще где. - -[RM3_D] -Улики скоро собираются везти в суд. - -[RM3_E] -Тебе нужно протаранить машину с уликами и собрать все до одной выпавшие фотографии. - -[RM3_F] -Как только соберешь все улики - оставь их в машине и взорви ее. - -[RM3_G] -Если ты это провернешь, то все будут в плюсе. - -[RM3_H] -с довольно экзотическим вкусом и деньгами для его удовлетворения. - -[RM4] -'РЫБАЛКА' - -[RM4_1] -~g~Тебе нужно угнать полицейский катер. - -[RM4_2] -~g~Отправляйся к маяку и пусти напарника Рэя на корм рыбам! - -[RM4_3] -~r~Партнер Рэя скрылся! - -[RM4_A] -Думаю, мой напарник - стукач. - -[RM4_B] -Нужно побыстрее заткнуть ему пасть. - -[RM4_C] -На своем катере он вечерами ходит рыбачить к маяку на утесе Портланда. - -[RM4_D] -Возьми полицейский катер и разберись с этим чертовым стукачем! - -[RM4_E] -Хватит ему рыбу ловить. Пусть он ее теперь покормит. - -[RM5] -'ЖИВАЯ МУМИЯ' - -[RM5_1] -~g~Перехвати скорую. - -[RM5_2] -~g~Тебя засекли! - -[RM5_3] -~g~Это была приманка! - -[RM5_4] -~g~Пули эту загипсованную куклу не берут! - -[RM5_5] -~g~Этой загипсованной кукле огнемет не страшен! - -[RM5_6] -~g~Он вывалился! Раскатай его по асфальту, или взорви гранатами! - -[RM5_7] -~r~Свидетеля доставили на место! - -[RM5_8] -~g~Свидетеля больше нет! - -[RM5_A] -Ты никчемный ублюдок! - -[RM5_A1] -Ты все завалил! Я уже на крючке, а ты даже не смог поджарить этого хренова шпиона. - -[RM5_B] -Я же тебе хорошо заплатил за то, чтобы ты убрал этого стукача! - -[RM5_B1] -Сегодня этот урод собирается давать показания! - -[RM5_C] -Его с минуты на минуту собираются перевезти из госпиталя Карсон в участок Рокфорда. - -[RM5_D] -Если он заговорит, мне конец... - -[RM5_E] -так что иди, и доделывай свою работу! - -[RM6] -'НА МУШКЕ' - -[RM6_1] -Вот тебе ключ от тайника. - -[RM6_2] -В нем я на черный день припрятал наличные и кое какие полезные вещички. - -[RM6_3] -Увидимся. - -[RM6_4] -~g~Отправляйся к тайнику и забери вещички Рэя. - -[RM6_5] -~g~Мост под наблюдением ЦРУ. Тебе придется найти другой путь. - -[RM6_6] -~r~Рэй мертв! - -[RM6_666] -Возьми мой пуленепробиваемый Пэтриот. Увидимся в Майами, Рэй - -[RM6_7] -~r~Рэй опоздал на самолет. - -[RM6_8] -~g~Ты проехал мимо Рэя, вернись и посади его. - -[RM6_A] -За тобой хвоста нет? Хорошо. - -[RM6_B] -Похоже, я прыгнул выше головы и перешел кое-кому дорогу! - -[RM6_C] -Я так понял, что ЦРУ имеет долю от продажи СПАНКА - -[RM6_C1] -и они убирают тех, кто мешает Картелю работать. - -[RM6_D] -Я у них на мушке, мне нужно быстрее сваливать. - -[RM6_E] -Мой самолет вот-вот отлетает, гони в аэропорт, я хорошо заплачу! - -[ROADBR1] -Мост Каллахан - -[ROADBR2] -Мост Каллахан - -[RUMPO] -Рампо - -[SAVE1] -Чтобы ~h~сохранить игру~w~ - пройди в дверь. Во время задания записаться нельзя. - -[SAVE2] -Если в гараже оставить машину, то она будет сохранена при записи игры. - -[SCASSL] -Sick Fuck Selected - -[SCORE] -$~1~ - -[SCRFOR] -Screen format - -[SCROPT] -НАСТРОЙКИ ЭКРАНА - -[SCSCSL] -Sick Fucker Selected - -[SECOND] -~g~второй - -[SECURI] -Инкассатор - -[SENTINL] -Сентинел - -[SEP] -Сен - -[SET1] -SetUp 1. - -[SET1EN] -SetUp 1. Enabled - -[SET2] -SetUp 2 - -[SET2EN] -SetUp 2. Enabled - -[SET3] -SetUp 3 - -[SET3EN] -SetUp 3. Enabled - -[SET4] -SetUp 4 - -[SET4EN] -SetUp 4. Enabled - -[SFXVOL] -Громкость звуков - -[SHOPING] -Бедфорд Поинт - -[SHPLOF] -gbShowCollisionPolys Off - -[SHPLON] -gbShowCollisionPolys On - -[SICASS] -Sick Fuck - -[SICSIC] -Sick Fucker - -[SIREN_1] -Чтобы включить сирену, понажимай кнопку ~h~~k~~VEHICLE_HORN~~w~. - -[SIREN_2] -Чтобы включить сирену, понажимай кнопку ~h~~k~~VEHICLE_HORN~~w~. - -[SIREN_3] -Чтобы включить сирену, понажимай кнопку ~h~~k~~VEHICLE_HORN~~w~. - -[SIREN_4] -Чтобы включить сирену, понажимай кнопку ~h~~k~~VEHICLE_HORN~~w~. - -[SLNSP] -Insufficient space to save. Please insert a Memory Card (PS2) with at least 200KB of free space available into MEMORY CARD slot 1. - -[SLONDR] -Insufficient space to save. Please insert a Memory Card (PS2) with at least 500KB of free space available into MEMORY CARD slot 1. - -[SLONFM] -Error formatting Memory Card (PS2) in MEMORY CARD slot 1. - -[SLONNF] -Memory Card (PS2) in MEMORY CARD slot 1 is unformatted. - -[SLONNO] -No Memory Card (PS2) in MEMORY CARD slot 1. - -[SOAKED] -ЧЕРТ! - -[SOUND] -ЗВУК - -[SPAIN] -Spanish - -[SPEEDER] -Speeder - -[SPLAT] -ГОТОВ! - -[SPOTTED] -~r~Они у тебя на хвосте! - -[SPRAY] -В мастерской твою тачку ~h~отремонтируют~w~ и ~h~перекрасят~w~. Копы тебя больше ~h~не узнают~w~. Стоимость - ~h~$1000~w~. - -[SPRAY1] -В мастерской твою тачку ~h~отремонтируют~w~ и ~h~перекрасят~w~. Копы тебя больше ~h~не узнают~w~. Стоимость - ~h~$1000~w~. Первый раз это бесплатно. - -[SPRAY_1] -Чтобы включить брандспойт, нажми на ~h~~k~~PED_FIREWEAPON~~w~. - -[SPRAY_4] -Чтобы включить брандспойт, нажми на ~h~~k~~PED_FIREWEAPON~~w~. - -[STADIUM] -Аспатрия - -[STALION] -Жеребец - -[STANDS] -ЛАРЬКОВ РАЗБИТО: - -[STASH] -~g~Отвези СПАНК на ~p~стройку~g~! - -[STINGER] -Стингер - -[STOCK] -отсутствует - -[STRETCH] -Стретч - -[SUBWAY1] -Станция Портланд - -[SUBWAY2] -Станция Рокфорд - -[SUBWAY3] -Станция Южный Стаунтон - -[SUBWAY4] -Вокзал Шорсайд - -[SUB_IND] -Пайк Крик - -[SUB_ZO2] -Шорсайд Вейл - -[SUB_ZO3] -Шорсайд Вейл - -[SUB_ZON] -Шорсайд Вейл - -[SVCONF] -ПОДТВЕРДИТЕ ЗАПИСЬ - -[SVGMON] -SaveTheGame - -[SWANKS] -Кедровая роща - -[S_PROM2] -Если в этот гараж поставить машину, то она будет сохранена при записи игры. - -[S_PROMP] -Когда ты не на задании, то здесь можно ~h~сохранить игру~w~, но это добавит ко времени шесть часов. - -[S_TRN_1] -Воспользовавшись метро, ты можешь попасть в другой район города. Нажми~h~ ~k~~VEHICLE_ENTER_EXIT~~w~ чтобы ~h~сесть~w~ или ~h~выйти~w~ из поезда. - -[S_TRN_2] -Воспользовавшись метро, ты можешь попасть в другой район города. Нажми~h~ ~k~~VEHICLE_ENTER_EXIT~~w~ чтобы ~h~сесть~w~ или ~h~выйти~w~ из поезда. - -[S_VIEW] -Портланд Вью - -[T4X4_1] -'ПЭТРИОТ РАЛЛИ' - -[T4X4_1A] -~g~У тебя ~y~5 минут~g~ чтобы пройти ~y~15 контрольных пунктов~g~. Ты можешь их проходить в ~y~ЛЮБОМ~g~ порядке. - -[T4X4_1B] -~1~ из 15! - -[T4X4_1C] -~g~Отсчет времени пойдет, как только ты ~y~ПРОЕДЕШЬ~g~ через первый контрольный пункт. После прохождения каждой точки тебе будет добавляться ~y~20 секунд~g~. - -[T4X4_2] -'ГОНКА В ПАРКЕ' - -[T4X4_2A] -~g~У тебя ~y~5 минут~g~ чтобы пройти ~y~12 контрольных пунктов~g~. Ты можешь их проходить в ~y~ЛЮБОМ~g~ порядке. - -[T4X4_2B] -~1~ из 12! - -[T4X4_2C] -~g~Отсчет времени пойдет, как только ты ~y~ПРОЕДЕШЬ~g~ через первый контрольный пункт. После прохождения каждой точке тебе будет добавляться ~y~10 секунд~g~. - -[T4X4_3] -'ЖАРКАЯ ГОНКА' - -[T4X4_3A] -~g~У тебя ~y~5 минут~g~, чтобы пройти ~y~20 контрольных пунктов~g~. Ты можешь их проходить в ~y~ЛЮБОМ~g~ порядке. - -[T4X4_3B] -~g~Отсчет времени пойдет, как только ты ~y~ПРОЕДЕШЬ~g~ через первый контрольный пункт. После прохождения каждой точки тебе будет добавляться ~y~15 секунд~g~. - -[T4X4_3C] -~1~ из 20! - -[T4X4_F] -~r~Ты не успел! Слишком сложно для тебя?! - -[TAXI] -Такси - -[TAXI1] -~g~Ищи пассажира. - -[TAXI2] -~r~Ты не успел вовремя! - -[TAXI3] -~r~Твой пассажир бежал в ужасе! - -[TAXI4] -Пассажир доставлен! - -[TAXI5] -ПРИЗ ЗА СКОРОСТЬ! - -[TAXI6] -Задание такси окончено - -[TAXI7] -~r~Такси слишком помято, отремонтируй его. - -[TAXIH1] -Остановись рядом с указанным пешеходом, подожди, пока он не сядет в такси и за указанное время отвези его куда он хочет. - -[TAXI_M] -'ВОДИТЕЛЬ ТАКСИ' - -[TEFONE] -Test Format MemCard One - -[TEUFON] -Test UnFormat MemCard One - -[TEXTXYZ] -Writing coordinates to file... - -[THIRD] -~g~третий - -[TIMER] -Это задание на время, ты должен успеть его выполнить, пока тикает таймер. - -[TM1] -'БОЛЬШАЯ СТИРКА' - -[TM1_A] -~w~Присаживайся, малыш, давай присаживайся. - -[TM1_B] -~w~Итак, прачечная не хочет платить за защиту? - -[TM1_C] -~w~Триадовцы думают, что могут тягаться со мной? - -[TM1_D] -~w~Давай-ка покажем этим 'крутым парням', что значит быть действительно крутым. - -[TM1_E] -~w~Да, преподай им урок. Еще никто из нас не отступал перед Триадой. - -[TM1_F] -~w~Твой отец, упокой господь его душу, не цацкался с ними на Сицилии. - -[TM1_G] -~w~Извини Ма. Да, Ма. - -[TM1_H] -~w~Я хочу чтобы ты взорвал все фургоны прачечной - -[TM1_I] -~w~и прикончил Триадовцев, что встанут у тебя на пути. - -[TM1_J] -~w~Все, что для этого нужно, ты можешь взять у Лысого. - -[TM2] -'МЗДА' - -[TM2_1] -~g~Отвези деньги Тони! - -[TM2_2] -~g~Ты загасил их всех! - -[TM2_3] -~g~Это ловушка! Прикончи их! - -[TM2_A] -~w~Тони пошел на очередное дело. - -[TM2_AA] -~w~Он никогда не станет таким авторитетом, как отец. Вон тебе записка. - -[TM2_B] -~w~Прачечная согласна платить - ты все сделал как нужно! - -[TM2_C] -~w~Иди, забери деньги и принеси их мне. Но остерегайся триадовцев. - -[TM2_D] -~w~Они решили поджарить твою задницу, но не бери это в голову, сынок. - -[TM2_E] -~w~Никто, повторяю, никто не связывается с ТОНИ СИПРИАНИ! - -[TM3] -'СОБРАНИЕ СЕМЬИ САЛЬВАТОРЕ' - -[TM3_1] -~g~Возьми у Джоуи Стретч. - -[TM3_2] -~g~Теперь езжай за Луиджи. - -[TM3_3] -~g~Теперь забери Тони. - -[TM3_4] -~g~Отвези приятелей в особняк Сальваторе. - -[TM3_5] -~y~Это засада Триады! - -[TM3_A] -~w~Дон Сальваторе решил нас всех собрать - -[TM3_A1] -~r~Джоуи поджарился! - -[TM3_A2] -~r~Джоуи и Луиджи кремированы! - -[TM3_A3] -~r~Джоуи, Тони и Луиджи спеклись! - -[TM3_B] -~w~Нужно заехать к Джоуи, и забрать лимузин и его самого из гаража. - -[TM3_C] -~w~Затем отправишься в клуб за Луиджи, и потом заедешь за мной, - -[TM3_D] -~w~Сегодня нам всем босс назначил встречу у него в особняке. - -[TM3_E] -~w~Эти Триадовцы должны знать свое место. - -[TM3_F] -~w~Им нужна война, они ее получат. - -[TM3_G] -~w~Давай, отправляйся. - -[TM3_H] -~w~Ты молодец, парень, просто молодец. - -[TM3_I] -~w~Пошли, познакомлю тебя с доном. - -[TM3_J] -~w~Эээй! Луиджи! - -[TM3_K] -~w~О, Сальваторе, мои девочки по тебе уже соскучились, тебя так долго не было. - -[TM3_L] -~w~Передай им, что как только мы закончим это небольшое дельце, - -[TM3_M] -~w~то отправимся в клуб и отпразднуем, хорошо? - -[TM3_MA] -~w~Да не знаю я, где он! - -[TM3_MB] -~w~Я уверена, что он сам себя иногда не понимает. - -[TM3_MC] -~w~Они с отцом такие разные. Отец, тот всегда при деле, решительный... - -[TM3_N] -~w~Вот он, мой мальчик. - -[TM3_N2] -~w~Как у тебя дела, пап? - -[TM3_O] -~w~Ты еще не нашел себе хорошую девушку? - -[TM3_P] -~w~Эй, твоя мама, упокой господь ее душу, перевернулась бы в могиле, - -[TM3_Q] -~w~если бы увидела тебя без жены. - -[TM3_R] -~w~Я знаю, па, я над этим работаю. - -[TM3_S] -~w~Тони, как твоя мама? - -[TM3_T] -~w~Знаешь, она чудесная женщина. Сильная. Умная. - -[TM3_U] -~w~У нее все...хорошо. - -[TM3_V] -~w~Прекрасно, прекрасно. Слушайте, парни, проходите внутрь, а я пока поговорю с нашим новым другом. - -[TM3_W] -~w~Я смотрю ты многое для нас сделал, парень... - -[TM4] -'ПЕРЕПОЛОХ В ЧАЙНАТАУНЕ' - -[TM4_A] -~w~Ах, это ты. Тони сейчас нет. - -[TM4_A2] -~w~Но он оставил тебе одно из своих любовных посланий. - -[TM4_B] -~w~Мы в состоянии ВОЙНЫ! Триада использует рыбный завод в качестве прикрытия. - -[TM4_C] -~w~Они проворачивают свои темные делишки на рыбном рынке в Чайнатауне. - -[TM4_D] -~w~Прачечная опять задолжала нам деньги. - -[TM4_E] -~w~Они считают, что за защиту лучше платить Триаде, так что придется их снова наказать. - -[TM4_F] -~w~Накажи этих умников, и нанеси визит боссам Триады! - -[TM4_G] -~w~Черт, если представится шанс, убей заодно и несколько их солдат. - -[TM4_GAT] -~g~Чтобы тебя пропустили, возьми фургон Триады. - -[TM5] -'ВЗРЫВ НА ЗАВОДЕ' - -[TM5_B] -~w~OK, мне надоело это дерьмо. - -[TM5_C] -~w~Нужно закончить разборки с Триадой раз и навсегда! - -[TM5_D] -Лысый установил бомбу в мусоровоз. - -[TM5_E] -~w~Бомба на таймере, так что много времени на размышления у тебя не будет. Бери машину. - -[TM5_F] -~w~Будь осторожен на дороге, Лысый сказал. что бомба может рвануть от любого столкновения! - -[TM5_G] -~w~Они откроют ворота для мусоровоза, так что ты без проблем проедешь на завод. - -[TM5_H] -~w~Припаркуй мусорку между двумя резервуарами с бензином и быстрее уноси ноги! - -[TM5_I] -~w~Пусть пойдет дождь из скумбрии. - -[TM5_J] -~w~Нам нужен библейский апокалипсис, а не какая-то дешевка. - -[TM_BUST] -Число ваших арестов - -[TM_DED] -Число визитов в больницу - -[TONI] -ЗАДАНИЯ ТОНИ - -[TONIGO] -~g~Тони повез свою мамочку в оперу. Зайди позже! - -[TONI_P] -У меня есть для тебя одно срочное дело! - Тони - -[TOWERS] -Хепберн Хейтс - -[TOYZ] -Фургон игрушек - -[TRAIN] -Поезд - -[TRAIN_1] -Станция Куровски - -[TRAIN_2] -Станция Ротвелл - -[TRAIN_3] -Станция Бейли - -[TRASH] -~g~Ты сильно помял свою тачку! Езжай и отремонтируй ее! - -[TRASHM] -Мусоровоз - -[TRINST] -Тройной безумный трюк - -[TSCORE] -ЗАРАБОТАНО: $~1~ - -[TSCORE2] -$~1~ - -[TTUTOR] -Чтобы заняться работой таксиста или отказаться от нее, нажми кнопку ~h~~k~~TOGGLE_SUBMISSIONS~~w~. - -[TTUTOR2] -Чтобы заняться работой таксиста или отказаться от нее, нажми кнопку ~h~~k~~TOGGLE_SUBMISSIONS~~w~. - -[TUBE1] -Как только откроется метро, ты сможешь на нем проехать на остров Стаунтон. - -[TUBE2] -Как только откроется Шорсайд Вейл, ты сможешь выйти на вокзале Шорсайд, чтобы попасть в аэропорт Фрэнсис. - -[TUBE_2] -чтобы сесть на электричку в метро - нажми ~h~~k~~VEHICLE_ENTER_EXIT~~w~. - -[TUNNEL] -Как только откроется туннель Портер, ты сможешь проехать на остров Стаунтон. - -[TUNNELP] -Туннель Портер - -[UNFRM1] -UnFormatMemCard 1 (teststuff) - -[UNIVERS] -Учебный городок - -[UPSIDE] -~r~Ты перевернул тачку! - -[USJ] -ПРИЗ ЗА ОСОБЫЙ ТРЮК! - -[USJI1] -TEXT NO LONGER REQUIRED - -[USJI2] -TEXT NO LONGER REQUIRED - -[USJI3] -TEXT NO LONGER REQUIRED - -[USJ_ALL] -ТЫ ИСПОЛНИЛ ВСЕ ОСОБЫЕ ТРЮКИ! - -[UZI_IN] -В магазин оружия завезли 'Узи'! - -[VANHSTP] -Решил вскрыть еще несколько Инкассаторов? Пригони их в наш гараж в гавани Портланда. - -[WANTED1] -~g~Стряхни копов с хвоста и понизь их заинтересованность в тебе! - -[WANT_A] -Тебя арестовывают лишь в том случае, если ты ~h~объявлен в розыск~w~. - -[WANT_B] -Величина ~h~уровня розыска~w~ отображается строкой звездочек в верхнем правом углу экрана. - -[WANT_C] -Сейчас твой ~h~уровень розыска~w~ равен одному... - -[WANT_D] -двум... - -[WANT_E] -трем... - -[WANT_F] -Чем выше твой ~h~уровень розыска~w~, тем больше сил будет брошено на твой арест. - -[WANT_G] -После ~h~ареста~w~ тебя отвозят в ближайший полицейский участок - -[WANT_H] -Копы забирают у тебя все оружие и часть денег в качестве взятки. - -[WANT_I] -Твое текущее задание будет считаться проваленным. - -[WANT_J] -Во время игры ты найдешь разные способы понижать ~h~уровень розыска~w~. - -[WANT_K] -~h~Уровень розыска~w~ сбрасывается после того, как машина будет ~h~ПЕРЕКРАШЕНА~w~. - -[WEATHE2] -ОБЫЧНАЯ ПОГОДА - -[WEATHER] -НЕНАСТЬЕ - -[WELCOME] -ДОБРО ПОЖАЛОВАТЬ - -[WHOOPEE] -М-р.Вупи - -[WIN_95] -Grand Theft Auto III }u ~ytu‚ ~t Windows 95 - -[WIN_DX] -Grand Theft Auto III ‚Ђuqѓu‚ DirectX ruЂЃxx }u }xvu 8.1 - -[WIN_RSZ] -]u ѓtp{~ЃЊ ѓЃ‚p}~rx‚Њ }~r~u ЂpwЂu€u}xu ЌzЂp}p - -[WIN_TTL] -Grand Theft Auto III - -[WIN_VDM] -Grand Theft Auto III ‚Ђuqѓu‚ }p rxtu~zpЂ‚u }u |u}uu 12\q p|Џ‚x - -[WRCONT] -The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto III requires an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). - -[WRCONTE] -The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto III requires an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2). - -[WRECKED] -~r~Машина разбита! - -[WRONGCD] -Неверный диск. Пожалуйст,а вставьте нужный диск. - -[WRONGT1] -~g~За работой приходи между 05:00 и 21:00 - -[WRONGT2] -~g~За работой приходи между 06:00 и 14:00 - -[WRONGT3] -~g~За работой приходи между 15:00 и 00:00 - -[X] -x - -[Y1JLAST] -~r~Пришел последним! Ты болтаешь как водила, а водишь как болтун! - -[Y1_1ST] -~g~Ты пришел первым, пройдя ~1~ контрольных пунктов! - -[Y1_2ND] -~y~Ты пришел вторым, пройдя ~1~ контрольных пунктов. ~y~Неплохо, но ты не победил! - -[Y1_3RD] -~r~Ты пришел третьим, пройдя ~1~ контрольных пунктов. ~r~Я был о тебе более высокого мнения! - -[Y1_J1ST] -~y~Ты пришел первым, пройдя ~1~ контрольных пунктов. ~y~Хорошо, но ты должен быть лучшим, чтобы получить Королеву Лиззи! - -[Y1_J2ND] -~r~Ты пришел вторым, пройдя ~1~ контрольных пунктов. Ты водишь как бешеная макака! - -[Y1_LAST] -~r~Ты пришел последним! ~r~Ты просто тратишь мое время, ДУРАК! - -[Y1_TEST] -МАШИНА В ВОДЕ! - -[YAKUSA] -Торрингтон - -[YAKUZCR] -Стингер Якудзы - -[YANKEE] -Янки - -[YARDICR] -Лобо Ярди - -[YARDIE] -ЗАДАНИЯ ЯРДИ - -[YD1] -'БЫСТРЫЕ ТАЧКИ - ЛЕГКИЕ ДЕНЬГИ' - -[YD1GO] -~g~СТАРТ! - -[YD1_1] -~r~ОДИН - -[YD1_2] -~r~ДВА - -[YD1_3] -~r~ТРИ - -[YD1_A] -~w~Это король Куртни. - -[YD1_A1] -~w~Мои Ярди хотят устроить хорошую гонку, а я слышал, что ты крутой водила. - -[YD1_B] -~w~Приезжай на своей тачке на пустырь за стадионом и жди там других участников заезда. - -[YD1_BON] -$1000!! - -[YD1_C] -~w~Мои люди будут наблюдать на всеми контрольными точками. - -[YD1_CNT] -~1~ из 15! - -[YD1_D] -~w~Тот кто пройдет контрольный пункт первым - получит приз, и так далее. - -[YD1_D1] -~w~Если ты проедешь больше контрольных пунктов, чем мои ребята, я дам тебе работу. - -[YD1_E] -~g~Готовься к гонке! - -[YD1_F] -~g~Мощный старт - мне нравится твой стиль! - -[YD1_G] -~r~Это гонка на МАШИНАХ. Тебе нужна МАШИНА, кретин! - -[YD2] -'РЕЙД С 'УЗИ' - -[YD2_A] -~w~Посмотрим, сможешь ли ты сделать за меня грязную работу. - -[YD2_A1] -~w~Узнаем, можно ли тебе доверять. - -[YD2_B] -~w~Сейчас подойдут двое моих парней, и ты пойдешь покатаешься с ними, - -[YD2_B1] -~w~посмотрим, чего ты стоишь на самом деле. - -[YD2_C] -~w~Давай, покатайся по Хепберн Хейтс и прикончи нескольких Дьяволов - они надоедают королеве Лиззи. - -[YD2_CC] -~w~Вот, это тебе пригодится. - -[YD2_D] -~w~Вести и стрелять будешь ты, ну а мы проследим чтобы ты не скопытился. - -[YD2_E] -~w~Поехали! - -[YD2_F] -~r~Он имел что-то против нас, пореши этого ублюдка! - -[YD2_G1] -~w~Хепберн Хейтс...Давай ка прикончи несколько тупых Дьяволов... - -[YD2_G2] -~w~Но запомни, ~r~Из машины тебе выходить нельзя! - -[YD2_H] -~w~Ок, возвращаемся на нашу территорию! ВПЕРЕД! - -[YD2_L] -~w~Отличная работа, Жнец! - -[YD2_M] -~r~Он разбил мою тачку! Прикончи его! - -[YD2_N] -~w~У тебя 5 секунд, чтобы вернуться в тачку! - -[YD3] -'МАШИНЫ БАНД' - -[YD3_A] -Я хотел бы получить тачки некоторых банд - -[YD3_A1] -чтобы без помех провернуть дела на их территории. - -[YD3_B] -Мне нужен Сентинел Мафии, - -[YD3_B1] -Стингер Якудзы и - -[YD3_B2] -Жеребец Дьяволов, для маскировки под их людей. - -[YD3_C] -Отгони их в мой гараж в Ньюпорте, но запомни, - -[YD3_C1] -мне не нужны помятые тачки! - -[YD3_D] -Перебей номера - -[YD3_E] -~r~Ты уже своровал тачку Дьяволов! - -[YD3_F] -~r~Ты уже своровал тачку Мафии! - -[YD3_G] -~r~Ты уже своровал тачку Якудзы! - -[YD3_H] -~g~Тачка Дьяволов сворована! - -[YD3_I] -~g~Тачка мафии сворована! - -[YD3_J] -~g~Тачка Якудзы сворована! - -[YD3_K] -~r~Машина сильно помята! Отремонтируй ее! - -[YD3_L] -~g~Отгони ее в ~p~гараж~g~! - -[YD3_M] -~r~Ты перевернулся! Ищи другую тачку! - -[YD4] -'ПОДСТАВА' - -[YD4_1] -~g~Обкурившиеся психи! - -[YD4_2] -~g~Взорви фургоны камикадзе! - -[YD4_A] -Короче, слушай! - -[YD4_A1] -Отправляйся в Бедфорд Поинт. - -[YD4_A2] -Там у меня тайник в старой тачке, сгоняй за ней! - -[YD4_B] -ПИСЬМО: Говорят, ты нашел себе работу. Я тоже не сидела сложа руки. - -[YD4_C] -Пришло тебе время почувствовать тебе силу СПАНКа! Besos y fuderes, Каталина, xxx. - -[YD4_D] -PS: УМРИ, ПАРШИВЫЙ ПЕС, УМРИ! - -[YD_P] -С тобой хочет побазарить король Куртни. Подойди к телефону на Аспатрии! - -[YES] -Да - -[Z] -Значение по оси Z: ~1~ - -{ re3 updates } -{ new languages } -[FEL_JAP] -ЯПОНСКИЙ - -[FEL_POL] -ПОЛЬСКИЙ - -[FEL_RUS] -РУССКИЙ - -{ new display menus } -[FED_MIP] -МИП-МАППИНГ - -[FED_AAS] -СГЛАЖИВАНИЕ - -[FED_FIL] -ТЕКСТУРНАЯ ФИЛЬТРАЦИЯ - -[FED_BIL] -БИЛИНЕЙНАЯ - -[FED_TRL] -ТРИЛИНЕЙНАЯ - -{ end of file } - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file diff --git a/utils/gxt/spanish.txt b/utils/gxt/spanish.txt deleted file mode 100644 index c0da2239..00000000 --- a/utils/gxt/spanish.txt +++ /dev/null @@ -1,8031 +0,0 @@ -[LETTER1] -abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"$,.'-?!!SDBF - -[DEFNAM] -Claude---------------------- - -[IN_VEH] -~g~¡Hey! ¡Vuelve al vehículo! - -[IN_VEH2] -~g~¡Necesitarás un coche para este trabajo! - -[IN_BOAT] -~g~¡Necesitarás un barco para este trabajo! - -[HEY] -~g~¡No vayas solo, mantén tu grupo unido! - -[HEY2] -~g~¡No os dividáis, mantened el grupo unido! - -[HEY3] -~g~¡Has perdido a tu número uno, vuelve y recupera a 8-Ball! - -[HEY4] -~g~¡Perder a Misty y Luigi te costará caro! ¡Ve y recógela! - -[HEY5] -~g~Una de las chicas está ausente sin permiso, ¡vuelve y recógela! - -[HEY6] -~g~Dejaste tu honor con el Yakuza Kanbu. ¡Debes protegerlo! - -[HEY7] -~g~Sería útil un arma extra. ¡Vuelve y encuentra a tu contacto! - -[HEY8] -~g~Protección significa exactamente eso: ¡Protege al viejo caballero oriental! - -[HEY9] -~g~¿Quieres que corra la voz por las calles? ¡Ve a ver al contacto! - -[HELP2_A] -Pulsa el ~h~botón /~w~ cuando corras para ~h~esprintar. - -[HELP3] -Sólo puedes esprintar durante cortos períodos antes de cansarte. - -[HELP4_A] -Pulsa el ~h~ botón ~k~~VEHICLE_ACCELERATE~~w~ para ~h~acelerar. - -[HELP4_D] -Mueve el~h~ joystick analógico de la derecha ~w~ hacia arriba para ~h~acelerar. - -[HELP5_A] -Pulsa el~h~ botón ~k~~VEHICLE_BRAKE~~w~ para ~h~frenar~w~, o para ~h~dar marcha atrás~w~ si el vehículo está detenido. - -[HELP5_D] -Mueve del ~h~joystick analógico de la derecha~w~ hacia atrás para ~h~frenar~w~, o para ~h~dar marcha atrás~w~ si el vehículo se ha detenido. - -[HELP6_A] -Pulsa el~h~ botón ~k~~VEHICLE_HANDBRAKE~ ~w~para utilizar el ~h~freno de mano del vehículo. - -[HELP6_C] -Pulsa el~h~ botón ~k~~VEHICLE_HANDBRAKE~ ~w~para utilizar el ~h~freno de mano del vehículo. - -[HELP6_D] -Pulsa el ~h~ botón ~k~~VEHICLE_HANDBRAKE~ ~w~ para utilizar el ~h~ freno de mano del vehículo. - -[HELP7_A] -Pulsa y mantén el~h~ botón ~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar~w~ con el rifle de francotirador. - -[HELP7_D] -Pulsa y mantén el ~h~ botón ~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar ~w~ con el rifle de francotirador. - -[HELP8_A] -Pulsa el~h~ botón ~k~~PED_SNIPER_ZOOM_IN~ ~w~para ~h~ampliar el zoom ~w~con el rifle y el~h~ botón ~k~~PED_SNIPER_ZOOM_OUT~ ~w~para ~h~reducir el zoom ~w~de nuevo. - -[HELP9_A] -Pulsa el~h~ botón ~k~~PED_FIREWEAPON~ ~w~para ~h~disparar~w~ el rifle de francotirador. - -[HELP10] -Esta insignia indica que estás buscado por la policía. - -[HELP11] -Cuantas más insignias tengas mayor será tu grado de peligrosidad asignado en la búsqueda y captura. - -[HELP13] -Algunas veces puedes necesitar utilizar caminos no mostrados en el radar. - -[TIMER] -Esta es una misión cronometrada, debes completarla antes de que el temporizador llegue a cero. - -[MISTY1] -~r~¡Misty es carne de depósito de cadáveres! - -[OUT_VEH] -~g~¡Fuera del vehículo! - -[GARAGE] -Conduce el coche dentro del garaje, luego sal caminando. - -[WANTED1] -~g~¡Despista a los polis y pierde tu grado de búsqueda y captura! - -[NODOORS] -~g~¡No son sardinas! Consigue un coche con suficientes asientos. - -[TRASH] -~g~¡Has dejado tu vehículo bien jodido! ¡Haz que lo reparen! - -[WRECKED] -~r~¡El vehículo está destrozado! - -[HORN] -~g~Toca el claxon. - -[HORN4] -Pulsa el ~h~botón L3 ~w~para tocar el ~h~claxon - -[NOMONEY] -~g~¡Necesitas más pasta! - -[OUTTIME] -~r~¡Demasiado lento, tío, demasiado lento! - -[SPOTTED] -~r~¡Te siguen la pista! - -[REWARD] -RECOMPENSA $~1~ - -[GAMEOVR] -JUEGO ACABADO - -[Z] -Eje-Z valor: ~1~ - -[M_FAIL] -¡FRACASO EN LA MISIÓN! - -[M_PASS] -¡MISIÓN SUPERADA! $~1~ - -[O_PASS] -¡TRABAJO ESPORÁDICO SUPERADO! - -[O_FAIL] -¡FRACASO EN TRABAJO ESPORÁDICO! - -[DEAD] -¡LIQUIDADO! - -[BUSTED] -¡REVENTADO! - -[S_PROMP] -Cuando no estés en una misión puedes ~h~guardar tu partida aquí~w~, esto hará avanzar el tiempo seis horas. - -[NUMBER] -~1~ - -[SCORE] -~1~$ - -[LOADCAR] -CARGANDO VEHÍCULO... (PULSA EL BOTÓN L1 PARA CANCELAR) - -[CARSOFF] -Coches activados. - -[CARS_ON] -Coches desactivados. - -[TEXTXYZ] -Escribiendo coordenadas para archivar... - -[CHEATON] -Modo trucos ACTIVADO - -[CHEATOF] -Modo trucos DESACTIVADO - -[UZI_IN] -¡La Uzi está ahora en el depósito de Municiones! - -[IMPORT1] -Ve afuera y espera a tu vehículo. - -[PAGEB1] -Pistola entregada en escondite - -[PAGEB2] -Uzi entregada en escondite - -[PAGEB3] -Armadura personal entregada en escondite - -[PAGEB4] -Escopeta entregada en escondite - -[PAGEB5] -granadas entregadas en escondite - -[PAGEB6] -molotovs entregados en escondite - -[PAGEB7] -AK47 entregada en escondite - -[PAGEB8] -Rifle de francotirador entregado en escondite - -[PAGEB9] -M16 entregado en escondite - -[PAGEB10] -Lanzacohetes entregado en escondite - -[PAGEB11] -Lanzallamas entregado en escondite - -[WANT_A] -Sólo serás arrestado si tienes un ~h~grado de búsqueda y captura. - -[WANT_B] -Tu ~h~grado de peligrosidad asignado a tu búsqueda y captura~w~ está representado por la hilera de estrellas en la parte superior derecha de la pantalla. - -[WANT_C] -Ahora tienes un ~h~grado de búsqueda y captura~w~ de uno... - -[WANT_D] -dos... - -[WANT_E] -tres... - -[WANT_F] -A medida que tu ~h~grado de búsqueda y captura ~w~ aumenta te verás acosado por formas más poderosa de cumplimiento de la ley. - -[WANT_G] -Cuando seas ~h~'reventado'~w~ serás llevado a la comisaría de policía más cercana. - -[WANT_H] -Los polis te requisarán todas tus armas y algo de tu dinero como soborno. - -[WANT_I] -Habrás fracasado en cualquier misión que estuvieses llevando a cabo. - -[WANT_J] -Encontrarás modos de reducir tu grado de búsqueda y captura cuanto más juegues. - -[WANT_K] -Si estás en un coche, ~h~LOS LAVADEROS ~w~ limpiarán ~h~tu grado de búsqueda y captura. - -[HEAL_B] -Cuando seas ~h~'liquidado'~w~ volverás al hospital más cercano. - -[HEAL_C] -Perderás tus armas y los doctores te cobrarán algún dinero por remendarte. - -[HEAL_E] -Encontrarás modos de curarte o de protegerte cuanto más juegues al juego. - -[DAM] -DAÑO: - -[KILLS] -MUERTES: - -[FARES] -TARIFAS: - -[BULL] -LINGOTES: - -[EVID] -PRUEBAS: - -[HEALTH] -ESTADO DEL COCHE: - -[COLLECT] -RECOGIDOS: - -[BOMB] -Conduce tu vehículo a la tienda de bombas para poner una ~h~bomba~w~. Coste - ~h~1.000$. - -[SAVE1] -Atraviesa la puerta para ~h~guardar la partida ~w~. No puedes guardas durante una misión. - -[SAVE2] -Cualquier vehículo dejado en este garaje será almacenado cuando la partida sea guardada. - -[AMMU] -Ve dentro del depósito de Municiones para comprar un arma. - -[BRIDGE1] -Cuando el Puente Callahan esté reparado podrás conducir hasta la isla Staunton. - -[TUNNEL] -Cuando el túnel Porter esté abierto podrás conducir hasta la isla Staunton. - -[LUIGI] -MISIONES DE LUIGI - -[TONI] -MISIONES DE TONI - -[JOEY] -MISIONES DE JOEY - -[FRANK] -MISIONES DE SALVATORE - -[DIABLO] -MISIONES DE DIABLO - -[ASUKA] -MISIONES DE ASUKA - -[B_SITE] -MISIONES SUBURBANAS DE ASUKA - -[KENJI] -MISIONES DE KENJI - -[RAY] -MISIONES DE RAY - -[LOVE] -MISIONES DE LOVE - -[YARDIE] -MISIONES DE YARDIE - -[HOOD] -MISIONES DE HOOD - -[CITYZON] -Liberty City - -[IND_ZON] -Portland - -[PORT_W] -Punta Callahan - -[PORT_S] -Embarcadero Atlantic - -[PORT_E] -Puerto de Portland - -[PORT_I] -Trenton - -[S_VIEW] -Mirador de Portland - -[CHINA] -Chinatown - -[EASTBAY] -Playa de Portland - -[LITTLEI] -Saint Mark's - -[REDLIGH] -Distrito Red Light - -[TOWERS] -Altos de Hepburn - -[HARWOOD] -Harwood - -[ROADBR1] -Puerto de Callahan - -[ROADBR2] -Puerto de Callahan - -[TUNNELP] -Túnel Porter - -[BOMB1] -Garaje de 8-Ball - -[COM_ZON] -Isla Staunton - -[STADIUM] -Aspatria - -[HOSPI_2] -Rockford - -[UNIVERS] -Campus de Liberty - -[CONSTRU] -Fuerte Staunton - -[PARK] -Belleville Park - -[COM_EAS] -Newport - -[SHOPING] -Punta de Bedford - -[YAKUSA] -Torrington - -[SUB_ZON] -Costa de Vale - -[AIRPORT] -Aeropuerto internacional - -[PROJECT] -Jardines de Wichita - -[SUB_IND] -Cala de la Cúspide - -[SWANKS] -Bosque de Cedros - -[BIG_DAM] -Presa Cochrane - -[SUB_ZO2] -Costa de Vale - -[SUB_ZO3] -Costa de Vale - -[CAR_1] -Ambulancia - -[CAR_2] -Camión de bomberos - -[CAR_3] -Policía - -[CAR_4] -Oficial - -[CAR_5] -Cuartel - -[CAR_6] -Rinoceronte - -[CAR_7] -Coche del FBI - -[CAR_8] -Securicar - -[CAR_9] -Moonbeam - -[CAR_10] -Coach - -[CAR_11] -Flatbed - -[CAR_12] -Rápido - -[CAR_13] -Trashmaster - -[CAR_14] -Patriot - -[CAR_15] -Sr. Whoopee - -[CAR_16] -Mule - -[CAR_17] -Yankee - -[CAR_18] -Pony - -[CAR_19] -Bobcat - -[CAR_20] -Rumpo - -[CAR_21] -Blista - -[CAR_22] -Dodo - -[CAR_23] -Bus - -[CAR_24] -Sentinel - -[CAR_25] -Cheetah - -[CAR_26] -Banshee - -[CAR_27] -Aguijón - -[CAR_28] -Infernus - -[CAR_29] -Esperanto - -[CAR_30] -Kuruma - -[CAR_31] -Stretch - -[CAR_32] -Perennial - -[CAR_33] -Landstalker - -[CAR_34] -Manana - -[CAR_35] -Idaho - -[CAR_36] -Semental - -[CAR_37] -Taxi - -[CAR_38] -Cabbie - -[CAR_39] -Buggy - -[LUIGIS] -Casa de Luigi - -[GOAWAY] -~g~¡Ya estás en una misión! - -[LUIGGO] -~g~Luigi está entrevistando a algunas chicas nuevas -¡Vuelve más tarde! - -[JOEYGO] -~g~Joey's está en la ciudad con Misty. ¡Pásate más tarde! - -[TONIGO] -~g~Toni ha llevado a su mamá a la ópera -¡Llama en otro momento! - -[KEMUGO] -~g~Maria y Kemuri están muy ocupadas en este momento - ¡Pásate más tarde! - -[KENJGO] -~g~Kenji ha ido a encuentro con los Yakuza -¡Llama en otro momento! - -[RAYGO] -~g~Ray tiene otros servicios por los que rondar -¡Inténtalo de nuevo más tarde! - -[LOVEGO] -~g~Donald Love tiene otros asuntos que atender -¡Pide una cita más tarde! - -[KENSGO] -~g~¡Kenji está ocupado! -¡Llama más tarde! - -[ASUSGO] -~g~¡Asuka no está disponible en este momento! - -[HOODGO] -~g~Los Capos no están disponibles en este momento! - -[WRONGT1] -~g~Vuelve entre las 05:00 y las 21:00 para un trabajo - -[WRONGT2] -~g~Vuelve entre las 06:00 y las 14:00 para un trabajo - -[WRONGT3] -~g~Vuelve entre las 15:00 y las 00:00 para un trabajo - -[GUN_1A] -Utiliza el ~h~botón ~k~~PED_CYCLE_WEAPON_RIGHT~ ~w~y el ~h~botón ~k~~PED_CYCLE_WEAPON_LEFT~ ~w~para pasar por tus armas. - -[GUN_2A] -Mantén pulsado el ~h~botón ~k~~PED_LOCK_TARGET~ ~w~para ~h~apuntar de modo automático ~w~, ¡pulsa el ~h~ botón ~k~~PED_FIREWEAPON~ ~w~para ~h~disparar! Intenta disparar a los objetivos... - -[GUN_2C] -Mantén pulsado el ~h~botón ~k~~PED_LOCK_TARGET~ ~w~para ~h~ apuntar de modo automático ~w~, ¡pulsa el~h~ botón ~k~~PED_FIREWEAPON~ ~w~para ~h~disparar! Intenta disparar a los objetivos... - -[GUN_2D] -Mantén pulsado el ~h~ botón ~k~~PED_LOCK_TARGET~ ~w~ para ~h~ apuntar de modo automático,~w~ ¡pulsa el~h~ botón ~k~~PED_FIREWEAPON~ ~w~para ~h~disparar! Intenta disparar a los objetivos... - -[GUN_3A] -Mientras que mantienes pulsado el ~h~ botón ~k~~PED_LOCK_TARGET~,~w~ pulsa el ~h~botón ~k~~PED_CYCLE_TARGET_LEFT~~w~ o el ~h~botón ~k~~PED_CYCLE_TARGET_RIGHT~ para cambiar de objetivo. - -[GUN_3B] -Mientras que mantienes pulsado el ~h~ botón ~k~~PED_LOCK_TARGET~,~w~ pulsa el ~h~botón ~k~~PED_CYCLE_TARGET_LEFT~~w~ o el ~h~botón ~k~~PED_CYCLE_TARGET_RIGHT~ para cambiar de objetivo. - -[GUN_4A] -Mientras que mantienes pulsado el ~h~ botón ~k~~PED_LOCK_TARGET~ ~w~ puedes caminar o correr mientras mantienes fijado un objetivo. - -[GUN_4B] -Mientras que mantienes pulsado el ~h~ botón ~k~~PED_LOCK_TARGET~ ~w~ puedes caminar o correr mientras mantienes fijado un objetivo. - -[GUN_5] -Puedes practicar el apuntar y disparar en estos objetivos de papel. Cuando hayas terminado retoma la misión. - -[TAXI1] -~g~ Busca la tarifa. - -[FARE1] -~g~Destino ~w~'Club Sex Kitten Miau' ~g~en Redlight. - -[FARE2] -~g~Destino ~w~'Supa Save' ~g~en el Mirador de Portland. - -[FARE3] -~g~Destino ~w~la 'sala de la vieja escuela' ~g~en Chinatown. - -[FARE4] -~g~Destino ~w~el 'Café Greasy Joe' ~g~en Punta Callahan. - -[FARE5] -~g~Destino ~w~'depósito de Municiones' ~g~en Redlight. - -[FARE6] -~g~Destino ~w~'Autos de crédito fácil' ~g~en Saint Mark. - -[FARE7] -~g~Destino ~w~'Bar de topless de Woody' ~g~en Redlight. - -[FARE8] -~g~Destino ~w~'Restaurante Marcos' ~g~en Saint Mark. - -[FARE9] -~g~Destino ~w~'garaje de importación y exportación' ~g~en Portland Harbor. - -[FARE10] -~g~Destino ~w~'Punk Noodles' ~g~en Chinatown. - -[FARE12] -~g~Destino ~w~'Estadio de Fútbol' ~g~en Aspatria. - -[FARE13] -~g~Destino ~w~'La iglesia' ~g~en Punta de Bedford - -[FARE14] -~g~Destino ~w~'El Casino' ~g~en Torrington - -[FARE15] -~g~Destino ~w~'Universidad Liberty' ~g~en el Campus de Liberty - -[FARE16] -~g~Destino ~w~'Centro comercial' ~g~en la zona de Belleville Park - -[FARE17] -~g~Destino ~w~'Muso' ~g~en Newport - -[FARE18] -~g~Destino ~w~'Edificio de AmCo' ~g~en Torrington - -[FARE19] -~g~Destino ~w~'Bolt Burgers' ~g~en Punta de Bedford - -[FARE20] -~g~Destino ~w~'El parque' ~g~en Belleville - -[FARE21] -~g~Destino ~w~'Aeropuerto internacional de Francis' - -[FARE22] -~g~Destino ~w~'el dique de Cochrane' - -[FARE24] -~g~Destino ~w~'El hospital' ~g~en la Cúspide de la Cala - -[FARE25] -~g~Destino ~w~'El parque' ~g~en la Costa de Vale - -[FARE26] -~g~Destino ~w~'Torres del Noroeste' ~g~en los Jardines de Wichita - -[NEW_TAX] -¡MÁS GRANDE! ¡MÁS RÁPIDO! ¡MÁS DURO! Nuevos taxis Borgnine abre su negocio en Harwood. ¡Llame hoy al 555-BORGNINE! - -[TSCORE2] -$~1~ - -[IN_ROW] -~1~ ¡Prima EN UNA FILA! $~1~ - -[TTUTOR] -Pulsa el ~h~botón ~k~~TOGGLE_SUBMISSIONS~~w~ para activar o desactivar las misiones de taxi. - -[TTUTOR2] -Pulsa el ~h~botón ~k~~TOGGLE_SUBMISSIONS~~w~ para activar o desactivar las misiones de taxi. - -[ATUTOR2] -~g~Conduce CON CUIDADO a los pacientes hasta el hospital. Cada golpe reduce sus posibilidades de supervivencia. - -[A_TIME] -+~1~ segundos - -[A_FULL] -~r~¡¡Ambulancia completa!! - -[A_RANGE] -~g~La radio de la ambulancia está fuera de alcance, ¡acércate hasta un hospital! - -[FTUTOR] -Pulsa el ~h~botón ~k~~TOGGLE_SUBMISSIONS~~w~ para activar o desactivar las misiones del camión de bomberos. - -[FTUTOR2] -Pulsa el ~h~botón ~k~~TOGGLE_SUBMISSIONS~~w~ para activar o desactivar las misiones del coche de bomberos. - -[F_PASS1] -¡Fuego apagado! - -[F_RANGE] -~g~La radio del camión de bomberos está fuera de cobertura, ¡acércate hasta una estación de bomberos! - -[C_BREIF] -~g~Sospechoso visto por última vez en la zona ~a~. - -[C_RANGE] -~g~La radio de la policía está fuera de alcance, ¡acércate a una comisaría! - -[DODO_FT] -¡Huiste por ~1~ segundos! - -[EBAL_A] -Conozco un lugar al borde del distrito Red Light donde podemos escondernos, - -[EBAL_A1] -pero mis manos están hechas un desastre de modo que será mejor que conduzcas tú, hermano. - -[EBAL_1] -Pulsa el ~h~ botón ~k~~VEHICLE_ENTER_EXIT~~w~ para ~h~entrar ~w~o ~h~salir~w~ de un vehículo. - -[EBAL_1B] -Pulsa el ~h~ botón ~k~~VEHICLE_ENTER_EXIT~~w~ para ~h~entrar ~w~o ~h~salir~w~ de un vehículo. - -[EBAL_2] -~g~¡Vuelve al coche! - -[EBAL_3] -Este es el ~h~radar~w~. Utilízalo para surcar la ciudad, ¡sigue el ~h~pitido~w~ en el ~h~radar~w~ para encontrar el escondite! - -[EBAL_D] -Conozco un tipo, tiene contactos, su nombre es Luigi. - -[EBAL_D1] -Él y yo nos conocemos de antes de modo que probablemente podríamos conseguirte algún trabajo. Venga, vamos hacia allí. - -[EBAL_E] -Venga, vamos a pasarnos por allí y te presentaré. - -[EBAL_I] -El jefe saldrá para veros dentro de poco... - -[EBAL_J] -8-Ball tiene un asunto arriba. - -[EBAL_K] -Quizás puedes hacerme un favor - -[EBAL_L] -Una de mis chicas necesita que la lleven de modo que consigue un coche y recoge a Misty en la clínica. Luego tráela de vuelta aquí. - -[EBAL_N] -¡Así que mantén tus manos sobre el volante - -[EBAL_4] -~r~¡8-Ball está muerto! - -[EBAL_5] -~g~¡Consigue un vehículo! - -[EBAL_6] -~g~¡Recoge a Misty! - -[LM1] -'LAS CHICAS DE LUIGI' - -[LM2] -'NO PEGUES A MI ZORRA' - -[LM3] -'LLEVA A MISTY POR MÍ' - -[LM5] -'EL BAILE DE LA POLICÍA' - -[LM1_2] -~g~Lleva a Misty al Club de Luigi. - -[LM1_3] -~g~Toca el claxon para conseguir que la chica entre en el coche. - -[LM1_6] -~g~¡Vuelve al coche! - -[LM1_7] -Detén el vehículo junto a Misty y déjala subir. - -[LM1_8] -Puedes ir y ver a Luigi en busca de más trabajo o ver que se cuece en Liberty City. - -[LM2_A] -Hay un nuevo tipo importante en la ciudad que responde al nombre de AZOTE. - -[LM2_E] -Algún tipo listo ha estado mostrando esta basura a mis chicas abajo en el puerto de Portland. - -[LM2_B] -¡Ve y muéstrale un bate de béisbol en su cara! - -[LM2_G] -¡Quiero una compensación por este insulto! - -[LM2_1] -~g~Coge su coche y haz que lo vuelvan a rociar. - -[LM2_2A] -¡Utiliza el ~h~ botón ~k~~PED_FIREWEAPON~~w~ para ~h~dar un puñetazo ~w~y ~h~dar una patada~w~ o ~h~balancear ~w~el bate de béisbol! - -[LM2_2C] -¡Utiliza el ~h~ botón ~k~~PED_FIREWEAPON~~w~ para ~h~dar un puñetazo ~w~y ~h~dar una patada~w~ o ~h~balancear ~w~el bate de béisbol ~w~! - -[LM2_2D] -¡Utiliza el ~h~ botón ~k~~PED_FIREWEAPON~~w~ para ~h~dar un puñetazo ~w~y ~h~dar una patada~w~ o ~h~balancear ~w~el bate ~w~! - -[LM2_3] -~g~¡Esconde el coche en el garaje de Luigi! - -[LM2_4] -~g~¡Vuelve a rociar el coche! - -[LM3_A] -Hey, tengo que hablar contigo... De acuerdo Mick, hablaré contigo más tarde. - -[LM3_B] -¿Cómo te vá, chico? - -[LM3_C] -El hijo del Don, Joey Leone, quiere un poco de acción de su chica de siempre, Misty. - -[LM3_D] -Ve a recogerla en los Altos de Hepburn... - -[LM3_E] -pero cuidado, ésa es la turba del Diablo. - -[LM3_F] -Luego llévala hasta el garaje de él en Trenton y hazlo rápido, - -[LM3_H] -¡así que mantén la vista sobre la carretera y lejos de Misty! - -[LM3_1D] -Pulsa el ~h~ botón L3 ~w~ para tocar el ~h~claxon~w~ y hacer saber a Misty que estás aquí. - -[LM3_2] -~g~Lleva a Misty a Joey's. - -[LM3_4] -~g~¡Ve a recoger a Misty! - -[LM3_5] -Ahora trabajas de forma regular para Luigi, ¿no? Ya era hora de que tuviese un conductor en el que pudiésemos confiar! - -[LM3_7] -Estaré contigo en un minuto, bujía. - -[LM3_10] -~g~¡Coge un vehículo! - -[LM4_B] -Ve y ocúpate de las cosas por mí. - -[LM4_C] -Si necesitas una pieza ve a la puerta trasera del depósito de Municiones en el lado contrario al metro. - -[LM5_A] -El baile de la policía se está celebrando en la sala de la vieja escuela cerca del puente - -[LM5_B] -y parece que están buscando un poco de acción a la 'antigua usanza'. - -[LM5_C] -Ahora tengo chicas por toda la ciudad, pateando las calles. - -[LM5_D] -Llévalas al baile, harán bulto. - -[LM5_1] -~g~Estás embutiendo a esas damas demasiado, ¡les van a salir moratones! ~g~Primero deja a esas chicas, luego vuelve a por más. - -[LM5_2] -~r~¡Una de las chicas de Luigi es un saco de grasa! - -[LM5_3] -~g~¡Necesitas un coche! - -[LM5_4] -~g~Recoge a las chicas que trabajan en St. Marks. - -[LM5_5] -~g~Lleva a las chicas al Baile de la Policía! - -[LM5_8] -~g~Chicas trabajando en el Baile: ~1~ - -[JM2] -'DESPEDIDA A LEE CHONG 'EL GORDO'' - -[JM4] -'EL CHOFER DE CIPRIANI' - -[JM5] -'LA MOFETA MUERTA EN EL MALETERO' - -[JM1_1] -~g~Lleva el coche de Forelli hasta el garaje de 8-Ball al Norte de aquí, detrás de 'Autos de crédito fácil'. - -[JM1_2] -~g~Vuelve a aparcar el coche en el restaurante de Marco. - -[JM1_3] -~g~¡Activa la bomba del coche y luego sal de ahí! - -[JM1_4] -~g~¡Estás destrozando el vehículo! ¡Repáralo! - -[JM1_5] -~g~¡La bomba del coche no está colocada! - -[JM1_6] -~g~Vuelve a colocar el coche en la posición correcta. - -[JM1_8A] -~y~¡Hey, es mi gran hombre! - -[JM1_8B] -~y~La tienda de bombas está automatizada. Simplemente entra conduciendo, detén tu coche y la tienda hará el resto. - -[JM1_8C] -~y~Ten, tu primer coche puede salirte gratis, pero después de eso te costará dinero. - -[JM2_A] -Lee Chong 'el Gordo' está dando palizas para una nueva banda de Colombia... o Colorado... o algo así.... - -[JM2_B] -La verdad es que no estoy seguro. De todas formas, quién necesita detalles. - -[JM2_D] -Esa rata a vendido su último refrito. - -[JM2_E] -¡Quiero que le liquides! - -[JM2_G] -Equípate con una nueve, sabes dónde está, ¿verdad? - -[JM2_H] -Bueno, recuerda, vigila tu espalda en China Town, es territorio de las Tríadas. - -[JM3_A] -De acuerdo vamos a por la furgoneta de la paga. - -[JM3_B] -Sale de China Town todos los días. - -[JM3_C] -Las balas ni siquiera abollarán el blindaje de la armadura de la furgoneta, de modo que coge un coche y échala de la carretera. - -[JM3_D] -Ahora golpéala fuerte y los imbéciles de los guardias de seguridad se achicarán. - -[JM3_E] -Luego llévala al almacén en los muelles y mis chicos se encargarán desde ahí. - -[JM3_F] -Bueno, no estarán haciendo sus rondas todo el día, de modo que no pierdas el tiempo. - -[JM3_1] -~g~Lleva la furgoneta al almacén. - -[JM3_2] -~g~Carga contra la furgoneta hasta que su daño esté por debajo del 70 por ciento. - -[JM4_B] -¡Oh! ¡Aquí está el tipo del que te hablaba! - -[JM4_C] -De acuerdo, escucha. Este tío no es italiano y no es un mecánico, pero puede arreglar las cosas. - -[JM4_D] -Este es el Capo, Toni Cipriani. - -[JM4_E] -Sí, soy Toni Cipriani - -[JM4_F] -Bien, llévale al restaurante de Mamá en St Marks. - -[JM4_G] -Ahora escúchame, estoy planeando un trabajo que necesita un buen conductor de modo que pásate por aquí más tarde, ¿de acuerdo? - -[JM4_2] -¡Espera aquí! Mantén el motor en marcha. Esto no es una visita social. - -[JM4_3] -¡Es una emboscada de las Tríadas! ¡Sácanos de aquí, chico! - -[JM4_4] -Las Tríadas creen que pueden meterse conmigo, las Tríadas, ¡CONMIGO! - -[JM4_6] -¡Hey vigila el coche! Dije que nada de numeritos. - -[JM4_7] -~g~Lleva a Toni al restaurante de su mamá. - -[JM4_8] -~r~¡Toni ha sido liquidado! - -[JM5_A] -¡Cojonudo! Estupendo. - -[JM5_B] -De acuerdo, ¡justo el tipo con el que necesito hablar! - -[JM5_D] -Uno de los Forellis pensó que era un tipo listo, de modo que se llevó lo que estaba buscando. - -[JM5_E] -Lleva el cuerpo a la trituradora en Harwood, ¿de acuerdo? - -[JM5_1] -~g~¡Llévalo a la trituradora! - -[JM5_2] -~g~¡Son los hermanos Forelli! - -[JM6_A] -Debe ser todo un viajecito, ¿eh? - -[JM6_B] -De acuerdo, escucha. Lleva un coche hasta la casa franca en St. Marks y recoge a algunos de los míos. - -[JM6_C] -Están atracando un banco y necesitan un conductor. - -[JM6_D] -Di mi palabra de que eras el hombre, de modo que no fastidies esto. - -[JM6_E] -Llévales al banco antes de las cinco en punto, ni un minuto después. - -[JM6_2] -Mantén el motor en marcha, entraremos y saldremos enseguida. - -[JM6_3] -¡¡¡Sácanos de aquí!! - -[JM6_4] -¡¡¡Líbrate de los polis y llévanos a la casa franca!! - -[JM6_6] -~g~¡Ve y consigue un vehículo menos llamativo! - -[JM6_7] -~g~¡Necesitas a los 3 para robar el banco! - -[TM1] -'SACANDO LA COLADA' - -[TM2] -'EL ENCARGO' - -[TM3] -'SALVATORE HA CONVOCADO UNA REUNIÓN' - -[TM4] -'TRÍADAS Y TRIBULACIONES' - -[TM5] -'EL PEZ GLOBO' - -[TONI_P] -¡Tengo un trabajo urgente para ti! -Toni - -[TM1_A] -~w~Toma asiento, chico, siéntate. - -[TM1_B] -~w~Así que la lavandería no pagará protección, ¿eh? - -[TM1_C] -~w~¿Las Tríadas creen que pueden meterse conmigo? - -[TM1_D] -~w~Vamos a enseñar a esos aspirantes a tipos duros lo que significa ser un tipo duro. - -[TM1_E] -~w~Sí, enséñales algo de respeto. Ningún hijo mío recibe de nadie de las Tríadas. - -[TM1_F] -~w~Tu padre, Dios acoja su alma, no aguantó ninguna mierda de las Tríadas en Sicilia. - -[TM1_G] -~w~Lo siento Ma. Sí Ma. - -[TM1_H] -~w~Quiero que destruyas sus furgonetas de lavandería - -[TM1_I] -~w~y destroces a cualquiera de las Tríadas que se interponga en tu camino. - -[TM1_J] -~w~8-Ball puede suministrarte lo que necesites. - -[TM2_A] -~w~TONI ha salido a machacar a la gente o a intentarlo. - -[TM2_AA] -Nunca será tan duro como su padre, te dejó una nota en la mesa. - -[TM2_B] -~w~La lavandería ha aceptado pagar. ¡Lo hiciste realmente bien, chico! - -[TM2_C] -~w~Ve a recoger el dinero y tráelo de vuelta aquí. Cuidado con las Tríadas. - -[TM2_D] -~w~Pueden estar metiéndote un petardo por el culo, y no mancharse. - -[TM2_E] -~w~¡Nadie, quiero decir nadie, se mete con TONI CIPRIANI! - -[TM2_1] -~g~¡¡Devuélvele el dinero a Toni!! - -[TM2_2] -~g~¡Los dejaste tiesos a todos! - -[TM3_MA] -~w~¡No sé dónde está! - -[TM3_MB] -~w~Te juro que ese chico mío a veces no se conoce a sí mismo. - -[TM3_MC] -~w~Ahora bien, su padre era diferente. Siempre en la cumbre, al cargo de todo, valiente... - -[TM3_A] -~w~Don Salvatore ha convocado una reunión. - -[TM3_B] -~w~Necesito que recojas la limusina y a su chico, Joey, del garaje. - -[TM3_C] -~w~Luego recoge a Luigi en su club, vuelve aquí y recógeme a mí, - -[TM3_D] -~w~luego todos iremos juntos a la casa del jefe. - -[TM3_E] -~w~Esos Tríadas, no saben cuándo parar. - -[TM3_F] -~w~Quieren una guerra. Tendrán una guerra. - -[TM3_G] -~w~Ahora en marcha. - -[TM3_1] -~g~Coge el Stretch de Joey's. - -[TM3_2] -~g~Ahora ve a recoger a Luigi. - -[TM3_3] -~g~Ahora ve a recoger a Toni. - -[TM3_4] -~g~Lleva a los mafiosos hasta la casa de Salvatore. - -[TM3_5] -~y~¡¡Es una emboscada de las Tríadas!! - -[TM4_B] -~w~¡Estamos en GUERRA! Las Tríadas tienen una fábrica de pescado como fachada. - -[TM4_C] -~w~La mayor parte de sus negocios se pierde en el mercado de pescado de Chinatown. - -[TM4_D] -~w~Esa lavandería todavía nos debe por la protección. - -[TM4_E] -~w~Consideran que las Tríadas les están protegiendo ahora, así que digo que les demos su merecido castigo. - -[TM4_F] -~w~¡Toma a esos chicos y golpea a los Señores de la Guerra de las Tríadas! - -[TM4_G] -~w~Demonios, si tienes la oportunidad, revienta también a algunos de sus soldados. - -[TM4_GAT] -~g~Necesitas un 'Camión para pescado Tríada' para entrar. - -[TM5_A] -TEXT NO LONGER REQUIRED - -[TM5_B] -~w~Ya he tenido bastante de esta mierda. - -[TM5_C] -~w~¡Vamos a acabar con las Tríadas en Liberty de una vez por todas! - -[TM5_D] -8-Ball ha instalado una bomba en un camión de la basura. - -[TM5_E] -~w~Tiene un temporizador, así que si la lías no quedarán evidencias. Vete y toma ese camión de basura. - -[TM5_F] -~w~¡Cuidado, 8-Ball dice que es muy sensible y que cualquier movimiento puede hacerlo estallar! - -[TM5_G] -~w~Su fábrica de pescado abrirá sus puertas a un camión de basura, así que puedes conducirlo allí directamente. - -[TM5_H] -~w~Aparca entre las latas de gas y ¡sal pitando de ese infierno! - -[TM5_I] -~w~Quiero que llueva trozos de caballa. - -[TM5_J] -~w~Esto es realmente bíblico, nada de bajo presupuesto. - -[FM2] -CORTANDO LA HIERBA - -[FM4] -ÚLTIMOS DESEOS - -[FM1_A] -~w~Yo y los chicos queremos hablar de negocios - -[FM1_B] -~w~Así que esta tarde vas a vigilar a mi chica. - -[FM1_C] -~w~¡OYE, MARÍA! ¡MUEVE ESE CULO! - -[FM1_D] -~w~El grandísimo estúpido hace esto todo el tiempo. - -[FM1_E] -~w~Y aquí está ella ¡La primera y única Reina de Saba! - -[FM1_F] -~w~¿Qué hacíais ahí arriba? - -[FM1_G] -~w~Fuera lo que fuera, seguro que me cuesta dinero. - -[FM1_H] -~w~Bueno, no pensarás que me voy a quedar a conversar ¿no? - -[FM1_I] -~w~Métete en ese coche y cierra la bocaza. - -[FM1_J] -~w~Llévate la limusina, pero devuélvela de una pieza ¿me has oído? - -[FM1_K] -~w~Y vigílala, puede causarte problemas. - -[FM1_L] -~w~¡Sí, sí, sí! Estoy segura de que tu nuevo perrito faldero tiene todo previsto. - -[FM1_M] -~w~¿Pues no es fuerte y grande? - -[FM1_N] -~w~¡Eh, Fido, vayamos a visitar a Chico y hacer una fiestecita! - -[FM1_P] -~g~Ese de ahí es Chico, párate cerca. - -[FM1_S] -~w~Ahí vas, señora. - -[FM1_TT] -~w~¡ES UNA REDADA POLICIAL! - -[FM1_1] -~g~¡Vuelve al Stretch! - -[FM1_2] -~g~¡Entra en el Stretch! - -[FM1_3] -~r~Si abandonas a María y Salvatore te zurrará, vuelve y recógela. - -[FM1_4] -~g~¡Te has deshecho de la mujer del Don! ¡Vuelve al almacén y espera a María! - -[FM1_5] -~g~¡Lleva a María sana y salva con Salvatore! - -[FM1_6] -~g~¡Chico no estará allí para siempre, lleva a María al muelle! - -[FM1_7] -~r~¡María está muerta! A Salvatore no le va a gustar nada... - -[FM1_8] -~r~¡Te cargaste al proveedor de Maria! - -[FM2_J] -Déjanos solos un minuto. - -[FM2_A] -El Cartel colombiano está haciendo SPANK en algún lugar de Liberty. - -[FM2_K] -pero no sabemos dónde y parece como si supieran todo lo que hacemos antes de que lo hagamos. - -[FM2_L] -Hay un tipo llamado Curly Bob que trabaja en el bar de Luigi. - -[FM2_M] -Ha estado malgastando más dinero del que gana. - -[FM2_N] -Normalmente toma un taxi de vuelta a casa tras el trabajo. Así que síguele. - -[FM2_O] -Y si nos está traicionando... mátalo. - -[FM2_F] -Aquí viene nuestro amiguito. El señor Bocazas en persona. - -[FM2_G] -¿Te han seguido? Sabes que lo que pasa aquí es nuestro pequeño secreto. - -[FM2_H] -No... no. No me han seguido. ¿Tienes mi mercancía? - -[FM2_I] -Aquí está tu SPANK, soplón, ahora habla. - -[FM2_P] -OK, así que los de Leone libran una guerra en dos frentes. - -[FM2_Q] -Tienen una guerra territorial con las Tríadas y no hay signos de que ninguno se vaya a rendir. - -[FM2_R] -Mientras tanto Joey Leone se ha hecho mala sangre con los Forellis. - -[FM2_S] -Cada día que pasa pierden hombres e influencia en la ciudad. - -[FM2_T] -Salvatore es cada vez más peligroso y paranoico. Sospecha de todos y de todo. - -[FM2_U] -Con lealtades como la tuya, por qué tendría que preocuparse. - -[FM2_1] -~g~¡Ahí está Curly Bob! - -[FM2_2] -~g~¡Curly ha salido del club, síguele! - -[FM2_5] -~g~Llévale al Puerto Portland. - -[FM2_6] -~r~¡Curly no entrará en un taxi accidentado! - -[FM2_7] -~r~¡Curly se ha esfumado! ¡Ya no hay encuentro! - -[FM2_8] -~g~¡Golpea a Curly Bob! - -[FM2_9] -~r~¡Curly Bob está muerto! - -[FM2_10] -~r~¡Curly se largó! - -[FM2_11] -~g~Aparca frente al club de Luigi, Curly Bob saldrá pronto. - -[FM2_12] -~r~¡Os ha dado esquinazo! - -[FM3_A] -~w~Tenemos que terminar con esos bastardos colombianos, - -[FM3_B] -~w~pero mientras estamos en guerra con las Tríadas no somos lo bastante fuertes. - -[FM3_C] -~w~El Cartel tiene fondos ilimitados procedentes de esa mierda de SPANK. - -[FM3_D] -~w~si les atacamos abiertamente, fregarán el suelo con nosotros. - -[FM3_E] -~w~Deben estar haciendo SPANK en ese barco grande al que os llevó Curly. - -[FM3_F] -~w~Así que tenemos que usar las cabezas, o mejor, una cabeza. La tuya. - -[FM3_G] -~w~Te estoy pidiendo que destruyas esa fábrica de SPANK como un favor personal hacia mí, Salvatore Leone. - -[FM3_H] -~w~Si haces esto por mí, serás todo un hombre, cualquier cosa que quieras. - -[FM3_I] -~w~Ve a ver a 8-Ball, necesitas su experiencia para volar ese barco. - -[FM3_8A] -~w~¡Eh, hombre! Salvatore ha llamado, - -[FM3_8B] -~w~pero un trabajo como este necesita muchos fuegos artificiales. - -[FM3_8D] -~w~pero sabes que conmigo consigues mucho a cambio de tu pasta. - -[FM3_8E] -~w~De acuerdo, ¡vamos a hacerlo! - -[FM3_8F] -~w~Puedo hacer detonar este pequeño, pero aún no puedo usar una pieza con estas manos. - -[FM3_8G] -~w~¡Toma, este rifle te ayudará a reventar algunas cabezas! - -[FM3_4] -~g~¡Para el coche y deja que 8-Ball salga! - -[FM3_7] -~r~¡¡8-Ball se ha helado! - -[FM3_8] -~r~¡Los guardias han sido alertados! - -[FM4_A] -~w~Es mi limpiador favorito. - -[FM4_B] -~w~Estoy orgulloso de ti, hijo, sacudiste la mierda de esas pelotas grasientas. - -[FM4_C] -~w~Tengo un trabajito más para ti antes de que podamos celebrarlo. - -[FM4_D] -~w~Hay un coche a la vuelta del edificio del club de Luigi. - -[FM4_E] -~w~El interior está pringado de sesos. - -[FM4_F] -~w~Tuvimos que ayudar a un tipo a que se decidiera, y fue un poco -er- sucio. - -[FM4_H] -~w~Llévalo a la trituradora antes de que los polis lo encuentren. - -[AM3] -'SANGRA PAPARAZZI' - -[AM4] -'DÍA DE PAGA PARA RAY' - -[AM5] -'TANNER DOS CARAS' - -[AM1_A] -Tenemos que aclarar ciertos temas antes de seguir con cualquier clase de relación, - -[AM1_B] -de negocios o de lo que sea. Pongamos las cartas sobre la mesa. - -[AM1_C] -Yo soy Yakuza y sé que trabajas para la familia de Salvatore Leone. - -[AM1_D] -Puedo darte trabajo en nuestra organización, - -[AM1_E] -Pero primero debes demostrarme que has cortado todos tus lazos con la Mafia. - -[AM1_G] -Asegúrate de que no llega vivo a su club. - -[AM1_H] -Mientras tanto María y yo nos pondremos al día por los viejos tiempos. - -[AM1_I] -Oh.. Asuka, tienes masajista. - -[AM1_J] -Eso no es un masajista. - -[AM1_1] -~g~¡Salvatore está saliendo del club de Luigi! - -[AM1_2] -~r~¡Te han descubierto! - -[AM1_3] -~r~¡Has perdido a Salvatore! - -[AM1_4] -~r~Buen intento, ¡has asustado al objetivo! ¿Y te llamas a ti mismo pistolero? - -[AM1_5] -~g~Ve al Distrito de la Luz Roja y espera a que Salvatore salga del club. - -[AM1_7] -~r~Salvatore está en casa, sano y salvo, tomándose un cóctel. ¡Nadie te va a llamar Chacal! - -[AM1_8] -~g~Salvatore saldrá del club del Luigi aproximadamente a las ~1~:~1~ - -[AM2_4] -~g~¡Te han visto venir como a un elefante al galope! - -[AM3_A] -Un periodista ha estado metiendo sus narices por aquí. - -[AM3_B] -María y yo nos hemos tomado unas pequeñas vacaciones juntos hasta que puedas librarte de ese mirón pervertido. - -[AM4_A] -¡Es mi guapo manitas! - -[AM4_B] -María está muy ocupada en este momento, pero le diré que has llamado. - -[AM4_C] -¿Quién es? ¿Asuka? Ya sé que he sido una niña traviesa, ¡pero es que necesitaba mear! ¿Vale? - -[AM4_D] -Es el momento de que te encuentres con nuestro hombre dentro del DPL. - -[AM4_E] -Aquí está su pago por el último trabajito que hizo para nosotros. - -[AM4_F] -El es comprensiblemente cauteloso. - -[AM4_G] -Ve a la cabina en Torrington tan rápido como puedas y espera sus instrucciones. - -[AM5_A] -María y yo hemos ido de compras. - -[AM5_B] -¡Nuestra fuente en la policía nos ha informado de que uno de nuestros conductores es un extrañamente animado poli camuflado! - -[AM5_C] -El es un inútil fuera de su coche así que lo hemos marcado con un seguidor. - -[AM5_D] -¡Hazle sangrar! - -[AM5_1] -¡Tanner está sobre ti! - -[AS1] -'CEBO' - -[AS2] -'MARCHANDO UN EXPRESO' - -[AS4] -'RESCATE' - -[AS1_A] -~w~Parece que Miguel piensa que le maltrato - -[AS1_B] -~w~Pero él ha revelado cuánto teme Catalina tu búsqueda de revancha. - -[AS2_A] -~w~Infravaloramos los planes de Catalina para el SPANK - -[AS2_B] -~w~Va mucho más allá de los Yardies vendiéndolo en las esquinas. - -[AS2_D] -~w~Han vendido SPANK en puestos callejeros. - -[AS2_1] -¡¡Todos los puestos de expreso en Portland destruidos!! - -[AS2_2] -~g~¡¡Todos los puestos de expreso en Staunton Island destruidos!! - -[AS2_3] -~g~¡¡Todos los puestos de expreso en Shoreside Vale destruidos!! - -[AS2_4] -~r~¡¡El Cartel ha avisado a sus camellos!! - -[AS2_5] -~g~¡Todavía hay puestos de expreso en Shoreside Vale y en Staunto Island! - -[AS2_6] -~g~¡Todavía hay puestos de expreso en Shoreside Vale! - -[AS2_7] -~g~¡Todavía hay puestos de expreso en Staunton Island! - -[AS2_8] -~g~¡Todavía hay puestos de expreso en Portland! - -[AS2_9] -~g~¡Todavía hay puestos de expreso en Portland y en Shoreside Vale! - -[AS2_10] -~g~¡Todavía hay puestos de expreso en Portland y en Staunton Island! - -[AS2_12] -~g~¡Cruza los distritos de Liberty para buscar puestos de ~b~Marchando un Expreso! - -[AS3_A] -~W~¿Lo apretamos un poco más o esperamos a que se vuelva negro y caiga? - -[AS3_B] -~w~Dale un pinchazo rápido... - -[AS3_D] -~w~¡Mi manitas! - -[AS3_E] -~w~Me aburría, así que vine a hacer compañía a Asuka. - -[AS3_1] -~g~Busca un ~r~bote~g~ y ve al ~b~boya del aeropuerto! - -[AS3_3] -~g~Espera a que el ~y~avión~g~ comience a acercarse! - -[AS3_5] -~g~¡Recupera la carga! - -[AS3_4] -~g~¡¡Usa un lanzador de cohetes para derribar ~y~el avión~g~!! - -[AS3_2] -~b~¡Ve al boya del aeropuerto! ~y~¡¡El avión se está acercando!! - -[AS3_6] -~g~~1~ DE 8 - -[KM1] -'KANBU REVIENTA' - -[KM3] -'TRATO SIGILOSO' - -[KM4] -'SHIMA' - -[KM5] -'HEROÍNA' - -[KM1_A] -Mi hermana habla muy bien de ti, - -[KM1_E] -aunque todavía debo convencerme de que un gaijin puede ofrecerme algo más que contratiempos. - -[KM1_B] -Tal vez puedas ayudar con una situación que me tiene en desventaja. - -[KM1_F] -Desde luego que el fracaso lleva consigo su propia desgracia. - -[KM1_C] -Un Yakuza Kanbu está bajo custodia esperando ser trasladado y juzgado. - -[KM1_G] -Es un valioso miembro de la familia. - -[KM1_H] -Libéralo y llévatelo al dojo de Bedford Point. - -[KM1_D] -Te damos las gracias por tus generosas acciones. Si alguna vez necesitas ayuda el dojo tendrá el honor de proporcionarte dos hombres que permanecerán a tu lado. - -[KM1_1] -~g~¡Roba un coche de la pasma! - -[KM1_2] -~g~¡Carga el coche con una bomba! - -[KM1_3] -~g~Ahora llévalo al dojo Yakuza. - -[KM1_5] -~g~Vale, ahora ve a la comisaría. - -[KM1_6] -~g~¡Pon una bomba en el coche! - -[KM1_7] -~g~¡Sólo vehículos de policía autorizados! - -[KM1_9] -~r~No usaste un coche bomba para destruir la pared. - -[KM1_10] -~r~El Yakuza Kanbu está muerto - ¡y tu honor también! - -[KM1_11] -~r~¡Trajiste la desgracia a ti mismo! - -[KM2_A] -Es imposible sobreestimar la importancia del protocolo en esta sección de trabajo. - -[KM2_B] -Para mi vergüenza eterna, un hombre me hizo una vez un favor y nunca tuve la oportunidad de devolver su amabilidad. - -[KM2_C] -Su punto débil son los coches y nos ha pedido que adquiramos ciertos modelos para su colección. - -[KM2_F] -Mi honor lo demanda. - -[KM2_2] -~g~Coche entregado. - -[KM3_A] -Cuando los problemas acechan, el tonto les da la espalda, mientras el hombre sabio los enfrenta. - -[KM3_B] -El Cartel colombiano ha ignorado nuestras repetidas peticiones de que dejen en paz nuestros intereses en Liberty. - -[KM3_C] -Ahora están negociando con los jamaicanos para humillarnos aún más. - -[KM3_D] -Están cerrando un trato en toda la ciudad. - -[KM3_F] -Llévate a uno de mis hombres, roba un coche Yardie y ve a presentar tus respetos a los colombianos. - -[KM3_E] -Nuestro honor demanda que no dejes a nadie vivo. - -[KM3_2] -~g~Ve y recoge a tu contacto. - -[KM3_3] -~g~¡La reunión está teniendo lugar en el estacionamiento del hospital de Rockford! - -[KM3_4] -~r~¡Han escapado! - -[KM3_6] -~g~¡Mátalos, mátalos a todos! - -[KM3_8] -~g~¡Necesitas un coche Yardie para hacer el trabajo! - -[KM3_9] -~r~Uno de los colombianos está muerto, se acabó el trato. - -[KM3_10] -~r~¡El contacto está muerto! - -[KM4_A] -Para ser verdaderamente fuerte es importante que nunca demuestres debilidad. - -[KM4_C] -Ve y recolecta el dinero inmediatamente, para que podamos ingresarlo en las cuentas del casino. - -[KM4_1] -¡No puedo pagarte y no lo haría aunque pudiera! - -[KM4_9] -¡Una banda de jóvenes acaban de arrasar el local! ¡Se han llevado todo! - -[KM4_2] -No servís para nada. - -[KM4_10] -De todas maneras, ¡qué clase de Yakuza eres TÚ? - -[KM4_3] -Esto no es para lo que os pago, tíos. Si quisiera esta clase de protección habría llamado al maldito servicio de policía. - -[KM4_4] -~g~¡Castiga a la banda responsable y recupera el dinero de la protección! - -[KM4_7] -~r~¡El tendero la acaba de palmar! - -[KM4_5] -Donald Love desea que te dejes caer en su jardín de té para que podáis hablar. - -[KM4_6] -¡Aquí está todo el dinero! - -[KM4_8] -~g~¡Maletín recolectado! - -[KM5_A] -¡TÚ! ¡Qué adecuado que elijas este momento para enseñar tu cara culo! - -[KM5_B] -Parece que tus intentos para disuadir a los jamaicanos - -[KM5_B1] -que se conviertan en chicos malos en el Cartel, ¡son totalmente inadecuados! - -[KM5_C] -¡Los camellos Yardie se alinean en las calles de Liberty vendiendo paquetes de SPANK como si fueran perritos calientes! - -[KM5_D] -Estos cerdos del Cartel se están riendo de nosotros, ¡en mi cara! - -[KM5_E] -¡Te daré una última oportunidad para demostrar que la fe que tiene mi hermana en ti tiene una base segura! - -[KM5_F] -¡¡¡Entierra estos sacos de basura y lava tu vergüenza en ríos de la sangre de nuestros enemigos!!! - -[KM5_3] -~r~Fallaste al matar al menos a ~1~ yardies. - -[KM5_4] -~g~Felicitaciones, mataste a ~1~ yardies. - -[KM5_5] -~g~Enhorabuena, mataste ~1~ yardies. ~1~$ EXTRA - -[RM1] -'SILENCIA AL SOPLÓN' - -[RM3] -'POCA EVIDENCIA' - -[RM4] -'DE PESCA' - -[RM5] -'PASTA DE YESO' - -[RM1_D] -Se encuentra bajo protección armada en la propiedad de WitSec, en el centro de Newport, en algún piso que hay detrás del aparcamiento. - -[RM1_E] -Incendia ese lugar, eso les hará salir y podrás cazarlos, asegúrate de que no hable con nadie. - -[RM1_1] -~g~Comprueba la casa de protección de testigos. - -[RM1_2] -~g~¡Saca a McAffrey! - -[RM2_A1] -¡Eh tú, el chaval de ahí! - -[RM2_A] -Un viejo colega del ejército lleva un asunto en Rockford. - -[RM2_D] -Va a necesitar algún respaldo y a cambio te dará cualquier herramienta que compres a precios de ganga. - -[RM2_E] -Ray se adelantó al llamar....pero pensé que serías algo más. - -[RM2_F] -Bien, tres armas son mejor que una, así que hazte con lo que necesites. - -[RM2_G] -~g~¡Ve a echar un vistazo a Phil! - -[RM2_H] -~r~¡¡Han matado a Phil!! - -[RM2_L] -¡Hey! ¡Si hubiera estado de tu bando en Nicaragua quizás todavía conservaría mi brazo! - -[RM2_N] -No te preocupes por el dinero. Ahora lárgate de aquí, yo entretendré a los polis. - -[RM3_D] -Están llevando la prueba por toda la ciudad. - -[RM3_E] -Vas a tener que deshacerte del coche y recoger hasta la última prueba que quede por ahí. - -[RM3_F] -Cuando lo tengas todo, déjalo en el coche y préndele fuego. - -[RM3_G] -Lo vamos a llevar mucho mejor sin este chico. - -[RM3_1] -~g~Deja la prueba en un coche y después préndele fuego. - -[RM3_4] -~g~¡El Fiscal ha retirado la prueba! - -[RM3_6] -~r~¡Las fotos habrán acabado con toda posibilidad de Libertad! - -[RM3_7] -~g~¡Ahora préndele fuego al coche! - -[RM4_A] -Creo que mi socio es una rata. - -[RM4_C] -Casi todas las noches sale a pescar con su barca cerca del faro que hay en Portland Rock. - -[RM4_D] -¡Roba una barca de la policía y asegúrate de que se vengan abajo sus planes de darte una puñalada trapera! - -[RM4_1] -~g~Vete y roba una barca de la policía. - -[RM4_2] -~g~¡Vete al faro y 'liquida' al socio de Ray! - -[RM5_A] -¡Inútil de mierda! - -[RM5_A1] -¡Eres un absoluto imbécil! Tengo el culo a tiro y ni siquiera eres capaz de matar a una maldita mosca. - -[RM5_B] -¡Te he pagado una pasta para que mates al testigo y aún sigue vivo! - -[RM5_B1] -¡Y hoy va a declarar ante los Federales! - -[RM5_C] -Le van a llevar de un momento a otro del Hospital General Carson a Rockford. - -[RM5_D] -Si se chiva, yo canto.... - -[RM5_E] -¡así que vete y haz el trabajo por el que se te pagó! - -[RM5_1] -~g~¡¡Detén la ambulancia!! - -[RM5_2] -~g~¡¡Te han chafado!! - -[RM5_3] -~g~¡Ha sido una trampa! - -[RM5_4] -~g~¡¡Las balas no van a atravesar ese chaleco antibalas!! - -[RM5_5] -~g~¡¡Ese chaleco antibalas es a prueba de fuego!! - -[RM5_7] -~r~¡¡Han llevado al testigo!! - -[RM5_8] -~g~¡¡El testigo se ha ahogado!! - -[LOVE2] -'¡EXTERMINA A WAKA-GASHIRA!' - -[LOVE3] -'UNA GOTA EN EL OCÉANO' - -[LOVE1_A] -Antes que nada, déjame que te agradezca que te hayas ocupado de ese asunto personal. - -[LOVE1_F] -La gente tiende a malinterpretar las cosas últimamente. - -[LOVE1_D] -Están intentando sacarme más de lo pactado, pero no soy precisamente partidario de revisar los tratos. - -[LOVE1_E] -Un trato es un trato, así que no van a ver ni un duro mío. - -[LOVE1_G] -Ve a rescatar a mi amigo, haz lo que haga falta. - -[LOVE1_2] -~g~Rescata al Anciano Caballero Oriental. - -[LOVE1_3] -~g~Lleva de vuelta al edificio de Donal Love al Anciano Caballero Oriental. - -[LOVE1_4] -~g~El Anciano Caballero Oriental debe estar en uno de los aparcamientos.... - -[LOVE1_6] -~r~¡Las tripas del Anciano Caballero Oriental están esparcidas por las calles! - -[LOVE1_7] -~g~Sólo se abrirá la puerta para un coche de la Banda Colombiana. - -[LOVE2_A] -No hay nada como una de esas guerras de bandas pasadas de moda para hacer que bajen los precios de la vivienda, - -[LOVE2_B] -excepto desencadenar una plaga......pero eso sería llegar demasiado lejos en este caso. - -[LOVE2_C] -He observado que Yakuza y los Colombianos no son precisamente buenos amigos. - -[LOVE2_D] -Vamos a aprovechar las posibilidades de negocio que se presentan. - -[LOVE2_E] -Quiero que mates a Kanji Kase, el WAKA-cuchillera de Yakuza. - -[LOVE2_F] -Kenji está asistiendo a una reunión en lo alto del aparcamiento de los almacenes de Newport. - -[LOVE2_G] -¡Hazte con un coche de la banda del Cartel y elimínalo! - -[LOVE2_H] -El Yakuza debe culpar al Cartel por esta declaración de guerra. - -[LOVE2_1] -~g~¡Ve a Fort Staunton y roba un coche de la banda de los colombianos! - -[LOVE2_2] -~g~¡Ahora ve a los ~p~almacenes de Newport~g~ y cárgate a Kenji! - -[LOVE2_3] -~r~¡Si lo haces sin un coche del Cartel te identificarán! - -[LOVE2_4] -~r~¡¡El Yakuza te ha identificado!! - -[LOVE2_6] -~r~¡¡Has matado a todos los testigos!! - -[LOVE3_A] -En estos días de hipocresía moral ciertos artículos pueden resultar difíciles de importar. - -[LOVE3_C] -Echará varios paquetes en el agua. - -[LOVE3_D] -Asegúrate de que los recoges antes que nadie más lo haga. - -[LOVE3_1] -~g~¡Consigue una ~r~barca~g~ y sigue al ~y~avión~g~! - -[LOVE4] -'GRAN LADRÓN AÉREO' - -[LOVE5] -'SERVICIO DE ESCOLTA' - -[LOVE4_A] -Gracias por hacerte con esos paquetes, pero no eran más que una trampa. - -[LOVE4_B] -Lo siento, pero a veces así son los negocios. - -[LOVE4_C] -Mi objetivo real se ocultaba por completo en el avión. - -[LOVE4_F] -Tengo sobornados a los oficiales. - -[LOVE4_1] -~r~¡Está aquí el Cartel Colombiano!! - -[LOVE4_2] -~g~¡Ha desaparecido el paquete! Sigue la pista a los colombianos y recupéralo. - -[LOVE4_3] -~g~¿Construcción Panlántica ...? - -[LOVE4_5] -~g~El paquete debería estar en el avión.... - -[LOVE4_6] -~g~¡Sube en el ascensor a lo alto de la torre! - -[LOVE5_B] -Mi amigo Oriental va a necesitar una escolta mientras trata de comprobar si mi última adquisición es auténtica o no. - -[LOVE5_1] -~g~¡Vamos! - -[LOVE5_2] -~g~¡Vas a necesitar un coche! - -[LOVE5_3] -~g~¡Sigue hasta que puedas encontrar la salida del túnel! - -[LOVE5_4] -~r~¡Protege el camión! - -[RM6] -'HOMBRE SEÑALADO' - -[RM6_A] -¿No te han seguido? Bien. - -[RM6_B] -Así de fácil, ¡no tengo dónde meterme y me estoy empezando a hundir aquí mismo! - -[RM6_D] -Soy un hombre señalado, así que tengo que largarme de aquí. - -[RM6_E] -¡Consigue que no pierda mi vuelo en el aeropuerto y haré que haya merecido la pena tu trabajo! - -[RM6_666] -Cuida de mi Patriot a prueba de balas. Nos vemos en Miami, Ray - -[CAT1] -'RESCATE' - -[CAT2] -'EL INTERCAMBIO' - -[CAT1_A] -Tengo a la preciosa María. No creo que quieras que su cara parezca como si se hubiera enfadado con el carnicero. - -[CAT2_F] -Me he roto una uña y se me ha estropeado el peinado. Es increíble. ¡Me había costado 50 $! - -[CAT2_G] -Tenía tanto miedo, pero entonces me dije a mí misma, ahora eres una gran chica. - -[CAT2_H] -Oh, nos lo vamos a pasar a lo grande, porque, ¿sabes?, mi hermana dijo que quería venirse a vivir con sus dos hijos, - -[CAT2_I] -porque su marido a vuelto a enredar por ahí y..... - -[CAT1_C] -XXXX - -[CAT1_D] -XXXX - -[CAT1_E] -XXXX - -[CAT1_F] -¡Ve a donde está Catalina antes de que se acabe el tiempo! - -[CAT1_G] -XXXX - -[CAT1_H] -XXXX - -[CAT1_I] -XXXX - -[CAT1_J] -XXXX - -[CAT1_K] -XXXX - -[CAT1_L] -XXXX - -[AS4_1] -XXXX - -[CAT_MON] -~g~Todavía no tienes suficiente dinero. Necesitas 500.000 $. - -[BITCH_D] -~g~¡María está muerta! - -[WEATHER] -FORZAR EL CLIMA - -[WEATHE2] -CLIMA NORMAL - -[8001] -¡¡Has fallado miserablemente!! - -[1000] -ESTÁS MUERTO - -[1001] -ESTÁS MUERTO - -[1002] -ESTÁS MUERTO - -[1003] -ESTÁS MUERTO - -[1004] -ESTÁS MUERTO - -[1005] -AVERIADO - -[1006] -AVERIADO - -[1007] -AVERIADO - -[1008] -AVERIADO - -[1009] -AVERIADO - -[GA_4] -Las bombas de coche valen 1000 $ cada una - -[GA_5] -Tu coche ya tiene instalada una bomba. - -[GA_6] -Apárcalo, prepáralo pulsando el ~h~botón ~k~~PED_FIREWEAPON~~w~ y SAL POR PATAS! - -[GA_7] -Arma con el ~h~botón ~k~~PED_FIREWEAPON~~w~. La bomba estallará cuando se arranque el motor. - -[GA_8] -Utiliza el detonador para activar la bomba. - -[GA_9] -Ha conseguido ~1~de los 10 coches especiales - -[GA_10] -Buen ejemplar. Aquí tienes tus ~1~$ - -[GA_11] -Las ruedas ya están listas. ¡No sirve para nada! - -[GA_12] -Bomba armada - -[GA_13] -Entregado como un profesional. Completa la lista y conseguirás una bonificación. - -[GA_14] -Todos los coches. ¡ESTUPENDO! Aquí hay algo para ti. - -[GA_15] -Espero que te guste el nuevo color. - -[GA_16] -Repintarlo es adicional. - -[GA_19] -No nos interesa ese modelo. - -[GA_20] -Tenemos de esos más de los que podamos ocuparnos. Lo siento, tío, no hay negocio. - -[CR_1] -La grúa no puede levantar este vehículo. - -[PU_MONY] -No tienes suficiente dinero. - -[CO_ALL] -Los tienes todos. Aquí hay algo para ti... - -[PAUSED] -JUEGO EN PAUSA GAME PAUSED - -[HEALTH1] -¡Lárgate de aquí! Estás completamente sano. - -[HEALTH2] -La salud cuesta dinero. - -[HEALTH3] -Te pondré como nuevo. - -[HEALTH4] -Eso te va a costar 250 $. - -[FEB_STA] -Estadísticas - -[FEB_BRI] -Informes - -[FEB_CON] -Controles - -[FEB_AUD] -Sonido - -[FEB_DIS] -Pantalla - -[FEB_LAN] -Idioma - -[FEP_STA] -ESTADÍSTICAS - -[FEP_BRI] -INFORMES - -[FEP_CON] -CONTROLES - -[FEP_AUD] -SONIDO - -[FEP_DIS] -PANTALLA - -[FEP_LAN] -IDIOMA - -[FEF_ST1] -¿Quién es el malo? - -[FEF_ST2] -Cuánta destrucción has producido - -[FEF_BR1] -¿Has perdido el hilo? - -[FEF_CO1] -¿Necesitas más control, pirado? - -[FEF_CO2] -Elige la mejor configuración del mando para tu estilo de juego - -[FEF_SA1] -¡Mantén tu sitio en el bloque! - -[FEF_SA2] -Guarda y carga tus partidas - -[FEF_AU1] -¡Pon el volumen a tope! - -[FEF_AU2] -Elige una emisora de radio y un efecto de sonido - -[FEF_DI1] -¡Cambia el juego! - -[FEF_DI2] -Personaliza el juego para tu televisión - -[FEF_LA1] -¿Qué dices de los willis? - -[FEF_LA2] -Elige la forma de hablar que prefieras - -[FEB_PMB] -Informes de la Misión Previa: - -[FEC_NA] -No Disponible - -[FEC_CWL] -Cambiar al Arma izquierda - -[FEC_CWR] -Cambiar al Arma izquierda - -[FEC_LOF] -Mirar hacia delante - -[FEC_TAR] -Objetivo - -[FEC_MOV] -Movimiento - -[FEC_CAM] -Modos de Cámara - -[FEC_PAU] -Pausa - -[FEC_ENV] -Entrar al vehículo - -[FEC_JUM] -Saltar - -[FEC_ATT] -Ataque o Arma de Fuego - -[FEC_RUN] -Correr - -[FEC_FPC] -Cámara en primera persona - -[FEC_LL] -Mirar a la izquierda - -[FEC_LB1] -Mirar - -[FEC_LB2] -detrás - -[FEC_LB] -Mirar detrás - -[FEC_LR] -Mirar a la derecha - -[FEC_HOR] -Bocina - -[FEC_VES] -Control del vehículo - -[FEC_RSC] -Cambiar de emisora de Radio - -[FEC_BRA] -Freno o Marcha Atrás - -[FEC_HAB] -Freno de mano - -[FEC_CAW] -Arma del coche - -[FEC_ACC] -Acelerar - -[FEC_SMT] -Activar misión especial - -[FEC_CCF] -Configuración: - -[FEC_CF1] -Ajuste1 - -[FEC_CF2] -Ajuste2 - -[FEC_CF3] -Ajuste3 - -[FEC_CF4] -Ajuste4 - -[FEC_CDP] -Pantalla del mando: - -[FEC_ONF] -A Pie - -[FEC_INC] -En Coche - -[FEC_VIB] -Vibración: - -[FEA_OUT] -Salida: - -[FEA_ST] -Estéreo - -[FEA_MNO] -Mono - -[FEA_NON] -Ninguna - -[FEA_FM0] -HEAD RADIO - -[FEA_FM1] -DOUBLE CLEFF FM - -[FEA_FM2] -K-JAH RADIO - -[FEA_FM3] -RISE FM - -[FEA_FM4] -LIPS 106 - -[FEA_FM5] -GAME FM - -[FEA_FM6] -MSX FM - -[FEA_FM7] -FLASHBACK 95.6 - -[FEA_FM8] -CHATTERBOX 109 - -[FED_DBG] -Menú de Depuración - -[FED_RID] -Recargar IDE - -[FED_RIP] -Recargar IPL - -[FED_PAH] -Analizar pila - -[FED_RCD] -CCullZones::RecalculateCullZoneData - -[FED_DFL] -CTheScripts::DbgFlag - -[FED_DLS] -Activada la Luz de Depuración Blanca Grande - -[FED_SPR] -Mostrar Grupos de Carretera Ped - -[FED_SCR] -Mostrar Grupos de Carretera de Coches - -[FED_SCZ] -Mostrar Zonas 'A escoger' - -[FED_DSR] -Compilar las Solicitudes de Streaming - -[FED_SCP] -gbShowCollisionPolys - -[FEM_MCM] -Memory Card Menu - -[FEM_RMC] -Registrar MemCard Uno - -[FEM_TFM] -Probar Formato de MemCard Uno - -[FEM_TUM] -Probar Memcard Uno SinFormato - -[FEM_CRD] -Crear Dir Raiz - -[FEM_CLI] -Crear y Cargar Iconos - -[FEM_FFF] -Llenar Primer Archivo con Necedades - -[FEM_SOG] -Guardar Sólo El Juego - -[FEM_CES] -Comprobar Cada 0kBpara Guardar - -[FEM_STG] -Guardar El Juego - -[FEM_STS] -Guardar El Juego bajo el nombre GTA3 - -[FEM_CPD] -Crear copia protegida del directorio Revista - -[FEM_MC2] -Memory Card Menu 2 - -[FEM_TS] -Probar Guardar: - -[FEM_TL] -Probar Guardar: - -[FEM_TD] -Probar Borrar: - -[PL_STAT] -Estadísticas del jugador - -[PE_WAST] -Personas que has dilapilado - -[PE_WSOT] -Personas dilapiladas por otros - -[CAR_EXP] -Coches explotados - -[TM_BUST] -Tiempos no conseguidos - -[M_WASTE] -Hombres civiles dilapilados - -[F_WASTE] -Mujeres civiles dilapiladas - -[PIG_WST] -Polis dilapilados - -[GNG_WST] -Miembros de bandas dilapilados - -[MED_WST] -Personal médico dilapilado - -[FIRE_WS] -Bomberos empleados - -[DED_CRI] -Criminales dilapilado - -[DED_DED] -Vagos dilapilados - -[DED_HOK] -Prostitutas dilapiladas - -[HEL_DST] -Helicópteros destruidos - -[PER_COM] -Porcentaje cumplido - -[KGS_EXP] -Kgs de explosivos empleados - -[ACCURA] -Puntería - -[ELBURRO] -Mejor tiempo de Turismo en segundos - -[CAR_CRU] -Coches destrozados - -[HED_EX] -Cabezas explotadas - -[TM_DED] -Visitas al hospital - -[DAYSPS] -Días de juego transcurridos - -[MMRAIN] -mm de lluvia caídos - -[MXCARD] -Máx. dist. Salto INSANO (pies) - -[MXCARJ] -Máx. altitud Salto INSANO (pies) - -[MXCARDM] -Máx. dist. Salto INSANO (metros) - -[MXCARJM] -Máx. altura Salto INSANO (metros) - -[MXFLIP] -Máx. vueltas Salto INSANO - -[MXJUMP] -Máx. rotación Salto INSANO - -[BSTSTU] -Mejor maniobra INSANA hasta ahora: - -[INSTUN] -Maniobra Insana - -[PRINST] -Maniobra insana perfecta - -[DBINST] -Maniobra insana doble - -[DBPINS] -Maniobra insana doble perfecta - -[TRINST] -Maniobra insana triple - -[PRTRST] -Maniobra insana triple perfecta - -[QUINST] -Maniobra insana cuádruple - -[PQUINS] -Maniobra insana cuádruple perfecta - -[NOSTUC] -Ninguna maniobra insana completada - -[NOUNIF] -Saltos Únicos completados - -[NOUNGM] -Total de Saltos Únicos - -[NMISON] -Misiones intentadas - -[NMMISP] -Misiones conseguidas - -[PASDRO] -Pasajeros tirados en marcha - -[MONTAX] -Dinero conseguido en taxi - -[DAYPLC] -Gasto diario en policias - -[CRIMRA] -Porcentaje criminal: - -[GMSTOR] -Almacén de Juego - -[PREBRF] -Informes Previos - -[CNTLS] -Controles - -[MUSMEN] -Música / Efectos Especiales - -[GAMSET] -Ajustes del Juego - -[LANGUA] -Idioma - -[DSPLAY] -Pantalla - -[DEBUGM] -Menú de Depuración - -[QUITOP] -Salir de las Opciones - -[CONTRL] -Configuración de Control - -[SET1EN] -Ajuste 1. Activado - -[SET1] -Ajuste 1. - -[SET2EN] -Ajuste 2. Activado - -[SET2] -Ajuste 2 - -[SET3EN] -Ajuste 3. Activado - -[SET3] -Ajuste 3 - -[SET4EN] -Ajuste 4. Activado - -[SET4] -Ajuste 4 - -[GOBACK] -Volver - -[SOUND] -SONIDO - -[MUSVOL] -Volumen de la Música - -[SFXVOL] -Volumen de los Efectos Especiales - -[SCROPT] -OPCIONES DE PANTALLA - -[CTRSCR] -Centrar Pantalla - -[SCRFOR] -Formato de Pantalla - -[GMSVLQ] -JUEGO GUARDAR-CARGAR-SALIR - -[GMREST] -Reiniciar Juego - -[GMLOAD] -Cargar Juego - -[NOGMSV] -Sólo puedes guardar desde tu escondite. - -[DLFILE] -Borrar Archivos de Grand Theft Auto III - -[CHFILE] -ELEGIR ARCHIVO A CARGAR - -[CHCDLD] -Elegir Tarjeta desde la que Cargar - -[CDUNFR] -Tarjeta sin formato. - -[CHFIDL] -ELIGE UN ARCHIVO A BORRAR - -[SVCONF] -CONFIRMACIÓN DE GURDAR - -[SVFNAM] -El nombre de tu archivo guardado es - -[SAVEDN] -Error. Fallo al guardar. - -[LANGSL] -SELECCIÓN DEL IDIOMA - -[ENGLIS] -Inglés - -[GERMAN] -Alemán - -[ITALIA] -Italiano - -[FRENCH] -Francés - -[SPAIN] -Español - -[RELIDE] -ReLoadIde - -[RELIPE] -ReLoadIpl - -[PARSHP] -Analizar Pila - -[DBGFON] -Activado CTheScripts::DbgFlag - -[DBFOFF] -Desactivado CTheScripts::DbgFlag - -[BGWHON] -Activada Luz Blanca Grande de Depuración - -[BGWOFF] -Desactivada Luz Blanca Grande de Depuración - -[DSTRON] -Activadas Solicitudes de Depuración de Streaming - -[DSTROFF] -Desactivadas Solicitudes de Depuración de Streaming - -[PDRGON] -Activado ShowPedRoadGroups - -[PRGOFF] -Desactivado ShowPedRoadGroups - -[CRRGON] -Activado ShowCarRoadGroups - -[CRGOFF] -Desactivado ShowCarRoadGroups - -[CLZOON] -Activado Mostrar Zonas a escoger - -[CLZOOF] -Desactivado Mostrar Zonas a escoger - -[SHPLON] -gbShowCollisionPolys Sí - -[SHPLOF] -gbShowCollisionPolys No - -[CULREC] -CCullZones::RecalculateCullZoneData() - -[FORMM1] -FormatMemCard 1 (materialprueba) - -[UNFRM1] -UnFormatMemCard 1 (materialprueba) - -[GORLEV] -Nivel Gore - -[SICASS] -Joder de mala manera - -[SICSIC] -Cabrón fastidioso - -[SCASSL] -Seleccionado Joder de mala manera - -[SCSCSL] -Seleccionado Cabrón fastidioso - -[PRVMEN] -Informes de Misiones Previas - -[DOSVGM] -¿Deseas guardar el juego? - -[FORMEN] -Menú de Formato - -[MEMTST] -Pantalla MemoryCardTest - -[REGCAR] -Registrar MemoryCard Uno - -[TEFONE] -Probar Formato de MemCard Uno - -[TEUFON] -Probar MemCard Uno sin formato - -[CRROOT] -CreateRootDir - -[CRLDIC] -Crear y Cargar Iconos - -[FLFSGF] -Llenar Primer Archivo Con Necedades - -[PUSAVE] -Guardar Sólo el juego - -[CHEVOK] -CheckEveryOkB4Save - -[SVGMON] -SaveTheGame - -[CNTSAV] -No se puede guardar el juego. En una misión. - -[CNCSAV] -No se puede guardar el juego. Estás en un coche - -[CRMGSV] -Crear directorio de revista con protección de copia - -[MGSVNC] -No Creado MagazineDirectory - -[MGSVCN] -Creado MagazineDirectory - -[YES] -Sí - -[NO] -No - -[X] -x - -[LAST] -Último Mensaje - -[FEDS_XB] -Seleccionar - -[FEDS_ST] -Botón START - CONTINUAR - -[FEST_OO] -de - -[FEC_TUC] -Control de Torreón - -[FEC_SM3] -Activador de Misión Espacial (botón R3) - -[FEC_RS3] -Cambiar de emisora de Radio (botón L3) - -[FEC_HO3] -Bocina (botón L3) - -[DIAB1] -'TURISMO' - -[DIAB2] -'YO GRITO, TU GRITAS' - -[DIAB3] -'JUICIO POR FUEGO' - -[DIAB4] -'GRANDE Y VENOSO' - -[DIAB1_A] -El burro quiere ofrecerte una oportunidad. Ve al teléfono público de Hepburn Heights si quieres más información. - -[DIAB1_C] -Participas en una carrera desagradable. Pásate por el teléfono público de nuevo y puede que 'El Burro' tenga algo de trabajo para ti. - -[DIAB1_1] -~g~3...2...1... ¡VAMOS VAMOS VAMOS! - -[DIAB1_4] -~g~Hazte con un coche rápido y ve a la cuadrícula de inicio. - -[DIAB1_3] -~r~No podrías ganar ni una rifa, ¡FRACASADO! - -[DIAB1_2] -~g~Felicidades, ganaste con un tiempo increíble de ~1~ segundo. - -[FIRST] -~g~ Primero (or ~g~1o) - -[SECOND] -~g~ Segundo (or ~g~2o) - -[THIRD] -~g~ Tercero (or ~g~3o) - -[FOURTH] -~g~ Cuarto (or ~g~4o) - -[DIAB2_1] -~g~ Recoge el maletín en Harwood. - -[DIAB2_2] -~g~ Encuentra una furgoneta de helados. - -[DIAB2_3] -~g~ Aparca la furgoneta de helados en Atlantic Quays. - -[DIAB2_4] -~g~ Pulsa el ~w~ botón ~k~~VEHICLE_HORN~~g~ para activar el jingle del helado. - -[DIAB2_6] -~g~ Pulsa el ~w~ botón ~k~~VEHICLE_HORN~~g~ para activar el jingle del helado. - -[DIAB2_7] -~g~ Pulsa el ~w~ botón ~k~~VEHICLE_HORN~~g~ para activar el jingle del helado. - -[DIAB2_5] -~g~ Sal de la furgoneta y luego usa el mando a distancia para detonar la furgoneta del helado. - -[YD1] -'PELEA BLING-BLING' - -[YD2] -'JINETE CON UZI' - -[YD3] -'REUNIÓN DE COCHES DE GANGSTERS' - -[YD4] -'LLEGÓ EL REINADO' - -[YD_P] -El Rey Courtney quiere hablarte. ¡¡Ve al teléfono público de Aspatria!! - -[YD1_A] -~w~Este es el Rey Courtney - -[YD1_A1] -~w~Mi banda Yardie necesita un conductor y tú tienes reputación de ser hábil al volante. - -[YD1_B] -~w~Ve al basurero que hay detrás del estadio y en un coche espera a los otros candidatos. - -[YD1_C] -~w~Tengo hombres vigilando los puestos de control en todo Staunton. - -[YD1_D] -~w~El primer conductor que llegue a un puesto de control se lleva un billete de los grandes, luego hay que ir a la siguiente parada. - -[YD1_D1] -~w~Si ganas más puestos de control que cualquier otro conductor, podría tener algo de trabajo para ti. - -[YD1_E] -~g~Preparado para una carrera! - -[YD1_F] -~g~Te saltaste el comienzo -¡Me gusta tu estilo!! - -[YD1_G] -~r~Esto es una CARRERA DE COCHES. ¡Necesitas un COCHE, idiota! - -[YD1GO] -~g~VAMOS!! - -[YD1_1] -~r~1 - -[YD1_2] -~r~2 - -[YD1_3] -~r~3 - -[YD1_BON] -¡¡1.000$!! - -[Y1_1ST] -~G~¡Llegaste el primero con ~1~ exitosos puestos de control! - -[Y1_2ND] -~y~Segundo con ~1~ exitosos puestos de control. ~y~Cerca, pero ¡no eres el mejor! - -[Y1_3RD] -~r~Tercero con ~1~ exitosos puestos de control. ~r~¡Creí que dijiste que eras bueno! - -[Y1_LAST] -~r~¡Fuiste el último! ~r~¡Malgastaste mi tiempo, IDIOTA! - -[Y1_J1ST] -~y~Empatado el primero con ~1~ exitosos puestos de control. ~y~Bien, pero ¡debes ser el mejor si quieres conducir para la Reina Lizzy! - -[Y1_J2ND] -~r~Empatado el segundo con ~1~ exitosos puestos de control. ¡Conduces como un mono loco! - -[Y1JLAST] -~r~¡Empatado el último! Hablas como un conductor, pero conduces como un hablador! - -[Y1_TEST] -COCHE AL AGUA!! - -[YD2_A] -~w~Necesito ver si eres capaz de hacer mi trabajo sucio. - -[YD2_A1] -~w~A ver si se puede confiar en ti. - -[YD2_B] -~w~Dos de mis chicos estarán allí en cualquier momento para llevarte de paseo, - -[YD2_B1] -~w~a ver si eres quien dices que eres. - -[YD2_C] -~w~Nos vamos a dar un pequeño paseo a Hepburn Heights, acabaremos con los asquerosos Diablos que han estado metiéndose con la Reina Lizzy. - -[YD2_CC] -~w~Toma, necesitaras una 'pieza' - -[YD2_D] -~w~Tú te ocupas de conducir y disparar. Nosotros nos aseguraremos de que no te entren dudas. - -[YD2_E] -~w~¡Vamos a conducir! - -[YD2_F] -~r~Ha obtenido la libertad bajo fianza con nuestra pasta, ¡dispara a su culo amarillo!!! - -[YD2_G1] -~w~Hepburn Heights... Vamos a matar algunos asquerosos Diablos... - -[YD2_G2] -~w~Pero recuerda, ~r~¡No salgas de este coche!! - -[YD2_H] -~w~VALE, Llévanos de vuelta a territorio Yardie! VAMOS VAMOS VAMOS!!! - -[YD2_L] -~w~¡Lo hiciste bien, Reaperman! - -[YD2_M] -~r~¡Ha destrozado mi coche! ¡Liquidale! - -[YD2_N] -~w~¡Vuelve a poner tu culo en este coche! - -[YD3_A] -Quiero que empujes algunos coches de gangsters - -[YD3_A1] -para que podamos dar el golpe en territorio enemigo. - -[YD3_B] -Necesito un Mafia Sentinel, - -[YD3_B1] -un Yakuza Stinger y un - -[YD3_B2] -Diablo Stallion para poder dar a cualquier gangster de Liberty. - -[YD3_C] -Déjales en el garaje de Newport y recuerda, - -[YD3_C1] -¡¡aniquilados no nos son de utilidad !! - -[YD3_D] -Nivel de texto sobrante - -[YD3_E] -~r~¡Ya le has dado a un coche de gangsters, diablo! - -[YD3_F] -~r~¡Ya le has dado a un coche de gangsters Mafia! - -[YD3_G] -~r~¡Ya le has dado a un coche de gangsters Yakuza! - -[YD3_H] -~g~¡Coche de gangsters Diablo empujado! - -[YD3_I] -~g~¡Coche de gangsters Mafia empujado! - -[YD3_J] -~g~¡Coche de gangsters Yakuza empujado! - -[YD3_K] -~r~¡El coche está casi destrozado!¡Haz que lo reparen! - -[YD3_L] -~g~¡Llevalo al ~p~ garaje! - -[YD3_M] -~r~¡Lo volcaste! ¡Consigue otro! - -[YD4_A] -¡Escucha! - -[YD4_A1] -Pásate por Bedford Point. - -[YD4_A2] -¡Hay un cargamento en un viejo coche y lo necesito pronto! - -[YD4_B] -CARTA: He oído que has sido un chico aplicado. Bien, yo he sido una chica aplicada. - -[YD4_C] -Creo que es hora de que seas testigo del poder real del ¡'SPANK'! Besos y abrazos, Catalina, xxx - -[YD4_D] -POSDATA: ¡¡MUERE PEEG DOG, MUERE!! - -[YD4_1] -¡¡Te hemos pellado necio!! - -[YD4_2] -¡¡Destruye las furgonetas de SPANK - -[HM_1] -'DINERO UZI' - -[HM_2] -'TOYMINATOR' - -[HM_3] -'PREPARADO PARA ESTALLAR' - -[HM_5] -'REDOBLE' - -[HOOD1_A] -Ve al teléfono público de Wichita Gardens y hablaremos de negocios. - -[HM1_A] -¡Tío, Soy D-Ice de los Red Jacks! - -[HM1_C] -Esos jovenes macarras, salen a la calle y no tienen nada más que pistolas y SPANK en sus cabezas. - -[HM1_3] -~g~Los 'Nines' tienen su territorio en Wichita Gardens. - -[HM2_3] -Si golpeas las ruedas de un vehículo el RC buggy ¡se detonará! - -[HM2_4] -Si se sale fuera de cobertura el RC buggy ¡se detonará! - -[HM2_5] -~r~¡Fuera de cobertura! - -[HM3_1] -~g~Ve al garaje pero pon atención porque si el coche se daña demasiado ¡explotará! - -[HM3_2] -~g~Lleva el coche de vuelta, tiene que estar en perfectas condiciones ¡sin daños! - -[HM3_3] -~g~¡Haz que reparen el coche! - -[HM4_D] -~g~¡Hazte con un vehículo! - -[HM4_E] -NO MAS TEXTO REQUERIDO - -[HM4_1] -~g~Dirígete al lugar donde el cargamento ha sido esparcido, necesitas conseguir 30 lingotes de oro. - -[HM4_2] -~g~Recuerda, cuando el vehículo es demasiado pesado y lento ve al garaje y deja el cargamento. - -[HM5_3] -~r~¡Te han dicho que uses sólo un bate de béisbol! - -[HM5_4] -~r~¡Tu contacto está muerto! - -[MEA1] -'EL CRIMINAL' - -[MEA2] -'LOS LADRONES' - -[MEA3] -'LA MUJER' - -[MEA4] -'SU AMANTE' - -[MEAT1_A] -Un amigo dijo que tú podías arreglar algunos problemas que tengo. Ve al teléfono público de Trento si crees que puedes ayudar. - -[MEA1_B3] -~g~Ve y reúnete con el Director del Banco. - -[MEA1_B6] -~g~Lleva el coche a la trituradora para eliminar las evidencias, sal del coche y la grúa lo recogerá. - -[MEA1_1] -~r~¡El director del banco está muerto! - -[MEA1_2] -~r~¡Te dijeron que trituraras el coche! - -[MEA1_3] -~g~¡Sal del coche! - -[MEA1_4] -~r~Has dejado atrás al director del banco! - -[MEA2_B3] -~g~Ve a encontrarte con los ladrones. - -[MEA2_B4] -~g~Llévalos a la fábrica de comestibles Bitch'n'Dog - -[MEA2_B6] -~g~Haz que repinten el coche para eliminar cualquier evidencia. - -[MEA2_1] -~r~¡Te dijeron que trituraras el vehículo! - -[MEA2_2] -~r~¡Un ladrón ha muerto! - -[MEA2_4] -~r~¡Has dejado atrás a un ladrón! - -[MEA3_B3] -~g~Ve y recoge a la Sra. Chonks - -[MEA3_B6] -~g~Llévate el coche y tíralo al mar, así eliminaremos cualquier evidencia. - -[MEA3_1] -~r~¡La mujer está muerta! - -[MEA3_2] -~r~¡Se suponía que ibas a tirar el vehículo al agua! - -[MEA3_3] -~r~¡Has dejado atrás a su mujer! - -[MEA4_B3] -~g~Recoge al amante de su mujer. - -[MEA4_B6] -Es demasiado tarde para eso, Marty. Tuviste tu oportunidad, pero ahora yo me ocuparé del negocio... - -[MEA4_1] -~r~¡Carlos está muerto! - -[MEA4_3] -~r~¡Has dejado atrás a Carlos el prestamista! - -[LOOK_A] -Pulsa y mantén pulsado el ~h~botón ~k~~VEHICLE_LOOKLEFT~~w~ o el ~h~botón ~k~~VEHICLE_LOOKRIGHT~~w~ para mirar ~h~ a la izquierda ~w~ o ~h~ a la derecha ~w~ mientras te encuentres en un vehículo. Pulsa ambos para mirar ~h~ atrás ~w~. - -[LOVE6_1] -~g~¡Ahora llévate a los policías lejos del almacén! - -[LOVE6_2] -~r~¡No conseguiste llevar lejos a la policía! - -[RM4_3] -¡El socio de Ray ha escapado! - -[RM6_C] -La CIA parece tener intereses creados con el SPANK - -[RM6_C1] -y a ellos no les gusta que nos metamos con el Cartel. - -[C_PASS] -¡AMENAZA ELIMINADA! - -[CTUTOR] -Pulsa el ~h~botón ~k~~TOGGLE_SUBMISSIONS~~w~ para activar o no misiones Vigilante. - -[CTUTOR2] -Pulsa el ~h~botón ~k~~TOGGLE_SUBMISSIONS~~w~ para activar o no misiones Vigilante. - -[COPCART] -~g~Tienes ~1~ segundos para retornar a un vehículo de la policía antes de que termine la misión. - -[C_FAIL] -¡Misión Vigilante terminada! - -[C_CANC] -~r~¡Misión Vigilante cancelada! - -[C_ESCP] -~r~¡El sospechoso ha escapado! - -[C_TIME] -~r~¡Tu trabajo como defensor de la ley ha terminado! - -[C_VIGIL] -¡¡BONO VIGILANTE!! - -[A_FAIL2] -~r~¡Tu falta de urgencia ha sido fatal para el paciente! - -[A_FAIL3] -~r~¡¡El paciente está muerto!! - -[A_PASS] -¡Rescatado! - -[F_FAIL2] -~r~¡Llegas demasiado tarde! - -[A_COMP2] -¡Nunca te cansarás! - -[RM2_M] -Si necesitas un poco de pólvora pasa por aquí y coge lo que necesites de las taquillas. - -[HEAL_A] -Tu ~h~salud ~w~ está marcada en naraja en la parte superior derecha de la pantalla. - -[YD1_CNT] -¡~1~ de 15! - -[FM1_9] -~g~Esa de allí es la fiesta, deja a María enfrente. - -[FM1_Y] -~w~Quiero que sepas que me lo he pasado muy bien por primera vez en mucho tiempo, y que me has tratado muy bien. Con respeto y todo eso. - -[FM1_AA] -~w~Oh, será mejor que me vaya. Espero que nos veamos pronto. - -[NOCONTE] -Por favor vuelve a conectar el mando analógico (DUALSHOCK#) o mando analógico (DUALSHOCK#2) al puerto de mando 1 para continuar. - -[WRCONT] -El mando conectado al puerto de mando 1 es un mando no soportado. Grand Theft Auto III necesita un mando analógico (DUALSHOCK#) o mando analógico (DUALSHOCK#2). - -[WRCONTE] -El mando conectado al puerto de mando 1 es un mando no soportado. Grand Theft Auto III necesita un mando analógico (DUALSHOCK#) o mando analógico (DUALSHOCK#2). - -[WRONGCD] -Disco incorrecto. Por favor inserta el disco correcto. - -[NOCD] -La bandeja del disco está vacía. Por favor inserta un disco. - -[OPENCD] -La bandeja del disco está abierta. Por favor ciera la bandeja de disco. - -[CDERROR] -Error al leer el DVD de Grand Theft Auto III - -[RESTART] -Empezando una juego nuevo - -[GA_3] -¡No hay más freebies. 1000$ para repintar! - -[GA_1] -¡Uauhh! ¡No toco nada TAN caliente! - -[GA_1A] -Regresa cuando no estés tan ocupado... - -[S_PROM2] -El garaje de al lado puede alojar un vehículo cuando tú guardas tu partida. - -[STOCK] -mercancía agotada - -[FM1_O] -~w~Creo que está en la estación de ferrocarril del muelle de Chinatown. - -[EBAL_B] -Este es el lugar, justo aquí, dejemos la calle y ¡encontremos un cambio de ropas! - -[EBAL_G] -Este es el club de Luigi. Vamos por la parte de atrás y usemos la puerta de servicio. - -[AM4_3] -¡Tú debes de ser el nuevo chico de los recados de Asuka! - -[AM4_4] -¿Tienes el dinero? ¿Está todo aquí? - -[AM4_5] -Ya sé lo que estás pensando, otro policía corrupto. - -[AM4_6] -Bueno, éste es un mundo corrupto. - -[AM4_7] -Sólo porque perdí un par de socios, esos mamones de asuntos internos han empezado a meter las narices. - -[AM4_8] -Cuento con que pueden pillarme. - -[AM4_9] -Bien, esta ciudad es una gran alcantarilla. - -[AM4_10] -Pero voy a necesitar un poco de ayuda fuera del sindicato. - -[AM4_11] -Y si estás interesado ya sabes dónde encontrarme. - -[CAM_A] -Pulsa el ~h~botón ~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~ para cambiar ~h~cámara ~w~ modos cuando vayas a pié o estés en un vehículo. - -[CAM_B] -Pulsa el ~h~botón de dirección hacia arriba ~w~ y ~h~ abajo ~w~ para cambiar los modos de ~h~cámara ~w~cuando vayas a pié o estés en un vehículo. - -[KM2_1] -~g~Repara el coche, tiene que estar en perfecto estado. - -[LM3_6] -Joey... - -[LM3_6A] -¿Voy a jugar contigo otra vez? - -[LM3_9A] -debe de haber algo de trabajo para ti. - -[LM3_9B] -¿De acuerdo? - -[AWAY2] -~r~Se escaparon. - -[AWAY] -~r~¡Se ha pirado de aquí! - -[JM6_1] -Ve al banco de la avenida principal. - -[GA_6B] -Aparca, selecciónalo pulsando el ~h~botón ~k~~PED_FIREWEAPON~~w~ y ¡ADELANTE! - -[GA_7B] -Armar con ~h~botón ~k~~PED_FIREWEAPON~~w~. La bomba explotará cuando el motor sea arrancado. - -[BAT1] -~g~¡Coge el bate! - -[EBAL_O] -Si no estropeas esto, puede que haya más trabajo para ti. Ahora ¡vete de aquí! - -[HELP9_B] -Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para ~h~disparar ~w~ el rifle del francotirador. - -[HELP9_C] -Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para ~h~ disparar ~w~ el rifle del francotirador. - -[JM6_8] -~r~¡Has perdido a todos los ladrones! - -[COLT_IN] -¡La pistola está ahora en el almacén de Munición! - -[TAXI2] -~r~¡Se te acabó el tiempo! - -[TAXI3] -~r~¡Tu pasajero se marchó aterrorizado! - -[TAXI7] -~r~Tu coche está destrozado, haz que lo reparen. - -[TAXI4] -¡Tarifa completa! - -[TAXI5] -¡¡DE VELOCIDAD!! - -[TAXI6] -Misión de taxi terminada - -[FRANGO] -~g~¡Salvatore quiere que ayudes a Toni a tratar con los Triad primero! - -[PAGEB12] -Policía Bribe entregado en el escondite - -[PAGEB13] -Salud entregada en el escondite - -[PAGEB14] -Adrenalina entregada en el escondite - -[KM1_4] -~g~¡Necesitas un coche de policía para hacer el trabajo! - -[CAT1_B] -trae 500.000 a la Villa en Cedar Grove. - -[JM2_C] -Tiene un puesto de fideos en China Town. - -[RM6_1] -Aquí está la llave de la cerradura. - -[RM6_2] -Encontrarás algo de dinero en metálico y 'suministros' que he almacenado en caso de que las cosas se pongan feas. - -[RM6_3] -Nos vemos pronto. - -[FE_INIP] -Iniciando y cargando el Menú de Pausa... Por favor espera. - -[FESZ_CA] -Cancelar - -[FESZ_QU] -Abandonar - -[FESZ_L1] -¡Partida guardada con éxito! - -[FESZ_L2] -Tu nombre guardado es: - -[FESZ_OK] -ACEPTAR - -[FES_NGA] -Partida nueva - -[FES_CAN] -Cancelar - -[FESZ_QL] -Todo progreso en tu partida actual no guardado será perdido. ¿Proceder con la carga? - -[FESZ_QD] -¿Quieres borrar esta partida guardada? - -[FESZ_QO] -¿Quieres sobreescribir este partida guardado? - -[FESZ_QR] -¿Estás seguro de que quieres empezar una nueva partida? Todo progreso desde la última partida guardada será perdido. ¿Proceder? - -[FESZ_QS] -¿QUIERES GUARDAR? - -[SLONFP] -Puerto 1. Archivo protegido. - -[T4X4_1] -'LUGAR DE JUEGOS DEL PATRIOTA' - -[T4X4_2] -'UN PASEO POR EL PARQUE' - -[T4X4_3] -'AGARRADO!' - -[MM_1] -'DISTURBIO DE DIFERENTES NIVELES' - -[T4X4_1A] -~g~Tienes ~y~5 minutos ~g~ para conseguir ~y~ 15~g~ puestos de control. ~g~Puedes conseguirlos en ~y~CUALQUIER ORDEN - -[T4X4_1B] -¡~1~ de 15! - -[T4X4_1C] -~y~PASA A TRAVES ~g~ del primer puesto de control para que comience el cronómetro. ~g~Cada puesto de control te acreditará con ~y~20 SEGUNDOS ~g~. - -[T4X4_2A] -¡¡~g~Tienes ~y~2 minutos ~g~ para conseguir ~y~12~g~ puestos de control!! ~g~Puedes conseguirlos en ~y~ CUALQUIER ORDEN. - -[T4X4_2B] -¡~1~ de 12! - -[T4X4_2C] -~y~PASA A TRAVÉS ~g~ del primer puesto de control para que comience el cronómetro. ~g~Cada puesto de control te premiará con ~y~10 SEGUNDOS~g~ - -[T4X4_3A] -~g~Tienes ~y~5 minutos ~g~ para conseguir ~y~20~g~ puestos de control. ~g~Puedes conseguirlos en ~y~CUALQUIER ORDEN. - -[T4X4_3B] -~Y~PASA A TRAVES ~g~ del primer puesto de control para que comience el cronómetro. ~g~Cada puesto de control te premiará con ~y~15 SEGUNDOS ~g~. - -[T4X4_3C] -¡~1~ de 20! - -[T4X4_F] -¡~r~Saliste bajo fianza! ¿Demasiado duro para ti? - -[MM_1_A] -¡~g~Tienes ~y~2 minutos ~g~ para conseguir ~y~20 puestos de control ~g~ en el multiniveles! ~g~Puedes conseguirlos en ~y~CUALQUIER ORDEN. - -[MM_1_B] -¡~1~ de 20! - -[MM_1_C] -~g~Eso son 20 segundos, más ~y~5 SEGUNDOS ~g~ por cada puesto de control. ~g~El cornómetro comenzará ~y~ INMEDIATAMENTE. - -[FM2_14] -~r~¡Estuviste muy cerca y asustaste a Curly! - -[FM2_15] -~g~No te acerques demasiado o Curly ¡sospechará algo! - -[UPSIDE] -~r~¡Giraste las ruedas! - -[FM2_16] -ASUSTOMETRO: - -[LM3_11] -~g~Misty no irá en el autobús,¡hazte con otro vehículo! - -[LANDSTK] -Landstalker - -[IDAHO] -Idaho - -[STINGER] -Stinger - -[LINERUN] -Linerunner - -[PEREN] -Perennial - -[SENTINL] -Sentinel - -[PATRIOT] -Patriot - -[FIRETRK] -Coche de bomberos - -[TRASHM] -Trashmaster - -[STRETCH] -Stretch - -[MANANA] -Manana - -[INFERNS] -Infernus - -[BLISTA] -Blista - -[PONY] -Pony - -[MULE] -Mule - -[CHEETAH] -Cheetah - -[AMBULAN] -Ambulancia - -[FBICAR] -F.B.I. - -[MOONBM] -Moonbeam - -[ESPERAN] -Esperanto - -[TAXI] -Taxi - -[KURUMA] -Kuruma - -[BOBCAT] -Bobcat - -[WHOOPEE] -Mr Whoopee - -[BFINJC] -Inyección BF - -[POLICAR] -Policía - -[ENFORCR] -Enforcer - -[SECURI] -Securicar - -[BANSHEE] -Banshee - -[PREDATR] -Predator - -[BUS] -Bus - -[RHINO] -Rhino - -[BARRCKS] -Barracas OL - -[TRAIN] -Tren - -[HELI] -Helicóptero - -[DODO] -Dodo - -[COACH] -Coach - -[CABBIE] -Cabbie - -[STALION] -Stallion - -[RUMPO] -Rumpo - -[RCBANDT] -Bandido RC - -[BELLYUP] -Triad - -[MRWONGS] -Mr Wongs - -[MAFIACR] -Mafia - -[YARDICR] -Yardie - -[YAKUZCR] -Yakuza - -[DIABLCR] -Diablo - -[COLOMCR] -Cartel - -[HOODSCR] -Hoods - -[AEROPL] -Avioneta - -[SPEEDER] -Veloz - -[REEFER] -Chaquetón - -[PANLANT] -Panlantic - -[FLATBED] -Flatbed - -[YANKEE] -Yankee - -[BORGNIN] -Borgnine - -[TOYZ] -TOYZ - -[FEST_DF] -Distancia recorrida a pié (millas) - -[FEST_DC] -Distancia recorrida en coche (millas) - -[FESTDFM] -Distancia recorrida a pié (m) - -[FESTDCM] -Distancia recorrida en coche (m) - -[FEST_R1] -Área de juego Patriota en segundos - -[FEST_R2] -Un paseo por el Parque en segundos - -[FEST_R3] -¡Agarrado! en segundos - -[FEST_RM] -Disturbio en el multiniveles en segundos - -[FEST_LS] -Gente salvada en una ambulancia - -[FEST_CC] -Criminales matados en Misión Vigilante - -[FEST_FE] -Total de fuegos extinguidos - -[FEST_LF] -Vuelo más largo en Dodo - -[FEST_BD] -Mejor idoneo para desconectar la bomba - -[FEST_RP] -Rampas pasadas - -[FEST_MP] -Misiones pasada - -[FEST_BB] -Pelea bling-bling: - -[FEST_H0] -Máximos puestos de control - -[FEST_GC] -Total de Coches de gangsters: - -[FEST_H1] -Destrucción Diablo - -[FEST_H2] -Masacre de Mafia - -[FEST_H3] -Calamidad en el Casino - -[FEST_H4] -Destructor Rumpo - -[USJI1] -TEXTO NO MAS REQUERIDO - -[USJI2] -TEXTO NO MAS REQUERIDO - -[USJI3] -TEXTO NO MAS REQUERIDO - -[USJ] -¡BONO DE ACROBACIA UNICA! - -[SPRAY] -Conduce tu vehículo a la tienda de pintura para perder tu ~h~nivel de buscado~w~, ~h~reparar ~w~ y ~h~ repintar ~w~ tu vehículo. Coste - ~h~1.000$ - -[HM1_1] -~g~Congela 20 Purpura Nines en 2 minutos 30 segundos. - -[KM1_8A] -Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para ~h~ activar la bomba, ~w~ recuerda apartarte del camino. - -[KM1_8D] -Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para ~h~ activar la bomba, ~w~ recuerda apártarte del camino. - -[KM1_12] -~g~¡Llévalo al dojo pero deshazte primero de los policías! - -[RATNG1] -Carterista - -[RATNG2] -Querido - -[RATNG3] -Ladrón - -[RATNG4] -Chorizo - -[RATNG5] -Goon - -[RATNG6] -Hombre sobre ruedas - -[RATNG7] -Músculos de alquiler - -[RATNG8] -Reparador - -[RATNG9] -Asociado - -[RATNG10] -Limpiador - -[RATNG11] -Asesino - -[RATNG12] -Hombre diestro - -[RATNG13] -Ejecutor - -[RATNG14] -Capo - -[RATNG15] -Jefe - -[1010] -~r~Tu vehículo está volcado - -[1011] -~r~Tu vehículo está volcado - -[1012] -~r~Tu vehículo está volcado - -[1013] -~r~Tu vehículo está volcado - -[1014] -~r~Tu vehículo está volcado - -[JM4_10] -VALE, Chaval. Llévame a la lavandería de Chinatown primero, tengo un negocio del que ocuparme. - -[JM4_11] -Esas mujeres que lavan no están recibiendo su dinero de protección. - -[JM4_12] -Y vigila el coche, Joey acaba de arreglar ese montón de basura - -[JM4_13] -Entonces no me vengas con cuentos, ¿VALE? - -[KM4_11] -~g~¡Llévate el dinero de vuelta al casino! - -[FEF_BR2] -Encuéntralo de nuevo leyendo cualquier informe de misión conseguido hasta la fecha. - -[TRAIN_1] -Estación Kurowski - -[TRAIN_2] -Estación Rothwell - -[TRAIN_3] -Estación Baillie - -[SUBWAY1] -Estación Portland - -[SUBWAY2] -Estación Rockford - -[SUBWAY3] -Estación Staunton South - -[SUBWAY4] -Terminal Shoreside - -[MEA4_2] -~r~¡Marty Chonks está muerta! - -[SPRAY1] -Lleva tu vehículo a la tienda de pintura para perder tu ~h~nivel de buscado~w~, ~h~reparar~w~y ~h~repintar ~w~tu vehículo. Coste - ~h~ 1.000$ ~w~. Esta vez es gratis. - -[JM4_A] -Sí, lo sé Toni, la he puesto a tono. Ella está a punto, ¿sabes lo que de digo? - -[JM4_5] -Pasa más tarde y les daremos algo para que lave, ¡sus propias ropas manchadas de sangre! - -[AMMU_A] -Luigi dijo que tú necesitabas una pieza... - -[AMMU_B] -Joey me dijo que te armáramos... - -[AMMU_C] -Así que ve por la parte de atrás de la tienda. Te dejé un nueve en el patio. - -[AMMU_D] -Te conseguí todas las defensas necesarias para la casa. - -[AMMU_E] -¿También quieres una licencia? - -[AMMU_F] -No necesito ver ningún documento, pareces de fiar. - -[DETON] -DETONACION: - -[DRIVE_A] -Ten un Uzi seleccionado cuando entres en un vehículo, entonces mira a la izquierda o a la derecha y pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para disparar. - -[DRIVE_B] -Ten un Uzi seleccionado cuando entres a un vehículo, entonces mira a la izquierda o a la derecha y pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para disparar. - -[RECORD] -~g~¡¡NUEVO RECORD!! - -[NRECORD] -~r~¡NO HAY NUEVO RECORD! - -[RCHELP] -Pulsa botón ~k~~PED_FIREWEAPON~, o conduce el coche de RC hasta las ruedas de un coche para detonarlo. - -[RCHELPA] -Pulsa el botón ~k~~PED_FIREWEAPON~, o conduce el coche RC hasta unas ruedas de coche para detonarlo. - -[RC_1] -¡Tienes 2 minutos para volar cuantos coches de gangsters Diablo sean posibles! - -[RC_2] -¡Tienes 2 minutos para bolar cuantos coches de gangsters Mafia sean posibles! - -[RC_3] -Tienes 2 minutos para bolar cuantos coches de gangsters Yakuza sean posibles! - -[RC_4] -¡Tienes 2 minutos para volar cuantos coches de gangsters Yardie sean posibles! - -[RC_5] -Tienes 2 minutos para volar cuantos coches de gangsters Hood sean posibles! - -[RC_6] -Tienes 2 minutos para volar cuantos coches de gangsters Cartel sean posibles! - -[RAMPAGE] -¡¡ATAQUE!! - -[RAMP_P] -¡ATAQUE COMPLETADO! - -[RAMP_F] -ATAQUE FALLIDO - -[PAGE_00] -. - -[PAGE_01] -¡Mata ~1~ Diablo en 120 segundos! - -[PAGE_02] -¡Destruye ~1~ vehículo en 120 segundos! - -[PAGE_03] -¡Mata ~1~ Mafia en 120 segundos! - -[PAGE_04] -¡Mata ~1~ Tríadas en 120 segundos! - -[PAGE_05] -¡Mata ~1~ Tríada en 120 segundos! - -[PAGE_06] -¡Destruye ~1~ vehículo en 120 segundos! - -[PAGE_07] -¡Revienta ~1~ cabezas Yardie en 120 segundos! - -[PAGE_08] -¡Quema ~1~ Yakuza en 120 segundos! - -[PAGE_09] -¡Destruye ~1~ vehículo en 120 segundos! - -[PAGE_10] -¡Destruye ~1~ vehículo en 120 segundos! - -[PAGE_11] -¡Aniquila ~1~ Yardie en 120 segundos! - -[PAGE_12] -¡Quema ~1~ Yakuza en 120 segundos! - -[PAGE_13] -¡Vuela ~1~ Yardie en 120 segundos! - -[PAGE_14] -¡Fríe ~1~ Colombianos en 120 segundos! - -[PAGE_15] -¡Machaca ~1~ Hood en 120 segundos! - -[PAGE_16] -¡Destruye ~1~ vehículo en 120 segundos! - -[PAGE_17] -¡Machaca ~1~ Colombianos con un coche en 120 segundos! - -[PAGE_18] -¡Conduce por ahí en coche y destruye ~1~ vehículo en 120 segundos! - -[PAGE_19] -¡Corta ~1~ cabezas colombiana en 120 segundos! - -[PAGE_20] -¡Córtale la cabeza a ~1~ Hoods en 120 segundos! - -[JM1_A] -Ey, estoy aburrida, ¿cuándo vas a tomarme? - -[JM1_B] -En un momento, cariño, tengo un pequeño negocio del que ocuparme. - -[JM1_C] -Tengo un pequeño trabajo para ti, colega. - -[JM1_D] -Los hermanos Forelli me deben dinero desde hace mucho tiempo - -[JM1_E] -y ellos necesitan que alguien les enseñe un poco de respeto. - -[JM1_F] -Labios Forelli está poniéndose como un cerdo en el St Marks Bistro - -[JM1_G] -así que roba su coche y llévalo a la tienda de bombas 8-Ball en Harwood. - -[JM1_H] -Conoces 8-Ball, ¿verdad? - -[JM1_I] -Una vez que esté cargado con una bomba, ve a aparcar el coche donde lo encontraste. - -[JM1_J] -Luego siéntate y contempla todo el espectáculo. - -[JM1_K] -Pero cuidado, no va a estar comiendo toda la vida. - -[CAT2_A1] -¡Vamos, perra estúpida! - -[CAT2_A] -La verdadera cuestión es, lo que quieres es ¿rescatar a María o llevarme a mí de vuelta? - -[CAT2_B] -Bueno, tengo noticias para ti, - -[CAT2_B2] -dispararte será un placer pero salir contigo fue sólo un asunto de negocios. - -[CAT2_C] -¡Eres muy peccino, amigo! - -[CAT2_D] -Echame el dinero - -[CAT2_E] -Has sido un chico aplicado! - -[CAT2_E2] -Pero no has aprendido, yo no soy de fiar - -[CAT2_E3] -Mata al idiota - -[CAT2_J] -Atrapa esta cosa en el aire! - -[HM5_1] -Tío, Ice dijo que vendría. Hay reglas. Bates sólo. No armas, no coches. - -[HM5_5] -Esta es una batalla por el respeto, ¿vale? - -[HELP14] -Para conseguir armas pasa sobre ellas. Estas no pueden conseguirse cuando se está dentro de un vehículo. - -[CRUSH] -Aparca en el área señalada y sal de tu vehículo. El vehículo será entonces triturado. - -[DIAB2_B] -Una banda de infames me ha amenazado con quitarme mi afiliación si no les pago una parte. - -[DIAB2_C] -Amenazaron al hombre equivocado, amigo. - -[DIAB2_D] -Ellos tienen debilidad por el helado. - -[DIAB2_E] -Consigue la bomba que he ocultado en Harwood, - -[DIAB2_F] -secuestra la furgoneta habitual de los helados en sus rondas. - -[DIAB2_G] -y seduce a esos idiotas para que caigan en su ruina con el jeengle-jeengle - -[DIAB2_H] -Se ocultan en un almacén de Atlantic Quay - -[DIAB3_A] -Algunas Tríadas insolentes robaron mi bonito coche anoche, - -[DIAB3_B] -destrózalo y deja que se queme. - -[DIAB3_C] -Algunos de mi más preciosos artículos sobre burros estaban en el maletero - - -[DIAB3_D] -objetos de colección que son irremplazables, amigo. - -[DIAB3_E] -He escondido un arma punzante en el borde de Chinatown. - -[DIAB3_F] -Tómalo y enseña a esos vándalos de las Tríadas a tenerle miedo a la ira bien fundada de El Burro. - -[DIAB3_1] -MATA 25 TRIADS - -[DIAB4_A] -¡Un ladrón oportunista ha robado mi furgoneta donde llevaba mis últimas publicaciones periodísticas! - -[DIAB4_B] -Pero ese idiota colgado de SPANK ha dejado las puertas de atrás abiertas - -[DIAB4_C] -y ahora toda mi bellamente editada, - -[DIAB4_D] -literatura para adultos con tan buen gusto fotografiada está siendo esparcida por todo Liberty! - -[DIAB4_E] -Coge la furgoneta y sigue el sendero de Donkey Does Dallas volúmenes 1,2 y 3 - -[DIAB4_F] -conseguido según vas. - -[DIAB4_G] -Cuando hayas seguido el sendero de ese ladronzuelo con cabeza de SPANK, acaba con él! - -[DIAB4_H] -Luego reparte mi material de Revistas XXX en el Red Light District (Distrito de la luz roja) - -[DIAB4_1] -~g~Lleva la furgoneta a la parte de atrás de Revistas XXX - -[HM1_E] -Quiero mostrarle a esos perros macarras cómo funciona un verdadero tiroteo desde un vehículo - -[HM1_H] -¡Llévate a esos nueve fuera de aquí!! - -[HM2_A] -Esos Nines me están presionando. - -[HM2_B] -Esos perros tienen coches blindados y están traficando con SPANK... - -[HM2_C] -y colocándoselo a los hermanos sin pudor. - -[HM2_D] -Hay un coche aparcado arriba de la calle. - -[HM2_E] -Hay algo de material allí dentro para poner a esos mariquitas en su sitio... - -[HM3_A] -Algún effa ha cableado mis ruedas para bolarlas. - -[HM3_B] -Si pierdo esas ruedas, mi reputación en la calle estará muerta. - -[HM3_C] -Coge mi coche y llévalo al garaje de St Marks, ¿vale tío? - -[HM3_D] -Déjales difundir eso, déjales que se ocupen de esa bomba. - -[HM3_E] -Los relojes están avanzando y el cableado está liado. - -[HM3_F] -Otro fallo más y esa cosa podría volar. - -[HM3_G] -¡Ahora muévelo! - -[HM4_A] -Tío, un vuelo de la Reserva federal se acaba de estrellar en el Francis International. - -[HM4_B] -Hay platino por toda la pista. - -[HM4_C] -Consigue un coche y agarra todo lo que puedas. - -[HM4_F] -Puedes dejar el marrón en uno de mis garajes. - -[HM4_G] -Este platino es muy pesado y va a hacer que tus ruedas se muevan más despacio. - -[HM4_H] -Así que haz repartos regulares en el garaje. - -[HM5_A] -Esos Nines se han quedado con pocos costrosos... - -[HM5_B] -pero todavía quieren seguir. - -[HM5_C] -Aceptaron un cuerpo a cuerpo. . - -[HM5_D] -Uno de sus gangsters contra dos de los nuestros, o mejor... - -[HM5_E] -dos de vosotros - -[HM5_F] -Yo os apoyaré pero... - -[HM5_G] -La vista de mi libertad bajo fianza no es hasta dentro de tres meses, - -[HM5_H] -¿sabes lo que te digo? - -[HM5_I] -Ve y reúnete con mi hermano pequeño, - -[HM5_J] -Te enseñará dónde están peleando por una causa justa. - -[MEA1_B] -El nombre es Chonks, Marty Chonks. - -[MEA1_C] -Soy el dueño de la fábrica de comestibles Bitchin' Dog que está a la vuelta de la esquina. - -[MEA1_D] -Tengo problemas económicos, pero ¡ey!, y quién no, ¿verdad? - -[MEA1_E] -Voy a reunirme con el director de mi banco más tarde. - -[MEA1_F] -Es un tramposo bastardo que sigue engordando los pagos del préstamo para llevarse una buena porción. - -[MEA1_G] -Coge mi coche, ve a buscarle y traelé de vuelta. - -[MEA1_H] -¡¡Tengo una pequeña sorpresa para ese parasito chupasangres!! - -[MEA2_A] -Contraté algunos ladrones para que entraran en mi apartamento... - -[MEA2_C] -Los bastardos ladrones amenazan con contárselo a la compañía de seguros, - -[MEA2_D] -si no les doy una parte - -[MEA2_E] -¿Puedes creerlo? - -[MEA2_F] -He dejado un coche dentro de las puertas de la fábrica. - -[MEA2_G] -Úsalo para ir a recogerles en su territorio en el Red Light District. - -[MEA2_H] -Luego traelos de vuelta a la fábrica de manera que pueda hacerles ver el punto de vista de Marty. - -[MEA3_A] -El negocio se va a hundir a no ser que me haga con una buena cantidad de dinero muy pronto. - -[MEA3_B] -Mi esposa tiene una póliza de seguro y todo lo que ella ha sido para mí es un agujero en mis bolsillos. - -[MEA3_C] -He dejado un coche en el lugar habitual - -[MEA3_D] -Ve a recoger a mi esposa en Classic Nails y traela de vuelta a la fábrica. - -[MEA4_A] -Diablos,¡tengo problemas! - -[MEA4_B] -Resulta que mi esposa estaba viéndose con un tipo a quien le debo dinero. - -[MEA4_C] -¡Parece muy enfadado y está tratando de recuperar su dinero! - -[MEA4_E] -cree que voy a devolverle el dinero... - -[MEA4_F] -pero yo creo que... - -[MEA4_G] -¡los perros de Liberty van a disfrutar de un nuevo sabor este mes! - -[WELCOME] -BIENVENIDO A - -[HM1_2] -~g~Hazte con un vehículo, y recuerda que sólo cuentan los asesinatos con Uzi desde el coche. - -[HELP8_B] -Pulsa el ~h~ botón ~k~~PED_SNIPER_ZOOM_IN~~w~ para ~h~ hacer zoom en ~w~ con el rifle y el ~h~botón ~k~~PED_SNIPER_ZOOM_OUT~~w~ para ~h~ retirar el zoom ~w~ otra vez. - -[LRQC_1] -Asuka y yo vamos a tener que hablar, uh, - -[LRQC_2] -¿Por qué no das un paseo por ahí? - -[LRQC_3] -Necesitas un lugar para esconderte - -[LRQC_4] -Hay un almacén en la orilla de Belleville que puede tener lo que necesitas. - -[LRQC_5] -Regresa a mi apartamento cuando estés listo, - -[LRQC_6] -y podemos tener una pequeña charla. - -[JM6_5] -~g~Necesitas un vehículo para escapar, ¡idiota! - -[JM2_F] -Si necesitas una pieza ve por detrás de AmmuNation, enfrente del metro. - -[LOVE4_7] -~g~Hay una zona de construcción en Staunton Island, puede que llevaran el paquete allí. - -[LOVE4_8] -~g~Necesitarás un coche para abrir el garaje. - -[TSCORE] -GANANCIAS: ~1~ $ - -[AM1_9] -~r~¡Salvatore ha escapado de vuelta al club de Luigi! - -[AM1_6] -~g~Si te dejas ver por el club de Luigi, ¡la Mafia te encontrará! - -[TM2_3] -~g~¡Es una trampa! ¡Liquidadlos a todos! - -[FM4_1] -Esta es María. ¡El coche es una trampa! Encuéntrame en el lado sur de Callahan Bridge. - -[JM1_7] -~g~¡Cierra la puerta del coche! ¡Se dará cuenta! - -[KM5_1] -~g~¡¡TRAFICANTE DESMENUZADO!! - -[KM5_6] -~g~Debes matar al menos 8 traficantes Yardie. - -[KM5_7] -~g~¡Mátalos rápido! Una vez que venden el SPANK se retiran de las calles. - -[RM3_8] -~r~¡¡El coche es un señuelo!! - -[LM3_8] -Hola, soy Joey. - -[LM3_9] -Luigi dijo que tú eras de fiar, así que vuelve más tarde, - -[KM3_5] -~g~Toca el claxon para poder hacer el trato. - -[LOVE7] -DESAPARICION DEL AMOR - -[LOVE2_5] -~g~¡Kenji es carne de parachoques! ¡Sal de Newport y deshazte del coche! - -[AS2_11] -~g~ ~1~ DE 9! - -[GARAGE1] -~g~Sal del vehículo y camina afuera. - -[KM3_11] -~g~El Cartel ha sido atacado y el maletín no ha sido recuperado. - -[KM3_12] -~g~Mata a todos los colombianos, destruye los vehículos y recupera el maletín. - -[KM3_13] -~g~Lleva el maletín de vuelta al casino. - -[RM5_6] -~g~¡Ha salido en libertad bajo fianza! ¡¡Destruye su chaleco salvavidas con un vehículo o una explosión!! - -[PBOAT_1] -Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para disparar los cañones del barco. - -[PBOAT_2] -Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para disparar los cañones del barco. - -[DIAB1_B] -Este es El Burro de los Diablos. - -[DIAB1_D] -Ahora estás en Liberty, pero ya te estás ganando una reputación en las calles. - -[DIAB1_E] -Hay una carrera en la calle que empieza en la vieja escuela cerca de Callahan Bridge. - -[DIAB1_F] -Consíguete unas ruedas y el primero que pase por todos los checkpoints gana el premio. - -[HM2_1] -Usa los buggies RC para destruir los coches blindados. Pulsa el ~h~botón ~k~~PED_FIREWEAPON~ ~w~ para detonar. - -[HM2_1A] -Usa los buggies RC para destruir los coches blindados. Pulsa el ~h~botón ~k~~PED_FIREWEAPON~~w~ para detonar. - -[HM2_2] -~r~¡Fallaste en la destrucción de los coches blindados! - -[HM2_6] -~g~¡Coche blindado destrozado! - -[RM3_A] -Conozco un hombre muy importante en la ciudad, un tipo suave, - -[RM3_H] -con gustos exóticos y el suficiente dinero para pagárselos. - -[RM3_B] -Está involucrado en un asunto legal y la acusación tiene fotos de él muy comprometedoras - -[RM3_C] -en una fiesta en la morgue o algo así. - -[LOVE6_A] -Una lección en negocios, amigo mío. - -[LOVE6_E] -Si tienes una mercancía única, el mundo y su mujer tratarán de quitártela de tus garras. - -[LOVE6_C] -Equipos SWAT han acordonado el área alrededor de mi asociado y el paquete. - -[LOVE6_D] -Ve hacia allí, recoge la furgoneta y actúa como un señuelo. - -[LOVE6_F] -Mantenles ocupados y él podrá escaparse bien. - -[AM3_C] -¡Está probablemente afuera en la bahía mientras lees esto! ¡Roba un barco de policía, y hunde su carrera! - -[FESZ_UC] -CANCELAR - -[FEDS_SM] -L1,R1-CAMBIAR MENU Mientras se busque un menú en particular: - -[FEDS_AS] -;=-CAMBIAR SELECCION - -[FEDSAS2] -<>-CAMBIAR SELECCION - -[FEDS_SS] -L1,R1-CAMBIAR SELECCION - -[FEDSSC1] -;-MOVIMIENTO MAS RAPIDO - -[FEDSSC2] -=-DETENER MOVIMIENTO - -[MEA2_3] -~g~Traer el coche de vuelta a la fábrica. - -[RM1_3] -~r~¡McAffrey se escapó! - -[RM1_4] -~g~¡Has usado todas las granadas! ¡Consigue más en Ammunation! - -[RM1_5] -~g~¡Vuelve y quema la casa de seguridad! - -[RM6_4] -~g~ Pásate por la taquilla y consigue el cargamento de Ray. - -[RM6_5] -~g~La CIA tiene el puente bajo vigilancia, encuentra otra ruta para pasar - -[HM2_F] -y destroza todo su material blindado. - -[HM_4] -'LINGOTES DE ORO' - -[MEA2_B5] -TEXTO NO MAS REQUERIDO - -[MEA1_B5] -TEXTO NO MAS REQUERIDO - -[MEA3_B5] -TEXTO NO MAS REQUERIDO - -[MEA4_B7] -pero si pasas por mi oficina... - -[MEA3_B4] -¿ Marty quiere verme? Bueno, pues que sea rápido porque tengo que ir a la peluquería. - -[KM3_7] -¡Es una trampa Yakuza, tío! - -[FES_LOF] -Fallo al cargar. - -[P1INSA] -Memory card (PS2) insertada en la ranura para MEMORY CARD 1. ~1~K de espacio disponible para guardar. ~1~K necesario. - -[P1INSN] -Memory card (PS2) insertada en la ranura para MEMORY CARD 1. No hay espacio disponible para guardar. Por favor borra algunos archivos. - -[FES_SLO] -GUARDAR ARCHIVO - -[FES_ISC] -ESTA CORRUPTO - -[FESZ_TI] -GUARDAR Z1 - -[FESZ_SA] -Guardar Partida - -[P1NOIN] -No hay memory card (PS2) insertada en la ranura para MEMORY CARD 1 - -[P1INSE] -Memory card (PS2) insertada en la ranura para MEMORY CARD 1. - -[MC_LDFL] -¡Error al cargar! - -[MC_NWRE] -Ahora, reinicio de partida - -[LOVE6_3] -~g~Tienes ~1~ segundo para volver al Securicar antes de que falles en la misión. - -[LOVE6_4] -~r~¡Te deshiciste del Securicar señuelo! - -[HELP1] -Detente en el centro del marcador azul. - -[HELP12] -Vaya hasta el centro del marcador azul para dar comienzo una misión. - -[HJSTAT] -Distancia: ~1~. ~1~m. Altura: ~1~.~1~m. Vueltas: ~1~. Rotación: ~1~_ - -[HJSTATW] -Distancia: ~1~.~1~m. Altura: ~1~.~1~m. Vueltas: ~1~. Rotación: ~1~_ Y, ¡qué buen aterrizaje! - -[DIAB1_5] -TIEMPO DE CARRERA - -[LOVE3_4] -~r~¡Has destruído el avión!! - -[F_FAIL1] -¡Misión de coche de bomberos terminada! - -[F_CANC] -~r~ ¡Misión de coche de bomberos cancelada! - -[F_EXTIN] -FUEGOS: - -[A_COMP1] -¡Misión de paramédicos completada! - -[A_CANC] -~r~¡Misión de paramédicos cancelada! - -[A_COMP3] -¡Misión de paramédicos completada! ¡Nunca te cansarás cuando estés corriendo! - -[ATUTOR] -Pulsa el ~h~ botón ~k~~TOGGLE_SUBMISSIONS~~w~ para conectar o desconectar misiones de paramédico. - -[ATUTOR3] -Pulsa el ~h~ botón ~k~~TOGGLE_SUBMISSIONS~~w~ para conectar o desconectar misiones de paramédico. - -[ALEVEL] -Nivel de misión de paramédico ~1~ - -[A_FAIL1] -Misión de paramédico terminada. - -[FEST_HA] -Nivel más alto de misión de paramédico - -[A_SAVES] -GENTE SALVADA: ~1~ - -[C_KILLS] -CRIMINALES MATADOS: ~1~ - -[HM1_B] -Tengo un problema, están tratando de camelarme. - -[AM2_A] -La muerte de Salvatore es una placentera noticia, - -[AM2_A2] -eres un asesino eficaz - Eso me gusta en un hombre. - -[AM2_B] -Este es mi hermano Kenji. - -[AM2_C] -Asuka tiene un pequeño trabajo para ti, pero cuando hayas terminado, pásate por mi casino y podremos hablar. - -[AM2_D] -Justo como Kenji, siempre tratando de jugar con mis juguetes. - -[AM2_E] -Mi fuente en la policía me dice que la Mafia está acechando nuestros intereses en la ciudad - -[AM2_E2] -con el propósito de localizarte. - -[AM2_F] -No podemos continuar con nuestras operaciones hasta que entablen negociaciones. - -[AM2_G] -Liquida a esos estúpidos espías y acaba con esta vendetta de una vez por todas. - -[F_START] -~g~Informe de vehículo en llamas en el ~a~área. Ve y extingue el fuego. - -[AM4_1A] -Ve al teléfono de West Belleville Park. - -[AM4_1B] -Ve al teléfono de Liberty Campus. - -[AM4_1C] -Ve al teléfono de South Belleville Park. - -[AM4_1D] -Encuéntrame en el bloque del baño en el parque. - -[HJSTATF] -Distancia:~1~pies. Altura: ~1~pies. Vueltas: ~1~. Rotación: ~1~_ - -[HJSTAWF] -Distancia: ~1~pies. Altura: ~1~pies. Vueltas: ~1~. Rotación: ~1~_. Y, ¡qué buen aterrizaje! - -[HM1_F] -Pero vigila a tus espaldas, habrá Jacks en las calles que creerán que estás tratando de volarles también la cabeza. - -[HM1_D] -'Nueves' es su etiqueta y púrpura es su bandera y cada día ellos sacuden sus colores... - -[HM1_G] -otro día más que los 'Jacks' parecen blanditos. - -[MEA2_B] -y roba lo que encuentres para que así pueda reclamarle al seguro como haces tú. - -[TM3_H] -~w~Te lo montaste bien allí, chaval, muy bien. - -[TM3_I] -~w~Vamos, te presentaré al Don. - -[TM3_J] -~w~¡Eeeyyyy! ¡Luigi! - -[TM3_K] -~w~Oh, mis chicas han estado echándote de menos mucho tiempo, Salvatore, has estado fuera mucho tiempo. - -[TM3_L] -~w~Diles que una vez que nos hayamos ocupado de este desgraciado incidente, - -[TM3_M] -~w~iremos todos al club para celebrar, ¿vale? - -[TM3_N] -~w~Ese es mi chico - -[TM3_N2] -~w~¿Cómo lo llevas, papá? - -[TM3_O] -~w~¿Has encontrado ya una buena mujer? - -[TM3_P] -~w~Ey, tu madre, que en paz descanse, se retorcería en la tumba - -[TM3_Q] -~w~si te viera sin una mujer. - -[TM3_R] -~w~Lo sé, papá, me estoy ocupando de eso. - -[TM3_S] -~w~¡TONI! ¿Cómo está tu madre? - -[TM3_T] -~w~Ella es una gran mujer, ¿sabes? Fuerte. Firenze. - -[TM3_U] -~w~Ella está bien... estupenda. - -[TM3_V] -~w~Fantástico, fantástico. Ahora escuchadme, chavales, entrad dentro mientras yo hablo aquí con nuestro nuevo amigo. - -[TM3_W] -~w~No veo más que cosas buenas para ti, hijo mío... - -[RM1_A] -Esa bola de mierda, McAffrey, aceptó más sobornos que nadie. - -[RM1_B] -Cree que va a conseguir una rebaja honorable de sus cargos si ofrece evidencias del estado - -[RM1_C] -¡El ha cantado! - -[RM4_B] -Tenemos que cerrarle la boca para siempre. - -[RM4_E] -Quiero que se vaya a dormir con los peces en lugar de comérselos. - -[LOVE3_B] -En su aproximación al aeropuerto esta noche, una avioneta ligera sobrevolará la bahía. - -[LOVE4_D] -Desgraciadamente las autoridades aduaneras registraron el avión y lo estaban desguazando - -[LOVE4_H] -hasta que yo intervine a pesar del gran coste personal. - -[LOVE4_E] -Cruza el puente a Shoreside Vale, y ve al aeropuerto Francis International. - -[GTAB_A] -Ey, saquemos esto de aquí. Dios sabe qué será. - -[GTAB_B] -pero él parece quererlo a toda costa así que debe de tener algún valor. - -[GTAB_C] -¡Quién diablos! - -[GTAB_D] -¡TÚ! - -[GTAB_E] -¡Ey, tranquilo, amigo! ¡De nada! De nada! - -[GTAB_F] -¡Te dejé metiendo tu corazón en el charco! - -[GTAB_G] -No dispares, amigo. No hay problema. Somos amigos. Mira, coge esto. - -[GTAB_H] -¡No seas mariquita! - -[GTAB_I] -¡No tenemos elección, nene! - -[GTAB_J] -¡Siempre hay una elección, bastardo! - -[GTAB_K] -¡Siento mucho lo de ese perro enloquecido, son todos iguales... ¿¿por favor?? - -[GTAB_L] -Así que la buscona se fué. - -[GTAB_M] -Pero me has hecho un favor, - -[GTAB_N] -no eres el único que tiene una cuenta pendiente con el Cartel, - -[GTAB_O] -¡ese gusano mató a mi hermano! - -[GTAB_P] -¡Nunca maté a ningún Yakuza! - -[GTAB_Q] -¡MENTIROSO! Todos vimos al asesino del Cartel. - -[GTAB_R] -¡Vamos a cazaros y a mataros a todos, perros colombianos! - -[GTAB_S] -Estaré trabajando con nuestro querido amigo para extraerle información y un poco de placer. - -[GTAB_T] -Tú, ven más tarde, estoy seguro que voy a necesitar tus servicios. - -[GTAB_U] -Por favor, amigo, no me dejes con ella, ¡esa chica está loca! ¿Amigo?. Ey, ¡AMIIIGO!... ¡Aiiieeeaaaargghh! - -[LOVE5_A] -Estás demostrando ser una inversión segura, algo muy raro en estos días que corren. - -[KM3_1] -~g~¡El Cartel espera que una banda Yardie vaya y robe un coche Yardie! Dirígete hacia el norte, encontrarás uno en Newport. - -[LOVE1_1] -~g~Ve a robar un coche de la banda Colombiana, para que puedas infiltrar el escondite, dirígete hacia el norte y encontrarás uno en Fort Staunton) - -[FM1_Q1] -~w~¿Estás buscando un poco de diversión?. ¿Un poco de... hmmm? ¿Algo de zurra? - -[FM1_R] -~w~Hola, chico. Hah, lo de siempre. - -[FM1_T] -~w~Gracias Chico, nos vemos pronto. - -[FM1_W] -~w~De acuerdo Fido, espera aquí y quédate pendiente del coche mientras yo voy a menear mi culo, ¿vale? - -[FM1_X] -~w~VALE Fido, salgamos de aquí. ¡Uauhhh! - -[FM1_Q] -~w~¡Ey María! ¡Es mi chica favorita! - -[FM1_S1] -~w~Ey, a lo mejor deberías echar un vistazo en la fiesta del almacén en el lado este de Atlantic Quays. - -[FM1_U] -~w~Gracias y disfruta. Es buen material - -[FM1_V] -~w~Vamos Fido, ¡vamos a echar un vistazo a esa fiesta! - -[FM1_SS] -~r~ESCÁNER: ~g~Cuatro-cinco a todas las unidades: Asistir redada de narcóticos en Atlantic Quays. - -[LOVE6_B] -incluso aunque no sean conscientes de su verdadera valía. - -[TM3_A1] -~r~¡El amigo de Joey! - -[TM3_A2] -~r~¡Joey y Luigi han sido incinerados! - -[TM3_A3] -~r~¡Joey, Luigi y Toni están quemados! - -[FM4_2] -Escucha, Salvatore cree que estamos engañándole, - -[FM4_3] -así que te ofreció al Cartel para poder hacer un trato. - -[FM4_4] -No podía permitir que hiciera eso, o sea, lo peor es que, - -[FM4_4B] -es mi culpa... porque le dije que éramos un asunto a tratar. - -[FM4_5] -No me preguntes por qué. No lo sé. - -[FM4_6] -Mira, eres un hombre marcado en terreno Mafia y yo tengo que salir de aquí también. - -[FM4_6B] -¡He visto demasiados asesinatos. Demasiada sangre! - -[FM4_7] -Es una amiga mía, ¿vale?, una vieja amiga... es Asuka, alguien en quien podemos confiar. - -[FM4_8] -Vamos, ya vale de discursos. - -[FM4_9] -Será mejor que salgamos de aquí antes de que haya más italianos histéricos pretendiendo hacer reuniones poco amistosas. - -[CRED001] -ROCKSTAR STUDIOS - -[CRED002] -PRODUCER - -[CRED003] -LESLIE BENZIES - -[CRED004] -ART DIRECTOR - -[CRED005] -AARON GARBUT - -[CRED006] -TECHNICAL DIRECTION - -[CRED007] -OBBE VERMEIJ - -[CRED008] -ADAM FOWLER - -[CRED009] -DESIGN - -[CRED010] -CRAIG FILSHIE - -[CRED011] -WILLIAM MILLS - -[CRED012] -CHRIS ROTHWELL - -[CRED013] -JAMES WORRALL - -[CRED014] -WRITTEN BY - -[CRED015] -JAMES WORRALL - -[CRED016] -PAUL KUROWSKI - -[CRED017] -DAN HOUSER - -[CRED018] -CHARACTERS - -[CRED019] -IAN MCQUE - -[CRED020] -ANIMATION & DIRECTION - -[CRED021] -ALEX HORTON - -[CRED022] -LEE MONTGOMERY - -[CRED023] -AUTO DESIGN - -[CRED024] -PAUL KUROWSKI - -[CRED025] -ARTISTS - -[CRED026] -KEIRAN BAILLIE - -[CRED027] -ADAM COCHRANE - -[CRED028] -GARY MCADAM - -[CRED029] -MICHAEL PIRSO - -[CRED030] -ANDREW SOOSAY - -[CRED031] -ALISDAIR WOOD - -[CRED032] -CODERS - -[CRED033] -ALAN CAMPBELL - -[CRED034] -MARK HANLON - -[CRED035] -ANDRZEJ MADAJCZYK - -[CRED036] -ALEXANDER ROGER - -[CRED037] -GRAEME WILLIAMSON - -[CRED038] -SCORE - -[CRED039] -CRAIG CONNER - -[CRED040] -STUART ROSS - -[CRED041] -SOUND DESIGN & MASTERING - -[CRED042] -ALLAN WALKER - -[CRED043] -AUDIO PROGRAMMING - -[CRED044] -RAYMOND USHER - -[CRED045] -TEST MANAGER - -[CRED046] -CRAIG ARBUTHNOTT - -[CRED047] -LEAD TESTERS - -[CRED048] -ANDY DUTHIE - -[CRED049] -JOHN HAIME - -[CRED050] -NEIL CORBETT - -[CRD050A] -TESTERS - -[CRED051] -GRAEME JENNINGS - -[CRED052] -DAVID MURDOCH - -[CRED053] -DAVID BEDDOES - -[CRED054] -EDWIN SMITH - -[CRED055] -MARK FLETT - -[CRED056] -MICHAEL SUTHERLAND - -[CRED057] -TECHNICAL SUPPORT - -[CRED058] -LORRAINE ROY - -[CRED059] -CHRISTINE CHALMERS - -[CRED060] -ROCKSTAR - -[CRED061] -EXECUTIVE PRODUCER - -[CRED062] -SAM HOUSER - -[CRED063] -PRODUCER - -[CRED064] -DAN HOUSER - -[CRED065] -DIRECTOR OF DEVELOPMENT - -[CRED066] -JAMIE KING - -[CRED067] -TECHNICAL PRODUCER - -[CRED068] -GARY J. FOREMAN - -[CRED069] -ASSOCIATE PRODUCER - -[CRED070] -JEREMY POPE - -[CRED071] -MUSIC SUPERVISOR - -[CRED072] -TERRY DONOVAN - -[CRED073] -ROCKSTAR PRODUCTION TEAM - -[CRED074] -TERRY DONOVAN - -[CRED075] -JENNIFER KOLBE - -[CRED076] -JENEFER GROSS - -[CRED077] -LAURA PATERSON - -[CRED078] -JEFF CASTANEDA - -[CRED079] -CHRIS CARRO - -[CRED080] -ADAM TEDMAN - -[CRED081] -JUNG KWAK - -[CRED082] -BRIAN WOOD - -[CRED083] -PAUL YEATES - -[CRED084] -STANTON SARJEANT - -[CRED085] -VP OF MARKETING - -[CRED086] -TERRY DONOVAN - -[CRED087] -TECHNICAL COORDINATOR - -[CRED088] -BRANDON ROSE - -[CRED089] -QA MANAGER - -[CRED090] -JEFF ROSA - -[CRED091] -LEAD ANALYST - -[CRED092] -ADAM DAVIDSON - -[CRED093] -GAME ANALYST - -[CRED094] -RICHARD HUIE - -[CRED095] -TEST TEAM - -[CRED096] -LANCE WILLIAMS - -[CRED097] -JOE GREENE - -[CRED098] -BRIAN PLANER - -[CRED099] -OSWALD GREENE - -[CRED100] -LIBERTY TREE EDITORIAL - -[CRED101] -JAMES WORRALL - -[CRED102] -DAN HOUSER - -[CRED103] -ADAM TEDMAN - -[CRED104] -PAUL YEATES - -[CRED105] -JENEFER GROSS - -[CRED106] -LAURA PATERSON - -[CRED107] -CUT-SCENES - -[CRED108] -SCRIPT BY DAN HOUSER AND JAMES WORRALL - -[CRED109] -AUDIO DIRECTED BY DAN HOUSER - -[CRED110] -AUDIO PRODUCED BY RENAUD SEBBANE - -[CRED111] -CAST - -[CRED112] -FRANK VINCENT AS SALVATORE LEONE - -[CRED113] -JOE PANTOLIANO AS LUIGI GOTERELLI - -[CRED114] -MICHAEL MADSEN AS TONI CIPRIANI - -[CRED115] -MICHAEL RAPAPORT AS JOEY LEONE - -[CRED116] -DEBBI MAZAR AS MARIA - -[CRED117] -KYLE MACLACHAN AS DONALD LOVE - -[CRED118] -ROBERT LOGGIA AS RAY MACHOWSKI - -[CRED119] -GURU AS 8-BALL - -[CRED120] -SONDRA JAMES AS MOMMA - -[CRED121] -LIANA PAI AS ASUKA - -[CRED122] -LES MAU AS KENJI - -[CRED123] -CYNTHIA FARRELL AS CATALINA - -[CRED124] -AL ESPINOSA AS MIGUEL - -[CRED125] -CHRIS PHILLIPS AS EL BURRO - -[CRED126] -HUNTER PLATIN AS CHICO - -[CRED127] -WALTER MUDU AS D-ICE - -[CRED128] -CURTIS MCCLARIN AS CURTLY - -[CRED129] -BILL FIORE AS DARKEL - -[CRED130] -CHRIS PHILLIPS AS MARTY CHONKS - -[CRED131] -HUNTER PLATIN AS CURLY BOB - -[CRED132] -WALTER MUDU AS KING COURTNEY - -[CRED133] -HUNTER PLATIN AS ONE-ARMED PHIL - -[CRED134] -KIM GURNEY AS MISTY - -[CRED135] -MOTION CAPTURE - -[CRED136] -ANIMATED BY - -[CRD136A] -ALEX HORTON - -[CRED137] -DIRECTED BY - -[CRD137A] -NAVID KHONSARI - -[CRED138] -PRODUCED BY - -[CRD138A] -JAMIE KING - -[CRD138B] -RENAUD SEBBANE - -[CRED139] -RECORDED AT MODERN UPRISING STUDIOS, BROOKLYN - -[CRED140] -ACTORS - -[CRD140A] -RENAUD SEBBANE - -[CRD140B] -GISELLE JONES - -[CRD140C] -STEPHEN DANIELS - -[CRD140D] -ROBERT STIO - -[CRD140E] -JENNY GROSS. - -[CRED141] -PEDESTRIAN DIALOGUE - -[CRED142] -WRITTEN BY DAN HOUSER, NAVID KHONSARI & JAMES WORRALL - -[CRED143] -DIRECTED BY CRAIG CONNER, DAN HOUSER AND LAZLOW - -[CRED144] -PRODUCED BY RENAUD SEBBANE - -[CRED145] -CAST - -[CRED146] -HUNTER PLATIN - -[CRED147] -DAN HOUSER - -[CRED148] -RENAUD SEBBANE - -[CRED149] -MARIA CHAMBERS - -[CRED150] -JEFF STANTON - -[CRED151] -RYAN CROY - -[CRED152] -DEENA BERMAN - -[CRED153] -MARIA CHAMBERS - -[CRED154] -ALICE B. SALTZMAN - -[CRED155] -ALEX ANTHONY SIOUKAS - -[CRED156] -SEAN R. LYNCH - -[CRED157] -AMY SALZMAN - -[CRED158] -COLIN MCSHANE - -[CRED159] -COREY WADE - -[CRED160] -GERALD COSGROVE - -[CRED161] -STEPHANIE ROY - -[CRED162] -DORIS WOO - -[CRED163] -JOSEPH GREENE - -[CRED164] -LAZLOW JONES - -[CRED165] -HSIANG LIN - -[CRED166] -STEVE MICHAEL ROBERT - -[CRED167] -MATHEW MURRAY - -[CRED168] -RICHARD HUIE - -[CRED169] -GARVIN ATWELL - -[CRED170] -STEVE KNEZEVICH - -[CRED171] -YUKIMURA SATO - -[CRED172] -FRANK CHAVEZ - -[CRED173] -LIEZL JACINTO - -[CRED174] -CANAAN MCKOY - -[CRED175] -ADAM DAVIDSON - -[CRED176] -LANCE WILLIAMS - -[CRED177] -NEIL MCCAFFREY - -[CRED178] -LAURA PATERSON - -[CRED179] -REY CONCEPCION - -[CRED180] -CHARLES HEROLD - -[CRED181] -ANDREW GREENWALD - -[CRED182] -JAMES MIELKE - -[CRED183] -PETER SUCIU - -[CRED184] -ALEX ODULIO - -[CRED185] -DON NKRUMAH - -[CRED186] -KENDALL PITTMAN - -[CRED187] -SAL SUAZO - -[CRED188] -EREK MATEO - -[CRED189] -CHRIS DIFATE - -[CRED190] -LEILA MILTON - -[CRED191] -DARREN ZOLTOWSKI - -[CRED192] -VIRGINIA SMITH - -[CRED193] -KEVIN CASSIN - -[CRED194] -JASON SHIGEMORI - -[CRED195] -KELLY KINSELLA - -[CRED196] -MOLLIE STICKNEY - -[CRED197] -STANTON SARJEANT - -[CRED198] -LAURA WALSH - -[CRED199] -MARK GARONE - -[CRED200] -JOANNA SLY - -[CRED201] -ELIZABETH HOWELL - -[CRED202] -ANA HERCULES - -[CRED203] -SHIRLEY IRICK - -[CRED204] -KASHONA FIELDS - -[CRED205] -JOEL M. LILJE - -[CRED206] -JOHN DIBENEDETTO - -[CRED207] -NANCY GILES - -[CRED208] -RYAN CROY - -[CRED209] -JENNIFER KOLBE - -[CRED210] -LIAM BURKE - -[CRED211] -SIGRID PREISSL - -[CRED212] -ANITA FITZSIMONS - -[CRED213] -PHILIPPA RASELLI - -[CRED214] -WIL QUESNEL - -[CRED215] -FALKO BURKERT - -[CRED216] -SARA SEWELL - -[CRED217] -RADIO STATIONS AND MUSIC - -[CRED218] -PRODUCERS FOR ROCKSTAR UK - -[CRD218A] -CRAIG CONNER - -[CRD218B] -STUART ROSS - -[CRED219] -SOUNDTRACK CO-ORDINATOR - -[CRED220] -TERRY DONOVAN - -[CRED221] -PRODUCER FOR ROCKSTAR GAMES - -[CRED222] -DAN HOUSER - -[CRED223] -EDITED BY - -[CRED224] -CRAIG CONNER - -[CRED225] -ALLAN WALKER - -[CRED226] -LAZLOW - -[CRED227] -DJ BANTER AND IMAGING WRITTEN BY - -[CRED228] -DAN HOUSER - -[CRED229] -LAZLOW - -[CRED230] -SPECIAL THANKS TO - -[CRED231] -ADAM TEDMAN - -[CRED232] -ALEX MASON - -[CRED233] -JUDY HENDERSON CASTING - -[CRED234] -HAMISH BROWN - -[CRED235] -CHRISSY HOBAN - -[CRED236] -INNES RICARD - -[CRED237] -LILION BROZSKA - -[CRED238] -BOB HILLARY - -[CRED239] -EMILY ANDERSON - -[CRED240] -RICHIE HENDERSON - -[CRED241] -CHRSTIAN CANTAMESSA - -[CRED242] -JERONIMO BARRERA - -[CRED243] -ALEXANDER ILLES - -[CRED244] -BARANE CHAN - -[CRED245] -DUNCAN SHIELDS - -[CRED246] -BARANE CHAN - -[CRED247] -DEREK PAYNE - -[CRED248] -KEVIN WONG - -[CRED249] -ROSS ELLIOTT - -[CRED250] -ROSS BEAZLEY - -[CRED251] -ALEX BAZLINTON - -[CRED252] -DAVE WATSON - -[CRED253] -MALCOLM SMITH - -[CRED255] -ANDREW SEMPLE - -[CRED256] -ARTIST - -[CRED257] -STUART PETRI - -[CRED258] -JERONIMO BARRERA - -[CRED259] -CARLY SLATER - -[CRED260] -GREG LAU - -[CRED261] -STEVE KNEZEVICH - -[CRED262] -DEVIN WINTERBOTTOM - -[CRED263] -JAMEEL VEGA - -[CRED264] -LEE CUMMINGS - -[CRED265] -DEVIN BENNET - -[CRED266] -ELIZABETH SATTERWHITE - -[CRED267] -AARON RIGBY - -[CRED268] -STEVE K. - -[CRED269] -GREG LAU - -[CINCAM] -Cámara Cinemática - -[KM1_13] -Lleva el vehículo al garaje! - -[KM3_14] -~r~¡Has sido ubicado, se rompió el trato!! - -[EBAL_H] -Espera aquí tío, mientras voy y hablo con Luigi. - -[EBAL_M] -¡Recuerda que nadie se mete con mis chicas! - -[LM2_F] -Entonces coge su coche y repíntalo. - -[LM2_D] -aquí, aquí, cógelo. - -[LM1_9] -Hola, soy Misty. - -[LM4_A] -Algún Diablo mal nacido ha estado vendiendo a sus putitas en mi patio de atrás. - -[FM2_B] -¡Nos hicimos con una rata! - -[FM2_C] -No está ni 'chuleando' ni 'traficando' así que debe de estar hablando. - -[FM3_CC] -~w~Regresa, hermano, cuando tengas el dinero. - -[FEDS_AM] -<>- CAMBIAR MENU - -[LOVE5_5] -~r~¡Fallaste protegiendo el camión! - -[RM6_6] -~r~¡Ray está muerto! - -[RM6_7] -~r~¡Ray ha perdido su avión! - -[RM6_8] -~g~Has dejado atrás a Ray, vuelve a por él. - -[FM1_10] -~g~Has dejado atrás a María, vuelve y recógela. - -[LOVE4_9] -~r~¡El avión ha sido destrozado! - -[LOV4_10] -~r~¡La única pista del lugar donde está el paquete ha sido destruída! - -[KM2_D] -No hace falta decir que debemos darle los coches como un regalo, para pagar la deduda que tenemos con él. - -[KM4_B] -El negocio es lo suficientemente afortunado como para permitir que nuestra protección salde sus cuentas hoy mismo. - -[KM2_E] -Debes obtener los coches de la lista y llevarlos a un garaje detrás del aparcamiento de Newport. - -[FM3_8I] -~w~Consigue una posición ventajosa, entonces entraré cuando dispares el primer tiro. - -[LOVE1_B] -La experiencia me ha enseñado que un hombre como tú puede ser muy leal por el precio correcto, - -[LOVE1_H] -pero los grupos de hombres se hacen ambiciosos. - -[LOVE1_C] -Un valioso recurso, un viejo caballero oriental que conozco, - -[LOVE1_I] -ha sido tomado prisionero por unos sudamericanos en Aspatria. - -[MEA4_D] -He aceptado verle... - -[MEA4_B4] -Marty te envió, ¿ahh?. VALE, voy a enseñar a ese asqueroso el significado de la palabra negocio. - -[MEA4_B5] -¡Carl, hola! y eehh... necesito más tiempo para conseguir tu dinero. - -[MEA1_B4] -Ah, el Sr. Chonks te envió, ¿verdad?. Vamos a hacerle una visita al amiguete. - -[HM5_6] -Vamos a romperle el cuello a algún que otro mamón. - -[LOVE1_5] -~g~Deja de perder el tiempo, hazte con un coche de la mafia Colombiana y rescata al socio de Love. - -[AS1_D] -~w~Actúa como cebo y consigue que los escuadrones de la muerte te sigan hasta Pike Creek. - -[AS1_E] -~w~donde algunos de mis hombres estarán esperándoles. - -[AS2_C] -~w~el Cartel tiene una compañía de tapadera, el Kappa Coffe House. - -[AS2_E] -~w~No tenemos otra opción que poner esos puntos de venta de droga fuera de servicio. - -[AS2_F] -~w~¡¡Redúcelos a astillas!! - -[AS2_A1] -~w~Ciertamente Miguel tiene algo de esa famosa resistencia latina. - -[AS2_A2] -~w~Estoy muy agotado. - -[SIREN_3] -Para conectar las sirenas de este vehículo pulsa el ~h~ botón ~k~~VEHICLE_HORN~ ~w~. - -[SIREN_4] -Para conectar las sirenas de este vehículo golpea el ~h~ botón ~k~~VEHICLE_HORN~ ~w~. - -[AS3_C] -~w~¡Eeeeeeyoooo! ¿Qué ES esa cosa amarilla pegajosa? - -[AS3_C1] -~w~Oh, hola nena. - -[AS3_F] -~w~Tiene los atributos de una chica muy natural, esta nena. - -[AS3_F1] -~w~Se las ha arreglado para quitarle esta pequeña joya a nuestro invitado. - -[AS3_G] -~w~Hay un avión que está llegando al Francis International en 2 horas. - -[AS3_G1] -~w~Está lleno de veneno de Catalina. - -[AS3_H] -~w~Puedes evitar la seguridad del aeropuerto sacando un bote hasta las boyas luminosas. - -[AS3_H1] -y disparando al avión en su aterrizaje. - -[AS3_I] -~w~¡Recoge el cargamento de los escombros! - -[AS3_J] -~w~Oh, ten cuidado ahora, ¿VALE nena? - -[AS3_K] -~w~Ahora prueba el aceite picante... - -[RM2_F1] -¡Esos colombianos estarán aquí en cualquier momento! - -[RM2_K] -Maldición, ¡¡están aquí!! ¡¡ECHA EL PESTILLO Y CARGA!! - -[LOVE2_7] -~g~ ¡Ahora tira el coche! - -[LOVE2_8] -~g~¡Ahora sal de Newport! - -[AM1_F] -Salvatore Leone saldrá de Luigis a eso de las (~1~: ~1~). - -[LOVE5_C] -Quiero que le sigas, y asegúrate que tanto él como mi paquete llegan a Pike Creek sin daño alguno. - -[FESZ_SR] -¡Error al guardar! Comprueba la memory card (PS2) de la ranura de MEMORY CARD 1 e inténtalo de nuevo. - -[FESZ_FO] -¿Deseas formatear la memory card (PS2) en la ranura de MEMORY CARD 1? - -[FELZ_FO] -La memory card (PS2) de la ranura de MEMORY CARD 1 no tiene formato. - -[FES_NOC] -No hay memory card (PS2) en la ranura de MEMORY CARD 1. - -[FES_LOE] -¡Error al cargar! Comprueba la memory card (PS2) de la ranura de MEMORY CARD 1 e inténtalo de nuevo. - -[FES_DEE] -¡Error al borrar! Comprueba la memory card (PS2) de la ranura de MEMORY CARD 1 e inténtalo de nuevo. - -[FORSUC] -Memory card (PS2) de la ranura de MEMORY CARD 1 formateada con éxito. - -[ERFOUN] -¡Error al formatear la memory card (PS2)! - -[ERMCNP] -No hay memory card (PS2) en la ranura de MEMORY CARD 1. - -[SVMEM1] -Guardar en la memory card (PS2) de la ranura de MEMORY CARD 1. - -[FORSLO] -Formatear memory card (PS2) de la ranura de MEMORY CARD 1. - -[SLONFM] -¡Error al formatear la memory card (PS2)! - -[SLONDR] -No hay espacio suficiente en la memory card (PS2). Inserta una memory card (PS2) con, al menos, 500KB de espacio libre en la ranura de MEMORY CARD 1. - -[SLNSP] -No hay espacio suficiente en la memory card (PS2). Inserta una memory card (PS2) con, al menos, 200KB de espacio libre en la ranura de MEMORY CARD 1. - -[FEFD_WR] -Formateando la memory card (PS2) de la ranura de MEMORY CARD 1. No extraigas la memory card (PS2), ni reinicies, o apagues la consola. - -[FES_ISF] -NO PRESENTE - -[FES_SAG] -PRESENTE - -[SLONNO] -No hay memory card (PS2) en la ranura de MEMORY CARD 1. - -[SLONNF] -La memory card (PS2) de la ranura de MEMORY CARD 1 no tiene formato. - -[FESZ_FM] -La memory card (PS2) de la ranura de MEMORY CARD 1 no tiene formato. ¿Deseas formatear la memory card (PS2)? - -[FESZ_FF] -Error al formatear! Por favor comprueba la memory card (PS2) de la ranura de MEMORY CARD 1 e inténtalo de nuevo. - -[MCDNSP] -No hay espacio suficiente en la memory card (PS2) de la ranura de MEMORY CARD 1. Inserta una memory card (PS2) con, al menos, 500KB de espacio libre para guardar los datos de esta aplicación. ¿Deseas empezar? (SI o NO) - -[MCGNSP] -No hay espacio suficiente en la memory card (PS2) de la ranura de MEMORY CARD 1. Se necesitan al menos 200KB para guardar los datos de esta aplicación. ¿Deseas empezar? (SI o NO) - -[FESZ_WR] -Guardando datos. No extraigas la memory card (PS2) de la ranura de MEMORY CARD 1, ni reinicies, o apagues la consola. - -[FESZ_OW] -Sobrescribiendo datos. No extraigas la memory card (PS2) de la ranura de MEMORY CARD 1, ni reinicies, o apagues la consola. - -[FELD_WR] -Cargando datos. No extraigas la memory card (PS2) de la ranura de MEMORY CARD 1, ni reinicies, o apagues la consola. - -[FEDL_WR] -Borrando datos. No extraigas la memory card (PS2) de la ranura de MEMORY CARD 1, ni reinicies, o apagues la consola. - -[LM2_C] -Luigi dijo que, que te diera esto y así... - -[LM3_G] -Joey no es a quien estabas esperando, ¿recuerdas?, tienes el pie en la puerta... - -[LM5_E] -Consigue tanto dinero como puedas antes de que los policías se lo metan en el bolsillo. - -[JM5_C] -De acuerdo, hay un coche cargado con un fiambre en el café cercano a Callahan Point. - -[RM2_B] -Tuvimos acción en Nicaragua, en aquellos tiempos cuando el país sabía lo que estaba haciendo - -[RM2_C] -Algunos cerdos del Cartel le asustaron ayer, y dijeron que volverían hoy para quitarle parte de su almacén. - -[RM2_D1] -Iría yo mismo pero la vieja ciática está molestándome otra vez -achís, achís-, esto, ehhh... buena suerte. - -[CATINF1] -~g~¡Captura a Catalina! - -[CATINF2] -~g~Sigue al helicóptero para encontrar a Catalina. - -[BOATIN1] -Sube a un bote y pulsa el ~h~botón ~k~~VEHICLE_ENTER_EXIT~~w~ para entrar. - -[BOATIN2] -Puedes pulsar el ~h~botón ~k~~VEHICLE_ENTER_EXIT~~w~ si estás cerca de un bote para abordarlo. - -[BOATIN3] -Sube a un bote y pulsa el ~h~botón ~k~~VEHICLE_ENTER_EXIT~~w~ para entrar. - -[BOATIN4] -Puedes pulsar el ~h~botón ~k~~VEHICLE_ENTER_EXIT~~w~ si estás cerca de un bote para abordarlo. - -[JM6] -'LA HUÍDA' - -[FM1] -'CARABINA' - -[JM1] -'EL ULTIMO ALMUERZO DE 'MIKE 'LABIOS' - -[FM21] -'BOMBARDEA ESA BASE: ACTO I' - -[FM3] -'BOMBARDEA ESA BASE: ACTO II' - -[AM1] -'SAYONARA, SALVATORE' - -[AM2] -'BAJO VIGILANCIA' - -[KM2] -'GRAND THEFT AUTO' - -[AS3] -'S.A.M.' - -[RM2] -'SUMINISTRO DE ARMAS' - -[LOVE6] -'SEÑUELO' ' - -[LOVE1] -'EL LIBERADOR' - -[RC1] -'DESTRUCCIÓN DEL DIABLO' - -[RC2] -'LA MASACRE DE LA MAFIA' - -[RC3] -'CALAMIDAD EN EL CASINO' - -[RC4] -'ATAQUE RUMPO' - -[RM2_E1] -¡No puedo creer que esos bastardos de la barriga amarilla me dejaran sin la cobertura necesaria otra vez! - -[GREN_1] -Cuanto más tiempo pulses el ~h~botón ~k~~PED_FIREWEAPON~~w~, más lejos lanzarás la granada. - -[GREN_2] -Cuanto más tiempo pulses el ~h~botón ~k~~PED_FIREWEAPON~~w~, más lejos lanzarás la granada. - -[GREN_3] -Cuanto más tiempo pulses el ~h~botón ~k~~PED_FIREWEAPON~~w~, más lejos lanzarás la granada. - -[LOVE4_G] -Mi propiedad estará esperándote en el angar de aduanas del avión. - -[KABOOM] -¡BOOM! - -[SPLAT] -¡PLOF! - -[PANCAK] -¡APLASTADO! - -[SOAKED] -¡EMPAPADO! - -[HEAD] -HEAD RADIO - -[DBL_CLF] -DOUBLE CLEF FM - -[FLASHB] -FLASHBACK FM - -[RISE] -RISE FM - -[LIPS] -LIPS 106 - -[CHAT] -CHATTERBOX FM - -[K_JAH] -K-JAH Radio - -[GAM_FM] -GAME FM - -[MSX_FM] -MSX FM - -[TUBE1] -Cuando el metro abra, podrás coger un tren hasta Staunton Island - -[TUBE2] -Cuando Shoreside Vale abra podrás salir por la terminal de Shoreside al aeropuerto Francis International. - -[TUBE_2] -Para abordar un tren del metro, pulsa el ~h~ botón 'entrar al vehículo' ~w~. - -[LEGAL] -~g~¡Eliminar la amenaza criminal! - -[GA_2] -Nuevo motor y trabajo de pintura. ¡Los policías no te reconocerán! - -[LM1_8A] -Para ganar un poco de dinero extra, por qué no 'tomar prestado' un taxi... - -[TAXIH1] -Para cerca de un peatón señalado para recogerlo, luego condúcelo a su destino antes de que se acabe el tiempo. - -[LM5_7] -~g~¡Menos de cuatro chicas trabajando el ~p~ Fuzz Ball ~g~ y Luigi no será feliz! - -[KM2_3] -~g~Recuerda los ~r~ coches ~g~ tienen que estar en perfecto estado para ser aceptados en el ~p~ garaje ~g~. - -[KM5_2] -~g~Un Yardie anda por las calles. - -[BETRA_A] -Perdón, cariño. - -[BETRA_B] -Soy una chica ambiciosa ¿y tú?, - -[BETRA_C] -eres tiempo perdido. - -[JAILB_Q] -Vamos! - -[JAILB_R] -Señor picha-boba! - -[JAILB_S] -No hay problema en matarte. - -[JAILB_T] -Vas a sentirlo. - -[JAILB_U] -De acuerdo, de acuerdo. Piérdete. - -[HELP15] -Cuando vayas a pié pulsa el ~h~botón ~k~~PED_LOOKBEHIND~~w~ para ~h~ mirar atrás ~w~. - -[FEC_LB3] -Mira detrás - -[FEC_R3] -(botón R3) - -[FES_AFO] -Esta memory card (PS2) ya está formateada. - -[FEA_UP] -; - -[FEA_DO] -= - -[FEA_LE] -< - -[FEA_RI] -> - -[FEDSAS3] -- CAMBIAR SELECCION - -[FEDSAS4] -;=<> - CAMBIAR SELECCION - -[SPRAY_4] -Usa el ~h~ botón ~k~~PED_FIREWEAPON~~w~ para disparar el cañón de agua. - -[SPRAY_1] -Usa el ~h~ botón ~k~~PED_FIREWEAPON~~w~ para disparar el cañón de agua. - -[LITTLE] -LITTLE T - -[NICK] -NICK LOVE - -[AM1_10] -~g~Salvatore estará abandonando Luigi's aproximadamente a las 0~1~:~1~. - -[JAILB_V] -la ciudad de Liberty hoy está conmocionada. - -[JAILB_A] -Así la policía y los servicios de urgencias se encargan de las secuelas ... - -[JAILB_B] -de un ataque devastador a un convoy policial ocurrido esta mañana. - -[JAILB_C] -Ningún detalle se ha hecho público sobre los prisioneros que estaban siendo trasladados en el convoy, - -[JAILB_D] -Y ningún grupo ha admitido su responsabilidad. - -[JAILB_E] -El convoy abandonó las oficinas de la policía a primera hora de esta mañana... - -[JAILB_F] -con el objeto de hacer una transferencia de rutina a la penitenciaría de Liberty. - -[JAILB_G] -El ataque se produjo en el puente de Callahan, - -[JAILB_H] -dejando pocos testigos y el puente notablemente dañado. - -[JAILB_I] -Se cree que algunos de los convictos han perecido en la explosión... - -[JAILB_J] -que siguió al ataque inicial. - -[JAILB_W] -Pasadas las horas parece evidente que el ataque propinado a la policía se llevó a cabo por profesionales, - -[JAILB_K] -Cuando la identificación de los delincuentes ausentes se había complicado más aún... - -[JAILB_L] -por un ataque de piratas informático a las bases de datos de los cuarteles de la policía. - -[JAILB_O] -Con el proyecto del túnel Porter fuera del plazo previsto, - -[JAILB_P] -el desastre deja a Portland aislada del resto de la ciudad. - -[JAILB_M] -* - -[JAILB_N] -* - -[JAILB_X] -En una declaración realizada hoy previamente, - -[FEDS_SE] -Botón / - ELEGIR - -[FEDS_SB] -Botón / - ELEGIR Botón " - VOLVER - -[TM4_A] -~w~Oh, eres tú. TONI no está aquí. - -[TM4_A2] -~w~Pero ha dejado para ti una de sus encantadoras cartas de amor. - -[DIAB2_A] -¡Puse en marcha mi negocio de entretenimiento exótico de la nada, excepto lo que cabía en mis pantalones de cuero! - -[LM5_9] -CHICAS: - -[PERPIC] -Paquetes Ocultos encontrados - -[CO_ONE] -Paquete Oculto ~1~ de ~1~ - -[LOVE3_3] -~g~El avión ha tirado ~1~de los 6 paquetes. - -[FARE11] -~g~Destino ~w~'Lugar en obras' ~g~ en Fort Staunton. - -[GA_21] -No puedes almacenar más coches en este aparcamiento. - -[CHEAT1] -Trampas activadas - -[CHEAT2] -Arma trucada - -[CHEAT3] -Salud trucada - -[CHEAT4] -Armadura trucada - -[CHEAT5] -Nivel de Se Busca trucado - -[CHEAT6] -Dinero trucado - -[CHEAT7] -Clima trucado - -[AS1_H] -~r~¡¡No has conseguido guiar al Escuadrón de la Muerte a la trampa del Yakuza!! - -[FEDS_BA] -Botón "- VOLVER - -[RAMP_A] -¡COMPLETADAS TODAS LAS RAMPAS! - -[USJ_ALL] -¡COMPLETADAS TODAS LOS MANIOBRAS ÚNICAS! - -[FARE23] -~g~Destino ~w~'garaje importación exportación' ~g~en el distrito de Cochrane Dam - -[L_TRN_1] -Puedes alcanzar el tren-L que rodea Portland. Pulsa el ~h~ botón ~k~~VEHICLE_ENTER_EXIT~~w~ para ~h~entrar ~w~o salir~w~de un tren. - -[L_TRN_2] -Puedes alcanzar el tren-L que rodea Portland. Pulsa el ~h~ botón ~k~~VEHICLE_ENTER_EXIT~~w~ para ~h~entrar ~w~o salir~w~de un tren. - -[S_TRN_1] -Puedes tomar los trenes subterráneos que recorren Liberty. Pulsa el ~h~ botón ~k~~VEHICLE_ENTER_EXIT~~w~ para ~h~entrar ~w~o salir~w~de un tren. - -[S_TRN_2] -Puedes tomar los trenes subterráneos que recorren Liberty. Pulsa el ~h~ botón ~k~~VEHICLE_ENTER_EXIT~~w~ para ~h~entrar ~w~o salir~w~de un tren. - -[AS1_C] -~w~Ella cuenta con tres escuadrones de la muerte que patrullan por Liberty y cuyo único objetivo es el de darte caza. - -[AS1_G] -~r~¡¡Todos los Yakuza están muertos!! - -[JAN] -Ene - -[FEB] -Feb - -[MAR] -Mar - -[APR] -Abr - -[MAY] -May - -[JUN] -Jun - -[JUL] -Jul - -[AUG] -Ago - -[SEP] -Sept - -[OCT] -Oct - -[NOV] -Nov - -[DEC] -Dic - -[DEFDT] ---:---:---- --:--:-- - -[BUGGY] -COCHES RESTANTES: - -[BONUS] -~g~EXTRA ~1~$ - -[HORN1] -Pulsa el ~h~botón L3 ~w~ para tocar el ~h~claxon. - -[HORN2] -Pulsa el ~h~botón L1 ~w~ para tocar el ~h~claxon. - -[HORN3] -Pulsa el ~h~botón R1 ~w~ para tocar el ~h~claxon. - -[LM3_1A] -Pulsa el ~h~botón ~k~~VEHICLE_HORN~~w~ para tocar el ~h~claxon y hacer saber a Misty que estás allí. - -[LM3_1B] -Pulsa el ~h~botón ~k~~VEHICLE_HORN~~w~ para tocar el ~h~claxon y hacer saber a Misty que estás allí. - -[LM3_1C] -Pulsa el ~h~botón ~k~~VEHICLE_HORN~~w~ para tocar el ~h~claxon y hacer saber a Misty que estás allí. - -[RADIO_A] -Pulsa el ~h~botón ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ para moverte por las ~h~emisoras de radio. - -[RADIO_B] -Pulsa el ~h~botón ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ para moverte por las ~h~emisoras de radio. - -[RADIO_C] -Pulsa el ~h~botón ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ para moverte por las ~h~emisoras de radio. - -[RADIO_D] -Pulsa el ~h~botón ~k~~VEHICLE_CHANGE_RADIO_STATION~~w~ para moverte por las ~h~emisoras de radio. - -[FEC_EXV] -Entrar y salir del vehículo - -[TAXI_M] -'TAXISTA' - -[COP_M] -'VIGILANTE' - -[FIRE_M] -'BOMBERO' - -[AMBUL_M] -'PARAMÉDICO' - -[HJ_IS] -PRIMA POR ESCENA LOCA: ~1~$ - -[HJ_PIS] -PRIMA POR ESCENA LOCA PERFECTA ~1~$ - -[HJ_DIS] -PRIMA POR DOBLE ESCENA LOCA ~1~$ - -[HJ_PDIS] -PRIMA POR DOBLE ESCENA LOCA PERFECTA ~1~$ - -[HJ_TIS] -PRIMA POR TRIPLE ESCENA LOCA ~1~$ - -[HJ_PTIS] -PRIMA POR TRIPLE ESCENA LOCA PERFECTA ~1~$ - -[HJ_QIS] -PRIMA POR CUÁDRUPLE ESCENA LOCA ~1~$ - -[HJ_PQIS] -PRIMA POR CUÁDRUPLE ESCENA LOCA PERFECTA ~1~$ - -[AM1_K] -Salvatore Leone estará saliendo de Luigi's en unas tres horas. (0~1~:~1~) - -[IMPEXPP] -El garaje Importación Exportación, Puerto de Portland. Tenemos órdenes para varios vehículos. Revisa nuestro tablón de notas para ver necesidades. - -[VANHSTP] -¿Algunos coches de seguridad cascados? Llévalos a nuestro garaje en el Puerto de Portland. - -[EMVHPUP] -Se han pagado grandes porcentajes por coches nuevos/usados. Llévalos a la grúa que hay al noroeste del Puerto de Portland. - -[STANDS] -ESCALERAS ROTAS: - -[STASH] -¡~g~Guarda el SPANK en la parte trasera de la ~p~zona en construcción! - -[MCSTNS] -No hay memory card (PS2) insertada en la ranura para MEMORY CARD 1. ¿Quieres empezar? (SI o NO) - -[LOVE3_5] -~g~El avión está ahora a tu alcance. - -[LOVE3_6] -¡~r~La Poli encontró antes los paquetes! - -[SIREN_1] -Para poner en marcha las sirenas de estos coches, pulsa el ~h~botón ~k~~VEHICLE_HORN~~w~. - -[SIREN_2] -Para poner en marcha las sirenas de estos coches, pulsa el ~h~botón ~k~~VEHICLE_HORN~~w~. - -[FM3_8C] -~w~Necesitaré 100.000 $ para cubrir gastos. - -[MCLOAD] -Cargando datos. No extraigas la memory card (PS2) de la ranura de MEMORY CARD 1, ni reinicies, o apagues la consola. - -[FES_GME] -Error al leer la memory card (PS2) de la ranura de MEMORY CARD 1. Por favor compruébalo e inténtalo de nuevo. - -[FESZ_QF] -¿Estás seguro que quieres formatear la memory card (PS2) de la ranura de MEMORY CARD 1? - -[FESZ_LS] -Cargado con éxito. - -[RM3_5] -~g~Tienes ~1~ de 6 paquetes de pruebas. - -[LOVE3_2] -¡~g~Tienes todos los paquetes! Llévalos de vuelat a Donald Love. - -[LOVE4_4] -¡~g~Lleva el paquete de vuelta a Donald Love! - -[FEB_SAV] -Cargar - -[FEP_SAV] -CARGAR JUEGO - -[AS2_12A] -Después de destrozar el primer puesto, ¡tendrás 8 mintutos antes que el Cartel envíe a sus matones! - -[AS3_1A] -¡~g~Ahora vete al ~b~boya del aeropuerto! - -[NOCONT] -Por favor, para continuar vuelve a conectar un mando analógico (DUALSHOCK#) o mando analógico (DUALSHOCK#2) en el puerto de mando 1. - -[BET_JB] -TRAICIONADO POR CATALINA, SU AMANTE Y ABANDONADO PARA QUE MURIERA. CONDENADO Y SENTENCIADO, INICIA SU VIAJE A LA PRISIÓN DE LIBERTY CITY. PERO SÓLO TIENE UN PENSAMIENTO... ¡VENGANZA! - -[END_A] -Los Residentes de Cedar Groove se adaptan a las consecuencias - -[END_B] -emocionales tras el estallido de la guerra - -[END_C] -que se produjo ayer en la zona. - -[END_D] -Un residente local, Clive Denver describió a la policía - -[END_E] -a un hombre armado huyendo de la escena, acompañado de una mujer de pelo negro. - -[END_F] -Oh, sabes, vamos a pasar un buen rato, porqué lo sabes. - -[END_G] -Te quiero, Yo, yo, yo realmente te quiero, porque eres un hombre tan fuerte - -[END_H] -y eso es todo lo que necesito. - -[END_I] -Bueno, ¿qué estaba diciendo? - -[END_J] -Oh, sabes, lo he olvidado. Pero sabes lo que quiero decir, ¿verdad? - -[END_K] -El sonido de las explosiones sacudieros las casas más próximas, la gente se esconde. - -[END_L] -Varios ciudadanos resultaron heridos a causa del tiroteo entre - -[END_M] -las fuerzas terrestres y un helicóptero que rodeaba a la presa. - -[END_N] -Sí, aquí en los jardínes tenemos una vista excelente. - -[END_O] -Cuando finalmente el helicóptero consiguió escapar, - -[END_P] -mejor que los fuegos artificiales del 4 de Julio. - -[END_Q] -Con un número de víctimas superior a veinte, - -[END_R] -la policía continúa buscando cuerpos. - -[END_S] -No han habido desmentidos oficiales acerca de los rumores - -[END_T] -de que los muertos eran miembros de Cartel Colombiano, - -[END_U] -y se sigue sin pistas que aclaren las causas de la masacre. - -[END_V] -Me he roto una uña y me pelo hecho un asco, ¿puedes creértelo? - -[PAPER1] -UN DISPARO CRIMINAL REALIZADO POR SU NOVIA Y CÓMPLICE. EL TRIBUNAL CON UN VERDICTO ANÓNIMO, ENCUENTRA CULPABLE AL LADRÓN ARMADO. - -[PAPER2] -¡DIEZ AÑOS POR AMOR! - -[END_W] -Me ha costado cincuenta dólares... - -[FEB_CPC] -Configuración del control - -[FEC_PED] -Controles a pie - -[FEC_VEH] -Controles en vehículo - -[FEC_FPR] -Controles en primera persona - -[FEC_CMM] -Controles comunes - -[FEC_PWL] -IR a la izquierda - -[FEC_PWR] -IR a la derecha - -[FEC_PWF] -Andar hacia delante - -[FEC_PWT] -Andar hacia la cámara - -[FEC_PLB] -Mirar hacia atrás. - -[FEC_PFR] -Disparar arma - -[FEC_CLE] -Cambiar Arma a la Izq. - -[FEC_CRI] -Cambiar Arma a la Dcha. - -[FEC_LKT] -Bloquear objetivo - -[FEC_PJP] -Salto Peatón - -[FEC_PSP] -Sprint Peatón - -[FEC_PSH] -Disparar Peatón - -[FEC_TLF] -Siguiente objetivo a la izq. - -[FEC_TRG] -Siguiente objetivo a la dcha. - -[FEC_CCM] -Centrar cámara detrás del jugador. - -[FEC_SZI] -Acercar rifle francotirador - -[FEC_SZO] -Alejar rifle francotirador - -[FEC_LKL] -Mirar izq. en primera persona - -[FEC_LRT] -Mirar dcha. en primera persona - -[FEC_LUP] -Mirar arr. en primera persona - -[FEC_LDN] -Mirar abj. en primera persona - -[FEC_LBH] -Mirar hacia atrás en vehículo - -[FEC_LLF] -Mirar a la izq. en vehículo - -[FEC_LRG] -Mirar a la dch. en vehículo - -[FEC_HRN] -Claxon - -[FEC_HBR] -Freno de mano del vehículo - -[FEC_ACL] -Acelerar vehículo - -[FEC_BRK] -Frenar vehículo - -[FEC_TSM] -Intercambiar SubMisiones Sí/No - -[FEC_CRD] -Cambiar emisoras de radio - -[FEC_ENT] -Entrar/Salir del vehículo - -[FEC_WPN] -Disparar arma - -[FEC_PAS] -Pausa - -[FEC_FPO] -Cambiar armas primera persona. - -[FEC_SMS] -Cambiar puntero del ratón. - -[FEC_CMS] -Cambiar modo cámara en todas situaciones. - -[FEC_TSS] -Capturar pantalla - -[FEN_STA] -INICIAR JUEGO - -[FEN_NET] -Red - -[FEN_CON] -Conexión - -[FEN_GAM] -Buscar juego - -[FEN_TYP] -Tipo de juego - -[FEN_TY0] -Duelo a muerte - -[FEN_TY1] -Duelo a muerte sigiloso - -[FEN_TY2] -Equipo Duelo a muerte - -[FEN_TY3] -Duelo a muerte sigiloso en equipo - -[FEN_TY4] -Acumula efectivo - -[FEN_TY5] -Captura la bandera - -[FEN_TY6] -Rat race - -[FEN_TY7] -Dominación - -[FEN_NAM] -Nombre: - -[FEN_GNA] -Nombre del juego: - -[FEM_MAP] -Elegir mapa - -[FEN_PLS] -Ajustes del jugador - -[FEN_PLC] -Color del jugador - -[FEM_MA0] -Liberty City - -[FEM_MA1] -RedLight - -[FEM_MA2] -Chinatown - -[FEM_MA3] -La Torre - -[FEM_MA4] -La alcantarilla - -[FEM_MA5] -Zona industrial - -[FEM_MA6] -Los muelles - -[FEM_MA7] -Staunton - -[FEC_EMS] -Por favor sólo teclas de teclado. - -[FEC_DBG] -Menú de depuración - -[FEC_TGD] -Cambiar mando de juego/depuración - -[FEC_TDO] -Cambiar cámara depuración No - -[FEC_IVH] -Invertir horizontalidad ratón - -[FEC_MSL] -BIR - -[FEC_MSM] -BCR - -[FEC_MSR] -BDR - -[FEC_QUE] -??? - -[FEC_TWO] -Permitidas sólo dos teclas del teclado - -[FEC_UMS] -Por favor sólo teclas de ratón. - -[FEC_OMS] -Permitida sólo una tecla del ratón - -[FEC_UJS] -Por favor sólo botones de joystick. - -[FEC_OJS] -Permitido sólo un botón de joystick por acción - -[FEC_PTL] -Usar Bloquear objetivo al cambiar arma a izq. - -[FEC_PTR] -Usar Bloquear objetivo al cambiar arma a dcha. - -[FEC_LBC] -Usar Mirar a izq. con Mirar a la dcha. - -[FEC_JBO] -JOY ~1~ - -[NO_PAUZ] -No se puede detener en multijugador. ¡Pulsa 2 veces para salir! - -[FEM_SL1] -Hueco 1 libre - -[FEM_SL2] -Hueco 2 libre - -[FEM_SL3] -Hueco 3 libre - -[FEM_SL4] -Hueco 4 libre - -[FEM_SL5] -Hueco 5 libre - -[FEM_SL6] -Hueco 6 libre - -[FEM_SL7] -Hueco 7 libre - -[FEM_SL8] -Hueco 8 libre - -[FEM_MM] -MENÚ PRINCIPAL - -[FEM_SNG] -Iniciar nuevo juego - -[FEM_QTW] -Salir - -[FEQ_SRE] -¿Estás seguro de querer salir? Se perderán todos los progresos desde la última partida guardada. ¿Quieres proceder? - -[FEQ_SRW] -¿Estás seguro de querer salir del juego? - -[FEG_SRV] -SERVIDOR - -[FEG_MAP] -MAPA - -[FEG_PLY] -JUGADORES - -[FEG_TYP] -TIPO - -[FEG_PNG] -PING - -[FET_FG] -DETECTAR JUEGO - -[FET_SP] -JUGADOR INDIVIDUAL - -[FET_MP] -MULTIJUGADOR - -[FET_HG] -ALOJAR JUEGO - -[FET_PS] -CONFIG. JUGADOR - -[FET_CON] -CONEXIÓN - -[FET_AUD] -CONFIG. AUDIO - -[FET_GFX] -CONFIG. GFX - -[FET_DIS] -AJUSTE DE PANTALLA - -[FET_LAN] -DEFINIR IDIOMA - -[FET_LG] -CARGAR JUEGO - -[FET_DG] -BORRAR JUEGO - -[FET_NG] -PARTIDA NUEVA - -[FET_SG] -GUARDAR JUEGO - -[FET_MAP] -ELEGIR MAPA - -[FET_GT] -TIPO DE JUEGO - -[FET_CTL] -AJUSTE DEL MANDO - -[FET_OPT] -OPCIONES - -[FET_QG] -SALIR DEL JUEGO - -[FET_STA] -ESTADÍSTICAS - -[FET_BRE] -INFORMES - -[FEC_WAR] -Aviso - -[FEC_OKK] -Aceptar - -[FED_CON] -Confirmación borrar archivo - -[FES_SSC] -Juego guardado con éxito. - -[DEL_FNM] -Juego eliminado con éxito. - -[PCLOAD] -Cargando datos del juego - -[PCRESRT] -Reiniciando Grand Theft Auto III - -[FEC_DLF] -Error al borrar. - -[FEC_SVU] -Error al guardar. - -[FEC_LUN] -Error al cargar. Archivo dañado, por favor borrar. - -[FEN_PLA] -Número de Jugadores: - -[FET_NON] -NO HAY PARTIDAS DISPONIBLES - -[FET_SFG] -BUSCANDO PARTIDAS... - -[FET_SRT] -ORDENANDO PARTIDAS... - -[FEF_LAN] -RED LOCAL - -[FEF_INT] -INTERNET - -[FET_REF] -Refrescar - -[FET_FIL] -Filtro - -[FET_JG] -Unirse - -[FEC_NTW] -Talk To Network - -[FEC_ESR] -Tecla Esc limitada - -[FEC_GSL] -Show head bob: - -[FIL_FLT] -FILTRAR LISTAS DE JUEGOS - -[FET_SAN] -INICIAR NUEVA PARTIDA - -[FIL_MAP] -Mapa: - -[FIL_SRV] -Servidor: - -[FIL_TYP] -Tipo de juego: - -[FIL_SPC] -¿Juegos con espacio disponible? - -[FIL_PNG] -Ping: - -[FEN_UKH] -Anfitrión desconocido - -[FEN_UKM] -Mapa no encontrado - -[FEN_UKT] -Tipo de juego no encontrado - -[FEN_NCI] -NO CONECTADO A INTERNET - -[FET_PAU] -MENÚ PAUSA - -[FET_SGA] -INICIAR JUEGO - -[FEC_SGJ] -Establecer Joystick de juego - -[FEC_PAD] -Gamepad - -[FEC_JOY] -Joystick - -[FEC_WHL] -Volante - -[FEC_CNT] -Tipo de mando: - -[FET_APL] -APLICAR - -[FES_CSA] -Seleccionar aspecto de la lista inferior: - -[FES_SKN] -NOMBRE DEL ASPECTO - -[FES_DAT] -FECHA - -[FES_NON] -NO HAY SKINS DISPONIBLES - -[FEA_FM9] -REPRODUCTOR MP3 - -[FESZ_QZ] -¿Estás seguro que deseas guardar esta partida? - -[FES_CGA] -Huecos del juego disponibles: - -[FES_SCG] -¿Guardar el juego actual? - -[FES_LCG] -¿Cargar el juego y seguir jugando? - -[FEC_FIR] -Disparar - -[FEC_NWE] -Siguiente arma - -[FEC_PWE] -Arma anterior - -[FEC_FOR] -Avanzar - -[FEC_BAC] -Hacia atrás - -[FEC_LEF] -Izquierda - -[FEC_RIG] -Derecha - -[FEC_ZIN] -Acercar zoom - -[FEC_ZOT] -Alejar zoom - -[FEC_EEX] -Entrar+salir - -[FEC_RAD] -Radio - -[FEC_SUB] -Rendición - -[FEC_CMR] -Cambiar cámara - -[FEC_JMP] -Saltar - -[FEC_SPN] -Esprint - -[FEC_HND] -Freno de mano - -[FEC_TUL] -Torreta a la izqd. - -[FEC_TUR] -Torreta a la dcha. - -[FEC_LOL] -Mirar a la izq. - -[FEC_LOR] -Mirar a la dcha. - -[FEC_NTR] -Siguiente objetivo - -[FEC_PTT] -Objetivo anterior - -[FEC_LBA] -Mirar atrás - -[FEC_CEN] -Centrar cámara - -[FEC_UND] -(NO) - -[FET_CFT] -A PIE - -[FET_CCR] -EN VEHÍCULO - -[CVT_MSG] -Convertir texturas a un formato óptimo para tu tarjeta de vídeo - -[FET_CAC] -ACCIÓN - -[FEC_IBT] -- - -[FEC_SPC] -BES - -[FEC_MXO] -MXB1 - -[FEC_MXT] -MXB2 - -[FEC_UNB] -SIN ESTABLECER - -[FET_CME] -MÉTODO DE CONTROL - -[FET_RDK] -REDEFINIR CONTROLES - -[FET_AMS] -AJUSTES DEL RATÓN - -[FET_STI] -CONFIGURACIÓN DE CONTROL ESTÁNDAR - -[FET_CTI] -CONFIGURACIÓN DE CONTROL CLÁSICA - -[FET_MTI] -CONFIGURACIÓN DE CONTROL DEL RATÓN - -[FET_DAM] -MODELADO ACÚSTICO DINÁMICO - -[FEC_TFL] -Torre Izquierda - -[FEC_TFR] -Torre derecha - -[FEC_TFU] -Torre /Dodo arriba - -[FEC_TFD] -Torre /Dodo abajo - -[FEC_MWF] -RUEDA ARR - -[FEC_MWB] -RUEDA AB - -[FEC_ORR] -o - -[FEC_NUS] -SIN USO - -[FEC_LUD] -Mirar Ar - -[FEC_LDU] -Mirar Ab - -[FEC_CMP] -COMOBO: MIRAR I+D - -[FEC_NTT] -No hay texto para esta tecla - -[FEC_FNC] -F~1~ - -[FEC_IRT] -INS - -[FEC_DLL] -SUP - -[FEC_HME] -INICIO - -[FEC_END] -FIN - -[FEC_PGU] -REPAG - -[FEC_PGD] -AVPAG - -[FEC_UPA] -ARRIBA - -[FEC_DWA] -ABAJO - -[FEC_LFA] -IZQDA - -[FEC_RFA] -DCHA - -[FEC_NUM] -NUM. - -[FEC_NMN] -NUM. ~1~ - -[FEC_FWS] -NUM. / - -[FEC_PLS] -NUM. + - -[FEC_MIN] -NUM. - - -[FEC_DOT] -NUM. . - -[FEC_NLK] -BLOQ NUM - -[FEC_ETR] -INTRO - -[FEC_SLK] -BLOQ DESPL - -[FEC_PSB] -PAUSA INTER - -[FEC_BSP] -RETROCEDER - -[FEC_TAB] -TAB - -[FEC_CLK] -BLOQ MAYÚS - -[FEC_RTN] -INTRO - -[FEC_LSF] -MAYÚS IZQ - -[FEC_RSF] -MAYÚS DCH - -[FEC_LCT] -CONTROL I - -[FEC_RCT] -CONTROL D - -[FEC_LAL] -ALT I - -[FEC_RAL] -ALT D - -[FEC_LWD] -WIN I - -[FEC_RWD] -WIN D - -[FEC_WRC] -APMENÚ - -[WIN_TTL] -Grand Theft Auto III - -[WIN_95] -Grand Theft Auto III no se puede ejecutar bajo W95 - -[WIN_DX] -Grand Theft Auto III necesita al menos la versión 8.1 de DirectX - -[WIN_VDM] -Grand Theft Auto III necesita al menos 12MB de espacio de memoria de vídeo - -[DIAB3_G] -¡Arriba! - -[FEM_RES] -REANUDAR JUEGO - -[FES_SNG] -INICIAR NUEVO JUEGO - -[FEM_SP] -Jugador individual - -[FEM_MP] -MULTIJUGADOR - -[FEM_QT] -SALIR - -[FES_SG] -INICIAR NUEVA PARTIDA - -[FES_LG] -CARGAR JUEGO - -[FEM_HST] -ALOJAR JUEGO - -[FEM_OPT] -OPCIONES - -[FEM_DBG] -Corregir errores - -[FET_PSU] -CONFIG. JUGADOR - -[FET_DEF] -RESTAURAR VALORES - -[FED_BRI] -BRILLO - -[FED_TRA] -RASTROS - -[FEM_LOD] -DISTANCIA DE REPRESENTACIÓN - -[FEM_VSC] -SINCRONÍA DE IMAGEN - -[FEM_FRM] -LIMITADOR DE CUADROS - -[FED_RES] -RESOLUCIÓN DE PANTALLA - -[FED_WIS] -PANTALLA PANORÁMICA - -[FEDS_TB] -ATRÁS - -[FEA_MUS] -VOLUMEN DE LA MÚSICA - -[FEA_SFX] -VOLUMEN DE EFECTOS - -[FEA_RSS] -EMISORA DE RADIO - -[FEL_ENG] -INGLÉS - -[FEL_FRE] -FRANCÉS - -[FEL_GER] -ALEMÁN - -[FEL_ITA] -ITALIANO - -[FEL_SPA] -ESPAÑOL - -[FEA_3DH] -HARDWARE DE SONIDO - -[FEA_SPK] -AJUSTE DE ALTAVOCES - -[FEA_2SP] -2 ALTAVOCES - -[FEA_4SP] -MÁS DE 2 ALTAVOCES - -[FEA_EAR] -MICRÓFONOS - -[FEA_NAH] -NO HAY HARDWARE DE SONIDO - -[FET_SNG] -INICIAR NUEVO JUEGO - -[GMSAVE] -GUARDAR JUEGO - -[FES_DGA] -BORRAR JUEGO - -[FEC_IVV] -INVERTIR VERTICALIDAD RATÓN - -[FEC_MSH] -SENSIBILIDAD DEL RATÓN - -[FET_CCN] -COTROLES: CLÁSICOS - -[FET_SCN] -CONTROLES: ESTÁNDAR - -[FES_SET] -Usar skin - -[GHOST] -Ghost - -[WIN_RSZ] -Error al seleccionar nueva pantalla de resolución - -[FET_APP] -BIR, VOLVER A APLICAR LOS AJUSTES - -[FET_HRD] -AJUSTES POR DEFECTO RESTAURADOS - -[FET_MST] -CONDUCCIÓN CONTROLADA POR EL RATÓN - -[FEC_STR] -NUM. INICIO - -[FET_MIG] -IZQUIERDA, DERECHA, RUEDA DEL RATÓN PARA AJUSTAR - -[FET_CIG] -RETROCESO PARA QUITAR - BIR, VOLVER A CAMBIAR - -[FET_RIG] -SELECCIONAR NUEVO CONTROL PARA ESTA ACCIÓN O ESC PARA CANCELAR - -[FET_EIG] -NO SE PUEDE DEFINIR UN CONTROL PARA ESTA ACCIÓN - -[NO_PCCD] -Por favor, introduce el disco 2 de Grand Theft Auto III en la unidad o pulsa ESC para cancelar - -[CVT_ERR] -Te has quedado sin espacio en el disco duro. Por favor, antes de seguir consigue algo de espacio en tu disco duro. Pulsa ESC para cancelar. - -[FED_SUB] -SUBTÍTULOS - -[FET_DSN] -Aspecto por defecto del jugador.bmp - -[JM3] -'VAN HEIST' - -[EBAL] -'DÁME LIBERTAD' - -[LM4] -'EXPLOSIVA ACCIÓN MACARRA' - -[REPLAY] -VOLVER A JUGAR - -[FEC_SFT] -MAYÚS - -[CRED254] -JEFE DE ESTUDIO - -[CVT_CRT] -No se pueden convertir texturas con tu tarjeta de vídeo. Debes conectarte con una cuenta de Administrador para hacerlo. Pulsa ESC para salir. - -[FEM_ON] -SÍ - -[FEM_OFF] -NO - -[FEM_YES] -SÍ - -[FEM_NO] -NO - -[FES_WAR] -Guardando, por favor espera... - -[FED_DLW] -Borrando, por favor espera... - -[FED_LDW] -Cargando, por favor espera... - -[FEC_SLC] -Ranura en mal estado - -[FED_LFL] -Error al cargar el juego. El juego se reiniciará. - -[FET_RSO] -RESTAURADO AJUSTE ORIGINAL - -[FET_RSC] -HARDAWARE NO DISPONIBLE. RESTAURADO AJUSTE ORIGINAL HARDWARE NOT AVAILABLE - ORIGINAL SETTING RESTORED - -[CRED270] -MIKE HONG - -[DUMMY] -THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file From 489743da419b0da842e82dc6d430f6f3d8752055 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 14 Aug 2020 17:34:04 +0300 Subject: [PATCH 052/112] Darkel fixes --- src/control/Darkel.cpp | 16 +++++++++++----- src/control/Darkel.h | 6 +++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/control/Darkel.cpp b/src/control/Darkel.cpp index cfd58340..02627f33 100644 --- a/src/control/Darkel.cpp +++ b/src/control/Darkel.cpp @@ -30,9 +30,9 @@ int8 CDarkel::InterruptedWeapon; * makes game handle sounds & messages instead of SCM (just like in GTA2) * but it's never been used in the game. Has unused sliding text when frenzy completed etc. */ -int8 CDarkel::bStandardSoundAndMessages; -int8 CDarkel::bNeedHeadShot; -int8 CDarkel::bProperKillFrenzy; +bool CDarkel::bStandardSoundAndMessages; +bool CDarkel::bNeedHeadShot; +bool CDarkel::bProperKillFrenzy; uint16 CDarkel::Status; uint16 CDarkel::RegisteredKills[NUM_DEFAULT_MODELS]; int32 CDarkel::ModelToKill; @@ -108,9 +108,15 @@ CDarkel::DrawMessages() sprintf(gString, "%d", (CDarkel::KillsNeeded >= 0 ? CDarkel::KillsNeeded : 0)); AsciiToUnicode(gString, gUString); CFont::SetColor(CRGBA(0, 0, 0, 255)); - CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(144.0f), gUString); +#ifdef FIX_BUGS +#define DARKEL_COUNTER_HEIGHT 143.0f +#else +#define DARKEL_COUNTER_HEIGHT 128.0f +#endif + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT + 1.0f), gUString); CFont::SetColor(CRGBA(255, 128, 128, 255)); - CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(143.0f), gUString); + CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT), gUString); +#undef DARKEL_COUNTER_HEIGHT break; } case KILLFRENZY_PASSED: diff --git a/src/control/Darkel.h b/src/control/Darkel.h index 14529c63..0f5c2329 100644 --- a/src/control/Darkel.h +++ b/src/control/Darkel.h @@ -24,9 +24,9 @@ private: static int32 AmmoInterruptedWeapon; static int32 KillsNeeded; static int8 InterruptedWeapon; - static int8 bStandardSoundAndMessages; - static int8 bNeedHeadShot; - static int8 bProperKillFrenzy; + static bool bStandardSoundAndMessages; + static bool bNeedHeadShot; + static bool bProperKillFrenzy; static uint16 Status; static uint16 RegisteredKills[NUM_DEFAULT_MODELS]; static int32 ModelToKill; From f403a63a5cc2262dc2a10f4963140aceff15e681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Fri, 14 Aug 2020 18:54:01 +0300 Subject: [PATCH 053/112] Wheelie opcode --- src/control/Script.cpp | 20 +++++++++++++------- src/core/PlayerInfo.cpp | 36 ++++++++++++++++++------------------ src/core/PlayerInfo.h | 12 ++++++------ 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 69b8ee4f..0c3d269c 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -12725,14 +12725,20 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_GET_WHEELIE_STATS: { CollectParameters(&m_nIp, 1); - static bool bShowed = false; - if (!bShowed) { - debug("GET_WHEELIE_STATS not implemented\n"); - bShowed = true; - } - for (int i = 0; i < 6; i++) - ScriptParams[i] = 0; + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + ScriptParams[0] = pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels; + ScriptParams[1] = pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels; + ScriptParams[2] = pPlayerInfo->m_nLastTimeSpentOnWheelie; + ScriptParams[3] = pPlayerInfo->m_nLastDistanceTravelledOnWheelie; + ScriptParams[4] = pPlayerInfo->m_nLastTimeSpentOnStoppie; + ScriptParams[5] = pPlayerInfo->m_nLastDistanceTravelledOnStoppie; StoreParameters(&m_nIp, 6); + pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels = 0; + pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels = 0; + pPlayerInfo->m_nLastTimeSpentOnWheelie = 0; + pPlayerInfo->m_nLastDistanceTravelledOnWheelie = 0; + pPlayerInfo->m_nLastTimeSpentOnStoppie = 0; + pPlayerInfo->m_nLastDistanceTravelledOnStoppie = 0; return 0; } //case COMMAND_DISARM_CHAR: diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index f5f6a684..256bc1b7 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -160,12 +160,12 @@ CPlayerInfo::Clear(void) m_nTimeSpentOnStoppie = 0; m_nDistanceTravelledOnStoppie = 0.0f; m_nCancelWheelStuntTimer = 0; - m_nPrevTimeCarSpentOnTwoWheels = 0; - m_nPrevDistanceCarTravelledOnTwoWheels = 0; - m_nPrevTimeSpentOnWheelie = 0; - m_nPrevDistanceTravelledOnWheelie = 0; - m_nPrevTimeSpentOnStoppie = 0; - m_nPrevDistanceTravelledOnStoppie = 0; + m_nLastTimeCarSpentOnTwoWheels = 0; + m_nLastDistanceCarTravelledOnTwoWheels = 0; + m_nLastTimeSpentOnWheelie = 0; + m_nLastDistanceTravelledOnWheelie = 0; + m_nLastTimeSpentOnStoppie = 0; + m_nLastDistanceTravelledOnStoppie = 0; m_bInfiniteSprint = false; m_bFastReload = false; m_bFireproof = false; @@ -415,8 +415,8 @@ CPlayerInfo::Process(void) m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); } else { if (m_nTimeCarSpentOnTwoWheels >= 2000) { - m_nPrevTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; - m_nPrevDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; + m_nLastTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; + m_nLastDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000) CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000; if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels) @@ -443,8 +443,8 @@ CPlayerInfo::Process(void) } else { if (m_nTimeCarSpentOnTwoWheels >= 2000) { - m_nPrevTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; - m_nPrevDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; + m_nLastTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; + m_nLastDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000) CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000; if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels) @@ -456,8 +456,8 @@ CPlayerInfo::Process(void) } } else if (m_nTimeCarSpentOnTwoWheels != 0) { if (m_nTimeCarSpentOnTwoWheels >= 2000) { - m_nPrevTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; - m_nPrevDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; + m_nLastTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels; + m_nLastDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels; if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000) CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000; if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels) @@ -483,8 +483,8 @@ CPlayerInfo::Process(void) m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); } else { if (m_nTimeSpentOnWheelie >= 5000) { - m_nPrevTimeSpentOnWheelie = m_nTimeSpentOnWheelie; - m_nPrevDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie; + m_nLastTimeSpentOnWheelie = m_nTimeSpentOnWheelie; + m_nLastDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie; if (CStats::LongestWheelie < m_nTimeSpentOnWheelie / 1000) CStats::LongestWheelie = m_nTimeSpentOnWheelie / 1000; if (CStats::LongestWheelieDist < m_nDistanceTravelledOnWheelie) @@ -497,8 +497,8 @@ CPlayerInfo::Process(void) } } else if (m_nTimeSpentOnWheelie != 0) { if (m_nTimeSpentOnWheelie >= 5000) { - m_nPrevTimeSpentOnWheelie = m_nTimeSpentOnWheelie; - m_nPrevDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie; + m_nLastTimeSpentOnWheelie = m_nTimeSpentOnWheelie; + m_nLastDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie; if (CStats::LongestWheelie < m_nTimeSpentOnWheelie / 1000) CStats::LongestWheelie = m_nTimeSpentOnWheelie / 1000; if (CStats::LongestWheelieDist < m_nDistanceTravelledOnWheelie) @@ -519,8 +519,8 @@ CPlayerInfo::Process(void) m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds(); } else { if (m_nTimeSpentOnStoppie >= 2000) { - m_nPrevTimeSpentOnStoppie = m_nTimeSpentOnStoppie; - m_nPrevDistanceTravelledOnStoppie = m_nDistanceTravelledOnStoppie; + m_nLastTimeSpentOnStoppie = m_nTimeSpentOnStoppie; + m_nLastDistanceTravelledOnStoppie = m_nDistanceTravelledOnStoppie; if (CStats::LongestStoppie < m_nTimeSpentOnStoppie / 1000) CStats::LongestStoppie = m_nTimeSpentOnStoppie / 1000; if (CStats::LongestStoppieDist < m_nDistanceTravelledOnStoppie) diff --git a/src/core/PlayerInfo.h b/src/core/PlayerInfo.h index 1a8df47c..7d99a4e0 100644 --- a/src/core/PlayerInfo.h +++ b/src/core/PlayerInfo.h @@ -61,12 +61,12 @@ public: int32 m_nTimeSpentOnStoppie; float m_nDistanceTravelledOnStoppie; int32 m_nCancelWheelStuntTimer; - int32 m_nPrevTimeCarSpentOnTwoWheels; - int32 m_nPrevDistanceCarTravelledOnTwoWheels; - int32 m_nPrevTimeSpentOnWheelie; - int32 m_nPrevDistanceTravelledOnWheelie; - int32 m_nPrevTimeSpentOnStoppie; - int32 m_nPrevDistanceTravelledOnStoppie; + int32 m_nLastTimeCarSpentOnTwoWheels; + int32 m_nLastDistanceCarTravelledOnTwoWheels; + int32 m_nLastTimeSpentOnWheelie; + int32 m_nLastDistanceTravelledOnWheelie; + int32 m_nLastTimeSpentOnStoppie; + int32 m_nLastDistanceTravelledOnStoppie; int16 m_nTrafficMultiplier; int16 field_12A; float m_fRoadDensity; From e7945625b59750459ff4876f7e076b4b8d5c3aee Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 14 Aug 2020 18:57:23 +0300 Subject: [PATCH 054/112] Original screen grabber --- src/core/FileMgr.h | 1 + src/core/main.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/skel/glfw/glfw.cpp | 16 ++++++++++++++++ src/skel/platform.h | 1 + src/skel/skeleton.cpp | 9 +++++++++ src/skel/skeleton.h | 3 +++ src/skel/win/win.cpp | 17 +++++++++++++++++ 7 files changed, 85 insertions(+) diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h index 0ad9daa7..4734720e 100644 --- a/src/core/FileMgr.h +++ b/src/core/FileMgr.h @@ -19,4 +19,5 @@ public: static bool ReadLine(int fd, char *buf, int len); static int CloseFile(int fd); static int GetErrorReadWrite(int fd); + static char *GetRootDirName() { return ms_rootDirName; } }; diff --git a/src/core/main.cpp b/src/core/main.cpp index b63688ec..8458a248 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -2,6 +2,7 @@ #include "rpmatfx.h" #include "rphanim.h" #include "rpskin.h" +#include "rtbmp.h" #include "main.h" #include "CdStream.h" @@ -61,6 +62,7 @@ #include "MemoryCard.h" #include "SceneEdit.h" #include "debugmenu.h" +#include "Clock.h" GlobalScene Scene; @@ -288,6 +290,28 @@ DoFade(void) } } +bool +RwGrabScreen(RwCamera *camera, RwChar *filename) +{ + char temp[255]; + RwImage *pImage = RsGrabScreen(camera); + bool result = true; + + if (pImage == nil) + return false; + + strcpy(temp, CFileMgr::GetRootDirName()); + strcat(temp, filename); + + if (RtBMPImageWrite(pImage, &temp[0]) == nil) + result = false; + RwImageDestroy(pImage); + return result; +} + +#define TILE_WIDTH 576 +#define TILE_HEIGHT 432 + void DoRWStuffEndOfFrame(void) { @@ -296,6 +320,20 @@ DoRWStuffEndOfFrame(void) FlushObrsPrintfs(); RwCameraEndUpdate(Scene.camera); RsCameraShowRaster(Scene.camera); +#ifndef MASTER + char s[48]; + if (CPad::GetPad(1)->GetLeftShockJustDown()) { + // try using both controllers for this thing... crazy bastards + if (CPad::GetPad(0)->GetRightStickY() > 0) { + sprintf(s, "screen%d%d.ras", CClock::ms_nGameClockHours, CClock::ms_nGameClockMinutes); + // TODO + //RtTileRender(Scene.camera, TILE_WIDTH * 2, TILE_HEIGHT * 2, TILE_WIDTH, TILE_HEIGHT, &NewTileRendererCB, nil, s); + } else { + sprintf(s, "screen%d%d.bmp", CClock::ms_nGameClockHours, CClock::ms_nGameClockMinutes); + RwGrabScreen(Scene.camera, s); + } + } +#endif // !MASTER } static RwBool diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index ed442348..920bb8a9 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -181,6 +181,22 @@ psCameraShowRaster(RwCamera *camera) return; } +/* + ***************************************************************************** + */ +RwImage * +psGrabScreen(RwCamera *pCamera) +{ +#ifndef LIBRW + RwRaster *pRaster = RwCameraGetRaster(pCamera); + if (RwImage *pImage = RwImageCreate(pRaster->width, pRaster->height, 32)) { + RwImageAllocatePixels(pImage); + RwImageSetFromRaster(pImage, pRaster); + return pImage; + } +#endif + return nil; +} /* ***************************************************************************** diff --git a/src/skel/platform.h b/src/skel/platform.h index 0f314b9d..c9a8a11f 100644 --- a/src/skel/platform.h +++ b/src/skel/platform.h @@ -22,6 +22,7 @@ extern void psTerminate(void); extern void psCameraShowRaster(RwCamera *camera); extern RwBool psCameraBeginUpdate(RwCamera *camera); +extern RwImage *psGrabScreen(RwCamera *camera); extern void psMouseSetPos(RwV2d *pos); diff --git a/src/skel/skeleton.cpp b/src/skel/skeleton.cpp index 8191107e..4780316a 100644 --- a/src/skel/skeleton.cpp +++ b/src/skel/skeleton.cpp @@ -50,6 +50,15 @@ RsCameraBeginUpdate(RwCamera * camera) return psCameraBeginUpdate(camera); } +/* + ***************************************************************************** + */ +RwImage* +RsGrabScreen(RwCamera *camera) +{ + return psGrabScreen(camera); +} + /* ***************************************************************************** */ diff --git a/src/skel/skeleton.h b/src/skel/skeleton.h index b5ea5abf..1c468179 100644 --- a/src/skel/skeleton.h +++ b/src/skel/skeleton.h @@ -274,6 +274,9 @@ RsCameraBeginUpdate(RwCamera *camera); //extern void //RsMouseSetVisibility(RwBool visible); +extern RwImage* +RsGrabScreen(RwCamera *camera); + extern void RsMouseSetPos(RwV2d *pos); diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index cf4749b1..a064788c 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -238,6 +238,23 @@ psCameraShowRaster(RwCamera *camera) } +/* + ***************************************************************************** + */ +RwImage * +psGrabScreen(RwCamera *pCamera) +{ +#ifndef LIBRW + RwRaster *pRaster = RwCameraGetRaster(pCamera); + if (RwImage *pImage = RwImageCreate(pRaster->width, pRaster->height, 32)) { + RwImageAllocatePixels(pImage); + RwImageSetFromRaster(pImage, pRaster); + return pImage; + } +#endif + return nil; +} + /* ***************************************************************************** */ From 72088a000b6fc0d641f5b94f6aa6586e9e2d9e8b Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 14 Aug 2020 19:42:15 +0300 Subject: [PATCH 055/112] Don't react if player's targeting with melee --- src/peds/Ped.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index f52b373e..a15927ff 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -10232,7 +10232,11 @@ CPed::ProcessControl(void) CPed::Chat(); break; case PED_AIM_GUN: - if (m_pPointGunAt && m_pPointGunAt->IsPed() && ((CPed*)m_pPointGunAt)->CanSeeEntity(this, CAN_SEE_ENTITY_ANGLE_THRESHOLD * 2)) { + if (m_pPointGunAt && m_pPointGunAt->IsPed() +#ifdef FIX_BUGS + && !GetWeapon()->IsTypeMelee() +#endif + && ((CPed*)m_pPointGunAt)->CanSeeEntity(this, CAN_SEE_ENTITY_ANGLE_THRESHOLD * 2)) { ((CPed*)m_pPointGunAt)->ReactToPointGun(this); } PointGunAt(); From 8b3ca9564b1eeef6fd9d6296499594cfc8fec3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Fri, 14 Aug 2020 22:41:04 +0300 Subject: [PATCH 056/112] Continue to Frontend, fix savegame list bug --- src/control/Script.cpp | 12 +- src/core/Frontend.cpp | 1154 +++++++++++++------------------ src/core/Frontend.h | 6 +- src/save/GenericGameStorage.cpp | 2 +- src/save/GenericGameStorage.h | 2 +- src/save/PCSave.cpp | 8 +- 6 files changed, 510 insertions(+), 674 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 0c3d269c..e16ba9e0 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -12727,18 +12727,18 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) CollectParameters(&m_nIp, 1); CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; ScriptParams[0] = pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels; - ScriptParams[1] = pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels; + ScriptParams[1] = *(int*)&pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels; ScriptParams[2] = pPlayerInfo->m_nLastTimeSpentOnWheelie; - ScriptParams[3] = pPlayerInfo->m_nLastDistanceTravelledOnWheelie; + ScriptParams[3] = *(int*)&pPlayerInfo->m_nLastDistanceTravelledOnWheelie; ScriptParams[4] = pPlayerInfo->m_nLastTimeSpentOnStoppie; - ScriptParams[5] = pPlayerInfo->m_nLastDistanceTravelledOnStoppie; + ScriptParams[5] = *(int*)&pPlayerInfo->m_nLastDistanceTravelledOnStoppie; StoreParameters(&m_nIp, 6); pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels = 0; - pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels = 0; + pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels = 0.0f; pPlayerInfo->m_nLastTimeSpentOnWheelie = 0; - pPlayerInfo->m_nLastDistanceTravelledOnWheelie = 0; + pPlayerInfo->m_nLastDistanceTravelledOnWheelie = 0.0f; pPlayerInfo->m_nLastTimeSpentOnStoppie = 0; - pPlayerInfo->m_nLastDistanceTravelledOnStoppie = 0; + pPlayerInfo->m_nLastDistanceTravelledOnStoppie = 0.0f; return 0; } //case COMMAND_DISARM_CHAR: diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 93061fd0..0be9daf0 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -66,8 +66,6 @@ CRGBA LIST_BACKGROUND_COLOR(49, 101, 148, 255); #define FEET_IN_METER 3.33f #endif -#define isPlainTextScreen(screen) (screen == MENUPAGE_BRIEFS || screen == MENUPAGE_STATS) - #ifdef TRIANGLE_BACK_BUTTON #define GetBackJustUp GetTriangleJustUp #define GetBackJustDown GetTriangleJustDown @@ -925,9 +923,9 @@ CMenuManager::DrawStandardMenus(bool drawCurrScreen) str = TheText.Get(aScreens[MENUPAGE_DELETE_SLOT_CONFIRM].m_aEntries[0].m_EntryName); break; case MENUPAGE_SAVE_OVERWRITE_CONFIRM: - if (Slots[m_nCurrSaveSlot + 1] == SLOT_OK) + if (Slots[m_nCurrSaveSlot] == SLOT_OK) str = TheText.Get("FESZ_QO"); - else if (Slots[m_nCurrSaveSlot + 1] == SLOT_CORRUPTED) + else if (Slots[m_nCurrSaveSlot] == SLOT_CORRUPTED) str = TheText.Get("FESZ_QZ"); else str = TheText.Get(aScreens[m_nCurrScreen].m_aEntries[0].m_EntryName); @@ -3584,7 +3582,7 @@ CMenuManager::Process(void) InitialiseChangedLanguageSettings(); if (m_bMenuActive) { - ProcessButtonPresses(); + UserInput(); ProcessFileActions(); DMAudio.Service(); @@ -3594,9 +3592,476 @@ CMenuManager::Process(void) SwitchMenuOnAndOff(); } -// TODO(Miami) +// Original name is unknown void -CMenuManager::ProcessButtonPresses(void) +CMenuManager::ProcessList(bool &optionSelected, bool &goBack) +{ + if (m_bWaitingForNewKeyBind) + return; + + if (m_nCurrScreen == MENUPAGE_SKIN_SELECT) { + m_nTotalListRow = m_nSkinsTotal; + } + if (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) { + m_nTotalListRow = m_ControlMethod == CONTROL_CLASSIC ? 30 : 25; + if (m_nSelectedListRow > m_nTotalListRow) + m_nSelectedListRow = m_nTotalListRow - 1; + } + + if (CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCrossJustDown()) { + m_bShowMouse = 0; + optionSelected = true; + } + if (CPad::GetPad(0)->GetBackspaceJustDown() && m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS && !field_159) { + if (m_nCurrExLayer == HOVEROPTION_LIST) { + m_nHoverOption = HOVEROPTION_NOT_HOVERING; + m_bWaitingForNewKeyBind = true; + m_bStartWaitingForKeyBind = true; + m_bKeyChangeNotProcessed = true; + pControlEdit = &m_KeyPressedCode; + } + } else { + field_159 = false; + } + + static PauseModeTime lastTimeClickedScrollButton = 0; + + if (CTimer::GetTimeInMillisecondsPauseMode() - lastTimeClickedScrollButton >= 200) { + m_bPressedPgUpOnList = false; + m_bPressedPgDnOnList = false; + m_bPressedUpOnList = false; + m_bPressedDownOnList = false; + m_bPressedScrollButton = false; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + } + + if (CPad::GetPad(0)->GetTabJustDown()) { + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + m_bShowMouse = false; + switch (m_nCurrExLayer) { + case HOVEROPTION_BACK: + default: + m_nCurrExLayer = HOVEROPTION_LIST; + break; + case HOVEROPTION_LIST: + m_nCurrExLayer = HOVEROPTION_USESKIN; + break; + case HOVEROPTION_USESKIN: + m_nCurrExLayer = HOVEROPTION_BACK; + } + if (((m_nCurrScreen == MENUPAGE_SKIN_SELECT) && (m_nCurrExLayer == HOVEROPTION_USESKIN)) && strcmp(m_aSkinName, m_PrefsSkinFile) == 0) { + m_nCurrExLayer = HOVEROPTION_BACK; + } + if ((m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) && (m_nCurrExLayer == HOVEROPTION_USESKIN)) { + m_nCurrExLayer = HOVEROPTION_BACK; + } + } + + bool pressed = false; + if (CPad::GetPad(0)->GetUp() || CPad::GetPad(0)->GetAnaloguePadUp() || CPad::GetPad(0)->GetDPadUpJustDown()) { + m_bShowMouse = false; + pressed = true; + } else if (CPad::GetPad(0)->GetMouseWheelUpJustUp()) { + m_bShowMouse = true; + pressed = true; + } + + // Up + if (pressed) { + m_nCurrExLayer = HOVEROPTION_LIST; + if (!m_bPressedUpOnList) { + m_bPressedUpOnList = true; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + ScrollUpListByOne(); + } + } else { + m_bPressedUpOnList = false; + } + + pressed = false; + if (CPad::GetPad(0)->GetDown() || CPad::GetPad(0)->GetAnaloguePadDown() || CPad::GetPad(0)->GetDPadDownJustDown()) { + m_bShowMouse = false; + pressed = true; + } else if (CPad::GetPad(0)->GetMouseWheelDownJustDown()) { + m_bShowMouse = true; + pressed = true; + } + + // Down + if (pressed) { + m_nCurrExLayer = HOVEROPTION_LIST; + if (!m_bPressedDownOnList) { + m_bPressedDownOnList = true; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + ScrollDownListByOne(); + } + } else { + m_bPressedDownOnList = false; + } + + if (m_nCurrScreen != MENUPAGE_KEYBOARD_CONTROLS) { + if (!CPad::GetPad(0)->GetPageUp()) { + m_bPressedPgUpOnList = false; + } else { + m_nCurrExLayer = HOVEROPTION_LIST; + if (!m_bPressedPgUpOnList) { + m_bPressedPgUpOnList = true; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + m_bShowMouse = false; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + PageUpList(false); + } + } + if (!CPad::GetPad(0)->GetPageDown()) { + m_bPressedPgDnOnList = false; + } else { + m_nCurrExLayer = HOVEROPTION_LIST; + if (!m_bPressedPgDnOnList) { + m_bPressedPgDnOnList = true; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + m_bShowMouse = false; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + PageDownList(false); + } + } + if (CPad::GetPad(0)->GetHome()) { + m_nCurrExLayer = HOVEROPTION_LIST; + m_bShowMouse = false; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + if (m_nTotalListRow >= MAX_VISIBLE_LIST_ROW) { + m_nFirstVisibleRowOnList = 0; + } + m_nSelectedListRow = 0; + m_nScrollbarTopMargin = (SCROLLBAR_MAX_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList; + } + if (CPad::GetPad(0)->GetEnd()) { + m_nCurrExLayer = HOVEROPTION_LIST; + m_bShowMouse = false; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + if (m_nTotalListRow >= MAX_VISIBLE_LIST_ROW) { + m_nFirstVisibleRowOnList = m_nTotalListRow - MAX_VISIBLE_LIST_ROW; + } + m_nSelectedListRow = m_nTotalListRow - 1; + m_nScrollbarTopMargin = (SCROLLBAR_MAX_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList; + } + } + + if (CPad::GetPad(0)->GetEscapeJustDown() || CPad::GetPad(0)->GetBackJustDown()) { + m_bShowMouse = false; + goBack = true; + } + + if (CPad::GetPad(0)->GetLeftMouseJustDown()) { + switch (m_nHoverOption) { + case HOVEROPTION_BACK: + goBack = true; + break; + case HOVEROPTION_PAGEUP: + PageUpList(true); + break; + case HOVEROPTION_PAGEDOWN: + PageDownList(true); + break; + case HOVEROPTION_USESKIN: + if (m_nSkinsTotal > 0) { + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); + m_pSelectedSkin = m_pSkinListHead.nextSkin; + strcpy(m_PrefsSkinFile, m_aSkinName); + CWorld::Players[0].SetPlayerSkin(m_PrefsSkinFile); + SaveSettings(); + } + } + } + + if (CPad::GetPad(0)->GetLeftMouseJustDown()) { + switch (m_nHoverOption) { + case HOVEROPTION_OVER_SCROLL_UP: + m_nHoverOption = HOVEROPTION_CLICKED_SCROLL_UP; + break; + case HOVEROPTION_OVER_SCROLL_DOWN: + m_nHoverOption = HOVEROPTION_CLICKED_SCROLL_DOWN; + break; + case HOVEROPTION_LIST: + m_nHoverOption = HOVEROPTION_SKIN; + } + } else if ((CPad::GetPad(0)->GetLeftMouseJustUp()) + && ((m_nHoverOption == HOVEROPTION_CLICKED_SCROLL_UP || (m_nHoverOption == HOVEROPTION_CLICKED_SCROLL_DOWN)))) { + m_nHoverOption = HOVEROPTION_NOT_HOVERING; + } + + if (!CPad::GetPad(0)->GetLeftMouse()) { + holdingScrollBar = false; + } else { + if ((m_nHoverOption == HOVEROPTION_HOLDING_SCROLLBAR) || holdingScrollBar) { + holdingScrollBar = true; + // TODO: This part is a bit hard to reverse. Not much code tho + assert(0 && "Holding scrollbar isn't done yet"); + } else { + switch (m_nHoverOption) { + case HOVEROPTION_OVER_SCROLL_UP: + case HOVEROPTION_CLICKED_SCROLL_UP: + if (!m_bPressedScrollButton) { + m_bPressedScrollButton = true; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + ScrollUpListByOne(); + } + break; + case HOVEROPTION_OVER_SCROLL_DOWN: + case HOVEROPTION_CLICKED_SCROLL_DOWN: + if (!m_bPressedScrollButton) { + m_bPressedScrollButton = true; + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); + ScrollDownListByOne(); + } + break; + default: + m_bPressedScrollButton = false; + } + } + } +} + +void +CMenuManager::UserInput(void) +{ + bool goBack = false; + bool optionSelected = false; + bool goUp = false; + bool goDown = false; + int8 changeValueBy; + + if (!m_AllowNavigation && m_menuTransitionProgress == 255) + m_AllowNavigation = true; + if (!m_bShowMouse && m_nCurrScreen != MENUPAGE_MAP && (m_nMouseOldPosX != m_nMousePosX || m_nMouseOldPosY != m_nMousePosY)) { + m_bShowMouse = true; + } + + static int oldOption = -99; + oldOption = m_nCurrOption; + for (int rowToCheck = 0; rowToCheck < NUM_MENUROWS; ++rowToCheck) { + if (aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action == MENUACTION_NOTHING || + aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action == MENUACTION_LABEL) + continue; + + int extraOffset = 0; + if (aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action == MENUACTION_RADIO) + extraOffset = MENURADIO_ICON_SCALE; + + if (m_nMousePosY > MENU_Y(aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Y) && + m_nMousePosY < MENU_Y(aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Y + MENU_DEFAULT_LINE_HEIGHT)) { + static int oldScreen = m_nCurrScreen; + + m_nOptionMouseHovering = rowToCheck; + if (m_nMouseOldPosX != m_nMousePosX || m_nMouseOldPosY != m_nMousePosY) { + m_nCurrOption = rowToCheck; + m_bShowMouse = true; + } + + int action = aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action; + if (action != MENUACTION_BRIGHTNESS && action != MENUACTION_DRAWDIST && action != MENUACTION_MUSICVOLUME + && action != MENUACTION_SFXVOLUME && action != MENUACTION_MOUSESENS && action != MENUACTION_MP3VOLUMEBOOST) + m_nHoverOption = HOVEROPTION_RANDOM_ITEM; + + break; + } + if (m_bShowMouse && m_nMenuFadeAlpha == 255) { + m_nOptionMouseHovering = oldOption; + m_nCurrOption = oldOption; + } + } + + if (m_bShowMouse) { + if (oldOption != m_nCurrOption) { + if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_LABEL) { + ++m_nCurrOption; + ++m_nOptionMouseHovering; + } + m_nOptionHighlightTransitionBlend = 0; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); + } + } + + m_nMouseOldPosX = m_nMousePosX; + m_nMouseOldPosY = m_nMousePosY; + m_nMousePosX = m_nMouseTempPosX; + m_nMousePosY = m_nMouseTempPosY; + + if (m_nMousePosX < 0) m_nMousePosX = 0; + if (m_nMousePosX > SCREEN_WIDTH) m_nMousePosX = SCREEN_WIDTH; + if (m_nMousePosY < 0) m_nMousePosY = 0; + if (m_nMousePosY > SCREEN_HEIGHT) m_nMousePosY = SCREEN_HEIGHT; + + changeValueBy = 0; + if (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS || m_nCurrScreen == MENUPAGE_SKIN_SELECT) { + ProcessList(optionSelected, goBack); + } else { + // TODO(Miami): Seperate that code into a new function from ProcessButtonPresses + // ProcessScrollingExceptLists(goBack); + + if (m_AllowNavigation && + (CPad::GetPad(0)->GetDownJustDown() || CPad::GetPad(0)->GetAnaloguePadDown() || CPad::GetPad(0)->GetDPadDownJustDown())) { + m_bShowMouse = false; + goDown = true; + m_nOptionHighlightTransitionBlend = 0; + + } + else if (m_AllowNavigation && + (CPad::GetPad(0)->GetUpJustDown() || CPad::GetPad(0)->GetAnaloguePadUp() || CPad::GetPad(0)->GetDPadUpJustDown())) { + m_bShowMouse = false; + goUp = true; + m_nOptionHighlightTransitionBlend = 0; + } + + if ((m_nCurrOption == 0) && (m_nCurrScreen == MENUPAGE_PAUSE_MENU)) { + if (CPad::GetPad(0)->GetEnterJustUp() || CPad::GetPad(0)->GetCrossJustUp()) { + m_bShowMouse = false; + optionSelected = true; + } + } + else { + if (CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCrossJustDown()) { + m_bShowMouse = false; + optionSelected = true; + } + } + + if (CPad::GetPad(0)->GetLeftMouseJustUp() && m_nCurrScreen != MENUPAGE_MAP) { + // TODO(Miami): New radio selector + if (m_nHoverOption == HOVEROPTION_RANDOM_ITEM) { + m_nCurrOption = m_nOptionMouseHovering; + optionSelected = true; + } + } + // TODO(Miami): This part is old radio selector, remove when new is reversed!! + else if (CPad::GetPad(0)->GetLeftMouseJustDown()) { + if (m_nHoverOption >= HOVEROPTION_RADIO_0 && m_nHoverOption <= HOVEROPTION_RADIO_9) { + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); + m_PrefsRadioStation = m_nHoverOption - HOVEROPTION_RADIO_0; + SaveSettings(); + DMAudio.SetRadioInCar(m_PrefsRadioStation); + DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); + OutputDebugString("FRONTEND RADIO STATION CHANGED"); + } + } + + if (CPad::GetPad(0)->GetLeftMouse()) { + switch (m_nHoverOption) { + case HOVEROPTION_INCREASE_BRIGHTNESS: + case HOVEROPTION_INCREASE_MP3BOOST: + case HOVEROPTION_INCREASE_DRAWDIST: + case HOVEROPTION_INCREASE_MUSICVOLUME: + case HOVEROPTION_INCREASE_SFXVOLUME: + case HOVEROPTION_INCREASE_MOUSESENS: + CheckSliderMovement(1); + break; + case HOVEROPTION_DECREASE_BRIGHTNESS: + case HOVEROPTION_DECREASE_MP3BOOST: + case HOVEROPTION_DECREASE_DRAWDIST: + case HOVEROPTION_DECREASE_MUSICVOLUME: + case HOVEROPTION_DECREASE_SFXVOLUME: + case HOVEROPTION_DECREASE_MOUSESENS: + CheckSliderMovement(-1); + break; + } + } + + if (CPad::GetPad(0)->GetLeftMouseJustUp() || CPad::GetPad(0)->GetLeftJustUp() || CPad::GetPad(0)->GetRightJustUp() + || CPad::GetPad(0)->GetDPadLeftJustUp() || CPad::GetPad(0)->GetDPadRightJustUp() + || CPad::GetPad(0)->GetAnaloguePadLeftJustUp() || CPad::GetPad(0)->GetAnaloguePadRightJustUp() + || CPad::GetPad(0)->GetMouseWheelUpJustDown() || CPad::GetPad(0)->GetMouseWheelDownJustDown()) { + int option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action; + if (option == MENUACTION_BRIGHTNESS) + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0); + else if (option == MENUACTION_SFXVOLUME) + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_AUDIO_TEST, 0); + else if (option == MENUACTION_DRAWDIST || option == MENUACTION_MOUSESTEER) + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0); + + } + if (CPad::GetPad(0)->GetBackJustDown() || CPad::GetPad(0)->GetEscapeJustDown()) { + if (m_nCurrScreen != MENUPAGE_NONE && m_nCurrScreen != MENUPAGE_PAUSE_MENU && m_nCurrScreen != MENUPAGE_CHOOSE_SAVE_SLOT + && m_nCurrScreen != MENUPAGE_SAVE_CHEAT_WARNING && m_nCurrScreen != MENUPAGE_SAVING_IN_PROGRESS + && m_nCurrScreen != MENUPAGE_DELETING_IN_PROGRESS && m_nCurrScreen != MENUPAGE_OUTRO) + { + m_bShowMouse = false; + goBack = true; + } + } + + if (((goDown) || (goUp)) || (optionSelected)) { + goBack = false; + } + + } + + int curAction = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action; + if (CPad::GetPad(0)->GetLeft() || CPad::GetPad(0)->GetPedWalkLeftRight() < 0 || CPad::GetPad(0)->GetDPadLeft()) { + static PauseModeTime lastSliderDecrease = 0; + if (CTimer::GetTimeInMillisecondsPauseMode() - lastSliderDecrease > 150) { + if (curAction == MENUACTION_BRIGHTNESS || curAction == MENUACTION_MUSICVOLUME || + curAction == MENUACTION_SFXVOLUME || curAction == MENUACTION_RADIO || + curAction == MENUACTION_DRAWDIST || curAction == MENUACTION_MOUSESENS || + curAction == MENUACTION_MP3VOLUMEBOOST) + changeValueBy = -1; + + lastSliderDecrease = CTimer::GetTimeInMillisecondsPauseMode(); + } + } else if (CPad::GetPad(0)->GetRight() || CPad::GetPad(0)->GetPedWalkLeftRight() > 0 || CPad::GetPad(0)->GetDPadRight()) { + static PauseModeTime lastSliderIncrease = 0; + if (CTimer::GetTimeInMillisecondsPauseMode() - lastSliderIncrease > 150) { + if (curAction == MENUACTION_BRIGHTNESS || curAction == MENUACTION_MUSICVOLUME || + curAction == MENUACTION_SFXVOLUME || curAction == MENUACTION_RADIO || + curAction == MENUACTION_DRAWDIST || curAction == MENUACTION_MOUSESENS || + curAction == MENUACTION_MP3VOLUMEBOOST) + changeValueBy = 1; + lastSliderIncrease = CTimer::GetTimeInMillisecondsPauseMode(); + } + } + + if (CPad::GetPad(0)->GetMouseWheelUpJustDown()) { + changeValueBy = 1; + } else if (CPad::GetPad(0)->GetMouseWheelDownJustDown()) { + changeValueBy = -1; + } + + if (m_AllowNavigation) { + if (CPad::GetPad(0)->GetRightJustDown() || CPad::GetPad(0)->GetAnaloguePadRight() || CPad::GetPad(0)->GetDPadRightJustDown()) { + m_bShowMouse = false; + changeValueBy = 1; + } + } + + if (m_AllowNavigation) { + if (CPad::GetPad(0)->GetLeftJustDown() || CPad::GetPad(0)->GetAnaloguePadLeft() || CPad::GetPad(0)->GetDPadLeftJustDown()) { + m_bShowMouse = false; + changeValueBy = -1; + } + } + if (changeValueBy != 0) { + if ((m_nCurrScreen == MENUPAGE_SOUND_SETTINGS || m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS || m_nCurrScreen == MENUPAGE_CONTROLLER_PC || m_nCurrScreen == MENUPAGE_MOUSE_CONTROLS) + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_NOTHING + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_LABEL + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_YES + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_NO + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_CHANGEMENU + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_KEYBOARDCTRLS + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_GOBACK + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_RESTOREDEF + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_DRAWDIST + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_MOUSESENS + && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_MP3VOLUMEBOOST) { + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0); + } + } + ProcessButtonPresses(goDown, goUp, optionSelected, goBack, changeValueBy); +} + +// TODO(Miami) +// Also rename it to ProcessUserInput when it's done +void +CMenuManager::ProcessButtonPresses(uint8 goDown, uint8 goUp, uint8 optionSelected, uint8 goBack, int8 changeAmount) { if (m_nCurrScreen == MENUPAGE_OUTRO) return; @@ -3661,14 +4126,6 @@ CMenuManager::ProcessButtonPresses(void) if (pEditString || pControlEdit) return; - bool goBack = false; - bool optionSelected = false; - bool goUp = false; - bool goDown = false; -#ifdef TIDY_UP_PBP - bool assumeIncrease = false; -#endif - #ifdef USE_DEBUG_SCRIPT_LOADER if (m_nCurrScreen == MENUPAGE_START_MENU || m_nCurrScreen == MENUPAGE_NEW_GAME || m_nCurrScreen == MENUPAGE_NEW_GAME_RELOAD) { #ifdef RW_GL3 @@ -3687,577 +4144,6 @@ CMenuManager::ProcessButtonPresses(void) } #endif - if (!m_bShowMouse && (m_nMouseOldPosX != m_nMousePosX || m_nMouseOldPosY != m_nMousePosY)) { - m_bShowMouse = true; - } - - static int oldOption = -99; - oldOption = m_nCurrOption; - for (int rowToCheck = 0; rowToCheck < NUM_MENUROWS; ++rowToCheck) { - if (aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action == MENUACTION_NOTHING || - aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action == MENUACTION_LABEL) - continue; - - int extraOffset = 0; - if (aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action == MENUACTION_RADIO) - extraOffset = MENURADIO_ICON_SCALE; - - if (m_nMousePosY > MENU_Y(aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Y) && - m_nMousePosY < MENU_Y(aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Y + MENU_DEFAULT_LINE_HEIGHT)) { - static int oldScreen = m_nCurrScreen; - - m_nOptionMouseHovering = rowToCheck; - if (m_nMouseOldPosX != m_nMousePosX || m_nMouseOldPosY != m_nMousePosY) { - m_nCurrOption = rowToCheck; - m_bShowMouse = true; - } - - int action = aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_Action; - if (action != MENUACTION_BRIGHTNESS && action != MENUACTION_DRAWDIST && action != MENUACTION_MUSICVOLUME - && action != MENUACTION_SFXVOLUME && action != MENUACTION_MOUSESENS && action != MENUACTION_MP3VOLUMEBOOST) - m_nHoverOption = HOVEROPTION_RANDOM_ITEM; - - break; - } - if (m_bShowMouse && m_nMenuFadeAlpha == 255) { - m_nOptionMouseHovering = oldOption; - m_nCurrOption = oldOption; - } - } - - if (m_bShowMouse) { - if (oldOption != m_nCurrOption) { - if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_LABEL) { - ++m_nCurrOption; - ++m_nOptionMouseHovering; - } - m_nOptionHighlightTransitionBlend = 0; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - } - } - - m_nMouseOldPosX = m_nMousePosX; - m_nMouseOldPosY = m_nMousePosY; - m_nMousePosX = m_nMouseTempPosX; - m_nMousePosY = m_nMouseTempPosY; - - if (m_nMousePosX < 0) m_nMousePosX = 0; - if (m_nMousePosX > SCREEN_WIDTH) m_nMousePosX = SCREEN_WIDTH; - if (m_nMousePosY < 0) m_nMousePosY = 0; - if (m_nMousePosY > SCREEN_HEIGHT) m_nMousePosY = SCREEN_HEIGHT; - - if (m_nCurrScreen == MENUPAGE_SKIN_SELECT || m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) { - - if (m_nCurrScreen == MENUPAGE_SKIN_SELECT) { - m_nTotalListRow = m_nSkinsTotal; - } - if (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) { - m_nTotalListRow = m_ControlMethod == CONTROL_CLASSIC ? 30 : 25; - if (m_nSelectedListRow > m_nTotalListRow) - m_nSelectedListRow = m_nTotalListRow - 1; - } - - if (CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCrossJustDown()) { - m_bShowMouse = 0; - optionSelected = true; - } - if (CPad::GetPad(0)->GetBackspaceJustDown() && m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS && !field_159) { - if (m_nCurrExLayer == HOVEROPTION_LIST) { - m_nHoverOption = HOVEROPTION_NOT_HOVERING; - m_bWaitingForNewKeyBind = true; - m_bStartWaitingForKeyBind = true; - m_bKeyChangeNotProcessed = true; - pControlEdit = &m_KeyPressedCode; - } - } else { - field_159 = false; - } - - static PauseModeTime lastTimeClickedScrollButton = 0; - - if (CTimer::GetTimeInMillisecondsPauseMode() - lastTimeClickedScrollButton >= 200) { - m_bPressedPgUpOnList = false; - m_bPressedPgDnOnList = false; - m_bPressedUpOnList = false; - m_bPressedDownOnList = false; - m_bPressedScrollButton = false; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - } - - if (CPad::GetPad(0)->GetTabJustDown()) { - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - m_bShowMouse = false; - switch (m_nCurrExLayer) { - case HOVEROPTION_BACK: - default: - m_nCurrExLayer = HOVEROPTION_LIST; - break; - case HOVEROPTION_LIST: - m_nCurrExLayer = HOVEROPTION_USESKIN; - break; - case HOVEROPTION_USESKIN: - m_nCurrExLayer = HOVEROPTION_BACK; - } - if (((m_nCurrScreen == MENUPAGE_SKIN_SELECT) && (m_nCurrExLayer == HOVEROPTION_USESKIN)) && strcmp(m_aSkinName, m_PrefsSkinFile) == 0) { - m_nCurrExLayer = HOVEROPTION_BACK; - } - if ((m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) && (m_nCurrExLayer == HOVEROPTION_USESKIN)) { - m_nCurrExLayer = HOVEROPTION_BACK; - } - } - - bool pressed = false; - if (CPad::GetPad(0)->GetUp() || CPad::GetPad(0)->GetAnaloguePadUp() || CPad::GetPad(0)->GetDPadUpJustDown()) { - m_bShowMouse = false; - pressed = true; - } else if (CPad::GetPad(0)->GetMouseWheelUpJustUp()) { - m_bShowMouse = true; - pressed = true; - } - - // Up - if (pressed) { - m_nCurrExLayer = HOVEROPTION_LIST; - if (!m_bPressedUpOnList) { - m_bPressedUpOnList = true; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - ScrollUpListByOne(); - } - } else { - m_bPressedUpOnList = false; - } - - pressed = false; - if (CPad::GetPad(0)->GetDown() || CPad::GetPad(0)->GetAnaloguePadDown() || CPad::GetPad(0)->GetDPadDownJustDown()) { - m_bShowMouse = false; - pressed = true; - } else if (CPad::GetPad(0)->GetMouseWheelDownJustDown()) { - m_bShowMouse = true; - pressed = true; - } - - // Down - if (pressed) { - m_nCurrExLayer = HOVEROPTION_LIST; - if (!m_bPressedDownOnList) { - m_bPressedDownOnList = true; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - ScrollDownListByOne(); - } - } else { - m_bPressedDownOnList = false; - } - - if (m_nCurrScreen != MENUPAGE_KEYBOARD_CONTROLS) { - if (!CPad::GetPad(0)->GetPageUp()) { - m_bPressedPgUpOnList = false; - } else { - m_nCurrExLayer = HOVEROPTION_LIST; - if (!m_bPressedPgUpOnList) { - m_bPressedPgUpOnList = true; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - m_bShowMouse = false; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - PageUpList(false); - } - } - if (!CPad::GetPad(0)->GetPageDown()) { - m_bPressedPgDnOnList = false; - } else { - m_nCurrExLayer = HOVEROPTION_LIST; - if (!m_bPressedPgDnOnList) { - m_bPressedPgDnOnList = true; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - m_bShowMouse = false; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - PageDownList(false); - } - } - if (CPad::GetPad(0)->GetHome()) { - m_nCurrExLayer = HOVEROPTION_LIST; - m_bShowMouse = false; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - if (m_nTotalListRow >= MAX_VISIBLE_LIST_ROW) { - m_nFirstVisibleRowOnList = 0; - } - m_nSelectedListRow = 0; - m_nScrollbarTopMargin = (SCROLLBAR_MAX_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList; - } - if (CPad::GetPad(0)->GetEnd()) { - m_nCurrExLayer = HOVEROPTION_LIST; - m_bShowMouse = false; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - if (m_nTotalListRow >= MAX_VISIBLE_LIST_ROW) { - m_nFirstVisibleRowOnList = m_nTotalListRow - MAX_VISIBLE_LIST_ROW; - } - m_nSelectedListRow = m_nTotalListRow - 1; - m_nScrollbarTopMargin = (SCROLLBAR_MAX_HEIGHT / m_nTotalListRow) * m_nFirstVisibleRowOnList; - } - } - - if (CPad::GetPad(0)->GetEscapeJustDown() || CPad::GetPad(0)->GetBackJustDown()) { - m_bShowMouse = false; - goBack = true; - } - - if (CPad::GetPad(0)->GetLeftMouseJustDown()) { - switch (m_nHoverOption) { - case HOVEROPTION_BACK: - goBack = true; - break; - case HOVEROPTION_PAGEUP: - PageUpList(true); - break; - case HOVEROPTION_PAGEDOWN: - PageDownList(true); - break; - case HOVEROPTION_USESKIN: - if (m_nSkinsTotal > 0) { - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_pSelectedSkin = m_pSkinListHead.nextSkin; - strcpy(m_PrefsSkinFile, m_aSkinName); - CWorld::Players[0].SetPlayerSkin(m_PrefsSkinFile); - SaveSettings(); - } - } - } - - if (CPad::GetPad(0)->GetLeftMouseJustDown()) { - switch (m_nHoverOption) { - case HOVEROPTION_OVER_SCROLL_UP: - m_nHoverOption = HOVEROPTION_CLICKED_SCROLL_UP; - break; - case HOVEROPTION_OVER_SCROLL_DOWN: - m_nHoverOption = HOVEROPTION_CLICKED_SCROLL_DOWN; - break; - case HOVEROPTION_LIST: - m_nHoverOption = HOVEROPTION_SKIN; - } - } else if ((CPad::GetPad(0)->GetLeftMouseJustUp()) - && ((m_nHoverOption == HOVEROPTION_CLICKED_SCROLL_UP || (m_nHoverOption == HOVEROPTION_CLICKED_SCROLL_DOWN)))) { - m_nHoverOption = HOVEROPTION_NOT_HOVERING; - } - - if (!CPad::GetPad(0)->GetLeftMouse()) { - holdingScrollBar = false; - } else { - if ((m_nHoverOption == HOVEROPTION_HOLDING_SCROLLBAR) || holdingScrollBar) { - holdingScrollBar = true; - // TODO: This part is a bit hard to reverse. Not much code tho - assert(0 && "Holding scrollbar isn't done yet"); - } else { - switch (m_nHoverOption) { - case HOVEROPTION_OVER_SCROLL_UP: - case HOVEROPTION_CLICKED_SCROLL_UP: - if (!m_bPressedScrollButton) { - m_bPressedScrollButton = true; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - ScrollUpListByOne(); - } - break; - case HOVEROPTION_OVER_SCROLL_DOWN: - case HOVEROPTION_CLICKED_SCROLL_DOWN: - if (!m_bPressedScrollButton) { - m_bPressedScrollButton = true; - lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); - ScrollDownListByOne(); - } - break; - default: - m_bPressedScrollButton = false; - } - } - } - } else if (isPlainTextScreen(m_nCurrScreen)) { - if (CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetLeftMouseJustDown()) { - optionSelected = true; - } - if (CPad::GetPad(0)->GetEscapeJustDown() || CPad::GetPad(0)->GetBackJustUp()) { - if (m_nCurrScreen != MENUPAGE_START_MENU) { - goBack = true; - } - } - } else { - if (CPad::GetPad(0)->GetDownJustDown() || CPad::GetPad(0)->GetAnaloguePadDown() || CPad::GetPad(0)->GetDPadDownJustDown()) { - m_bShowMouse = false; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - goDown = true; - m_nOptionHighlightTransitionBlend = 0; - } else if (CPad::GetPad(0)->GetUpJustDown() || CPad::GetPad(0)->GetAnaloguePadUp() || CPad::GetPad(0)->GetDPadUpJustDown()) { - m_bShowMouse = false; - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - goUp = true; - m_nOptionHighlightTransitionBlend = 0; - } - - if ((m_nCurrOption == 0) && (m_nCurrScreen == MENUPAGE_PAUSE_MENU)) { - if (CPad::GetPad(0)->GetEnterJustUp() || CPad::GetPad(0)->GetCrossJustUp()) { - m_bShowMouse = false; - optionSelected = true; - } - } else { - if (CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCrossJustDown()) { - m_bShowMouse = false; - optionSelected = true; - } - } - - if (CPad::GetPad(0)->GetLeftMouseJustUp()) { -#ifndef TIDY_UP_PBP - if (((m_nCurrOption == 0) && (m_nCurrScreen == MENUPAGE_PAUSE_MENU)) && -#else - if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_RESUME && -#endif - (m_nHoverOption == HOVEROPTION_RANDOM_ITEM)) { - m_nCurrOption = m_nOptionMouseHovering; - optionSelected = true; - } - } else if (CPad::GetPad(0)->GetLeftMouseJustDown()) { -#ifdef TIDY_UP_PBP - if (m_nHoverOption >= HOVEROPTION_RADIO_0 && m_nHoverOption <= HOVEROPTION_RADIO_9) { - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = m_nHoverOption - HOVEROPTION_RADIO_0; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - } else if (m_nHoverOption == HOVEROPTION_RANDOM_ITEM - && aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action != MENUACTION_RESUME) { - m_nCurrOption = m_nOptionMouseHovering; - optionSelected = true; - } -#else - switch (m_nHoverOption) { - case HOVEROPTION_RADIO_0: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = HEAD_RADIO; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_1: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = DOUBLE_CLEF; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_2: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = JAH_RADIO; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_3: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = RISE_FM; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_4: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = LIPS_106; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_5: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = GAME_FM; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_6: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = MSX_FM; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_7: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = FLASHBACK; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_8: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = CHATTERBOX; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RADIO_9: - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - m_PrefsRadioStation = USERTRACK; - SaveSettings(); - DMAudio.SetRadioInCar(m_PrefsRadioStation); - DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); - OutputDebugString("FRONTEND RADIO STATION CHANGED"); - break; - case HOVEROPTION_RANDOM_ITEM: - if (((m_nCurrOption != 0) || (m_nCurrScreen != MENUPAGE_PAUSE_MENU)) { - m_nCurrOption = m_nOptionMouseHovering; - optionSelected = true; - } - break; - } -#endif - } - - if (CPad::GetPad(0)->GetLeftMouse()) { -#ifndef TIDY_UP_PBP - switch (m_nHoverOption) { - case HOVEROPTION_INCREASE_BRIGHTNESS: - m_PrefsBrightness = m_PrefsBrightness + 32; - if (m_PrefsBrightness < 0) { - m_PrefsBrightness = 0; - } - if (510 < m_PrefsBrightness) { - m_PrefsBrightness = 511; - } - SaveSettings(); - break; - case HOVEROPTION_DECREASE_BRIGHTNESS: - m_PrefsBrightness = m_PrefsBrightness - 32; - if (m_PrefsBrightness < 0) { - m_PrefsBrightness = 0; - } - if (510 < m_PrefsBrightness) { - m_PrefsBrightness = 511; - } - SaveSettings(); - break; - case HOVEROPTION_INCREASE_DRAWDIST: - m_PrefsLOD = m_PrefsLOD + (1.0f / 16); - m_PrefsLOD = min(1.8f, m_PrefsLOD); - CRenderer::ms_lodDistScale = m_PrefsLOD; - SaveSettings(); - break; - case HOVEROPTION_DECREASE_DRAWDIST: - m_PrefsLOD = m_PrefsLOD - (1.0f / 16); - m_PrefsLOD = max(0.8f, m_PrefsLOD); - CRenderer::ms_lodDistScale = m_PrefsLOD; - SaveSettings(); - break; - case HOVEROPTION_INCREASE_MUSICVOLUME: - m_PrefsMusicVolume = m_PrefsMusicVolume + 8; - m_PrefsMusicVolume = clamp(m_PrefsMusicVolume, 0, 127); - DMAudio.SetMusicMasterVolume(uchar)(m_PrefsMusicVolume); - SaveSettings(); - break; - case HOVEROPTION_DECREASE_MUSICVOLUME: - m_PrefsMusicVolume = m_PrefsMusicVolume - 8; - if (m_PrefsMusicVolume < 0) { - m_PrefsMusicVolume = 0; - } - if (126 < m_PrefsMusicVolume) { - m_PrefsMusicVolume = 127; - } - DMAudio.SetMusicMasterVolume(uchar)(m_PrefsMusicVolume); - SaveSettings(); - break; - case HOVEROPTION_INCREASE_SFXVOLUME: - m_PrefsSFXVolume = m_PrefsSFXVolume + 8; - if (m_PrefsSFXVolume < 0) { - m_PrefsSFXVolume = 0; - } - if (126 < m_PrefsSFXVolume) { - m_PrefsSFXVolume = 127; - } - DMAudio.SetEffectsMasterVolume(uchar)(m_PrefsSFXVolume); - SaveSettings(); - break; - case HOVEROPTION_DECREASE_SFXVOLUME: - m_PrefsSFXVolume = m_PrefsSFXVolume - 8; - if (m_PrefsSFXVolume < 0) { - m_PrefsSFXVolume = 0; - } - if (126 < m_PrefsSFXVolume) { - m_PrefsSFXVolume = 127; - } - DMAudio.SetEffectsMasterVolume(uchar)(m_PrefsSFXVolume); - SaveSettings(); - break; - case HOVEROPTION_INCREASE_MOUSESENS: - TheCamera.m_fMouseAccelHorzntl += (1.0f / 3000); - TheCamera.m_fMouseAccelHorzntl = clamp(TheCamera.m_fMouseAccelHorzntl, 1.0f / 3200, 1.0f / 200); - SaveSettings(); - break; - case HOVEROPTION_DECREASE_MOUSESENS: - TheCamera.m_fMouseAccelHorzntl -= (1.0f / 3000); - TheCamera.m_fMouseAccelHorzntl = clamp(TheCamera.m_fMouseAccelHorzntl, 1.0f / 3200, 1.0f / 200); - SaveSettings(); - break; - } -#else - switch (m_nHoverOption) { - case HOVEROPTION_INCREASE_BRIGHTNESS: - case HOVEROPTION_INCREASE_DRAWDIST: - case HOVEROPTION_INCREASE_MUSICVOLUME: - case HOVEROPTION_INCREASE_SFXVOLUME: - case HOVEROPTION_INCREASE_MOUSESENS: - CheckSliderMovement(1); - break; - case HOVEROPTION_DECREASE_BRIGHTNESS: - case HOVEROPTION_DECREASE_DRAWDIST: - case HOVEROPTION_DECREASE_MUSICVOLUME: - case HOVEROPTION_DECREASE_SFXVOLUME: - case HOVEROPTION_DECREASE_MOUSESENS: - CheckSliderMovement(-1); - break; - } -#endif - } - - if (CPad::GetPad(0)->GetLeftMouseJustUp() || CPad::GetPad(0)->GetLeftJustUp() || CPad::GetPad(0)->GetRightJustUp() - || CPad::GetPad(0)->GetDPadLeftJustUp() || CPad::GetPad(0)->GetDPadRightJustUp() - || CPad::GetPad(0)->GetAnaloguePadLeftJustUp() || CPad::GetPad(0)->GetAnaloguePadRightJustUp() - || CPad::GetPad(0)->GetMouseWheelUpJustDown() || CPad::GetPad(0)->GetMouseWheelDownJustDown()) { - int option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action; - if (option == MENUACTION_BRIGHTNESS || option == MENUACTION_DRAWDIST) - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - else if (option == MENUACTION_SFXVOLUME) - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_AUDIO_TEST, 0); - else if (option == MENUACTION_MOUSESENS) - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - - } - if (CPad::GetPad(0)->GetBackJustDown()) { - if (m_nCurrScreen != MENUPAGE_START_MENU && m_nCurrScreen != MENUPAGE_PAUSE_MENU) { - m_bShowMouse = false; - goBack = true; - } - } - - if (CPad::GetPad(0)->GetEscapeJustDown()) { - if (m_nCurrScreen != MENUPAGE_START_MENU) { - m_bShowMouse = false; - goBack = true; - } - } - - if (((goDown) || (goUp)) || (optionSelected)) { - goBack = false; - } - } - - #ifdef PS2_LIKE_MENU if (CPad::GetPad(0)->GetLeftMouseJustDown() && hoveredBottomBarOption != -1) { DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); @@ -4297,11 +4183,14 @@ CMenuManager::ProcessButtonPresses(void) } #endif + int oldOption = m_nCurrOption; if (goDown) { m_nCurrOption++; if (m_nCurrOption == NUM_MENUROWS || (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_NOTHING)) { m_nCurrOption = 0; } + if (oldOption != m_nCurrOption) + m_nOptionHighlightTransitionBlend = 0; } if (goUp) { if (m_nCurrOption == (aScreens[m_nCurrScreen].m_aEntries[0].m_Action == MENUACTION_LABEL)) { @@ -4312,6 +4201,8 @@ CMenuManager::ProcessButtonPresses(void) } else { m_nCurrOption--; } + if (oldOption != m_nCurrOption) + m_nOptionHighlightTransitionBlend = 0; } if (optionSelected) { @@ -4322,10 +4213,10 @@ CMenuManager::ProcessButtonPresses(void) strncmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FESZ_CA", 8) != 0) { if (m_nCurrScreen == MENUPAGE_CHOOSE_DELETE_SLOT) { - if (Slots[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_SaveSlot - 1] == SLOT_EMPTY) - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0); + if (Slots[m_nCurrOption] != SLOT_OK) + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0); else - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0); } else DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); } else { @@ -4400,21 +4291,17 @@ CMenuManager::ProcessButtonPresses(void) option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action; switch (option) { case MENUACTION_RADIO: -#ifdef TIDY_UP_PBP - assumeIncrease = true; -#else ++m_PrefsRadioStation; if (DMAudio.IsMP3RadioChannelAvailable()) { if (m_PrefsRadioStation > USERTRACK) - m_PrefsRadioStation = HEAD_RADIO; - } else if (m_PrefsRadioStation > CHATTERBOX) { + m_PrefsRadioStation = WILDSTYLE; + } else if (m_PrefsRadioStation > WAVE) { m_PrefsRadioStation = USERTRACK; } SaveSettings(); DMAudio.SetRadioInCar(m_PrefsRadioStation); DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); OutputDebugString("FRONTEND RADIO STATION CHANGED"); -#endif break; case MENUACTION_LANG_ENG: m_PrefsLanguage = LANGUAGE_AMERICAN; @@ -4472,7 +4359,7 @@ CMenuManager::ProcessButtonPresses(void) if (saveSlot >= 2 && saveSlot <= 9) { m_nCurrSaveSlot = saveSlot - 2; - if (Slots[m_nCurrSaveSlot + 1] != SLOT_EMPTY && Slots[m_nCurrSaveSlot + 1] != SLOT_CORRUPTED) { + if (Slots[m_nCurrSaveSlot] != SLOT_EMPTY && Slots[m_nCurrSaveSlot] != SLOT_CORRUPTED) { if (m_nCurrScreen == MENUPAGE_CHOOSE_LOAD_SLOT) { SwitchToNewScreen(MENUPAGE_LOAD_SLOT_CONFIRM); } else if (m_nCurrScreen == MENUPAGE_CHOOSE_DELETE_SLOT) { @@ -4555,16 +4442,12 @@ CMenuManager::ProcessButtonPresses(void) break; } case MENUACTION_SPEAKERCONF: -#ifndef TIDY_UP_PBP if (m_nPrefsAudio3DProviderIndex != NO_AUDIO_PROVIDER) { if (--m_PrefsSpeakers < 0) m_PrefsSpeakers = 2; DMAudio.SetSpeakerConfig(m_PrefsSpeakers); SaveSettings(); } -#else - assumeIncrease = true; -#endif break; case MENUACTION_PLAYERSETUP: CPlayerSkin::BeginFrontendSkinEdit(); @@ -4634,7 +4517,6 @@ CMenuManager::ProcessButtonPresses(void) SetHelperText(2); break; case MENUACTION_CTRLMETHOD: -#ifndef TIDY_UP_PBP if (m_ControlMethod == CONTROL_CLASSIC) { CCamera::m_bUseMouse3rdPerson = true; m_ControlMethod = CONTROL_STANDARD; @@ -4643,9 +4525,6 @@ CMenuManager::ProcessButtonPresses(void) m_ControlMethod = CONTROL_CLASSIC; } SaveSettings(); -#else - assumeIncrease = true; -#endif break; case MENUACTION_LOADRADIO: SwitchToNewScreen(MENUPAGE_SOUND_SETTINGS); @@ -4761,58 +4640,11 @@ CMenuManager::ProcessButtonPresses(void) return; #endif - int changeValueBy = 0; - bool decrease = false; -#ifdef TIDY_UP_PBP - bool increase = assumeIncrease; -#else - bool increase = false; -#endif - if (CPad::GetPad(0)->GetLeft() || CPad::GetPad(0)->GetPedWalkLeftRight() < 0 || CPad::GetPad(0)->GetDPadLeft()) { - static PauseModeTime lastSliderDecrease = 0; - if (CTimer::GetTimeInMillisecondsPauseMode() - lastSliderDecrease > 150) { - CheckSliderMovement(-1); - lastSliderDecrease = CTimer::GetTimeInMillisecondsPauseMode(); - } - } else if (CPad::GetPad(0)->GetRight() || CPad::GetPad(0)->GetPedWalkLeftRight() > 0 || CPad::GetPad(0)->GetDPadRight()) { - static PauseModeTime lastSliderIncrease = 0; - if (CTimer::GetTimeInMillisecondsPauseMode() - lastSliderIncrease > 150) { - CheckSliderMovement(1); - lastSliderIncrease = CTimer::GetTimeInMillisecondsPauseMode(); - } - } - if (CPad::GetPad(0)->GetRightJustDown() || CPad::GetPad(0)->GetAnaloguePadRight() || CPad::GetPad(0)->GetDPadRightJustDown()) { - m_bShowMouse = false; - increase = true; - } else if (CPad::GetPad(0)->GetMouseWheelUpJustDown() && m_nCurrScreen != MENUPAGE_KEYBOARD_CONTROLS) { - increase = true; - CheckSliderMovement(1); - m_bShowMouse = true; - } - - if (!CPad::GetPad(0)->GetLeftJustDown() && !CPad::GetPad(0)->GetAnaloguePadLeft() && !CPad::GetPad(0)->GetDPadLeftJustDown()) { - if (CPad::GetPad(0)->GetMouseWheelDownJustDown()) { - if (m_nCurrScreen != MENUPAGE_KEYBOARD_CONTROLS) { - decrease = true; - CheckSliderMovement(-1); - m_bShowMouse = true; - } - } - } else { - m_bShowMouse = false; - decrease = true; - } - - if (increase) - changeValueBy++; - else if (decrease) - changeValueBy--; - - if (changeValueBy != 0) { + if (changeAmount != 0) { switch (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action) { case MENUACTION_RADIO: - m_PrefsRadioStation += changeValueBy; + m_PrefsRadioStation += changeAmount; DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); if (DMAudio.IsMP3RadioChannelAvailable()) { if (m_PrefsRadioStation < WILDSTYLE) @@ -4832,7 +4664,7 @@ CMenuManager::ProcessButtonPresses(void) break; #ifdef ASPECT_RATIO_SCALE case MENUACTION_WIDESCREEN: - if (changeValueBy > 0) { + if (changeAmount > 0) { m_PrefsUseWideScreen++; if (m_PrefsUseWideScreen > 2) m_PrefsUseWideScreen = 0; @@ -4849,7 +4681,7 @@ CMenuManager::ProcessButtonPresses(void) if (m_bGameNotLoaded) { RwChar** videoMods = _psGetVideoModeList(); DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); - if (changeValueBy > 0) { + if (changeAmount > 0) { do { ++m_nDisplayVideoMode; @@ -4874,14 +4706,14 @@ CMenuManager::ProcessButtonPresses(void) #endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex != NO_AUDIO_PROVIDER) { - m_nPrefsAudio3DProviderIndex += changeValueBy; + m_nPrefsAudio3DProviderIndex += changeAmount; m_nPrefsAudio3DProviderIndex = clamp(m_nPrefsAudio3DProviderIndex, 0, DMAudio.GetNum3DProvidersAvailable() - 1); } DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); break; case MENUACTION_SPEAKERCONF: if (m_nPrefsAudio3DProviderIndex != NO_AUDIO_PROVIDER) { - m_PrefsSpeakers -= changeValueBy; + m_PrefsSpeakers -= changeAmount; m_PrefsSpeakers = clamp(m_PrefsSpeakers, 0, 2); DMAudio.SetSpeakerConfig(m_PrefsSpeakers); SaveSettings(); @@ -4899,7 +4731,7 @@ CMenuManager::ProcessButtonPresses(void) FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu]; if (m_nCurrScreen == option.screen && m_nCurrOption == option.screenOptionOrder) { if (option.type == FEOPTION_SELECT) { - if (changeValueBy > 0) { + if (changeAmount > 0) { option.displayedValue++; if (option.displayedValue >= option.numRightTexts) option.displayedValue = 0; @@ -4913,7 +4745,7 @@ CMenuManager::ProcessButtonPresses(void) *option.value = option.displayedValue; } } else if (option.type == FEOPTION_DYNAMIC) { - option.buttonPressFunc(changeValueBy > 0 ? FEOPTION_ACTION_RIGHT : FEOPTION_ACTION_LEFT); + option.buttonPressFunc(changeAmount > 0 ? FEOPTION_ACTION_RIGHT : FEOPTION_ACTION_LEFT); } DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); } @@ -4925,14 +4757,14 @@ CMenuManager::ProcessButtonPresses(void) break; #endif } + CheckSliderMovement(changeAmount); ProcessOnOffMenuOptions(); if (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) { - if (changeValueBy < 1) { + if (changeAmount < 1) { m_nSelectedContSetupColumn = CONTSETUP_PED_COLUMN; } else { m_nSelectedContSetupColumn = CONTSETUP_VEHICLE_COLUMN; } - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0); } } } diff --git a/src/core/Frontend.h b/src/core/Frontend.h index 83d86d5b..e64eae98 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -318,6 +318,8 @@ enum eCheckHover HOVEROPTION_DECREASE_SFXVOLUME, HOVEROPTION_INCREASE_MOUSESENS, HOVEROPTION_DECREASE_MOUSESENS, + HOVEROPTION_INCREASE_MP3BOOST, + HOVEROPTION_DECREASE_MP3BOOST, HOVEROPTION_NOT_HOVERING, }; @@ -633,7 +635,9 @@ public: static void PrintErrorMessage(); void PrintStats(); void Process(); - void ProcessButtonPresses(); + void ProcessList(bool &optionSelected, bool &goBack); + void UserInput(); + void ProcessButtonPresses(uint8, uint8, uint8, uint8, int8); void ProcessFileActions(); void ProcessOnOffMenuOptions(); void RequestFrontEndShutDown(); diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 61a32a8d..4f69123b 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -57,7 +57,7 @@ wchar SlotSaveDate[SLOT_COUNT][70]; int CheckSum; eLevelName m_LevelToLoad; char SaveFileNameJustSaved[260]; -int Slots[SLOT_COUNT+1]; +int Slots[SLOT_COUNT]; CDate CompileDateAndTime; bool b_FoundRecentSavedGameWantToLoad; diff --git a/src/save/GenericGameStorage.h b/src/save/GenericGameStorage.h index 069ba7cd..630b3b50 100644 --- a/src/save/GenericGameStorage.h +++ b/src/save/GenericGameStorage.h @@ -31,7 +31,7 @@ extern wchar SlotFileName[SLOT_COUNT][260]; extern wchar SlotSaveDate[SLOT_COUNT][70]; extern int CheckSum; extern enum eLevelName m_LevelToLoad; -extern int Slots[SLOT_COUNT+1]; +extern int Slots[SLOT_COUNT]; extern bool b_FoundRecentSavedGameWantToLoad; extern bool JustLoadedDontFadeInYet; diff --git a/src/save/PCSave.cpp b/src/save/PCSave.cpp index da8134fc..8514a2b6 100644 --- a/src/save/PCSave.cpp +++ b/src/save/PCSave.cpp @@ -88,7 +88,7 @@ void C_PcSave::PopulateSlotInfo() { for (int i = 0; i < SLOT_COUNT; i++) { - Slots[i + 1] = SLOT_EMPTY; + Slots[i] = SLOT_EMPTY; SlotFileName[i][0] = '\0'; SlotSaveDate[i][0] = '\0'; } @@ -108,14 +108,14 @@ C_PcSave::PopulateSlotInfo() if (file != 0) { CFileMgr::Read(file, (char*)&header, sizeof(header)); if (strncmp((char*)&header, TopLineEmptyFile, sizeof(TopLineEmptyFile)-1) != 0) { - Slots[i + 1] = SLOT_OK; + Slots[i] = SLOT_OK; memcpy(SlotFileName[i], &header.FileName, sizeof(header.FileName)); SlotFileName[i][24] = '\0'; } CFileMgr::CloseFile(file); } - if (Slots[i + 1] == SLOT_OK) { + if (Slots[i] == SLOT_OK) { if (CheckDataNotCorrupt(i, savename)) { SYSTEMTIME st; memcpy(&st, &header.SaveDateTime, sizeof(SYSTEMTIME)); @@ -147,7 +147,7 @@ C_PcSave::PopulateSlotInfo() } else { CMessages::InsertNumberInString(TheText.Get("FEC_SLC"), i + 1, -1, -1, -1, -1, -1, SlotFileName[i]); - Slots[i + 1] = SLOT_CORRUPTED; + Slots[i] = SLOT_CORRUPTED; } } } From b612e84be8835ec57f31b7899d8343b65a0b3ce2 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 15 Aug 2020 18:58:33 +0300 Subject: [PATCH 057/112] submodule --- librw | 2 +- ogg | 2 +- opus | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/librw b/librw index d92996c6..a78a0239 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit d92996c66d7938092218b42fc9197bd181606958 +Subproject commit a78a02394e4c528a2ade867dfd0ffe04e32ec474 diff --git a/ogg b/ogg index 0bbcba4e..684c7377 160000 --- a/ogg +++ b/ogg @@ -1 +1 @@ -Subproject commit 0bbcba4e7cf32324170470569c4527ffd0002870 +Subproject commit 684c73773e7e2683245ffd6aa75f04115b51123a diff --git a/opus b/opus index 484af258..6bae366f 160000 --- a/opus +++ b/opus @@ -1 +1 @@ -Subproject commit 484af2580b82dffd695fcd0841fc34a9dc5f7293 +Subproject commit 6bae366f9fef25191fc812c430e8abd40a13a233 From a728a542be7b3cf5dde16184dea071c50fdd38c0 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 16 Aug 2020 01:37:09 +0300 Subject: [PATCH 058/112] Graphics menu + MSAA --- gamefiles/TEXT/american.gxt | Bin 218862 -> 219054 bytes src/core/Frontend.cpp | 215 ++++++++++++++++++++++++++++++++++-- src/core/Frontend.h | 22 +++- src/core/MenuScreens.cpp | 85 ++++++++++++-- src/core/config.h | 9 +- src/core/re3.cpp | 28 ++--- src/skel/win/win.cpp | 4 +- utils/gxt/american.txt | 15 +++ utils/gxt/gxt.exe | Bin 70656 -> 125440 bytes 9 files changed, 341 insertions(+), 37 deletions(-) diff --git a/gamefiles/TEXT/american.gxt b/gamefiles/TEXT/american.gxt index 6d74c7aac80771fd31ea82bf5af5133058663e22..35973f660f153bb8b22e5df638f13a624686380e 100644 GIT binary patch delta 312 zcmaF2mUrEHUe*wA*T@qaS=04-xo$BrxVgH-J30n4culUysgN=;bGr;w delta 120 zcmZ3tp7-5aUe*wA*T|lYtm*o^Z*DR%xVgH-J30n4=uEEEkLTvN1rc%c^qKr#Uy||4 zWKM&AaXYAJNRSUh!a0bFaL?e)yA3unZmux0VBEaN_y*hN1y&|bj6uy;Yuc~YFmAtE N!*u=T^iyHXbpWC8E4csw diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 95d5f6e6..df65f94f 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -116,6 +116,12 @@ int32 CMenuManager::m_PrefsSfxVolume = 102; bool CMenuManager::m_PrefsCutsceneBorders = true; #endif + +#ifdef MULTISAMPLING +int8 CMenuManager::m_nPrefsMSAALevel = 0; +int8 CMenuManager::m_nDisplayMSAALevel = 0; +#endif + char CMenuManager::m_PrefsSkinFile[256] = DEFAULT_SKIN_NAME; int32 CMenuManager::m_KeyPressedCode = -1; @@ -399,8 +405,15 @@ CMenuManager::ThingsToDoBeforeGoingBack() DMAudio.StopFrontEndTrack(); OutputDebugString("FRONTEND AUDIO TRACK STOPPED"); #endif +#ifdef GRAPHICS_MENU_OPTIONS } else if (m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { +#else + } else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { +#endif m_nDisplayVideoMode = m_nPrefsVideoMode; +#ifdef MULTISAMPLING + m_nDisplayMSAALevel = m_nPrefsMSAALevel; +#endif } if (m_nCurrScreen == MENUPAGE_SKIN_SELECT) { @@ -848,7 +861,7 @@ CMenuManager::Draw() CFont::SetCentreOn(); break; case MENUPAGE_SOUND_SETTINGS: - case MENUPAGE_GRAPHICS_SETTINGS: + case MENUPAGE_DISPLAY_SETTINGS: case MENUPAGE_MULTIPLAYER_CREATE: case MENUPAGE_SKIN_SELECT_OLD: case MENUPAGE_CONTROLLER_PC_OLD1: @@ -856,7 +869,10 @@ CMenuManager::Draw() case MENUPAGE_CONTROLLER_PC_OLD3: case MENUPAGE_CONTROLLER_PC_OLD4: case MENUPAGE_CONTROLLER_DEBUG: - case MENUPAGE_MOUSE_CONTROLS: + case MENUPAGE_MOUSE_CONTROLS: +#ifdef GRAPHICS_MENU_OPTIONS + case MENUPAGE_GRAPHICS_SETTINGS: +#endif columnWidth = 50; headerHeight = 0; lineHeight = 20; @@ -1155,6 +1171,25 @@ CMenuManager::Draw() AsciiToUnicode(_psGetVideoModeList()[m_nDisplayVideoMode], unicodeTemp); rightText = unicodeTemp; break; +#ifdef IMPROVED_VIDEOMODE + case MENUACTION_SCREENFORMAT: + rightText = TheText.Get(FrontEndMenuManager.m_nSelectedScreenMode ? "FED_WND" : "FED_FLS"); + break; +#endif +#ifdef MULTISAMPLING + case MENUACTION_MULTISAMPLING: + switch (m_nDisplayMSAALevel) { + case 0: + rightText = TheText.Get("FEM_OFF"); + break; + default: + sprintf(gString, "%iX", 1 << (m_nDisplayMSAALevel)); + AsciiToUnicode(gString, unicodeTemp); + rightText = unicodeTemp; + break; + } + break; +#endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex == -1) rightText = TheText.Get("FEA_NAH"); @@ -1205,6 +1240,11 @@ CMenuManager::Draw() case MENUACTION_MOUSESTEER: rightText = TheText.Get(CVehicle::m_bDisableMouseSteering ? "FEM_OFF" : "FEM_ON"); break; +#ifdef CUTSCENE_BORDERS_SWITCH + case MENUACTION_CUTSCENEBORDERS: + rightText = TheText.Get(m_PrefsCutsceneBorders ? "FEM_ON" : "FEM_OFF"); + break; +#endif #ifdef CUSTOM_FRONTEND_OPTIONS case MENUACTION_TRIGGERFUNC: FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu]; @@ -1306,7 +1346,14 @@ CMenuManager::Draw() CFont::SetRightJustifyOn(); if(textLayer == 1) - if(!strcmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FED_RES") + if((!strcmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FED_RES") +#ifdef IMPROVED_VIDEOMODE + || !strcmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FEM_SCF") +#endif +#ifdef MULTISAMPLING + || !strcmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FED_AAS") +#endif + ) && !m_bGameNotLoaded #ifdef CUSTOM_FRONTEND_OPTIONS || isOptionDisabled @@ -1331,6 +1378,18 @@ CMenuManager::Draw() if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_RES") && m_nHelperTextMsgId == 1) ResetHelperText(); } +#ifdef IMPROVED_VIDEOMODE + if (m_nSelectedScreenMode == m_nPrefsWindowed) { + if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEM_SCF") && m_nHelperTextMsgId == 1) + ResetHelperText(); + } +#endif +#ifdef MULTISAMPLING + if (m_nDisplayMSAALevel == m_nPrefsMSAALevel) { + if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_AAS") && m_nHelperTextMsgId == 1) + ResetHelperText(); + } +#endif if (m_nPrefsAudio3DProviderIndex != DMAudio.GetCurrent3DProviderIndex()) { if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEA_3DH")) SetHelperText(1); @@ -1339,6 +1398,18 @@ CMenuManager::Draw() if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_RES")) SetHelperText(1); } +#ifdef IMPROVED_VIDEOMODE + if (m_nSelectedScreenMode != m_nPrefsWindowed) { + if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEM_SCF")) + SetHelperText(1); + } +#endif +#ifdef MULTISAMPLING + if (m_nDisplayMSAALevel != m_nPrefsMSAALevel) { + if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_AAS")) + SetHelperText(1); + } +#endif if (m_nPrefsAudio3DProviderIndex != DMAudio.GetCurrent3DProviderIndex()) { if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEA_3DH") != 0 && m_nCurrScreen == MENUPAGE_SOUND_SETTINGS && m_nPrefsAudio3DProviderIndex != -1) { @@ -1349,11 +1420,41 @@ CMenuManager::Draw() } if (m_nDisplayVideoMode != m_nPrefsVideoMode) { if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_RES") != 0 - && m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { +#ifdef GRAPHICS_MENU_OPTIONS + && m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { +#else + && m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { +#endif m_nDisplayVideoMode = m_nPrefsVideoMode; SetHelperText(3); } } +#ifdef IMPROVED_VIDEOMODE + if (m_nSelectedScreenMode != m_nPrefsWindowed) { + if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEM_SCF") != 0 +#ifdef GRAPHICS_MENU_OPTIONS + && m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { +#else + && m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { +#endif + m_nSelectedScreenMode = m_nPrefsWindowed; + SetHelperText(3); + } + } +#endif +#ifdef MULTISAMPLING + if (m_nSelectedScreenMode != m_nPrefsWindowed) { + if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_AAS") != 0 +#ifdef GRAPHICS_MENU_OPTIONS + && m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { +#else + && m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { +#endif + m_nDisplayMSAALevel = m_nPrefsMSAALevel; + SetHelperText(3); + } + } +#endif #ifdef CUSTOM_FRONTEND_OPTIONS if (aScreens[m_nCurrScreen].m_aEntries[i].m_Action == MENUACTION_TRIGGERFUNC) { @@ -1419,10 +1520,13 @@ CMenuManager::Draw() switch (m_nCurrScreen) { case MENUPAGE_CONTROLLER_SETTINGS: case MENUPAGE_SOUND_SETTINGS: - case MENUPAGE_GRAPHICS_SETTINGS: + case MENUPAGE_DISPLAY_SETTINGS: case MENUPAGE_SKIN_SELECT: case MENUPAGE_CONTROLLER_PC: case MENUPAGE_MOUSE_CONTROLS: +#ifdef GRAPHICS_MENU_OPTIONS + case MENUPAGE_GRAPHICS_SETTINGS: +#endif DisplayHelperText(); break; } @@ -2079,7 +2183,7 @@ CMenuManager::DrawFrontEnd() bbNames[0] = { "FEB_SAV",MENUPAGE_NEW_GAME }; bbNames[1] = { "FEB_CON",MENUPAGE_CONTROLLER_PC }; bbNames[2] = { "FEB_AUD",MENUPAGE_SOUND_SETTINGS }; - bbNames[3] = { "FEB_DIS",MENUPAGE_GRAPHICS_SETTINGS }; + bbNames[3] = { "FEB_DIS",MENUPAGE_DISPLAY_SETTINGS }; bbNames[4] = { "FEB_LAN",MENUPAGE_LANGUAGE_SETTINGS }; bbNames[5] = { "FESZ_QU",MENUPAGE_EXIT }; bbTabCount = 6; @@ -2091,7 +2195,7 @@ CMenuManager::DrawFrontEnd() bbNames[2] = { "FEB_BRI",MENUPAGE_BRIEFS }; bbNames[3] = { "FEB_CON",MENUPAGE_CONTROLLER_PC }; bbNames[4] = { "FEB_AUD",MENUPAGE_SOUND_SETTINGS }; - bbNames[5] = { "FEB_DIS",MENUPAGE_GRAPHICS_SETTINGS }; + bbNames[5] = { "FEB_DIS",MENUPAGE_DISPLAY_SETTINGS }; bbNames[6] = { "FEB_LAN",MENUPAGE_LANGUAGE_SETTINGS }; bbNames[7] = { "FESZ_QU",MENUPAGE_EXIT }; bbTabCount = 8; @@ -2212,7 +2316,7 @@ CMenuManager::DrawFrontEndNormal() case MENUPAGE_DELETE_SLOT_CONFIRM: currentSprite = FE_ICONSAVE; break; - case MENUPAGE_GRAPHICS_SETTINGS: + case MENUPAGE_DISPLAY_SETTINGS: currentSprite = FE_ICONDISPLAY; break; case MENUPAGE_SOUND_SETTINGS: @@ -3224,6 +3328,10 @@ CMenuManager::LoadSettings() #endif #ifdef CUTSCENE_BORDERS_SWITCH CFileMgr::Read(fileHandle, (char *)&CMenuManager::m_PrefsCutsceneBorders, 1); +#endif +#ifdef MULTISAMPLING + CFileMgr::Read(fileHandle, (char *)&m_nPrefsMSAALevel, 1); + m_nDisplayMSAALevel = m_nPrefsMSAALevel; #endif } } @@ -3320,6 +3428,9 @@ CMenuManager::SaveSettings() #endif #ifdef CUTSCENE_BORDERS_SWITCH CFileMgr::Write(fileHandle, (char *)&CMenuManager::m_PrefsCutsceneBorders, 1); +#endif +#ifdef MULTISAMPLING + CFileMgr::Write(fileHandle, (char *)&CMenuManager::m_nPrefsMSAALevel, 1); #endif } @@ -4638,7 +4749,27 @@ CMenuManager::ProcessButtonPresses(void) SetHelperText(0); SaveSettings(); } + break; +#ifdef IMPROVED_VIDEOMODE + case MENUACTION_SCREENFORMAT: + if (m_nSelectedScreenMode != m_nPrefsWindowed) { + m_nPrefsWindowed = m_nSelectedScreenMode; + _psSelectScreenVM(m_nPrefsVideoMode); + SetHelperText(0); + SaveSettings(); + } break; +#endif +#ifdef MULTISAMPLING + case MENUACTION_MULTISAMPLING: + if (m_nDisplayMSAALevel != m_nPrefsMSAALevel) { + m_nPrefsMSAALevel = m_nDisplayMSAALevel; + _psSelectScreenVM(m_nPrefsVideoMode); + SetHelperText(0); + SaveSettings(); + } + break; +#endif case MENUACTION_AUDIOHW: { int selectedProvider = m_nPrefsAudio3DProviderIndex; @@ -4685,7 +4816,8 @@ CMenuManager::ProcessButtonPresses(void) DMAudio.SetRadioInCar(m_PrefsRadioStation); DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); SaveSettings(); - } else if (m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { +#ifndef GRAPHICS_MENU_OPTIONS + } else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { m_PrefsFrameLimiter = true; m_PrefsBrightness = 256; m_PrefsVsyncDisp = true; @@ -4706,8 +4838,40 @@ CMenuManager::ProcessButtonPresses(void) } #else CMBlur::BlurOn = true; +#endif +#ifdef CUTSCENE_BORDERS_SWITCH + m_PrefsCutsceneBorders = true; #endif SaveSettings(); +#else + } else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { + m_PrefsBrightness = 256; + m_PrefsShowSubtitles = true; +#ifdef CUTSCENE_BORDERS_SWITCH + m_PrefsCutsceneBorders = true; +#endif + SaveSettings(); + } else if (m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { + m_PrefsFrameLimiter = true; + m_PrefsUseWideScreen = false; + m_PrefsVsyncDisp = true; + m_PrefsLOD = 1.2f; + m_PrefsVsync = true; + CRenderer::ms_lodDistScale = 1.2f; + m_nDisplayVideoMode = m_nPrefsVideoMode; +#ifdef GTA3_1_1_PATCH + if (_dwOperatingSystemVersion == OS_WIN98) { + CMBlur::BlurOn = false; + CMBlur::MotionBlurClose(); + } else { + CMBlur::BlurOn = true; + CMBlur::MotionBlurOpen(Scene.camera); + } +#else + CMBlur::BlurOn = true; +#endif // GTA3_1_1_PATCH + SaveSettings(); +#endif // GRAPHICS_MENU_OPTIONS } else if ((m_nCurrScreen != MENUPAGE_SKIN_SELECT_OLD) && (m_nCurrScreen == MENUPAGE_CONTROLLER_PC)) { ControlsManager.MakeControllerActionsBlank(); ControlsManager.InitDefaultControlConfiguration(); @@ -4966,6 +5130,32 @@ CMenuManager::ProcessButtonPresses(void) } } break; +#ifdef IMPROVED_VIDEOMODE + case MENUACTION_SCREENFORMAT: + if (m_bGameNotLoaded) { + FrontEndMenuManager.m_nSelectedScreenMode = !FrontEndMenuManager.m_nSelectedScreenMode; + } + break; +#endif +#ifdef MULTISAMPLING + case MENUACTION_MULTISAMPLING: + if (m_bGameNotLoaded) { + m_nDisplayMSAALevel += changeValueBy; + + int i = 0; + int maxAA = RwD3D8EngineGetMaxMultiSamplingLevels(); + while (maxAA != 1) { + i++; + maxAA >>= 1; + } + + if (m_nDisplayMSAALevel < 0) + m_nDisplayMSAALevel = i; + else if (m_nDisplayMSAALevel > i) + m_nDisplayMSAALevel = 0; + } + break; +#endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex != -1) { m_nPrefsAudio3DProviderIndex += changeValueBy; @@ -5131,6 +5321,13 @@ CMenuManager::ProcessOnOffMenuOptions() DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); SaveSettings(); break; +#ifdef CUTSCENE_BORDERS_SWITCH + case MENUACTION_CUTSCENEBORDERS: + m_PrefsCutsceneBorders = !m_PrefsCutsceneBorders; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); + SaveSettings(); + break; +#endif } } diff --git a/src/core/Frontend.h b/src/core/Frontend.h index 7b0e2f4b..c9af7c10 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -183,7 +183,7 @@ enum eMenuScreen MENUPAGE_BRIEFS = 3, MENUPAGE_CONTROLLER_SETTINGS = 4, MENUPAGE_SOUND_SETTINGS = 5, - MENUPAGE_GRAPHICS_SETTINGS = 6, + MENUPAGE_DISPLAY_SETTINGS = 6, MENUPAGE_LANGUAGE_SETTINGS = 7, MENUPAGE_CHOOSE_LOAD_SLOT = 8, MENUPAGE_CHOOSE_DELETE_SLOT = 9, @@ -238,6 +238,9 @@ enum eMenuScreen MENUPAGE_58 = 58, #ifdef MENU_MAP MENUPAGE_MAP = 59, +#endif +#ifdef GRAPHICS_MENU_OPTIONS + MENUPAGE_GRAPHICS_SETTINGS, #endif MENUPAGES }; @@ -359,6 +362,19 @@ enum eMenuAction MENUACTION_UNK112, MENUACTION_REJECT_RETRY, MENUACTION_UNK114, +#ifdef IMPROVED_VIDEOMODE + MENUACTION_SCREENFORMAT, +#endif +#ifdef ANISOTROPIC_FILTERING + MENUACTION_MIPMAPS, + MENUACTION_TEXTURE_FILTERING, +#endif +#ifdef MULTISAMPLING + MENUACTION_MULTISAMPLING, +#endif +#ifdef CUTSCENE_BORDERS_SWITCH + MENUACTION_CUTSCENEBORDERS, +#endif #ifdef CUSTOM_FRONTEND_OPTIONS MENUACTION_TRIGGERFUNC #endif @@ -532,6 +548,10 @@ public: int32 m_nPrefsSubsystem; int32 m_nSelectedScreenMode; #endif +#ifdef MULTISAMPLING + static int8 m_nPrefsMSAALevel; + static int8 m_nDisplayMSAALevel; +#endif enum LANGUAGE { diff --git a/src/core/MenuScreens.cpp b/src/core/MenuScreens.cpp index 4685918e..c313944c 100644 --- a/src/core/MenuScreens.cpp +++ b/src/core/MenuScreens.cpp @@ -4,6 +4,32 @@ // If you want to add new options, please don't do that here and see CustomFrontendOptionsPopulate in re3.cpp. +#ifdef CUTSCENE_BORDERS_SWITCH +#define MENU_CUTSCENE_BORDERS_SWITCH(screen) MENUACTION_CUTSCENEBORDERS, "FEM_CSB", SAVESLOT_NONE, screen, +#else +#define MENU_CUTSCENE_BORDERS_SWITCH(screen) +#endif + +#ifdef IMPROVED_VIDEOMODE +#define MENU_IMPROVED_VIDEOMODE(screen) MENUACTION_SCREENFORMAT, "FEM_SCF", SAVESLOT_NONE, screen, +#else +#define MENU_IMPROVED_VIDEOMODE(screen) +#endif + +#ifdef ANISOTROPIC_FILTERING +#define MENU_MIPMAPS(screen) MENUACTION_MIPMAPS, "FED_MIP", SAVESLOT_NONE, screen, +#define MENU_TEXTURE_FILTERING(screen) MENUACTION_TEXTURE_FILTERING, "FED_FIL", SAVESLOT_NONE, screen, +#else +#define MENU_MIPMAPS(screen) +#define MENU_TEXTURE_FILTERING(screen) +#endif + +#ifdef MULTISAMPLING +#define MENU_MULTISAMPLING(screen) MENUACTION_MULTISAMPLING, "FED_AAS", SAVESLOT_NONE, screen, +#else +#define MENU_MULTISAMPLING(screen) +#endif + CMenuScreen aScreens[] = { // MENUPAGE_NONE = 0 { "", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, }, @@ -46,19 +72,35 @@ CMenuScreen aScreens[] = { MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, }, - // MENUPAGE_GRAPHICS_SETTINGS = 6 + // MENUPAGE_DISPLAY_SETTINGS = 6 +#ifndef GRAPHICS_MENU_OPTIONS { "FET_DIS", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 2, 2, - MENUACTION_BRIGHTNESS, "FED_BRI", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_DRAWDIST, "FEM_LOD", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_FRAMESYNC, "FEM_VSC", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_FRAMELIMIT, "FEM_FRM", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_TRAILS, "FED_TRA", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_SUBTITLES, "FED_SUB", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_WIDESCREEN, "FED_WIS", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_SCREENRES, "FED_RES", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, - MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_BRIGHTNESS, "FED_BRI", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_DRAWDIST, "FEM_LOD", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_FRAMESYNC, "FEM_VSC", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_FRAMELIMIT, "FEM_FRM", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_TRAILS, "FED_TRA", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_SUBTITLES, "FED_SUB", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENU_CUTSCENE_BORDERS_SWITCH(MENUPAGE_DISPLAY_SETTINGS) + MENU_MIPMAPS(MENUPAGE_DISPLAY_SETTINGS) + MENU_TEXTURE_FILTERING(MENUPAGE_DISPLAY_SETTINGS) + MENU_MULTISAMPLING(MENUPAGE_DISPLAY_SETTINGS) + MENUACTION_WIDESCREEN, "FED_WIS", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENU_IMPROVED_VIDEOMODE(MENUPAGE_DISPLAY_SETTINGS) + MENUACTION_SCREENRES, "FED_RES", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, }, +#else + { "FET_DIS", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 2, 2, + MENUACTION_BRIGHTNESS, "FED_BRI", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_SUBTITLES, "FED_SUB", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENU_CUTSCENE_BORDERS_SWITCH(MENUPAGE_DISPLAY_SETTINGS) + MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, + MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, + }, +#endif // GRAPHICS_MENU_OPTIONS + // MENUPAGE_LANGUAGE_SETTINGS = 7 { "FET_LAN", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 3, 3, @@ -322,7 +364,10 @@ CMenuScreen aScreens[] = { { "FET_OPT", 1, MENUPAGE_NONE, MENUPAGE_NONE, 1, 4, MENUACTION_CHANGEMENU, "FET_CTL", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC, MENUACTION_LOADRADIO, "FET_AUD", SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS, - MENUACTION_CHANGEMENU, "FET_DIS", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_CHANGEMENU, "FET_DIS", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, +#ifdef GRAPHICS_MENU_OPTIONS + MENUACTION_CHANGEMENU, "FET_GRA", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, +#endif MENUACTION_CHANGEMENU, "FET_LAN", SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS, MENUACTION_PLAYERSETUP, "FET_PSU", SAVESLOT_NONE, MENUPAGE_SKIN_SELECT, MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, @@ -446,6 +491,24 @@ CMenuScreen aScreens[] = { MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, }, #endif + +#ifdef GRAPHICS_MENU_OPTIONS + // MENUPAGE_GRAPHICS_SETTINGS = 60 + { "FET_GRA", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 2, 2, + MENUACTION_DRAWDIST, "FEM_LOD", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_FRAMESYNC, "FEM_VSC", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_FRAMELIMIT, "FEM_FRM", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_TRAILS, "FED_TRA", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_WIDESCREEN, "FED_WIS", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENU_MIPMAPS(MENUPAGE_GRAPHICS_SETTINGS) + MENU_TEXTURE_FILTERING(MENUPAGE_GRAPHICS_SETTINGS) + MENU_MULTISAMPLING(MENUPAGE_GRAPHICS_SETTINGS) + MENU_IMPROVED_VIDEOMODE(MENUPAGE_GRAPHICS_SETTINGS) + MENUACTION_SCREENRES, "FED_RES", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, + MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, + }, +#endif }; #endif \ No newline at end of file diff --git a/src/core/config.h b/src/core/config.h index bb6adce6..081d9b39 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -209,6 +209,12 @@ enum Config { //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH //#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) +#define MULTISAMPLING // adds MSAA option + +#ifdef LIBRW +// these are not supported with librw yet +# undef MULTISAMPLING +#endif // Particle //#define PC_PARTICLE @@ -233,14 +239,15 @@ enum Config { #ifndef PC_MENU # define PS2_MENU //# define PS2_MENU_USEALLPAGEICONS -#else # define PS2_SAVE_DIALOG // PS2 style save dialog with transparent black box //# define PS2_LIKE_MENU // An effort to recreate PS2 menu, cycling through tabs, different bg etc. +#else # define MENU_MAP // VC-like menu map. Make sure you have new menu.txd # define SCROLLABLE_STATS_PAGE // only draggable by mouse atm # define TRIANGLE_BACK_BUTTON //# define CIRCLE_BACK_BUTTON # define CUSTOM_FRONTEND_OPTIONS +# define GRAPHICS_MENU_OPTIONS #endif // Script diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 9edd9497..dbc526dd 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -111,7 +111,7 @@ void LangJapSelect(int8 action) } #endif -#ifdef IMPROVED_VIDEOMODE +/*#ifdef IMPROVED_VIDEOMODE void ScreenModeChange(int8 displayedValue) { if (displayedValue != FrontEndMenuManager.m_nPrefsWindowed) { @@ -121,7 +121,7 @@ void ScreenModeChange(int8 displayedValue) FrontEndMenuManager.SaveSettings(); } } -#endif +#endif*/ #ifdef FREE_CAM void ToggleFreeCam(int8 action) @@ -133,13 +133,13 @@ void ToggleFreeCam(int8 action) } #endif -#ifdef CUTSCENE_BORDERS_SWITCH -void BorderModeChange(int8 displayedValue) -{ - CMenuManager::m_PrefsCutsceneBorders = !!displayedValue; - FrontEndMenuManager.SaveSettings(); -} -#endif +//#ifdef CUTSCENE_BORDERS_SWITCH +//void BorderModeChange(int8 displayedValue) +//{ +// CMenuManager::m_PrefsCutsceneBorders = !!displayedValue; +// FrontEndMenuManager.SaveSettings(); +//} +//#endif // Reloaded on language change, so you can use hardcoded wchar* and TheText.Get with peace of mind void @@ -154,11 +154,11 @@ CustomFrontendOptionsPopulate(void) FrontendOptionAddDynamic(TheText.Get("FEL_JAP"), nil, LangJapSelect, nil); #endif -#ifdef IMPROVED_VIDEOMODE +/*#ifdef IMPROVED_VIDEOMODE static const wchar *screenModes[] = { (wchar*)L"FULLSCREEN", (wchar*)L"WINDOWED" }; FrontendOptionSetPosition(MENUPAGE_GRAPHICS_SETTINGS, 8); FrontendOptionAddSelect(TheText.Get("SCRFOR"), screenModes, 2, (int8*)&FrontEndMenuManager.m_nPrefsWindowed, true, ScreenModeChange, nil); -#endif +#endif*/ #ifdef MENU_MAP FrontendOptionSetPosition(MENUPAGE_PAUSE_MENU, 2); @@ -171,11 +171,11 @@ CustomFrontendOptionsPopulate(void) FrontendOptionAddDynamic(text, nil, ToggleFreeCam, nil); #endif -#ifdef CUTSCENE_BORDERS_SWITCH +/*#ifdef CUTSCENE_BORDERS_SWITCH static const wchar *off_on[] = { TheText.Get("FEM_OFF"), TheText.Get("FEM_ON") }; - FrontendOptionSetPosition(MENUPAGE_GRAPHICS_SETTINGS, 9); + FrontendOptionSetPosition(MENUPAGE_DISPLAY_SETTINGS, 3); FrontendOptionAddSelect((const wchar *)L"CUTSCENE BORDERS", off_on, 2, (int8 *)&CMenuManager::m_PrefsCutsceneBorders, false, BorderModeChange, nil); -#endif +#endif*/ } #endif diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index a064788c..e79a8150 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -1597,7 +1597,9 @@ psSelectDevice() PSGLOBAL(fullScreen) = FALSE; #endif } - +#ifdef MULTISAMPLING + RwD3D8EngineSetMultiSamplingLevels(1 << FrontEndMenuManager.m_nPrefsMSAALevel); +#endif return TRUE; } diff --git a/utils/gxt/american.txt b/utils/gxt/american.txt index 94074819..9d9ddaa6 100644 --- a/utils/gxt/american.txt +++ b/utils/gxt/american.txt @@ -7957,6 +7957,9 @@ POLISH RUSSIAN { new display menus } +[FET_GRA] +GRAPHICS SETUP + [FED_MIP] MIP MAPPING @@ -7972,6 +7975,18 @@ BILINEAR [FED_TRL] TRILINEAR +[FED_WND] +WINDOWED + +[FED_FLS] +FULLSCREEN + +[FEM_CSB] +CUTSCENE BORDERS + +[FEM_SCF] +SCREEN FORMAT + { end of file } [DUMMY] diff --git a/utils/gxt/gxt.exe b/utils/gxt/gxt.exe index 0a39c0b1feb8505be5643a4e2ec055e02f88672a..ff264dadc8c8e716964fbbf61cf4d1842881c12b 100644 GIT binary patch literal 125440 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 Date: Sun, 16 Aug 2020 17:10:59 +0300 Subject: [PATCH 059/112] 2 new opcodes --- src/control/Script.cpp | 11 +++++++---- src/core/Pad.cpp | 27 ++++++++++++++++++++++----- src/core/Pad.h | 4 ++++ src/peds/Ped.cpp | 10 +++++----- src/peds/Ped.h | 2 +- src/peds/PlayerPed.cpp | 2 +- src/peds/PlayerPed.h | 2 +- 7 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index e16ba9e0..e3ee5503 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -1824,7 +1824,7 @@ void CMissionCleanup::Process() CWorld::Players[0].MakePlayerSafe(false); CWorld::Players[0].m_pPed->m_nFadeDrunkenness = 1; CWorld::Players[0].m_pPed->m_nDrunkCountdown = 0; - // CPad::GetPad(0)->SetDrunkInputDelay(0); // TODO(Miami) + CPad::GetPad(0)->SetDrunkInputDelay(0); CWorld::Players[0].m_bDriveByAllowed = true; // DMAudio::ShutUpPlayerTalking(0); // TODO(Miami) CVehicle::bDisableRemoteDetonation = false; @@ -10645,7 +10645,8 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) case COMMAND_SET_DRUNK_INPUT_DELAY: { CollectParameters(&m_nIp, 2); - debug("SET_DRUNK_INPUT_DELAY not implemented\n"); + assert(ScriptParams[1] < CPad::DRUNK_STEERING_BUFFER_SIZE); + CPad::GetPad(ScriptParams[0])->SetDrunkInputDelay(ScriptParams[1]); return 0; } case COMMAND_SET_CHAR_MONEY: @@ -13606,9 +13607,11 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_GET_BUS_FARES_COLLECTED_BY_PLAYER: { CollectParameters(&m_nIp, 1); - debug("GET_BUS_FARES_COLLECTED_BY_PLAYER not implemented\n"); // TODO(MIAMI) - ScriptParams[0] = 0; + CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]]; + ScriptParams[0] = pPlayerInfo->m_pPed->m_nLastBusFareCollected; + pPlayerInfo->m_pPed->m_nLastBusFareCollected = 0; StoreParameters(&m_nIp, 1); + return 0; } case COMMAND_SET_CHAR_OBJ_BUY_ICE_CREAM: { diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 6d6c30e4..222fe349 100644 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -631,6 +631,11 @@ void CPad::Clear(bool bResetPlayerControls) ShakeFreq = 0; ShakeDur = 0; + for (int32 i = 0; i < DRUNK_STEERING_BUFFER_SIZE; i++) + SteeringLeftRightBuffer[i] = 0; + + DrunkDrivingBufferUsed = 0; + if ( bResetPlayerControls ) DisablePlayerControls = PLAYERCONTROL_ENABLED; @@ -1806,6 +1811,9 @@ void CPad::Update(int16 pad) bHornHistory[iCurrHornHistory] = GetHorn(); + for (int32 i = DRUNK_STEERING_BUFFER_SIZE - 2; i >= 0; i--) { + SteeringLeftRightBuffer[i + 1] = SteeringLeftRightBuffer[i]; + } if ( !bDisplayNoControllerMessage ) CGame::bDemoMode = false; @@ -1899,6 +1907,7 @@ int16 CPad::GetSteeringLeftRight(void) if ( ArePlayerControlsDisabled() ) return 0; + int16 value; switch (CURMODE) { case 0: @@ -1908,9 +1917,12 @@ int16 CPad::GetSteeringLeftRight(void) int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2; if ( Abs(axis) > Abs(dpad) ) - return axis; + value = axis; else - return dpad; + value = dpad; + + SteeringLeftRightBuffer[0] = value; + value = SteeringLeftRightBuffer[DrunkDrivingBufferUsed]; break; } @@ -1918,13 +1930,18 @@ int16 CPad::GetSteeringLeftRight(void) case 1: case 3: { - return NewState.LeftStickX; - + SteeringLeftRightBuffer[0] = NewState.LeftStickX; + value = SteeringLeftRightBuffer[DrunkDrivingBufferUsed]; + break; + } + default: + { + value = 0; break; } } - return 0; + return value; } int16 CPad::GetSteeringUpDown(void) diff --git a/src/core/Pad.h b/src/core/Pad.h index 4374bc1a..72851317 100644 --- a/src/core/Pad.h +++ b/src/core/Pad.h @@ -141,9 +141,12 @@ public: enum { HORNHISTORY_SIZE = 5, + DRUNK_STEERING_BUFFER_SIZE = 10, }; CControllerState NewState; CControllerState OldState; + int16 SteeringLeftRightBuffer[DRUNK_STEERING_BUFFER_SIZE]; + int32 DrunkDrivingBufferUsed; CControllerState PCTempKeyState; CControllerState PCTempJoyState; CControllerState PCTempMouseState; @@ -263,6 +266,7 @@ public: static char *EditString(char *pStr, int32 nSize); static int32 *EditCodesForControls(int32 *pRsKeys, int32 nSize); uint32 InputHowLongAgo(void); + void SetDrunkInputDelay(int32 delay) { DrunkDrivingBufferUsed = delay; } #ifdef XINPUT void AffectFromXinput(uint32 pad); diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 303c0cbc..c675b7e5 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -439,7 +439,7 @@ CPed::CPed(uint32 pedType) : m_pedIK(this) bCrouchWhenScared = false; bKnockedOffBike = false; b158_8 = false; - b158_10 = false; + bCollectBusFare = false; bBoughtIceCream = false; b158_40 = false; @@ -12986,10 +12986,10 @@ CPed::PedSetInCarCB(CAnimBlendAssociation *animAssoc, void *arg) ped->b157_40 = false; ped->bRemoveFromWorld = true; } - if (ped->b158_10) { - ped->b158_10 = false; + if (ped->bCollectBusFare) { + ped->bCollectBusFare = false; if (FindPlayerPed()) - FindPlayerPed()->m_nPadUpPressedInMilliseconds += 5; + FindPlayerPed()->m_nLastBusFareCollected += 5; } if (!ped->IsNotInWreckedVehicle() || ped->DyingOrDead()) @@ -15176,7 +15176,7 @@ CPed::ProcessObjective(void) b157_40 = true; CPlayerPed *player = FindPlayerPed(); if (pBus->IsPassenger(player) || pBus->IsDriver(player)) { - b158_10 = true; + bCollectBusFare = true; } } } diff --git a/src/peds/Ped.h b/src/peds/Ped.h index 6b0cc5fb..b7d0a856 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -485,7 +485,7 @@ public: uint32 bCrouchWhenScared : 1; uint32 bKnockedOffBike : 1; uint32 b158_8 : 1; - uint32 b158_10 : 1; + uint32 bCollectBusFare : 1; uint32 bBoughtIceCream : 1; uint32 b158_40 : 1; //uint32 b158_80 diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index cba01e31..041fb5e8 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -83,7 +83,7 @@ CPlayerPed::CPlayerPed(void) : CPed(PEDTYPE_PLAYER1) m_pMeleeList[i] = nil; } m_nCheckPlayersIndex = 0; - m_nPadUpPressedInMilliseconds = 0; + m_nLastBusFareCollected = 0; idleAnimBlockIndex = CAnimManager::GetAnimationBlockIndex("playidles"); } diff --git a/src/peds/PlayerPed.h b/src/peds/PlayerPed.h index 3b8d8fcb..8a6e7576 100644 --- a/src/peds/PlayerPed.h +++ b/src/peds/PlayerPed.h @@ -43,7 +43,7 @@ public: float m_fGunSpinSpeed; // for minigun float m_fGunSpinAngle; unsigned int m_nPadDownPressedInMilliseconds; - unsigned int m_nPadUpPressedInMilliseconds; + unsigned int m_nLastBusFareCollected; CPlayerPed(); ~CPlayerPed(); From 732681db08438f0d61ad7fe4d670f79feaac7b9e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 16 Aug 2020 17:26:44 +0300 Subject: [PATCH 060/112] Island loading and PS2 alpha test added to options --- gamefiles/TEXT/american.gxt | Bin 219054 -> 219210 bytes src/control/Record.cpp | 8 +- src/control/Script.cpp | 60 +++++++---- src/core/Collision.cpp | 112 +++++++++++-------- src/core/Collision.h | 3 + src/core/Frontend.cpp | 183 ++++++++++++++++++++++++++++++++ src/core/Frontend.h | 18 ++++ src/core/MenuScreens.cpp | 16 +++ src/core/Streaming.cpp | 40 ++++--- src/core/config.h | 2 +- src/modelinfo/ModelInfo.cpp | 26 +++-- src/render/Renderer.cpp | 16 +-- src/save/GenericGameStorage.cpp | 22 ++-- utils/gxt/american.txt | 15 +++ 14 files changed, 417 insertions(+), 104 deletions(-) diff --git a/gamefiles/TEXT/american.gxt b/gamefiles/TEXT/american.gxt index 35973f660f153bb8b22e5df638f13a624686380e..28bf0565adcbd61dfa19d3d482e8712ba4484950 100644 GIT binary patch delta 227 zcmXYoJr06U5QIl!Xb9Gpp5d8bVMPK0krxOLLumZD2Uf;-0BWz`Pbj>Di7hd32Wv~m zK(V_s-_BgF=JRIi>C(-I`@3!lW87+3xN;-nq@0W0eAIhC@UVV$KVPM&n@$HR#HZ(B zWma(mKXYU_H~;_u delta 70 zcmX@Lfp^_{UbYZ#*T@q!8`;c^CVLnqh{v5}VsLZyjrRx+VR#2+`}n&|er(jbxx{#m WC)2fC%|f;9LbZ(Bg=(2@+yVfOX&Qq7 diff --git a/src/control/Record.cpp b/src/control/Record.cpp index 8dc0028a..8a23ffde 100644 --- a/src/control/Record.cpp +++ b/src/control/Record.cpp @@ -9,6 +9,7 @@ #include "Timer.h" #include "VehicleModelInfo.h" #include "World.h" +#include "Frontend.h" uint16 CRecordDataForGame::RecordingState; uint8* CRecordDataForGame::pDataBuffer; @@ -439,10 +440,11 @@ void CRecordDataForChase::StartChaseScene(float startTime) Status = STATE_PLAYBACK; AnimTime = startTime; AnimStartTime = CTimer::GetTimeInMilliseconds(); -#ifndef NO_ISLAND_LOADING - RemoveUnusedCollision(); - CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + RemoveUnusedCollision(); + CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN); CGame::TidyUpMemory(true, true); CStreaming::ImGonnaUseStreamingMemory(); CFileMgr::SetDir("data\\paths"); diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 6eb802b4..fa0fb463 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -10017,15 +10017,21 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CollectParameters(&m_nIp, 1); CTimer::Stop(); CGame::currLevel = (eLevelName)ScriptParams[0]; -#ifndef NO_ISLAND_LOADING - CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); - CStreaming::RemoveUnusedBuildings(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + } CCollision::SortOutCollisionAfterLoad(); -#ifndef NO_ISLAND_LOADING - CStreaming::RequestIslands(CGame::currLevel); - CStreaming::LoadAllRequestedModels(true); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) #endif + { + CStreaming::RequestIslands(CGame::currLevel); + CStreaming::LoadAllRequestedModels(true); + } CTimer::Update(); return 0; } @@ -10641,24 +10647,40 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) CTimer::Stop(); CGame::currLevel = (eLevelName)ScriptParams[0]; if (CGame::currLevel != CCollision::ms_collisionInMemory) { -#ifndef NO_ISLAND_LOADING - DMAudio.SetEffectsFadeVol(0); - CPad::StopPadsShaking(); - CCollision::LoadCollisionScreen(CGame::currLevel); - DMAudio.Service(); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + DMAudio.SetEffectsFadeVol(0); + CPad::StopPadsShaking(); + CCollision::LoadCollisionScreen(CGame::currLevel); + DMAudio.Service(); + } CPopulation::DealWithZoneChange(CCollision::ms_collisionInMemory, CGame::currLevel, false); -#ifndef NO_ISLAND_LOADING - CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); - CStreaming::RemoveUnusedBuildings(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + } CCollision::SortOutCollisionAfterLoad(); -#ifndef NO_ISLAND_LOADING - CStreaming::RequestIslands(CGame::currLevel); - CStreaming::RequestBigBuildings(CGame::currLevel); - CStreaming::LoadAllRequestedModels(true); - DMAudio.SetEffectsFadeVol(127); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) #endif + CStreaming::RequestIslands(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) +#endif + CStreaming::RequestBigBuildings(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) +#endif + CStreaming::LoadAllRequestedModels(true); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) +#endif + DMAudio.SetEffectsFadeVol(127); } CTimer::Update(); return 0; diff --git a/src/core/Collision.cpp b/src/core/Collision.cpp index 6522ff1c..bd0dfb92 100644 --- a/src/core/Collision.cpp +++ b/src/core/Collision.cpp @@ -21,6 +21,7 @@ #include "SurfaceTable.h" #include "Lines.h" #include "Collision.h" +#include "Frontend.h" // TODO: where do these go? @@ -519,74 +520,101 @@ CCollision::LoadCollisionWhenINeedIt(bool forceChange) } } - if(level == CGame::currLevel || forceChange){ + if (level == CGame::currLevel || forceChange) { CTimer::Stop(); -#ifndef NO_ISLAND_LOADING - DMAudio.SetEffectsFadeVol(0); - CPad::StopPadsShaking(); - LoadCollisionScreen(CGame::currLevel); - DMAudio.Service(); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + DMAudio.SetEffectsFadeVol(0); + CPad::StopPadsShaking(); + LoadCollisionScreen(CGame::currLevel); + DMAudio.Service(); + } CPopulation::DealWithZoneChange(ms_collisionInMemory, CGame::currLevel, false); -#ifndef NO_ISLAND_LOADING - CStreaming::RemoveIslandsNotUsed(LEVEL_INDUSTRIAL); - CStreaming::RemoveIslandsNotUsed(LEVEL_COMMERCIAL); - CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN); - CStreaming::RemoveBigBuildings(LEVEL_INDUSTRIAL); - CStreaming::RemoveBigBuildings(LEVEL_COMMERCIAL); - CStreaming::RemoveBigBuildings(LEVEL_SUBURBAN); - CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); - CStreaming::RemoveUnusedModelsInLoadedList(); - CGame::TidyUpMemory(true, true); - CFileLoader::LoadCollisionFromDatFile(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) #endif + { + CStreaming::RemoveIslandsNotUsed(LEVEL_INDUSTRIAL); + CStreaming::RemoveIslandsNotUsed(LEVEL_COMMERCIAL); + CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN); + } +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) +#endif + { + CStreaming::RemoveBigBuildings(LEVEL_INDUSTRIAL); + CStreaming::RemoveBigBuildings(LEVEL_COMMERCIAL); + CStreaming::RemoveBigBuildings(LEVEL_SUBURBAN); + CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); + CStreaming::RemoveUnusedModelsInLoadedList(); + CGame::TidyUpMemory(true, true); + CFileLoader::LoadCollisionFromDatFile(CGame::currLevel); + } ms_collisionInMemory = CGame::currLevel; CReplay::EmptyReplayBuffer(); -#ifndef NO_ISLAND_LOADING - if(CGame::currLevel != LEVEL_GENERIC) - LoadSplash(GetLevelSplashScreen(CGame::currLevel)); - CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); - CStreaming::RemoveUnusedBuildings(CGame::currLevel); - CStreaming::RequestBigBuildings(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) +#endif + { + if (CGame::currLevel != LEVEL_GENERIC) + LoadSplash(GetLevelSplashScreen(CGame::currLevel)); + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + CStreaming::RequestBigBuildings(CGame::currLevel); + } +#ifdef NO_ISLAND_LOADING + else if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_MEDIUM) + CStreaming::RequestIslands(CGame::currLevel); #endif CStreaming::LoadAllRequestedModels(true); -#ifndef NO_ISLAND_LOADING - CStreaming::HaveAllBigBuildingsLoaded(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) +#endif + { + CStreaming::HaveAllBigBuildingsLoaded(CGame::currLevel); - CGame::TidyUpMemory(true, true); -#endif + CGame::TidyUpMemory(true, true); + } CTimer::Update(); -#ifndef NO_ISLAND_LOADING - DMAudio.SetEffectsFadeVol(127); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + DMAudio.SetEffectsFadeVol(127); } } +#ifdef NO_ISLAND_LOADING +bool CCollision::bAlreadyLoaded = false; +#endif void CCollision::SortOutCollisionAfterLoad(void) { if(ms_collisionInMemory == CGame::currLevel) return; -#ifndef NO_ISLAND_LOADING - CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); + if (CGame::currLevel != LEVEL_GENERIC) { #ifdef NO_ISLAND_LOADING - static bool bAlreadyLoaded = false; - if (bAlreadyLoaded) { - ms_collisionInMemory = CGame::currLevel; - return; - } - bAlreadyLoaded = true; - CFileLoader::LoadCollisionFromDatFile(LEVEL_INDUSTRIAL); - CFileLoader::LoadCollisionFromDatFile(LEVEL_COMMERCIAL); - CFileLoader::LoadCollisionFromDatFile(LEVEL_SUBURBAN); -#else - CFileLoader::LoadCollisionFromDatFile(CGame::currLevel); + if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_LOW) { + if (bAlreadyLoaded) { + ms_collisionInMemory = CGame::currLevel; + return; + } + bAlreadyLoaded = true; + CFileLoader::LoadCollisionFromDatFile(LEVEL_INDUSTRIAL); + CFileLoader::LoadCollisionFromDatFile(LEVEL_COMMERCIAL); + CFileLoader::LoadCollisionFromDatFile(LEVEL_SUBURBAN); + } else #endif + CFileLoader::LoadCollisionFromDatFile(CGame::currLevel); if(!CGame::playingIntro) LoadSplash(GetLevelSplashScreen(CGame::currLevel)); } diff --git a/src/core/Collision.h b/src/core/Collision.h index d7498ac0..da94dd34 100644 --- a/src/core/Collision.h +++ b/src/core/Collision.h @@ -212,6 +212,9 @@ class CCollision public: static eLevelName ms_collisionInMemory; static CLinkList ms_colModelCache; +#ifdef NO_ISLAND_LOADING + static bool bAlreadyLoaded; +#endif static void Init(void); static void Shutdown(void); diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index df65f94f..0c813cbb 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -122,6 +122,11 @@ int8 CMenuManager::m_nPrefsMSAALevel = 0; int8 CMenuManager::m_nDisplayMSAALevel = 0; #endif +#ifdef NO_ISLAND_LOADING +int8 CMenuManager::m_DisplayIslandLoading = ISLAND_LOADING_LOW; +int8 CMenuManager::m_PrefsIslandLoading = ISLAND_LOADING_LOW; +#endif + char CMenuManager::m_PrefsSkinFile[256] = DEFAULT_SKIN_NAME; int32 CMenuManager::m_KeyPressedCode = -1; @@ -155,6 +160,10 @@ int32 MouseButtonJustClicked; int32 JoyButtonJustClicked; //int32 *pControlTemp = 0; +#ifdef PS2_ALPHA_TEST +extern bool gPS2alphaTest; +#endif + #ifndef MASTER bool CMenuManager::m_PrefsMarketing = false; bool CMenuManager::m_PrefsDisableTutorials = false; @@ -1189,6 +1198,21 @@ CMenuManager::Draw() break; } break; +#endif +#ifdef NO_ISLAND_LOADING + case MENUACTION_ISLANDLOADING: + switch (m_DisplayIslandLoading) { + case ISLAND_LOADING_LOW: + rightText = TheText.Get("FEM_LOW"); + break; + case ISLAND_LOADING_MEDIUM: + rightText = TheText.Get("FEM_MED"); + break; + case ISLAND_LOADING_HIGH: + rightText = TheText.Get("FEM_HIG"); + break; + } + break; #endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex == -1) @@ -1245,6 +1269,11 @@ CMenuManager::Draw() rightText = TheText.Get(m_PrefsCutsceneBorders ? "FEM_ON" : "FEM_OFF"); break; #endif +#ifdef PS2_ALPHA_TEST + case MENUACTION_PS2_ALPHA_TEST: + rightText = TheText.Get(gPS2alphaTest ? "FEM_ON" : "FEM_OFF"); + break; +#endif #ifdef CUSTOM_FRONTEND_OPTIONS case MENUACTION_TRIGGERFUNC: FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu]; @@ -1389,6 +1418,12 @@ CMenuManager::Draw() if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_AAS") && m_nHelperTextMsgId == 1) ResetHelperText(); } +#endif +#ifdef NO_ISLAND_LOADING + if (m_DisplayIslandLoading == m_PrefsIslandLoading) { + if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEM_ISL") && m_nHelperTextMsgId == 1) + ResetHelperText(); + } #endif if (m_nPrefsAudio3DProviderIndex != DMAudio.GetCurrent3DProviderIndex()) { if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEA_3DH")) @@ -1409,6 +1444,12 @@ CMenuManager::Draw() if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FED_AAS")) SetHelperText(1); } +#endif +#ifdef NO_ISLAND_LOADING + if (m_DisplayIslandLoading != m_PrefsIslandLoading) { + if (!strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEM_ISL")) + SetHelperText(1); + } #endif if (m_nPrefsAudio3DProviderIndex != DMAudio.GetCurrent3DProviderIndex()) { if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEA_3DH") != 0 @@ -3333,6 +3374,13 @@ CMenuManager::LoadSettings() CFileMgr::Read(fileHandle, (char *)&m_nPrefsMSAALevel, 1); m_nDisplayMSAALevel = m_nPrefsMSAALevel; #endif +#ifdef NO_ISLAND_LOADING + CFileMgr::Read(fileHandle, (char *)&CMenuManager::m_PrefsIslandLoading, 1); + CMenuManager::m_DisplayIslandLoading = CMenuManager::m_PrefsIslandLoading; +#endif +#ifdef PS2_ALPHA_TEST + CFileMgr::Read(fileHandle, (char *)&gPS2alphaTest, 1); +#endif // PS2_ALPHA_TEST } } @@ -3432,6 +3480,12 @@ CMenuManager::SaveSettings() #ifdef MULTISAMPLING CFileMgr::Write(fileHandle, (char *)&CMenuManager::m_nPrefsMSAALevel, 1); #endif +#ifdef NO_ISLAND_LOADING + CFileMgr::Write(fileHandle, (char *)&CMenuManager::m_PrefsIslandLoading, 1); +#endif +#ifdef PS2_ALPHA_TEST + CFileMgr::Write(fileHandle, (char *)&gPS2alphaTest, 1); +#endif // PS2_ALPHA_TEST } CFileMgr::CloseFile(fileHandle); @@ -4769,6 +4823,45 @@ CMenuManager::ProcessButtonPresses(void) SaveSettings(); } break; +#endif +#ifdef NO_ISLAND_LOADING + case MENUACTION_ISLANDLOADING: + if (m_DisplayIslandLoading != m_PrefsIslandLoading) { + if (!m_bGameNotLoaded) { + if (m_DisplayIslandLoading > ISLAND_LOADING_LOW) { + if (m_DisplayIslandLoading == ISLAND_LOADING_HIGH) + CStreaming::RemoveIslandsNotUsed(LEVEL_GENERIC); + if (m_PrefsIslandLoading == ISLAND_LOADING_LOW) { + if (CGame::currLevel != LEVEL_INDUSTRIAL) + CFileLoader::LoadCollisionFromDatFile(LEVEL_INDUSTRIAL); + if (CGame::currLevel != LEVEL_COMMERCIAL) + CFileLoader::LoadCollisionFromDatFile(LEVEL_COMMERCIAL); + if (CGame::currLevel != LEVEL_SUBURBAN) + CFileLoader::LoadCollisionFromDatFile(LEVEL_SUBURBAN); + CCollision::bAlreadyLoaded = true; + m_PrefsIslandLoading = m_DisplayIslandLoading; + CStreaming::RequestBigBuildings(CGame::currLevel); + } else if (m_PrefsIslandLoading == ISLAND_LOADING_HIGH) { + m_PrefsIslandLoading = m_DisplayIslandLoading; + CStreaming::RequestIslands(CGame::currLevel); + } else + m_PrefsIslandLoading = m_DisplayIslandLoading; + } else { // low + m_PrefsIslandLoading = m_DisplayIslandLoading; + CCollision::bAlreadyLoaded = false; + CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + CStreaming::RequestIslands(CGame::currLevel); + } + + CStreaming::LoadAllRequestedModels(true); + } else + m_PrefsIslandLoading = m_DisplayIslandLoading; + SetHelperText(0); + SaveSettings(); + } + break; #endif case MENUACTION_AUDIOHW: { @@ -4842,6 +4935,43 @@ CMenuManager::ProcessButtonPresses(void) #ifdef CUTSCENE_BORDERS_SWITCH m_PrefsCutsceneBorders = true; #endif +#ifdef NO_ISLAND_LOADING + m_DisplayIslandLoading = ISLAND_LOADING_LOW; + if (!m_bGameNotLoaded) { + if (m_DisplayIslandLoading > ISLAND_LOADING_LOW) { + if (m_DisplayIslandLoading == ISLAND_LOADING_HIGH) + CStreaming::RemoveIslandsNotUsed(LEVEL_GENERIC); + if (m_PrefsIslandLoading == ISLAND_LOADING_LOW) { + if (CGame::currLevel != LEVEL_INDUSTRIAL) + CFileLoader::LoadCollisionFromDatFile(LEVEL_INDUSTRIAL); + if (CGame::currLevel != LEVEL_COMMERCIAL) + CFileLoader::LoadCollisionFromDatFile(LEVEL_COMMERCIAL); + if (CGame::currLevel != LEVEL_SUBURBAN) + CFileLoader::LoadCollisionFromDatFile(LEVEL_SUBURBAN); + CCollision::bAlreadyLoaded = true; + m_PrefsIslandLoading = m_DisplayIslandLoading; + CStreaming::RequestBigBuildings(CGame::currLevel); + } else if (m_PrefsIslandLoading == ISLAND_LOADING_HIGH) { + m_PrefsIslandLoading = m_DisplayIslandLoading; + CStreaming::RequestIslands(CGame::currLevel); + } else + m_PrefsIslandLoading = m_DisplayIslandLoading; + } else { // low + m_PrefsIslandLoading = m_DisplayIslandLoading; + CCollision::bAlreadyLoaded = false; + CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + CStreaming::RequestIslands(CGame::currLevel); + } + + CStreaming::LoadAllRequestedModels(true); + } else + m_PrefsIslandLoading = m_DisplayIslandLoading; +#endif // NO_ISLAND_LOADING +#ifdef PS2_ALPHA_TEST + gPS2alphaTest = false; +#endif // PS2_ALPHA_TEST SaveSettings(); #else } else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { @@ -4870,6 +5000,43 @@ CMenuManager::ProcessButtonPresses(void) #else CMBlur::BlurOn = true; #endif // GTA3_1_1_PATCH +#ifdef NO_ISLAND_LOADING + m_DisplayIslandLoading = ISLAND_LOADING_LOW; + if (!m_bGameNotLoaded) { + if (m_DisplayIslandLoading > ISLAND_LOADING_LOW) { + if (m_DisplayIslandLoading == ISLAND_LOADING_HIGH) + CStreaming::RemoveIslandsNotUsed(LEVEL_GENERIC); + if (m_PrefsIslandLoading == ISLAND_LOADING_LOW) { + if (CGame::currLevel != LEVEL_INDUSTRIAL) + CFileLoader::LoadCollisionFromDatFile(LEVEL_INDUSTRIAL); + if (CGame::currLevel != LEVEL_COMMERCIAL) + CFileLoader::LoadCollisionFromDatFile(LEVEL_COMMERCIAL); + if (CGame::currLevel != LEVEL_SUBURBAN) + CFileLoader::LoadCollisionFromDatFile(LEVEL_SUBURBAN); + CCollision::bAlreadyLoaded = true; + m_PrefsIslandLoading = m_DisplayIslandLoading; + CStreaming::RequestBigBuildings(CGame::currLevel); + } else if (m_PrefsIslandLoading == ISLAND_LOADING_HIGH) { + m_PrefsIslandLoading = m_DisplayIslandLoading; + CStreaming::RequestIslands(CGame::currLevel); + } else + m_PrefsIslandLoading = m_DisplayIslandLoading; + } else { // low + m_PrefsIslandLoading = m_DisplayIslandLoading; + CCollision::bAlreadyLoaded = false; + CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + CStreaming::RequestIslands(CGame::currLevel); + } + + CStreaming::LoadAllRequestedModels(true); + } else + m_PrefsIslandLoading = m_DisplayIslandLoading; +#endif // NO_ISLAND_LOADING +#ifdef PS2_ALPHA_TEST + gPS2alphaTest = false; +#endif // PS2_ALPHA_TEST SaveSettings(); #endif // GRAPHICS_MENU_OPTIONS } else if ((m_nCurrScreen != MENUPAGE_SKIN_SELECT_OLD) && (m_nCurrScreen == MENUPAGE_CONTROLLER_PC)) { @@ -5155,6 +5322,15 @@ CMenuManager::ProcessButtonPresses(void) m_nDisplayMSAALevel = 0; } break; +#endif +#ifdef NO_ISLAND_LOADING + case MENUACTION_ISLANDLOADING: + m_DisplayIslandLoading += changeValueBy; + if (m_DisplayIslandLoading > ISLAND_LOADING_HIGH) + m_DisplayIslandLoading = ISLAND_LOADING_LOW; + else if (m_DisplayIslandLoading < ISLAND_LOADING_LOW) + m_DisplayIslandLoading = ISLAND_LOADING_HIGH; + break; #endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex != -1) { @@ -5327,6 +5503,13 @@ CMenuManager::ProcessOnOffMenuOptions() DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); SaveSettings(); break; +#endif +#ifdef PS2_ALPHA_TEST + case MENUACTION_PS2_ALPHA_TEST: + gPS2alphaTest = !gPS2alphaTest; + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); + SaveSettings(); + break; #endif } } diff --git a/src/core/Frontend.h b/src/core/Frontend.h index c9af7c10..dd82507e 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -372,6 +372,12 @@ enum eMenuAction #ifdef MULTISAMPLING MENUACTION_MULTISAMPLING, #endif +#ifdef NO_ISLAND_LOADING + MENUACTION_ISLANDLOADING, +#endif +#ifdef PS2_ALPHA_TEST + MENUACTION_PS2_ALPHA_TEST, +#endif #ifdef CUTSCENE_BORDERS_SWITCH MENUACTION_CUTSCENEBORDERS, #endif @@ -622,6 +628,18 @@ public: void PrintMap(); #endif +#ifdef NO_ISLAND_LOADING + enum + { + ISLAND_LOADING_LOW = 0, + ISLAND_LOADING_MEDIUM, + ISLAND_LOADING_HIGH + }; + + static int8 m_DisplayIslandLoading; + static int8 m_PrefsIslandLoading; +#endif + public: static void BuildStatLine(Const char *text, void *stat, bool itsFloat, void *stat2); static void CentreMousePointer(); diff --git a/src/core/MenuScreens.cpp b/src/core/MenuScreens.cpp index c313944c..02c004b3 100644 --- a/src/core/MenuScreens.cpp +++ b/src/core/MenuScreens.cpp @@ -30,6 +30,18 @@ #define MENU_MULTISAMPLING(screen) #endif +#ifdef NO_ISLAND_LOADING +#define MENU_ISLAND_LOADING(screen) MENUACTION_ISLANDLOADING, "FEM_ISL", SAVESLOT_NONE, screen, +#else +#define MENU_ISLAND_LOADING(screen) +#endif + +#ifdef PS2_ALPHA_TEST +#define MENU_PS2_ALPHA_TEST(screen) MENUACTION_PS2_ALPHA_TEST, "FEM_2PR", SAVESLOT_NONE, screen, +#else +#define MENU_PS2_ALPHA_TEST(screen) +#endif + CMenuScreen aScreens[] = { // MENUPAGE_NONE = 0 { "", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, }, @@ -84,6 +96,8 @@ CMenuScreen aScreens[] = { MENU_CUTSCENE_BORDERS_SWITCH(MENUPAGE_DISPLAY_SETTINGS) MENU_MIPMAPS(MENUPAGE_DISPLAY_SETTINGS) MENU_TEXTURE_FILTERING(MENUPAGE_DISPLAY_SETTINGS) + MENU_ISLAND_LOADING(MENUPAGE_DISPLAY_SETTINGS) + MENU_PS2_ALPHA_TEST(MENUPAGE_DISPLAY_SETTINGS) MENU_MULTISAMPLING(MENUPAGE_DISPLAY_SETTINGS) MENUACTION_WIDESCREEN, "FED_WIS", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, MENU_IMPROVED_VIDEOMODE(MENUPAGE_DISPLAY_SETTINGS) @@ -502,6 +516,8 @@ CMenuScreen aScreens[] = { MENUACTION_WIDESCREEN, "FED_WIS", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, MENU_MIPMAPS(MENUPAGE_GRAPHICS_SETTINGS) MENU_TEXTURE_FILTERING(MENUPAGE_GRAPHICS_SETTINGS) + MENU_ISLAND_LOADING(MENUPAGE_GRAPHICS_SETTINGS) + MENU_PS2_ALPHA_TEST(MENUPAGE_GRAPHICS_SETTINGS) MENU_MULTISAMPLING(MENUPAGE_GRAPHICS_SETTINGS) MENU_IMPROVED_VIDEOMODE(MENUPAGE_GRAPHICS_SETTINGS) MENUACTION_SCREENRES, "FED_RES", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 40189844..089e8b23 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -32,6 +32,7 @@ #include "Replay.h" #endif #include "main.h" +#include "Frontend.h" bool CStreaming::ms_disableStreaming; bool CStreaming::ms_bLoadingBigModel; @@ -727,7 +728,9 @@ CStreaming::RequestBigBuildings(eLevelName level) for(i = n; i >= 0; i--){ b = CPools::GetBuildingPool()->GetSlot(i); if(b && b->bIsBIGBuilding -#ifndef NO_ISLAND_LOADING +#ifdef NO_ISLAND_LOADING + && ((CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_LOW) || (b->m_level == level)) +#else && b->m_level == level #endif ) @@ -740,7 +743,9 @@ CStreaming::RequestBigBuildings(eLevelName level) void CStreaming::RequestIslands(eLevelName level) { -#ifndef NO_ISLAND_LOADING +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) +#endif switch(level){ case LEVEL_INDUSTRIAL: RequestModel(islandLODcomInd, BIGBUILDINGFLAGS); @@ -756,7 +761,6 @@ CStreaming::RequestIslands(eLevelName level) break; default: break; } -#endif } void @@ -942,14 +946,17 @@ CStreaming::RemoveBuildings(eLevelName level) void CStreaming::RemoveUnusedBigBuildings(eLevelName level) { -#ifndef NO_ISLAND_LOADING - if(level != LEVEL_INDUSTRIAL) - RemoveBigBuildings(LEVEL_INDUSTRIAL); - if(level != LEVEL_COMMERCIAL) - RemoveBigBuildings(LEVEL_COMMERCIAL); - if(level != LEVEL_SUBURBAN) - RemoveBigBuildings(LEVEL_SUBURBAN); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + if (level != LEVEL_INDUSTRIAL) + RemoveBigBuildings(LEVEL_INDUSTRIAL); + if (level != LEVEL_COMMERCIAL) + RemoveBigBuildings(LEVEL_COMMERCIAL); + if (level != LEVEL_SUBURBAN) + RemoveBigBuildings(LEVEL_SUBURBAN); + } RemoveIslandsNotUsed(level); } @@ -969,7 +976,15 @@ DeleteIsland(CEntity *island) void CStreaming::RemoveIslandsNotUsed(eLevelName level) { -#ifndef NO_ISLAND_LOADING +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_HIGH) { + DeleteIsland(pIslandLODindustEntity); + DeleteIsland(pIslandLODcomIndEntity); + DeleteIsland(pIslandLODcomSubEntity); + DeleteIsland(pIslandLODsubIndEntity); + DeleteIsland(pIslandLODsubComEntity); + } else +#endif switch(level){ case LEVEL_INDUSTRIAL: DeleteIsland(pIslandLODindustEntity); @@ -987,16 +1002,13 @@ CStreaming::RemoveIslandsNotUsed(eLevelName level) DeleteIsland(pIslandLODcomIndEntity); break; default: -#endif // !NO_ISLAND_LOADING DeleteIsland(pIslandLODindustEntity); DeleteIsland(pIslandLODcomIndEntity); DeleteIsland(pIslandLODcomSubEntity); DeleteIsland(pIslandLODsubIndEntity); DeleteIsland(pIslandLODsubComEntity); -#ifndef NO_ISLAND_LOADING break; } -#endif // !NO_ISLAND_LOADING } void diff --git a/src/core/config.h b/src/core/config.h index 081d9b39..6aa41e6b 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -205,7 +205,7 @@ enum Config { #define PS2_ALPHA_TEST // emulate ps2 alpha test #define IMPROVED_VIDEOMODE // save and load videomode parameters instead of a magic number #define DISABLE_LOADING_SCREEN // disable the loading screen which vastly improves the loading time -//#define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU +#define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH //#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp index d6fb0102..5d9c7700 100644 --- a/src/modelinfo/ModelInfo.cpp +++ b/src/modelinfo/ModelInfo.cpp @@ -4,6 +4,7 @@ #include "TempColModels.h" #include "ModelIndices.h" #include "ModelInfo.h" +#include "Frontend.h" CBaseModelInfo *CModelInfo::ms_modelInfoPtrs[MODELINFOSIZE]; @@ -217,20 +218,23 @@ CModelInfo::IsBikeModel(int32 id) void CModelInfo::RemoveColModelsFromOtherLevels(eLevelName level) { -#ifndef NO_ISLAND_LOADING - int i; - CBaseModelInfo *mi; - CColModel *colmodel; +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) +#endif + { + int i; + CBaseModelInfo *mi; + CColModel *colmodel; - for(i = 0; i < MODELINFOSIZE; i++){ - mi = GetModelInfo(i); - if(mi){ - colmodel = mi->GetColModel(); - if(colmodel && colmodel->level != LEVEL_GENERIC && colmodel->level != level) - colmodel->RemoveCollisionVolumes(); + for (i = 0; i < MODELINFOSIZE; i++) { + mi = GetModelInfo(i); + if (mi) { + colmodel = mi->GetColModel(); + if (colmodel && colmodel->level != LEVEL_GENERIC && colmodel->level != level) + colmodel->RemoveCollisionVolumes(); + } } } -#endif } void diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 7ae29a2f..568f0afa 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -19,6 +19,7 @@ #include "Shadows.h" #include "PointLights.h" #include "Renderer.h" +#include "Frontend.h" bool gbShowPedRoadGroups; bool gbShowCarRoadGroups; @@ -710,15 +711,18 @@ CRenderer::ScanWorld(void) ScanSectorPoly(poly, 3, ScanSectorList); } #ifdef NO_ISLAND_LOADING - ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_INDUSTRIAL)); - ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_COMMERCIAL)); - ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_SUBURBAN)); -#else + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_HIGH) { + ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_INDUSTRIAL)); + ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_COMMERCIAL)); + ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_SUBURBAN)); + } else +#endif + { #ifdef FIX_BUGS if (CCollision::ms_collisionInMemory != LEVEL_GENERIC) #endif - ScanBigBuildingList(CWorld::GetBigBuildingList(CCollision::ms_collisionInMemory)); -#endif + ScanBigBuildingList(CWorld::GetBigBuildingList(CCollision::ms_collisionInMemory)); + } ScanBigBuildingList(CWorld::GetBigBuildingList(LEVEL_GENERIC)); } } diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 1e2d5da7..516c8d46 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -562,17 +562,23 @@ RestoreForStartLoad() ReadDataFromBufferPointer(_buf, TheCamera.GetMatrix().GetPosition().x); ReadDataFromBufferPointer(_buf, TheCamera.GetMatrix().GetPosition().y); ReadDataFromBufferPointer(_buf, TheCamera.GetMatrix().GetPosition().z); -#ifndef NO_ISLAND_LOADING - CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); - CStreaming::RemoveUnusedBuildings(CGame::currLevel); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); + CStreaming::RemoveUnusedBuildings(CGame::currLevel); + } CCollision::SortOutCollisionAfterLoad(); -#ifndef NO_ISLAND_LOADING - CStreaming::RequestBigBuildings(CGame::currLevel); - CStreaming::LoadAllRequestedModels(false); - CStreaming::HaveAllBigBuildingsLoaded(CGame::currLevel); - CGame::TidyUpMemory(true, false); +#ifdef NO_ISLAND_LOADING + if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + { + CStreaming::RequestBigBuildings(CGame::currLevel); + CStreaming::LoadAllRequestedModels(false); + CStreaming::HaveAllBigBuildingsLoaded(CGame::currLevel); + CGame::TidyUpMemory(true, false); + } if (CloseFile(file)) { return true; } else { diff --git a/utils/gxt/american.txt b/utils/gxt/american.txt index 9d9ddaa6..ea7228aa 100644 --- a/utils/gxt/american.txt +++ b/utils/gxt/american.txt @@ -7987,6 +7987,21 @@ CUTSCENE BORDERS [FEM_SCF] SCREEN FORMAT +[FEM_ISL] +MAP MEMORY USAGE + +[FEM_LOW] +LOW + +[FEM_MED] +MEDIUM + +[FEM_HIG] +HIGH + +[FEM_2PR] +PS2 ALPHA TEST + { end of file } [DUMMY] From 0418ba597bc53d08d0244188f4623ebadfdd2876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Sun, 16 Aug 2020 17:58:40 +0300 Subject: [PATCH 061/112] remove CFO --- src/core/Frontend.cpp | 150 +---------------------------- src/core/Frontend.h | 5 +- src/core/Game.cpp | 5 - src/core/MenuScreens.cpp | 21 ++++- src/core/config.h | 1 - src/core/re3.cpp | 112 ---------------------- src/extras/frontendoption.cpp | 173 ---------------------------------- src/extras/frontendoption.h | 87 ----------------- 8 files changed, 21 insertions(+), 533 deletions(-) delete mode 100644 src/extras/frontendoption.cpp delete mode 100644 src/extras/frontendoption.h diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 0c813cbb..d82c5df4 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -36,7 +36,6 @@ #include "Stats.h" #include "Messages.h" #include "FileLoader.h" -#include "frontendoption.h" #define TIDY_UP_PBP // ProcessButtonPresses #define MAX_VISIBLE_LIST_ROW 30 @@ -432,46 +431,12 @@ CMenuManager::ThingsToDoBeforeGoingBack() if ((m_nCurrScreen == MENUPAGE_SKIN_SELECT) || (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS)) { m_nTotalListRow = 0; } - -#ifdef CUSTOM_FRONTEND_OPTIONS - for (int i = 0; i < numCustomFrontendOptions; i++) { - FrontendOption &option = customFrontendOptions[i]; - if (option.type != FEOPTION_REDIRECT && option.type != FEOPTION_GOBACK && m_nCurrScreen == option.screen) { - if (option.returnPrevPageFunc) - option.returnPrevPageFunc(); - - if (m_nCurrOption == option.screenOptionOrder && option.type == FEOPTION_DYNAMIC) - option.buttonPressFunc(FEOPTION_ACTION_FOCUSLOSS); - - if (option.onlyApplyOnEnter) - option.displayedValue = *option.value; - } - } -#endif } int8 CMenuManager::GetPreviousPageOption() { -#ifndef CUSTOM_FRONTEND_OPTIONS return !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_ParentEntry[1] : aScreens[m_nCurrScreen].m_ParentEntry[0]; -#else - int8 prevPage = !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_PreviousPage[1] : aScreens[m_nCurrScreen].m_PreviousPage[0]; - - if (prevPage == -1) // Game also does same - return 0; - - prevPage = prevPage == MENUPAGE_NONE ? (!m_bGameNotLoaded ? MENUPAGE_PAUSE_MENU : MENUPAGE_START_MENU) : prevPage; - - for (int i = 0; i < NUM_MENUROWS; i++) { - if (aScreens[prevPage].m_aEntries[i].m_TargetMenu == m_nCurrScreen) { - return i; - } - } - - // Couldn't find current screen option on previous page, use default behaviour (maybe save-related screen?) - return !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_ParentEntry[1] : aScreens[m_nCurrScreen].m_ParentEntry[0]; -#endif } // ------ Functions not in the game/inlined ends @@ -990,14 +955,7 @@ CMenuManager::Draw() } #endif -#ifdef CUSTOM_FRONTEND_OPTIONS - static int lastOption = m_nCurrOption; -#endif - for (int i = 0; i < NUM_MENUROWS; ++i) { -#ifdef CUSTOM_FRONTEND_OPTIONS - bool isOptionDisabled = false; -#endif if (aScreens[m_nCurrScreen].m_aEntries[i].m_Action != MENUACTION_LABEL && aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName[0] != '\0') { wchar *rightText = nil; wchar *leftText; @@ -1274,29 +1232,6 @@ CMenuManager::Draw() rightText = TheText.Get(gPS2alphaTest ? "FEM_ON" : "FEM_OFF"); break; #endif -#ifdef CUSTOM_FRONTEND_OPTIONS - case MENUACTION_TRIGGERFUNC: - FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu]; - if (m_nCurrScreen == option.screen && i == option.screenOptionOrder) { - leftText = (wchar*)option.leftText; - if (option.type == FEOPTION_SELECT) { - if (option.displayedValue >= option.numRightTexts || option.displayedValue < 0) - option.displayedValue = 0; - - rightText = (wchar*)option.rightTexts[option.displayedValue]; - - } else if (option.type == FEOPTION_DYNAMIC) { - if (option.drawFunc) { - rightText = option.drawFunc(&isOptionDisabled); - } - } - } else { - debug("A- screen:%d option:%d - totalCo: %d, coId: %d, coScreen:%d, coOption:%d\n", m_nCurrScreen, i, numCustomFrontendOptions, aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu, option.screen, option.screenOptionOrder); - assert(0 && "Custom frontend options is borked"); - } - - break; -#endif } float nextItemY = headerHeight + nextYToUse; @@ -1383,11 +1318,7 @@ CMenuManager::Draw() || !strcmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FED_AAS") #endif ) - && !m_bGameNotLoaded -#ifdef CUSTOM_FRONTEND_OPTIONS - || isOptionDisabled -#endif - ) + && !m_bGameNotLoaded) CFont::SetColor(CRGBA(155, 117, 6, FadeIn(255))); CFont::PrintString(MENU_X_RIGHT_ALIGNED(columnWidth - textLayer), itemY, rightText); @@ -1497,20 +1428,6 @@ CMenuManager::Draw() } #endif -#ifdef CUSTOM_FRONTEND_OPTIONS - if (aScreens[m_nCurrScreen].m_aEntries[i].m_Action == MENUACTION_TRIGGERFUNC) { - FrontendOption &option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu]; - if (option.onlyApplyOnEnter && m_nCurrOption != i) - option.displayedValue = *option.value; - - if (m_nCurrOption != lastOption && lastOption == i) { - FrontendOption &oldOption = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[lastOption].m_TargetMenu]; - if (oldOption.type == FEOPTION_DYNAMIC) - oldOption.buttonPressFunc(FEOPTION_ACTION_FOCUSLOSS); - } - } -#endif - // Sliders int lastActiveBarX; switch (aScreens[m_nCurrScreen].m_aEntries[i].m_Action) { @@ -1554,10 +1471,6 @@ CMenuManager::Draw() } } -#ifdef CUSTOM_FRONTEND_OPTIONS - lastOption = m_nCurrOption; -#endif - switch (m_nCurrScreen) { case MENUPAGE_CONTROLLER_SETTINGS: case MENUPAGE_SOUND_SETTINGS: @@ -3215,10 +3128,6 @@ CMenuManager::InitialiseChangedLanguageSettings() default: break; } - -#ifdef CUSTOM_FRONTEND_OPTIONS - CustomFrontendOptionsPopulate(); -#endif } } @@ -5096,33 +5005,6 @@ CMenuManager::ProcessButtonPresses(void) RequestFrontEndShutDown(); RetryMission(2, 0); return; -#endif -#ifdef CUSTOM_FRONTEND_OPTIONS - case MENUACTION_TRIGGERFUNC: - FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu]; - if (m_nCurrScreen == option.screen && m_nCurrOption == option.screenOptionOrder) { - if (option.type == FEOPTION_SELECT) { - if (!option.onlyApplyOnEnter) { - option.displayedValue++; - if (option.displayedValue >= option.numRightTexts || option.displayedValue < 0) - option.displayedValue = 0; - } - option.changeFunc(option.displayedValue); - *option.value = option.displayedValue; - - } else if (option.type == FEOPTION_DYNAMIC) { - option.buttonPressFunc(FEOPTION_ACTION_SELECT); - } else if (option.type == FEOPTION_REDIRECT) { - ChangeScreen(option.to, option.option, true, option.fadeIn); - } else if (option.type == FEOPTION_GOBACK) { - goBack = true; - } - } else { - debug("B- screen:%d option:%d - totalCo: %d, coId: %d, coScreen:%d, coOption:%d\n", m_nCurrScreen, m_nCurrOption, numCustomFrontendOptions, aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu, option.screen, option.screenOptionOrder); - assert(0 && "Custom frontend options are borked"); - } - - break; #endif } } @@ -5354,36 +5236,6 @@ CMenuManager::ProcessButtonPresses(void) DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); SaveSettings(); break; -#ifdef CUSTOM_FRONTEND_OPTIONS - case MENUACTION_TRIGGERFUNC: - FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu]; - if (m_nCurrScreen == option.screen && m_nCurrOption == option.screenOptionOrder) { - if (option.type == FEOPTION_SELECT) { - if (changeValueBy > 0) { - option.displayedValue++; - if (option.displayedValue >= option.numRightTexts) - option.displayedValue = 0; - } else { - option.displayedValue--; - if (option.displayedValue < 0) - option.displayedValue = option.numRightTexts - 1; - } - if (!option.onlyApplyOnEnter) { - option.changeFunc(option.displayedValue); - *option.value = option.displayedValue; - } - } else if (option.type == FEOPTION_DYNAMIC) { - option.buttonPressFunc(changeValueBy > 0 ? FEOPTION_ACTION_RIGHT : FEOPTION_ACTION_LEFT); - } - DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); - } - else { - debug("C- screen:%d option:%d - totalCo: %d, coId: %d, coScreen:%d, coOption:%d\n", m_nCurrScreen, m_nCurrOption, numCustomFrontendOptions, aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu, option.screen, option.screenOptionOrder); - assert(0 && "Custom frontend options are borked"); - } - - break; -#endif } ProcessOnOffMenuOptions(); if (m_nCurrScreen == MENUPAGE_KEYBOARD_CONTROLS) { diff --git a/src/core/Frontend.h b/src/core/Frontend.h index dd82507e..d631a7d1 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -381,9 +381,6 @@ enum eMenuAction #ifdef CUTSCENE_BORDERS_SWITCH MENUACTION_CUTSCENEBORDERS, #endif -#ifdef CUSTOM_FRONTEND_OPTIONS - MENUACTION_TRIGGERFUNC -#endif }; enum eCheckHover @@ -478,7 +475,7 @@ struct CMenuScreen int32 m_Action; // eMenuAction char m_EntryName[8]; int32 m_SaveSlot; // eSaveSlot - int32 m_TargetMenu; // eMenuScreen // FrontendOption ID if it's a custom option + int32 m_TargetMenu; // eMenuScreen } m_aEntries[NUM_MENUROWS]; }; diff --git a/src/core/Game.cpp b/src/core/Game.cpp index d5b376f6..06f2c1bd 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -86,7 +86,6 @@ #include "ZoneCull.h" #include "Zones.h" #include "debugmenu.h" -#include "frontendoption.h" #include "postfx.h" eLevelName CGame::currLevel; @@ -292,10 +291,6 @@ bool CGame::InitialiseOnceAfterRW(void) DMAudio.SetEffectsFadeVol(127); DMAudio.SetMusicFadeVol(127); CWorld::Players[0].SetPlayerSkin(CMenuManager::m_PrefsSkinFile); - -#ifdef CUSTOM_FRONTEND_OPTIONS - CustomFrontendOptionsPopulate(); -#endif return true; } diff --git a/src/core/MenuScreens.cpp b/src/core/MenuScreens.cpp index 02c004b3..5dfcc8fe 100644 --- a/src/core/MenuScreens.cpp +++ b/src/core/MenuScreens.cpp @@ -2,8 +2,6 @@ #include "Frontend.h" #ifdef PC_MENU -// If you want to add new options, please don't do that here and see CustomFrontendOptionsPopulate in re3.cpp. - #ifdef CUTSCENE_BORDERS_SWITCH #define MENU_CUTSCENE_BORDERS_SWITCH(screen) MENUACTION_CUTSCENEBORDERS, "FEM_CSB", SAVESLOT_NONE, screen, #else @@ -47,7 +45,11 @@ CMenuScreen aScreens[] = { { "", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, }, // MENUPAGE_STATS = 1 +#ifdef MENU_MAP + { "FET_STA", 1, MENUPAGE_NONE, MENUPAGE_NONE, 5, 3, +#else { "FET_STA", 1, MENUPAGE_NONE, MENUPAGE_NONE, 5, 2, +#endif MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, }, @@ -60,7 +62,11 @@ CMenuScreen aScreens[] = { }, // MENUPAGE_BRIEFS = 3 +#ifdef MENU_MAP + { "FET_BRE", 1, MENUPAGE_NONE, MENUPAGE_NONE, 6, 4, +#else { "FET_BRE", 1, MENUPAGE_NONE, MENUPAGE_NONE, 6, 3, +#endif MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, }, @@ -375,7 +381,11 @@ CMenuScreen aScreens[] = { }, // MENUPAGE_OPTIONS = 41 +#ifdef MENU_MAP + { "FET_OPT", 1, MENUPAGE_NONE, MENUPAGE_NONE, 1, 5, +#else { "FET_OPT", 1, MENUPAGE_NONE, MENUPAGE_NONE, 1, 4, +#endif MENUACTION_CHANGEMENU, "FET_CTL", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC, MENUACTION_LOADRADIO, "FET_AUD", SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS, MENUACTION_CHANGEMENU, "FET_DIS", SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS, @@ -388,7 +398,11 @@ CMenuScreen aScreens[] = { }, // MENUPAGE_EXIT = 42 +#ifdef MENU_MAP + { "FET_QG", 1, MENUPAGE_NONE, MENUPAGE_NONE, 2, 6, +#else { "FET_QG", 1, MENUPAGE_NONE, MENUPAGE_NONE, 2, 5, +#endif MENUACTION_LABEL, "FEQ_SRE", SAVESLOT_NONE, MENUPAGE_NONE, MENUACTION_DONTCANCEL, "FEM_NO", SAVESLOT_NONE, MENUPAGE_NONE, MENUACTION_CANCELGAME, "FEM_YES", SAVESLOT_NONE, MENUPAGE_NONE, @@ -449,6 +463,9 @@ CMenuScreen aScreens[] = { { "FET_PAU", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, MENUACTION_RESUME, "FEM_RES", SAVESLOT_NONE, MENUPAGE_NONE, MENUACTION_CHANGEMENU, "FEN_STA", SAVESLOT_NONE, MENUPAGE_NEW_GAME, +#ifdef MENU_MAP + MENUACTION_CHANGEMENU, "FEG_MAP", SAVESLOT_NONE, MENUPAGE_MAP, +#endif MENUACTION_CHANGEMENU, "FEP_STA", SAVESLOT_NONE, MENUPAGE_STATS, MENUACTION_CHANGEMENU, "FEP_BRI", SAVESLOT_NONE, MENUPAGE_BRIEFS, MENUACTION_CHANGEMENU, "FET_OPT", SAVESLOT_NONE, MENUPAGE_OPTIONS, diff --git a/src/core/config.h b/src/core/config.h index 6aa41e6b..00a8076f 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -246,7 +246,6 @@ enum Config { # define SCROLLABLE_STATS_PAGE // only draggable by mouse atm # define TRIANGLE_BACK_BUTTON //# define CIRCLE_BACK_BUTTON -# define CUSTOM_FRONTEND_OPTIONS # define GRAPHICS_MENU_OPTIONS #endif diff --git a/src/core/re3.cpp b/src/core/re3.cpp index dbc526dd..eef30706 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -70,115 +70,6 @@ mysrand(unsigned int seed) myrand_seed = seed; } -#ifdef CUSTOM_FRONTEND_OPTIONS -#include "frontendoption.h" -#include "platform.h" - -void ReloadFrontendOptions(void) -{ - CustomFrontendOptionsPopulate(); -} - -#ifdef MORE_LANGUAGES -void LangPolSelect(int8 action) -{ - if (action == FEOPTION_ACTION_SELECT) { - FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_POLISH; - FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true; - FrontEndMenuManager.InitialiseChangedLanguageSettings(); - FrontEndMenuManager.SaveSettings(); - } -} - -void LangRusSelect(int8 action) -{ - if (action == FEOPTION_ACTION_SELECT) { - FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_RUSSIAN; - FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true; - FrontEndMenuManager.InitialiseChangedLanguageSettings(); - FrontEndMenuManager.SaveSettings(); - } -} - -void LangJapSelect(int8 action) -{ - if (action == FEOPTION_ACTION_SELECT) { - FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_JAPANESE; - FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true; - FrontEndMenuManager.InitialiseChangedLanguageSettings(); - FrontEndMenuManager.SaveSettings(); - } -} -#endif - -/*#ifdef IMPROVED_VIDEOMODE -void ScreenModeChange(int8 displayedValue) -{ - if (displayedValue != FrontEndMenuManager.m_nPrefsWindowed) { - FrontEndMenuManager.m_nPrefsWindowed = displayedValue; - _psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode); // apply same resolution - FrontEndMenuManager.SetHelperText(0); - FrontEndMenuManager.SaveSettings(); - } -} -#endif*/ - -#ifdef FREE_CAM -void ToggleFreeCam(int8 action) -{ - if (action == FEOPTION_ACTION_SELECT) { - TheCamera.bFreeCam = !TheCamera.bFreeCam; - FrontEndMenuManager.SaveSettings(); - } -} -#endif - -//#ifdef CUTSCENE_BORDERS_SWITCH -//void BorderModeChange(int8 displayedValue) -//{ -// CMenuManager::m_PrefsCutsceneBorders = !!displayedValue; -// FrontEndMenuManager.SaveSettings(); -//} -//#endif - -// Reloaded on language change, so you can use hardcoded wchar* and TheText.Get with peace of mind -void -CustomFrontendOptionsPopulate(void) -{ - RemoveCustomFrontendOptions(); // if exist - -#ifdef MORE_LANGUAGES - FrontendOptionSetPosition(MENUPAGE_LANGUAGE_SETTINGS); - FrontendOptionAddDynamic(TheText.Get("FEL_POL"), nil, LangPolSelect, nil); - FrontendOptionAddDynamic(TheText.Get("FEL_RUS"), nil, LangRusSelect, nil); - FrontendOptionAddDynamic(TheText.Get("FEL_JAP"), nil, LangJapSelect, nil); -#endif - -/*#ifdef IMPROVED_VIDEOMODE - static const wchar *screenModes[] = { (wchar*)L"FULLSCREEN", (wchar*)L"WINDOWED" }; - FrontendOptionSetPosition(MENUPAGE_GRAPHICS_SETTINGS, 8); - FrontendOptionAddSelect(TheText.Get("SCRFOR"), screenModes, 2, (int8*)&FrontEndMenuManager.m_nPrefsWindowed, true, ScreenModeChange, nil); -#endif*/ - -#ifdef MENU_MAP - FrontendOptionSetPosition(MENUPAGE_PAUSE_MENU, 2); - FrontendOptionAddRedirect(TheText.Get("FEG_MAP"), MENUPAGE_MAP); -#endif - -#ifdef FREE_CAM - static const wchar *text = (wchar*)L"TOGGLE FREE CAM"; - FrontendOptionSetPosition(MENUPAGE_CONTROLLER_PC, 1); - FrontendOptionAddDynamic(text, nil, ToggleFreeCam, nil); -#endif - -/*#ifdef CUTSCENE_BORDERS_SWITCH - static const wchar *off_on[] = { TheText.Get("FEM_OFF"), TheText.Get("FEM_ON") }; - FrontendOptionSetPosition(MENUPAGE_DISPLAY_SETTINGS, 3); - FrontendOptionAddSelect((const wchar *)L"CUTSCENE BORDERS", off_on, 2, (int8 *)&CMenuManager::m_PrefsCutsceneBorders, false, BorderModeChange, nil); -#endif*/ -} -#endif - #ifdef DEBUGMENU void WeaponCheat(); void HealthCheat(); @@ -502,9 +393,6 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Debug", "Catalina Fly Away", CHeli::MakeCatalinaHeliFlyAway); DebugMenuAddVarBool8("Debug", "Script Heli On", &CHeli::ScriptHeliOn, nil); -#ifdef CUSTOM_FRONTEND_OPTIONS - DebugMenuAddCmd("Debug", "Reload custom frontend options", ReloadFrontendOptions); -#endif DebugMenuAddVarBool8("Debug", "Toggle popping heads on headshot", &CPed::bPopHeadsOnHeadshot, nil); DebugMenuAddCmd("Debug", "Start Credits", CCredits::Start); DebugMenuAddCmd("Debug", "Stop Credits", CCredits::Stop); diff --git a/src/extras/frontendoption.cpp b/src/extras/frontendoption.cpp deleted file mode 100644 index 51814f35..00000000 --- a/src/extras/frontendoption.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include "common.h" - -#ifdef CUSTOM_FRONTEND_OPTIONS -#include "frontendoption.h" - -int numCustomFrontendOptions = 0; -FrontendOption *customFrontendOptions; - -int optionCursor = -1; -eMenuScreen currentMenu; - -void ChangeScreen(eMenuScreen screen, int option, bool fadeIn) -{ - FrontEndMenuManager.m_nPrevScreen = FrontEndMenuManager.m_nCurrScreen; - FrontEndMenuManager.m_nCurrScreen = screen; - FrontEndMenuManager.m_nCurrOption = option; - if (fadeIn) - FrontEndMenuManager.m_nMenuFadeAlpha = 0; -} - -void GoBack(bool fadeIn) -{ - int screen = !FrontEndMenuManager.m_bGameNotLoaded ? - aScreens[FrontEndMenuManager.m_nCurrScreen].m_PreviousPage[1] : aScreens[FrontEndMenuManager.m_nCurrScreen].m_PreviousPage[0]; - int option = !FrontEndMenuManager.m_bGameNotLoaded ? - aScreens[FrontEndMenuManager.m_nCurrScreen].m_ParentEntry[1] : aScreens[FrontEndMenuManager.m_nCurrScreen].m_ParentEntry[0]; - - FrontEndMenuManager.ThingsToDoBeforeGoingBack(); - - ChangeScreen((eMenuScreen)screen, option, fadeIn); -} - -uint8 -GetNumberOfMenuOptions(int screen) -{ - uint8 Rows = 0; - for (int i = 0; i < NUM_MENUROWS; i++) { - if (aScreens[screen].m_aEntries[i].m_Action == MENUACTION_NOTHING) - break; - - ++Rows; - } - return Rows; -} - -// Used before populating options, but effective in InitialiseChangedLanguageSettings and debugmenu -void -RemoveCustomFrontendOptions() -{ - if (numCustomFrontendOptions == 0) - return; - - for (int i = 0; i < MENUPAGES; i++) { - for (int j = 0; j < NUM_MENUROWS; j++) { - if (aScreens[i].m_aEntries[j].m_Action == MENUACTION_TRIGGERFUNC) { - int k; - for (k = j; k < NUM_MENUROWS-1; k++) { - memcpy(&aScreens[i].m_aEntries[k], &aScreens[i].m_aEntries[k+1], sizeof(CMenuScreen::CMenuEntry)); - } - aScreens[i].m_aEntries[k].m_Action = MENUACTION_NOTHING; - aScreens[i].m_aEntries[k].m_EntryName[0] = '\0'; - j--; - } - } - } - free(customFrontendOptions); - numCustomFrontendOptions = 0; -} - -int8 RegisterNewOption(int screen) -{ - numCustomFrontendOptions++; - if (numCustomFrontendOptions == 1) - customFrontendOptions = (FrontendOption*)malloc(5 * sizeof(FrontendOption)); - else if (numCustomFrontendOptions % 5 == 1) - customFrontendOptions = (FrontendOption*)realloc(customFrontendOptions, (numCustomFrontendOptions + 4) * sizeof(FrontendOption)); - - assert(customFrontendOptions != nil && "Custom frontend options can't be allocated"); - - uint8 nth = GetNumberOfMenuOptions(screen); - if (optionCursor < 0) { - if (optionCursor == -1) { - if (!strcmp(aScreens[screen].m_aEntries[nth - 1].m_EntryName, "FEDS_TB") || !strcmp(aScreens[screen].m_aEntries[nth - 1].m_EntryName, "FESZ_CA")) { - // Move back button one below - memcpy(&aScreens[screen].m_aEntries[nth], &aScreens[screen].m_aEntries[nth - 1], sizeof(CMenuScreen::CMenuEntry)); - nth--; - } - } - } else { - if (aScreens[screen].m_aEntries[optionCursor].m_Action != MENUACTION_NOTHING) { - for (int i = nth - 1; i >= optionCursor; i--) { - memcpy(&aScreens[screen].m_aEntries[i + 1], &aScreens[screen].m_aEntries[i], sizeof(CMenuScreen::CMenuEntry)); - } - } - nth = optionCursor; - optionCursor++; - } - - aScreens[screen].m_aEntries[nth].m_Action = MENUACTION_TRIGGERFUNC; - aScreens[screen].m_aEntries[nth].m_TargetMenu = numCustomFrontendOptions - 1; - aScreens[screen].m_aEntries[nth].m_EntryName[0] = 1; // just something to fool it - return nth; -} - -void FrontendOptionSetPosition(eMenuScreen screen, int8 option) -{ - currentMenu = screen; - optionCursor = option; -} - -void FrontendOptionAddSelect(const wchar* leftText, const wchar** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, ReturnPrevPageFunc returnPrevPageFunc) -{ - int8 screenOptionOrder = RegisterNewOption(currentMenu); - - FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1]; - option.screen = currentMenu; - option.type = FEOPTION_SELECT; - option.leftText = leftText; - option.rightTexts = rightTexts; - option.numRightTexts = numRightTexts; - option.value = var; - option.displayedValue = *var; - option.onlyApplyOnEnter = onlyApplyOnEnter; - option.changeFunc = changeFunc; - option.screenOptionOrder = screenOptionOrder; - option.returnPrevPageFunc = returnPrevPageFunc; -} - -void FrontendOptionAddDynamic(const wchar* leftText, DrawFunc drawFunc, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc) -{ - int8 screenOptionOrder = RegisterNewOption(currentMenu); - - FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1]; - option.screen = currentMenu; - option.type = FEOPTION_DYNAMIC; - option.drawFunc = drawFunc; - option.buttonPressFunc = buttonPressFunc; - option.leftText = leftText; - option.onlyApplyOnEnter = false; - option.screenOptionOrder = screenOptionOrder; - option.returnPrevPageFunc = returnPrevPageFunc; -} - -void FrontendOptionAddRedirect(const wchar* text, eMenuScreen to, int8 selectedOption, bool fadeIn) -{ - int8 screenOptionOrder = RegisterNewOption(currentMenu); - - FrontendOption &option = customFrontendOptions[numCustomFrontendOptions - 1]; - option.screen = currentMenu; - option.type = FEOPTION_REDIRECT; - option.to = to; - option.option = selectedOption; - option.fadeIn = fadeIn; - option.leftText = text; - option.onlyApplyOnEnter = false; - option.screenOptionOrder = screenOptionOrder; - option.returnPrevPageFunc = nil; -} - -void FrontendOptionAddBackButton(const wchar* text, bool fadeIn) -{ - int8 screenOptionOrder = RegisterNewOption(currentMenu); - - FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1]; - option.screen = currentMenu; - option.type = FEOPTION_GOBACK; - option.fadeIn = fadeIn; - option.leftText = text; - option.onlyApplyOnEnter = false; - option.screenOptionOrder = screenOptionOrder; - option.returnPrevPageFunc = nil; -} -#endif \ No newline at end of file diff --git a/src/extras/frontendoption.h b/src/extras/frontendoption.h deleted file mode 100644 index 7cfc09a7..00000000 --- a/src/extras/frontendoption.h +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once -#include "common.h" - -#ifdef CUSTOM_FRONTEND_OPTIONS -#include "Frontend.h" - -// Warning: All of the code relies on that you won't use more then NUM_MENUROWS(18) options on one page. Also congrats if you can make 18 options visible at once. - - -// Static/select: User allocates variable, passes it to function and it's set automatically from input among the strings given to function, -// then you can handle ChangeFunc and ReturnPrevPageFunc if needed. -// -// Dynamic: Function doesn't accept value pointer, user should do operations with handling ButtonPressFunc. -// Right-side text can be set via DrawFunc, which is called on every draw. ReturnPrevPageFunc is also here if needed. - -#define FEOPTION_SELECT 0 -#define FEOPTION_DYNAMIC 1 -#define FEOPTION_REDIRECT 2 -#define FEOPTION_GOBACK 3 - -#define FEOPTION_ACTION_LEFT 0 -#define FEOPTION_ACTION_RIGHT 1 -#define FEOPTION_ACTION_SELECT 2 -#define FEOPTION_ACTION_FOCUSLOSS 3 - -void RemoveCustomFrontendOptions(); -void CustomFrontendOptionsPopulate(); - -// for static and dynamic options -typedef void (*ReturnPrevPageFunc)(); - -// for static options -typedef void (*ChangeFunc)(int8 displayedValue); // called before updating the value - -// for dynamic options -typedef wchar* (*DrawFunc)(bool* disabled); // should return pointer to right text. *disabled = true will make it dark yellow -typedef void (*ButtonPressFunc)(int8 action); // see FEOPTION_ACTIONs above - -struct FrontendOption -{ - int8 type; - int8 screenOptionOrder; - eMenuScreen screen; - const wchar* leftText; - ReturnPrevPageFunc returnPrevPageFunc; - - union { - // Only for dynamic - struct { - DrawFunc drawFunc; - ButtonPressFunc buttonPressFunc; - }; - - // Only for static/select - struct { - const wchar** rightTexts; - int8 numRightTexts; - int8 *value; - int8 displayedValue; // if onlyApplyOnEnter enabled - bool onlyApplyOnEnter; - ChangeFunc changeFunc; - }; - - // Only for redirect - struct { - eMenuScreen to; - int8 option; - bool fadeIn; - }; - }; -}; - -extern int numCustomFrontendOptions; -extern FrontendOption* customFrontendOptions; - -// To be used in ButtonPressFunc / ChangeFunc(but that would be weird): -void ChangeScreen(eMenuScreen screen, int option = 0, bool fadeIn = true); -void GoBack(bool fadeIn = true); - -// If option is positive number, all calls will increase it before using it (you can think it as cursor). -1 means before the back button, -2 is end of page -void FrontendOptionSetPosition(eMenuScreen screen, int8 option = -1); - -void FrontendOptionAddSelect(const wchar* leftText, const wchar** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, ReturnPrevPageFunc returnPrevPageFunc); -void FrontendOptionAddDynamic(const wchar* leftText, DrawFunc rightTextDrawFunc, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc); -void FrontendOptionAddRedirect(const wchar* text, eMenuScreen to, int8 selectedOption = 0, bool fadeIn = true); -void FrontendOptionAddBackButton(const wchar* text, bool fadeIn = true); -#endif \ No newline at end of file From d303c33c2e03edc4c4980a06afe81004f1ae430f Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 16 Aug 2020 18:39:11 +0300 Subject: [PATCH 062/112] CarCtrl finished, minor Script things --- src/control/CarCtrl.cpp | 52 ++++++++- src/control/CarCtrl.h | 1 + src/control/Script.cpp | 222 ++++++++++++++++++++---------------- src/core/Pad.cpp | 10 +- src/core/Stats.cpp | 4 +- src/vehicles/Automobile.cpp | 2 +- src/vehicles/Automobile.h | 2 +- vendor/librw | 2 +- 8 files changed, 188 insertions(+), 107 deletions(-) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index cd08753d..0d85d54f 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -81,6 +81,9 @@ #define OFFSCREEN_DESPAWN_RANGE (40.0f) #define EXTENDED_RANGE_DESPAWN_MULTIPLIER (1.5f) +//--MIAMI: file done + +bool CCarCtrl::bMadDriversCheat; int CCarCtrl::NumLawEnforcerCars; int CCarCtrl::NumAmbulancesOnDuty; int CCarCtrl::NumFiretrucksOnDuty; @@ -664,7 +667,7 @@ CCarCtrl::GenerateOneRandomCar() nMadDrivers = 6; break; } - if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers /* TODO(MIAMI): || mad drivers cheat */) { + if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers || bMadDriversCheat) { pVehicle->SetStatus(STATUS_PHYSICS); pVehicle->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_AVOID_CARS; pVehicle->AutoPilot.m_nCruiseSpeed += 10; @@ -2515,7 +2518,7 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe SteerAIBoatWithPhysicsAttackingPlayer(pVehicle, pSwerve, pAccel, pBrake, pHandbrake); return; case MISSION_PLANE_FLYTOCOORS: - //SteerAIPlaneTowardsTargetCoors((CAutomobile*)pVehicle); + SteerAIPlaneTowardsTargetCoors((CAutomobile*)pVehicle); return; case MISSION_SLOWLY_DRIVE_TOWARDS_PLAYER_1: SteerAICarWithPhysicsHeadingForTarget(pVehicle, nil, @@ -2737,6 +2740,51 @@ void CCarCtrl::SteerAIHeliTowardsTargetCoors(CAutomobile* pHeli) pHeli->GetMatrix().GetUp() = up; } +void CCarCtrl::SteerAIPlaneTowardsTargetCoors(CAutomobile* pPlane) +{ + CVector2D vecToTarget = pPlane->AutoPilot.m_vecDestinationCoors - pPlane->GetPosition(); + float fForwardZ = (pPlane->AutoPilot.m_vecDestinationCoors.z - pPlane->GetPosition().z) / vecToTarget.Magnitude(); + fForwardZ = clamp(fForwardZ, -0.3f, 0.3f); + float angle = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y); + while (angle > TWOPI) + angle -= TWOPI; + float difference = LimitRadianAngle(angle - pPlane->m_fOrientation); + float steer = difference > 0.0f ? 0.04f : -0.04f; + if (Abs(difference) < 0.2f) + steer *= 5.0f * Abs(difference); + pPlane->m_fPlaneSteer *= Pow(0.96, CTimer::GetTimeStep()); + float steerChange = steer - pPlane->m_fPlaneSteer; + float maxChange = 0.003f * CTimer::GetTimeStep(); + if (Abs(steerChange) < maxChange) + pPlane->m_fPlaneSteer = steer; + else if (steerChange < 0.0f) + pPlane->m_fPlaneSteer -= maxChange; + else + pPlane->m_fPlaneSteer += maxChange; + pPlane->m_fOrientation += pPlane->m_fPlaneSteer * CTimer::GetTimeStep(); + CVector up(0.0f, 0.0f, 1.0f); + up.Normalise(); + CVector forward(Cos(pPlane->m_fOrientation), Sin(pPlane->m_fOrientation), fForwardZ); + forward.Normalise(); + CVector right = CrossProduct(forward, up); + right.z -= 5.0f * pPlane->m_fPlaneSteer; + right.Normalise(); + up = CrossProduct(forward, right); + up.Normalise(); + right = CrossProduct(forward, up); + pPlane->GetMatrix().GetRight() = right; + pPlane->GetMatrix().GetForward() = forward; + pPlane->GetMatrix().GetUp() = up; + float newSplit = 1.0f - Pow(0.95, CTimer::GetTimeStep()); + float oldSplit = 1.0f - newSplit; +#ifdef FIX_BUGS + pPlane->m_vecMoveSpeed = pPlane->m_vecMoveSpeed * oldSplit + pPlane->AutoPilot.GetCruiseSpeed() * 0.01f * forward * newSplit; +#else + pPlane->m_vecMoveSpeed = pPlane->m_vecMoveSpeed * oldSplit + pPlane->AutoPilot.m_nCruiseSpeed * 0.01f * forward * newSplit; +#endif + pPlane->m_vecTurnSpeed = CVector(0.0f, 0.0f, 0.0f); +} + void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerve, float* pAccel, float* pBrake, bool* pHandbrake) { CVector2D forward = pVehicle->GetForward(); diff --git a/src/control/CarCtrl.h b/src/control/CarCtrl.h index 6b4e94ee..76491193 100644 --- a/src/control/CarCtrl.h +++ b/src/control/CarCtrl.h @@ -145,6 +145,7 @@ public: return angle; } + static bool bMadDriversCheat; static int32 NumLawEnforcerCars; static int32 NumAmbulancesOnDuty; static int32 NumFiretrucksOnDuty; diff --git a/src/control/Script.cpp b/src/control/Script.cpp index e16ba9e0..6fbe6c81 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -3133,7 +3133,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { CollectParameters(&m_nIp, 4); int32 index = ScriptParams[0]; - assert(index < NUMPLAYERS); + script_assert(index < NUMPLAYERS); printf("&&&&&&&&&&&&&Creating player: %d\n", index); if (!CStreaming::HasModelLoaded(MI_PLAYER)) { CStreaming::RequestSpecialModel(MI_PLAYER, "player", STREAMFLAGS_DONT_REMOVE | STREAMFLAGS_DEPENDENCY); @@ -5174,7 +5174,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); if (pPed->bInVehicle) return 0; pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(*(float*)&ScriptParams[1]); @@ -6000,7 +6000,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_DESTROY_OBJECT, pVehicle); @@ -10450,7 +10450,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_LEAVE_CAR, pPed->m_pMyVehicle); return 0; @@ -10652,7 +10652,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->m_nPedMoney = ScriptParams[1]; pPed->bMoneyHasBeenGivenByScript = true; return 0; @@ -10662,7 +10662,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 4); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); CVector result = Multiply3x3(pObject->GetMatrix(), *(CVector*)&ScriptParams[1]) + pObject->GetPosition(); *(CVector*)&ScriptParams[0] = result; StoreParameters(&m_nIp, 3); @@ -10695,7 +10695,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 4); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); CVector result = Multiply3x3(pVehicle->GetMatrix(), *(CVector*)&ScriptParams[1]) + pVehicle->GetPosition(); *(CVector*)&ScriptParams[0] = result; StoreParameters(&m_nIp, 3); @@ -11053,7 +11053,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); UpdateCompareFlag(ScriptParams[1] < pVehicle->m_nNumMaxPassengers && pVehicle->pPassengers[ScriptParams[1]] == nil); return 0; } @@ -11204,7 +11204,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) return 0; */ case COMMAND_ARE_ANY_CAR_CHEATS_ACTIVATED: - UpdateCompareFlag(CVehicle::bAllDodosCheat || CVehicle::bCheat3); // TODO(MIAMI): more cheats! + UpdateCompareFlag(CVehicle::bAllDodosCheat || CVehicle::bCheat3 || CVehicle::bHoverCheat || CVehicle::bCheat8); // TODO(MIAMI): more cheats! return 0; case COMMAND_SET_CHAR_SUFFERS_CRITICAL_HITS: { @@ -11896,7 +11896,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->m_ceaseAttackTimer = ScriptParams[1]; return 0; } @@ -11932,7 +11932,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); pVehicle->m_nRouteSeed = ScriptParams[1]; return 0; } @@ -11949,7 +11949,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->ClearWeapons(); return 0; } @@ -11957,7 +11957,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); bool bFound = false; for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { if (pPed->GetWeapon(i).m_eWeaponType == ScriptParams[1]) { @@ -11974,7 +11974,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle && pVehicle->m_vehType == VEHICLE_TYPE_CAR); + script_assert(pVehicle && pVehicle->m_vehType == VEHICLE_TYPE_CAR); ((CAutomobile*)pVehicle)->bTankDetonateCars = ScriptParams[1]; return 0; } @@ -11993,7 +11993,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); bool bOnFire = false; if (pVehicle->m_pCarFire) bOnFire = true; @@ -12008,7 +12008,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); bool bIsBurst = false; CBike* pBike = (CBike*)pVehicle; if (pVehicle->m_vehType == VEHICLE_APPEARANCE_BIKE) { @@ -12081,7 +12081,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 5); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); + script_assert(pVehicle && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); ((CAutomobile*)pVehicle)->TellHeliToGoToCoors(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], *(float*)&ScriptParams[3], ScriptParams[4]); return 0; } @@ -12124,7 +12124,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); return 0; } @@ -12132,7 +12132,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); return 0; } @@ -12140,7 +12140,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); return 0; } @@ -12148,7 +12148,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); return 0; } @@ -12156,7 +12156,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE); return 0; } @@ -12164,7 +12164,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); return 0; } @@ -12259,7 +12259,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); ScriptParams[0] = pPed->GetWeapon(ScriptParams[1]).m_eWeaponType; ScriptParams[1] = pPed->GetWeapon(ScriptParams[1]).m_nAmmoTotal; ScriptParams[2] = CPickups::ModelForWeapon((eWeaponType)ScriptParams[0]); @@ -12279,10 +12279,11 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); float speed = *(float*)&ScriptParams[1] / GAME_SPEED_TO_CARAI_SPEED; pVehicle->SetMoveSpeed(pVehicle->GetForward() * speed); - // TODO(MIAMI): heli hack! + if (pVehicle->IsRealHeli() && pVehicle->IsCar()) + ((CAutomobile*)pVehicle)->m_aWheelSpeed[1] = 0.22f; return 0; } case COMMAND_SET_AREA_VISIBLE: @@ -12303,7 +12304,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); pVehicle->bPartOfConvoy = ScriptParams[1]; return 0; } @@ -12335,9 +12336,9 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - assert(pTargetPed); + script_assert(pTargetPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING, pTargetPed); return 0; @@ -12347,7 +12348,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 4); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); CVector result = Multiply3x3(pPed->GetMatrix(), *(CVector*)&ScriptParams[1]) + pPed->GetPosition(); *(CVector*)&ScriptParams[0] = result; StoreParameters(&m_nIp, 3); @@ -12357,7 +12358,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); bool result = false; if (pPed->bHasBeenPhotographed) { result = true; @@ -12370,9 +12371,9 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - assert(pTargetPed); + script_assert(pTargetPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_AIM_GUN_AT, pTargetPed); return 0; @@ -12388,7 +12389,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && (pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI || pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE)); return 0; } @@ -12418,7 +12419,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); + script_assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); float fAngle = DEGTORAD(*(float*)&ScriptParams[1] - 90.0f); while (fAngle < 0.0f) fAngle += TWOPI; @@ -12431,14 +12432,16 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); + script_assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); pHeli->ClearHeliOrientation(); return 0; } case COMMAND_PLANE_GOTO_COORDS: { CollectParameters(&m_nIp, 5); - debug("PLANE_GOTO_COORS is not implemented\n"); // TODO(MIAMI) + CAutomobile* pPlane = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + script_assert(pPlane && pPlane->IsCar() && pPlane->IsRealPlane()); + pPlane->TellPlaneToGoToCoors(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], *(float*)&ScriptParams[3], ScriptParams[4]); return 0; } case COMMAND_GET_NTH_CLOSEST_CAR_NODE: @@ -12470,7 +12473,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bIsFrozen = ScriptParams[1]; return 0; } @@ -12478,7 +12481,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bDrownsInWater = ScriptParams[1]; return 0; } @@ -12486,7 +12489,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); pObject->bUseCollisionRecords = ScriptParams[1]; return 0; } @@ -12494,7 +12497,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); UpdateCompareFlag(pObject->m_nCollisionRecords != 0); return 0; } @@ -12508,7 +12511,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); ScriptParams[0] = pPed->m_fArmour; StoreParameters(&m_nIp, 1); return 0; @@ -12518,7 +12521,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); pVehicle->bHeliMinimumTilt = ScriptParams[1]; return 0; } @@ -12526,7 +12529,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); pVehicle->AutoPilot.m_nSwitchDistance = ScriptParams[1]; return 0; } @@ -12534,7 +12537,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pCar&& pCar->IsCar()); + script_assert(pCar&& pCar->IsCar()); pCar->PopBoot(); return 0; } @@ -12567,7 +12570,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); UpdateCompareFlag(pObject->bIsInWater); return 0; } @@ -12580,7 +12583,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 3); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); if (ScriptParams[1]) { pPed->bIsDucking = true; pPed->SetDuck(ScriptParams[2], true); @@ -12644,7 +12647,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bIsStaticWaitingForCollision); return 0; } @@ -12652,7 +12655,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); UpdateCompareFlag(pVehicle->bIsStaticWaitingForCollision); return 0; } @@ -12660,7 +12663,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); UpdateCompareFlag(pObject->bIsStaticWaitingForCollision); return 0; } @@ -12683,7 +12686,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 3); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bIsPlayerFriend = ScriptParams[2]; return 0; } @@ -12691,7 +12694,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING: { char onscreen_str[12]; - assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); int16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 2); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? @@ -12762,7 +12765,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->m_prevObjective == OBJECTIVE_NONE && pPed->m_objective == OBJECTIVE_NONE); return 0; } @@ -12775,7 +12778,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) key[i] = tolower(key[i]); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); UpdateCompareFlag(strcmp(key, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetName()) == 0); return 0; } @@ -12790,7 +12793,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 3); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); CVector pos; pos.x = *(float*)&ScriptParams[1]; pos.y = *(float*)&ScriptParams[2]; @@ -12823,7 +12826,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pCar&& pCar->IsCar()); + script_assert(pCar&& pCar->IsCar()); pCar->CloseAllDoors(); return 0; } @@ -12845,7 +12848,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pCar && pCar->IsCar()); + script_assert(pCar && pCar->IsCar()); pCar->PopBootUsingPhysics(); return 0; } @@ -12854,7 +12857,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->m_objective == OBJECTIVE_LEAVE_CAR_AND_DIE); return 0; } @@ -12862,7 +12865,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 2); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); pObject->m_pCollidingEntity = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); return 0; } @@ -12871,7 +12874,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) { CollectParameters(&m_nIp, 5); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(CWorld::IsWanderPathClear(pPed->GetPosition(), *(CVector*)&ScriptParams[0], *(float*)&ScriptParams[3], 4)); return 0; } @@ -12884,7 +12887,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) } //case COMMAND_PRINT_HELP_FOREVER_WITH_NUMBER: default: - assert(0); + script_assert(0); } return -1; } @@ -12896,7 +12899,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 3); CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pTarget); + script_assert(pTarget); uint8 flag = 1 << (uint8)ScriptParams[1]; if (ScriptParams[2]) pTarget->m_gangFlags |= flag; @@ -12942,7 +12945,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); pVehicle->bIsFrozen = ScriptParams[1]; return 0; } @@ -13010,7 +13013,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bStayInCarOnJack = ScriptParams[1]; return 0; } @@ -13075,7 +13078,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bDontFight = !ScriptParams[1]; return 0; } @@ -13083,7 +13086,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->ClearWaitState(); return 0; } @@ -13118,7 +13121,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); pVehicle->bTyresDontBurst = !ScriptParams[1]; return 0; } @@ -13126,7 +13129,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); pPed->bDoomAim = ScriptParams[1]; return 0; } @@ -13165,7 +13168,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); CPhysical* pTestedEntity = pPed; if (pPed->bInVehicle && pPed->m_pMyVehicle) @@ -13197,7 +13200,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); if (pPed->GetPedState() == PED_FOLLOW_PATH) { pPed->RestorePreviousState(); pPed->ClearFollowPath(); @@ -13208,7 +13211,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bCanBeShotInVehicle = ScriptParams[1]; return 0; } @@ -13247,7 +13250,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); pObject->bIsFrozen = ScriptParams[1]; return 0; } @@ -13383,7 +13386,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bIgnoreThreatsBehindObjects = ScriptParams[1]; return 0; } @@ -13391,7 +13394,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); if (pPed->bInVehicle) { if (pPed->GetWeapon(5).m_eWeaponType) { // TODO(MIAMI): enum if (pPed->GetWeapon(5).m_nAmmoTotal < ScriptParams[1]) @@ -13410,7 +13413,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 1); CAutomobile* pHeli = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); + script_assert(pHeli && pHeli->IsCar() && pHeli->IsRealHeli()); pHeli->bHeliDestroyed = true; return 0; } @@ -13424,7 +13427,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); pObject->m_area = ScriptParams[1]; return 0; } @@ -13433,7 +13436,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bNeverEverTargetThisPed = ScriptParams[1]; return 0; } @@ -13454,7 +13457,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); pPed->bCrouchWhenScared = true; return 0; } @@ -13462,7 +13465,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle && pPed->m_pMyVehicle->IsLawEnforcementVehicle() && pPed->m_pMyVehicle->GetModelIndex() != MI_PREDATOR); @@ -13491,7 +13494,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->m_nWaitState == WAITSTATE_STUCK); return 0; } @@ -13505,7 +13508,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); if (ScriptParams[1]) { pPed->bKindaStayInSamePlace = true; pPed->bStopAndShoot = true; @@ -13521,7 +13524,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); if (ScriptParams[1]) { pVehicle->bIsFrozen = true; pVehicle->bInfiniteMass = true; @@ -13541,7 +13544,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) //case COMMAND_FREEZE_OBJECT_POSITION_AND_DONT_LOAD_COLLISION: //case COMMAND_SET_FADE_AND_JUMPCUT_AFTER_RC_EXPLOSION: default: - assert(0); + script_assert(0); } return -1; } @@ -13557,7 +13560,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); if (!pPed->bInVehicle) { pPed->m_pVehicleAnim = nil; pPed->RestartNonPartialAnims(); @@ -13614,9 +13617,9 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); - assert(pVehicle); + script_assert(pVehicle); ScriptParams[0] = 0; if (pPed->m_objective == OBJECTIVE_NONE && !pPed->bHasAlreadyUsedAttractor) { C2dEffect* pEffect = (C2dEffect*)GetPedAttractorManager()->GetEffectForIceCreamVan(pVehicle, pPed->GetPosition()); // has to be casted, because inner methods are const @@ -13658,7 +13661,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); if (pPed->m_attractor) GetPedAttractorManager()->DeRegisterPed(pPed, pPed->m_attractor); return 0; @@ -13670,7 +13673,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bHasAlreadyUsedAttractor); return 0; } @@ -13678,7 +13681,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); if (ScriptParams[1]) { pVehicle->bDontLoadCollision = false; if (m_bMissionFlag) { @@ -13701,7 +13704,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); if (ScriptParams[1]) { pPed->bDontLoadCollision = false; if (m_bMissionFlag) { @@ -13731,7 +13734,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bBoughtIceCream); return 0; } @@ -13805,20 +13808,39 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } //case COMMAND_GET_RANDOM_ICE_CREAM_CUSTOMER_IN_ZONE: case COMMAND_UNLOCK_ALL_CAR_DOORS_IN_AREA: + { CollectParameters(&m_nIp, 4); - debug("UNLOCK_ALL_CAR_DOORS_IN_AREA not implemented\n"); // TODO(MIAMI) + uint32 i = CPools::GetVehiclePool()->GetSize(); + float infX = *(float*)&ScriptParams[0]; + float infY = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[3]; + while (i--) { + CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); + if (!pVehicle) + continue; + if (pVehicle->IsWithinArea(infX, infY, supX, supY)) + pVehicle->m_nDoorLock = CARLOCK_UNLOCKED; + } return 0; + } case COMMAND_SET_GANG_ATTACK_PLAYER_WITH_COPS: CollectParameters(&m_nIp, 2); CGangs::SetWillAttackPlayerWithCops((ePedType)((int)PEDTYPE_GANG1 + ScriptParams[0]), !!ScriptParams[1]); return 0; case COMMAND_SET_CHAR_FRIGHTENED_IN_JACKED_CAR: - assert(0); + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + script_assert(pPed); + pPed->bHeldHostageInCar = ScriptParams[1]; + return 0; + } case COMMAND_SET_VEHICLE_TO_FADE_IN: { CollectParameters(&m_nIp, 2); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); + script_assert(pVehicle); CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), ScriptParams[1]); return 0; } @@ -13832,7 +13854,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - assert(pPed); + script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle && pPed->m_pMyVehicle == CGameLogic::pShortCutTaxi); return 0; } @@ -13840,7 +13862,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) { CollectParameters(&m_nIp, 1); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - assert(pPed); + script_assert(pPed); UpdateCompareFlag(RpAnimBlendClumpGetAssociation(pPed->GetClump(), ANIM_DUCK_DOWN) != nil); return 0; } @@ -13880,7 +13902,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) return 0; } default: - assert(0); + script_assert(0); } return -1; } @@ -14860,7 +14882,7 @@ void CRunningScript::LocateObjectCommand(int32 command, uint32* pIp) } CollectParameters(pIp, b3D ? 8 : 6); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); CVector pos = pObject->GetPosition(); X = *(float*)&ScriptParams[1]; Y = *(float*)&ScriptParams[2]; @@ -15415,7 +15437,7 @@ void CRunningScript::ObjectInAreaCheckCommand(int32 command, uint32* pIp) } CollectParameters(pIp, b3D ? 8 : 6); CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - assert(pObject); + script_assert(pObject); CVector pos = pObject->GetPosition(); infX = *(float*)&ScriptParams[1]; infY = *(float*)&ScriptParams[2]; @@ -15468,7 +15490,7 @@ void CRunningScript::ObjectInAreaCheckCommand(int32 command, uint32* pIp) result = true; break; default: - assert(false); + script_assert(false); break; } } diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 6d6c30e4..2c5c4c02 100644 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -42,6 +42,7 @@ #include "Gangs.h" #include "platform.h" #include "Stats.h" +#include "CarCtrl.h" #ifdef GTA_PS2 #include "eetypes.h" @@ -437,6 +438,12 @@ void PinkCarsCheat() gbPinkCars = true; } +void MadCarsCheat() +{ + CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); + CCarCtrl::bMadDriversCheat = true; +} + void NoSeaBedCheat(void) { CHud::SetHelpMessage(TheText.Get("CHEAT1"), true); @@ -1223,6 +1230,7 @@ void CPad::AddToPCCheatString(char c) // "MIAMITRAFFIC" else if (!Cheat_strncmp(KeyBoardCheatString, "FNMGNmWPNLVU")) { KeyBoardCheatString[0] = ' '; + MadCarsCheat(); } // "AHAIRDRESSERSCAR" else if (!Cheat_strncmp(KeyBoardCheatString, "UFJT_`VZF]QZPaUG")) { @@ -3087,7 +3095,7 @@ void CPad::ResetCheats(void) CVehicle::bCheat8 = false; gbBlackCars = false; gbPinkCars = false; - + CCarCtrl::bMadDriversCheat = false; gbFastTime = false; CTimer::SetTimeScale(1.0f); } diff --git a/src/core/Stats.cpp b/src/core/Stats.cpp index d5c08e4f..1efcee01 100644 --- a/src/core/Stats.cpp +++ b/src/core/Stats.cpp @@ -143,7 +143,9 @@ void CStats::Init() DistanceTravelledByBoat = 0; DistanceTravelledByGolfCart = 0; DistanceTravelledByHelicoptor = 0; - DistanceTravelledByPlane = 0; // FIX: Wasn't initialized +#ifdef FIX_BUGS + DistanceTravelledByPlane = 0; +#endif LivesSavedWithAmbulance = 0; CriminalsCaught = 0; HighestLevelVigilanteMission = 0; diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index e06ce03b..44e0b044 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -154,7 +154,7 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) m_fElasticity = 0.05f; m_fBuoyancy = pHandling->fBuoyancy; - m_fOrientation = m_auto_unk4 = 0.0f; + m_fOrientation = m_fPlaneSteer = 0.0f; m_nBusDoorTimerEnd = 0; m_nBusDoorTimerStart = 0; diff --git a/src/vehicles/Automobile.h b/src/vehicles/Automobile.h index eaceef7b..3dee998d 100644 --- a/src/vehicles/Automobile.h +++ b/src/vehicles/Automobile.h @@ -54,7 +54,7 @@ public: float m_fTraction; float m_fTireTemperature; float m_fOrientation; // for heli and plane go-to - float m_auto_unk4; // related to the above + float m_fPlaneSteer; // related to the above float m_fVelocityChangeForAudio; float m_randomValues[6]; // used for what? float m_fFireBlowUpTimer; diff --git a/vendor/librw b/vendor/librw index 5e299fb1..a78a0239 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 5e299fb12e0ab85b5a32032544f58480a93a4a32 +Subproject commit a78a02394e4c528a2ade867dfd0ffe04e32ec474 From 1c275695c43f0b10997b306a30fdb162ef97f104 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 16 Aug 2020 18:49:27 +0300 Subject: [PATCH 063/112] fix submodules --- librw | 1 - ogg | 1 - opus | 1 - opusfile | 1 - 4 files changed, 4 deletions(-) delete mode 160000 librw delete mode 160000 ogg delete mode 160000 opus delete mode 160000 opusfile diff --git a/librw b/librw deleted file mode 160000 index a78a0239..00000000 --- a/librw +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a78a02394e4c528a2ade867dfd0ffe04e32ec474 diff --git a/ogg b/ogg deleted file mode 160000 index 684c7377..00000000 --- a/ogg +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 684c73773e7e2683245ffd6aa75f04115b51123a diff --git a/opus b/opus deleted file mode 160000 index 6bae366f..00000000 --- a/opus +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6bae366f9fef25191fc812c430e8abd40a13a233 diff --git a/opusfile b/opusfile deleted file mode 160000 index 6452e838..00000000 --- a/opusfile +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6452e838e68e8f4fc0b3599523c760ac6276ce89 From 1334dfc16ffcd4dcf3852ba86abefb606ae4dd12 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 16 Aug 2020 21:04:16 +0300 Subject: [PATCH 064/112] removed libs --- librw | 1 - ogg | 1 - opus | 1 - opusfile | 1 - 4 files changed, 4 deletions(-) delete mode 160000 librw delete mode 160000 ogg delete mode 160000 opus delete mode 160000 opusfile diff --git a/librw b/librw deleted file mode 160000 index d92996c6..00000000 --- a/librw +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d92996c66d7938092218b42fc9197bd181606958 diff --git a/ogg b/ogg deleted file mode 160000 index 0bbcba4e..00000000 --- a/ogg +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0bbcba4e7cf32324170470569c4527ffd0002870 diff --git a/opus b/opus deleted file mode 160000 index 484af258..00000000 --- a/opus +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 484af2580b82dffd695fcd0841fc34a9dc5f7293 diff --git a/opusfile b/opusfile deleted file mode 160000 index 6452e838..00000000 --- a/opusfile +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6452e838e68e8f4fc0b3599523c760ac6276ce89 From 30b2acb9d56b70dd98cddc2ed8d7fa0221b2f1ae Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 16 Aug 2020 21:07:31 +0300 Subject: [PATCH 065/112] submodules fix --- vendor/librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/librw b/vendor/librw index 5e299fb1..a78a0239 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 5e299fb12e0ab85b5a32032544f58480a93a4a32 +Subproject commit a78a02394e4c528a2ade867dfd0ffe04e32ec474 From c556cbbbe016858537ebc2950e2803bcb85f93d5 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 18 Aug 2020 10:58:15 +0200 Subject: [PATCH 066/112] neo pipelines --- src/core/Game.cpp | 5 + src/core/config.h | 4 +- src/core/main.cpp | 27 +- src/core/re3.cpp | 12 + src/extras/custompipes.cpp | 535 +++++++++++++++ src/extras/custompipes.h | 133 ++++ src/extras/custompipes_d3d9.cpp | 527 +++++++++++++++ src/extras/custompipes_gl.cpp | 623 ++++++++++++++++++ src/extras/shaders/Makefile | 54 +- src/extras/shaders/colourfilterIII.frag | 7 +- src/extras/shaders/colourfilterIII_fs_gl3.inc | 7 +- src/extras/shaders/default_UV2.vert | 29 + src/extras/shaders/default_UV2_VS.cso | Bin 0 -> 628 bytes src/extras/shaders/default_UV2_VS.hlsl | 54 ++ src/extras/shaders/default_UV2_VS.inc | 55 ++ src/extras/shaders/default_UV2_gl3.inc | 31 + src/extras/shaders/lighting.h | 44 ++ src/extras/shaders/neoGloss.frag | 26 + src/extras/shaders/neoGloss.vert | 29 + src/extras/shaders/neoGloss_PS.cso | Bin 0 -> 444 bytes src/extras/shaders/neoGloss_PS.hlsl | 20 + src/extras/shaders/neoGloss_PS.inc | 39 ++ src/extras/shaders/neoGloss_VS.cso | Bin 0 -> 764 bytes src/extras/shaders/neoGloss_VS.hlsl | 35 + src/extras/shaders/neoGloss_VS.inc | 66 ++ src/extras/shaders/neoGloss_fs_gl3.inc | 28 + src/extras/shaders/neoGloss_vs_gl3.inc | 31 + src/extras/shaders/neoRim.vert | 37 ++ src/extras/shaders/neoRimSkin.vert | 48 ++ src/extras/shaders/neoRimSkin_VS.cso | Bin 0 -> 2404 bytes src/extras/shaders/neoRimSkin_VS.hlsl | 73 ++ src/extras/shaders/neoRimSkin_VS.inc | 203 ++++++ src/extras/shaders/neoRimSkin_gl3.inc | 50 ++ src/extras/shaders/neoRim_VS.cso | Bin 0 -> 1384 bytes src/extras/shaders/neoRim_VS.hlsl | 61 ++ src/extras/shaders/neoRim_VS.inc | 118 ++++ src/extras/shaders/neoRim_gl3.inc | 39 ++ src/extras/shaders/neoVehicle.frag | 28 + src/extras/shaders/neoVehicle.vert | 54 ++ src/extras/shaders/neoVehicle_PS.cso | Bin 0 -> 476 bytes src/extras/shaders/neoVehicle_PS.hlsl | 34 + src/extras/shaders/neoVehicle_PS.inc | 42 ++ src/extras/shaders/neoVehicle_VS.cso | Bin 0 -> 1896 bytes src/extras/shaders/neoVehicle_VS.hlsl | 64 ++ src/extras/shaders/neoVehicle_VS.inc | 160 +++++ src/extras/shaders/neoVehicle_fs_gl3.inc | 30 + src/extras/shaders/neoVehicle_vs_gl3.inc | 56 ++ src/extras/shaders/neoWorldIII.frag | 25 + src/extras/shaders/neoWorldIII_PS.cso | Bin 0 -> 528 bytes src/extras/shaders/neoWorldIII_PS.hlsl | 25 + src/extras/shaders/neoWorldIII_PS.inc | 46 ++ src/extras/shaders/neoWorldIII_fs_gl3.inc | 27 + src/extras/shaders/simple.frag | 16 + src/extras/shaders/simple_fs_gl3.inc | 18 + src/extras/shaders/standardConstants.h | 28 + src/modelinfo/PedModelInfo.cpp | 5 +- src/modelinfo/SimpleModelInfo.cpp | 5 + src/modelinfo/VehicleModelInfo.cpp | 5 + src/render/Renderer.cpp | 12 +- src/rw/Lights.h | 6 + src/rw/VisibilityPlugins.cpp | 5 + 61 files changed, 3723 insertions(+), 18 deletions(-) create mode 100644 src/extras/custompipes.cpp create mode 100644 src/extras/custompipes.h create mode 100644 src/extras/custompipes_d3d9.cpp create mode 100644 src/extras/custompipes_gl.cpp create mode 100644 src/extras/shaders/default_UV2.vert create mode 100644 src/extras/shaders/default_UV2_VS.cso create mode 100644 src/extras/shaders/default_UV2_VS.hlsl create mode 100644 src/extras/shaders/default_UV2_VS.inc create mode 100644 src/extras/shaders/default_UV2_gl3.inc create mode 100644 src/extras/shaders/lighting.h create mode 100644 src/extras/shaders/neoGloss.frag create mode 100644 src/extras/shaders/neoGloss.vert create mode 100644 src/extras/shaders/neoGloss_PS.cso create mode 100644 src/extras/shaders/neoGloss_PS.hlsl create mode 100644 src/extras/shaders/neoGloss_PS.inc create mode 100644 src/extras/shaders/neoGloss_VS.cso create mode 100644 src/extras/shaders/neoGloss_VS.hlsl create mode 100644 src/extras/shaders/neoGloss_VS.inc create mode 100644 src/extras/shaders/neoGloss_fs_gl3.inc create mode 100644 src/extras/shaders/neoGloss_vs_gl3.inc create mode 100644 src/extras/shaders/neoRim.vert create mode 100644 src/extras/shaders/neoRimSkin.vert create mode 100644 src/extras/shaders/neoRimSkin_VS.cso create mode 100644 src/extras/shaders/neoRimSkin_VS.hlsl create mode 100644 src/extras/shaders/neoRimSkin_VS.inc create mode 100644 src/extras/shaders/neoRimSkin_gl3.inc create mode 100644 src/extras/shaders/neoRim_VS.cso create mode 100644 src/extras/shaders/neoRim_VS.hlsl create mode 100644 src/extras/shaders/neoRim_VS.inc create mode 100644 src/extras/shaders/neoRim_gl3.inc create mode 100644 src/extras/shaders/neoVehicle.frag create mode 100644 src/extras/shaders/neoVehicle.vert create mode 100644 src/extras/shaders/neoVehicle_PS.cso create mode 100644 src/extras/shaders/neoVehicle_PS.hlsl create mode 100644 src/extras/shaders/neoVehicle_PS.inc create mode 100644 src/extras/shaders/neoVehicle_VS.cso create mode 100644 src/extras/shaders/neoVehicle_VS.hlsl create mode 100644 src/extras/shaders/neoVehicle_VS.inc create mode 100644 src/extras/shaders/neoVehicle_fs_gl3.inc create mode 100644 src/extras/shaders/neoVehicle_vs_gl3.inc create mode 100644 src/extras/shaders/neoWorldIII.frag create mode 100644 src/extras/shaders/neoWorldIII_PS.cso create mode 100644 src/extras/shaders/neoWorldIII_PS.hlsl create mode 100644 src/extras/shaders/neoWorldIII_PS.inc create mode 100644 src/extras/shaders/neoWorldIII_fs_gl3.inc create mode 100644 src/extras/shaders/simple.frag create mode 100644 src/extras/shaders/simple_fs_gl3.inc create mode 100644 src/extras/shaders/standardConstants.h diff --git a/src/core/Game.cpp b/src/core/Game.cpp index d5b376f6..c0530709 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -88,6 +88,7 @@ #include "debugmenu.h" #include "frontendoption.h" #include "postfx.h" +#include "custompipes.h" eLevelName CGame::currLevel; bool CGame::bDemoMode = true; @@ -360,6 +361,10 @@ bool CGame::Initialise(const char* datFile) CdStreamAddImage("MODELS\\GTA3.IMG"); CFileLoader::LoadLevel("DATA\\DEFAULT.DAT"); CFileLoader::LoadLevel(datFile); +#ifdef EXTENDED_PIPELINES + // for generic fallback + CustomPipes::SetTxdFindCallback(); +#endif CWorld::AddParticles(); CVehicleModelInfo::LoadVehicleColours(); CVehicleModelInfo::LoadEnvironmentMaps(); diff --git a/src/core/config.h b/src/core/config.h index bb6adce6..055fcd00 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -8,7 +8,8 @@ enum Config { MAX_CDCHANNELS = 5, MODELINFOSIZE = 5500, - TXDSTORESIZE = 850, +// TXDSTORESIZE = 850, + TXDSTORESIZE = 1024, // for Xbox map EXTRADIRSIZE = 128, CUTSCENEDIRSIZE = 512, @@ -209,6 +210,7 @@ enum Config { //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH //#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) +//#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) // Particle //#define PC_PARTICLE diff --git a/src/core/main.cpp b/src/core/main.cpp index b63688ec..7cde9c4d 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -61,6 +61,7 @@ #include "MemoryCard.h" #include "SceneEdit.h" #include "debugmenu.h" +#include "custompipes.h" GlobalScene Scene; @@ -349,6 +350,9 @@ PluginAttach(void) return FALSE; } +#ifdef EXTENDED_PIPELINES + CustomPipes::CustomPipeRegister(); +#endif return TRUE; } @@ -362,7 +366,11 @@ Initialise3D(void *param) DebugMenuInit(); DebugMenuPopulate(); #endif // !DEBUGMENU - return CGame::InitialiseRenderWare(); + bool ret = CGame::InitialiseRenderWare(); +#ifdef EXTENDED_PIPELINES + CustomPipes::CustomPipeInit(); // need Scene.world for this +#endif + return ret; } return (FALSE); @@ -371,6 +379,9 @@ Initialise3D(void *param) static void Terminate3D(void) { +#ifdef EXTENDED_PIPELINES + CustomPipes::CustomPipeShutdown(); +#endif CGame::ShutdownRenderWare(); #ifdef DEBUGMENU DebugMenuShutdown(); @@ -1061,6 +1072,12 @@ Idle(void *arg) tbEndTimer("PreRender"); #endif +#ifdef FIX_BUGS + // This has to be done BEFORE RwCameraBeginUpdate + RwCameraSetFarClipPlane(Scene.camera, CTimeCycle::GetFarClip()); + RwCameraSetFogDistance(Scene.camera, CTimeCycle::GetFogStart()); +#endif + if(CWeather::LightningFlash && !CCullZones::CamNoRain()){ if(!DoRWStuffStartOfFrame_Horizon(255, 255, 255, 255, 255, 255, 255)) return; @@ -1073,9 +1090,10 @@ Idle(void *arg) DefinedState(); - // BUG. This has to be done BEFORE RwCameraBeginUpdate +#ifndef FIX_BUGS RwCameraSetFarClipPlane(Scene.camera, CTimeCycle::GetFarClip()); RwCameraSetFogDistance(Scene.camera, CTimeCycle::GetFogStart()); +#endif #ifdef TIMEBARS tbStartTimer(0, "RenderScene"); @@ -1084,6 +1102,11 @@ Idle(void *arg) #ifdef TIMEBARS tbEndTimer("RenderScene"); #endif + +#ifdef EXTENDED_PIPELINES + CustomPipes::EnvMapRender(); +#endif + RenderDebugShit(); RenderEffects(); diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 9edd9497..e8d14435 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -31,6 +31,7 @@ #include "main.h" #include "MBlur.h" #include "postfx.h" +#include "custompipes.h" #ifndef _WIN32 #include "assert.h" @@ -469,6 +470,17 @@ DebugMenuPopulate(void) DebugMenuEntrySetWrap(e, true); DebugMenuAddVar("Render", "Intensity", &CPostFX::Intensity, nil, 0.05f, 0, 10.0f); DebugMenuAddVarBool8("Render", "Motion Blur", &CPostFX::MotionBlurOn, nil); +#endif +#ifdef EXTENDED_PIPELINES + static const char *vehpipenames[] = { "MatFX", "Neo" }; + e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, + 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); + DebugMenuEntrySetWrap(e, true); + DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Ped Rim light", &CustomPipes::RimlightMult, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo World Lightmaps", &CustomPipes::LightmapMult, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Road Gloss", &CustomPipes::GlossMult, nil, 0.1f, 0, 1.0f); #endif DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp new file mode 100644 index 00000000..fb529b47 --- /dev/null +++ b/src/extras/custompipes.cpp @@ -0,0 +1,535 @@ +#define WITH_D3D +#include "common.h" + +#ifdef EXTENDED_PIPELINES + +#include "main.h" +#include "RwHelper.h" +#include "Lights.h" +#include "Timecycle.h" +#include "FileMgr.h" +#include "Clock.h" +#include "Weather.h" +#include "TxdStore.h" +#include "Renderer.h" +#include "World.h" +#include "custompipes.h" + +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +namespace CustomPipes { + +rw::int32 CustomMatOffset; + +void* +CustomMatCtor(void *object, int32, int32) +{ + CustomMatExt *ext = GetCustomMatExt((rw::Material*)object); + ext->glossTex = nil; + ext->haveGloss = false; + return object; +} + +void* +CustomMatCopy(void *dst, void *src, int32, int32) +{ + CustomMatExt *srcext = GetCustomMatExt((rw::Material*)src); + CustomMatExt *dstext = GetCustomMatExt((rw::Material*)dst); + dstext->glossTex = srcext->glossTex; + dstext->haveGloss = srcext->haveGloss; + return dst; +} + + + +static rw::TexDictionary *neoTxd; + +bool bRenderingEnvMap; +int32 EnvMapSize = 128; +rw::Camera *EnvMapCam; +rw::Texture *EnvMapTex; +rw::Texture *EnvMaskTex; +static rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; +static int16 QuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; + +static rw::Camera* +CreateEnvMapCam(rw::World *world) +{ + rw::Raster *fbuf = rw::Raster::create(EnvMapSize, EnvMapSize, 0, rw::Raster::CAMERATEXTURE); + if(fbuf){ + rw::Raster *zbuf = rw::Raster::create(EnvMapSize, EnvMapSize, 0, rw::Raster::ZBUFFER); + if(zbuf){ + rw::Frame *frame = rw::Frame::create(); + if(frame){ + rw::Camera *cam = rw::Camera::create(); + if(cam){ + cam->frameBuffer = fbuf; + cam->zBuffer = zbuf; + cam->setFrame(frame); + cam->setNearPlane(0.1f); + cam->setFarPlane(250.0f); + rw::V2d vw = { 2.0f, 2.0f }; + cam->setViewWindow(&vw); + world->addCamera(cam); + EnvMapTex = rw::Texture::create(fbuf); + EnvMapTex->setFilter(rw::Texture::LINEAR); + + frame->matrix.right.x = -1.0f; + frame->matrix.up.y = -1.0f; + frame->matrix.update(); + return cam; + } + frame->destroy(); + } + zbuf->destroy(); + } + fbuf->destroy(); + } + return nil; +} + +static void +DestroyCam(rw::Camera *cam) +{ + if(cam == nil) + return; + if(cam->frameBuffer){ + cam->frameBuffer->destroy(); + cam->frameBuffer = nil; + } + if(cam->zBuffer){ + cam->zBuffer->destroy(); + cam->zBuffer = nil; + } + rw::Frame *f = cam->getFrame(); + if(f){ + cam->setFrame(nil); + f->destroy(); + } + cam->world->removeCamera(cam); + cam->destroy(); +} + +void +RenderEnvMapScene(void) +{ + CRenderer::RenderRoads(); + CRenderer::RenderEverythingBarRoads(); + CRenderer::RenderFadingInEntities(); +} + +void +EnvMapRender(void) +{ + if(VehiclePipeSwitch != VEHICLEPIPE_NEO) + return; + + RwCameraEndUpdate(Scene.camera); + + // Neo does this differently, but i'm not quite convinced it's much better + rw::V3d camPos = FindPlayerCoors(); + EnvMapCam->getFrame()->matrix.pos = camPos; + EnvMapCam->getFrame()->transform(&EnvMapCam->getFrame()->matrix, rw::COMBINEREPLACE); + + rw::RGBA skycol = { CTimeCycle::GetSkyBottomRed(), CTimeCycle::GetSkyBottomGreen(), CTimeCycle::GetSkyBottomBlue(), 255 }; + EnvMapCam->clear(&skycol, rwCAMERACLEARZ|rwCAMERACLEARIMAGE); + RwCameraBeginUpdate(EnvMapCam); + bRenderingEnvMap = true; + RenderEnvMapScene(); + bRenderingEnvMap = false; + + if(EnvMaskTex){ + rw::SetRenderState(rw::VERTEXALPHA, TRUE); + rw::SetRenderState(rw::SRCBLEND, rw::BLENDZERO); + rw::SetRenderState(rw::DESTBLEND, rw::BLENDSRCCOLOR); + rw::SetRenderStatePtr(rw::TEXTURERASTER, EnvMaskTex->raster); + rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, EnvScreenQuad, 4, QuadIndices, 6); + rw::SetRenderState(rw::SRCBLEND, rw::BLENDSRCALPHA); + rw::SetRenderState(rw::DESTBLEND, rw::BLENDINVSRCALPHA); + } + RwCameraEndUpdate(EnvMapCam); + + + RwCameraBeginUpdate(Scene.camera); + + // debug env map +// rw::SetRenderStatePtr(rw::TEXTURERASTER, EnvMapTex->raster); +// rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, EnvScreenQuad, 4, QuadIndices, 6); +} + +static void +EnvMapInit(void) +{ + if(neoTxd) + EnvMaskTex = neoTxd->find("CarReflectionMask"); + + EnvMapCam = CreateEnvMapCam(Scene.world); + + int width = EnvMapCam->frameBuffer->width; + int height = EnvMapCam->frameBuffer->height; + float screenZ = RwIm2DGetNearScreenZ(); + float recipZ = 1.0f/EnvMapCam->nearPlane; + + EnvScreenQuad[0].setScreenX(0.0f); + EnvScreenQuad[0].setScreenY(0.0f); + EnvScreenQuad[0].setScreenZ(screenZ); + EnvScreenQuad[0].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[0].setRecipCameraZ(recipZ); + EnvScreenQuad[0].setColor(255, 255, 255, 255); + EnvScreenQuad[0].setU(0.0f, recipZ); + EnvScreenQuad[0].setV(0.0f, recipZ); + + EnvScreenQuad[1].setScreenX(0.0f); + EnvScreenQuad[1].setScreenY(height); + EnvScreenQuad[1].setScreenZ(screenZ); + EnvScreenQuad[1].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[1].setRecipCameraZ(recipZ); + EnvScreenQuad[1].setColor(255, 255, 255, 255); + EnvScreenQuad[1].setU(0.0f, recipZ); + EnvScreenQuad[1].setV(1.0f, recipZ); + + EnvScreenQuad[2].setScreenX(width); + EnvScreenQuad[2].setScreenY(height); + EnvScreenQuad[2].setScreenZ(screenZ); + EnvScreenQuad[2].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[2].setRecipCameraZ(recipZ); + EnvScreenQuad[2].setColor(255, 255, 255, 255); + EnvScreenQuad[2].setU(1.0f, recipZ); + EnvScreenQuad[2].setV(1.0f, recipZ); + + EnvScreenQuad[3].setScreenX(width); + EnvScreenQuad[3].setScreenY(0.0f); + EnvScreenQuad[3].setScreenZ(screenZ); + EnvScreenQuad[3].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[3].setRecipCameraZ(recipZ); + EnvScreenQuad[3].setColor(255, 255, 255, 255); + EnvScreenQuad[3].setU(1.0f, recipZ); + EnvScreenQuad[3].setV(0.0f, recipZ); +} + +static void +EnvMapShutdown(void) +{ + EnvMapTex->raster = nil; + EnvMapTex->destroy(); + EnvMapTex = nil; + DestroyCam(EnvMapCam); + EnvMapCam = nil; +} + +/* + * Tweak values + */ + +#define INTERP_SETUP \ + int h1 = CClock::GetHours(); \ + int h2 = (h1+1)%24; \ + int w1 = CWeather::OldWeatherType; \ + int w2 = CWeather::NewWeatherType; \ + float timeInterp = (CClock::GetSeconds()/60.0f + CClock::GetMinutes())/60.0f; \ + float c0 = (1.0f-timeInterp)*(1.0f-CWeather::InterpolationValue); \ + float c1 = timeInterp*(1.0f-CWeather::InterpolationValue); \ + float c2 = (1.0f-timeInterp)*CWeather::InterpolationValue; \ + float c3 = timeInterp*CWeather::InterpolationValue; +#define INTERP(v) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3; +#define INTERPF(v,f) v[h1][w1].f*c0 + v[h2][w1].f*c1 + v[h1][w2].f*c2 + v[h2][w2].f*c3; + +InterpolatedFloat::InterpolatedFloat(float init) +{ + curInterpolator = 61; // compared against second + for(int h = 0; h < 24; h++) + for(int w = 0; w < NUMWEATHERS; w++) + data[h][w] = init; +} + +void +InterpolatedFloat::Read(char *s, int line, int field) +{ + sscanf(s, "%f", &data[line][field]); +} + +float +InterpolatedFloat::Get(void) +{ + if(curInterpolator != CClock::GetSeconds()){ + INTERP_SETUP + curVal = INTERP(data); + curInterpolator = CClock::GetSeconds(); + } + return curVal; +} + +InterpolatedColor::InterpolatedColor(const Color &init) +{ + curInterpolator = 61; // compared against second + for(int h = 0; h < 24; h++) + for(int w = 0; w < NUMWEATHERS; w++) + data[h][w] = init; +} + +void +InterpolatedColor::Read(char *s, int line, int field) +{ + int r, g, b, a; + sscanf(s, "%i, %i, %i, %i", &r, &g, &b, &a); + data[line][field] = Color(r/255.0f, g/255.0f, b/255.0f, a/255.0f); +} + +Color +InterpolatedColor::Get(void) +{ + if(curInterpolator != CClock::GetSeconds()){ + INTERP_SETUP + curVal.r = INTERPF(data, r); + curVal.g = INTERPF(data, g); + curVal.b = INTERPF(data, b); + curVal.a = INTERPF(data, a); + curInterpolator = CClock::GetSeconds(); + } + return curVal; +} + +void +InterpolatedLight::Read(char *s, int line, int field) +{ + int r, g, b, a; + sscanf(s, "%i, %i, %i, %i", &r, &g, &b, &a); + data[line][field] = Color(r/255.0f, g/255.0f, b/255.0f, a/100.0f); +} + +char* +ReadTweakValueTable(char *fp, InterpolatedValue &interp) +{ + char buf[24], *p; + int c; + int line, field; + + line = 0; + c = *fp++; + while(c != '\0' && line < 24){ + field = 0; + if(c != '\0' && c != '#'){ + while(c != '\0' && c != '\n' && field < NUMWEATHERS){ + p = buf; + while(c != '\0' && c == '\t') + c = *fp++; + *p++ = c; + while(c = *fp++, c != '\0' && c != '\t' && c != '\n') + *p++ = c; + *p++ = '\0'; + interp.Read(buf, line, field); + field++; + } + line++; + } + while(c != '\0' && c != '\n') + c = *fp++; + c = *fp++; + } + return fp-1; +} + + + +/* + * Neo Vehicle pipe + */ + +int32 VehiclePipeSwitch = VEHICLEPIPE_NEO; +float VehicleShininess = 0.7f; // the default is a bit extreme +float VehicleSpecularity = 1.0f; +InterpolatedFloat Fresnel(0.4f); +InterpolatedFloat Power(18.0f); +InterpolatedLight DiffColor(Color(0.0f, 0.0f, 0.0f, 0.0f)); +InterpolatedLight SpecColor(Color(0.7f, 0.7f, 0.7f, 1.0f)); +rw::ObjPipeline *vehiclePipe; + +void +AttachVehiclePipe(rw::Atomic *atomic) +{ + atomic->pipeline = vehiclePipe; +} + +void +AttachVehiclePipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachVehiclePipe(rw::Atomic::fromClump(lnk)); +} + + + +/* + * Neo World pipe + */ + +float LightmapMult = 1.0f; +InterpolatedFloat WorldLightmapBlend(1.0f); +rw::ObjPipeline *worldPipe; + +void +AttachWorldPipe(rw::Atomic *atomic) +{ + atomic->pipeline = worldPipe; +} + +void +AttachWorldPipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachWorldPipe(rw::Atomic::fromClump(lnk)); +} + + + + +/* + * Neo Gloss pipe + */ + +float GlossMult = 1.0f; +rw::ObjPipeline *glossPipe; + +rw::Texture* +GetGlossTex(rw::Material *mat) +{ + if(neoTxd == nil) + return nil; + CustomMatExt *ext = GetCustomMatExt(mat); + if(!ext->haveGloss){ + char glossname[128]; + strcpy(glossname, mat->texture->name); + strcat(glossname, "_gloss"); + ext->glossTex = neoTxd->find(glossname); + ext->haveGloss = true; + } + return ext->glossTex; +} + +void +AttachGlossPipe(rw::Atomic *atomic) +{ + atomic->pipeline = glossPipe; +} + +void +AttachGlossPipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachWorldPipe(rw::Atomic::fromClump(lnk)); +} + + + +/* + * Neo Rim pipes + */ + +float RimlightMult = 1.0f; +InterpolatedColor RampStart(Color(0.0f, 0.0f, 0.0f, 1.0f)); +InterpolatedColor RampEnd(Color(1.0f, 1.0f, 1.0f, 1.0f)); +InterpolatedFloat Offset(0.5f); +InterpolatedFloat Scale(1.5f); +InterpolatedFloat Scaling(2.0f); +rw::ObjPipeline *rimPipe; +rw::ObjPipeline *rimSkinPipe; + +void +AttachRimPipe(rw::Atomic *atomic) +{ + if(rw::Skin::get(atomic->geometry)) + atomic->pipeline = rimSkinPipe; + else + atomic->pipeline = rimPipe; +} + +void +AttachRimPipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachRimPipe(rw::Atomic::fromClump(lnk)); +} + +/* + * High level stuff + */ + +void +CustomPipeInit(void) +{ + RwStream *stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "neo/neo.txd"); + if(stream == nil) + printf("Error: couldn't open 'neo/neo.txd'\n"); + else{ + if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)) + neoTxd = RwTexDictionaryGtaStreamRead(stream); + RwStreamClose(stream, nil); + } + + EnvMapInit(); + + CreateVehiclePipe(); + CreateWorldPipe(); + CreateGlossPipe(); + CreateRimLightPipes(); +} + +void +CustomPipeShutdown(void) +{ + DestroyVehiclePipe(); + DestroyWorldPipe(); + DestroyGlossPipe(); + DestroyRimLightPipes(); + + EnvMapShutdown(); + + if(neoTxd){ + neoTxd->destroy(); + neoTxd = nil; + } +} + +void +CustomPipeRegister(void) +{ +#ifdef RW_OPENGL + CustomPipeRegisterGL(); +#endif + + CustomMatOffset = rw::Material::registerPlugin(sizeof(CustomMatExt), MAKECHUNKID(rwVENDORID_ROCKSTAR, 0x80), + CustomMatCtor, nil, CustomMatCopy); +} + + +// Load textures from generic as fallback + +rw::TexDictionary *genericTxd; +rw::Texture *(*defaultFindCB)(const char *name); + +static rw::Texture* +customFindCB(const char *name) +{ + rw::Texture *res = defaultFindCB(name); + if(res == nil) + res = genericTxd->find(name); + return res; +} + +void +SetTxdFindCallback(void) +{ + int slot = CTxdStore::FindTxdSlot("generic"); + CTxdStore::AddRef(slot); + // TODO: function for this + genericTxd = CTxdStore::GetSlot(slot)->texDict; + if(defaultFindCB == nil) + defaultFindCB = rw::Texture::findCB; + rw::Texture::findCB = customFindCB; +} + +} + +#endif diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h new file mode 100644 index 00000000..4ebe586f --- /dev/null +++ b/src/extras/custompipes.h @@ -0,0 +1,133 @@ +#pragma once + +#ifdef EXTENDED_PIPELINES +#ifdef LIBRW + +namespace CustomPipes { + + + +struct CustomMatExt +{ + rw::Texture *glossTex; + bool haveGloss; +}; +extern rw::int32 CustomMatOffset; +inline CustomMatExt *GetCustomMatExt(rw::Material *mat) { + return PLUGINOFFSET(CustomMatExt, mat, CustomMatOffset); +} + + +struct Color +{ + float r, g, b, a; + Color(void) {} + Color(float r, float g, float b, float a) : r(r), g(g), b(b), a(a) {} +}; + +class InterpolatedValue +{ +public: + virtual void Read(char *s, int line, int field) = 0; +}; + +class InterpolatedFloat : public InterpolatedValue +{ +public: + float data[24][NUMWEATHERS]; + float curInterpolator; + float curVal; + + InterpolatedFloat(float init); + void Read(char *s, int line, int field); + float Get(void); +}; + +class InterpolatedColor : public InterpolatedValue +{ +public: + Color data[24][NUMWEATHERS]; + float curInterpolator; + Color curVal; + + InterpolatedColor(const Color &init); + void Read(char *s, int line, int field); + Color Get(void); +}; + +class InterpolatedLight : public InterpolatedColor +{ +public: + InterpolatedLight(const Color &init) : InterpolatedColor(init) {} + void Read(char *s, int line, int field); +}; + +char *ReadTweakValueTable(char *fp, InterpolatedValue &interp); + + + + + +void CustomPipeRegister(void); +void CustomPipeRegisterGL(void); +void CustomPipeInit(void); +void CustomPipeShutdown(void); +void SetTxdFindCallback(void); + +extern bool bRenderingEnvMap; +extern int32 EnvMapSize; +extern rw::Camera *EnvMapCam; +extern rw::Texture *EnvMapTex; +extern rw::Texture *EnvMaskTex; +void EnvMapRender(void); + +enum { + VEHICLEPIPE_MATFX, + VEHICLEPIPE_NEO +}; +extern int32 VehiclePipeSwitch; +extern float VehicleShininess; +extern float VehicleSpecularity; +extern InterpolatedFloat Fresnel; +extern InterpolatedFloat Power; +extern InterpolatedLight DiffColor; +extern InterpolatedLight SpecColor; +extern rw::ObjPipeline *vehiclePipe; +void CreateVehiclePipe(void); +void DestroyVehiclePipe(void); +void AttachVehiclePipe(rw::Atomic *atomic); +void AttachVehiclePipe(rw::Clump *clump); + +extern float LightmapMult; +extern InterpolatedFloat WorldLightmapBlend; +extern rw::ObjPipeline *worldPipe; +void CreateWorldPipe(void); +void DestroyWorldPipe(void); +void AttachWorldPipe(rw::Atomic *atomic); +void AttachWorldPipe(rw::Clump *clump); + +extern float GlossMult; +extern rw::ObjPipeline *glossPipe; +void CreateGlossPipe(void); +void DestroyGlossPipe(void); +void AttachGlossPipe(rw::Atomic *atomic); +void AttachGlossPipe(rw::Clump *clump); +rw::Texture *GetGlossTex(rw::Material *mat); + +extern float RimlightMult; +extern InterpolatedColor RampStart; +extern InterpolatedColor RampEnd; +extern InterpolatedFloat Offset; +extern InterpolatedFloat Scale; +extern InterpolatedFloat Scaling; +extern rw::ObjPipeline *rimPipe; +extern rw::ObjPipeline *rimSkinPipe; +void CreateRimLightPipes(void); +void DestroyRimLightPipes(void); +void AttachRimPipe(rw::Atomic *atomic); +void AttachRimPipe(rw::Clump *clump); + +} + +#endif +#endif diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp new file mode 100644 index 00000000..bfc744a3 --- /dev/null +++ b/src/extras/custompipes_d3d9.cpp @@ -0,0 +1,527 @@ +#define WITH_D3D +#include "common.h" + +#ifdef RW_D3D9 +#ifdef EXTENDED_PIPELINES + +#include "main.h" +#include "RwHelper.h" +#include "Lights.h" +#include "Timecycle.h" +#include "FileMgr.h" +#include "Clock.h" +#include "Weather.h" +#include "TxdStore.h" +#include "Renderer.h" +#include "World.h" +#include "custompipes.h" + +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +extern RwTexture *gpWhiteTexture; // from vehicle model info + +namespace CustomPipes { + +enum { + // rim pipe + VSLOC_boneMatrices = rw::d3d::VSLOC_afterLights, + VSLOC_viewVec = VSLOC_boneMatrices + 64*3, + VSLOC_rampStart, + VSLOC_rampEnd, + VSLOC_rimData, + + // gloss pipe + VSLOC_eye = rw::d3d::VSLOC_afterLights, + + VSLOC_reflProps, + VSLOC_specLights +}; + +/* + * Neo Vehicle pipe + */ + +static void *neoVehicle_VS; +static void *neoVehicle_PS; + +void +uploadSpecLights(void) +{ + struct VsLight { + rw::RGBAf color; + float pos[4]; // unused + rw::V3d dir; + float power; + } specLights[1 + NUMEXTRADIRECTIONALS]; + memset(specLights, 0, sizeof(specLights)); + for(int i = 0; i < 1+NUMEXTRADIRECTIONALS; i++) + specLights[i].power = 1.0f; + float power = Power.Get(); + Color speccol = SpecColor.Get(); + specLights[0].color.red = speccol.r; + specLights[0].color.green = speccol.g; + specLights[0].color.blue = speccol.b; + specLights[0].dir = pDirect->getFrame()->getLTM()->at; + specLights[0].power = power; + for(int i = 0; i < NUMEXTRADIRECTIONALS; i++){ + if(pExtraDirectionals[i]->getFlags() & rw::Light::LIGHTATOMICS){ + specLights[1+i].color = pExtraDirectionals[i]->color; + specLights[1+i].dir = pExtraDirectionals[i]->getFrame()->getLTM()->at; + specLights[1+i].power = power*2.0f; + } + } + rw::d3d::d3ddevice->SetVertexShaderConstantF(VSLOC_specLights, (float*)&specLights, 3*(1 + NUMEXTRADIRECTIONALS)); +} + +void +vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + // TODO: make this less of a kludge + if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + matFXGlobals.pipelines[rw::platform]->render(atomic); + return; + } + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadSpecLights(); + uploadMatrices(atomic->getFrame()->getLTM()); + + setVertexShader(neoVehicle_VS); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + d3ddevice->SetVertexShaderConstantF(VSLOC_eye, (float*)&eyePos, 1); + + float reflProps[4]; + reflProps[0] = Fresnel.Get(); + reflProps[1] = SpecColor.Get().a; + + d3d::setTexture(1, EnvMapTex); + + SetRenderState(SRCBLEND, BLENDONE); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + reflProps[2] = m->surfaceProps.specular * VehicleShininess; + reflProps[3] = m->surfaceProps.specular == 0.0f ? 0.0f : VehicleSpecularity; + d3ddevice->SetVertexShaderConstantF(VSLOC_reflProps, reflProps, 1); + + setMaterial(m->color, m->surfaceProps); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); + setPixelShader(neoVehicle_PS); + + drawInst(header, inst); + inst++; + } + + SetRenderState(SRCBLEND, BLENDSRCALPHA); +} + +void +CreateVehiclePipe(void) +{ + if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, Fresnel); + fp = ReadTweakValueTable(fp, Power); + fp = ReadTweakValueTable(fp, DiffColor); + fp = ReadTweakValueTable(fp, SpecColor); + } + +#include "shaders/neoVehicle_VS.inc" + neoVehicle_VS = rw::d3d::createVertexShader(neoVehicle_VS_cso); + assert(neoVehicle_VS); + +#include "shaders/neoVehicle_PS.inc" + neoVehicle_PS = rw::d3d::createPixelShader(neoVehicle_PS_cso); + assert(neoVehicle_PS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = vehicleRenderCB; + vehiclePipe = pipe; +} + +void +DestroyVehiclePipe(void) +{ + rw::d3d::destroyVertexShader(neoVehicle_VS); + neoVehicle_VS = nil; + + ((rw::d3d9::ObjPipeline*)vehiclePipe)->destroy(); + vehiclePipe = nil; +} + + + +/* + * Neo World pipe + */ + +static void *neoWorld_VS; +static void *neoWorldIII_PS; + +static void +worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + + float lightfactor[4]; + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + if(MatFX::getEffects(m) == MatFX::DUAL){ + setVertexShader(neoWorld_VS); + + MatFX *matfx = MatFX::get(m); + Texture *dualtex = matfx->getDualTexture(); + if(dualtex == nil) + goto notex; + d3d::setTexture(1, dualtex); + lightfactor[0] = lightfactor[1] = lightfactor[2] = WorldLightmapBlend.Get()*LightmapMult; + }else{ + notex: + setVertexShader(default_amb_VS); + + d3d::setTexture(1, nil); + lightfactor[0] = lightfactor[1] = lightfactor[2] = 0.0f; + } + lightfactor[3] = m->color.alpha/255.0f; + d3d::setTexture(0, m->texture); + d3ddevice->SetPixelShaderConstantF(1, lightfactor, 1); + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + RGBA color = { 255, 255, 255, m->color.alpha }; + setMaterial(color, m->surfaceProps); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); + setPixelShader(neoWorldIII_PS); + + drawInst(header, inst); + inst++; + } +} + +void +CreateWorldPipe(void) +{ + if(CFileMgr::LoadFile("neo/worldTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/worldTweakingTable.dat'\n"); + else + ReadTweakValueTable((char*)work_buff, WorldLightmapBlend); + +#include "shaders/default_UV2_VS.inc" + neoWorld_VS = rw::d3d::createVertexShader(default_UV2_VS_cso); + assert(neoWorld_VS); + +#include "shaders/neoWorldIII_PS.inc" + neoWorldIII_PS = rw::d3d::createPixelShader(neoWorldIII_PS_cso); + assert(neoWorldIII_PS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = worldRenderCB; + worldPipe = pipe; +} + +void +DestroyWorldPipe(void) +{ + rw::d3d::destroyVertexShader(neoWorld_VS); + neoWorld_VS = nil; + rw::d3d::destroyPixelShader(neoWorldIII_PS); + neoWorldIII_PS = nil; + + + ((rw::d3d9::ObjPipeline*)worldPipe)->destroy(); + worldPipe = nil; +} + + + + +/* + * Neo Gloss pipe + */ + +static void *neoGloss_VS; +static void *neoGloss_PS; + +static void +glossRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + worldRenderCB(atomic, header); + + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + setVertexShader(neoGloss_VS); + setPixelShader(neoGloss_PS); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + d3ddevice->SetVertexShaderConstantF(VSLOC_eye, (float*)&eyePos, 1); + d3ddevice->SetPixelShaderConstantF(1, (float*)&GlossMult, 1); + + SetRenderState(VERTEXALPHA, TRUE); + SetRenderState(SRCBLEND, BLENDONE); + SetRenderState(DESTBLEND, BLENDONE); + SetRenderState(ZWRITEENABLE, FALSE); + SetRenderState(ALPHATESTFUNC, ALPHAALWAYS); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + if(m->texture){ + Texture *tex = GetGlossTex(m); + if(tex){ + d3d::setTexture(0, tex); + drawInst(header, inst); + } + } + inst++; + } + + SetRenderState(ZWRITEENABLE, TRUE); + SetRenderState(ALPHATESTFUNC, ALPHAGREATEREQUAL); + SetRenderState(SRCBLEND, BLENDSRCALPHA); + SetRenderState(DESTBLEND, BLENDINVSRCALPHA); +} + +void +CreateGlossPipe(void) +{ +#include "shaders/neoGloss_VS.inc" + neoGloss_VS = rw::d3d::createVertexShader(neoGloss_VS_cso); + assert(neoGloss_VS); + +#include "shaders/neoGloss_PS.inc" + neoGloss_PS = rw::d3d::createPixelShader(neoGloss_PS_cso); + assert(neoGloss_PS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = glossRenderCB; + glossPipe = pipe; +} + +void +DestroyGlossPipe(void) +{ + ((rw::d3d9::ObjPipeline*)glossPipe)->destroy(); + glossPipe = nil; +} + + + +/* + * Neo Rim pipes + */ + +static void *neoRim_VS; +static void *neoRimSkin_VS; + +static void +uploadRimData(bool enable) +{ + using namespace rw; + using namespace rw::d3d; + + V3d viewVec = rw::engine->currentCamera->getFrame()->getLTM()->at; + d3ddevice->SetVertexShaderConstantF(VSLOC_viewVec, (float*)&viewVec, 1); + float rimData[4]; + rimData[0] = Offset.Get(); + rimData[1] = Scale.Get(); + if(enable) + rimData[2] = Scaling.Get()*RimlightMult; + else + rimData[2] = 0.0f; + rimData[3] = 0.0f; + d3ddevice->SetVertexShaderConstantF(VSLOC_rimData, rimData, 1); + Color col = RampStart.Get(); + d3ddevice->SetVertexShaderConstantF(VSLOC_rampStart, (float*)&col, 1); + col = RampEnd.Get(); + d3ddevice->SetVertexShaderConstantF(VSLOC_rampEnd, (float*)&col, 1); +} + +static void +rimRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + setVertexShader(neoRim_VS); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + setMaterial(m->color, m->surfaceProps); + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(header, inst); + inst++; + } +} + +static void +rimSkinRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + + setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer, + 0, header->vertexStream[0].stride); + setIndices((IDirect3DIndexBuffer9*)header->indexBuffer); + setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + uploadSkinMatrices(atomic); + + setVertexShader(neoRimSkin_VS); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + setMaterial(m->color, m->surfaceProps); + + if(inst->material->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(header, inst); + inst++; + } +} + +void +CreateRimLightPipes(void) +{ + if(CFileMgr::LoadFile("neo/rimTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/rimTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, RampStart); + fp = ReadTweakValueTable(fp, RampEnd); + fp = ReadTweakValueTable(fp, Offset); + fp = ReadTweakValueTable(fp, Scale); + fp = ReadTweakValueTable(fp, Scaling); + } + + +#include "shaders/neoRim_VS.inc" + neoRim_VS = rw::d3d::createVertexShader(neoRim_VS_cso); + assert(neoRim_VS); + +#include "shaders/neoRimSkin_VS.inc" + neoRimSkin_VS = rw::d3d::createVertexShader(neoRimSkin_VS_cso); + assert(neoRimSkin_VS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = rimRenderCB; + rimPipe = pipe; + + pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::skinInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = rimSkinRenderCB; + rimSkinPipe = pipe; +} + +void +DestroyRimLightPipes(void) +{ + rw::d3d::destroyVertexShader(neoRim_VS); + neoRim_VS = nil; + + rw::d3d::destroyVertexShader(neoRimSkin_VS); + neoRimSkin_VS = nil; + + ((rw::d3d9::ObjPipeline*)rimPipe)->destroy(); + rimPipe = nil; + + ((rw::d3d9::ObjPipeline*)rimSkinPipe)->destroy(); + rimSkinPipe = nil; +} + +} + +#endif +#endif diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp new file mode 100644 index 00000000..5717c83b --- /dev/null +++ b/src/extras/custompipes_gl.cpp @@ -0,0 +1,623 @@ +#include "common.h" + +#ifdef RW_OPENGL +#ifdef EXTENDED_PIPELINES + +#include "main.h" +#include "RwHelper.h" +#include "Lights.h" +#include "Timecycle.h" +#include "FileMgr.h" +#include "Clock.h" +#include "Weather.h" +#include "TxdStore.h" +#include "Renderer.h" +#include "World.h" +#include "custompipes.h" + +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +namespace CustomPipes { + +static int32 u_viewVec; +static int32 u_rampStart; +static int32 u_rampEnd; +static int32 u_rimData; + +static int32 u_lightMap; + +static int32 u_eye; +static int32 u_reflProps; +static int32 u_specDir; +static int32 u_specColor; + +#define U(i) currentShader->uniformLocations[i] + +/* + * Neo Vehicle pipe + */ + +rw::gl3::Shader *neoVehicleShader; + +static void +uploadSpecLights(void) +{ + using namespace rw::gl3; + + rw::RGBAf colors[1 + NUMEXTRADIRECTIONALS]; + struct { + rw::V3d dir; + float power; + } dirs[1 + NUMEXTRADIRECTIONALS]; + memset(colors, 0, sizeof(colors)); + memset(dirs, 0, sizeof(dirs)); + for(int i = 0; i < 1+NUMEXTRADIRECTIONALS; i++) + dirs[i].power = 1.0f; + float power = Power.Get(); + Color speccol = SpecColor.Get(); + colors[0].red = speccol.r; + colors[0].green = speccol.g; + colors[0].blue = speccol.b; + dirs[0].dir = pDirect->getFrame()->getLTM()->at; + dirs[0].power = power; + for(int i = 0; i < NUMEXTRADIRECTIONALS; i++){ + if(pExtraDirectionals[i]->getFlags() & rw::Light::LIGHTATOMICS){ + colors[1+i] = pExtraDirectionals[i]->color; + dirs[1+i].dir = pExtraDirectionals[i]->getFrame()->getLTM()->at; + dirs[1+i].power = power*2.0f; + } + } + glUniform4fv(U(u_specDir), 1 + NUMEXTRADIRECTIONALS, (float*)&dirs); + glUniform4fv(U(u_specColor), 1 + NUMEXTRADIRECTIONALS, (float*)&colors); +} + +static void +vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + // TODO: make this less of a kludge + if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + matFXGlobals.pipelines[rw::platform]->render(atomic); + return; + } + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoVehicleShader->use(); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + glUniform3fv(U(u_eye), 1, (float*)&eyePos); + + uploadSpecLights(); + + float reflProps[4]; + reflProps[0] = Fresnel.Get(); + reflProps[1] = SpecColor.Get().a; + + setTexture(1, EnvMapTex); + + SetRenderState(SRCBLEND, BLENDONE); + + while(n--){ + m = inst->material; + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + reflProps[2] = m->surfaceProps.specular * VehicleShininess; + reflProps[3] = m->surfaceProps.specular == 0.0f ? 0.0f : VehicleSpecularity; + glUniform4fv(U(u_reflProps), 1, reflProps); + + drawInst(header, inst); + inst++; + } + + SetRenderState(SRCBLEND, BLENDSRCALPHA); + +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateVehiclePipe(void) +{ + using namespace rw; + using namespace rw::gl3; + + if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, Fresnel); + fp = ReadTweakValueTable(fp, Power); + fp = ReadTweakValueTable(fp, DiffColor); + fp = ReadTweakValueTable(fp, SpecColor); + } + + + { +#ifdef RW_GLES2 +#include "gl2_shaders/neoVehicle_fs_gl2.inc" +#include "gl2_shaders/neoVehicle_vs_gl2.inc" +#else +#include "shaders/neoVehicle_fs_gl3.inc" +#include "shaders/neoVehicle_vs_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoVehicle_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, neoVehicle_frag_src, nil }; + neoVehicleShader = Shader::create(vs, fs); + assert(neoVehicleShader); + } + + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = vehicleRenderCB; + vehiclePipe = pipe; +} + +void +DestroyVehiclePipe(void) +{ + neoVehicleShader->destroy(); + neoVehicleShader = nil; + + ((rw::gl3::ObjPipeline*)vehiclePipe)->destroy(); + vehiclePipe = nil; +} + + + +/* + * Neo World pipe + */ + +rw::gl3::Shader *neoWorldShader; + +static void +worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoWorldShader->use(); + + float lightfactor[4]; + + while(n--){ + m = inst->material; + + if(MatFX::getEffects(m) == MatFX::DUAL){ + MatFX *matfx = MatFX::get(m); + Texture *dualtex = matfx->getDualTexture(); + if(dualtex == nil) + goto notex; + setTexture(1, dualtex); + lightfactor[0] = lightfactor[1] = lightfactor[2] = WorldLightmapBlend.Get()*LightmapMult; + }else{ + notex: + setTexture(1, nil); + lightfactor[0] = lightfactor[1] = lightfactor[2] = 0.0f; + } + lightfactor[3] = m->color.alpha/255.0f; + glUniform4fv(U(u_lightMap), 1, lightfactor); + + RGBA color = { 255, 255, 255, m->color.alpha }; + setMaterial(color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + drawInst(header, inst); + inst++; + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateWorldPipe(void) +{ + using namespace rw; + using namespace rw::gl3; + + if(CFileMgr::LoadFile("neo/worldTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/worldTweakingTable.dat'\n"); + else + ReadTweakValueTable((char*)work_buff, WorldLightmapBlend); + + { +#ifdef RW_GLES2 +#include "gl2_shaders/neoWorldIII_fs_gl2.inc" +#include "gl2_shaders/default_UV2_gl2.inc" +#else +#include "shaders/neoWorldIII_fs_gl3.inc" +#include "shaders/default_UV2_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, default_UV2_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, neoWorldIII_frag_src, nil }; + neoWorldShader = Shader::create(vs, fs); + assert(neoWorldShader); + } + + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = worldRenderCB; + worldPipe = pipe; +} + +void +DestroyWorldPipe(void) +{ + neoWorldShader->destroy(); + neoWorldShader = nil; + + ((rw::gl3::ObjPipeline*)worldPipe)->destroy(); + worldPipe = nil; +} + + + + +/* + * Neo Gloss pipe + */ + +rw::gl3::Shader *neoGlossShader; + +static void +glossRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + worldRenderCB(atomic, header); + + Material *m; + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoGlossShader->use(); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + glUniform3fv(U(u_eye), 1, (float*)&eyePos); + glUniform4fv(U(u_reflProps), 1, (float*)&GlossMult); + + SetRenderState(VERTEXALPHA, TRUE); + SetRenderState(SRCBLEND, BLENDONE); + SetRenderState(DESTBLEND, BLENDONE); + SetRenderState(ZWRITEENABLE, FALSE); + SetRenderState(ALPHATESTFUNC, ALPHAALWAYS); + + while(n--){ + m = inst->material; + + RGBA color = { 255, 255, 255, m->color.alpha }; + setMaterial(color, m->surfaceProps); + + if(m->texture){ + Texture *tex = GetGlossTex(m); + if(tex){ + setTexture(0, tex); + drawInst(header, inst); + } + } + inst++; + } + + SetRenderState(ZWRITEENABLE, TRUE); + SetRenderState(ALPHATESTFUNC, ALPHAGREATEREQUAL); + SetRenderState(SRCBLEND, BLENDSRCALPHA); + SetRenderState(DESTBLEND, BLENDINVSRCALPHA); + +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateGlossPipe(void) +{ + using namespace rw; + using namespace rw::gl3; + + { +#ifdef RW_GLES2 +#include "gl2_shaders/neoGloss_fs_gl2.inc" +#include "gl2_shaders/neoGloss_vs_gl2.inc" +#else +#include "shaders/neoGloss_fs_gl3.inc" +#include "shaders/neoGloss_vs_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoGloss_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, neoGloss_frag_src, nil }; + neoGlossShader = Shader::create(vs, fs); + assert(neoGlossShader); + } + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = glossRenderCB; + glossPipe = pipe; +} + +void +DestroyGlossPipe(void) +{ + neoGlossShader->destroy(); + neoGlossShader = nil; + + ((rw::gl3::ObjPipeline*)glossPipe)->destroy(); + glossPipe = nil; +} + + + +/* + * Neo Rim pipes + */ + +rw::gl3::Shader *neoRimShader; +rw::gl3::Shader *neoRimSkinShader; + +static void +uploadRimData(bool enable) +{ + using namespace rw; + using namespace rw::gl3; + + V3d viewVec = rw::engine->currentCamera->getFrame()->getLTM()->at; + glUniform3fv(U(u_viewVec), 1, (float*)&viewVec); + float rimData[4]; + rimData[0] = Offset.Get(); + rimData[1] = Scale.Get(); + if(enable) + rimData[2] = Scaling.Get()*RimlightMult; + else + rimData[2] = 0.0f; + rimData[3] = 0.0f; + glUniform3fv(U(u_rimData), 1, rimData); + Color col = RampStart.Get(); + glUniform4fv(U(u_rampStart), 1, (float*)&col); + col = RampEnd.Get(); + glUniform4fv(U(u_rampEnd), 1, (float*)&col); +} + +static void +rimSkinRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoRimSkinShader->use(); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + uploadSkinMatrices(atomic); + + while(n--){ + m = inst->material; + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + drawInst(header, inst); + inst++; + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +static void +rimRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoRimShader->use(); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + while(n--){ + m = inst->material; + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + drawInst(header, inst); + inst++; + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateRimLightPipes(void) +{ + using namespace rw::gl3; + + if(CFileMgr::LoadFile("neo/rimTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/rimTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, RampStart); + fp = ReadTweakValueTable(fp, RampEnd); + fp = ReadTweakValueTable(fp, Offset); + fp = ReadTweakValueTable(fp, Scale); + fp = ReadTweakValueTable(fp, Scaling); + } + + { +#ifdef RW_GLES2 +#include "gl2_shaders/simple_fs_gl2.inc" +#include "gl2_shaders/neoRimSkin_gl2.inc" +#else +#include "shaders/simple_fs_gl3.inc" +#include "shaders/neoRimSkin_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoRimSkin_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; + neoRimSkinShader = Shader::create(vs, fs); + assert(neoRimSkinShader); + } + + { +#ifdef RW_GLES2 +#include "gl2_shaders/simple_fs_gl2.inc" +#include "gl2_shaders/neoRim_gl2.inc" +#else +#include "shaders/simple_fs_gl3.inc" +#include "shaders/neoRim_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoRim_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; + neoRimShader = Shader::create(vs, fs); + assert(neoRimShader); + } + + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = rimRenderCB; + rimPipe = pipe; + + pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::skinInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = rimSkinRenderCB; + rimSkinPipe = pipe; +} + +void +DestroyRimLightPipes(void) +{ + neoRimShader->destroy(); + neoRimShader = nil; + + neoRimSkinShader->destroy(); + neoRimSkinShader = nil; + + ((rw::gl3::ObjPipeline*)rimPipe)->destroy(); + rimPipe = nil; + + ((rw::gl3::ObjPipeline*)rimSkinPipe)->destroy(); + rimSkinPipe = nil; +} + + + +void +CustomPipeRegisterGL(void) +{ + u_viewVec = rw::gl3::registerUniform("u_viewVec"); + u_rampStart = rw::gl3::registerUniform("u_rampStart"); + u_rampEnd = rw::gl3::registerUniform("u_rampEnd"); + u_rimData = rw::gl3::registerUniform("u_rimData"); + + u_lightMap = rw::gl3::registerUniform("u_lightMap"); + + u_eye = rw::gl3::registerUniform("u_eye"); + u_reflProps = rw::gl3::registerUniform("u_reflProps"); + u_specDir = rw::gl3::registerUniform("u_specDir"); + u_specColor = rw::gl3::registerUniform("u_specColor"); +} + + +} + +#endif +#endif diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile index 87be011e..6cbbf237 100644 --- a/src/extras/shaders/Makefile +++ b/src/extras/shaders/Makefile @@ -1,10 +1,26 @@ -all: im2d_gl3.inc colourfilterIII_fs_gl3.inc contrast_fs_gl3.inc +all: im2d_gl3.inc simple_fs_gl3.inc default_UV2_gl3.inc \ + colourfilterIII_fs_gl3.inc contrast_fs_gl3.inc \ + neoRim_gl3.inc neoRimSkin_gl3.inc \ + neoWorldIII_fs_gl3.inc neoGloss_vs_gl3.inc neoGloss_fs_gl3.inc \ + neoVehicle_vs_gl3.inc neoVehicle_fs_gl3.inc im2d_gl3.inc: im2d.vert (echo 'const char *im2d_vert_src =';\ sed 's/..*/"&\\n"/' im2d.vert;\ echo ';') >im2d_gl3.inc +simple_fs_gl3.inc: simple.frag + (echo 'const char *simple_frag_src =';\ + sed 's/..*/"&\\n"/' simple.frag;\ + echo ';') >simple_fs_gl3.inc + +default_UV2_gl3.inc: default_UV2.vert + (echo 'const char *default_UV2_vert_src =';\ + sed 's/..*/"&\\n"/' default_UV2.vert;\ + echo ';') >default_UV2_gl3.inc + + + colourfilterIII_fs_gl3.inc: colourfilterIII.frag (echo 'const char *colourfilterIII_frag_src =';\ sed 's/..*/"&\\n"/' colourfilterIII.frag;\ @@ -14,3 +30,39 @@ contrast_fs_gl3.inc: contrast.frag (echo 'const char *contrast_frag_src =';\ sed 's/..*/"&\\n"/' contrast.frag;\ echo ';') >contrast_fs_gl3.inc + + +neoRim_gl3.inc: neoRim.vert + (echo 'const char *neoRim_vert_src =';\ + sed 's/..*/"&\\n"/' neoRim.vert;\ + echo ';') >neoRim_gl3.inc + +neoRimSkin_gl3.inc: neoRimSkin.vert + (echo 'const char *neoRimSkin_vert_src =';\ + sed 's/..*/"&\\n"/' neoRimSkin.vert;\ + echo ';') >neoRimSkin_gl3.inc + +neoWorldIII_fs_gl3.inc: neoWorldIII.frag + (echo 'const char *neoWorldIII_frag_src =';\ + sed 's/..*/"&\\n"/' neoWorldIII.frag;\ + echo ';') >neoWorldIII_fs_gl3.inc + +neoGloss_fs_gl3.inc: neoGloss.frag + (echo 'const char *neoGloss_frag_src =';\ + sed 's/..*/"&\\n"/' neoGloss.frag;\ + echo ';') >neoGloss_fs_gl3.inc + +neoGloss_vs_gl3.inc: neoGloss.vert + (echo 'const char *neoGloss_vert_src =';\ + sed 's/..*/"&\\n"/' neoGloss.vert;\ + echo ';') >neoGloss_vs_gl3.inc + +neoVehicle_vs_gl3.inc: neoVehicle.vert + (echo 'const char *neoVehicle_vert_src =';\ + sed 's/..*/"&\\n"/' neoVehicle.vert;\ + echo ';') >neoVehicle_vs_gl3.inc + +neoVehicle_fs_gl3.inc: neoVehicle.frag + (echo 'const char *neoVehicle_frag_src =';\ + sed 's/..*/"&\\n"/' neoVehicle.frag;\ + echo ';') >neoVehicle_fs_gl3.inc diff --git a/src/extras/shaders/colourfilterIII.frag b/src/extras/shaders/colourfilterIII.frag index e19a8600..4c9a8400 100644 --- a/src/extras/shaders/colourfilterIII.frag +++ b/src/extras/shaders/colourfilterIII.frag @@ -11,15 +11,10 @@ void main(void) { float a = u_blurcolor.a; - - vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); vec4 prev = dst; for(int i = 0; i < 5; i++){ -// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); - vec4 tmp = dst*(1.0-a) + prev*doublec*a; - tmp += prev*u_blurcolor; - tmp += prev*u_blurcolor; + vec4 tmp = dst*(1.0-a) + prev*u_blurcolor*a; prev = clamp(tmp, 0.0, 1.0); } color.rgb = prev.rgb; diff --git a/src/extras/shaders/colourfilterIII_fs_gl3.inc b/src/extras/shaders/colourfilterIII_fs_gl3.inc index f57b9cdd..5530a4fa 100644 --- a/src/extras/shaders/colourfilterIII_fs_gl3.inc +++ b/src/extras/shaders/colourfilterIII_fs_gl3.inc @@ -12,15 +12,10 @@ const char *colourfilterIII_frag_src = "main(void)\n" "{\n" " float a = u_blurcolor.a;\n" - -" vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n" " vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" " vec4 prev = dst;\n" " for(int i = 0; i < 5; i++){\n" -"// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n" -" vec4 tmp = dst*(1.0-a) + prev*doublec*a;\n" -" tmp += prev*u_blurcolor;\n" -" tmp += prev*u_blurcolor;\n" +" vec4 tmp = dst*(1.0-a) + prev*u_blurcolor*a;\n" " prev = clamp(tmp, 0.0, 1.0);\n" " }\n" " color.rgb = prev.rgb;\n" diff --git a/src/extras/shaders/default_UV2.vert b/src/extras/shaders/default_UV2.vert new file mode 100644 index 00000000..3dbad20f --- /dev/null +++ b/src/extras/shaders/default_UV2.vert @@ -0,0 +1,29 @@ +layout(location = 0) in vec3 in_pos; +layout(location = 1) in vec3 in_normal; +layout(location = 2) in vec4 in_color; +layout(location = 3) in vec2 in_tex0; +layout(location = 4) in vec2 in_tex1; + +out vec4 v_color; +out vec2 v_tex0; +out vec2 v_tex1; +out float v_fog; + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + v_tex1 = in_tex1; + + v_color = in_color; + v_color.rgb += u_ambLight.rgb*surfAmbient; + v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; + v_color = clamp(v_color, 0.0, 1.0); + v_color *= u_matColor; + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/default_UV2_VS.cso b/src/extras/shaders/default_UV2_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..5a48c663dc34a8ea60781a6c045d0e5e710a87c4 GIT binary patch literal 628 zcmY*WyH3ME5F9@u5G3&rAmI|4hy;NY3J?S&ibMi}>&WCSB{8xM^?iar;b;>+fr5gL zhK7zJg})NQ`RXwsf8s7=#rZUs1Y86hF ZI?cJlCLEdFHRjZmzK{QM&iPT20N+GebZr0t literal 0 HcmV?d00001 diff --git a/src/extras/shaders/default_UV2_VS.hlsl b/src/extras/shaders/default_UV2_VS.hlsl new file mode 100644 index 00000000..e78a9907 --- /dev/null +++ b/src/extras/shaders/default_UV2_VS.hlsl @@ -0,0 +1,54 @@ +#include "standardConstants.h" + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; + float4 Prelight : COLOR0; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; +}; + + +VS_out main(in VS_in input) +{ + VS_out output; + + output.Position = mul(combinedMat, input.Position); + float3 Vertex = mul(worldMat, input.Position).xyz; + float3 Normal = mul(normalMat, input.Normal); + + output.TexCoord0.xy = input.TexCoord; + output.TexCoord1.xy = input.TexCoord1; + + output.Color = input.Prelight; + output.Color.rgb += ambientLight.rgb * surfAmbient; + + int i; +#ifdef DIRECTIONALS + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse; +#endif +#ifdef POINTLIGHTS + for(i = 0; i < numPointLights; i++) + output.Color.xyz += DoPointLight(lights[i+firstPointLight], Vertex.xyz, Normal)*surfDiffuse; +#endif +#ifdef SPOTLIGHTS + for(i = 0; i < numSpotLights; i++) + output.Color.xyz += DoSpotLight(lights[i+firstSpotLight], Vertex.xyz, Normal)*surfDiffuse; +#endif + // PS2 clamps before material color + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/default_UV2_VS.inc b/src/extras/shaders/default_UV2_VS.inc new file mode 100644 index 00000000..de832107 --- /dev/null +++ b/src/extras/shaders/default_UV2_VS.inc @@ -0,0 +1,55 @@ +static unsigned char default_UV2_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0x45, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x05, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xd5, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, + 0x01, 0x00, 0x3e, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, + 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x36, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x6d, 0x62, 0x69, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, + 0x4d, 0x61, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x73, + 0x75, 0x72, 0x66, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x00, 0x76, 0x73, 0x5f, + 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, + 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, + 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x01, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x07, 0x80, 0x0f, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x0d, 0x00, 0x00, 0xa0, + 0x03, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xff, 0x90, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x03, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x04, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x55, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0x90, + 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, + 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/default_UV2_gl3.inc b/src/extras/shaders/default_UV2_gl3.inc new file mode 100644 index 00000000..14106b29 --- /dev/null +++ b/src/extras/shaders/default_UV2_gl3.inc @@ -0,0 +1,31 @@ +const char *default_UV2_vert_src = +"layout(location = 0) in vec3 in_pos;\n" +"layout(location = 1) in vec3 in_normal;\n" +"layout(location = 2) in vec4 in_color;\n" +"layout(location = 3) in vec2 in_tex0;\n" +"layout(location = 4) in vec2 in_tex1;\n" + +"out vec4 v_color;\n" +"out vec2 v_tex0;\n" +"out vec2 v_tex1;\n" +"out float v_fog;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * in_normal;\n" + +" v_tex0 = in_tex0;\n" +" v_tex1 = in_tex1;\n" + +" v_color = in_color;\n" +" v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n" +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" v_fog = DoFog(gl_Position.w);\n" +"}\n" +; diff --git a/src/extras/shaders/lighting.h b/src/extras/shaders/lighting.h new file mode 100644 index 00000000..4b081962 --- /dev/null +++ b/src/extras/shaders/lighting.h @@ -0,0 +1,44 @@ +struct Light +{ + float4 color; // and radius + float4 position; // and -cos(angle) + float4 direction; // and falloff clamp +}; + +float3 DoDirLight(Light L, float3 N) +{ + float l = max(0.0, dot(N, -L.direction.xyz)); + return l*L.color.xyz; +} + +float3 DoDirLightSpec(Light L, float3 N, float3 V, float power) +{ + return pow(saturate(dot(N, normalize(V + -L.direction.xyz))), power)*L.color.xyz; +} + +float3 DoPointLight(Light L, float3 V, float3 N) +{ + // As on PS2 + float3 dir = V - L.position.xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/L.color.w)); + float l = max(0.0, dot(N, -normalize(dir))); + return l*L.color.xyz*atten; +} + +float3 DoSpotLight(Light L, float3 V, float3 N) +{ + // As on PS2 + float3 dir = V - L.position.xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/L.color.w)); + dir /= dist; + float l = max(0.0, dot(N, -dir)); + float pcos = dot(dir, L.direction.xyz); // cos to point + float ccos = -L.position.w; // cos of cone + float falloff = (pcos-ccos)/(1.0-ccos); + if(falloff < 0) // outside of cone + l = 0; + l *= max(falloff, L.direction.w); // falloff clamp + return l*L.color.xyz*atten; +} diff --git a/src/extras/shaders/neoGloss.frag b/src/extras/shaders/neoGloss.frag new file mode 100644 index 00000000..14ef0e15 --- /dev/null +++ b/src/extras/shaders/neoGloss.frag @@ -0,0 +1,26 @@ +uniform sampler2D tex0; + +uniform vec4 u_reflProps; + +#define glossMult (u_reflProps.x) + +in vec3 v_normal; +in vec3 v_light; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + color = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec3 n = 2.0*v_normal-1.0; // unpack + vec3 v = 2.0*v_light-1.0; // + + float s = dot(n, v); + color = s*s*s*s*s*s*s*s*color*v_fog*glossMult; + + DoAlphaTest(color.a); +} + diff --git a/src/extras/shaders/neoGloss.vert b/src/extras/shaders/neoGloss.vert new file mode 100644 index 00000000..78dd1b33 --- /dev/null +++ b/src/extras/shaders/neoGloss.vert @@ -0,0 +1,29 @@ +uniform vec3 u_eye; + + +layout(location = 0) in vec3 in_pos; +layout(location = 1) in vec3 in_normal; +layout(location = 2) in vec4 in_color; +layout(location = 3) in vec2 in_tex0; + +out vec3 v_normal; +out vec3 v_light; +out vec2 v_tex0; +out float v_fog; + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + + vec3 viewVec = normalize(u_eye - Vertex.xyz); + vec3 Light = normalize(viewVec - u_lightDirection[0].xyz); + v_normal = 0.5*(1.0 + vec3(0.0, 0.0, 1.0)); // compress + v_light = 0.5*(1.0 + Light); // + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/neoGloss_PS.cso b/src/extras/shaders/neoGloss_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..aa88e45013a1c77b32447b0caf4be7905f004e50 GIT binary patch literal 444 zcma)1F;2rk5S%*RP&TgBC8z$+Ani_OSm)pBLj~+{JMAw8)G6r3{a5kHf3MXb_I3kI$1u z*w5eQvy4R=C25qNCDCad$G8D@fxyuG99XU0BRmdeRSH0-*{Z9yR_L^K1wSx7_lIc!0+l;T3%haPKrtO>JpD@9}q{tu(=9emJP%U!42PJHPWS2R<9|YdQT4p}DV{ Hw-)#YPXbCc literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoGloss_PS.hlsl b/src/extras/shaders/neoGloss_PS.hlsl new file mode 100644 index 00000000..b3c97639 --- /dev/null +++ b/src/extras/shaders/neoGloss_PS.hlsl @@ -0,0 +1,20 @@ +sampler2D tex0 : register(s0); +float glossMult : register(c1); + +struct VS_out +{ + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; + float3 Normal : COLOR0; + float3 Light : COLOR1; +}; + +float4 main(VS_out input) : COLOR +{ + float4 color = tex2D(tex0, input.TexCoord0.xy); + float3 n = 2.0*input.Normal-1.0; // unpack + float3 v = 2.0*input.Light-1.0; // + + float s = dot(n, v); + return s*s*s*s*s*s*s*s*color*input.TexCoord0.z*glossMult; +} diff --git a/src/extras/shaders/neoGloss_PS.inc b/src/extras/shaders/neoGloss_PS.inc new file mode 100644 index 00000000..97e5641d --- /dev/null +++ b/src/extras/shaders/neoGloss_PS.inc @@ -0,0 +1,39 @@ +static unsigned char neoGloss_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x2d, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x06, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x6f, 0x73, + 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x00, 0xab, 0xab, 0x00, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x65, 0x78, 0x30, 0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, + 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, + 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xb0, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x07, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x00, 0x00, 0xa0, + 0x00, 0x00, 0x55, 0xa0, 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xaa, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoGloss_VS.cso b/src/extras/shaders/neoGloss_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..9635b8b7e20db1928f385e8189118a68f431a573 GIT binary patch literal 764 zcmZ`$Jx?1!5PkPyd?JVwA!Q_7P{ajR>?DQLAOb}Sh!nt83S{iFeUf3(`IIQ#(Np*b zP#g^fZc?VCiIgssloVH_rAJ)e>|Vl$l#%A<&6}N>ce}7}^V|FrR<~E)JqPgG;)h&` zL2@u(q9=ql-R1X)QS6v*qsk+vNQIz%quZDz_ZHtZ1N_w792|VWGnr3YWVAWW#nXTD zI%;n>+z+}N?U-jBT`i6y_!@AgQ@EMYQ~kAe+%7nm(bzET58@FzYN#SiCKJr|x?vP_G@ATk>m~hn5wD9V_h4ZL9(Ugme^Jp;3;aCVY3#hjM%aneNcG~%i_L1~ z{rc8=Woyvx22o{I?Hz>YOm_`y6E``lsxz;kSuegxV8mz#R=e#1#@>| z5i>eKnS6^lOI>*e<}NWC$3RAGxGBw@J>bfk%QeS0EM{egRq~76W9ivh^0#Jj-aN9C z|J6Jo6;15Bklh|yI;U=}k^QOBBl%;EKKBTBU!$Kmn!D3z!D4To%%XL|ccnD{Ty~ke ouy`+E?JRww|3}VBo~P3~cdsNDou=2hqNcIItli_^dox5vmJ$St1d+#~l{a*Lnf%~d> zRXoA={-@X81n`5)f5etK$QllCpV%diF6vxf#SZ84>?^j4r+9>Ri6x2wKCROd8!NWL zz1Q$#iT$M5GO>@R{+=jy9&g}t38v2qM;A-9+nCzDu2>Bo-o`tn-6f9V+M)GMiS4W1 zOJYBJHs@~@dqHe6#kz_e68ps)mU~mh&JnvZjr+Y~&xt*n+6DcaVP}x+hPQ4fI5;?P zn3coo%QA5@8g#A)NgTF1BjG*rKHn`<9$FC{3_5Mv5EX8=w;RSI>sjhL>bD!++6j^X zJqbLbn_d*36n_|v!X%6aXoqp9rL%)yncQ!D|0u^l%W*;bw*=|zU&Q)BvK{p>h~j?G zlLX8BB~Q}&4DR%I!dT1K`sB16{WE+V^oO4f+K_QC3E~8C*w@T$uV%hRcjE4saWov^ zZrJ(mn@$UNM>jTZe1z*^D~?7{H)*{8^=jjb-M!t$-tC~>i5uHde;D>S*<9P$T-&_7 zv37BNeVvJZ1uXceXTa8$$t3+m#TvV zf84*+<6@EZ=d86UHL-?8$$@K(1)tS0IVA_nSLI;&<2l%vCWi?>8%JXnr^K{;RZPqO zU(7;d+Fm$lrmrE-OkQUh|6wLtaPd%jqWw8Tp5GGo=^x3@b5PTsJy#sA%e4pbD_V2X zbJU9L_1N1wZA5<_bt1e^jC1Z6+Ztmuvv>8gmj6xNdA{+LuF!|%C~F@D-hNJk@ZA< zidKy_^VHbanP1MltbM)YCz<%?UHx6`mza~S9eTbdfA9?E@1mT)@NO#nNq5okzVi02 zAFW63(kvd-AHR@lKOfKXRq-r;Jf7{TsUNE0S!-37&GOoj kE7D~&A4m+d2G>TPvvr~RWQb>AJh>Ofm-mdl85afcA0B<-r~m)} literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoRimSkin_VS.hlsl b/src/extras/shaders/neoRimSkin_VS.hlsl new file mode 100644 index 00000000..87cc0931 --- /dev/null +++ b/src/extras/shaders/neoRimSkin_VS.hlsl @@ -0,0 +1,73 @@ +#include "standardConstants.h" + +float4x3 boneMatrices[64] : register(c41); + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float4 Prelight : COLOR0; + float4 Weights : BLENDWEIGHT; + int4 Indices : BLENDINDICES; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float4 Color : COLOR0; +}; + +float3 viewVec : register(c233); +float4 rampStart : register(c234); +float4 rampEnd : register(c235); +float3 rimData : register(c236); + +VS_out main(in VS_in input) +{ + VS_out output; + + int j; + float3 SkinVertex = float3(0.0, 0.0, 0.0); + float3 SkinNormal = float3(0.0, 0.0, 0.0); + for(j = 0; j < 4; j++){ + SkinVertex += mul(input.Position, boneMatrices[input.Indices[j]]).xyz * input.Weights[j]; + SkinNormal += mul(input.Normal, (float3x3)boneMatrices[input.Indices[j]]).xyz * input.Weights[j]; + } + + output.Position = mul(combinedMat, float4(SkinVertex, 1.0)); + float3 Vertex = mul(worldMat, float4(SkinVertex, 1.0)).xyz; + float3 Normal = mul(normalMat, SkinNormal); + + output.TexCoord0.xy = input.TexCoord; + + output.Color = input.Prelight; + output.Color.rgb += ambientLight.rgb * surfAmbient; + + int i; +//#ifdef DIRECTIONALS + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse; +//#endif +//#ifdef POINTLIGHTS +// for(i = 0; i < numPointLights; i++) +// output.Color.xyz += DoPointLight(lights[i+firstPointLight], Vertex.xyz, Normal)*surfDiffuse; +//#endif +//#ifdef SPOTLIGHTS +// for(i = 0; i < numSpotLights; i++) +// output.Color.xyz += DoSpotLight(lights[i+firstSpotLight], Vertex.xyz, Normal)*surfDiffuse; +//#endif + + // rim light + float f = rimData.x - rimData.y*dot(Normal, viewVec); + float4 rimlight = saturate(lerp(rampEnd, rampStart, f)*rimData.z); + output.Color.xyz += rimlight.xyz; + + // PS2 clamps before material color + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/neoRimSkin_VS.inc b/src/extras/shaders/neoRimSkin_VS.inc new file mode 100644 index 00000000..ac182956 --- /dev/null +++ b/src/extras/shaders/neoRimSkin_VS.inc @@ -0,0 +1,203 @@ +static unsigned char neoRimSkin_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0xb4, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x92, 0x02, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, + 0x01, 0x00, 0x3e, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x01, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0xc0, 0x00, 0xa6, 0x00, + 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x80, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, + 0x01, 0x00, 0x42, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xac, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, + 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x11, 0x00, 0x18, 0x00, 0x46, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x22, 0x00, + 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x02, 0x00, 0x00, 0x02, 0x00, 0xeb, 0x00, + 0x01, 0x00, 0xae, 0x03, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x02, 0x00, 0x00, 0x02, 0x00, 0xea, 0x00, 0x01, 0x00, 0xaa, 0x03, + 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, + 0x02, 0x00, 0xec, 0x00, 0x01, 0x00, 0xb2, 0x03, 0x70, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, + 0x01, 0x00, 0x36, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8a, 0x02, 0x00, 0x00, 0x02, 0x00, 0xe9, 0x00, 0x01, 0x00, 0xa6, 0x03, + 0x70, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x6d, 0x62, 0x69, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x6f, 0x6e, 0x65, 0x4d, 0x61, 0x74, 0x72, + 0x69, 0x63, 0x65, 0x73, 0x00, 0xab, 0xab, 0xab, 0x03, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4c, 0x69, 0x67, + 0x68, 0x74, 0x00, 0xab, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0xab, 0xbb, 0x01, 0x00, 0x00, + 0xc4, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, + 0xdd, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x03, 0x00, 0xe8, 0x01, 0x00, 0x00, + 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x4d, 0x61, 0x74, 0x00, 0xab, 0xab, 0xab, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x75, 0x6d, 0x44, 0x69, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x00, 0xab, 0xab, 0xab, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x61, 0x6d, 0x70, + 0x45, 0x6e, 0x64, 0x00, 0x72, 0x61, 0x6d, 0x70, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x00, 0x72, 0x69, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x00, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, 0x50, 0x72, 0x6f, 0x70, + 0x73, 0x00, 0x76, 0x69, 0x65, 0x77, 0x56, 0x65, 0x63, 0x00, 0x76, 0x73, + 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, + 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, + 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, + 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x00, 0x80, 0x04, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x80, 0x05, 0x00, 0x0f, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x05, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0xa0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x04, 0x01, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x55, 0x80, 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0xe4, 0x80, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xaa, 0x80, 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xaa, 0x90, 0x01, 0x00, 0xe4, 0x80, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xff, 0x80, 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xff, 0x90, + 0x01, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, + 0x01, 0x00, 0x55, 0x80, 0x09, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x0b, 0x80, 0x08, 0x00, 0xa4, 0xa0, 0x01, 0x00, 0x00, 0x80, + 0x02, 0x00, 0xa4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x0a, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x80, 0x01, 0x00, 0xf4, 0x80, + 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x08, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0xe9, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xff, 0x90, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x80, + 0x0d, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, + 0x0f, 0x00, 0xe4, 0xa0, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0xe4, 0x90, + 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, + 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x08, 0x80, 0x04, 0x00, 0x55, 0xa0, + 0x26, 0x00, 0x00, 0x01, 0x00, 0x00, 0xe4, 0xf0, 0x02, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x08, 0x80, 0x03, 0x00, 0xff, 0x80, 0x10, 0x00, 0x00, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x04, 0x00, 0x08, 0x80, 0x04, 0x00, 0xff, 0x80, + 0x04, 0x00, 0x00, 0xa0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x04, 0x00, 0xff, 0x80, 0x08, 0x00, 0x00, 0x04, 0x05, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x13, 0x20, 0xe4, 0xa1, 0x00, 0x00, 0xff, 0xb0, + 0x0b, 0x00, 0x00, 0x03, 0x05, 0x00, 0x01, 0x80, 0x05, 0x00, 0x00, 0x80, + 0x04, 0x00, 0x55, 0xa0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x04, 0x00, 0xff, 0x80, 0x05, 0x00, 0x00, 0x04, 0x05, 0x00, 0x07, 0x80, + 0x05, 0x00, 0x00, 0x80, 0x11, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x80, 0x05, 0x00, 0xe4, 0x80, + 0x0d, 0x00, 0xaa, 0xa0, 0x04, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x08, 0x80, 0x03, 0x00, 0xff, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x27, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x80, + 0xec, 0x00, 0x55, 0xa0, 0x01, 0x00, 0xff, 0x81, 0xec, 0x00, 0x00, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x07, 0x80, 0xeb, 0x00, 0xe4, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0e, 0x80, 0x03, 0x00, 0x90, 0x81, + 0xea, 0x00, 0x90, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf9, 0x80, 0xeb, 0x00, 0xe4, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0xec, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x01, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x55, 0x80, 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x04, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0x90, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x90, + 0x01, 0x00, 0xe4, 0x80, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xaa, 0x80, 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xaa, 0x90, 0x01, 0x00, 0xe4, 0x80, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xff, 0x80, 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x04, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, + 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoRimSkin_gl3.inc b/src/extras/shaders/neoRimSkin_gl3.inc new file mode 100644 index 00000000..70948e1f --- /dev/null +++ b/src/extras/shaders/neoRimSkin_gl3.inc @@ -0,0 +1,50 @@ +const char *neoRimSkin_vert_src = +"uniform mat4 u_boneMatrices[64];\n" + +"uniform vec3 u_viewVec;\n" +"uniform vec4 u_rampStart;\n" +"uniform vec4 u_rampEnd;\n" +"uniform vec3 u_rimData;\n" + +"layout(location = 0) in vec3 in_pos;\n" +"layout(location = 1) in vec3 in_normal;\n" +"layout(location = 2) in vec4 in_color;\n" +"layout(location = 3) in vec2 in_tex0;\n" +"layout(location = 11) in vec4 in_weights;\n" +"layout(location = 12) in vec4 in_indices;\n" + +"out vec4 v_color;\n" +"out vec2 v_tex0;\n" +"out float v_fog;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec3 SkinVertex = vec3(0.0, 0.0, 0.0);\n" +" vec3 SkinNormal = vec3(0.0, 0.0, 0.0);\n" +" for(int i = 0; i < 4; i++){\n" +" SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i];\n" +" SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i];\n" +" }\n" + +" vec4 Vertex = u_world * vec4(SkinVertex, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * SkinNormal;\n" + +" v_tex0 = in_tex0;\n" + +" v_color = in_color;\n" +" v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n" + +" // rim light\n" +" float f = u_rimData.x - u_rimData.y*dot(Normal, u_viewVec);\n" +" vec4 rimlight = clamp(mix(u_rampEnd, u_rampStart, f)*u_rimData.z, 0.0, 1.0);\n" +" v_color.rgb += rimlight.rgb;\n" + +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" v_fog = DoFog(gl_Position.z);\n" +"}\n" +; diff --git a/src/extras/shaders/neoRim_VS.cso b/src/extras/shaders/neoRim_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..4af538b1f4f210e1fef2f8b667e24ad3b279591b GIT binary patch literal 1384 zcmZuwJ#W)c6g{?6C6u;l#lnDu#QFux)W=D zg1dl7Bvc`O06&0%AHYzFEd3a|vNW7~?IcCQk@N07_uO~Sz3&<3dH=ls3Cph@FI@vr zHTg$ul8g8-fH%Z!t|szyA7YNSJd26}8AeJe_FA!N@|LijV(%53B6fe68!0w}t9XhZ zDesqJ6XX?#yx)rDVBrSNQXb2ZBd>{R(aXo?YT|_07i*wzRp_}Z zQf!jgy%2eK+23C-%}suMC|F*1tPTt66O zitdYfHE(Oh2_4jB;{X+}?)m@QzvTsP=z2|Tx_-5yR`&yoxB15D`Z-<4I1>XCkjZ@` z)^NgQua2hYH=Mc%q<+yTKZf;b?le|hU)u{LE)zBMm&ARi(R$L{gsf|!_6gtReYSbMVlBY zdGgB~Suf7W)m6V2bDuWQiw2m5h4jh3cAQ~K|x`93Ku*e1y$Vm zQGN%>mNBnV{BT5e@}>vfMGXqZ(sYiGnFU#m=h; zjCW>-io!lVoB~YEV`kci`kqYjgmA<&y(mZj$<5ej$Z=ZW{Y{29R`BxSKr|Zez5w{ zD@ELQpB$75ZKM3wafN_;+Xmzwz^5y`qUVjZ+~bUR$eq6RDA-E+q91ZjySa5E8gs>e gp*4Ksbt5}uuZ9(WB|DVkGH=Dt%8T$f@39v62A{-Ow*UYD literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoVehicle_PS.hlsl b/src/extras/shaders/neoVehicle_PS.hlsl new file mode 100644 index 00000000..fa030dd6 --- /dev/null +++ b/src/extras/shaders/neoVehicle_PS.hlsl @@ -0,0 +1,34 @@ +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; + float4 ReflColor : COLOR1; +}; + +sampler2D tex0 : register(s0); +sampler2D tex1 : register(s1); + +float4 fogColor : register(c0); + +float4 main(VS_out input) : COLOR +{ + float4 pass1 = input.Color; +//#ifdef TEX + pass1 *= tex2D(tex0, input.TexCoord0.xy); +//#endif + float3 envmap = tex2D(tex1, input.TexCoord1).rgb; + pass1.rgb = lerp(pass1.rgb, envmap, input.ReflColor.a); +// pass1.rgb = envmap; +// pass1.rgb *= input.ReflColor.a; + pass1.rgb = lerp(fogColor.rgb, pass1.rgb, input.TexCoord0.z); +// pass1.rgb += input.ReflColor.rgb * input.TexCoord0.z; + + float3 pass2 = input.ReflColor.rgb*input.TexCoord0.z; + + float4 color; + color.rgb = pass1.rgb*pass1.a + pass2; + color.a = pass1.a; + + return color; +} diff --git a/src/extras/shaders/neoVehicle_PS.inc b/src/extras/shaders/neoVehicle_PS.inc new file mode 100644 index 00000000..8b77cec2 --- /dev/null +++ b/src/extras/shaders/neoVehicle_PS.inc @@ -0,0 +1,42 @@ +static unsigned char neoVehicle_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x30, + 0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x31, + 0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32, + 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, + 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x07, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x03, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x0f, 0xa0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x01, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x01, 0x00, 0xe4, 0xb0, 0x01, 0x08, 0xe4, 0xa0, 0x42, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x01, 0x00, 0xe4, 0x81, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xff, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x00, 0x00, 0xaa, 0xb0, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x00, 0x00, 0xaa, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xff, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xff, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoVehicle_VS.cso b/src/extras/shaders/neoVehicle_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..6ea47987781830e57e2b921d98b1beed97b07841 GIT binary patch literal 1896 zcmZuxzi-r75dQ4lWS1o1@S~tWI_rdvOCq8q{E(6YLV`|LEYcm^c1YY_vKuVzu2=Q~ zLZWbbiY@49jD#q>5=wC`66KZo6H>UjF5PwbzL{rx7lBvKd-J_-X1@hz$$yiMd>DI5h8IjeB{v6$7d~Y2?^r#g@qXfIo9=px7d@9lXl1 z*NUAZwpGS^qu6;|#xFR@d8djkkhf9t{!^@u3VuXY^zymHRa`7;xte1)x!PDJmXyAC z6kA~>AJNEpj}<#h-tCgtQLM_^E|j&kdVhKC{;=U4JRM>@9$Qpkk&#Qqo=-x*z5k#! zHZe@gAn1My*J?%xn}ZQ;j^G)crW~*t1WsSKG}G(h6mnW;D>%^=>Gh0$^EtQ zsNp_(+S+di?ylb(cwKHbS2s3SH*amM-dJB>$M|<(W*$y#6l`w;(OvGh1>Z8b*yXcE z+=6o|nx>y0q!>B_&PetZ?#a_Vxe@QX?&r9#a8HaBhy3QqLK;`)>Z_f`j57k#sK9KV z1IbrdMX^jV_LsSx&*Ed^)|k6FI#b52MRo4Un~G73<`gq=B?e~^@mq~0h6Ra%$jM_E zJB^mnjG3F7VcW_{g-73dG*923^wUXCDX7B9^DK)N^O#~wU*;KORW(~jV%J%_oQeL6 zZu*Y(A2F8t8@_5Hr>6er-IV>nk?1s7O5I5;{Sr;or#jg;_FZbJtB!ecuF=tGualRJ zBoF6AUaI;zAGJ9X+DUBs=^Tr_z+M!+k-5!G^`^=_L(429(INesRV?`mt0|T#X0%D4 z)59g=SEqW)o=}ISx{A44n2msA@{#A56<_MiVjIVYCU51$!oSfL5X)=olQ~G=5u5r7 zJE5P+!}G(UUjF}3zWA7W#ct|ra#VAB+Q-Bcp5a)W0b>5YB)5oDXCFa4Aue~uQB87Z zSciO56}z0(HJEX9`jCX+bnsb&Ifw|71`A+IIHfSfY%xGd~IwQ(E Rp(biKy&~m=wU4q4_#bVzM_~W} literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoVehicle_VS.hlsl b/src/extras/shaders/neoVehicle_VS.hlsl new file mode 100644 index 00000000..de75e745 --- /dev/null +++ b/src/extras/shaders/neoVehicle_VS.hlsl @@ -0,0 +1,64 @@ +#include "standardConstants.h" + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float4 Prelight : COLOR0; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; + float4 ReflColor : COLOR1; +}; + +float3 eye : register(c41); +float4 reflProps : register(c42); +Light specLights[5] : register(c43); + + +#define fresnel (reflProps.x) +#define lightStrength (reflProps.y) // speclight alpha +#define shininess (reflProps.z) +#define specularity (reflProps.w) + +VS_out main(in VS_in input) +{ + VS_out output; + + output.Position = mul(combinedMat, input.Position); + float3 Vertex = mul(worldMat, input.Position).xyz; + float3 Normal = mul(normalMat, input.Normal); + float3 viewVec = normalize(eye - Vertex); + + output.TexCoord0.xy = input.TexCoord; + + output.Color = input.Prelight; + output.Color.rgb += ambientLight.rgb * surfAmbient*lightStrength; + + int i; + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse*lightStrength; + // PS2 clamps before material color + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + // reflect V along Normal + float3 uv2 = Normal*dot(viewVec, Normal)*2.0 - viewVec; + output.TexCoord1 = uv2.xy*0.5 + 0.5; + float b = 1.0 - saturate(dot(viewVec, Normal)); + output.ReflColor = float4(0.0, 0.0, 0.0, 1.0); + output.ReflColor.a = lerp(b*b*b*b*b, 1.0f, fresnel)*shininess; + + //Light mainLight = lights[0]; + for(i = 0; i < 5; i++) + output.ReflColor.xyz += DoDirLightSpec(specLights[i], Normal, viewVec, specLights[i].direction.w)*specularity*lightStrength; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/neoVehicle_VS.inc b/src/extras/shaders/neoVehicle_VS.inc new file mode 100644 index 00000000..37c5858d --- /dev/null +++ b/src/extras/shaders/neoVehicle_VS.inc @@ -0,0 +1,160 @@ +static unsigned char neoVehicle_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0xab, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x76, 0x02, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x0d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x6f, 0x02, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, + 0x01, 0x00, 0x3e, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x4c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x29, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x60, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, + 0x01, 0x00, 0x42, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x11, 0x00, 0x18, 0x00, 0x46, 0x00, 0xe0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf7, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x22, 0x00, + 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x24, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, + 0x01, 0x00, 0xaa, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x02, 0x00, 0x00, 0x02, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0xae, 0x00, + 0x4c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x36, 0x00, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x12, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x79, 0x65, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0x01, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x00, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0xab, + 0x9b, 0x01, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, + 0xa4, 0x01, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x03, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x00, 0xab, 0xab, 0xab, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x75, 0x6d, 0x44, 0x69, 0x72, 0x4c, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x00, 0xab, 0xab, 0xab, 0x00, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x72, 0x65, 0x66, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x00, 0x73, 0x70, + 0x65, 0x63, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0xab, 0xab, 0xab, + 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x03, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, 0x50, 0x72, 0x6f, 0x70, + 0x73, 0x00, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x00, 0x76, + 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, + 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x0b, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x51, 0x00, 0x00, 0x05, + 0x3a, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x05, + 0x01, 0x00, 0x0f, 0xf0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, + 0x03, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0x55, 0x90, + 0x09, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x08, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x0a, 0x00, 0xe4, 0xa0, + 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x01, 0x80, 0x0d, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x2a, 0x00, 0x55, 0xa0, 0x03, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x08, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x26, 0x00, 0x00, 0x01, + 0x00, 0x00, 0xe4, 0xf0, 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xff, 0x80, 0x10, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x55, 0xa0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xb0, 0x03, 0x00, 0x00, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x03, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x13, 0x20, 0xe4, 0xa1, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0xa0, + 0x05, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0x00, 0x80, + 0x11, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x0d, 0x00, 0xaa, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, + 0x2a, 0x00, 0x55, 0xa0, 0x02, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x08, 0x80, 0x01, 0x00, 0xff, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xff, 0x90, 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x01, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x55, 0x90, 0x05, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x04, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x06, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x07, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0x90, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x81, 0x29, 0x00, 0xe4, 0xa0, + 0x24, 0x00, 0x00, 0x02, 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x06, 0x80, + 0x00, 0x00, 0xd0, 0x80, 0x01, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x06, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0xff, 0xa0, + 0x02, 0x00, 0xd0, 0x81, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x03, 0xe0, + 0x01, 0x00, 0xe9, 0x80, 0x3a, 0x00, 0x00, 0xa0, 0x3a, 0x00, 0x00, 0xa0, + 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x0b, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x0b, 0x00, 0xaa, 0xa0, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x81, 0x0b, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x02, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x02, 0x80, + 0x01, 0x00, 0x55, 0x80, 0x01, 0x00, 0x55, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x04, 0x80, 0x01, 0x00, 0x55, 0x80, 0x01, 0x00, 0x00, 0x81, + 0x0b, 0x00, 0xaa, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x55, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x01, 0x80, 0x2a, 0x00, 0x00, 0xa0, 0x01, 0x00, 0xaa, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x08, 0xd0, + 0x01, 0x00, 0x00, 0x80, 0x2a, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x0f, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x26, 0x00, 0x00, 0x01, + 0x01, 0x00, 0xe4, 0xf0, 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, + 0x01, 0x00, 0xff, 0x80, 0x0b, 0x00, 0x55, 0xa0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x01, 0xb0, 0x02, 0x00, 0xff, 0x80, 0x02, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x2d, 0x20, 0xe4, 0xa1, + 0x00, 0x00, 0x00, 0xb0, 0x24, 0x00, 0x00, 0x02, 0x04, 0x00, 0x07, 0x80, + 0x03, 0x00, 0xe4, 0x80, 0x08, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0xff, 0x80, 0x0b, 0x00, 0x00, 0xa0, + 0x0a, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0xff, 0x80, + 0x0b, 0x00, 0xaa, 0xa0, 0x20, 0x00, 0x00, 0x04, 0x03, 0x00, 0x01, 0x80, + 0x02, 0x00, 0xff, 0x80, 0x2d, 0x20, 0xff, 0xa0, 0x00, 0x00, 0x00, 0xb0, + 0x05, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0x00, 0x80, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x2a, 0x00, 0xff, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, + 0x2a, 0x00, 0x55, 0xa0, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x08, 0x80, 0x01, 0x00, 0xff, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0xd0, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xaa, 0xa0, + 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0xe0, + 0x00, 0x00, 0x00, 0x80, 0x0b, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoVehicle_fs_gl3.inc b/src/extras/shaders/neoVehicle_fs_gl3.inc new file mode 100644 index 00000000..c75ba717 --- /dev/null +++ b/src/extras/shaders/neoVehicle_fs_gl3.inc @@ -0,0 +1,30 @@ +const char *neoVehicle_frag_src = +"uniform sampler2D tex0;\n" +"uniform sampler2D tex1;\n" + +"in vec4 v_color;\n" +"in vec4 v_reflcolor;\n" +"in vec2 v_tex0;\n" +"in vec2 v_tex1;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" vec3 envmap = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)).rgb;\n" +" pass1.rgb = mix(pass1.rgb, envmap, v_reflcolor.a);\n" +" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n" +"// pass1.rgb += v_reflcolor.rgb * v_fog;\n" + +" vec3 pass2 = v_reflcolor.rgb * v_fog;\n" + +" color.rgb = pass1.rgb*pass1.a + pass2;\n" +" color.a = pass1.a;\n" + +"// color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" +" DoAlphaTest(color.a);\n" +"}\n" +; diff --git a/src/extras/shaders/neoVehicle_vs_gl3.inc b/src/extras/shaders/neoVehicle_vs_gl3.inc new file mode 100644 index 00000000..268180e1 --- /dev/null +++ b/src/extras/shaders/neoVehicle_vs_gl3.inc @@ -0,0 +1,56 @@ +const char *neoVehicle_vert_src = +"uniform vec3 u_eye;\n" +"uniform vec4 u_reflProps;\n" +"uniform vec4 u_specDir[5];\n" +"uniform vec4 u_specColor[5];\n" + +"#define fresnel (u_reflProps.x)\n" +"#define lightStrength (u_reflProps.y) // speclight alpha\n" +"#define shininess (u_reflProps.z)\n" +"#define specularity (u_reflProps.w)\n" + +"layout(location = 0) in vec3 in_pos;\n" +"layout(location = 1) in vec3 in_normal;\n" +"layout(location = 2) in vec4 in_color;\n" +"layout(location = 3) in vec2 in_tex0;\n" + +"out vec4 v_color;\n" +"out vec4 v_reflcolor;\n" +"out vec2 v_tex0;\n" +"out vec2 v_tex1;\n" +"out float v_fog;\n" + +"vec3 DoDirLightSpec(vec3 Ldir, vec3 Lcol, vec3 N, vec3 V, float power)\n" +"{\n" +" return pow(clamp(dot(N, normalize(V + -Ldir)), 0.0, 1.0), power)*Lcol;\n" +"}\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * in_normal;\n" +" vec3 viewVec = normalize(u_eye - Vertex.xyz);\n" + +" v_tex0 = in_tex0;\n" + +" v_color = in_color;\n" +" v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse*lightStrength;\n" +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" // reflect V along Normal\n" +" vec3 uv2 = Normal*dot(viewVec, Normal)*2.0 - viewVec;\n" +" v_tex1 = uv2.xy*0.5 + 0.5;\n" +" float b = 1.0 - clamp(dot(viewVec, Normal), 0.0, 1.0);\n" +" v_reflcolor = vec4(0.0, 0.0, 0.0, 1.0);\n" +" v_reflcolor.a = mix(b*b*b*b*b, 1.0f, fresnel)*shininess;\n" + +" for(int i = 0; i < 5; i++)\n" +" v_reflcolor.rgb += DoDirLightSpec(u_specDir[i].xyz, u_specColor[i].rgb, Normal, viewVec, u_specDir[i].w)*specularity*lightStrength;\n" + +" v_fog = DoFog(gl_Position.w);\n" +"}\n" +; diff --git a/src/extras/shaders/neoWorldIII.frag b/src/extras/shaders/neoWorldIII.frag new file mode 100644 index 00000000..4c5571ee --- /dev/null +++ b/src/extras/shaders/neoWorldIII.frag @@ -0,0 +1,25 @@ +uniform sampler2D tex0; +uniform sampler2D tex1; + +uniform vec4 u_lightMap; + +in vec4 v_color; +in vec2 v_tex0; +in vec2 v_tex1; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)); + + color = t0*v_color*(1 + u_lightMap*(2*t1-1)); + color.a = v_color.a*t0.a*u_lightMap.a; + + color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); + DoAlphaTest(color.a); +} + diff --git a/src/extras/shaders/neoWorldIII_PS.cso b/src/extras/shaders/neoWorldIII_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..817888ef460d38d2ce15f62cf9ccacb0a6255d51 GIT binary patch literal 528 zcmZ8dyH3ME5S+U>#08Rn0121SL^z1T4UdF^A`}p)BLs0`$&sVj^e!kV`~eiELviCW z5(N_9;_txBogF}&ytg~EyR*K9tg5f-7=xR${tkdo8ps)R3PS+zbOEiUp+rot&J(T0 z0)Z_&YX*3smo&lqt>M<1tLrx0x$k+8(F6vzwF1ZJGxVpk7KO~dG=?j2B?xYH3fUf5tpgLs$MY1yvCAP)sp+Gq3V^rs<~3n RT@?*i&owR1Et9GOz5zfMU(5gi literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoWorldIII_PS.hlsl b/src/extras/shaders/neoWorldIII_PS.hlsl new file mode 100644 index 00000000..8a3d5d86 --- /dev/null +++ b/src/extras/shaders/neoWorldIII_PS.hlsl @@ -0,0 +1,25 @@ +sampler2D Diffuse : register(s0); +sampler2D Light : register(s1); +float4 fogColor : register(c0); +float4 lm : register(c1); + +struct PS_INPUT +{ + float4 Color : COLOR0; + float3 Tex0 : TEXCOORD0; + float2 Tex1 : TEXCOORD1; +}; + +float4 +main(PS_INPUT IN) : COLOR +{ + float4 t0 = tex2D(Diffuse, IN.Tex0.xy); + float4 t1 = tex2D(Light, IN.Tex1); + + float4 col = t0*IN.Color*(1 + lm*(2*t1-1)); + col.a = IN.Color.a*t0.a*lm.a; + + col.rgb = lerp(fogColor.rgb, col.rgb, IN.Tex0.z); + + return col; +} diff --git a/src/extras/shaders/neoWorldIII_PS.inc b/src/extras/shaders/neoWorldIII_PS.inc new file mode 100644 index 00000000..a4631efb --- /dev/null +++ b/src/extras/shaders/neoWorldIII_PS.inc @@ -0,0 +1,46 @@ +static unsigned char neoWorldIII_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x3e, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xbb, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x69, 0x66, 0x66, 0x75, 0x73, 0x65, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6d, 0x00, 0x70, 0x73, 0x5f, 0x32, 0x5f, + 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, + 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, + 0x31, 0x31, 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x07, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x03, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x0f, 0xa0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x01, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x01, 0x00, 0xe4, 0xb0, 0x01, 0x08, 0xe4, 0xa0, 0x42, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x55, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0x80, 0x02, 0x00, 0xaa, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xff, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x08, 0x80, 0x01, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x90, + 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, 0x00, 0x00, 0xff, 0x80, + 0x01, 0x00, 0xff, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0xa1, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0x80, 0x00, 0x00, 0xaa, 0xb0, + 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x08, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoWorldIII_fs_gl3.inc b/src/extras/shaders/neoWorldIII_fs_gl3.inc new file mode 100644 index 00000000..5145f9cd --- /dev/null +++ b/src/extras/shaders/neoWorldIII_fs_gl3.inc @@ -0,0 +1,27 @@ +const char *neoWorldIII_frag_src = +"uniform sampler2D tex0;\n" +"uniform sampler2D tex1;\n" + +"uniform vec4 u_lightMap;\n" + +"in vec4 v_color;\n" +"in vec2 v_tex0;\n" +"in vec2 v_tex1;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n" + +" color = t0*v_color*(1 + u_lightMap*(2*t1-1));\n" +" color.a = v_color.a*t0.a*u_lightMap.a;\n" + +" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" +" DoAlphaTest(color.a);\n" +"}\n" + +; diff --git a/src/extras/shaders/simple.frag b/src/extras/shaders/simple.frag new file mode 100644 index 00000000..87157beb --- /dev/null +++ b/src/extras/shaders/simple.frag @@ -0,0 +1,16 @@ +uniform sampler2D tex0; + +in vec4 v_color; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); + DoAlphaTest(color.a); +} + diff --git a/src/extras/shaders/simple_fs_gl3.inc b/src/extras/shaders/simple_fs_gl3.inc new file mode 100644 index 00000000..47d89971 --- /dev/null +++ b/src/extras/shaders/simple_fs_gl3.inc @@ -0,0 +1,18 @@ +const char *simple_frag_src = +"uniform sampler2D tex0;\n" + +"in vec4 v_color;\n" +"in vec2 v_tex0;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" +" DoAlphaTest(color.a);\n" +"}\n" + +; diff --git a/src/extras/shaders/standardConstants.h b/src/extras/shaders/standardConstants.h new file mode 100644 index 00000000..088df7dd --- /dev/null +++ b/src/extras/shaders/standardConstants.h @@ -0,0 +1,28 @@ +float4x4 combinedMat : register(c0); +float4x4 worldMat : register(c4); +float3x3 normalMat : register(c8); +float4 matCol : register(c12); +float4 surfProps : register(c13); +float4 fogData : register(c14); +float4 ambientLight : register(c15); + +#define surfAmbient (surfProps.x) +#define surfSpecular (surfProps.y) +#define surfDiffuse (surfProps.z) + +#define fogStart (fogData.x) +#define fogEnd (fogData.y) +#define fogRange (fogData.z) +#define fogDisable (fogData.w) + +#include "lighting.h" + +int numDirLights : register(i0); +int numPointLights : register(i1); +int numSpotLights : register(i2); +int4 firstLight : register(c16); +Light lights[8] : register(c17); + +#define firstDirLight (firstLight.x) +#define firstPointLight (firstLight.y) +#define firstSpotLight (firstLight.z) diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp index 60c63114..117fd378 100644 --- a/src/modelinfo/PedModelInfo.cpp +++ b/src/modelinfo/PedModelInfo.cpp @@ -8,6 +8,7 @@ #include "NodeName.h" #include "VisibilityPlugins.h" #include "ModelInfo.h" +#include "custompipes.h" void CPedModelInfo::DeleteRwObject(void) @@ -91,8 +92,10 @@ CPedModelInfo::findLimbsCb(RpAtomic *atomic, void *data) void CPedModelInfo::SetClump(RpClump *clump) { +#ifdef EXTENDED_PIPELINES + CustomPipes::AttachRimPipe(clump); +#endif #ifdef PED_SKIN - // CB has to be set here before atomics are detached from clump if(strncmp(GetName(), "player", 7) == 0) RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); diff --git a/src/modelinfo/SimpleModelInfo.cpp b/src/modelinfo/SimpleModelInfo.cpp index 32204500..416bdad5 100644 --- a/src/modelinfo/SimpleModelInfo.cpp +++ b/src/modelinfo/SimpleModelInfo.cpp @@ -3,6 +3,7 @@ #include "General.h" #include "Camera.h" #include "ModelInfo.h" +#include "custompipes.h" #define LOD_DISTANCE (300.0f) @@ -75,6 +76,10 @@ CSimpleModelInfo::SetAtomic(int n, RpAtomic *atomic) RpGeometry *geo = RpAtomicGetGeometry(atomic); RpGeometrySetFlags(geo, RpGeometryGetFlags(geo) & ~rpGEOMETRYLIGHT); } + +#ifdef EXTENDED_PIPELINES + CustomPipes::AttachWorldPipe(atomic); +#endif } void diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp index d8b388d5..a024bb40 100644 --- a/src/modelinfo/VehicleModelInfo.cpp +++ b/src/modelinfo/VehicleModelInfo.cpp @@ -19,6 +19,7 @@ #include "Bike.h" #include "ModelIndices.h" #include "ModelInfo.h" +#include "custompipes.h" int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 }; int8 CVehicleModelInfo::ms_compsUsed[2]; @@ -1037,6 +1038,10 @@ CVehicleModelInfo::SetEnvironmentMap(void) SetEnvironmentMapCB(wheelmi->m_atomics[i], m_envMap); } } + +#ifdef EXTENDED_PIPELINES + CustomPipes::AttachVehiclePipe(m_clump); +#endif } void diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 7ae29a2f..76d8af2b 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -19,6 +19,7 @@ #include "Shadows.h" #include "PointLights.h" #include "Renderer.h" +#include "custompipes.h" bool gbShowPedRoadGroups; bool gbShowCarRoadGroups; @@ -96,8 +97,12 @@ CRenderer::RenderOneRoad(CEntity *e) return; if(gbShowCollisionPolys) CCollision::DrawColModel_Coloured(e->GetMatrix(), *CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel(), e->GetModelIndex()); - else + else{ +#ifdef EXTENDED_PIPELINES + CustomPipes::AttachGlossPipe(e->GetAtomic()); +#endif e->Render(); + } } void @@ -232,6 +237,11 @@ CRenderer::RenderEverythingBarRoads(void) if(e->IsBuilding() && ((CBuilding*)e)->GetIsATreadable()) continue; +#ifdef EXTENDED_PIPELINES + if(CustomPipes::bRenderingEnvMap && (e->IsPed() || e->IsVehicle())) + continue; +#endif + if(e->IsVehicle() || e->IsPed() && CVisibilityPlugins::GetClumpAlpha((RpClump*)e->m_rwObject) != 255){ if(e->IsVehicle() && ((CVehicle*)e)->IsBoat()){ diff --git a/src/rw/Lights.h b/src/rw/Lights.h index 6fdd51de..b296816b 100644 --- a/src/rw/Lights.h +++ b/src/rw/Lights.h @@ -1,5 +1,11 @@ #pragma once +extern RpLight *pAmbient; +extern RpLight *pDirect; +extern RpLight *pExtraDirectionals[4]; +extern int LightStrengths[4]; +extern int NumExtraDirLightsInWorld; + void SetLightsWithTimeOfDayColour(RpWorld *); RpWorld *LightsCreate(RpWorld *world); void LightsDestroy(RpWorld *world); diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp index f6a9c3b5..b2e252a0 100644 --- a/src/rw/VisibilityPlugins.cpp +++ b/src/rw/VisibilityPlugins.cpp @@ -8,6 +8,7 @@ #include "Camera.h" #include "VisibilityPlugins.h" #include "World.h" +#include "custompipes.h" #define FADE_DISTANCE 20.0f @@ -146,6 +147,10 @@ CVisibilityPlugins::RenderFadingEntities(void) CEntity *e = node->item.entity; if(e->m_rwObject == nil) continue; +#ifdef EXTENDED_PIPELINES + if(CustomPipes::bRenderingEnvMap && (e->IsPed() || e->IsVehicle())) + continue; +#endif mi = (CSimpleModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()); #ifdef FIX_BUGS if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite) From 0e4cd8cfae34867773ba991e9b0d5243a4678d42 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 18 Aug 2020 11:05:43 +0200 Subject: [PATCH 067/112] update librw --- vendor/librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/librw b/vendor/librw index 5e299fb1..93c246b6 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 5e299fb12e0ab85b5a32032544f58480a93a4a32 +Subproject commit 93c246b6b1137dba0cb7ed096b5f6d8ac8e8396f From b03f13b30dd71690aecb6ee8ffad9975d05ad973 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 18 Aug 2020 16:52:02 +0300 Subject: [PATCH 068/112] fixed bugfix --- src/control/Garages.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index 33675ecf..1719028b 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -1884,8 +1884,9 @@ CVehicle* CStoredCar::RestoreCar() pVehicle->m_nRadioStation = m_nRadioStation; pVehicle->bFreebies = false; #ifdef FIX_BUGS - ((CAutomobile*)pVehicle)->m_bombType = m_nCarBombType; + if (pVehicle->IsCar()) #endif + ((CAutomobile*)pVehicle)->m_bombType = m_nCarBombType; pVehicle->bHasBeenOwnedByPlayer = true; pVehicle->m_nDoorLock = CARLOCK_UNLOCKED; pVehicle->bBulletProof = m_bBulletproof; From c63887637b9cbcefb958d81c9675706db470d818 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 18 Aug 2020 16:53:15 +0300 Subject: [PATCH 069/112] submodule update --- vendor/librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/librw b/vendor/librw index a78a0239..93c246b6 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit a78a02394e4c528a2ade867dfd0ffe04e32ec474 +Subproject commit 93c246b6b1137dba0cb7ed096b5f6d8ac8e8396f From 2dcf31b6c7b76a1fa2b8966d5be673ccddbaeecc Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Tue, 18 Aug 2020 15:57:40 +0100 Subject: [PATCH 070/112] Call CWorld::Remove before the delete, the original game does this and its safer. --- src/peds/Population.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp index 0756df38..a1bde005 100644 --- a/src/peds/Population.cpp +++ b/src/peds/Population.cpp @@ -117,8 +117,7 @@ CPopulation::Initialise() void CPopulation::RemovePed(CPed *ent) { - // CPed dtor already does that - // CWorld::Remove((CEntity*)ent); + CWorld::Remove((CEntity*)ent); delete ent; } From db1e5a6ec43246089e5e840b40b189c2c5e37183 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Tue, 18 Aug 2020 16:47:15 +0100 Subject: [PATCH 071/112] Fix small logic mistake in CGarage::RemoveCarsBlockingDoorNotInside --- src/control/Garages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index 1719028b..c9112f81 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -1384,7 +1384,7 @@ void CGarage::RemoveCarsBlockingDoorNotInside() if (pVehicle->GetPosition().x < m_fX1 || pVehicle->GetPosition().x > m_fX2 || pVehicle->GetPosition().y < m_fY1 || pVehicle->GetPosition().y > m_fY2 || pVehicle->GetPosition().z < m_fZ1 || pVehicle->GetPosition().z > m_fZ2) { - if (pVehicle->bIsLocked && pVehicle->CanBeDeleted()) { + if (!pVehicle->bIsLocked && pVehicle->CanBeDeleted()) { CWorld::Remove(pVehicle); delete pVehicle; return; // WHY? From 809c09938a47a030a386fead465147b753ac4286 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Tue, 18 Aug 2020 16:59:19 +0100 Subject: [PATCH 072/112] CREATE_RANDOM_CAR_FOR_CAR_PARK is supposed to be RANDOM_VEHICLE --- src/control/Script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index fa0fb463..93c1ffe3 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -9700,7 +9700,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) return 0; CVehicle* car; if (!CModelInfo::IsBikeModel(model)) - car = new CAutomobile(model, MISSION_VEHICLE); + car = new CAutomobile(model, RANDOM_VEHICLE); CVector pos = *(CVector*)&ScriptParams[0]; pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); car->SetPosition(pos); From f09abe9ec13501d476d9277f3cfbcb098a545796 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Tue, 18 Aug 2020 17:14:27 +0100 Subject: [PATCH 073/112] Added bug fix to fix mission related crashes --- src/control/CarCtrl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 5db674cd..c6d90dd9 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -726,6 +726,10 @@ CCarCtrl::RemoveDistantCars() void CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle) { +#ifdef FIX_BUGS + if (pVehicle->bIsLocked) + return; +#endif CVector vecPlayerPos = FindPlayerCentreOfWorld(CWorld::PlayerInFocus); /* BUG: this variable is initialized only in if-block below but can be used outside of it. */ if (!IsThisVehicleInteresting(pVehicle) && !pVehicle->bIsLocked && From c559b71bc96c289cdad8c166ec379ee2df93c995 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 18 Aug 2020 20:08:27 +0300 Subject: [PATCH 074/112] little fix --- src/peds/Ped.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index a15927ff..bfcb52e4 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -13363,7 +13363,7 @@ CPed::ProcessObjective(void) if (m_pMyVehicle) { m_pMyVehicle->AutoPilot.m_nCruiseSpeed = 0; } else { - float closestVehDist = 3600.0f; + float closestVehDist = SQR(60.0f); int16 lastVehicle; CEntity* vehicles[8]; CWorld::FindObjectsInRange(GetPosition(), 25.0f, true, &lastVehicle, 6, vehicles, false, true, false, false, false); @@ -13376,11 +13376,11 @@ CPed::ProcessObjective(void) CVector ourSpeed = GetSpeed(); */ CVector vehDistVec = nearVeh->GetPosition() - GetPosition(); - if (vehDistVec.Magnitude() < closestVehDist + if (vehDistVec.MagnitudeSqr() < closestVehDist && m_pedInObjective->m_pMyVehicle != nearVeh) { foundVeh = nearVeh; - closestVehDist = vehDistVec.Magnitude(); + closestVehDist = vehDistVec.MagnitudeSqr(); } } m_pMyVehicle = foundVeh; From 4d1cfb7214a4867487f128c7e3360681f47e0239 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 19 Aug 2020 03:31:42 +0300 Subject: [PATCH 075/112] Island loading cleanup and fix --- src/control/Script.cpp | 37 ++++++++++++--------------------- src/core/Collision.cpp | 33 +++++++++++++---------------- src/core/Frontend.h | 6 ++++++ src/core/Pad.cpp | 4 ++++ src/core/Streaming.cpp | 8 ++----- src/modelinfo/ModelInfo.cpp | 4 +--- src/save/GenericGameStorage.cpp | 8 ++----- 7 files changed, 42 insertions(+), 58 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 93c1ffe3..e9808643 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -10017,17 +10017,13 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CollectParameters(&m_nIp, 1); CTimer::Stop(); CGame::currLevel = (eLevelName)ScriptParams[0]; -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); CStreaming::RemoveUnusedBuildings(CGame::currLevel); } CCollision::SortOutCollisionAfterLoad(); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) -#endif + ISLAND_LOADING_ISNT(HIGH) { CStreaming::RequestIslands(CGame::currLevel); CStreaming::LoadAllRequestedModels(true); @@ -10647,9 +10643,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) CTimer::Stop(); CGame::currLevel = (eLevelName)ScriptParams[0]; if (CGame::currLevel != CCollision::ms_collisionInMemory) { -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { DMAudio.SetEffectsFadeVol(0); CPad::StopPadsShaking(); @@ -10657,29 +10651,24 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) DMAudio.Service(); } CPopulation::DealWithZoneChange(CCollision::ms_collisionInMemory, CGame::currLevel, false); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + + ISLAND_LOADING_IS(LOW) { CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); CStreaming::RemoveUnusedBuildings(CGame::currLevel); } CCollision::SortOutCollisionAfterLoad(); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) -#endif + + ISLAND_LOADING_ISNT(HIGH) CStreaming::RequestIslands(CGame::currLevel); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + + ISLAND_LOADING_IS(LOW) CStreaming::RequestBigBuildings(CGame::currLevel); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) -#endif + + ISLAND_LOADING_ISNT(HIGH) CStreaming::LoadAllRequestedModels(true); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + + ISLAND_LOADING_IS(LOW) DMAudio.SetEffectsFadeVol(127); } CTimer::Update(); diff --git a/src/core/Collision.cpp b/src/core/Collision.cpp index bd0dfb92..d8603cd8 100644 --- a/src/core/Collision.cpp +++ b/src/core/Collision.cpp @@ -521,10 +521,12 @@ CCollision::LoadCollisionWhenINeedIt(bool forceChange) } if (level == CGame::currLevel || forceChange) { +#ifdef FIX_BUGS + CTimer::Suspend(); +#else CTimer::Stop(); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + ISLAND_LOADING_IS(LOW) { DMAudio.SetEffectsFadeVol(0); CPad::StopPadsShaking(); @@ -534,17 +536,13 @@ CCollision::LoadCollisionWhenINeedIt(bool forceChange) CPopulation::DealWithZoneChange(ms_collisionInMemory, CGame::currLevel, false); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) -#endif + ISLAND_LOADING_ISNT(HIGH) { CStreaming::RemoveIslandsNotUsed(LEVEL_INDUSTRIAL); CStreaming::RemoveIslandsNotUsed(LEVEL_COMMERCIAL); CStreaming::RemoveIslandsNotUsed(LEVEL_SUBURBAN); } -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { CStreaming::RemoveBigBuildings(LEVEL_INDUSTRIAL); CStreaming::RemoveBigBuildings(LEVEL_COMMERCIAL); @@ -557,9 +555,7 @@ CCollision::LoadCollisionWhenINeedIt(bool forceChange) ms_collisionInMemory = CGame::currLevel; CReplay::EmptyReplayBuffer(); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { if (CGame::currLevel != LEVEL_GENERIC) LoadSplash(GetLevelSplashScreen(CGame::currLevel)); @@ -572,18 +568,19 @@ CCollision::LoadCollisionWhenINeedIt(bool forceChange) CStreaming::RequestIslands(CGame::currLevel); #endif CStreaming::LoadAllRequestedModels(true); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + + ISLAND_LOADING_IS(LOW) { CStreaming::HaveAllBigBuildingsLoaded(CGame::currLevel); CGame::TidyUpMemory(true, true); } +#ifdef FIX_BUGS + CTimer::Resume(); +#else CTimer::Update(); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) #endif + ISLAND_LOADING_IS(LOW) DMAudio.SetEffectsFadeVol(127); } } @@ -596,9 +593,7 @@ CCollision::SortOutCollisionAfterLoad(void) { if(ms_collisionInMemory == CGame::currLevel) return; -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) CModelInfo::RemoveColModelsFromOtherLevels(CGame::currLevel); if (CGame::currLevel != LEVEL_GENERIC) { diff --git a/src/core/Frontend.h b/src/core/Frontend.h index d631a7d1..cf112b3d 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -635,6 +635,12 @@ public: static int8 m_DisplayIslandLoading; static int8 m_PrefsIslandLoading; + + #define ISLAND_LOADING_IS(p) if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_##p) + #define ISLAND_LOADING_ISNT(p) if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_##p) +#else + #define ISLAND_LOADING_IS(p) + #define ISLAND_LOADING_ISNT(p) #endif public: diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index d4ffc5ea..3b46a110 100644 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -11,7 +11,11 @@ #include "platform.h" #ifdef XINPUT #include +#if !defined(PSAPI_VERSION) || (PSAPI_VERSION > 1) #pragma comment( lib, "Xinput9_1_0.lib" ) +#else +#pragma comment( lib, "Xinput.lib" ) +#endif #endif #include "Pad.h" diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 089e8b23..1892bf57 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -743,9 +743,7 @@ CStreaming::RequestBigBuildings(eLevelName level) void CStreaming::RequestIslands(eLevelName level) { -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading != CMenuManager::ISLAND_LOADING_HIGH) -#endif + ISLAND_LOADING_ISNT(HIGH) switch(level){ case LEVEL_INDUSTRIAL: RequestModel(islandLODcomInd, BIGBUILDINGFLAGS); @@ -946,9 +944,7 @@ CStreaming::RemoveBuildings(eLevelName level) void CStreaming::RemoveUnusedBigBuildings(eLevelName level) { -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { if (level != LEVEL_INDUSTRIAL) RemoveBigBuildings(LEVEL_INDUSTRIAL); diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp index 5d9c7700..4ee8e72b 100644 --- a/src/modelinfo/ModelInfo.cpp +++ b/src/modelinfo/ModelInfo.cpp @@ -218,9 +218,7 @@ CModelInfo::IsBikeModel(int32 id) void CModelInfo::RemoveColModelsFromOtherLevels(eLevelName level) { -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { int i; CBaseModelInfo *mi; diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 516c8d46..81bcb6b0 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -562,17 +562,13 @@ RestoreForStartLoad() ReadDataFromBufferPointer(_buf, TheCamera.GetMatrix().GetPosition().x); ReadDataFromBufferPointer(_buf, TheCamera.GetMatrix().GetPosition().y); ReadDataFromBufferPointer(_buf, TheCamera.GetMatrix().GetPosition().z); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { CStreaming::RemoveUnusedBigBuildings(CGame::currLevel); CStreaming::RemoveUnusedBuildings(CGame::currLevel); } CCollision::SortOutCollisionAfterLoad(); -#ifdef NO_ISLAND_LOADING - if (CMenuManager::m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_LOW) -#endif + ISLAND_LOADING_IS(LOW) { CStreaming::RequestBigBuildings(CGame::currLevel); CStreaming::LoadAllRequestedModels(false); From 5ac83e4b4cb945a40bf3175b89b78965595679d2 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 14:58:43 +0200 Subject: [PATCH 076/112] changing silly streaming memory limit --- src/core/Streaming.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 3c32b856..b6a4f735 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -199,11 +199,25 @@ CStreaming::Init2(void) ms_pStreamingBuffer[1] = ms_pStreamingBuffer[0] + ms_streamingBufferSize*CDSTREAM_SECTOR_SIZE; debug("Streaming buffer size is %d sectors", ms_streamingBufferSize); + // PC only, figure out how much memory we got +#ifdef GTA_PC #define MB (1024*1024) +#ifdef FIX_BUGS + // do what gta3 does + extern size_t _dwMemAvailPhys; + ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2; + if(ms_memoryAvailable < 65*MB) + ms_memoryAvailable = 65*MB; + desiredNumVehiclesLoaded = (int32)((ms_memoryAvailable / MB - 65) / 3 + 12); + if(desiredNumVehiclesLoaded > MAXVEHICLESLOADED) + desiredNumVehiclesLoaded = MAXVEHICLESLOADED; +#else ms_memoryAvailable = 65 * MB; desiredNumVehiclesLoaded = 25; - debug("Memory allocated to Streaming is %dMB", ms_memoryAvailable / MB); + debug("Memory allocated to Streaming is %zuMB", ms_memoryAvailable/MB); // original modifier was %d +#endif #undef MB +#endif // find island LODs From 827ba62671c6e2efe96259a0f130a4d167d14c2a Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 16:10:22 +0200 Subject: [PATCH 077/112] neo pipelines; postfx fix --- src/core/Game.cpp | 5 + src/core/config.h | 1 + src/core/main.cpp | 27 +- src/core/re3.cpp | 12 + src/extras/custompipes.cpp | 536 ++++++++++++++++ src/extras/custompipes.h | 133 ++++ src/extras/custompipes_d3d9.cpp | 527 ++++++++++++++++ src/extras/custompipes_gl.cpp | 623 +++++++++++++++++++ src/extras/shaders/Makefile | 53 +- src/extras/shaders/colourfilterVC.frag | 2 - src/extras/shaders/colourfilterVC_fs_gl3.inc | 2 - src/extras/shaders/default_UV2.vert | 29 + src/extras/shaders/default_UV2_VS.cso | Bin 0 -> 628 bytes src/extras/shaders/default_UV2_VS.hlsl | 54 ++ src/extras/shaders/default_UV2_VS.inc | 55 ++ src/extras/shaders/default_UV2_gl3.inc | 31 + src/extras/shaders/lighting.h | 44 ++ src/extras/shaders/neoGloss.frag | 26 + src/extras/shaders/neoGloss.vert | 29 + src/extras/shaders/neoGloss_PS.cso | Bin 0 -> 444 bytes src/extras/shaders/neoGloss_PS.hlsl | 20 + src/extras/shaders/neoGloss_PS.inc | 39 ++ src/extras/shaders/neoGloss_VS.cso | Bin 0 -> 764 bytes src/extras/shaders/neoGloss_VS.hlsl | 35 ++ src/extras/shaders/neoGloss_VS.inc | 66 ++ src/extras/shaders/neoGloss_fs_gl3.inc | 28 + src/extras/shaders/neoGloss_vs_gl3.inc | 31 + src/extras/shaders/neoRim.vert | 37 ++ src/extras/shaders/neoRimSkin.vert | 48 ++ src/extras/shaders/neoRimSkin_VS.cso | Bin 0 -> 2404 bytes src/extras/shaders/neoRimSkin_VS.hlsl | 73 +++ src/extras/shaders/neoRimSkin_VS.inc | 203 ++++++ src/extras/shaders/neoRimSkin_gl3.inc | 50 ++ src/extras/shaders/neoRim_VS.cso | Bin 0 -> 1384 bytes src/extras/shaders/neoRim_VS.hlsl | 61 ++ src/extras/shaders/neoRim_VS.inc | 118 ++++ src/extras/shaders/neoRim_gl3.inc | 39 ++ src/extras/shaders/neoVehicle.frag | 28 + src/extras/shaders/neoVehicle.vert | 54 ++ src/extras/shaders/neoVehicle_PS.cso | Bin 0 -> 476 bytes src/extras/shaders/neoVehicle_PS.hlsl | 34 + src/extras/shaders/neoVehicle_PS.inc | 42 ++ src/extras/shaders/neoVehicle_VS.cso | Bin 0 -> 1896 bytes src/extras/shaders/neoVehicle_VS.hlsl | 64 ++ src/extras/shaders/neoVehicle_VS.inc | 160 +++++ src/extras/shaders/neoVehicle_fs_gl3.inc | 30 + src/extras/shaders/neoVehicle_vs_gl3.inc | 56 ++ src/extras/shaders/neoWorldVC.frag | 25 + src/extras/shaders/neoWorldVC_PS.cso | Bin 0 -> 524 bytes src/extras/shaders/neoWorldVC_PS.hlsl | 25 + src/extras/shaders/neoWorldVC_PS.inc | 46 ++ src/extras/shaders/neoWorldVC_fs_gl3.inc | 27 + src/extras/shaders/simple.frag | 16 + src/extras/shaders/simple_fs_gl3.inc | 18 + src/extras/shaders/standardConstants.h | 28 + src/modelinfo/PedModelInfo.cpp | 4 + src/modelinfo/SimpleModelInfo.cpp | 8 + src/modelinfo/VehicleModelInfo.cpp | 5 + src/render/Renderer.cpp | 6 + src/rw/Lights.h | 6 + src/rw/VisibilityPlugins.cpp | 5 + 61 files changed, 3717 insertions(+), 7 deletions(-) create mode 100644 src/extras/custompipes.cpp create mode 100644 src/extras/custompipes.h create mode 100644 src/extras/custompipes_d3d9.cpp create mode 100644 src/extras/custompipes_gl.cpp create mode 100644 src/extras/shaders/default_UV2.vert create mode 100644 src/extras/shaders/default_UV2_VS.cso create mode 100644 src/extras/shaders/default_UV2_VS.hlsl create mode 100644 src/extras/shaders/default_UV2_VS.inc create mode 100644 src/extras/shaders/default_UV2_gl3.inc create mode 100644 src/extras/shaders/lighting.h create mode 100644 src/extras/shaders/neoGloss.frag create mode 100644 src/extras/shaders/neoGloss.vert create mode 100644 src/extras/shaders/neoGloss_PS.cso create mode 100644 src/extras/shaders/neoGloss_PS.hlsl create mode 100644 src/extras/shaders/neoGloss_PS.inc create mode 100644 src/extras/shaders/neoGloss_VS.cso create mode 100644 src/extras/shaders/neoGloss_VS.hlsl create mode 100644 src/extras/shaders/neoGloss_VS.inc create mode 100644 src/extras/shaders/neoGloss_fs_gl3.inc create mode 100644 src/extras/shaders/neoGloss_vs_gl3.inc create mode 100644 src/extras/shaders/neoRim.vert create mode 100644 src/extras/shaders/neoRimSkin.vert create mode 100644 src/extras/shaders/neoRimSkin_VS.cso create mode 100644 src/extras/shaders/neoRimSkin_VS.hlsl create mode 100644 src/extras/shaders/neoRimSkin_VS.inc create mode 100644 src/extras/shaders/neoRimSkin_gl3.inc create mode 100644 src/extras/shaders/neoRim_VS.cso create mode 100644 src/extras/shaders/neoRim_VS.hlsl create mode 100644 src/extras/shaders/neoRim_VS.inc create mode 100644 src/extras/shaders/neoRim_gl3.inc create mode 100644 src/extras/shaders/neoVehicle.frag create mode 100644 src/extras/shaders/neoVehicle.vert create mode 100644 src/extras/shaders/neoVehicle_PS.cso create mode 100644 src/extras/shaders/neoVehicle_PS.hlsl create mode 100644 src/extras/shaders/neoVehicle_PS.inc create mode 100644 src/extras/shaders/neoVehicle_VS.cso create mode 100644 src/extras/shaders/neoVehicle_VS.hlsl create mode 100644 src/extras/shaders/neoVehicle_VS.inc create mode 100644 src/extras/shaders/neoVehicle_fs_gl3.inc create mode 100644 src/extras/shaders/neoVehicle_vs_gl3.inc create mode 100644 src/extras/shaders/neoWorldVC.frag create mode 100644 src/extras/shaders/neoWorldVC_PS.cso create mode 100644 src/extras/shaders/neoWorldVC_PS.hlsl create mode 100644 src/extras/shaders/neoWorldVC_PS.inc create mode 100644 src/extras/shaders/neoWorldVC_fs_gl3.inc create mode 100644 src/extras/shaders/simple.frag create mode 100644 src/extras/shaders/simple_fs_gl3.inc create mode 100644 src/extras/shaders/standardConstants.h diff --git a/src/core/Game.cpp b/src/core/Game.cpp index ce2194a0..1e3e0c12 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -91,6 +91,7 @@ #include "Ropes.h" #include "WindModifiers.h" #include "postfx.h" +#include "custompipes.h" eLevelName CGame::currLevel; int32 CGame::currArea; @@ -360,6 +361,10 @@ bool CGame::Initialise(const char* datFile) CdStreamAddImage("MODELS\\GTA3.IMG"); CFileLoader::LoadLevel("DATA\\DEFAULT.DAT"); CFileLoader::LoadLevel(datFile); +#ifdef EXTENDED_PIPELINES + // for generic fallback + CustomPipes::SetTxdFindCallback(); +#endif CWorld::AddParticles(); CVehicleModelInfo::LoadVehicleColours(); CVehicleModelInfo::LoadEnvironmentMaps(); diff --git a/src/core/config.h b/src/core/config.h index eadbc307..a061408a 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -226,6 +226,7 @@ enum Config { //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH //#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) +//#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) // Water & Particle #define PC_PARTICLE diff --git a/src/core/main.cpp b/src/core/main.cpp index 533ab446..27f6abd9 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -65,6 +65,7 @@ #include "Clock.h" #include "Occlusion.h" #include "Ropes.h" +#include "custompipes.h" GlobalScene Scene; @@ -383,6 +384,9 @@ PluginAttach(void) return FALSE; } +#ifdef EXTENDED_PIPELINES + CustomPipes::CustomPipeRegister(); +#endif return TRUE; } @@ -396,7 +400,11 @@ Initialise3D(void *param) DebugMenuInit(); DebugMenuPopulate(); #endif // !DEBUGMENU - return CGame::InitialiseRenderWare(); + bool ret = CGame::InitialiseRenderWare(); +#ifdef EXTENDED_PIPELINES + CustomPipes::CustomPipeInit(); // need Scene.world for this +#endif + return ret; } return (FALSE); @@ -405,6 +413,9 @@ Initialise3D(void *param) static void Terminate3D(void) { +#ifdef EXTENDED_PIPELINES + CustomPipes::CustomPipeShutdown(); +#endif CGame::ShutdownRenderWare(); #ifdef DEBUGMENU DebugMenuShutdown(); @@ -1103,6 +1114,12 @@ Idle(void *arg) tbEndTimer("PreRender"); #endif +#ifdef FIX_BUGS + // This has to be done BEFORE RwCameraBeginUpdate + RwCameraSetFarClipPlane(Scene.camera, CTimeCycle::GetFarClip()); + RwCameraSetFogDistance(Scene.camera, CTimeCycle::GetFogStart()); +#endif + if(CWeather::LightningFlash && !CCullZones::CamNoRain()){ if(!DoRWStuffStartOfFrame_Horizon(255, 255, 255, 255, 255, 255, 255)) return; @@ -1115,9 +1132,10 @@ Idle(void *arg) DefinedState(); - // BUG. This has to be done BEFORE RwCameraBeginUpdate +#ifndef FIX_BUGS RwCameraSetFarClipPlane(Scene.camera, CTimeCycle::GetFarClip()); RwCameraSetFogDistance(Scene.camera, CTimeCycle::GetFogStart()); +#endif #ifdef TIMEBARS tbStartTimer(0, "RenderScene"); @@ -1126,6 +1144,11 @@ Idle(void *arg) #ifdef TIMEBARS tbEndTimer("RenderScene"); #endif + +#ifdef EXTENDED_PIPELINES + CustomPipes::EnvMapRender(); +#endif + RenderDebugShit(); RenderEffects(); diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 51995cf5..3b6b678a 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -35,6 +35,7 @@ #include "Script.h" #include "MBlur.h" #include "postfx.h" +#include "custompipes.h" #ifndef _WIN32 #include "assert.h" @@ -527,6 +528,17 @@ DebugMenuPopulate(void) #endif DebugMenuAddVar("Render", "Drunkness", &CMBlur::Drunkness, nil, 0.05f, 0, 1.0f); DebugMenuAddVarBool8("Render", "Occlusion debug", &bDisplayOccDebugStuff, nil); +#ifdef EXTENDED_PIPELINES + static const char *vehpipenames[] = { "MatFX", "Neo" }; + e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, + 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); + DebugMenuEntrySetWrap(e, true); + DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Ped Rim light", &CustomPipes::RimlightMult, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo World Lightmaps", &CustomPipes::LightmapMult, nil, 0.1f, 0, 1.0f); + DebugMenuAddVar("Render", "Neo Road Gloss", &CustomPipes::GlossMult, nil, 0.1f, 0, 1.0f); +#endif DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Path Links", &gbShowCarPathsLinks, nil); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp new file mode 100644 index 00000000..2b4745e3 --- /dev/null +++ b/src/extras/custompipes.cpp @@ -0,0 +1,536 @@ +#define WITH_D3D +#include "common.h" + +#ifdef EXTENDED_PIPELINES + +#include "main.h" +#include "RwHelper.h" +#include "Lights.h" +#include "Timecycle.h" +#include "FileMgr.h" +#include "Clock.h" +#include "Weather.h" +#include "TxdStore.h" +#include "Renderer.h" +#include "World.h" +#include "custompipes.h" + +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +namespace CustomPipes { + +rw::int32 CustomMatOffset; + +void* +CustomMatCtor(void *object, int32, int32) +{ + CustomMatExt *ext = GetCustomMatExt((rw::Material*)object); + ext->glossTex = nil; + ext->haveGloss = false; + return object; +} + +void* +CustomMatCopy(void *dst, void *src, int32, int32) +{ + CustomMatExt *srcext = GetCustomMatExt((rw::Material*)src); + CustomMatExt *dstext = GetCustomMatExt((rw::Material*)dst); + dstext->glossTex = srcext->glossTex; + dstext->haveGloss = srcext->haveGloss; + return dst; +} + + + +static rw::TexDictionary *neoTxd; + +bool bRenderingEnvMap; +int32 EnvMapSize = 128; +rw::Camera *EnvMapCam; +rw::Texture *EnvMapTex; +rw::Texture *EnvMaskTex; +static rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; +static int16 QuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; + +static rw::Camera* +CreateEnvMapCam(rw::World *world) +{ + rw::Raster *fbuf = rw::Raster::create(EnvMapSize, EnvMapSize, 0, rw::Raster::CAMERATEXTURE); + if(fbuf){ + rw::Raster *zbuf = rw::Raster::create(EnvMapSize, EnvMapSize, 0, rw::Raster::ZBUFFER); + if(zbuf){ + rw::Frame *frame = rw::Frame::create(); + if(frame){ + rw::Camera *cam = rw::Camera::create(); + if(cam){ + cam->frameBuffer = fbuf; + cam->zBuffer = zbuf; + cam->setFrame(frame); + cam->setNearPlane(0.1f); + cam->setFarPlane(250.0f); + rw::V2d vw = { 2.0f, 2.0f }; + cam->setViewWindow(&vw); + world->addCamera(cam); + EnvMapTex = rw::Texture::create(fbuf); + EnvMapTex->setFilter(rw::Texture::LINEAR); + + frame->matrix.right.x = -1.0f; + frame->matrix.up.y = -1.0f; + frame->matrix.update(); + return cam; + } + frame->destroy(); + } + zbuf->destroy(); + } + fbuf->destroy(); + } + return nil; +} + +static void +DestroyCam(rw::Camera *cam) +{ + if(cam == nil) + return; + if(cam->frameBuffer){ + cam->frameBuffer->destroy(); + cam->frameBuffer = nil; + } + if(cam->zBuffer){ + cam->zBuffer->destroy(); + cam->zBuffer = nil; + } + rw::Frame *f = cam->getFrame(); + if(f){ + cam->setFrame(nil); + f->destroy(); + } + cam->world->removeCamera(cam); + cam->destroy(); +} + +void +RenderEnvMapScene(void) +{ + CRenderer::RenderRoads(); + CRenderer::RenderEverythingBarRoads(); + CRenderer::RenderFadingInEntities(); +} + +void +EnvMapRender(void) +{ + if(VehiclePipeSwitch != VEHICLEPIPE_NEO) + return; + + RwCameraEndUpdate(Scene.camera); + + // Neo does this differently, but i'm not quite convinced it's much better + rw::V3d camPos = FindPlayerCoors(); + EnvMapCam->getFrame()->matrix.pos = camPos; + EnvMapCam->getFrame()->transform(&EnvMapCam->getFrame()->matrix, rw::COMBINEREPLACE); + + rw::RGBA skycol = { CTimeCycle::GetSkyBottomRed(), CTimeCycle::GetSkyBottomGreen(), CTimeCycle::GetSkyBottomBlue(), 255 }; + EnvMapCam->clear(&skycol, rwCAMERACLEARZ|rwCAMERACLEARIMAGE); + RwCameraBeginUpdate(EnvMapCam); + bRenderingEnvMap = true; + RenderEnvMapScene(); + bRenderingEnvMap = false; + + if(EnvMaskTex){ + rw::SetRenderState(rw::VERTEXALPHA, TRUE); + rw::SetRenderState(rw::SRCBLEND, rw::BLENDZERO); + rw::SetRenderState(rw::DESTBLEND, rw::BLENDSRCCOLOR); + rw::SetRenderStatePtr(rw::TEXTURERASTER, EnvMaskTex->raster); + rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, EnvScreenQuad, 4, QuadIndices, 6); + rw::SetRenderState(rw::SRCBLEND, rw::BLENDSRCALPHA); + rw::SetRenderState(rw::DESTBLEND, rw::BLENDINVSRCALPHA); + } + RwCameraEndUpdate(EnvMapCam); + + + RwCameraBeginUpdate(Scene.camera); + + // debug env map +// rw::SetRenderStatePtr(rw::TEXTURERASTER, EnvMapTex->raster); +// rw::im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, EnvScreenQuad, 4, QuadIndices, 6); +} + +static void +EnvMapInit(void) +{ + if(neoTxd) + EnvMaskTex = neoTxd->find("CarReflectionMask"); + + EnvMapCam = CreateEnvMapCam(Scene.world); + + int width = EnvMapCam->frameBuffer->width; + int height = EnvMapCam->frameBuffer->height; + float screenZ = RwIm2DGetNearScreenZ(); + float recipZ = 1.0f/EnvMapCam->nearPlane; + + EnvScreenQuad[0].setScreenX(0.0f); + EnvScreenQuad[0].setScreenY(0.0f); + EnvScreenQuad[0].setScreenZ(screenZ); + EnvScreenQuad[0].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[0].setRecipCameraZ(recipZ); + EnvScreenQuad[0].setColor(255, 255, 255, 255); + EnvScreenQuad[0].setU(0.0f, recipZ); + EnvScreenQuad[0].setV(0.0f, recipZ); + + EnvScreenQuad[1].setScreenX(0.0f); + EnvScreenQuad[1].setScreenY(height); + EnvScreenQuad[1].setScreenZ(screenZ); + EnvScreenQuad[1].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[1].setRecipCameraZ(recipZ); + EnvScreenQuad[1].setColor(255, 255, 255, 255); + EnvScreenQuad[1].setU(0.0f, recipZ); + EnvScreenQuad[1].setV(1.0f, recipZ); + + EnvScreenQuad[2].setScreenX(width); + EnvScreenQuad[2].setScreenY(height); + EnvScreenQuad[2].setScreenZ(screenZ); + EnvScreenQuad[2].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[2].setRecipCameraZ(recipZ); + EnvScreenQuad[2].setColor(255, 255, 255, 255); + EnvScreenQuad[2].setU(1.0f, recipZ); + EnvScreenQuad[2].setV(1.0f, recipZ); + + EnvScreenQuad[3].setScreenX(width); + EnvScreenQuad[3].setScreenY(0.0f); + EnvScreenQuad[3].setScreenZ(screenZ); + EnvScreenQuad[3].setCameraZ(EnvMapCam->nearPlane); + EnvScreenQuad[3].setRecipCameraZ(recipZ); + EnvScreenQuad[3].setColor(255, 255, 255, 255); + EnvScreenQuad[3].setU(1.0f, recipZ); + EnvScreenQuad[3].setV(0.0f, recipZ); +} + +static void +EnvMapShutdown(void) +{ + EnvMapTex->raster = nil; + EnvMapTex->destroy(); + EnvMapTex = nil; + DestroyCam(EnvMapCam); + EnvMapCam = nil; +} + +/* + * Tweak values + */ + +#define INTERP_SETUP \ + int h1 = CClock::GetHours(); \ + int h2 = (h1+1)%24; \ + int w1 = CWeather::OldWeatherType; \ + int w2 = CWeather::NewWeatherType; \ + float timeInterp = (CClock::GetSeconds()/60.0f + CClock::GetMinutes())/60.0f; \ + float c0 = (1.0f-timeInterp)*(1.0f-CWeather::InterpolationValue); \ + float c1 = timeInterp*(1.0f-CWeather::InterpolationValue); \ + float c2 = (1.0f-timeInterp)*CWeather::InterpolationValue; \ + float c3 = timeInterp*CWeather::InterpolationValue; +#define INTERP(v) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3; +#define INTERPF(v,f) v[h1][w1].f*c0 + v[h2][w1].f*c1 + v[h1][w2].f*c2 + v[h2][w2].f*c3; + +InterpolatedFloat::InterpolatedFloat(float init) +{ + curInterpolator = 61; // compared against second + for(int h = 0; h < 24; h++) + for(int w = 0; w < NUMWEATHERS; w++) + data[h][w] = init; +} + +void +InterpolatedFloat::Read(char *s, int line, int field) +{ + sscanf(s, "%f", &data[line][field]); +} + +float +InterpolatedFloat::Get(void) +{ + if(curInterpolator != CClock::GetSeconds()){ + INTERP_SETUP + curVal = INTERP(data); + curInterpolator = CClock::GetSeconds(); + } + return curVal; +} + +InterpolatedColor::InterpolatedColor(const Color &init) +{ + curInterpolator = 61; // compared against second + for(int h = 0; h < 24; h++) + for(int w = 0; w < NUMWEATHERS; w++) + data[h][w] = init; +} + +void +InterpolatedColor::Read(char *s, int line, int field) +{ + int r, g, b, a; + sscanf(s, "%i, %i, %i, %i", &r, &g, &b, &a); + data[line][field] = Color(r/255.0f, g/255.0f, b/255.0f, a/255.0f); +} + +Color +InterpolatedColor::Get(void) +{ + if(curInterpolator != CClock::GetSeconds()){ + INTERP_SETUP + curVal.r = INTERPF(data, r); + curVal.g = INTERPF(data, g); + curVal.b = INTERPF(data, b); + curVal.a = INTERPF(data, a); + curInterpolator = CClock::GetSeconds(); + } + return curVal; +} + +void +InterpolatedLight::Read(char *s, int line, int field) +{ + int r, g, b, a; + sscanf(s, "%i, %i, %i, %i", &r, &g, &b, &a); + data[line][field] = Color(r/255.0f, g/255.0f, b/255.0f, a/100.0f); +} + +char* +ReadTweakValueTable(char *fp, InterpolatedValue &interp) +{ + char buf[24], *p; + int c; + int line, field; + + line = 0; + c = *fp++; + while(c != '\0' && line < 24){ + field = 0; + if(c != '\0' && c != '#'){ + while(c != '\0' && c != '\n' && field < NUMWEATHERS){ + p = buf; + while(c != '\0' && c == '\t') + c = *fp++; + *p++ = c; + while(c = *fp++, c != '\0' && c != '\t' && c != '\n') + *p++ = c; + *p++ = '\0'; + interp.Read(buf, line, field); + field++; + } + line++; + } + while(c != '\0' && c != '\n') + c = *fp++; + c = *fp++; + } + return fp-1; +} + + + +/* + * Neo Vehicle pipe + */ + +int32 VehiclePipeSwitch = VEHICLEPIPE_NEO; +float VehicleShininess = 1.0f; +float VehicleSpecularity = 1.0f; +InterpolatedFloat Fresnel(0.4f); +InterpolatedFloat Power(18.0f); +InterpolatedLight DiffColor(Color(0.0f, 0.0f, 0.0f, 0.0f)); +InterpolatedLight SpecColor(Color(0.7f, 0.7f, 0.7f, 1.0f)); +rw::ObjPipeline *vehiclePipe; + +void +AttachVehiclePipe(rw::Atomic *atomic) +{ + atomic->pipeline = vehiclePipe; +} + +void +AttachVehiclePipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachVehiclePipe(rw::Atomic::fromClump(lnk)); +} + + + +/* + * Neo World pipe + */ + +float LightmapMult = 1.0f; +InterpolatedFloat WorldLightmapBlend(1.0f); +rw::ObjPipeline *worldPipe; + +void +AttachWorldPipe(rw::Atomic *atomic) +{ + atomic->pipeline = worldPipe; +} + +void +AttachWorldPipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachWorldPipe(rw::Atomic::fromClump(lnk)); +} + + + + +/* + * Neo Gloss pipe + */ + +float GlossMult = 1.0f; +rw::ObjPipeline *glossPipe; + +rw::Texture* +GetGlossTex(rw::Material *mat) +{ + if(neoTxd == nil) + return nil; + CustomMatExt *ext = GetCustomMatExt(mat); + if(!ext->haveGloss){ + char glossname[128]; + strcpy(glossname, mat->texture->name); + strcat(glossname, "_gloss"); + ext->glossTex = neoTxd->find(glossname); + ext->haveGloss = true; + } + return ext->glossTex; +} + +void +AttachGlossPipe(rw::Atomic *atomic) +{ + atomic->pipeline = glossPipe; +} + +void +AttachGlossPipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachWorldPipe(rw::Atomic::fromClump(lnk)); +} + + + +/* + * Neo Rim pipes + */ + +float RimlightMult = 1.0f; +InterpolatedColor RampStart(Color(0.0f, 0.0f, 0.0f, 1.0f)); +InterpolatedColor RampEnd(Color(1.0f, 1.0f, 1.0f, 1.0f)); +InterpolatedFloat Offset(0.5f); +InterpolatedFloat Scale(1.5f); +InterpolatedFloat Scaling(2.0f); +rw::ObjPipeline *rimPipe; +rw::ObjPipeline *rimSkinPipe; + +void +AttachRimPipe(rw::Atomic *atomic) +{ + if(rw::Skin::get(atomic->geometry)) + atomic->pipeline = rimSkinPipe; + else + atomic->pipeline = rimPipe; +} + +void +AttachRimPipe(rw::Clump *clump) +{ + FORLIST(lnk, clump->atomics) + AttachRimPipe(rw::Atomic::fromClump(lnk)); +} + +/* + * High level stuff + */ + +void +CustomPipeInit(void) +{ + RwStream *stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "neo/neo.txd"); + if(stream == nil) + printf("Error: couldn't open 'neo/neo.txd'\n"); + else{ + if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)) + neoTxd = RwTexDictionaryGtaStreamRead(stream); + RwStreamClose(stream, nil); + } + + EnvMapInit(); + + CreateVehiclePipe(); + CreateWorldPipe(); + CreateGlossPipe(); + CreateRimLightPipes(); +} + +void +CustomPipeShutdown(void) +{ + DestroyVehiclePipe(); + DestroyWorldPipe(); + DestroyGlossPipe(); + DestroyRimLightPipes(); + + EnvMapShutdown(); + + if(neoTxd){ + neoTxd->destroy(); + neoTxd = nil; + } +} + +void +CustomPipeRegister(void) +{ +#ifdef RW_OPENGL + CustomPipeRegisterGL(); +#endif + + CustomMatOffset = rw::Material::registerPlugin(sizeof(CustomMatExt), MAKECHUNKID(rwVENDORID_ROCKSTAR, 0x80), + CustomMatCtor, nil, CustomMatCopy); +} + + +// Load textures from generic as fallback + +rw::TexDictionary *genericTxd; +rw::Texture *(*defaultFindCB)(const char *name); + +static rw::Texture* +customFindCB(const char *name) +{ + rw::Texture *res = defaultFindCB(name); + if(res == nil) + res = genericTxd->find(name); + return res; +} + +void +SetTxdFindCallback(void) +{ + int slot = CTxdStore::FindTxdSlot("generic"); + CTxdStore::AddRef(slot); + // TODO: function for this + genericTxd = CTxdStore::GetSlot(slot)->texDict; + assert(genericTxd); + if(defaultFindCB == nil) + defaultFindCB = rw::Texture::findCB; + rw::Texture::findCB = customFindCB; +} + +} + +#endif diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h new file mode 100644 index 00000000..4ebe586f --- /dev/null +++ b/src/extras/custompipes.h @@ -0,0 +1,133 @@ +#pragma once + +#ifdef EXTENDED_PIPELINES +#ifdef LIBRW + +namespace CustomPipes { + + + +struct CustomMatExt +{ + rw::Texture *glossTex; + bool haveGloss; +}; +extern rw::int32 CustomMatOffset; +inline CustomMatExt *GetCustomMatExt(rw::Material *mat) { + return PLUGINOFFSET(CustomMatExt, mat, CustomMatOffset); +} + + +struct Color +{ + float r, g, b, a; + Color(void) {} + Color(float r, float g, float b, float a) : r(r), g(g), b(b), a(a) {} +}; + +class InterpolatedValue +{ +public: + virtual void Read(char *s, int line, int field) = 0; +}; + +class InterpolatedFloat : public InterpolatedValue +{ +public: + float data[24][NUMWEATHERS]; + float curInterpolator; + float curVal; + + InterpolatedFloat(float init); + void Read(char *s, int line, int field); + float Get(void); +}; + +class InterpolatedColor : public InterpolatedValue +{ +public: + Color data[24][NUMWEATHERS]; + float curInterpolator; + Color curVal; + + InterpolatedColor(const Color &init); + void Read(char *s, int line, int field); + Color Get(void); +}; + +class InterpolatedLight : public InterpolatedColor +{ +public: + InterpolatedLight(const Color &init) : InterpolatedColor(init) {} + void Read(char *s, int line, int field); +}; + +char *ReadTweakValueTable(char *fp, InterpolatedValue &interp); + + + + + +void CustomPipeRegister(void); +void CustomPipeRegisterGL(void); +void CustomPipeInit(void); +void CustomPipeShutdown(void); +void SetTxdFindCallback(void); + +extern bool bRenderingEnvMap; +extern int32 EnvMapSize; +extern rw::Camera *EnvMapCam; +extern rw::Texture *EnvMapTex; +extern rw::Texture *EnvMaskTex; +void EnvMapRender(void); + +enum { + VEHICLEPIPE_MATFX, + VEHICLEPIPE_NEO +}; +extern int32 VehiclePipeSwitch; +extern float VehicleShininess; +extern float VehicleSpecularity; +extern InterpolatedFloat Fresnel; +extern InterpolatedFloat Power; +extern InterpolatedLight DiffColor; +extern InterpolatedLight SpecColor; +extern rw::ObjPipeline *vehiclePipe; +void CreateVehiclePipe(void); +void DestroyVehiclePipe(void); +void AttachVehiclePipe(rw::Atomic *atomic); +void AttachVehiclePipe(rw::Clump *clump); + +extern float LightmapMult; +extern InterpolatedFloat WorldLightmapBlend; +extern rw::ObjPipeline *worldPipe; +void CreateWorldPipe(void); +void DestroyWorldPipe(void); +void AttachWorldPipe(rw::Atomic *atomic); +void AttachWorldPipe(rw::Clump *clump); + +extern float GlossMult; +extern rw::ObjPipeline *glossPipe; +void CreateGlossPipe(void); +void DestroyGlossPipe(void); +void AttachGlossPipe(rw::Atomic *atomic); +void AttachGlossPipe(rw::Clump *clump); +rw::Texture *GetGlossTex(rw::Material *mat); + +extern float RimlightMult; +extern InterpolatedColor RampStart; +extern InterpolatedColor RampEnd; +extern InterpolatedFloat Offset; +extern InterpolatedFloat Scale; +extern InterpolatedFloat Scaling; +extern rw::ObjPipeline *rimPipe; +extern rw::ObjPipeline *rimSkinPipe; +void CreateRimLightPipes(void); +void DestroyRimLightPipes(void); +void AttachRimPipe(rw::Atomic *atomic); +void AttachRimPipe(rw::Clump *clump); + +} + +#endif +#endif diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp new file mode 100644 index 00000000..63e91063 --- /dev/null +++ b/src/extras/custompipes_d3d9.cpp @@ -0,0 +1,527 @@ +#define WITH_D3D +#include "common.h" + +#ifdef RW_D3D9 +#ifdef EXTENDED_PIPELINES + +#include "main.h" +#include "RwHelper.h" +#include "Lights.h" +#include "Timecycle.h" +#include "FileMgr.h" +#include "Clock.h" +#include "Weather.h" +#include "TxdStore.h" +#include "Renderer.h" +#include "World.h" +#include "custompipes.h" + +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +extern RwTexture *gpWhiteTexture; // from vehicle model info + +namespace CustomPipes { + +enum { + // rim pipe + VSLOC_boneMatrices = rw::d3d::VSLOC_afterLights, + VSLOC_viewVec = VSLOC_boneMatrices + 64*3, + VSLOC_rampStart, + VSLOC_rampEnd, + VSLOC_rimData, + + // gloss pipe + VSLOC_eye = rw::d3d::VSLOC_afterLights, + + VSLOC_reflProps, + VSLOC_specLights +}; + +/* + * Neo Vehicle pipe + */ + +static void *neoVehicle_VS; +static void *neoVehicle_PS; + +void +uploadSpecLights(void) +{ + struct VsLight { + rw::RGBAf color; + float pos[4]; // unused + rw::V3d dir; + float power; + } specLights[1 + NUMEXTRADIRECTIONALS]; + memset(specLights, 0, sizeof(specLights)); + for(int i = 0; i < 1+NUMEXTRADIRECTIONALS; i++) + specLights[i].power = 1.0f; + float power = Power.Get(); + Color speccol = SpecColor.Get(); + specLights[0].color.red = speccol.r; + specLights[0].color.green = speccol.g; + specLights[0].color.blue = speccol.b; + specLights[0].dir = pDirect->getFrame()->getLTM()->at; + specLights[0].power = power; + for(int i = 0; i < NUMEXTRADIRECTIONALS; i++){ + if(pExtraDirectionals[i]->getFlags() & rw::Light::LIGHTATOMICS){ + specLights[1+i].color = pExtraDirectionals[i]->color; + specLights[1+i].dir = pExtraDirectionals[i]->getFrame()->getLTM()->at; + specLights[1+i].power = power*2.0f; + } + } + rw::d3d::d3ddevice->SetVertexShaderConstantF(VSLOC_specLights, (float*)&specLights, 3*(1 + NUMEXTRADIRECTIONALS)); +} + +void +vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + // TODO: make this less of a kludge + if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + matFXGlobals.pipelines[rw::platform]->render(atomic); + return; + } + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadSpecLights(); + uploadMatrices(atomic->getFrame()->getLTM()); + + setVertexShader(neoVehicle_VS); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + d3ddevice->SetVertexShaderConstantF(VSLOC_eye, (float*)&eyePos, 1); + + float reflProps[4]; + reflProps[0] = Fresnel.Get(); + reflProps[1] = SpecColor.Get().a; + + d3d::setTexture(1, EnvMapTex); + + SetRenderState(SRCBLEND, BLENDONE); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + reflProps[2] = m->surfaceProps.specular * VehicleShininess; + reflProps[3] = m->surfaceProps.specular == 0.0f ? 0.0f : VehicleSpecularity; + d3ddevice->SetVertexShaderConstantF(VSLOC_reflProps, reflProps, 1); + + setMaterial(m->color, m->surfaceProps); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); + setPixelShader(neoVehicle_PS); + + drawInst(header, inst); + inst++; + } + + SetRenderState(SRCBLEND, BLENDSRCALPHA); +} + +void +CreateVehiclePipe(void) +{ + if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, Fresnel); + fp = ReadTweakValueTable(fp, Power); + fp = ReadTweakValueTable(fp, DiffColor); + fp = ReadTweakValueTable(fp, SpecColor); + } + +#include "shaders/neoVehicle_VS.inc" + neoVehicle_VS = rw::d3d::createVertexShader(neoVehicle_VS_cso); + assert(neoVehicle_VS); + +#include "shaders/neoVehicle_PS.inc" + neoVehicle_PS = rw::d3d::createPixelShader(neoVehicle_PS_cso); + assert(neoVehicle_PS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = vehicleRenderCB; + vehiclePipe = pipe; +} + +void +DestroyVehiclePipe(void) +{ + rw::d3d::destroyVertexShader(neoVehicle_VS); + neoVehicle_VS = nil; + + ((rw::d3d9::ObjPipeline*)vehiclePipe)->destroy(); + vehiclePipe = nil; +} + + + +/* + * Neo World pipe + */ + +static void *neoWorld_VS; +static void *neoWorldVC_PS; + +static void +worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + + float lightfactor[4]; + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + if(MatFX::getEffects(m) == MatFX::DUAL){ + setVertexShader(neoWorld_VS); + + MatFX *matfx = MatFX::get(m); + Texture *dualtex = matfx->getDualTexture(); + if(dualtex == nil) + goto notex; + d3d::setTexture(1, dualtex); + lightfactor[0] = lightfactor[1] = lightfactor[2] = WorldLightmapBlend.Get()*LightmapMult; + }else{ + notex: + setVertexShader(default_amb_VS); + + d3d::setTexture(1, nil); + lightfactor[0] = lightfactor[1] = lightfactor[2] = 0.0f; + } + lightfactor[3] = m->color.alpha/255.0f; + d3d::setTexture(0, m->texture); + d3ddevice->SetPixelShaderConstantF(1, lightfactor, 1); + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + RGBA color = { 255, 255, 255, m->color.alpha }; + setMaterial(color, m->surfaceProps); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); + setPixelShader(neoWorldVC_PS); + + drawInst(header, inst); + inst++; + } +} + +void +CreateWorldPipe(void) +{ + if(CFileMgr::LoadFile("neo/worldTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/worldTweakingTable.dat'\n"); + else + ReadTweakValueTable((char*)work_buff, WorldLightmapBlend); + +#include "shaders/default_UV2_VS.inc" + neoWorld_VS = rw::d3d::createVertexShader(default_UV2_VS_cso); + assert(neoWorld_VS); + +#include "shaders/neoWorldVC_PS.inc" + neoWorldVC_PS = rw::d3d::createPixelShader(neoWorldVC_PS_cso); + assert(neoWorldVC_PS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = worldRenderCB; + worldPipe = pipe; +} + +void +DestroyWorldPipe(void) +{ + rw::d3d::destroyVertexShader(neoWorld_VS); + neoWorld_VS = nil; + rw::d3d::destroyPixelShader(neoWorldVC_PS); + neoWorldVC_PS = nil; + + + ((rw::d3d9::ObjPipeline*)worldPipe)->destroy(); + worldPipe = nil; +} + + + + +/* + * Neo Gloss pipe + */ + +static void *neoGloss_VS; +static void *neoGloss_PS; + +static void +glossRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + worldRenderCB(atomic, header); + + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + setVertexShader(neoGloss_VS); + setPixelShader(neoGloss_PS); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + d3ddevice->SetVertexShaderConstantF(VSLOC_eye, (float*)&eyePos, 1); + d3ddevice->SetPixelShaderConstantF(1, (float*)&GlossMult, 1); + + SetRenderState(VERTEXALPHA, TRUE); + SetRenderState(SRCBLEND, BLENDONE); + SetRenderState(DESTBLEND, BLENDONE); + SetRenderState(ZWRITEENABLE, FALSE); + SetRenderState(ALPHATESTFUNC, ALPHAALWAYS); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + if(m->texture){ + Texture *tex = GetGlossTex(m); + if(tex){ + d3d::setTexture(0, tex); + drawInst(header, inst); + } + } + inst++; + } + + SetRenderState(ZWRITEENABLE, TRUE); + SetRenderState(ALPHATESTFUNC, ALPHAGREATEREQUAL); + SetRenderState(SRCBLEND, BLENDSRCALPHA); + SetRenderState(DESTBLEND, BLENDINVSRCALPHA); +} + +void +CreateGlossPipe(void) +{ +#include "shaders/neoGloss_VS.inc" + neoGloss_VS = rw::d3d::createVertexShader(neoGloss_VS_cso); + assert(neoGloss_VS); + +#include "shaders/neoGloss_PS.inc" + neoGloss_PS = rw::d3d::createPixelShader(neoGloss_PS_cso); + assert(neoGloss_PS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = glossRenderCB; + glossPipe = pipe; +} + +void +DestroyGlossPipe(void) +{ + ((rw::d3d9::ObjPipeline*)glossPipe)->destroy(); + glossPipe = nil; +} + + + +/* + * Neo Rim pipes + */ + +static void *neoRim_VS; +static void *neoRimSkin_VS; + +static void +uploadRimData(bool enable) +{ + using namespace rw; + using namespace rw::d3d; + + V3d viewVec = rw::engine->currentCamera->getFrame()->getLTM()->at; + d3ddevice->SetVertexShaderConstantF(VSLOC_viewVec, (float*)&viewVec, 1); + float rimData[4]; + rimData[0] = Offset.Get(); + rimData[1] = Scale.Get(); + if(enable) + rimData[2] = Scaling.Get()*RimlightMult; + else + rimData[2] = 0.0f; + rimData[3] = 0.0f; + d3ddevice->SetVertexShaderConstantF(VSLOC_rimData, rimData, 1); + Color col = RampStart.Get(); + d3ddevice->SetVertexShaderConstantF(VSLOC_rampStart, (float*)&col, 1); + col = RampEnd.Get(); + d3ddevice->SetVertexShaderConstantF(VSLOC_rampEnd, (float*)&col, 1); +} + +static void +rimRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + setVertexShader(neoRim_VS); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + setMaterial(m->color, m->surfaceProps); + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(header, inst); + inst++; + } +} + +static void +rimSkinRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + + setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer, + 0, header->vertexStream[0].stride); + setIndices((IDirect3DIndexBuffer9*)header->indexBuffer); + setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + uploadSkinMatrices(atomic); + + setVertexShader(neoRimSkin_VS); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + setMaterial(m->color, m->surfaceProps); + + if(inst->material->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(header, inst); + inst++; + } +} + +void +CreateRimLightPipes(void) +{ + if(CFileMgr::LoadFile("neo/rimTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/rimTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, RampStart); + fp = ReadTweakValueTable(fp, RampEnd); + fp = ReadTweakValueTable(fp, Offset); + fp = ReadTweakValueTable(fp, Scale); + fp = ReadTweakValueTable(fp, Scaling); + } + + +#include "shaders/neoRim_VS.inc" + neoRim_VS = rw::d3d::createVertexShader(neoRim_VS_cso); + assert(neoRim_VS); + +#include "shaders/neoRimSkin_VS.inc" + neoRimSkin_VS = rw::d3d::createVertexShader(neoRimSkin_VS_cso); + assert(neoRimSkin_VS); + + + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::defaultInstanceCB; + pipe->uninstanceCB = rw::d3d9::defaultUninstanceCB; + pipe->renderCB = rimRenderCB; + rimPipe = pipe; + + pipe = rw::d3d9::ObjPipeline::create(); + pipe->instanceCB = rw::d3d9::skinInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = rimSkinRenderCB; + rimSkinPipe = pipe; +} + +void +DestroyRimLightPipes(void) +{ + rw::d3d::destroyVertexShader(neoRim_VS); + neoRim_VS = nil; + + rw::d3d::destroyVertexShader(neoRimSkin_VS); + neoRimSkin_VS = nil; + + ((rw::d3d9::ObjPipeline*)rimPipe)->destroy(); + rimPipe = nil; + + ((rw::d3d9::ObjPipeline*)rimSkinPipe)->destroy(); + rimSkinPipe = nil; +} + +} + +#endif +#endif diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp new file mode 100644 index 00000000..cb434ea1 --- /dev/null +++ b/src/extras/custompipes_gl.cpp @@ -0,0 +1,623 @@ +#include "common.h" + +#ifdef RW_OPENGL +#ifdef EXTENDED_PIPELINES + +#include "main.h" +#include "RwHelper.h" +#include "Lights.h" +#include "Timecycle.h" +#include "FileMgr.h" +#include "Clock.h" +#include "Weather.h" +#include "TxdStore.h" +#include "Renderer.h" +#include "World.h" +#include "custompipes.h" + +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +namespace CustomPipes { + +static int32 u_viewVec; +static int32 u_rampStart; +static int32 u_rampEnd; +static int32 u_rimData; + +static int32 u_lightMap; + +static int32 u_eye; +static int32 u_reflProps; +static int32 u_specDir; +static int32 u_specColor; + +#define U(i) currentShader->uniformLocations[i] + +/* + * Neo Vehicle pipe + */ + +rw::gl3::Shader *neoVehicleShader; + +static void +uploadSpecLights(void) +{ + using namespace rw::gl3; + + rw::RGBAf colors[1 + NUMEXTRADIRECTIONALS]; + struct { + rw::V3d dir; + float power; + } dirs[1 + NUMEXTRADIRECTIONALS]; + memset(colors, 0, sizeof(colors)); + memset(dirs, 0, sizeof(dirs)); + for(int i = 0; i < 1+NUMEXTRADIRECTIONALS; i++) + dirs[i].power = 1.0f; + float power = Power.Get(); + Color speccol = SpecColor.Get(); + colors[0].red = speccol.r; + colors[0].green = speccol.g; + colors[0].blue = speccol.b; + dirs[0].dir = pDirect->getFrame()->getLTM()->at; + dirs[0].power = power; + for(int i = 0; i < NUMEXTRADIRECTIONALS; i++){ + if(pExtraDirectionals[i]->getFlags() & rw::Light::LIGHTATOMICS){ + colors[1+i] = pExtraDirectionals[i]->color; + dirs[1+i].dir = pExtraDirectionals[i]->getFrame()->getLTM()->at; + dirs[1+i].power = power*2.0f; + } + } + glUniform4fv(U(u_specDir), 1 + NUMEXTRADIRECTIONALS, (float*)&dirs); + glUniform4fv(U(u_specColor), 1 + NUMEXTRADIRECTIONALS, (float*)&colors); +} + +static void +vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + // TODO: make this less of a kludge + if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + matFXGlobals.pipelines[rw::platform]->render(atomic); + return; + } + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoVehicleShader->use(); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + glUniform3fv(U(u_eye), 1, (float*)&eyePos); + + uploadSpecLights(); + + float reflProps[4]; + reflProps[0] = Fresnel.Get(); + reflProps[1] = SpecColor.Get().a; + + setTexture(1, EnvMapTex); + + SetRenderState(SRCBLEND, BLENDONE); + + while(n--){ + m = inst->material; + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + reflProps[2] = m->surfaceProps.specular * VehicleShininess; + reflProps[3] = m->surfaceProps.specular == 0.0f ? 0.0f : VehicleSpecularity; + glUniform4fv(U(u_reflProps), 1, reflProps); + + drawInst(header, inst); + inst++; + } + + SetRenderState(SRCBLEND, BLENDSRCALPHA); + +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateVehiclePipe(void) +{ + using namespace rw; + using namespace rw::gl3; + + if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, Fresnel); + fp = ReadTweakValueTable(fp, Power); + fp = ReadTweakValueTable(fp, DiffColor); + fp = ReadTweakValueTable(fp, SpecColor); + } + + + { +#ifdef RW_GLES2 +#include "gl2_shaders/neoVehicle_fs_gl2.inc" +#include "gl2_shaders/neoVehicle_vs_gl2.inc" +#else +#include "shaders/neoVehicle_fs_gl3.inc" +#include "shaders/neoVehicle_vs_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoVehicle_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, neoVehicle_frag_src, nil }; + neoVehicleShader = Shader::create(vs, fs); + assert(neoVehicleShader); + } + + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = vehicleRenderCB; + vehiclePipe = pipe; +} + +void +DestroyVehiclePipe(void) +{ + neoVehicleShader->destroy(); + neoVehicleShader = nil; + + ((rw::gl3::ObjPipeline*)vehiclePipe)->destroy(); + vehiclePipe = nil; +} + + + +/* + * Neo World pipe + */ + +rw::gl3::Shader *neoWorldShader; + +static void +worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoWorldShader->use(); + + float lightfactor[4]; + + while(n--){ + m = inst->material; + + if(MatFX::getEffects(m) == MatFX::DUAL){ + MatFX *matfx = MatFX::get(m); + Texture *dualtex = matfx->getDualTexture(); + if(dualtex == nil) + goto notex; + setTexture(1, dualtex); + lightfactor[0] = lightfactor[1] = lightfactor[2] = WorldLightmapBlend.Get()*LightmapMult; + }else{ + notex: + setTexture(1, nil); + lightfactor[0] = lightfactor[1] = lightfactor[2] = 0.0f; + } + lightfactor[3] = m->color.alpha/255.0f; + glUniform4fv(U(u_lightMap), 1, lightfactor); + + RGBA color = { 255, 255, 255, m->color.alpha }; + setMaterial(color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + drawInst(header, inst); + inst++; + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateWorldPipe(void) +{ + using namespace rw; + using namespace rw::gl3; + + if(CFileMgr::LoadFile("neo/worldTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/worldTweakingTable.dat'\n"); + else + ReadTweakValueTable((char*)work_buff, WorldLightmapBlend); + + { +#ifdef RW_GLES2 +#include "gl2_shaders/neoWorldIII_fs_gl2.inc" +#include "gl2_shaders/default_UV2_gl2.inc" +#else +#include "shaders/neoWorldVC_fs_gl3.inc" +#include "shaders/default_UV2_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, default_UV2_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, neoWorldVC_frag_src, nil }; + neoWorldShader = Shader::create(vs, fs); + assert(neoWorldShader); + } + + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = worldRenderCB; + worldPipe = pipe; +} + +void +DestroyWorldPipe(void) +{ + neoWorldShader->destroy(); + neoWorldShader = nil; + + ((rw::gl3::ObjPipeline*)worldPipe)->destroy(); + worldPipe = nil; +} + + + + +/* + * Neo Gloss pipe + */ + +rw::gl3::Shader *neoGlossShader; + +static void +glossRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + worldRenderCB(atomic, header); + + Material *m; + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoGlossShader->use(); + + V3d eyePos = rw::engine->currentCamera->getFrame()->getLTM()->pos; + glUniform3fv(U(u_eye), 1, (float*)&eyePos); + glUniform4fv(U(u_reflProps), 1, (float*)&GlossMult); + + SetRenderState(VERTEXALPHA, TRUE); + SetRenderState(SRCBLEND, BLENDONE); + SetRenderState(DESTBLEND, BLENDONE); + SetRenderState(ZWRITEENABLE, FALSE); + SetRenderState(ALPHATESTFUNC, ALPHAALWAYS); + + while(n--){ + m = inst->material; + + RGBA color = { 255, 255, 255, m->color.alpha }; + setMaterial(color, m->surfaceProps); + + if(m->texture){ + Texture *tex = GetGlossTex(m); + if(tex){ + setTexture(0, tex); + drawInst(header, inst); + } + } + inst++; + } + + SetRenderState(ZWRITEENABLE, TRUE); + SetRenderState(ALPHATESTFUNC, ALPHAGREATEREQUAL); + SetRenderState(SRCBLEND, BLENDSRCALPHA); + SetRenderState(DESTBLEND, BLENDINVSRCALPHA); + +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateGlossPipe(void) +{ + using namespace rw; + using namespace rw::gl3; + + { +#ifdef RW_GLES2 +#include "gl2_shaders/neoGloss_fs_gl2.inc" +#include "gl2_shaders/neoGloss_vs_gl2.inc" +#else +#include "shaders/neoGloss_fs_gl3.inc" +#include "shaders/neoGloss_vs_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoGloss_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, neoGloss_frag_src, nil }; + neoGlossShader = Shader::create(vs, fs); + assert(neoGlossShader); + } + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = glossRenderCB; + glossPipe = pipe; +} + +void +DestroyGlossPipe(void) +{ + neoGlossShader->destroy(); + neoGlossShader = nil; + + ((rw::gl3::ObjPipeline*)glossPipe)->destroy(); + glossPipe = nil; +} + + + +/* + * Neo Rim pipes + */ + +rw::gl3::Shader *neoRimShader; +rw::gl3::Shader *neoRimSkinShader; + +static void +uploadRimData(bool enable) +{ + using namespace rw; + using namespace rw::gl3; + + V3d viewVec = rw::engine->currentCamera->getFrame()->getLTM()->at; + glUniform3fv(U(u_viewVec), 1, (float*)&viewVec); + float rimData[4]; + rimData[0] = Offset.Get(); + rimData[1] = Scale.Get(); + if(enable) + rimData[2] = Scaling.Get()*RimlightMult; + else + rimData[2] = 0.0f; + rimData[3] = 0.0f; + glUniform3fv(U(u_rimData), 1, rimData); + Color col = RampStart.Get(); + glUniform4fv(U(u_rampStart), 1, (float*)&col); + col = RampEnd.Get(); + glUniform4fv(U(u_rampEnd), 1, (float*)&col); +} + +static void +rimSkinRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoRimSkinShader->use(); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + uploadSkinMatrices(atomic); + + while(n--){ + m = inst->material; + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + drawInst(header, inst); + inst++; + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +static void +rimRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + neoRimShader->use(); + + uploadRimData(atomic->geometry->flags & Geometry::LIGHT); + + while(n--){ + m = inst->material; + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + drawInst(header, inst); + inst++; + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + +void +CreateRimLightPipes(void) +{ + using namespace rw::gl3; + + if(CFileMgr::LoadFile("neo/rimTweakingTable.dat", work_buff, sizeof(work_buff), "r") == 0) + printf("Error: couldn't open 'neo/rimTweakingTable.dat'\n"); + else{ + char *fp = (char*)work_buff; + fp = ReadTweakValueTable(fp, RampStart); + fp = ReadTweakValueTable(fp, RampEnd); + fp = ReadTweakValueTable(fp, Offset); + fp = ReadTweakValueTable(fp, Scale); + fp = ReadTweakValueTable(fp, Scaling); + } + + { +#ifdef RW_GLES2 +#include "gl2_shaders/simple_fs_gl2.inc" +#include "gl2_shaders/neoRimSkin_gl2.inc" +#else +#include "shaders/simple_fs_gl3.inc" +#include "shaders/neoRimSkin_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoRimSkin_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; + neoRimSkinShader = Shader::create(vs, fs); + assert(neoRimSkinShader); + } + + { +#ifdef RW_GLES2 +#include "gl2_shaders/simple_fs_gl2.inc" +#include "gl2_shaders/neoRim_gl2.inc" +#else +#include "shaders/simple_fs_gl3.inc" +#include "shaders/neoRim_gl3.inc" +#endif + const char *vs[] = { shaderDecl, header_vert_src, neoRim_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil }; + neoRimShader = Shader::create(vs, fs); + assert(neoRimShader); + } + + + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::defaultInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = rimRenderCB; + rimPipe = pipe; + + pipe = rw::gl3::ObjPipeline::create(); + pipe->instanceCB = rw::gl3::skinInstanceCB; + pipe->uninstanceCB = nil; + pipe->renderCB = rimSkinRenderCB; + rimSkinPipe = pipe; +} + +void +DestroyRimLightPipes(void) +{ + neoRimShader->destroy(); + neoRimShader = nil; + + neoRimSkinShader->destroy(); + neoRimSkinShader = nil; + + ((rw::gl3::ObjPipeline*)rimPipe)->destroy(); + rimPipe = nil; + + ((rw::gl3::ObjPipeline*)rimSkinPipe)->destroy(); + rimSkinPipe = nil; +} + + + +void +CustomPipeRegisterGL(void) +{ + u_viewVec = rw::gl3::registerUniform("u_viewVec"); + u_rampStart = rw::gl3::registerUniform("u_rampStart"); + u_rampEnd = rw::gl3::registerUniform("u_rampEnd"); + u_rimData = rw::gl3::registerUniform("u_rimData"); + + u_lightMap = rw::gl3::registerUniform("u_lightMap"); + + u_eye = rw::gl3::registerUniform("u_eye"); + u_reflProps = rw::gl3::registerUniform("u_reflProps"); + u_specDir = rw::gl3::registerUniform("u_specDir"); + u_specColor = rw::gl3::registerUniform("u_specColor"); +} + + +} + +#endif +#endif diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile index effb6afc..605190c9 100644 --- a/src/extras/shaders/Makefile +++ b/src/extras/shaders/Makefile @@ -1,4 +1,8 @@ -all: im2d_gl3.inc colourfilterVC_fs_gl3.inc contrast_fs_gl3.inc +all: im2d_gl3.inc simple_fs_gl3.inc default_UV2_gl3.inc \ + colourfilterVC_fs_gl3.inc contrast_fs_gl3.inc \ + neoRim_gl3.inc neoRimSkin_gl3.inc \ + neoWorldVC_fs_gl3.inc neoGloss_vs_gl3.inc neoGloss_fs_gl3.inc \ + neoVehicle_vs_gl3.inc neoVehicle_fs_gl3.inc im2d_gl3.inc: im2d.vert (echo 'const char *im2d_vert_src =';\ @@ -9,8 +13,55 @@ colourfilterVC_fs_gl3.inc: colourfilterVC.frag (echo 'const char *colourfilterVC_frag_src =';\ sed 's/..*/"&\\n"/' colourfilterVC.frag;\ echo ';') >colourfilterVC_fs_gl3.inc +simple_fs_gl3.inc: simple.frag + (echo 'const char *simple_frag_src =';\ + sed 's/..*/"&\\n"/' simple.frag;\ + echo ';') >simple_fs_gl3.inc + +default_UV2_gl3.inc: default_UV2.vert + (echo 'const char *default_UV2_vert_src =';\ + sed 's/..*/"&\\n"/' default_UV2.vert;\ + echo ';') >default_UV2_gl3.inc + + contrast_fs_gl3.inc: contrast.frag (echo 'const char *contrast_frag_src =';\ sed 's/..*/"&\\n"/' contrast.frag;\ echo ';') >contrast_fs_gl3.inc + + +neoRim_gl3.inc: neoRim.vert + (echo 'const char *neoRim_vert_src =';\ + sed 's/..*/"&\\n"/' neoRim.vert;\ + echo ';') >neoRim_gl3.inc + +neoRimSkin_gl3.inc: neoRimSkin.vert + (echo 'const char *neoRimSkin_vert_src =';\ + sed 's/..*/"&\\n"/' neoRimSkin.vert;\ + echo ';') >neoRimSkin_gl3.inc + +neoWorldVC_fs_gl3.inc: neoWorldVC.frag + (echo 'const char *neoWorldVC_frag_src =';\ + sed 's/..*/"&\\n"/' neoWorldVC.frag;\ + echo ';') >neoWorldVC_fs_gl3.inc + +neoGloss_fs_gl3.inc: neoGloss.frag + (echo 'const char *neoGloss_frag_src =';\ + sed 's/..*/"&\\n"/' neoGloss.frag;\ + echo ';') >neoGloss_fs_gl3.inc + +neoGloss_vs_gl3.inc: neoGloss.vert + (echo 'const char *neoGloss_vert_src =';\ + sed 's/..*/"&\\n"/' neoGloss.vert;\ + echo ';') >neoGloss_vs_gl3.inc + +neoVehicle_vs_gl3.inc: neoVehicle.vert + (echo 'const char *neoVehicle_vert_src =';\ + sed 's/..*/"&\\n"/' neoVehicle.vert;\ + echo ';') >neoVehicle_vs_gl3.inc + +neoVehicle_fs_gl3.inc: neoVehicle.frag + (echo 'const char *neoVehicle_frag_src =';\ + sed 's/..*/"&\\n"/' neoVehicle.frag;\ + echo ';') >neoVehicle_fs_gl3.inc diff --git a/src/extras/shaders/colourfilterVC.frag b/src/extras/shaders/colourfilterVC.frag index e19a8600..5069af52 100644 --- a/src/extras/shaders/colourfilterVC.frag +++ b/src/extras/shaders/colourfilterVC.frag @@ -11,12 +11,10 @@ void main(void) { float a = u_blurcolor.a; - vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); vec4 prev = dst; for(int i = 0; i < 5; i++){ -// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0); vec4 tmp = dst*(1.0-a) + prev*doublec*a; tmp += prev*u_blurcolor; tmp += prev*u_blurcolor; diff --git a/src/extras/shaders/colourfilterVC_fs_gl3.inc b/src/extras/shaders/colourfilterVC_fs_gl3.inc index acb9b15c..d11cdc5a 100644 --- a/src/extras/shaders/colourfilterVC_fs_gl3.inc +++ b/src/extras/shaders/colourfilterVC_fs_gl3.inc @@ -12,12 +12,10 @@ const char *colourfilterVC_frag_src = "main(void)\n" "{\n" " float a = u_blurcolor.a;\n" - " vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n" " vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" " vec4 prev = dst;\n" " for(int i = 0; i < 5; i++){\n" -"// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n" " vec4 tmp = dst*(1.0-a) + prev*doublec*a;\n" " tmp += prev*u_blurcolor;\n" " tmp += prev*u_blurcolor;\n" diff --git a/src/extras/shaders/default_UV2.vert b/src/extras/shaders/default_UV2.vert new file mode 100644 index 00000000..3dbad20f --- /dev/null +++ b/src/extras/shaders/default_UV2.vert @@ -0,0 +1,29 @@ +layout(location = 0) in vec3 in_pos; +layout(location = 1) in vec3 in_normal; +layout(location = 2) in vec4 in_color; +layout(location = 3) in vec2 in_tex0; +layout(location = 4) in vec2 in_tex1; + +out vec4 v_color; +out vec2 v_tex0; +out vec2 v_tex1; +out float v_fog; + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + v_tex1 = in_tex1; + + v_color = in_color; + v_color.rgb += u_ambLight.rgb*surfAmbient; + v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; + v_color = clamp(v_color, 0.0, 1.0); + v_color *= u_matColor; + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/default_UV2_VS.cso b/src/extras/shaders/default_UV2_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..5a48c663dc34a8ea60781a6c045d0e5e710a87c4 GIT binary patch literal 628 zcmY*WyH3ME5F9@u5G3&rAmI|4hy;NY3J?S&ibMi}>&WCSB{8xM^?iar;b;>+fr5gL zhK7zJg})NQ`RXwsf8s7=#rZUs1Y86hF ZI?cJlCLEdFHRjZmzK{QM&iPT20N+GebZr0t literal 0 HcmV?d00001 diff --git a/src/extras/shaders/default_UV2_VS.hlsl b/src/extras/shaders/default_UV2_VS.hlsl new file mode 100644 index 00000000..e78a9907 --- /dev/null +++ b/src/extras/shaders/default_UV2_VS.hlsl @@ -0,0 +1,54 @@ +#include "standardConstants.h" + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; + float4 Prelight : COLOR0; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; +}; + + +VS_out main(in VS_in input) +{ + VS_out output; + + output.Position = mul(combinedMat, input.Position); + float3 Vertex = mul(worldMat, input.Position).xyz; + float3 Normal = mul(normalMat, input.Normal); + + output.TexCoord0.xy = input.TexCoord; + output.TexCoord1.xy = input.TexCoord1; + + output.Color = input.Prelight; + output.Color.rgb += ambientLight.rgb * surfAmbient; + + int i; +#ifdef DIRECTIONALS + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse; +#endif +#ifdef POINTLIGHTS + for(i = 0; i < numPointLights; i++) + output.Color.xyz += DoPointLight(lights[i+firstPointLight], Vertex.xyz, Normal)*surfDiffuse; +#endif +#ifdef SPOTLIGHTS + for(i = 0; i < numSpotLights; i++) + output.Color.xyz += DoSpotLight(lights[i+firstSpotLight], Vertex.xyz, Normal)*surfDiffuse; +#endif + // PS2 clamps before material color + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/default_UV2_VS.inc b/src/extras/shaders/default_UV2_VS.inc new file mode 100644 index 00000000..de832107 --- /dev/null +++ b/src/extras/shaders/default_UV2_VS.inc @@ -0,0 +1,55 @@ +static unsigned char default_UV2_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0x45, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x05, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xd5, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, + 0x01, 0x00, 0x3e, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, + 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x36, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x6d, 0x62, 0x69, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, + 0x4d, 0x61, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x73, + 0x75, 0x72, 0x66, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x00, 0x76, 0x73, 0x5f, + 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, + 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, + 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x01, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x07, 0x80, 0x0f, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x0d, 0x00, 0x00, 0xa0, + 0x03, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xff, 0x90, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x03, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x04, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x55, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0x90, + 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, + 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/default_UV2_gl3.inc b/src/extras/shaders/default_UV2_gl3.inc new file mode 100644 index 00000000..14106b29 --- /dev/null +++ b/src/extras/shaders/default_UV2_gl3.inc @@ -0,0 +1,31 @@ +const char *default_UV2_vert_src = +"layout(location = 0) in vec3 in_pos;\n" +"layout(location = 1) in vec3 in_normal;\n" +"layout(location = 2) in vec4 in_color;\n" +"layout(location = 3) in vec2 in_tex0;\n" +"layout(location = 4) in vec2 in_tex1;\n" + +"out vec4 v_color;\n" +"out vec2 v_tex0;\n" +"out vec2 v_tex1;\n" +"out float v_fog;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * in_normal;\n" + +" v_tex0 = in_tex0;\n" +" v_tex1 = in_tex1;\n" + +" v_color = in_color;\n" +" v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n" +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" v_fog = DoFog(gl_Position.w);\n" +"}\n" +; diff --git a/src/extras/shaders/lighting.h b/src/extras/shaders/lighting.h new file mode 100644 index 00000000..4b081962 --- /dev/null +++ b/src/extras/shaders/lighting.h @@ -0,0 +1,44 @@ +struct Light +{ + float4 color; // and radius + float4 position; // and -cos(angle) + float4 direction; // and falloff clamp +}; + +float3 DoDirLight(Light L, float3 N) +{ + float l = max(0.0, dot(N, -L.direction.xyz)); + return l*L.color.xyz; +} + +float3 DoDirLightSpec(Light L, float3 N, float3 V, float power) +{ + return pow(saturate(dot(N, normalize(V + -L.direction.xyz))), power)*L.color.xyz; +} + +float3 DoPointLight(Light L, float3 V, float3 N) +{ + // As on PS2 + float3 dir = V - L.position.xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/L.color.w)); + float l = max(0.0, dot(N, -normalize(dir))); + return l*L.color.xyz*atten; +} + +float3 DoSpotLight(Light L, float3 V, float3 N) +{ + // As on PS2 + float3 dir = V - L.position.xyz; + float dist = length(dir); + float atten = max(0.0, (1.0 - dist/L.color.w)); + dir /= dist; + float l = max(0.0, dot(N, -dir)); + float pcos = dot(dir, L.direction.xyz); // cos to point + float ccos = -L.position.w; // cos of cone + float falloff = (pcos-ccos)/(1.0-ccos); + if(falloff < 0) // outside of cone + l = 0; + l *= max(falloff, L.direction.w); // falloff clamp + return l*L.color.xyz*atten; +} diff --git a/src/extras/shaders/neoGloss.frag b/src/extras/shaders/neoGloss.frag new file mode 100644 index 00000000..14ef0e15 --- /dev/null +++ b/src/extras/shaders/neoGloss.frag @@ -0,0 +1,26 @@ +uniform sampler2D tex0; + +uniform vec4 u_reflProps; + +#define glossMult (u_reflProps.x) + +in vec3 v_normal; +in vec3 v_light; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + color = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec3 n = 2.0*v_normal-1.0; // unpack + vec3 v = 2.0*v_light-1.0; // + + float s = dot(n, v); + color = s*s*s*s*s*s*s*s*color*v_fog*glossMult; + + DoAlphaTest(color.a); +} + diff --git a/src/extras/shaders/neoGloss.vert b/src/extras/shaders/neoGloss.vert new file mode 100644 index 00000000..78dd1b33 --- /dev/null +++ b/src/extras/shaders/neoGloss.vert @@ -0,0 +1,29 @@ +uniform vec3 u_eye; + + +layout(location = 0) in vec3 in_pos; +layout(location = 1) in vec3 in_normal; +layout(location = 2) in vec4 in_color; +layout(location = 3) in vec2 in_tex0; + +out vec3 v_normal; +out vec3 v_light; +out vec2 v_tex0; +out float v_fog; + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + + vec3 viewVec = normalize(u_eye - Vertex.xyz); + vec3 Light = normalize(viewVec - u_lightDirection[0].xyz); + v_normal = 0.5*(1.0 + vec3(0.0, 0.0, 1.0)); // compress + v_light = 0.5*(1.0 + Light); // + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/neoGloss_PS.cso b/src/extras/shaders/neoGloss_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..aa88e45013a1c77b32447b0caf4be7905f004e50 GIT binary patch literal 444 zcma)1F;2rk5S%*RP&TgBC8z$+Ani_OSm)pBLj~+{JMAw8)G6r3{a5kHf3MXb_I3kI$1u z*w5eQvy4R=C25qNCDCad$G8D@fxyuG99XU0BRmdeRSH0-*{Z9yR_L^K1wSx7_lIc!0+l;T3%haPKrtO>JpD@9}q{tu(=9emJP%U!42PJHPWS2R<9|YdQT4p}DV{ Hw-)#YPXbCc literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoGloss_PS.hlsl b/src/extras/shaders/neoGloss_PS.hlsl new file mode 100644 index 00000000..b3c97639 --- /dev/null +++ b/src/extras/shaders/neoGloss_PS.hlsl @@ -0,0 +1,20 @@ +sampler2D tex0 : register(s0); +float glossMult : register(c1); + +struct VS_out +{ + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; + float3 Normal : COLOR0; + float3 Light : COLOR1; +}; + +float4 main(VS_out input) : COLOR +{ + float4 color = tex2D(tex0, input.TexCoord0.xy); + float3 n = 2.0*input.Normal-1.0; // unpack + float3 v = 2.0*input.Light-1.0; // + + float s = dot(n, v); + return s*s*s*s*s*s*s*s*color*input.TexCoord0.z*glossMult; +} diff --git a/src/extras/shaders/neoGloss_PS.inc b/src/extras/shaders/neoGloss_PS.inc new file mode 100644 index 00000000..97e5641d --- /dev/null +++ b/src/extras/shaders/neoGloss_PS.inc @@ -0,0 +1,39 @@ +static unsigned char neoGloss_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x2d, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x06, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x6f, 0x73, + 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x00, 0xab, 0xab, 0x00, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x65, 0x78, 0x30, 0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, + 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, + 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xb0, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x07, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x00, 0x00, 0x00, 0xa0, + 0x00, 0x00, 0x55, 0xa0, 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xaa, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoGloss_VS.cso b/src/extras/shaders/neoGloss_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..9635b8b7e20db1928f385e8189118a68f431a573 GIT binary patch literal 764 zcmZ`$Jx?1!5PkPyd?JVwA!Q_7P{ajR>?DQLAOb}Sh!nt83S{iFeUf3(`IIQ#(Np*b zP#g^fZc?VCiIgssloVH_rAJ)e>|Vl$l#%A<&6}N>ce}7}^V|FrR<~E)JqPgG;)h&` zL2@u(q9=ql-R1X)QS6v*qsk+vNQIz%quZDz_ZHtZ1N_w792|VWGnr3YWVAWW#nXTD zI%;n>+z+}N?U-jBT`i6y_!@AgQ@EMYQ~kAe+%7nm(bzET58@FzYN#SiCKJr|x?vP_G@ATk>m~hn5wD9V_h4ZL9(Ugme^Jp;3;aCVY3#hjM%aneNcG~%i_L1~ z{rc8=Woyvx22o{I?Hz>YOm_`y6E``lsxz;kSuegxV8mz#R=e#1#@>| z5i>eKnS6^lOI>*e<}NWC$3RAGxGBw@J>bfk%QeS0EM{egRq~76W9ivh^0#Jj-aN9C z|J6Jo6;15Bklh|yI;U=}k^QOBBl%;EKKBTBU!$Kmn!D3z!D4To%%XL|ccnD{Ty~ke ouy`+E?JRww|3}VBo~P3~cdsNDou=2hqNcIItli_^dox5vmJ$St1d+#~l{a*Lnf%~d> zRXoA={-@X81n`5)f5etK$QllCpV%diF6vxf#SZ84>?^j4r+9>Ri6x2wKCROd8!NWL zz1Q$#iT$M5GO>@R{+=jy9&g}t38v2qM;A-9+nCzDu2>Bo-o`tn-6f9V+M)GMiS4W1 zOJYBJHs@~@dqHe6#kz_e68ps)mU~mh&JnvZjr+Y~&xt*n+6DcaVP}x+hPQ4fI5;?P zn3coo%QA5@8g#A)NgTF1BjG*rKHn`<9$FC{3_5Mv5EX8=w;RSI>sjhL>bD!++6j^X zJqbLbn_d*36n_|v!X%6aXoqp9rL%)yncQ!D|0u^l%W*;bw*=|zU&Q)BvK{p>h~j?G zlLX8BB~Q}&4DR%I!dT1K`sB16{WE+V^oO4f+K_QC3E~8C*w@T$uV%hRcjE4saWov^ zZrJ(mn@$UNM>jTZe1z*^D~?7{H)*{8^=jjb-M!t$-tC~>i5uHde;D>S*<9P$T-&_7 zv37BNeVvJZ1uXceXTa8$$t3+m#TvV zf84*+<6@EZ=d86UHL-?8$$@K(1)tS0IVA_nSLI;&<2l%vCWi?>8%JXnr^K{;RZPqO zU(7;d+Fm$lrmrE-OkQUh|6wLtaPd%jqWw8Tp5GGo=^x3@b5PTsJy#sA%e4pbD_V2X zbJU9L_1N1wZA5<_bt1e^jC1Z6+Ztmuvv>8gmj6xNdA{+LuF!|%C~F@D-hNJk@ZA< zidKy_^VHbanP1MltbM)YCz<%?UHx6`mza~S9eTbdfA9?E@1mT)@NO#nNq5okzVi02 zAFW63(kvd-AHR@lKOfKXRq-r;Jf7{TsUNE0S!-37&GOoj kE7D~&A4m+d2G>TPvvr~RWQb>AJh>Ofm-mdl85afcA0B<-r~m)} literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoRimSkin_VS.hlsl b/src/extras/shaders/neoRimSkin_VS.hlsl new file mode 100644 index 00000000..87cc0931 --- /dev/null +++ b/src/extras/shaders/neoRimSkin_VS.hlsl @@ -0,0 +1,73 @@ +#include "standardConstants.h" + +float4x3 boneMatrices[64] : register(c41); + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float4 Prelight : COLOR0; + float4 Weights : BLENDWEIGHT; + int4 Indices : BLENDINDICES; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float4 Color : COLOR0; +}; + +float3 viewVec : register(c233); +float4 rampStart : register(c234); +float4 rampEnd : register(c235); +float3 rimData : register(c236); + +VS_out main(in VS_in input) +{ + VS_out output; + + int j; + float3 SkinVertex = float3(0.0, 0.0, 0.0); + float3 SkinNormal = float3(0.0, 0.0, 0.0); + for(j = 0; j < 4; j++){ + SkinVertex += mul(input.Position, boneMatrices[input.Indices[j]]).xyz * input.Weights[j]; + SkinNormal += mul(input.Normal, (float3x3)boneMatrices[input.Indices[j]]).xyz * input.Weights[j]; + } + + output.Position = mul(combinedMat, float4(SkinVertex, 1.0)); + float3 Vertex = mul(worldMat, float4(SkinVertex, 1.0)).xyz; + float3 Normal = mul(normalMat, SkinNormal); + + output.TexCoord0.xy = input.TexCoord; + + output.Color = input.Prelight; + output.Color.rgb += ambientLight.rgb * surfAmbient; + + int i; +//#ifdef DIRECTIONALS + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse; +//#endif +//#ifdef POINTLIGHTS +// for(i = 0; i < numPointLights; i++) +// output.Color.xyz += DoPointLight(lights[i+firstPointLight], Vertex.xyz, Normal)*surfDiffuse; +//#endif +//#ifdef SPOTLIGHTS +// for(i = 0; i < numSpotLights; i++) +// output.Color.xyz += DoSpotLight(lights[i+firstSpotLight], Vertex.xyz, Normal)*surfDiffuse; +//#endif + + // rim light + float f = rimData.x - rimData.y*dot(Normal, viewVec); + float4 rimlight = saturate(lerp(rampEnd, rampStart, f)*rimData.z); + output.Color.xyz += rimlight.xyz; + + // PS2 clamps before material color + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/neoRimSkin_VS.inc b/src/extras/shaders/neoRimSkin_VS.inc new file mode 100644 index 00000000..ac182956 --- /dev/null +++ b/src/extras/shaders/neoRimSkin_VS.inc @@ -0,0 +1,203 @@ +static unsigned char neoRimSkin_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0xb4, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x92, 0x02, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, + 0x01, 0x00, 0x3e, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x01, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0xc0, 0x00, 0xa6, 0x00, + 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x80, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, + 0x01, 0x00, 0x42, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xac, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, + 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x11, 0x00, 0x18, 0x00, 0x46, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x22, 0x00, + 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x02, 0x00, 0x00, 0x02, 0x00, 0xeb, 0x00, + 0x01, 0x00, 0xae, 0x03, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x02, 0x00, 0x00, 0x02, 0x00, 0xea, 0x00, 0x01, 0x00, 0xaa, 0x03, + 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, + 0x02, 0x00, 0xec, 0x00, 0x01, 0x00, 0xb2, 0x03, 0x70, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, + 0x01, 0x00, 0x36, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8a, 0x02, 0x00, 0x00, 0x02, 0x00, 0xe9, 0x00, 0x01, 0x00, 0xa6, 0x03, + 0x70, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x6d, 0x62, 0x69, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x6f, 0x6e, 0x65, 0x4d, 0x61, 0x74, 0x72, + 0x69, 0x63, 0x65, 0x73, 0x00, 0xab, 0xab, 0xab, 0x03, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4c, 0x69, 0x67, + 0x68, 0x74, 0x00, 0xab, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0xab, 0xbb, 0x01, 0x00, 0x00, + 0xc4, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, + 0xdd, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x03, 0x00, 0xe8, 0x01, 0x00, 0x00, + 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x4d, 0x61, 0x74, 0x00, 0xab, 0xab, 0xab, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x75, 0x6d, 0x44, 0x69, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x00, 0xab, 0xab, 0xab, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x61, 0x6d, 0x70, + 0x45, 0x6e, 0x64, 0x00, 0x72, 0x61, 0x6d, 0x70, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x00, 0x72, 0x69, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x00, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, 0x50, 0x72, 0x6f, 0x70, + 0x73, 0x00, 0x76, 0x69, 0x65, 0x77, 0x56, 0x65, 0x63, 0x00, 0x76, 0x73, + 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, + 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, + 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, + 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x00, 0x80, 0x04, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x80, 0x05, 0x00, 0x0f, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x05, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0xa0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x04, 0x01, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x55, 0x80, 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0xe4, 0x80, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x01, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xaa, 0x80, 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xaa, 0x90, 0x01, 0x00, 0xe4, 0x80, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, 0x08, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xff, 0x80, 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, 0x01, 0x00, 0xe4, 0x90, + 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xff, 0x90, + 0x01, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, + 0x01, 0x00, 0x55, 0x80, 0x09, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x0b, 0x80, 0x08, 0x00, 0xa4, 0xa0, 0x01, 0x00, 0x00, 0x80, + 0x02, 0x00, 0xa4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x0a, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x80, 0x01, 0x00, 0xf4, 0x80, + 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x08, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0xe9, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xff, 0x90, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x80, + 0x0d, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, + 0x0f, 0x00, 0xe4, 0xa0, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0xe4, 0x90, + 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, + 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x08, 0x80, 0x04, 0x00, 0x55, 0xa0, + 0x26, 0x00, 0x00, 0x01, 0x00, 0x00, 0xe4, 0xf0, 0x02, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x08, 0x80, 0x03, 0x00, 0xff, 0x80, 0x10, 0x00, 0x00, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x04, 0x00, 0x08, 0x80, 0x04, 0x00, 0xff, 0x80, + 0x04, 0x00, 0x00, 0xa0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x04, 0x00, 0xff, 0x80, 0x08, 0x00, 0x00, 0x04, 0x05, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x13, 0x20, 0xe4, 0xa1, 0x00, 0x00, 0xff, 0xb0, + 0x0b, 0x00, 0x00, 0x03, 0x05, 0x00, 0x01, 0x80, 0x05, 0x00, 0x00, 0x80, + 0x04, 0x00, 0x55, 0xa0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x04, 0x00, 0xff, 0x80, 0x05, 0x00, 0x00, 0x04, 0x05, 0x00, 0x07, 0x80, + 0x05, 0x00, 0x00, 0x80, 0x11, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x80, 0x05, 0x00, 0xe4, 0x80, + 0x0d, 0x00, 0xaa, 0xa0, 0x04, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x08, 0x80, 0x03, 0x00, 0xff, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x27, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x80, + 0xec, 0x00, 0x55, 0xa0, 0x01, 0x00, 0xff, 0x81, 0xec, 0x00, 0x00, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x07, 0x80, 0xeb, 0x00, 0xe4, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0e, 0x80, 0x03, 0x00, 0x90, 0x81, + 0xea, 0x00, 0x90, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf9, 0x80, 0xeb, 0x00, 0xe4, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0xec, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x01, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x55, 0x80, 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x55, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x04, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x55, 0x90, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0x00, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x90, + 0x01, 0x00, 0xe4, 0x80, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xaa, 0x80, 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x2a, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xaa, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x04, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xaa, 0x90, 0x01, 0x00, 0xe4, 0x80, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, + 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x29, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x08, 0xb0, 0x00, 0x00, 0xff, 0x80, 0x09, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x2a, 0x20, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0xb0, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0xb0, + 0x00, 0x00, 0xff, 0x80, 0x09, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0xb0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x04, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0xaa, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, + 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoRimSkin_gl3.inc b/src/extras/shaders/neoRimSkin_gl3.inc new file mode 100644 index 00000000..70948e1f --- /dev/null +++ b/src/extras/shaders/neoRimSkin_gl3.inc @@ -0,0 +1,50 @@ +const char *neoRimSkin_vert_src = +"uniform mat4 u_boneMatrices[64];\n" + +"uniform vec3 u_viewVec;\n" +"uniform vec4 u_rampStart;\n" +"uniform vec4 u_rampEnd;\n" +"uniform vec3 u_rimData;\n" + +"layout(location = 0) in vec3 in_pos;\n" +"layout(location = 1) in vec3 in_normal;\n" +"layout(location = 2) in vec4 in_color;\n" +"layout(location = 3) in vec2 in_tex0;\n" +"layout(location = 11) in vec4 in_weights;\n" +"layout(location = 12) in vec4 in_indices;\n" + +"out vec4 v_color;\n" +"out vec2 v_tex0;\n" +"out float v_fog;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec3 SkinVertex = vec3(0.0, 0.0, 0.0);\n" +" vec3 SkinNormal = vec3(0.0, 0.0, 0.0);\n" +" for(int i = 0; i < 4; i++){\n" +" SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i];\n" +" SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i];\n" +" }\n" + +" vec4 Vertex = u_world * vec4(SkinVertex, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * SkinNormal;\n" + +" v_tex0 = in_tex0;\n" + +" v_color = in_color;\n" +" v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n" + +" // rim light\n" +" float f = u_rimData.x - u_rimData.y*dot(Normal, u_viewVec);\n" +" vec4 rimlight = clamp(mix(u_rampEnd, u_rampStart, f)*u_rimData.z, 0.0, 1.0);\n" +" v_color.rgb += rimlight.rgb;\n" + +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" v_fog = DoFog(gl_Position.z);\n" +"}\n" +; diff --git a/src/extras/shaders/neoRim_VS.cso b/src/extras/shaders/neoRim_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..4af538b1f4f210e1fef2f8b667e24ad3b279591b GIT binary patch literal 1384 zcmZuwJ#W)c6g{?6C6u;l#lnDu#QFux)W=D zg1dl7Bvc`O06&0%AHYzFEd3a|vNW7~?IcCQk@N07_uO~Sz3&<3dH=ls3Cph@FI@vr zHTg$ul8g8-fH%Z!t|szyA7YNSJd26}8AeJe_FA!N@|LijV(%53B6fe68!0w}t9XhZ zDesqJ6XX?#yx)rDVBrSNQXb2ZBd>{R(aXo?YT|_07i*wzRp_}Z zQf!jgy%2eK+23C-%}suMC|F*1tPTt66O zitdYfHE(Oh2_4jB;{X+}?)m@QzvTsP=z2|Tx_-5yR`&yoxB15D`Z-<4I1>XCkjZ@` z)^NgQua2hYH=Mc%q<+yTKZf;b?le|hU)u{LE)zBMm&ARi(R$L{gsf|!_6gtReYSbMVlBY zdGgB~Suf7W)m6V2bDuWQiw2m5h4jh3cAQ~K|x`93Ku*e1y$Vm zQGN%>mNBnV{BT5e@}>vfMGXqZ(sYiGnFU#m=h; zjCW>-io!lVoB~YEV`kci`kqYjgmA<&y(mZj$<5ej$Z=ZW{Y{29R`BxSKr|Zez5w{ zD@ELQpB$75ZKM3wafN_;+Xmzwz^5y`qUVjZ+~bUR$eq6RDA-E+q91ZjySa5E8gs>e gp*4Ksbt5}uuZ9(WB|DVkGH=Dt%8T$f@39v62A{-Ow*UYD literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoVehicle_PS.hlsl b/src/extras/shaders/neoVehicle_PS.hlsl new file mode 100644 index 00000000..fa030dd6 --- /dev/null +++ b/src/extras/shaders/neoVehicle_PS.hlsl @@ -0,0 +1,34 @@ +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; + float4 ReflColor : COLOR1; +}; + +sampler2D tex0 : register(s0); +sampler2D tex1 : register(s1); + +float4 fogColor : register(c0); + +float4 main(VS_out input) : COLOR +{ + float4 pass1 = input.Color; +//#ifdef TEX + pass1 *= tex2D(tex0, input.TexCoord0.xy); +//#endif + float3 envmap = tex2D(tex1, input.TexCoord1).rgb; + pass1.rgb = lerp(pass1.rgb, envmap, input.ReflColor.a); +// pass1.rgb = envmap; +// pass1.rgb *= input.ReflColor.a; + pass1.rgb = lerp(fogColor.rgb, pass1.rgb, input.TexCoord0.z); +// pass1.rgb += input.ReflColor.rgb * input.TexCoord0.z; + + float3 pass2 = input.ReflColor.rgb*input.TexCoord0.z; + + float4 color; + color.rgb = pass1.rgb*pass1.a + pass2; + color.a = pass1.a; + + return color; +} diff --git a/src/extras/shaders/neoVehicle_PS.inc b/src/extras/shaders/neoVehicle_PS.inc new file mode 100644 index 00000000..8b77cec2 --- /dev/null +++ b/src/extras/shaders/neoVehicle_PS.inc @@ -0,0 +1,42 @@ +static unsigned char neoVehicle_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x38, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x30, + 0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x31, + 0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32, + 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, + 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x07, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x03, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x0f, 0xa0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x01, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x01, 0x00, 0xe4, 0xb0, 0x01, 0x08, 0xe4, 0xa0, 0x42, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x01, 0x00, 0xe4, 0x81, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x90, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xff, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x12, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x00, 0x00, 0xaa, 0xb0, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x00, 0x00, 0xaa, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xff, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xff, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoVehicle_VS.cso b/src/extras/shaders/neoVehicle_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..6ea47987781830e57e2b921d98b1beed97b07841 GIT binary patch literal 1896 zcmZuxzi-r75dQ4lWS1o1@S~tWI_rdvOCq8q{E(6YLV`|LEYcm^c1YY_vKuVzu2=Q~ zLZWbbiY@49jD#q>5=wC`66KZo6H>UjF5PwbzL{rx7lBvKd-J_-X1@hz$$yiMd>DI5h8IjeB{v6$7d~Y2?^r#g@qXfIo9=px7d@9lXl1 z*NUAZwpGS^qu6;|#xFR@d8djkkhf9t{!^@u3VuXY^zymHRa`7;xte1)x!PDJmXyAC z6kA~>AJNEpj}<#h-tCgtQLM_^E|j&kdVhKC{;=U4JRM>@9$Qpkk&#Qqo=-x*z5k#! zHZe@gAn1My*J?%xn}ZQ;j^G)crW~*t1WsSKG}G(h6mnW;D>%^=>Gh0$^EtQ zsNp_(+S+di?ylb(cwKHbS2s3SH*amM-dJB>$M|<(W*$y#6l`w;(OvGh1>Z8b*yXcE z+=6o|nx>y0q!>B_&PetZ?#a_Vxe@QX?&r9#a8HaBhy3QqLK;`)>Z_f`j57k#sK9KV z1IbrdMX^jV_LsSx&*Ed^)|k6FI#b52MRo4Un~G73<`gq=B?e~^@mq~0h6Ra%$jM_E zJB^mnjG3F7VcW_{g-73dG*923^wUXCDX7B9^DK)N^O#~wU*;KORW(~jV%J%_oQeL6 zZu*Y(A2F8t8@_5Hr>6er-IV>nk?1s7O5I5;{Sr;or#jg;_FZbJtB!ecuF=tGualRJ zBoF6AUaI;zAGJ9X+DUBs=^Tr_z+M!+k-5!G^`^=_L(429(INesRV?`mt0|T#X0%D4 z)59g=SEqW)o=}ISx{A44n2msA@{#A56<_MiVjIVYCU51$!oSfL5X)=olQ~G=5u5r7 zJE5P+!}G(UUjF}3zWA7W#ct|ra#VAB+Q-Bcp5a)W0b>5YB)5oDXCFa4Aue~uQB87Z zSciO56}z0(HJEX9`jCX+bnsb&Ifw|71`A+IIHfSfY%xGd~IwQ(E Rp(biKy&~m=wU4q4_#bVzM_~W} literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoVehicle_VS.hlsl b/src/extras/shaders/neoVehicle_VS.hlsl new file mode 100644 index 00000000..de75e745 --- /dev/null +++ b/src/extras/shaders/neoVehicle_VS.hlsl @@ -0,0 +1,64 @@ +#include "standardConstants.h" + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float4 Prelight : COLOR0; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; + float4 ReflColor : COLOR1; +}; + +float3 eye : register(c41); +float4 reflProps : register(c42); +Light specLights[5] : register(c43); + + +#define fresnel (reflProps.x) +#define lightStrength (reflProps.y) // speclight alpha +#define shininess (reflProps.z) +#define specularity (reflProps.w) + +VS_out main(in VS_in input) +{ + VS_out output; + + output.Position = mul(combinedMat, input.Position); + float3 Vertex = mul(worldMat, input.Position).xyz; + float3 Normal = mul(normalMat, input.Normal); + float3 viewVec = normalize(eye - Vertex); + + output.TexCoord0.xy = input.TexCoord; + + output.Color = input.Prelight; + output.Color.rgb += ambientLight.rgb * surfAmbient*lightStrength; + + int i; + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse*lightStrength; + // PS2 clamps before material color + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + // reflect V along Normal + float3 uv2 = Normal*dot(viewVec, Normal)*2.0 - viewVec; + output.TexCoord1 = uv2.xy*0.5 + 0.5; + float b = 1.0 - saturate(dot(viewVec, Normal)); + output.ReflColor = float4(0.0, 0.0, 0.0, 1.0); + output.ReflColor.a = lerp(b*b*b*b*b, 1.0f, fresnel)*shininess; + + //Light mainLight = lights[0]; + for(i = 0; i < 5; i++) + output.ReflColor.xyz += DoDirLightSpec(specLights[i], Normal, viewVec, specLights[i].direction.w)*specularity*lightStrength; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/neoVehicle_VS.inc b/src/extras/shaders/neoVehicle_VS.inc new file mode 100644 index 00000000..37c5858d --- /dev/null +++ b/src/extras/shaders/neoVehicle_VS.inc @@ -0,0 +1,160 @@ +static unsigned char neoVehicle_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0xab, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x76, 0x02, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x0d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x6f, 0x02, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, + 0x01, 0x00, 0x3e, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x4c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x29, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x60, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, + 0x01, 0x00, 0x42, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x11, 0x00, 0x18, 0x00, 0x46, 0x00, 0xe0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf7, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x22, 0x00, + 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x24, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, + 0x01, 0x00, 0xaa, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x02, 0x00, 0x00, 0x02, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0xae, 0x00, + 0x4c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x36, 0x00, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x12, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x79, 0x65, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0x01, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x00, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x00, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0xab, + 0x9b, 0x01, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, + 0xa4, 0x01, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x03, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x00, 0xab, 0xab, 0xab, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x75, 0x6d, 0x44, 0x69, 0x72, 0x4c, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x00, 0xab, 0xab, 0xab, 0x00, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x72, 0x65, 0x66, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x73, 0x00, 0x73, 0x70, + 0x65, 0x63, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0xab, 0xab, 0xab, + 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x03, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, 0x50, 0x72, 0x6f, 0x70, + 0x73, 0x00, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x00, 0x76, + 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, + 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x0b, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x51, 0x00, 0x00, 0x05, + 0x3a, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x05, + 0x01, 0x00, 0x0f, 0xf0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, + 0x03, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0x55, 0x90, + 0x09, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x08, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x0a, 0x00, 0xe4, 0xa0, + 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x01, 0x80, 0x0d, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x2a, 0x00, 0x55, 0xa0, 0x03, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x08, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x26, 0x00, 0x00, 0x01, + 0x00, 0x00, 0xe4, 0xf0, 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xff, 0x80, 0x10, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x55, 0xa0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xb0, 0x03, 0x00, 0x00, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x03, 0x00, 0x01, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x13, 0x20, 0xe4, 0xa1, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0xa0, + 0x05, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0x00, 0x80, + 0x11, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x0d, 0x00, 0xaa, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, + 0x2a, 0x00, 0x55, 0xa0, 0x02, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x08, 0x80, 0x01, 0x00, 0xff, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xff, 0x90, 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x01, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x55, 0x90, 0x05, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x04, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, + 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, + 0x06, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x07, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0x90, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x81, 0x29, 0x00, 0xe4, 0xa0, + 0x24, 0x00, 0x00, 0x02, 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x06, 0x80, + 0x00, 0x00, 0xd0, 0x80, 0x01, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x06, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0xff, 0xa0, + 0x02, 0x00, 0xd0, 0x81, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x03, 0xe0, + 0x01, 0x00, 0xe9, 0x80, 0x3a, 0x00, 0x00, 0xa0, 0x3a, 0x00, 0x00, 0xa0, + 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x0b, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x0b, 0x00, 0xaa, 0xa0, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x81, 0x0b, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x02, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x02, 0x80, + 0x01, 0x00, 0x55, 0x80, 0x01, 0x00, 0x55, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x04, 0x80, 0x01, 0x00, 0x55, 0x80, 0x01, 0x00, 0x00, 0x81, + 0x0b, 0x00, 0xaa, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x55, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x01, 0x80, 0x2a, 0x00, 0x00, 0xa0, 0x01, 0x00, 0xaa, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x08, 0xd0, + 0x01, 0x00, 0x00, 0x80, 0x2a, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x0f, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x26, 0x00, 0x00, 0x01, + 0x01, 0x00, 0xe4, 0xf0, 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, + 0x01, 0x00, 0xff, 0x80, 0x0b, 0x00, 0x55, 0xa0, 0x2e, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x01, 0xb0, 0x02, 0x00, 0xff, 0x80, 0x02, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x2d, 0x20, 0xe4, 0xa1, + 0x00, 0x00, 0x00, 0xb0, 0x24, 0x00, 0x00, 0x02, 0x04, 0x00, 0x07, 0x80, + 0x03, 0x00, 0xe4, 0x80, 0x08, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0xff, 0x80, 0x0b, 0x00, 0x00, 0xa0, + 0x0a, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0xff, 0x80, + 0x0b, 0x00, 0xaa, 0xa0, 0x20, 0x00, 0x00, 0x04, 0x03, 0x00, 0x01, 0x80, + 0x02, 0x00, 0xff, 0x80, 0x2d, 0x20, 0xff, 0xa0, 0x00, 0x00, 0x00, 0xb0, + 0x05, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0x00, 0x80, + 0x2b, 0x20, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, 0x2a, 0x00, 0xff, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x07, 0x80, 0x03, 0x00, 0xe4, 0x80, + 0x2a, 0x00, 0x55, 0xa0, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x08, 0x80, 0x01, 0x00, 0xff, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0xd0, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xaa, 0xa0, + 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0xe0, + 0x00, 0x00, 0x00, 0x80, 0x0b, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x03, 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoVehicle_fs_gl3.inc b/src/extras/shaders/neoVehicle_fs_gl3.inc new file mode 100644 index 00000000..c75ba717 --- /dev/null +++ b/src/extras/shaders/neoVehicle_fs_gl3.inc @@ -0,0 +1,30 @@ +const char *neoVehicle_frag_src = +"uniform sampler2D tex0;\n" +"uniform sampler2D tex1;\n" + +"in vec4 v_color;\n" +"in vec4 v_reflcolor;\n" +"in vec2 v_tex0;\n" +"in vec2 v_tex1;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" vec3 envmap = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)).rgb;\n" +" pass1.rgb = mix(pass1.rgb, envmap, v_reflcolor.a);\n" +" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n" +"// pass1.rgb += v_reflcolor.rgb * v_fog;\n" + +" vec3 pass2 = v_reflcolor.rgb * v_fog;\n" + +" color.rgb = pass1.rgb*pass1.a + pass2;\n" +" color.a = pass1.a;\n" + +"// color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" +" DoAlphaTest(color.a);\n" +"}\n" +; diff --git a/src/extras/shaders/neoVehicle_vs_gl3.inc b/src/extras/shaders/neoVehicle_vs_gl3.inc new file mode 100644 index 00000000..268180e1 --- /dev/null +++ b/src/extras/shaders/neoVehicle_vs_gl3.inc @@ -0,0 +1,56 @@ +const char *neoVehicle_vert_src = +"uniform vec3 u_eye;\n" +"uniform vec4 u_reflProps;\n" +"uniform vec4 u_specDir[5];\n" +"uniform vec4 u_specColor[5];\n" + +"#define fresnel (u_reflProps.x)\n" +"#define lightStrength (u_reflProps.y) // speclight alpha\n" +"#define shininess (u_reflProps.z)\n" +"#define specularity (u_reflProps.w)\n" + +"layout(location = 0) in vec3 in_pos;\n" +"layout(location = 1) in vec3 in_normal;\n" +"layout(location = 2) in vec4 in_color;\n" +"layout(location = 3) in vec2 in_tex0;\n" + +"out vec4 v_color;\n" +"out vec4 v_reflcolor;\n" +"out vec2 v_tex0;\n" +"out vec2 v_tex1;\n" +"out float v_fog;\n" + +"vec3 DoDirLightSpec(vec3 Ldir, vec3 Lcol, vec3 N, vec3 V, float power)\n" +"{\n" +" return pow(clamp(dot(N, normalize(V + -Ldir)), 0.0, 1.0), power)*Lcol;\n" +"}\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * in_normal;\n" +" vec3 viewVec = normalize(u_eye - Vertex.xyz);\n" + +" v_tex0 = in_tex0;\n" + +" v_color = in_color;\n" +" v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse*lightStrength;\n" +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" // reflect V along Normal\n" +" vec3 uv2 = Normal*dot(viewVec, Normal)*2.0 - viewVec;\n" +" v_tex1 = uv2.xy*0.5 + 0.5;\n" +" float b = 1.0 - clamp(dot(viewVec, Normal), 0.0, 1.0);\n" +" v_reflcolor = vec4(0.0, 0.0, 0.0, 1.0);\n" +" v_reflcolor.a = mix(b*b*b*b*b, 1.0f, fresnel)*shininess;\n" + +" for(int i = 0; i < 5; i++)\n" +" v_reflcolor.rgb += DoDirLightSpec(u_specDir[i].xyz, u_specColor[i].rgb, Normal, viewVec, u_specDir[i].w)*specularity*lightStrength;\n" + +" v_fog = DoFog(gl_Position.w);\n" +"}\n" +; diff --git a/src/extras/shaders/neoWorldVC.frag b/src/extras/shaders/neoWorldVC.frag new file mode 100644 index 00000000..0270f305 --- /dev/null +++ b/src/extras/shaders/neoWorldVC.frag @@ -0,0 +1,25 @@ +uniform sampler2D tex0; +uniform sampler2D tex1; + +uniform vec4 u_lightMap; + +in vec4 v_color; +in vec2 v_tex0; +in vec2 v_tex1; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)); + + color = t0*v_color*(1 + u_lightMap*(t1-1)); + color.a = v_color.a*t0.a*u_lightMap.a; + + color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); + DoAlphaTest(color.a); +} + diff --git a/src/extras/shaders/neoWorldVC_PS.cso b/src/extras/shaders/neoWorldVC_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..5e8d1696022396caf423d020cf0dd63ff623e8ba GIT binary patch literal 524 zcmZ8dJ5Iwu6r6P&>;lObK*A+75e}kA10tcI2n7V{2tk}!aRTOSbbUJ90q{iwHJeUz2;hS*rgaRpu%_4Nk=9{? zz!sj20zA`OG{O6|)!vQPm)n5j1F zniDUvN~itl0WPAuM5Z!a`+HaW{`q(^_9u(m`&r_T0o1cP3G&>I}}dxt>~pu7aS z7Q6z;K4~XyOYAn!$N(?@#ZI-s{D%$B;d(`@=Yn`>R^?>^btT-|Z~>3K>I&rC4_E1E zo)H&(2c1iNQ*iJ699>)JIH0mF^F^cSnp|_8FBoIoaEn~$Qv2IO=WBb>eJwNdt!lMq MuIq7bohb$U09gxOJpcdz literal 0 HcmV?d00001 diff --git a/src/extras/shaders/neoWorldVC_PS.hlsl b/src/extras/shaders/neoWorldVC_PS.hlsl new file mode 100644 index 00000000..fc4f1de9 --- /dev/null +++ b/src/extras/shaders/neoWorldVC_PS.hlsl @@ -0,0 +1,25 @@ +sampler2D Diffuse : register(s0); +sampler2D Light : register(s1); +float4 fogColor : register(c0); +float4 lm : register(c1); + +struct PS_INPUT +{ + float4 Color : COLOR0; + float3 Tex0 : TEXCOORD0; + float2 Tex1 : TEXCOORD1; +}; + +float4 +main(PS_INPUT IN) : COLOR +{ + float4 t0 = tex2D(Diffuse, IN.Tex0.xy); + float4 t1 = tex2D(Light, IN.Tex1); + + float4 col = t0*IN.Color*(1 + lm*(t1-1)); + col.a = IN.Color.a*t0.a*lm.a; + + col.rgb = lerp(fogColor.rgb, col.rgb, IN.Tex0.z); + + return col; +} diff --git a/src/extras/shaders/neoWorldVC_PS.inc b/src/extras/shaders/neoWorldVC_PS.inc new file mode 100644 index 00000000..eb8bf2ee --- /dev/null +++ b/src/extras/shaders/neoWorldVC_PS.inc @@ -0,0 +1,46 @@ +static unsigned char neoWorldVC_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x3e, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xbb, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x69, 0x66, 0x66, 0x75, 0x73, 0x65, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6d, 0x00, 0x70, 0x73, 0x5f, 0x32, 0x5f, + 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, + 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, + 0x31, 0x31, 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, 0x02, 0x00, 0x0f, 0xa0, + 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x07, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x03, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x0f, 0xa0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, + 0x01, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x01, 0x00, 0xe4, 0xb0, 0x01, 0x08, 0xe4, 0xa0, 0x42, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x02, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, + 0x02, 0x00, 0x55, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xff, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x90, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0x80, + 0x01, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x08, 0x80, 0x00, 0x00, 0xff, 0x80, 0x01, 0x00, 0xff, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0xa1, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x00, 0x00, 0xaa, 0xb0, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/neoWorldVC_fs_gl3.inc b/src/extras/shaders/neoWorldVC_fs_gl3.inc new file mode 100644 index 00000000..c861d334 --- /dev/null +++ b/src/extras/shaders/neoWorldVC_fs_gl3.inc @@ -0,0 +1,27 @@ +const char *neoWorldVC_frag_src = +"uniform sampler2D tex0;\n" +"uniform sampler2D tex1;\n" + +"uniform vec4 u_lightMap;\n" + +"in vec4 v_color;\n" +"in vec2 v_tex0;\n" +"in vec2 v_tex1;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 t0 = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" vec4 t1 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n" + +" color = t0*v_color*(1 + u_lightMap*(t1-1));\n" +" color.a = v_color.a*t0.a*u_lightMap.a;\n" + +" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" +" DoAlphaTest(color.a);\n" +"}\n" + +; diff --git a/src/extras/shaders/simple.frag b/src/extras/shaders/simple.frag new file mode 100644 index 00000000..87157beb --- /dev/null +++ b/src/extras/shaders/simple.frag @@ -0,0 +1,16 @@ +uniform sampler2D tex0; + +in vec4 v_color; +in vec2 v_tex0; +in float v_fog; + +out vec4 color; + +void +main(void) +{ + color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); + DoAlphaTest(color.a); +} + diff --git a/src/extras/shaders/simple_fs_gl3.inc b/src/extras/shaders/simple_fs_gl3.inc new file mode 100644 index 00000000..47d89971 --- /dev/null +++ b/src/extras/shaders/simple_fs_gl3.inc @@ -0,0 +1,18 @@ +const char *simple_frag_src = +"uniform sampler2D tex0;\n" + +"in vec4 v_color;\n" +"in vec2 v_tex0;\n" +"in float v_fog;\n" + +"out vec4 color;\n" + +"void\n" +"main(void)\n" +"{\n" +" color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" +" DoAlphaTest(color.a);\n" +"}\n" + +; diff --git a/src/extras/shaders/standardConstants.h b/src/extras/shaders/standardConstants.h new file mode 100644 index 00000000..088df7dd --- /dev/null +++ b/src/extras/shaders/standardConstants.h @@ -0,0 +1,28 @@ +float4x4 combinedMat : register(c0); +float4x4 worldMat : register(c4); +float3x3 normalMat : register(c8); +float4 matCol : register(c12); +float4 surfProps : register(c13); +float4 fogData : register(c14); +float4 ambientLight : register(c15); + +#define surfAmbient (surfProps.x) +#define surfSpecular (surfProps.y) +#define surfDiffuse (surfProps.z) + +#define fogStart (fogData.x) +#define fogEnd (fogData.y) +#define fogRange (fogData.z) +#define fogDisable (fogData.w) + +#include "lighting.h" + +int numDirLights : register(i0); +int numPointLights : register(i1); +int numSpotLights : register(i2); +int4 firstLight : register(c16); +Light lights[8] : register(c17); + +#define firstDirLight (firstLight.x) +#define firstPointLight (firstLight.y) +#define firstSpotLight (firstLight.z) diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp index 8d07737f..e4758a96 100644 --- a/src/modelinfo/PedModelInfo.cpp +++ b/src/modelinfo/PedModelInfo.cpp @@ -8,6 +8,7 @@ #include "NodeName.h" #include "VisibilityPlugins.h" #include "ModelInfo.h" +#include "custompipes.h" //--MIAMI: file done @@ -39,6 +40,9 @@ RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = { void CPedModelInfo::SetClump(RpClump *clump) { +#ifdef EXTENDED_PIPELINES + CustomPipes::AttachRimPipe(clump); +#endif CClumpModelInfo::SetClump(clump); SetFrameIds(m_pPedIds); // not needed in VC actually if(m_hitColModel == nil) diff --git a/src/modelinfo/SimpleModelInfo.cpp b/src/modelinfo/SimpleModelInfo.cpp index a7e6d56c..2e6e557e 100644 --- a/src/modelinfo/SimpleModelInfo.cpp +++ b/src/modelinfo/SimpleModelInfo.cpp @@ -4,6 +4,7 @@ #include "Camera.h" #include "ModelInfo.h" #include "AnimManager.h" +#include "custompipes.h" //--MIAMI: file done @@ -88,6 +89,13 @@ CSimpleModelInfo::SetAtomic(int n, RpAtomic *atomic) if(RpGeometryGetFlags(geo) & rpGEOMETRYNORMALS && RpGeometryGetNumTriangles(geo) > 200) debug("%s has %d polys\n", m_name, RpGeometryGetNumTriangles(geo)); + +#ifdef EXTENDED_PIPELINES + if(m_wetRoadReflection) + CustomPipes::AttachGlossPipe(atomic); + else + CustomPipes::AttachWorldPipe(atomic); +#endif } void diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp index 11f78495..68673458 100644 --- a/src/modelinfo/VehicleModelInfo.cpp +++ b/src/modelinfo/VehicleModelInfo.cpp @@ -19,6 +19,7 @@ #include "Bike.h" #include "ModelIndices.h" #include "ModelInfo.h" +#include "custompipes.h" //--MIAMI: done @@ -1124,6 +1125,10 @@ CVehicleModelInfo::SetEnvironmentMap(void) for(i = 0; i < wheelmi->m_numAtomics; i++) SetEnvironmentMapCB(wheelmi->m_atomics[i], nil); } + +#ifdef EXTENDED_PIPELINES + CustomPipes::AttachVehiclePipe(m_clump); +#endif } void diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 66c12dd9..a6673135 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -21,6 +21,7 @@ #include "PointLights.h" #include "Occlusion.h" #include "Renderer.h" +#include "custompipes.h" //--MIAMI: file done @@ -243,6 +244,11 @@ CRenderer::RenderEverythingBarRoads(void) if(IsRoad(e)) continue; +#ifdef EXTENDED_PIPELINES + if(CustomPipes::bRenderingEnvMap && (e->IsPed() || e->IsVehicle())) + continue; +#endif + if(e->IsVehicle() || e->IsPed() && CVisibilityPlugins::GetClumpAlpha((RpClump*)e->m_rwObject) != 255){ if(e->IsVehicle() && PutIntoSortedVehicleList((CVehicle*)e)){ diff --git a/src/rw/Lights.h b/src/rw/Lights.h index 6fdd51de..b296816b 100644 --- a/src/rw/Lights.h +++ b/src/rw/Lights.h @@ -1,5 +1,11 @@ #pragma once +extern RpLight *pAmbient; +extern RpLight *pDirect; +extern RpLight *pExtraDirectionals[4]; +extern int LightStrengths[4]; +extern int NumExtraDirLightsInWorld; + void SetLightsWithTimeOfDayColour(RpWorld *); RpWorld *LightsCreate(RpWorld *world); void LightsDestroy(RpWorld *world); diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp index ac80eff0..36a60117 100644 --- a/src/rw/VisibilityPlugins.cpp +++ b/src/rw/VisibilityPlugins.cpp @@ -9,6 +9,7 @@ #include "Camera.h" #include "VisibilityPlugins.h" #include "World.h" +#include "custompipes.h" //--MIAMI: file done @@ -193,6 +194,10 @@ CVisibilityPlugins::RenderFadingEntities(CLinkList &list) CEntity *e = node->item.entity; if(e->m_rwObject == nil) continue; +#ifdef EXTENDED_PIPELINES + if(CustomPipes::bRenderingEnvMap && (e->IsPed() || e->IsVehicle())) + continue; +#endif mi = (CSimpleModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()); if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite) RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); From 895055a3d1538eb10dcb19c182b0a008c26bdce3 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 16:53:11 +0200 Subject: [PATCH 078/112] update librw; fix txd.img bug --- src/rw/TexRead.cpp | 5 +++++ vendor/librw | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 4087029b..0c07b9f5 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -289,6 +289,11 @@ CreateTxdImageForVideoCard() ConvertingTexturesScreen(i, TXDSTORESIZE, "CVT_MSG"); if (CTxdStore::GetSlot(i) != nil && CStreaming::IsObjectInCdImage(i + STREAM_OFFSET_TXD)) { +#ifdef FIX_BUGS + if(strcmp(CTxdStore::GetTxdName(i), "generic") == 0) + continue; +#endif + CStreaming::RequestTxd(i, STREAMFLAGS_KEEP_IN_MEMORY); CStreaming::RequestModelStream(0); CStreaming::FlushChannels(); diff --git a/vendor/librw b/vendor/librw index a78a0239..93c246b6 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit a78a02394e4c528a2ade867dfd0ffe04e32ec474 +Subproject commit 93c246b6b1137dba0cb7ed096b5f6d8ac8e8396f From c2e20070ab0fc95e4aacc88098aa49a18fc96afb Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 16:54:09 +0200 Subject: [PATCH 079/112] txd.img bug --- src/extras/custompipes.cpp | 1 + src/rw/TexRead.cpp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index fb529b47..79254eb4 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -525,6 +525,7 @@ SetTxdFindCallback(void) CTxdStore::AddRef(slot); // TODO: function for this genericTxd = CTxdStore::GetSlot(slot)->texDict; + assert(genericTxd); if(defaultFindCB == nil) defaultFindCB = rw::Texture::findCB; rw::Texture::findCB = customFindCB; diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 122ce655..0ef260b1 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -289,6 +289,11 @@ CreateTxdImageForVideoCard() ConvertingTexturesScreen(i, TXDSTORESIZE, "CVT_MSG"); if (CTxdStore::GetSlot(i) != nil && CStreaming::IsObjectInCdImage(i + STREAM_OFFSET_TXD)) { +#ifdef FIX_BUGS + if(strcmp(CTxdStore::GetTxdName(i), "generic") == 0) + continue; +#endif + CStreaming::RequestTxd(i, STREAMFLAGS_KEEP_IN_MEMORY); CStreaming::RequestModelStream(0); CStreaming::FlushChannels(); From bd30d0a79638f58df08e4e47d91bce29d442326b Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 20:49:43 +0200 Subject: [PATCH 080/112] update librw --- vendor/librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/librw b/vendor/librw index 93c246b6..fbb2d35f 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 93c246b6b1137dba0cb7ed096b5f6d8ac8e8396f +Subproject commit fbb2d35fc4b5eb1a1f0b9a74fb77d5d9b218dbb6 From c1367ebdca003fae508aaf34355064897945c591 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 20:50:26 +0200 Subject: [PATCH 081/112] update librw --- vendor/librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/librw b/vendor/librw index 93c246b6..fbb2d35f 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 93c246b6b1137dba0cb7ed096b5f6d8ac8e8396f +Subproject commit fbb2d35fc4b5eb1a1f0b9a74fb77d5d9b218dbb6 From bb948904b69d6a4c49c0a0fadd69e867292b1d9e Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 19 Aug 2020 21:58:00 +0200 Subject: [PATCH 082/112] small stuff --- src/core/ColStore.cpp | 1 - src/core/SurfaceTable.cpp | 8 ++++++++ src/core/SurfaceTable.h | 1 + src/entities/Entity.cpp | 2 +- src/render/Shadows.cpp | 2 +- src/render/Shadows.h | 2 +- src/vehicles/Bike.cpp | 11 ++++------- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/core/ColStore.cpp b/src/core/ColStore.cpp index 070967e5..bca1e9b7 100644 --- a/src/core/ColStore.cpp +++ b/src/core/ColStore.cpp @@ -223,7 +223,6 @@ CColStore::EnsureCollisionIsInMemory(const CVector2D &pos) } } -//--MIAMI: done bool CColStore::HasCollisionLoaded(const CVector2D &pos) { diff --git a/src/core/SurfaceTable.cpp b/src/core/SurfaceTable.cpp index 9076a9a6..56cea203 100644 --- a/src/core/SurfaceTable.cpp +++ b/src/core/SurfaceTable.cpp @@ -6,6 +6,8 @@ #include "Collision.h" #include "SurfaceTable.h" +//--MIAMI: file done + float CSurfaceTable::ms_aAdhesiveLimitTable[NUMADHESIVEGROUPS][NUMADHESIVEGROUPS]; void @@ -148,3 +150,9 @@ CSurfaceTable::GetAdhesiveLimit(CColPoint &colpoint) { return ms_aAdhesiveLimitTable[GetAdhesionGroup(colpoint.surfaceB)][GetAdhesionGroup(colpoint.surfaceA)]; } + +bool +CSurfaceTable::IsSoftLanding(uint8 surf) +{ + return surf == SURFACE_GRASS || surf == SURFACE_SAND || surf == SURFACE_SAND_BEACH; +} diff --git a/src/core/SurfaceTable.h b/src/core/SurfaceTable.h index 359ebd5c..cd08c843 100644 --- a/src/core/SurfaceTable.h +++ b/src/core/SurfaceTable.h @@ -96,4 +96,5 @@ public: static int GetAdhesionGroup(uint8 surfaceType); static float GetWetMultiplier(uint8 surfaceType); static float GetAdhesiveLimit(CColPoint &colpoint); + static bool IsSoftLanding(uint8 surf); }; diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index b27284bc..cf1dd9e7 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -33,7 +33,7 @@ #include "WindModifiers.h" #include "Occlusion.h" -//--MIAMI: file almost done (see TODO) +//--MIAMI: file done int gBuildings; diff --git a/src/render/Shadows.cpp b/src/render/Shadows.cpp index 5bb6a734..a964ceb6 100644 --- a/src/render/Shadows.cpp +++ b/src/render/Shadows.cpp @@ -715,7 +715,7 @@ CShadows::StoreShadowForVehicle(CVehicle *pCar, VEH_SHD_TYPE type) } void -CShadows::StoreCarLightShadow(CAutomobile *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, +CShadows::StoreCarLightShadow(CVehicle *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle) { diff --git a/src/render/Shadows.h b/src/render/Shadows.h index 94b2981f..937ff4eb 100644 --- a/src/render/Shadows.h +++ b/src/render/Shadows.h @@ -159,7 +159,7 @@ public: static void StoreShadowToBeRendered ( uint8 ShadowType, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue); static void StoreShadowToBeRendered ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, bool bDrawOnWater, float fScale, CCutsceneShadow *pShadow, bool bDrawOnBuildings); static void StoreShadowForVehicle (CVehicle *pCar, VEH_SHD_TYPE type); - static void StoreCarLightShadow (CAutomobile *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle); + static void StoreCarLightShadow (CVehicle *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle); static void StoreShadowForPed (CPed *pPed, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY); static void StoreShadowForPedObject (CEntity *pPedObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY); static void StoreShadowForCutscenePedObject(CCutsceneObject *pObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY); diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index c32e72bc..760a8ec6 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -1448,16 +1448,13 @@ CBike::PreRender(void) fwd.Normalise(); float f = headLightPos.y + 6.0f; pos += CVector(f*fwd.x, f*fwd.y, 2.0f); - -// TODO(MIAMI): -// CShadows::StoreCarLightShadow(this, (uintptr)this + 22, gpShadowExplosionTex, &pos, -// 7.0f*fwd.x, 7.0f*fwd.y, 3.5f*fwd.y, -3.5f*fwd.x, 45, 45, 45, 7.0f); + CShadows::StoreCarLightShadow(this, (uintptr)this + 22, gpShadowExplosionTex, &pos, + 7.0f*fwd.x, 7.0f*fwd.y, 3.5f*fwd.y, -3.5f*fwd.x, 45, 45, 45, 7.0f); f = (tailLightPos.y - 2.5f) - (headLightPos.y + 6.0f); pos += CVector(f*fwd.x, f*fwd.y, 0.0f); -// TODO(MIAMI): -// CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowExplosionTex, &pos, -// 3.0f, 0.0f, 0.0f, -3.0f, 35, 0, 0, 4.0f); + CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowExplosionTex, &pos, + 3.0f, 0.0f, 0.0f, -3.0f, 35, 0, 0, 4.0f); } if(this == FindPlayerVehicle() && !alarmOff){ From 30dadcfb22d49d6f8059b214071f28c6e6a399b2 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 10:23:43 +0200 Subject: [PATCH 083/112] transmission done --- src/vehicles/Transmission.cpp | 78 ++++++++++++++++------------------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/src/vehicles/Transmission.cpp b/src/vehicles/Transmission.cpp index 5287055d..cc994ac6 100644 --- a/src/vehicles/Transmission.cpp +++ b/src/vehicles/Transmission.cpp @@ -4,6 +4,8 @@ #include "HandlingMgr.h" #include "Transmission.h" +//--MIAMI: done + void cTransmission::InitGearRatios(void) { @@ -80,59 +82,51 @@ cTransmission::CalculateDriveAcceleration(const float &gasPedal, uint8 &gear, fl if(fVelocity > pGearRatio->fShiftUpVelocity){ if(gear != 0 || gasPedal > 0.0f){ gear++; - time = 0.0f; return CalculateDriveAcceleration(gasPedal, gear, time, fVelocity, false); } }else if(fVelocity < pGearRatio->fShiftDownVelocity && gear != 0){ if(gear != 1 || gasPedal < 0.0f){ gear--; - time = 0.0f; return CalculateDriveAcceleration(gasPedal, gear, time, fVelocity, false); } } - if(time > 0.0f){ - // changing gears currently, can't accelerate - fAcceleration = 0.0f; - time -= CTimer::GetTimeStepInSeconds(); + float speedMul, accelMul; + + if(gear < 1){ + // going reverse + accelMul = (Flags & HANDLING_2G_BOOST) ? 2.0f : 1.0f; + speedMul = -1.0f; + }else if(nNumberOfGears == 1){ + accelMul = 1.0f; + speedMul = 1.0f; }else{ - float speedMul, accelMul; - - if(gear < 1){ - // going reverse - accelMul = (Flags & HANDLING_2G_BOOST) ? 2.0f : 1.0f; - speedMul = -1.0f; - }else if(nNumberOfGears == 1){ - accelMul = 1.0f; - speedMul = 1.0f; - }else{ - // BUG or not? this is 1.0 normally but 0.0 in the highest gear - float f = 1.0f - (gear-1)/(nNumberOfGears-1); - speedMul = 3.0f*sq(f) + 1.0f; - // This is pretty ugly, could be written more clearly - if(Flags & HANDLING_2G_BOOST){ - if(gear == 1) - accelMul = (Flags & HANDLING_1G_BOOST) ? 3.0f : 2.0f; - else if(gear == 2) - accelMul = 1.3f; - else - accelMul = 1.0f; - }else if(Flags & HANDLING_1G_BOOST && gear == 1){ - accelMul = 3.0f; - }else + // BUG or not? this is 1.0 normally but 0.0 in the highest gear + float f = 1.0f - (gear-1)/(nNumberOfGears-1); + speedMul = 3.0f*sq(f) + 1.0f; + // This is pretty ugly, could be written more clearly + if(Flags & HANDLING_2G_BOOST){ + if(gear == 1) + accelMul = (Flags & HANDLING_1G_BOOST) ? 2.0f : 1.6f; + else if(gear == 2) + accelMul = 1.3f; + else accelMul = 1.0f; - } - - if(cheat) - fCheat = 1.2f; - else - fCheat = 1.0f; - float targetVelocity = Gears[gear].fMaxVelocity*speedMul*fCheat; - float accel = fEngineAcceleration*accelMul * (targetVelocity - fVelocity)/Abs(targetVelocity); - if(Abs(fVelocity) < Abs(Gears[gear].fMaxVelocity*fCheat)) - fAcceleration = gasPedal * accel * CTimer::GetTimeStep(); - else - fAcceleration = 0.0f; + }else if(Flags & HANDLING_1G_BOOST && gear == 1){ + accelMul = 2.0f; + }else + accelMul = 1.0f; } + + if(cheat) + fCheat = 1.2f; + else + fCheat = 1.0f; + float targetVelocity = Gears[gear].fMaxVelocity*speedMul*fCheat; + float accel = fEngineAcceleration*accelMul * (targetVelocity - fVelocity)/Abs(targetVelocity); + if(Abs(fVelocity) < Abs(Gears[gear].fMaxVelocity*fCheat)) + fAcceleration = gasPedal * accel * CTimer::GetTimeStep(); + else + fAcceleration = 0.0f; return fAcceleration; } From 764af8735c00a7f40a51f605fed3c73ce6413337 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 12:53:17 +0200 Subject: [PATCH 084/112] rw stuff done & other small things --- src/core/Collision.cpp | 12 ++++++++++++ src/core/Collision.h | 3 ++- src/core/Pools.cpp | 24 +++++++++++++++--------- src/core/Pools.h | 3 +++ src/core/config.h | 10 +++++----- src/core/main.cpp | 6 ++++++ src/core/main.h | 3 +++ src/core/templates.h | 4 +--- src/rw/ClumpRead.cpp | 1 + src/rw/Lights.cpp | 11 ++++++++++- src/rw/NodeName.cpp | 4 ++-- src/rw/RwHelper.cpp | 37 ++++++------------------------------- src/rw/RwHelper.h | 6 ++---- src/rw/TexRead.cpp | 27 +++++++++++++++++++++++++-- src/rw/TxdStore.cpp | 16 ++++++---------- 15 files changed, 99 insertions(+), 68 deletions(-) diff --git a/src/core/Collision.cpp b/src/core/Collision.cpp index c2037dc5..91e7bba7 100644 --- a/src/core/Collision.cpp +++ b/src/core/Collision.cpp @@ -3049,6 +3049,18 @@ CColModel::GetTrianglePoint(CVector &v, int i) const v = vertices[i].Get(); } +void* +CColModel::operator new(size_t){ + CColModel *node = CPools::GetColModelPool()->New(); + assert(node); + return node; +} + +void +CColModel::operator delete(void *p, size_t){ + CPools::GetColModelPool()->Delete((CColModel*)p); +} + CColModel& CColModel::operator=(const CColModel &other) { diff --git a/src/core/Collision.h b/src/core/Collision.h index fd079028..93959a72 100644 --- a/src/core/Collision.h +++ b/src/core/Collision.h @@ -181,7 +181,6 @@ struct CStoredCollPoly bool valid; }; -//--MIAMI: done struct struct CColModel { CSphere boundingSphere; @@ -208,6 +207,8 @@ struct CColModel void SetLinkPtr(CLink*); void GetTrianglePoint(CVector &v, int i) const; + void *operator new(size_t); + void operator delete(void *p, size_t); CColModel& operator=(const CColModel& other); }; diff --git a/src/core/Pools.cpp b/src/core/Pools.cpp index 6e3799f4..fe2cf7ad 100644 --- a/src/core/Pools.cpp +++ b/src/core/Pools.cpp @@ -22,21 +22,25 @@ CTreadablePool *CPools::ms_pTreadablePool; CObjectPool *CPools::ms_pObjectPool; CDummyPool *CPools::ms_pDummyPool; CAudioScriptObjectPool *CPools::ms_pAudioScriptObjectPool; +CColModelPool *CPools::ms_pColModelPool; +//--MIAMI: done void CPools::Initialise(void) { - ms_pPtrNodePool = new CCPtrNodePool(NUMPTRNODES); - ms_pEntryInfoNodePool = new CEntryInfoNodePool(NUMENTRYINFOS); - ms_pPedPool = new CPedPool(NUMPEDS); - ms_pVehiclePool = new CVehiclePool(NUMVEHICLES); - ms_pBuildingPool = new CBuildingPool(NUMBUILDINGS); - ms_pTreadablePool = new CTreadablePool(NUMTREADABLES); - ms_pObjectPool = new CObjectPool(NUMOBJECTS); - ms_pDummyPool = new CDummyPool(NUMDUMMIES); - ms_pAudioScriptObjectPool = new CAudioScriptObjectPool(NUMAUDIOSCRIPTOBJECTS); + ms_pPtrNodePool = new CCPtrNodePool(NUMPTRNODES, "PtrNode"); + ms_pEntryInfoNodePool = new CEntryInfoNodePool(NUMENTRYINFOS, "EntryInfoNode"); + ms_pPedPool = new CPedPool(NUMPEDS, "Peds"); + ms_pVehiclePool = new CVehiclePool(NUMVEHICLES, "Vehicles"); + ms_pBuildingPool = new CBuildingPool(NUMBUILDINGS, "Buildings"); + ms_pTreadablePool = new CTreadablePool(NUMTREADABLES, "Treadables"); + ms_pObjectPool = new CObjectPool(NUMOBJECTS, "Objects"); + ms_pDummyPool = new CDummyPool(NUMDUMMIES, "Dummys"); + ms_pAudioScriptObjectPool = new CAudioScriptObjectPool(NUMAUDIOSCRIPTOBJECTS, "AudioScriptObj"); + ms_pColModelPool = new CColModelPool(NUMCOLMODELS, "ColModel"); } +//--MIAMI: done void CPools::ShutDown(void) { @@ -49,6 +53,7 @@ CPools::ShutDown(void) debug("Objects left %d\n", ms_pObjectPool->GetNoOfUsedSpaces()); debug("Dummys left %d\n", ms_pDummyPool->GetNoOfUsedSpaces()); debug("AudioScriptObjects left %d\n", ms_pAudioScriptObjectPool->GetNoOfUsedSpaces()); + debug("ColModels left %d\n", ms_pColModelPool->GetNoOfUsedSpaces()); printf("Shutdown pool started\n"); delete ms_pPtrNodePool; @@ -60,6 +65,7 @@ CPools::ShutDown(void) delete ms_pObjectPool; delete ms_pDummyPool; delete ms_pAudioScriptObjectPool; + delete ms_pColModelPool; printf("Shutdown pool done\n"); } diff --git a/src/core/Pools.h b/src/core/Pools.h index 2f0537ff..afef1b85 100644 --- a/src/core/Pools.h +++ b/src/core/Pools.h @@ -19,6 +19,7 @@ typedef CPool CTreadablePool; typedef CPool CObjectPool; typedef CPool CDummyPool; typedef CPool CAudioScriptObjectPool; +typedef CPool CColModelPool; class CPools { @@ -31,6 +32,7 @@ class CPools static CObjectPool *ms_pObjectPool; static CDummyPool *ms_pDummyPool; static CAudioScriptObjectPool *ms_pAudioScriptObjectPool; + static CColModelPool *ms_pColModelPool; public: static CCPtrNodePool *GetPtrNodePool(void) { return ms_pPtrNodePool; } static CEntryInfoNodePool *GetEntryInfoNodePool(void) { return ms_pEntryInfoNodePool; } @@ -41,6 +43,7 @@ public: static CObjectPool *GetObjectPool(void) { return ms_pObjectPool; } static CDummyPool *GetDummyPool(void) { return ms_pDummyPool; } static CAudioScriptObjectPool *GetAudioScriptObjectPool(void) { return ms_pAudioScriptObjectPool; } + static CColModelPool *GetColModelPool(void) { return ms_pColModelPool; } static void Initialise(void); static void ShutDown(void); diff --git a/src/core/config.h b/src/core/config.h index efdb5c8c..1cd9ca6c 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -27,16 +27,16 @@ enum Config { // Pool sizes NUMPTRNODES = 50000, - NUMENTRYINFOS = 5400, // only 3200 in VC??? + NUMENTRYINFOS = 3200, NUMPEDS = 140, NUMVEHICLES = 110, NUMBUILDINGS = 7000, - NUMTREADABLES = 1214, // 1 in VC + NUMTREADABLES = 1, NUMOBJECTS = 460, - NUMDUMMIES = 2802, // 2340 in VC - NUMAUDIOSCRIPTOBJECTS = 256, // 192 in VC + NUMDUMMIES = 2340, + NUMAUDIOSCRIPTOBJECTS = 192, + NUMCOLMODELS = 4400, NUMCUTSCENEOBJECTS = 50, // does not exist in VC - // TODO(MIAMI): colmodel pool NUMANIMBLOCKS = 35, NUMANIMATIONS = 450, diff --git a/src/core/main.cpp b/src/core/main.cpp index 27f6abd9..7a25daac 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -3,6 +3,9 @@ #include "rphanim.h" #include "rpskin.h" #include "rtbmp.h" +#ifndef LIBRW +#include "rpanisot.h" +#endif #include "main.h" #include "CdStream.h" @@ -384,6 +387,9 @@ PluginAttach(void) return FALSE; } +#ifndef LIBRW + RpAnisotPluginAttach(); +#endif #ifdef EXTENDED_PIPELINES CustomPipes::CustomPipeRegister(); #endif diff --git a/src/core/main.h b/src/core/main.h index 9ad4ed1c..96fbef05 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -20,6 +20,9 @@ extern bool gbShowTimebars; class CSprite2d; +bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); +bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); +void DoRWStuffEndOfFrame(void); void InitialiseGame(void); void LoadingScreen(const char *str1, const char *str2, const char *splashscreen); void LoadingIslandScreen(const char *levelName); diff --git a/src/core/templates.h b/src/core/templates.h index 465e3bef..9f5bd5ea 100644 --- a/src/core/templates.h +++ b/src/core/templates.h @@ -45,7 +45,7 @@ class CPool public: // TODO(MIAMI): remove ctor without name argument - CPool(int size){ + CPool(int size, const char *name){ // TODO: use new here m_entries = (U*)malloc(sizeof(U)*size); m_flags = (Flags*)malloc(sizeof(Flags)*size); @@ -56,8 +56,6 @@ public: m_flags[i].free = 1; } } - CPool(int size, const char *name) - : CPool(size) {} ~CPool() { Flush(); } diff --git a/src/rw/ClumpRead.cpp b/src/rw/ClumpRead.cpp index 5f50f52d..b8d72d23 100644 --- a/src/rw/ClumpRead.cpp +++ b/src/rw/ClumpRead.cpp @@ -1,5 +1,6 @@ #include "common.h" +//--MIAMI: done struct rpGeometryList { diff --git a/src/rw/Lights.cpp b/src/rw/Lights.cpp index c5038232..3657e2c7 100644 --- a/src/rw/Lights.cpp +++ b/src/rw/Lights.cpp @@ -10,6 +10,8 @@ #include "Frontend.h" #include "MBlur.h" +//--MIAMI: done + RpLight *pAmbient; RpLight *pDirect; RpLight *pExtraDirectionals[4] = { nil }; @@ -30,7 +32,6 @@ RwRGBAReal DirectionalLightColour; #define USEBLURCOLORS CMBlur::BlurOn #endif -//--MIAMI: done void SetLightsWithTimeOfDayColour(RpWorld *) { @@ -309,6 +310,14 @@ ActivateDirectional(void) RpLightSetFlags(pDirect, rpLIGHTLIGHTATOMICS); } +RwRGBAReal FullLight = { 1.0f, 1.0f, 1.0f, 1.0f }; + +void +SetFullAmbient(void) +{ + RpLightSetColor(pAmbient, &FullLight); +} + void SetAmbientColours(void) { diff --git a/src/rw/NodeName.cpp b/src/rw/NodeName.cpp index ad4acffb..a7185e4f 100644 --- a/src/rw/NodeName.cpp +++ b/src/rw/NodeName.cpp @@ -50,8 +50,8 @@ NodeNameStreamWrite(RwStream *stream, RwInt32 binaryLength, const void *object, RwInt32 NodeNameStreamGetSize(const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) { - // game checks for null pointer on node name extension but that really happen - return (RwInt32)rwstrlen(NODENAMEEXT(object)); + char *name = NODENAMEEXT(object); // can't be nil + return name ? (RwInt32)rwstrlen(name) : 0; } bool diff --git a/src/rw/RwHelper.cpp b/src/rw/RwHelper.cpp index 58791ce2..9633e56c 100644 --- a/src/rw/RwHelper.cpp +++ b/src/rw/RwHelper.cpp @@ -209,24 +209,11 @@ GetFirstTexture(RwTexDictionary *txd) return tex; } -#ifdef PED_SKIN -static RpAtomic* -isSkinnedCb(RpAtomic *atomic, void *data) -{ - RpAtomic **pAtomic = (RpAtomic**)data; - if(*pAtomic) - return nil; // already found one - if(RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic))) - *pAtomic = atomic; // we could just return nil here directly... - return atomic; -} - -RpAtomic* +bool IsClumpSkinned(RpClump *clump) { - RpAtomic *atomic = nil; - RpClumpForAllAtomics(clump, isSkinnedCb, &atomic); - return atomic; + RpAtomic *atomic = GetFirstAtomic(clump); + return atomic ? RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic)) : nil; } static RpAtomic* @@ -264,17 +251,6 @@ GetAnimHierarchyFromClump(RpClump *clump) return hier; } -RwFrame* -GetHierarchyFromChildNodesCB(RwFrame *frame, void *data) -{ - RpHAnimHierarchy **pHier = (RpHAnimHierarchy**)data; - RpHAnimHierarchy *hier = RpHAnimFrameGetHierarchy(frame); - if(hier == nil) - RwFrameForAllChildren(frame, GetHierarchyFromChildNodesCB, &hier); - *pHier = hier; - return nil; -} - void SkinGetBonePositionsToTable(RpClump *clump, RwV3d *boneTable) { @@ -290,8 +266,7 @@ SkinGetBonePositionsToTable(RpClump *clump, RwV3d *boneTable) if(boneTable == nil) return; -// atomic = GetFirstAtomic(clump); // mobile, also VC - atomic = IsClumpSkinned(clump); // xbox, seems safer + atomic = GetFirstAtomic(clump); // mobile, also VC assert(atomic); skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic)); assert(skin); @@ -397,7 +372,6 @@ RenderSkeleton(RpHAnimHierarchy *hier) par = stack[--sp]; } } -#endif RwBool Im2DRenderQuad(RwReal x1, RwReal y1, RwReal x2, RwReal y2, RwReal z, RwReal recipCamZ, RwReal uvOffset) @@ -560,6 +534,7 @@ CameraSize(RwCamera * camera, RwRect * rect, } } + // BUG: game just changes camera raster's sizes, but this is a hack if (( origSize.w != rect->w ) && ( origSize.h != rect->h )) { RwRaster *raster; @@ -844,4 +819,4 @@ RestoreAlphaTest() RwD3D8SetRenderState(D3DRS_ALPHAREF, saved_alpharef); #endif } -#endif \ No newline at end of file +#endif diff --git a/src/rw/RwHelper.h b/src/rw/RwHelper.h index 3f1a3d19..cbcbb2e0 100644 --- a/src/rw/RwHelper.h +++ b/src/rw/RwHelper.h @@ -18,16 +18,13 @@ RwObject *GetFirstObject(RwFrame *frame); RpAtomic *GetFirstAtomic(RpClump *clump); RwTexture *GetFirstTexture(RwTexDictionary *txd); -#ifdef PED_SKIN -RpAtomic *IsClumpSkinned(RpClump *clump); +bool IsClumpSkinned(RpClump *clump); RpHAnimHierarchy *GetAnimHierarchyFromSkinClump(RpClump *clump); // get from atomic RpHAnimHierarchy *GetAnimHierarchyFromClump(RpClump *clump); // get from frame -RwFrame *GetHierarchyFromChildNodesCB(RwFrame *frame, void *data); void SkinGetBonePositionsToTable(RpClump *clump, RwV3d *boneTable); RpHAnimAnimation *HAnimAnimationCreateForHierarchy(RpHAnimHierarchy *hier); RpAtomic *AtomicRemoveAnimFromSkinCB(RpAtomic *atomic, void *data); void RenderSkeleton(RpHAnimHierarchy *hier); -#endif RwBool Im2DRenderQuad(RwReal x1, RwReal y1, RwReal x2, RwReal y2, RwReal z, RwReal recipCamZ, RwReal uvOffset); RpClump *RpClumpGetBoundingSphere(RpClump *clump, RwSphere *sphere, bool useLTM); @@ -38,6 +35,7 @@ RwTexDictionary *RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary void ReadVideoCardCapsFile(uint32&, uint32&, uint32&, uint32&); bool CheckVideoCardCaps(void); void WriteVideoCardCapsFile(void); +bool CanVideoCardDoDXT(void); void ConvertingTexturesScreen(uint32, uint32, const char*); void DealWithTxdWriteError(uint32, uint32, const char*); bool CreateTxdImageForVideoCard(); diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 0c07b9f5..3199307b 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -1,7 +1,11 @@ #pragma warning( push ) #pragma warning( disable : 4005) #pragma warning( pop ) +#define WITHD3D #include "common.h" +#ifndef LIBRW +#include "rpanisot.h" +#endif #include "crossplatform.h" #include "platform.h" @@ -47,6 +51,15 @@ RwTextureGtaStreamRead(RwStream *stream) texLoadTime = (texNumLoaded * texLoadTime + (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerMillisecond() - preloadTime) / (float)(texNumLoaded+1); texNumLoaded++; } + + if(tex == nil) + return nil; + +#ifndef LIBRW + if(RpAnisotTextureGetMaxAnisotropy(tex) > 1) + RpAnisotTextureSetMaxAnisotropy(tex, RpAnisotTextureGetMaxAnisotropy(tex)); +#endif + return tex; } @@ -152,6 +165,7 @@ RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary *texDict) #ifdef GTA_PC #ifdef RWLIBS extern "C" RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags); +extern "C" RwBool _rwD3D8CheckValidTextureFormat(RwInt32 format); #else RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags); #endif @@ -202,8 +216,16 @@ WriteVideoCardCapsFile(void) } } -bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); -void DoRWStuffEndOfFrame(void); +bool +CanVideoCardDoDXT(void) +{ +#ifdef LIBRW + // TODO + return true; +#else + return _rwD3D8CheckValidTextureFormat(D3DFMT_DXT1) && _rwD3D8CheckValidTextureFormat(D3DFMT_DXT3); +#endif +} void ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) @@ -229,6 +251,7 @@ ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) CFont::SetBackgroundOff(); CFont::SetPropOn(); CFont::SetScale(SCREEN_SCALE_X(0.45f), SCREEN_SCALE_Y(0.7f)); + CFont::SetCentreOff(); CFont::SetWrapx(SCREEN_SCALE_FROM_RIGHT(170.0f)); CFont::SetJustifyOff(); CFont::SetColor(CRGBA(255, 217, 106, 255)); diff --git a/src/rw/TxdStore.cpp b/src/rw/TxdStore.cpp index 51d018f6..0bd29718 100644 --- a/src/rw/TxdStore.cpp +++ b/src/rw/TxdStore.cpp @@ -13,7 +13,7 @@ void CTxdStore::Initialise(void) { if(ms_pTxdPool == nil) - ms_pTxdPool = new CPool(TXDSTORESIZE); + ms_pTxdPool = new CPool(TXDSTORESIZE, "TexDictionary"); } void @@ -58,11 +58,10 @@ CTxdStore::RemoveTxdSlot(int slot) int CTxdStore::FindTxdSlot(const char *name) { - char *defname; int size = ms_pTxdPool->GetSize(); for(int i = 0; i < size; i++){ - defname = GetTxdName(i); - if(defname && !CGeneral::faststricmp(defname, name)) + TxdDef *def = GetSlot(i); + if(def && !CGeneral::faststricmp(def->name, name)) return i; } return -1; @@ -71,8 +70,7 @@ CTxdStore::FindTxdSlot(const char *name) char* CTxdStore::GetTxdName(int slot) { - TxdDef *def = GetSlot(slot); - return def ? def->name : nil; + return GetSlot(slot)->name; } void @@ -91,9 +89,7 @@ CTxdStore::PopCurrentTxd(void) void CTxdStore::SetCurrentTxd(int slot) { - TxdDef *def = GetSlot(slot); - if(def) - RwTexDictionarySetCurrent(def->texDict); + RwTexDictionarySetCurrent(GetSlot(slot)->texDict); } void @@ -118,7 +114,7 @@ void CTxdStore::RemoveRef(int slot) { if(--GetSlot(slot)->refCount <= 0) - CStreaming::RemoveModel(slot + STREAM_OFFSET_TXD); + CStreaming::RemoveTxd(slot); } void From 517e2ee9a5fa6f9100378cdcb24a3acd68c01f89 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 12:55:41 +0200 Subject: [PATCH 085/112] small fixes --- src/core/main.h | 3 +++ src/rw/NodeName.cpp | 4 ++-- src/rw/TexRead.cpp | 3 --- src/rw/TxdStore.cpp | 14 +++++--------- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/core/main.h b/src/core/main.h index 9ad4ed1c..96fbef05 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -20,6 +20,9 @@ extern bool gbShowTimebars; class CSprite2d; +bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); +bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); +void DoRWStuffEndOfFrame(void); void InitialiseGame(void); void LoadingScreen(const char *str1, const char *str2, const char *splashscreen); void LoadingIslandScreen(const char *levelName); diff --git a/src/rw/NodeName.cpp b/src/rw/NodeName.cpp index ad4acffb..a7185e4f 100644 --- a/src/rw/NodeName.cpp +++ b/src/rw/NodeName.cpp @@ -50,8 +50,8 @@ NodeNameStreamWrite(RwStream *stream, RwInt32 binaryLength, const void *object, RwInt32 NodeNameStreamGetSize(const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject) { - // game checks for null pointer on node name extension but that really happen - return (RwInt32)rwstrlen(NODENAMEEXT(object)); + char *name = NODENAMEEXT(object); // can't be nil + return name ? (RwInt32)rwstrlen(name) : 0; } bool diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 0ef260b1..33d9a4cb 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -202,9 +202,6 @@ WriteVideoCardCapsFile(void) } } -bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); -void DoRWStuffEndOfFrame(void); - void ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) { diff --git a/src/rw/TxdStore.cpp b/src/rw/TxdStore.cpp index 51d018f6..a9e29729 100644 --- a/src/rw/TxdStore.cpp +++ b/src/rw/TxdStore.cpp @@ -58,11 +58,10 @@ CTxdStore::RemoveTxdSlot(int slot) int CTxdStore::FindTxdSlot(const char *name) { - char *defname; int size = ms_pTxdPool->GetSize(); for(int i = 0; i < size; i++){ - defname = GetTxdName(i); - if(defname && !CGeneral::faststricmp(defname, name)) + TxdDef *def = GetSlot(i); + if(def && !CGeneral::faststricmp(def->name, name)) return i; } return -1; @@ -71,8 +70,7 @@ CTxdStore::FindTxdSlot(const char *name) char* CTxdStore::GetTxdName(int slot) { - TxdDef *def = GetSlot(slot); - return def ? def->name : nil; + return GetSlot(slot)->name; } void @@ -91,9 +89,7 @@ CTxdStore::PopCurrentTxd(void) void CTxdStore::SetCurrentTxd(int slot) { - TxdDef *def = GetSlot(slot); - if(def) - RwTexDictionarySetCurrent(def->texDict); + RwTexDictionarySetCurrent(GetSlot(slot)->texDict); } void @@ -118,7 +114,7 @@ void CTxdStore::RemoveRef(int slot) { if(--GetSlot(slot)->refCount <= 0) - CStreaming::RemoveModel(slot + STREAM_OFFSET_TXD); + CStreaming::RemoveTxd(slot); } void From 7da4f7fc35196381f94331dbfeb2812e3af7eda7 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 13:20:48 +0200 Subject: [PATCH 086/112] fixed sound enum --- src/audio/soundlist.h | 6 +++--- src/peds/PedChat.cpp | 6 +++--- src/vehicles/Automobile.cpp | 11 +++++------ src/vehicles/Bike.cpp | 9 ++++----- src/vehicles/Boat.cpp | 2 +- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/audio/soundlist.h b/src/audio/soundlist.h index 2a5b83cf..bc9ac09a 100644 --- a/src/audio/soundlist.h +++ b/src/audio/soundlist.h @@ -146,9 +146,9 @@ enum eSound : uint16 SOUND_PED_LEAVE_VEHICLE, SOUND_PED_EVADE, SOUND_PED_FLEE_RUN, - SOUND_PED_CAR_COLLISION, - SOUND_PED_BOAT_COLLISION, - SOUND_PED_HORN_ACTIVE, + SOUND_PED_CRASH_VEHICLE, + SOUND_PED_CRASH_CAR, + SOUND_PED_ANNOYED_DRIVER, SOUND_PED_147, SOUND_PED_SOLICIT, SOUND_PED_149, diff --git a/src/peds/PedChat.cpp b/src/peds/PedChat.cpp index 4480a8cd..73a8e59c 100644 --- a/src/peds/PedChat.cpp +++ b/src/peds/PedChat.cpp @@ -131,9 +131,9 @@ CPed::Say(uint16 audio) case SOUND_PED_FLEE_SPRINT: case SOUND_PED_TAXI_WAIT: case SOUND_PED_EVADE: - case SOUND_PED_CAR_COLLISION: - case SOUND_PED_BOAT_COLLISION: - case SOUND_PED_HORN_ACTIVE: + case SOUND_PED_CRASH_VEHICLE: + case SOUND_PED_CRASH_CAR: + case SOUND_PED_ANNOYED_DRIVER: break; default: return; diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index 44e0b044..eec44c35 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -49,7 +49,7 @@ #include "Object.h" #include "Automobile.h" -//--MIAMI: file done except TODOs +//--MIAMI: file done bool bAllCarCheat; @@ -4210,12 +4210,11 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece) pDriver && m_pDamageEntity && m_pDamageEntity->IsVehicle() && (this != FindPlayerVehicle() || ((CVehicle*)m_pDamageEntity)->VehicleCreatedBy == MISSION_VEHICLE) && -// TODO(MIAMI): enum ((CVehicle*)m_pDamageEntity)->pDriver){ if(GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR) - pDriver->Say(145); + pDriver->Say(SOUND_PED_CRASH_CAR); else - pDriver->Say(144); + pDriver->Say(SOUND_PED_CRASH_VEHICLE); } int oldHealth = m_fHealth; @@ -4944,11 +4943,11 @@ CAutomobile::PlayCarHorn(void) m_nCarHornTimer = 45; }else if(r < 4){ if(pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); m_nCarHornTimer = 45; }else{ if(pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); } } diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index 760a8ec6..62aeface 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -37,7 +37,7 @@ #include "Bike.h" #include "Debug.h" -//--MIAMI: done except for TODOs +//--MIAMI: file done // TODO: maybe put this somewhere else inline void @@ -2134,8 +2134,7 @@ CBike::VehicleDamage(void) m_pDamageEntity && m_pDamageEntity->IsVehicle() && (this != FindPlayerVehicle() || ((CVehicle*)m_pDamageEntity)->VehicleCreatedBy == MISSION_VEHICLE) && ((CVehicle*)m_pDamageEntity)->pDriver) -// TODO(MIAMI): enum - pDriver->Say(144); + pDriver->Say(SOUND_PED_CRASH_VEHICLE); int oldHealth = m_fHealth; if(this == FindPlayerVehicle()) @@ -2542,11 +2541,11 @@ CBike::PlayCarHorn(void) m_nCarHornTimer = 45; }else if(r < 4){ if(pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); m_nCarHornTimer = 45; }else{ if(pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); } } diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index ae437f56..086a5002 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -242,7 +242,7 @@ CBoat::ProcessControl(void) m_fHealth -= (collisionDamage-25.0f)/2.0f; }else{ if(collisionDamage > 60.0f && pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); if(bTakeLessDamage) m_fHealth -= (collisionDamage-25.0f)/12.0f; else From a9a1bf5056c6853a51b9c14ba74a8c4e82227849 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 13:21:08 +0200 Subject: [PATCH 087/112] changed a sound enum --- src/audio/AudioLogic.cpp | 112 ++++++++++++++++++------------------ src/audio/soundlist.h | 2 +- src/peds/PedChat.cpp | 2 +- src/vehicles/Automobile.cpp | 6 +- src/vehicles/Boat.cpp | 2 +- 5 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 7c7e96d2..8546f255 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -4169,7 +4169,7 @@ cAudioManager::GetNormalMaleTalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_NORMAL_MALE_RUN_FROM_FIGHT_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_NORMAL_MALE_DRIVER_ABUSE_1, 12); break; case SOUND_PED_CHAT_SEXY: @@ -4197,7 +4197,7 @@ cAudioManager::GetTaxiDriverTalkSfx(int16 sound) case SOUND_PED_CAR_JACKED: GetPhrase(&sfx, &lastSfx, SFX_ASIAN_TAXI_DRIVER_VOICE_1_CARJACKED_1, 7); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_ASIAN_TAXI_DRIVER_VOICE_1_DRIVER_ABUSE_1, 6); break; default: @@ -4226,7 +4226,7 @@ cAudioManager::GetPimpTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_PIMP_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_PIMP_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_EVENT: @@ -4260,7 +4260,7 @@ cAudioManager::GetMafiaTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_MAFIA_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_MAFIA_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -4297,7 +4297,7 @@ cAudioManager::GetTriadTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_TRIAD_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_TRIAD_MALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_SEXY: @@ -4338,7 +4338,7 @@ cAudioManager::GetDiabloTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_DIABLO_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_DIABLO_MALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_SEXY: @@ -4372,7 +4372,7 @@ cAudioManager::GetYakuzaTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_YAKUZA_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_YAKUZA_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT: @@ -4406,7 +4406,7 @@ cAudioManager::GetYardieTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_YARDIE_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_YARDIE_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -4440,7 +4440,7 @@ cAudioManager::GetColumbianTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_COLUMBIAN_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_COLUMBIAN_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -4477,7 +4477,7 @@ cAudioManager::GetHoodTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_HOOD_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_HOOD_MALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_SEXY: @@ -4516,7 +4516,7 @@ cAudioManager::GetBlackCriminalTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_CRIMINAL_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_CRIMINAL_VOICE_1_DRIVER_ABUSE_1, 5); break; default: @@ -4548,7 +4548,7 @@ cAudioManager::GetWhiteCriminalTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_CRIMINAL_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_CRIMINAL_VOICE_1_DRIVER_ABUSE_1, 4); break; default: @@ -4577,7 +4577,7 @@ cAudioManager::GetMaleNo2TalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_CASUAL_MALE_OLD_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_CASUAL_MALE_OLD_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_SEXY: @@ -4614,7 +4614,7 @@ cAudioManager::GetBlackProjectMaleTalkSfx(int16 sound, int32 model) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROJECT_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROJECT_MALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_SEXY: @@ -4647,7 +4647,7 @@ cAudioManager::GetWhiteFatMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_FAT_MALE_VOICE_1_DODGE_1, 9); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_FAT_MALE_VOICE_1_DRIVER_ABUSE_1, 9); break; case SOUND_PED_WAIT_DOUBLEBACK: @@ -4677,7 +4677,7 @@ cAudioManager::GetBlackFatMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_FAT_MALE_VOICE_1_DODGE_1, 7); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_FAT_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_WAIT_DOUBLEBACK: @@ -4714,7 +4714,7 @@ cAudioManager::GetBlackCasualFemaleTalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_FEMALE_1_VOICE_1_RUN_FROM_FIGHT_1, 2); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_FEMALE_1_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -4751,7 +4751,7 @@ cAudioManager::GetWhiteCasualFemaleTalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_WHITE_CASUAL_FEMALE_VOICE_1_RUN_FROM_FIGHT_1, 2); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_CASUAL_FEMALE_VOICE_1_DRIVER_ABUSE_1, 8); break; case SOUND_PED_CHAT_EVENT: @@ -4788,7 +4788,7 @@ cAudioManager::GetFemaleNo3TalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_FEMALE_3_VOICE_1_RUN_FROM_FIGHT_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_FEMALE_3_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_EVENT: @@ -4822,7 +4822,7 @@ cAudioManager::GetBlackFatFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_FAT_FEMALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_FAT_FEMALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_EVENT: @@ -4853,7 +4853,7 @@ cAudioManager::GetWhiteFatFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_FAT_FEMALE_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_FAT_FEMALE_VOICE_1_DRIVER_ABUSE_1, 8); break; case SOUND_PED_WAIT_DOUBLEBACK: @@ -4890,7 +4890,7 @@ cAudioManager::GetBlackFemaleProstituteTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROSTITUTE_VOICE_1_DODGE_1, 3); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROSTITUTE_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_SOLICIT: @@ -4921,7 +4921,7 @@ cAudioManager::GetWhiteFemaleProstituteTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_PROSTITUTE_VOICE_1_DODGE_1, 3); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_PROSTITUTE_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_SOLICIT: @@ -4955,7 +4955,7 @@ cAudioManager::GetBlackProjectFemaleOldTalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROJECT_FEMALE_OLD_VOICE_1_RUN_FROM_FIGHT_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROJECT_FEMALE_OLD_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -4989,7 +4989,7 @@ cAudioManager::GetBlackProjectFemaleYoungTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROJECT_FEMALE_YOUNG_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_PROJECT_FEMALE_YOUNG_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_EVENT: @@ -5023,7 +5023,7 @@ cAudioManager::GetChinatownMaleOldTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_MALE_OLD_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_MALE_OLD_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -5057,7 +5057,7 @@ cAudioManager::GetChinatownMaleYoungTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_MALE_YOUNG_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_MALE_YOUNG_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -5088,7 +5088,7 @@ cAudioManager::GetChinatownFemaleOldTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_OLD_FEMALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_OLD_FEMALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_EVENT: @@ -5119,7 +5119,7 @@ cAudioManager::GetChinatownFemaleYoungTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_YOUNG_FEMALE_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_CHINATOWN_YOUNG_FEMALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -5156,7 +5156,7 @@ cAudioManager::GetLittleItalyMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_LITTLE_ITALY_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_LITTLE_ITALY_MALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT: @@ -5184,7 +5184,7 @@ cAudioManager::GetLittleItalyFemaleOldTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_LITTLE_ITALY_OLD_FEMALE_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_LITTLE_ITALY_OLD_FEMALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -5215,7 +5215,7 @@ cAudioManager::GetLittleItalyFemaleYoungTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_LITTLE_ITALY_YOUNG_FEMALE_VOICE_1_DODGE_1, 7); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_LITTLE_ITALY_YOUNG_FEMALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_EVENT: @@ -5246,7 +5246,7 @@ cAudioManager::GetWhiteDockerMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_DOCKER_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_DOCKER_MALE_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_CHAT_SEXY: @@ -5277,7 +5277,7 @@ cAudioManager::GetBlackDockerMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_DOCKER_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_DOCKER_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -5311,7 +5311,7 @@ cAudioManager::GetScumMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_SCUM_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_SCUM_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_WAIT_DOUBLEBACK: @@ -5348,7 +5348,7 @@ cAudioManager::GetScumFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_SCUM_FEMALE_VOICE_1_DODGE_1, 8); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_SCUM_FEMALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT: @@ -5376,7 +5376,7 @@ cAudioManager::GetWhiteWorkerMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_WORKER_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_WORKER_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -5407,7 +5407,7 @@ cAudioManager::GetBlackWorkerMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_WORKER_MALE_VOICE_1_DODGE_1, 3); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_WORKER_MALE_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_CHAT_SEXY: @@ -5447,7 +5447,7 @@ cAudioManager::GetBusinessMaleYoungTalkSfx(int16 sound, int32 model) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_BUSINESS_MALE_YOUNG_VOICE_1_RUN_FROM_FIGHT_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BUSINESS_MALE_YOUNG_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT: @@ -5487,7 +5487,7 @@ cAudioManager::GetBusinessMaleOldTalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_BUSINESS_MALE_OLD_VOICE_1_MRUN_FROM_FIGHT_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BUSINESS_MALE_OLD_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT: @@ -5521,7 +5521,7 @@ cAudioManager::GetWhiteBusinessFemaleTalkSfx(int16 sound, int32 model) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_WHITE_BUSINESS_FEMALE_VOICE_1_RUN_FROM_FIGHT_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_BUSINESS_FEMALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_EVENT: @@ -5561,7 +5561,7 @@ cAudioManager::GetBlackBusinessFemaleTalkSfx(int16 sound) case SOUND_PED_FLEE_RUN: GetPhrase(&sfx, &lastSfx, SFX_BLACK_BUSINESS_FEMALE_VOICE_1_RUN_FROM_FIGHT_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_BUSINESS_FEMALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -5595,7 +5595,7 @@ cAudioManager::GetSupermodelMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_MODEL_MALE_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_MODEL_MALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT_SEXY: @@ -5626,7 +5626,7 @@ cAudioManager::GetSupermodelFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_MODEL_FEMALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_MODEL_FEMALE_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -5657,7 +5657,7 @@ cAudioManager::GetStewardMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_STEWARD_MALE_VOICE_1_DODGE_1, 3); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_STEWARD_MALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT: @@ -5682,7 +5682,7 @@ cAudioManager::GetStewardFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_STEWARD_FEMALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_STEWARD_FEMALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT: @@ -5707,7 +5707,7 @@ cAudioManager::GetFanMaleTalkSfx(int16 sound, int32 model) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_FOOTBALL_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_FOOTBALL_MALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_EVENT: @@ -5738,7 +5738,7 @@ cAudioManager::GetFanFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_FOOTBALL_FEMALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_FOOTBALL_FEMALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_EVENT: @@ -5769,7 +5769,7 @@ cAudioManager::GetHospitalMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_HOSPITAL_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_HOSPITAL_MALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT: @@ -5791,7 +5791,7 @@ cAudioManager::GetHospitalFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_HOSPITAL_FEMALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_HOSPITAL_FEMALE_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_CHAT: @@ -5822,7 +5822,7 @@ cAudioManager::GetWhiteConstructionWorkerTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_WHITE_MALE_CONSTRUCTION_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_WHITE_MALE_CONSTRUCTION_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_CHAT_SEXY: @@ -5856,7 +5856,7 @@ cAudioManager::GetBlackConstructionWorkerTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_BLACK_CONSTRUCTION_MALE_VOICE_1_DODGE_1, 5); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_BLACK_CONSTRUCTION_MALE_VOICE_1_DRIVER_ABUSE_1, 5); break; case SOUND_PED_CHAT_SEXY: @@ -5887,7 +5887,7 @@ cAudioManager::GetShopperFemaleTalkSfx(int16 sound, int32 model) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_SHOPPER_VOICE_1_DODGE_1, 6); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_SHOPPER_VOICE_1_DRIVER_ABUSE_1, 7); break; case SOUND_PED_CHAT_EVENT: @@ -5927,7 +5927,7 @@ cAudioManager::GetStudentMaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_STUDENT_MALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_STUDENT_MALE_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_CHAT_EVENT: @@ -5961,7 +5961,7 @@ cAudioManager::GetStudentFemaleTalkSfx(int16 sound) case SOUND_PED_EVADE: GetPhrase(&sfx, &lastSfx, SFX_STUDENT_FEMALE_VOICE_1_DODGE_1, 4); break; - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_STUDENT_FEMALE_VOICE_1_DRIVER_ABUSE_1, 4); break; case SOUND_PED_CHAT_EVENT: @@ -6141,7 +6141,7 @@ cAudioManager::GetSecurityGuardTalkSfx(int16 sound) sfx = SFX_SECURITY_GUARD_VOICE_1_GUN_PANIC_1; break; case SOUND_PED_CAR_JACKED: - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: GetPhrase(&sfx, &lastSfx, SFX_SECURITY_GUARD_VOICE_1_DRIVER_ABUSE_1, 6); break; case SOUND_PED_ATTACK: diff --git a/src/audio/soundlist.h b/src/audio/soundlist.h index 856b691a..225ed56e 100644 --- a/src/audio/soundlist.h +++ b/src/audio/soundlist.h @@ -129,7 +129,7 @@ enum eSound : uint16 SOUND_PED_LEAVE_VEHICLE, SOUND_PED_EVADE, SOUND_PED_FLEE_RUN, - SOUND_PED_CAR_COLLISION, + SOUND_PED_ANNOYED_DRIVER, SOUND_PED_SOLICIT, SOUND_PED_EXTINGUISHING_FIRE, SOUND_PED_WAIT_DOUBLEBACK, diff --git a/src/peds/PedChat.cpp b/src/peds/PedChat.cpp index 9045a2e0..65ed67a5 100644 --- a/src/peds/PedChat.cpp +++ b/src/peds/PedChat.cpp @@ -134,7 +134,7 @@ CPed::Say(uint16 audio) case SOUND_PED_FLEE_SPRINT: case SOUND_PED_TAXI_WAIT: case SOUND_PED_EVADE: - case SOUND_PED_CAR_COLLISION: + case SOUND_PED_ANNOYED_DRIVER: break; default: return; diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index d2fedbd5..66452477 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -3413,7 +3413,7 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece) m_fHealth -= bTakeLessDamage ? damage/6.0f : damage/2.0f; }else{ if(damage > 35.0f && pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); m_fHealth -= bTakeLessDamage ? damage/12.0f : damage/4.0f; } if(m_fHealth <= 0.0f && oldHealth > 0) @@ -4047,11 +4047,11 @@ CAutomobile::PlayCarHorn(void) m_nCarHornTimer = 45; }else if(r < 4){ if(pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); m_nCarHornTimer = 45; }else{ if(pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); } } diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index 50117690..c248b54c 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -197,7 +197,7 @@ CBoat::ProcessControl(void) m_fHealth -= (collisionDamage-25.0f)/2.0f; }else{ if(collisionDamage > 60.0f && pDriver) - pDriver->Say(SOUND_PED_CAR_COLLISION); + pDriver->Say(SOUND_PED_ANNOYED_DRIVER); if(bTakeLessDamage) m_fHealth -= (collisionDamage-25.0f)/12.0f; else From 0f5a77129225e2ff6587941dc11661b175df1f15 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 20 Aug 2020 14:47:53 +0300 Subject: [PATCH 088/112] Fix cAudioScriptObject --- src/audio/AudioScriptObject.cpp | 10 ++++++++++ src/audio/AudioScriptObject.h | 3 +++ src/audio/DMAudio.cpp | 4 ++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/audio/AudioScriptObject.cpp b/src/audio/AudioScriptObject.cpp index 69d80fbc..ac30f757 100644 --- a/src/audio/AudioScriptObject.cpp +++ b/src/audio/AudioScriptObject.cpp @@ -4,6 +4,16 @@ #include "Pools.h" #include "DMAudio.h" +cAudioScriptObject::cAudioScriptObject() +{ + Reset(); +}; + +cAudioScriptObject::~cAudioScriptObject() +{ + Reset(); +}; + void cAudioScriptObject::Reset() { diff --git a/src/audio/AudioScriptObject.h b/src/audio/AudioScriptObject.h index ff36474d..8110b2bb 100644 --- a/src/audio/AudioScriptObject.h +++ b/src/audio/AudioScriptObject.h @@ -7,6 +7,9 @@ public: CVector Posn; int32 AudioEntity; + cAudioScriptObject(); + ~cAudioScriptObject(); + void Reset(); /// ok static void* operator new(size_t); diff --git a/src/audio/DMAudio.cpp b/src/audio/DMAudio.cpp index dd55f76d..9d278046 100644 --- a/src/audio/DMAudio.cpp +++ b/src/audio/DMAudio.cpp @@ -203,7 +203,7 @@ cDMAudio::ReportCrime(eCrimeType crime, const CVector &pos) int32 cDMAudio::CreateLoopingScriptObject(cAudioScriptObject *scriptObject) { - int32 audioEntity = AudioManager.CreateEntity(AUDIOTYPE_SCRIPTOBJECT, (CPhysical *)scriptObject); + int32 audioEntity = AudioManager.CreateEntity(AUDIOTYPE_SCRIPTOBJECT, scriptObject); if ( AEHANDLE_IS_OK(audioEntity) ) AudioManager.SetEntityStatus(audioEntity, true); @@ -220,7 +220,7 @@ cDMAudio::DestroyLoopingScriptObject(int32 audioEntity) void cDMAudio::CreateOneShotScriptObject(cAudioScriptObject *scriptObject) { - int32 audioEntity = AudioManager.CreateEntity(AUDIOTYPE_SCRIPTOBJECT, (CPhysical *)scriptObject); + int32 audioEntity = AudioManager.CreateEntity(AUDIOTYPE_SCRIPTOBJECT, scriptObject); if ( AEHANDLE_IS_OK(audioEntity) ) { From b5ccc721ae73d9cf62480ae5f20c3439a9572fb5 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 20 Aug 2020 19:40:35 +0300 Subject: [PATCH 089/112] Add VEHICLE_FIREWEAPON (disabled by default) --- src/core/ControllerConfig.cpp | 48 +++++++++++++++++++++++++++++++++-- src/core/ControllerConfig.h | 3 +++ src/core/Frontend.cpp | 6 ++++- src/core/config.h | 1 + 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp index fe1821c2..4a901d17 100644 --- a/src/core/ControllerConfig.cpp +++ b/src/core/ControllerConfig.cpp @@ -208,7 +208,10 @@ void CControllerConfigManager::InitDefaultControlConfiguration() SetControllerKeyAssociatedWithAction (PED_FIREWEAPON, rsPADINS, KEYBOARD); SetControllerKeyAssociatedWithAction (PED_FIREWEAPON, rsLCTRL, OPTIONAL_EXTRA); - +#ifdef BIND_VEHICLE_FIREWEAPON + SetControllerKeyAssociatedWithAction (VEHICLE_FIREWEAPON, rsPADINS, KEYBOARD); + SetControllerKeyAssociatedWithAction (VEHICLE_FIREWEAPON, rsLCTRL, OPTIONAL_EXTRA); +#endif SetControllerKeyAssociatedWithAction (PED_CYCLE_WEAPON_LEFT, rsPADDEL, KEYBOARD); SetControllerKeyAssociatedWithAction (PED_CYCLE_WEAPON_RIGHT, rsPADENTER, OPTIONAL_EXTRA); // BUG: must be KEYBOARD ? @@ -276,6 +279,9 @@ void CControllerConfigManager::InitDefaultControlConfigMouse(CMouseControllerSta { m_bMouseAssociated = true; SetMouseButtonAssociatedWithAction(PED_FIREWEAPON, 1); +#ifdef BIND_VEHICLE_FIREWEAPON + SetMouseButtonAssociatedWithAction(VEHICLE_FIREWEAPON, 1); +#endif } if (availableButtons.RMB) @@ -361,6 +367,9 @@ void CControllerConfigManager::InitDefaultControlConfigJoyPad(uint32 buttons) SetControllerKeyAssociatedWithAction(PED_SNIPER_ZOOM_OUT, 3, JOYSTICK); case 2: SetControllerKeyAssociatedWithAction(PED_FIREWEAPON, 2, JOYSTICK); +#ifdef BIND_VEHICLE_FIREWEAPON + SetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, 2, JOYSTICK); +#endif case 1: SetControllerKeyAssociatedWithAction(VEHICLE_ENTER_EXIT, 1, JOYSTICK); /*******************************************************************************************/ @@ -411,6 +420,9 @@ void CControllerConfigManager::InitDefaultControlConfigJoyPad(uint32 buttons) SetControllerKeyAssociatedWithAction(PED_SNIPER_ZOOM_OUT, 2, JOYSTICK); case 1: SetControllerKeyAssociatedWithAction(PED_FIREWEAPON, 1, JOYSTICK); +#ifdef BIND_VEHICLE_FIREWEAPON + SetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, 1, JOYSTICK); +#endif /*******************************************************************************************/ } } @@ -449,6 +461,9 @@ void CControllerConfigManager::InitialiseControllerActionNameArray() SETACTIONNAME(SHOW_MOUSE_POINTER_TOGGLE); SETACTIONNAME(CAMERA_CHANGE_VIEW_ALL_SITUATIONS); SETACTIONNAME(PED_FIREWEAPON); +#ifdef BIND_VEHICLE_FIREWEAPON + SETACTIONNAME(VEHICLE_FIREWEAPON); +#endif SETACTIONNAME(VEHICLE_ENTER_EXIT); SETACTIONNAME(GO_LEFT); SETACTIONNAME(GO_RIGHT); @@ -644,6 +659,10 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonDown(int32 button, void CControllerConfigManager::AffectControllerStateOn_ButtonDown_Driving(int32 button, eControllerType type, CControllerState &state) { +#ifdef BIND_VEHICLE_FIREWEAPON + if (button == GetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, type)) + state.Circle = 255; +#endif if (button == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKBEHIND, type)) { state.LeftShoulder2 = 255; @@ -788,7 +807,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonDown_ThirdPersonOnl void CControllerConfigManager::AffectControllerStateOn_ButtonDown_FirstAndThirdPersonOnly(int32 button, eControllerType type, CControllerState &state) { CPad *pad = CPad::GetPad(PAD1); - + +#ifdef BIND_VEHICLE_FIREWEAPON + if (button == GetControllerKeyAssociatedWithAction(PED_FIREWEAPON, type)) + state.Circle = 255; +#endif if (button == GetControllerKeyAssociatedWithAction(PED_LOCK_TARGET, type)) state.RightShoulder1 = 255; @@ -870,8 +893,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonDown_AllStates(int3 { if (button == GetControllerKeyAssociatedWithAction(CAMERA_CHANGE_VIEW_ALL_SITUATIONS, type)) state.Select = 255; + +#ifndef BIND_VEHICLE_FIREWEAPON if (button == GetControllerKeyAssociatedWithAction(PED_FIREWEAPON, type)) state.Circle = 255; +#endif if (button == GetControllerKeyAssociatedWithAction(GO_LEFT, type)) { @@ -1593,8 +1619,10 @@ void CControllerConfigManager::DeleteMatchingCommonControls(e_ControllerAction a { if (key == GetControllerKeyAssociatedWithAction(CAMERA_CHANGE_VIEW_ALL_SITUATIONS,type)) ClearSettingsAssociatedWithAction(CAMERA_CHANGE_VIEW_ALL_SITUATIONS, type); +#ifndef BIND_VEHICLE_FIREWEAPON if (key == GetControllerKeyAssociatedWithAction(PED_FIREWEAPON, type)) ClearSettingsAssociatedWithAction(PED_FIREWEAPON, type); +#endif if (key == GetControllerKeyAssociatedWithAction(GO_LEFT, type)) ClearSettingsAssociatedWithAction(GO_LEFT, type); if (key == GetControllerKeyAssociatedWithAction(GO_RIGHT, type)) @@ -1643,6 +1671,10 @@ void CControllerConfigManager::DeleteMatching1rst3rdPersonControls(e_ControllerA { if (!GetIsKeyBlank(key, type)) { +#ifdef BIND_VEHICLE_FIREWEAPON + if (key == GetControllerKeyAssociatedWithAction(PED_FIREWEAPON, type)) + ClearSettingsAssociatedWithAction(PED_FIREWEAPON, type); +#endif if (key == GetControllerKeyAssociatedWithAction(PED_LOCK_TARGET, type)) ClearSettingsAssociatedWithAction(PED_LOCK_TARGET, type); if (key == GetControllerKeyAssociatedWithAction(GO_FORWARD, type)) @@ -1668,6 +1700,10 @@ void CControllerConfigManager::DeleteMatchingVehicleControls(e_ControllerAction { if (!GetIsKeyBlank(key, type)) { +#ifdef BIND_VEHICLE_FIREWEAPON + if (key == GetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, type)) + ClearSettingsAssociatedWithAction(VEHICLE_FIREWEAPON, type); +#endif if (key == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKBEHIND, type)) ClearSettingsAssociatedWithAction(VEHICLE_LOOKBEHIND, type); if (key == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKLEFT, type)) @@ -1797,7 +1833,9 @@ e_ControllerActionType CControllerConfigManager::GetActionType(e_ControllerActio switch (action) { case CAMERA_CHANGE_VIEW_ALL_SITUATIONS: +#ifndef BIND_VEHICLE_FIREWEAPON case PED_FIREWEAPON: +#endif case GO_LEFT: case GO_RIGHT: case NETWORK_TALK: @@ -1819,6 +1857,9 @@ e_ControllerActionType CControllerConfigManager::GetActionType(e_ControllerActio return ACTIONTYPE_3RDPERSON; break; +#ifdef BIND_VEHICLE_FIREWEAPON + case VEHICLE_FIREWEAPON: +#endif case VEHICLE_LOOKBEHIND: case VEHICLE_LOOKLEFT: case VEHICLE_LOOKRIGHT: @@ -1839,6 +1880,9 @@ e_ControllerActionType CControllerConfigManager::GetActionType(e_ControllerActio return ACTIONTYPE_VEHICLE_3RDPERSON; break; +#ifdef BIND_VEHICLE_FIREWEAPON + case PED_FIREWEAPON: +#endif case PED_LOCK_TARGET: case GO_FORWARD: case GO_BACK: diff --git a/src/core/ControllerConfig.h b/src/core/ControllerConfig.h index 7d0e1073..92017a93 100644 --- a/src/core/ControllerConfig.h +++ b/src/core/ControllerConfig.h @@ -32,6 +32,9 @@ enum e_ControllerAction PED_JUMPING, PED_SPRINT, PED_LOOKBEHIND, +#ifdef BIND_VEHICLE_FIREWEAPON + VEHICLE_FIREWEAPON, +#endif VEHICLE_ACCELERATE, VEHICLE_BRAKE, VEHICLE_CHANGE_RADIO_STATION, diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index d82c5df4..788c1760 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -1634,7 +1634,11 @@ CMenuManager::DrawControllerBound(int32 yStart, int32 xStart, int32 unused, int8 } else if (column == CONTSETUP_VEHICLE_COLUMN) { switch (optionIdx) { case 0: - controllerAction = PED_FIREWEAPON; +#ifdef BIND_VEHICLE_FIREWEAPON + controllerAction = VEHICLE_FIREWEAPON; +#else + controllerAction = PED_FIREWEAPON; +#endif break; case 1: case 2: diff --git a/src/core/config.h b/src/core/config.h index 8e91853d..c4b4fc77 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -231,6 +231,7 @@ enum Config { #define ALLCARSHELI_CHEAT #define ALT_DODO_CHEAT #define REGISTER_START_BUTTON +//#define BIND_VEHICLE_FIREWEAPON // Adds ability to rebind fire key for 'in vehicle' controls // Hud, frontend and radar #define HUD_ENHANCEMENTS // Adjusts some aspects to make the HUD look/behave a little bit better. From 03c90b7c4028d0db1e6eddf6c63c0842c136517a Mon Sep 17 00:00:00 2001 From: majestic Date: Wed, 19 Aug 2020 11:11:19 -0700 Subject: [PATCH 090/112] stable CScriptPaths --- src/control/Replay.cpp | 5 +- src/control/Script.cpp | 23 ++-- src/core/Game.cpp | 4 + src/render/Fluff.cpp | 193 ++++++++++++++++++++++++++++++++ src/render/Fluff.h | 32 +++++- src/save/GenericGameStorage.cpp | 4 + 6 files changed, 250 insertions(+), 11 deletions(-) diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp index 1a050bee..80c05f31 100644 --- a/src/control/Replay.cpp +++ b/src/control/Replay.cpp @@ -39,6 +39,7 @@ #include "Text.h" #include "Camera.h" #include "Radar.h" +#include "Fluff.h" uint8 CReplay::Mode; CAddressInReplayBuffer CReplay::Record; @@ -229,7 +230,7 @@ void CReplay::EnableReplays(void) void PlayReplayFromHD(void); void CReplay::Update(void) { - if (CCutsceneMgr::IsCutsceneProcessing() || CTimer::GetIsPaused()) + if (CCutsceneMgr::IsCutsceneProcessing() || CTimer::GetIsPaused() || CScriptPaths::IsOneActive()) return; switch (Mode){ case MODE_RECORD: @@ -1175,6 +1176,7 @@ void CReplay::StoreStuffInMem(void) if (ped) StoreDetailedPedAnimation(ped, &pPedAnims[i]); } + CScriptPaths::Save_ForReplay(); } void CReplay::RestoreStuffFromMem(void) @@ -1351,6 +1353,7 @@ void CReplay::RestoreStuffFromMem(void) } delete[] pPedAnims; pPedAnims = nil; + CScriptPaths::Load_ForReplay(); DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND); DMAudio.SetRadioInCar(OldRadioStation); DMAudio.ChangeMusicMode(MUSICMODE_GAME); diff --git a/src/control/Script.cpp b/src/control/Script.cpp index e470cad2..3b0e2201 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -82,6 +82,7 @@ #include "main.h" #include "Ropes.h" #include "MBlur.h" +#include "Fluff.h" #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #include #endif @@ -12046,36 +12047,42 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) //case COMMAND_IS_PLAYER_STANDING_ON_A_VEHICLE: //case COMMAND_IS_PLAYER_FOOT_DOWN: //case COMMAND_IS_CHAR_FOOT_DOWN: - case COMMAND_INITIALISE_OBJECT_PATH: - // TODO(MIAMI): script path + case COMMAND_INITIALISE_OBJECT_PATH: { CollectParameters(&m_nIp, 2); - debug("INITALISE_OBJECT_PATH not yet implemented, skipping\n"); - ScriptParams[0] = 0; + int32 counter = 0; + while (counter < 3 && CScriptPaths::aArray[counter].m_state != SCRIPT_PATH_DISABLED) { + counter++; + } + CScriptPaths::aArray[counter].InitialiseOne(ScriptParams[0], *(float*)&ScriptParams[1]); + ScriptParams[0] = counter; StoreParameters(&m_nIp, 1); return 0; + } case COMMAND_START_OBJECT_ON_PATH: { CollectParameters(&m_nIp, 2); - debug("START_OBJECT_ON_PATH not yet implemented, skipping\n"); + CObject *pObj = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + assert(pObj); + CScriptPaths::aArray[ScriptParams[1]].SetObjectToControl(pObj); return 0; } case COMMAND_SET_OBJECT_PATH_SPEED: { CollectParameters(&m_nIp, 2); - debug("SET_OBJECT_PATH_SPEED not yet implemented, skipping\n"); + CScriptPaths::aArray[ScriptParams[0]].m_fSpeed = *(float*)&ScriptParams[1]; return 0; } case COMMAND_SET_OBJECT_PATH_POSITION: { CollectParameters(&m_nIp, 2); - debug("SET_OBJECT_PATH_POSITION not yet implemented, skipping\n"); + CScriptPaths::aArray[ScriptParams[0]].m_fPosition = *(float*)&ScriptParams[1]; return 0; } //case COMMAND_GET_OBJECT_DISTANCE_ALONG_PATH: case COMMAND_CLEAR_OBJECT_PATH: { CollectParameters(&m_nIp, 1); - debug("CLEAR_OBJECT_PATH not yet implemented, skipping\n"); + CScriptPaths::aArray[ScriptParams[0]].Clear(); return 0; } case COMMAND_HELI_GOTO_COORDS: diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 1e3e0c12..50c4288c 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -333,6 +333,7 @@ bool CGame::Initialise(const char* datFile) CDebug::DebugInitTextBuffer(); ThePaths.Init(); ThePaths.AllocatePathFindInfoMem(4500); + CScriptPaths::Init(); CWeather::Init(); CCullZones::Init(); COcclusion::Init(); @@ -463,6 +464,7 @@ bool CGame::ShutDown(void) CReplay::FinishPlayback(); CPlane::Shutdown(); CTrain::Shutdown(); + CScriptPaths::Shutdown(); CSpecialFX::Shutdown(); #ifndef PS2 CGarages::Shutdown(); @@ -577,6 +579,7 @@ void CGame::ReInitGameObjectVariables(void) CSpecialFX::Init(); CRopes::Init(); CWaterCannons::Init(); + CScriptPaths::Init(); CParticle::ReloadConfig(); #ifdef PS2_MENU @@ -719,6 +722,7 @@ void CGame::Process(void) CWeather::Update(); CTheScripts::Process(); CCollision::Update(); + CScriptPaths::Update(); CTrain::UpdateTrains(); CPlane::UpdatePlanes(); CHeli::UpdateHelis(); diff --git a/src/render/Fluff.cpp b/src/render/Fluff.cpp index 14c80a63..77d2af2a 100644 --- a/src/render/Fluff.cpp +++ b/src/render/Fluff.cpp @@ -1520,4 +1520,197 @@ CEscalators::Shutdown(void) { aEscalators[i].SwitchOff(); } NumEscalators = 0; +} + + +CScriptPath CScriptPaths::aArray[3]; + +void CScriptPath::FindCoorsFromDistanceOnPath(float t, float *pX, float *pY, float *pZ) +{ + int32 i; + for (i = 0; m_pNode[i + 1].t < t; i++) + if (i == m_numNodes - 1) { + // don't go beyond last node + *pX = m_pNode[m_numNodes - 1].p.x; + *pY = m_pNode[m_numNodes - 1].p.y; + *pZ = m_pNode[m_numNodes - 1].p.z; + return; + } + float f = (t - m_pNode[i].t) / (m_pNode[i + 1].t - m_pNode[i].t); + *pX = (1.0f - f)*m_pNode[i].p.x + f*m_pNode[i + 1].p.x; + *pY = (1.0f - f)*m_pNode[i].p.y + f*m_pNode[i + 1].p.y; + *pZ = (1.0f - f)*m_pNode[i].p.z + f*m_pNode[i + 1].p.z; +} + +void CScriptPath::Update(void) { + if (m_state != SCRIPT_PATH_ACTIVE) + return; + + m_fPosition += m_fSpeed * CTimer::GetTimeStepInSeconds(); + m_fPosition = clamp(m_fPosition, 0.0f, m_fTotalLength); + + if (m_pObjects[0] || m_pObjects[1] || m_pObjects[2] || m_pObjects[3] + || m_pObjects[4] || m_pObjects[5]) { + + float t1, t2; + CVector pos1, pos2; + + t1 = Max(m_fPosition - m_fObjectLength / 2.0f, 0.0f); + FindCoorsFromDistanceOnPath(t1, &pos1.x, &pos1.y, &pos1.z); + t2 = Min(m_fPosition + m_fObjectLength / 2.0f, m_fTotalLength); + FindCoorsFromDistanceOnPath(t2, &pos2.x, &pos2.y, &pos2.z); + + CVector newForward, newUp(0.0f, 0.0f, 1.0f), newRight; + + newForward = pos2 - pos1; + newForward.Normalise(); + newRight = CrossProduct(newForward, newUp); + newRight.Normalise(); + newUp = CrossProduct(newRight, newForward); + + for (int i = 0; i < 6; i++) { + if (m_pObjects[i]) { + CMatrix prevMat(m_pObjects[i]->GetMatrix()); + CVector prevPosition = m_pObjects[i]->GetPosition(); + + m_pObjects[i]->SetPosition((pos1 + pos2) / 2.0f); + m_pObjects[i]->GetRight() = newRight; + m_pObjects[i]->GetUp() = newUp; + m_pObjects[i]->GetForward() = newForward; + m_pObjects[i]->GetMatrix().UpdateRW(); + m_pObjects[i]->UpdateRwFrame(); + + if (!m_pObjects[i]->bIsBIGBuilding && prevPosition != m_pObjects[i]->GetPosition()) + m_pObjects[i]->RemoveAndAdd(); + + m_pObjects[i]->GetMatrix().UpdateRW(); + m_pObjects[i]->UpdateRwFrame(); + + m_pObjects[i]->m_vecMoveSpeed = (m_pObjects[i]->GetPosition() - prevMat.GetPosition()) / CTimer::GetTimeStep(); + + float deltaAngle = m_pObjects[i]->GetForward().Heading() - prevMat.GetForward().Heading(); + while (deltaAngle < (float)PI) deltaAngle += (float)TWOPI; + while (deltaAngle > (float)PI) deltaAngle -= (float)TWOPI; + float zTurnSpeed = deltaAngle / CTimer::GetTimeStep(); + + m_pObjects[i]->m_vecTurnSpeed = CVector(0.0f, 0.0f, zTurnSpeed); + m_pObjects[i]->m_vecMoveFriction = CVector(0.0f, 0.0f, 0.0f); + m_pObjects[i]->m_vecTurnFriction = CVector(0.0f, 0.0f, 0.0f); + } + } + } +} + +void CScriptPath::Clear(void) { + if (m_pNode) + delete m_pNode; + m_pNode = nil; + m_numNodes = 0; + for (int i = 0; i < 6; i++) + m_pObjects[i] = nil; + m_state = SCRIPT_PATH_DISABLED; +} + +void CScriptPath::InitialiseOne(int32 numNodes, float width) { + char Dest[32]; + sprintf(Dest, "data\\paths\\spath%d.dat", numNodes); + m_pNode = CPlane::LoadPath(Dest, m_numNodes, m_fTotalLength, false); + m_fSpeed = 1.0f; + m_fPosition = 0.0f; + m_fObjectLength = width; + m_state = SCRIPT_PATH_INITIALIZED; +} + +void CScriptPath::SetObjectToControl(CObject *pObj) { + int32 i = 0; + while (i < 6 && m_pObjects[i]) + i++; + m_pObjects[i] = pObj; + pObj->RegisterReference((CEntity**)&m_pObjects[i]); + pObj->m_phy_flagA08 = false; + m_state = SCRIPT_PATH_ACTIVE; +} + +void CScriptPaths::Init(void) { + for (int i = 0; i < 3; i++) + aArray[i].Clear(); +} + +void CScriptPaths::Shutdown(void) { + for (int i = 0; i < 3; i++) + aArray[i].Clear(); +} + +void CScriptPaths::Update(void) { + for (int i = 0; i < 3; i++) + aArray[i].Update(); +} + +bool CScriptPaths::IsOneActive(void) { + for (int i = 0; i < 3; i++) + if (aArray[i].m_state == SCRIPT_PATH_ACTIVE && aArray[i].m_fSpeed != 0.0f) + return true; + + return false; +} + +void CScriptPaths::Load(uint8 *buf, uint32 size) { +INITSAVEBUF + for (int32 i = 0; i < 3; i++) + aArray[i].Clear(); + + for (int32 i = 0; i < 3; i++) { + aArray[i] = ReadSaveBuf(buf); + + for (int32 j = 0; j < 6; j++) { + CScriptPath *pPath = &aArray[i]; + if (pPath->m_pObjects[j] != nil) { + pPath->m_pObjects[j] = CPools::GetObjectPool()->GetSlot((uintptr)pPath->m_pObjects[j] - 1); + pPath->m_pObjects[j]->m_phy_flagA08 = false; + } + } + + aArray[i].m_pNode = new CPlaneNode[aArray[i].m_numNodes]; + for (int32 j = 0; j < aArray[i].m_numNodes; j++) { + aArray[i].m_pNode[j] = ReadSaveBuf(buf); + } + } +VALIDATESAVEBUF(size) +} + +void CScriptPaths::Save(uint8 *buf, uint32 *size) { + *size = sizeof(aArray); +INITSAVEBUF + for (int32 i = 0; i < 3; i++) { + CScriptPath *pPath = WriteSaveBuf(buf, aArray[i]); + + for (int32 j = 0; j < 6; j++) { + if (pPath->m_pObjects[j] != nil) + pPath->m_pObjects[j] = (CObject*)(CPools::GetObjectPool()->GetJustIndex(pPath->m_pObjects[j]) + 1); + } + + for (int32 j = 0; j < aArray[i].m_numNodes; j++) { + WriteSaveBuf(buf, aArray[i].m_pNode[j]); + *size += sizeof(aArray[i].m_pNode[j]); + } + } +VALIDATESAVEBUF(*size); +} + +CObject* g_pScriptPathObjects[18]; + +void CScriptPaths::Load_ForReplay(void) { + for (int i = 0; i < 3; i++) { + for (int32 j = 0; j < 6; j++) { + aArray[i].m_pObjects[j] = g_pScriptPathObjects[6 * i + j]; + } + } +} + +void CScriptPaths::Save_ForReplay(void) { + for (int i = 0; i < 3; i++) { + for (int32 j = 0; j < 6; j++) { + g_pScriptPathObjects[6 * i + j] = aArray[i].m_pObjects[j]; + } + } } \ No newline at end of file diff --git a/src/render/Fluff.h b/src/render/Fluff.h index a938a4fe..a31ac335 100644 --- a/src/render/Fluff.h +++ b/src/render/Fluff.h @@ -2,17 +2,45 @@ #include "common.h" #include "Vector.h" #include "Object.h" +#include "Plane.h" + +enum { + SCRIPT_PATH_DISABLED = 0, + SCRIPT_PATH_INITIALIZED, + SCRIPT_PATH_ACTIVE +}; -// TODO class CScriptPath { public: + int32 m_numNodes; + CPlaneNode *m_pNode; + float m_fTotalLength; + float m_fSpeed; + float m_fPosition; + float m_fObjectLength; + int32 m_state; + CObject *m_pObjects[6]; + + void Clear(void); + void Update(void); + void InitialiseOne(int32 numNodes, float width); + void FindCoorsFromDistanceOnPath(float t, float *pX, float *pY, float *pZ); + void SetObjectToControl(CObject *pObj); }; -// TODO class CScriptPaths { public: + static CScriptPath aArray[3]; + static void Init(void); + static void Shutdown(void); + static void Update(void); + static bool IsOneActive(void); + static void Save(uint8 *buf, uint32 *size); + static void Load(uint8 *buf, uint32 size); + static void Save_ForReplay(); + static void Load_ForReplay(); }; class CPlaneTrail diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 4f69123b..90e7e122 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -38,6 +38,7 @@ #include "World.h" #include "Zones.h" #include "Timecycle.h" +#include "Fluff.h" #define BLOCK_COUNT 20 #define SIZE_OF_SIMPLEVARS 0xD4 @@ -226,6 +227,7 @@ GenericSave(int file) WriteSaveDataBlock(CTheCarGenerators::SaveAllCarGenerators); WriteSaveDataBlock(CParticleObject::SaveParticle); WriteSaveDataBlock(cAudioScriptObject::SaveAllAudioScriptObjects); + WriteSaveDataBlock(CScriptPaths::Save); WriteSaveDataBlock(CWorld::Players[CWorld::PlayerInFocus].SavePlayerInfo); WriteSaveDataBlock(CStats::SaveStats); WriteSaveDataBlock(CSetPieces::Save); @@ -377,6 +379,8 @@ GenericLoad() LoadSaveDataBlock(); ReadDataFromBlock("Loading AudioScript Objects \n", cAudioScriptObject::LoadAllAudioScriptObjects); LoadSaveDataBlock(); + ReadDataFromBlock("Loading ScriptPaths \n", CScriptPaths::Load); + LoadSaveDataBlock(); ReadDataFromBlock("Loading Player Info \n", CWorld::Players[CWorld::PlayerInFocus].LoadPlayerInfo); LoadSaveDataBlock(); ReadDataFromBlock("Loading Stats \n", CStats::LoadStats); From 73dd29ea3a532eeb49f92c429fd7d12144d8ce62 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 20 Aug 2020 19:56:02 +0300 Subject: [PATCH 091/112] Cleanup CControllerConfigManager deletion a bit --- src/core/ControllerConfig.cpp | 135 ++++++++++++---------------------- 1 file changed, 49 insertions(+), 86 deletions(-) diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp index 4a901d17..576a58b1 100644 --- a/src/core/ControllerConfig.cpp +++ b/src/core/ControllerConfig.cpp @@ -1613,30 +1613,25 @@ bool CControllerConfigManager::GetIsMouseButtonUp(RsKeyCodes keycode) return false; } +#define CLEAR_ACTION_IF_NEEDED(action) \ +if (key == GetControllerKeyAssociatedWithAction(action, type))\ + ClearSettingsAssociatedWithAction(action, type); + void CControllerConfigManager::DeleteMatchingCommonControls(e_ControllerAction action, int32 key, eControllerType type) { if (!GetIsKeyBlank(key, type)) { - if (key == GetControllerKeyAssociatedWithAction(CAMERA_CHANGE_VIEW_ALL_SITUATIONS,type)) - ClearSettingsAssociatedWithAction(CAMERA_CHANGE_VIEW_ALL_SITUATIONS, type); + CLEAR_ACTION_IF_NEEDED(CAMERA_CHANGE_VIEW_ALL_SITUATIONS); #ifndef BIND_VEHICLE_FIREWEAPON - if (key == GetControllerKeyAssociatedWithAction(PED_FIREWEAPON, type)) - ClearSettingsAssociatedWithAction(PED_FIREWEAPON, type); + CLEAR_ACTION_IF_NEEDED(PED_FIREWEAPON); #endif - if (key == GetControllerKeyAssociatedWithAction(GO_LEFT, type)) - ClearSettingsAssociatedWithAction(GO_LEFT, type); - if (key == GetControllerKeyAssociatedWithAction(GO_RIGHT, type)) - ClearSettingsAssociatedWithAction(GO_RIGHT, type); - if (key == GetControllerKeyAssociatedWithAction(NETWORK_TALK, type)) - ClearSettingsAssociatedWithAction(NETWORK_TALK, type); - if (key == GetControllerKeyAssociatedWithAction(SWITCH_DEBUG_CAM_ON, type)) - ClearSettingsAssociatedWithAction(SWITCH_DEBUG_CAM_ON, type); - if (key == GetControllerKeyAssociatedWithAction(TOGGLE_DPAD, type)) - ClearSettingsAssociatedWithAction(TOGGLE_DPAD, type); - if (key == GetControllerKeyAssociatedWithAction(TAKE_SCREEN_SHOT, type)) - ClearSettingsAssociatedWithAction(TAKE_SCREEN_SHOT, type); - if (key == GetControllerKeyAssociatedWithAction(SHOW_MOUSE_POINTER_TOGGLE, type)) - ClearSettingsAssociatedWithAction(SHOW_MOUSE_POINTER_TOGGLE, type); + CLEAR_ACTION_IF_NEEDED(GO_LEFT); + CLEAR_ACTION_IF_NEEDED(GO_RIGHT); + CLEAR_ACTION_IF_NEEDED(NETWORK_TALK); + CLEAR_ACTION_IF_NEEDED(SWITCH_DEBUG_CAM_ON); + CLEAR_ACTION_IF_NEEDED(TOGGLE_DPAD); + CLEAR_ACTION_IF_NEEDED(TAKE_SCREEN_SHOT); + CLEAR_ACTION_IF_NEEDED(SHOW_MOUSE_POINTER_TOGGLE); } } @@ -1644,25 +1639,17 @@ void CControllerConfigManager::DeleteMatching3rdPersonControls(e_ControllerActio { if (!GetIsKeyBlank(key, type)) { - if (key == GetControllerKeyAssociatedWithAction(PED_LOOKBEHIND, type)) - ClearSettingsAssociatedWithAction(PED_LOOKBEHIND, type); - if (key == GetControllerKeyAssociatedWithAction(PED_CYCLE_WEAPON_LEFT, type)) - ClearSettingsAssociatedWithAction(PED_CYCLE_WEAPON_LEFT, type); - if (key == GetControllerKeyAssociatedWithAction(PED_CYCLE_WEAPON_RIGHT, type)) - ClearSettingsAssociatedWithAction(PED_CYCLE_WEAPON_RIGHT, type); - if (key == GetControllerKeyAssociatedWithAction(PED_JUMPING, type)) - ClearSettingsAssociatedWithAction(PED_JUMPING, type); - if (key == GetControllerKeyAssociatedWithAction(PED_SPRINT, type)) - ClearSettingsAssociatedWithAction(PED_SPRINT, type); + CLEAR_ACTION_IF_NEEDED(PED_LOOKBEHIND); + CLEAR_ACTION_IF_NEEDED(PED_CYCLE_WEAPON_LEFT); + CLEAR_ACTION_IF_NEEDED(PED_CYCLE_WEAPON_RIGHT); + CLEAR_ACTION_IF_NEEDED(PED_JUMPING); + CLEAR_ACTION_IF_NEEDED(PED_SPRINT); if (CMenuManager::m_ControlMethod == CONTROL_CLASSIC) { - if (key == GetControllerKeyAssociatedWithAction(PED_CYCLE_TARGET_LEFT, type)) - ClearSettingsAssociatedWithAction(PED_CYCLE_TARGET_LEFT, type); - if (key == GetControllerKeyAssociatedWithAction(PED_CYCLE_TARGET_RIGHT, type)) - ClearSettingsAssociatedWithAction(PED_CYCLE_TARGET_RIGHT, type); - if (key == GetControllerKeyAssociatedWithAction(PED_CENTER_CAMERA_BEHIND_PLAYER, type)) - ClearSettingsAssociatedWithAction(PED_CENTER_CAMERA_BEHIND_PLAYER, type); + CLEAR_ACTION_IF_NEEDED(PED_CYCLE_TARGET_LEFT); + CLEAR_ACTION_IF_NEEDED(PED_CYCLE_TARGET_RIGHT); + CLEAR_ACTION_IF_NEEDED(PED_CENTER_CAMERA_BEHIND_PLAYER); } } } @@ -1672,26 +1659,18 @@ void CControllerConfigManager::DeleteMatching1rst3rdPersonControls(e_ControllerA if (!GetIsKeyBlank(key, type)) { #ifdef BIND_VEHICLE_FIREWEAPON - if (key == GetControllerKeyAssociatedWithAction(PED_FIREWEAPON, type)) - ClearSettingsAssociatedWithAction(PED_FIREWEAPON, type); + CLEAR_ACTION_IF_NEEDED(PED_FIREWEAPON); #endif - if (key == GetControllerKeyAssociatedWithAction(PED_LOCK_TARGET, type)) - ClearSettingsAssociatedWithAction(PED_LOCK_TARGET, type); - if (key == GetControllerKeyAssociatedWithAction(GO_FORWARD, type)) - ClearSettingsAssociatedWithAction(GO_FORWARD, type); - if (key == GetControllerKeyAssociatedWithAction(GO_BACK, type)) - ClearSettingsAssociatedWithAction(GO_BACK, type); + CLEAR_ACTION_IF_NEEDED(PED_LOCK_TARGET); + CLEAR_ACTION_IF_NEEDED(GO_FORWARD); + CLEAR_ACTION_IF_NEEDED(GO_BACK); if (CMenuManager::m_ControlMethod == CONTROL_CLASSIC) { - if (key == GetControllerKeyAssociatedWithAction(PED_1RST_PERSON_LOOK_LEFT, type)) - ClearSettingsAssociatedWithAction(PED_1RST_PERSON_LOOK_LEFT, type); - if (key == GetControllerKeyAssociatedWithAction(PED_1RST_PERSON_LOOK_RIGHT, type)) - ClearSettingsAssociatedWithAction(PED_1RST_PERSON_LOOK_RIGHT, type); - if (key == GetControllerKeyAssociatedWithAction(PED_1RST_PERSON_LOOK_DOWN, type)) - ClearSettingsAssociatedWithAction(PED_1RST_PERSON_LOOK_DOWN, type); - if (key == GetControllerKeyAssociatedWithAction(PED_1RST_PERSON_LOOK_UP, type)) - ClearSettingsAssociatedWithAction(PED_1RST_PERSON_LOOK_UP, type); + CLEAR_ACTION_IF_NEEDED(PED_1RST_PERSON_LOOK_LEFT); + CLEAR_ACTION_IF_NEEDED(PED_1RST_PERSON_LOOK_RIGHT); + CLEAR_ACTION_IF_NEEDED(PED_1RST_PERSON_LOOK_DOWN); + CLEAR_ACTION_IF_NEEDED(PED_1RST_PERSON_LOOK_UP); } } } @@ -1701,37 +1680,22 @@ void CControllerConfigManager::DeleteMatchingVehicleControls(e_ControllerAction if (!GetIsKeyBlank(key, type)) { #ifdef BIND_VEHICLE_FIREWEAPON - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, type)) - ClearSettingsAssociatedWithAction(VEHICLE_FIREWEAPON, type); + CLEAR_ACTION_IF_NEEDED(VEHICLE_FIREWEAPON); #endif - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKBEHIND, type)) - ClearSettingsAssociatedWithAction(VEHICLE_LOOKBEHIND, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKLEFT, type)) - ClearSettingsAssociatedWithAction(VEHICLE_LOOKLEFT, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKRIGHT, type)) - ClearSettingsAssociatedWithAction(VEHICLE_LOOKRIGHT, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_LOOKBEHIND, type)) // note: dublicate - ClearSettingsAssociatedWithAction(VEHICLE_LOOKBEHIND, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_HORN, type)) - ClearSettingsAssociatedWithAction(VEHICLE_HORN, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_HANDBRAKE, type)) - ClearSettingsAssociatedWithAction(VEHICLE_HANDBRAKE, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_ACCELERATE, type)) - ClearSettingsAssociatedWithAction(VEHICLE_ACCELERATE, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_BRAKE, type)) - ClearSettingsAssociatedWithAction(VEHICLE_BRAKE, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_CHANGE_RADIO_STATION, type)) - ClearSettingsAssociatedWithAction(VEHICLE_CHANGE_RADIO_STATION, type); - if (key == GetControllerKeyAssociatedWithAction(TOGGLE_SUBMISSIONS, type)) - ClearSettingsAssociatedWithAction(TOGGLE_SUBMISSIONS, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_TURRETLEFT, type)) - ClearSettingsAssociatedWithAction(VEHICLE_TURRETLEFT, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_TURRETRIGHT, type)) - ClearSettingsAssociatedWithAction(VEHICLE_TURRETRIGHT, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_TURRETUP, type)) - ClearSettingsAssociatedWithAction(VEHICLE_TURRETUP, type); - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_TURRETDOWN, type)) - ClearSettingsAssociatedWithAction(VEHICLE_TURRETDOWN, type); + CLEAR_ACTION_IF_NEEDED(VEHICLE_LOOKBEHIND); + CLEAR_ACTION_IF_NEEDED(VEHICLE_LOOKLEFT); + CLEAR_ACTION_IF_NEEDED(VEHICLE_LOOKRIGHT); + CLEAR_ACTION_IF_NEEDED(VEHICLE_LOOKBEHIND); // note: duplicate + CLEAR_ACTION_IF_NEEDED(VEHICLE_HORN); + CLEAR_ACTION_IF_NEEDED(VEHICLE_HANDBRAKE); + CLEAR_ACTION_IF_NEEDED(VEHICLE_ACCELERATE); + CLEAR_ACTION_IF_NEEDED(VEHICLE_BRAKE); + CLEAR_ACTION_IF_NEEDED(VEHICLE_CHANGE_RADIO_STATION); + CLEAR_ACTION_IF_NEEDED(TOGGLE_SUBMISSIONS); + CLEAR_ACTION_IF_NEEDED(VEHICLE_TURRETLEFT); + CLEAR_ACTION_IF_NEEDED(VEHICLE_TURRETRIGHT); + CLEAR_ACTION_IF_NEEDED(VEHICLE_TURRETUP); + CLEAR_ACTION_IF_NEEDED(VEHICLE_TURRETDOWN); } } @@ -1739,8 +1703,7 @@ void CControllerConfigManager::DeleteMatchingVehicle_3rdPersonControls(e_Control { if (!GetIsKeyBlank(key, type)) { - if (key == GetControllerKeyAssociatedWithAction(VEHICLE_ENTER_EXIT, type)) - ClearSettingsAssociatedWithAction(VEHICLE_ENTER_EXIT, type); + CLEAR_ACTION_IF_NEEDED(VEHICLE_ENTER_EXIT); } } @@ -1748,13 +1711,13 @@ void CControllerConfigManager::DeleteMatching1rstPersonControls(e_ControllerActi { if (!GetIsKeyBlank(key, type)) { - if (key == GetControllerKeyAssociatedWithAction(PED_SNIPER_ZOOM_IN, type)) - ClearSettingsAssociatedWithAction(PED_SNIPER_ZOOM_IN, type); - if (key == GetControllerKeyAssociatedWithAction(PED_SNIPER_ZOOM_OUT, type)) - ClearSettingsAssociatedWithAction(PED_SNIPER_ZOOM_OUT, type); + CLEAR_ACTION_IF_NEEDED(PED_SNIPER_ZOOM_IN); + CLEAR_ACTION_IF_NEEDED(PED_SNIPER_ZOOM_OUT); } } +#undef CLEAR_ACTION_IF_NEEDED + void CControllerConfigManager::DeleteMatchingActionInitiators(e_ControllerAction action, int32 key, eControllerType type) { if (!GetIsKeyBlank(key, type)) From a6fe606ce687b67c238f8671cf2dda5c840654c8 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 23:43:13 +0200 Subject: [PATCH 092/112] CStreaming done, hopefully --- src/control/Script.h | 2 +- src/core/Game.cpp | 5 +- src/core/Streaming.cpp | 506 ++++++++++++++++++++++++++++------------- src/core/Streaming.h | 10 +- src/core/config.h | 1 + src/core/main.cpp | 28 +-- src/peds/Ped.cpp | 16 ++ src/peds/Ped.h | 1 + src/rw/TexRead.cpp | 6 + 9 files changed, 387 insertions(+), 188 deletions(-) diff --git a/src/control/Script.h b/src/control/Script.h index 3577b401..ba315c46 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -374,10 +374,10 @@ private: static int32 GetNewUniqueScriptSphereIndex(int32 index); static void RemoveScriptSphere(int32 index); static void RemoveScriptTextureDictionary(); +public: static void RemoveThisPed(CPed* pPed); #ifdef MISSION_SWITCHER -public: static void SwitchToMission(int32 mission); #endif diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 7a2e56ed..ee3c32b1 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -616,10 +616,7 @@ void CGame::ShutDownForRestart(void) CWorld::ClearForRestart(); CGameLogic::ClearShortCut(); CTimer::Shutdown(); - CStreaming::FlushRequestList(); - CStreaming::DeleteAllRwObjects(); - CStreaming::RemoveAllUnusedModels(); - CStreaming::ms_disableStreaming = false; + CStreaming::ReInit(); CRadar::RemoveRadarSections(); FrontEndMenuManager.UnloadTextures(); CParticleObject::RemoveAllExpireableParticleObjects(); diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index b6a4f735..1e2143d8 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -31,6 +31,9 @@ #include "main.h" #include "ColStore.h" #include "DMAudio.h" +#include "Script.h" + +//--MIAMI: file done (possibly bugs) bool CStreaming::ms_disableStreaming; bool CStreaming::ms_bLoadingBigModel; @@ -48,6 +51,7 @@ size_t CStreaming::ms_memoryUsed; CStreamingChannel CStreaming::ms_channel[2]; int32 CStreaming::ms_channelError; int32 CStreaming::ms_numVehiclesLoaded; +int32 CStreaming::ms_numPedsLoaded; int32 CStreaming::ms_vehiclesLoaded[MAXVEHICLESLOADED]; int32 CStreaming::ms_lastVehicleDeleted; bool CStreaming::ms_bIsPedFromPedGroupLoaded[NUMMODELSPERPEDGROUP]; @@ -70,7 +74,6 @@ CEntity *pIslandLODbeachEntity; int32 islandLODmainland; int32 islandLODbeach; -//--MIAMI: done bool CStreamingInfo::GetCdPosnAndSize(uint32 &posn, uint32 &size) { @@ -81,7 +84,6 @@ CStreamingInfo::GetCdPosnAndSize(uint32 &posn, uint32 &size) return true; } -//--MIAMI: done void CStreamingInfo::SetCdPosnAndSize(uint32 posn, uint32 size) { @@ -89,7 +91,6 @@ CStreamingInfo::SetCdPosnAndSize(uint32 posn, uint32 size) m_size = size; } -//--MIAMI: done void CStreamingInfo::AddToList(CStreamingInfo *link) { @@ -100,7 +101,6 @@ CStreamingInfo::AddToList(CStreamingInfo *link) m_next->m_prev = this; } -//--MIAMI: done void CStreamingInfo::RemoveFromList(void) { @@ -110,7 +110,6 @@ CStreamingInfo::RemoveFromList(void) m_prev = nil; } -//--MIAMI: done void CStreaming::Init2(void) { @@ -179,6 +178,7 @@ CStreaming::Init2(void) for(i = 0; i < MAXVEHICLESLOADED; i++) ms_vehiclesLoaded[i] = -1; ms_numVehiclesLoaded = 0; + ms_numPedsLoaded = 8; for(i = 0; i < ARRAY_SIZE(ms_bIsPedFromPedGroupLoaded); i++) ms_bIsPedFromPedGroupLoaded[i] = false; @@ -233,36 +233,54 @@ void CStreaming::Init(void) { #ifdef USE_TXD_CDIMAGE - int txdHandle = CFileMgr::OpenFile("MODELS\\TXD.IMG", "r"); - if (txdHandle) - CFileMgr::CloseFile(txdHandle); - if (!CheckVideoCardCaps() && txdHandle) { - CdStreamAddImage("MODELS\\TXD.IMG"); - CStreaming::Init2(); - } else { - CStreaming::Init2(); - if (CreateTxdImageForVideoCard()) { - CStreaming::Shutdown(); + if(!CanVideoCardDoDXT()){ + int txdHandle = CFileMgr::OpenFile("MODELS\\TXD.IMG", "r"); + if (txdHandle) + CFileMgr::CloseFile(txdHandle); + if (!CheckVideoCardCaps() && txdHandle) { CdStreamAddImage("MODELS\\TXD.IMG"); CStreaming::Init2(); + } else { + CStreaming::Init2(); + if (CreateTxdImageForVideoCard()) { + CStreaming::Shutdown(); + CdStreamAddImage("MODELS\\TXD.IMG"); + CStreaming::Init2(); + } } - } + } else + CStreaming::Init2(); #else CStreaming::Init2(); #endif } -//--MIAMI: done +void +CStreaming::ReInit(void) +{ + int i; + CStreaming::FlushRequestList(); + CStreaming::DeleteAllRwObjects(); + CStreaming::RemoveAllUnusedModels(); + for(i = 0; i < MODELINFOSIZE; i++) + if(CModelInfo::GetModelInfo(i) && ms_aInfoForModel[i].m_flags & STREAMFLAGS_SCRIPTOWNED) + SetMissionDoesntRequireModel(i); + CStreaming::ms_disableStreaming = false; +} + void CStreaming::Shutdown(void) { RwFreeAlign(ms_pStreamingBuffer[0]); ms_streamingBufferSize = 0; - if(ms_pExtraObjectsDir) + if(ms_pExtraObjectsDir) { delete ms_pExtraObjectsDir; +#ifdef FIX_BUGS + ms_pExtraObjectsDir = nil; +#endif + } } -//--MIAMI: done void CStreaming::Update(void) { @@ -281,7 +299,7 @@ CStreaming::Update(void) LoadBigBuildingsWhenNeeded(); if(!ms_disableStreaming && TheCamera.GetPosition().z < 55.0f) - AddModelsToRequestList(TheCamera.GetPosition()); + AddModelsToRequestList(TheCamera.GetPosition(), 0); DeleteFarAwayRwObjects(TheCamera.GetPosition()); @@ -313,7 +331,6 @@ CStreaming::Update(void) } } -//--MIAMI: done void CStreaming::LoadCdDirectory(void) { @@ -342,7 +359,6 @@ CStreaming::LoadCdDirectory(void) ms_imageSize /= CDSTREAM_SECTOR_SIZE; } -//--MIAMI: done void CStreaming::LoadCdDirectory(const char *dirname, int n) { @@ -440,7 +456,6 @@ GetObjectName(int streamId) } -//--MIAMI: done bool CStreaming::ConvertBufferToObject(int8 *buf, int32 streamId) { @@ -591,7 +606,6 @@ CStreaming::ConvertBufferToObject(int8 *buf, int32 streamId) return true; } -//--MIAMI: done bool CStreaming::FinishLoadingLargeFile(int8 *buf, int32 streamId) { @@ -654,7 +668,6 @@ CStreaming::FinishLoadingLargeFile(int8 *buf, int32 streamId) return true; } -//--MIAMI: done void CStreaming::RequestModel(int32 id, int32 flags) { @@ -710,7 +723,6 @@ CStreaming::RequestModel(int32 id, int32 flags) #define BIGBUILDINGFLAGS STREAMFLAGS_DONT_REMOVE -//--MIAMI: done void CStreaming::RequestBigBuildings(eLevelName level) { @@ -727,7 +739,6 @@ CStreaming::RequestBigBuildings(eLevelName level) RequestIslands(level); } -//--MIAMI: done void CStreaming::RequestBigBuildings(eLevelName level, const CVector &pos) { @@ -751,7 +762,6 @@ CStreaming::RequestBigBuildings(eLevelName level, const CVector &pos) RequestIslands(level); } -//--MIAMI: done void CStreaming::InstanceBigBuildings(eLevelName level, const CVector &pos) { @@ -768,7 +778,6 @@ CStreaming::InstanceBigBuildings(eLevelName level, const CVector &pos) } } -//--MIAMI: done void CStreaming::InstanceLoadedModelsInSectorList(CPtrList &list) { @@ -781,7 +790,6 @@ CStreaming::InstanceLoadedModelsInSectorList(CPtrList &list) } } -//--MIAMI: done void CStreaming::InstanceLoadedModels(const CVector &pos) { @@ -809,7 +817,6 @@ CStreaming::InstanceLoadedModels(const CVector &pos) } } -//--MIAMI: done void CStreaming::RequestIslands(eLevelName level) { @@ -828,7 +835,56 @@ CStreaming::RequestIslands(eLevelName level) #endif } -//--MIAMI: TODO +static char *IGnames[] = { + "player", + "player2", + "player3", + "player4", + "player5", + "player6", + "player7", + "player8", + "player9", + "play10", + "play11", + "igken", + "igcandy", + "igsonny", + "igbuddy", + "igjezz", + "ighlary", + "igphil", + "igmerc", + "igdick", + "igdiaz", + "" +}; + +static char *CSnames[] = { + "csplay", + "csplay2", + "csplay3", + "csplay4", + "csplay5", + "csplay6", + "csplay7", + "csplay8", + "csplay9", + "csplay10", + "csplay11", + "csken", + "cscandy", + "cssonny", + "csbuddy", + "csjezz", + "cshlary", + "csphil", + "csmerc", + "csdick", + "csdiaz", + "" +}; + void CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flags) { @@ -836,14 +892,43 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag int txdId; char oldName[48]; uint32 pos, size; + int i, n; mi = CModelInfo::GetModelInfo(modelId); + if(!CGeneral::faststrcmp("CSPlay", modelName)){ + char *curname = CModelInfo::GetModelInfo(MI_PLAYER)->GetName(); + for(int i = 0; CSnames[i][0]; i++){ + if(strcasecmp(curname, IGnames[i]) == 0){ + modelName = CSnames[i]; + break; + } + } + } if(!CGeneral::faststrcmp(mi->GetName(), modelName)){ // Already have the correct name, just request it RequestModel(modelId, flags); return; } + if(mi->GetNumRefs() > 0){ + n = CPools::GetPedPool()->GetSize()-1; + for(i = n; i >= 0 && mi->GetNumRefs() > 0; i--){ + CPed *ped = CPools::GetPedPool()->GetSlot(i); + if(ped && ped->GetModelIndex() == modelId && + !ped->IsPlayer() && ped->CanBeDeletedEvenInVehicle()) + CTheScripts::RemoveThisPed(ped); + } + n = CPools::GetObjectPool()->GetSize()-1; + for(i = n; i >= 0 && mi->GetNumRefs() > 0; i--){ + CObject *obj = CPools::GetObjectPool()->GetSlot(i); + if(obj && obj->GetModelIndex() == modelId && obj->CanBeDeleted()){ + CWorld::Remove(obj); + CWorld::RemoveReferencesToDeletedObject(obj); + delete obj; + } + } + } + strcpy(oldName, mi->GetName()); mi->SetName(modelName); @@ -870,28 +955,24 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag RequestModel(modelId, flags); } -//--MIAMI: done void CStreaming::RequestSpecialChar(int32 charId, const char *modelName, int32 flags) { RequestSpecialModel(charId + MI_SPECIAL01, modelName, flags); } -//--MIAMI: done bool CStreaming::HasSpecialCharLoaded(int32 id) { return HasModelLoaded(id + MI_SPECIAL01); } -//--MIAMI: done void CStreaming::SetMissionDoesntRequireSpecialChar(int32 id) { return SetMissionDoesntRequireModel(id + MI_SPECIAL01); } -//--MIAMI: done void CStreaming::DecrementRef(int32 id) { @@ -902,7 +983,6 @@ CStreaming::DecrementRef(int32 id) } } -//--MIAMI: done void CStreaming::RemoveModel(int32 id) { @@ -955,7 +1035,6 @@ CStreaming::RemoveModel(int32 id) ms_aInfoForModel[id].m_loadState = STREAMSTATE_NOTLOADED; } -//--MIAMI: done void CStreaming::RemoveUnusedBuildings(eLevelName level) { @@ -965,7 +1044,6 @@ CStreaming::RemoveUnusedBuildings(eLevelName level) RemoveBuildings(LEVEL_MAINLAND); } -//--MIAMI: done void CStreaming::RemoveBuildings(eLevelName level) { @@ -1026,7 +1104,61 @@ CStreaming::RemoveBuildings(eLevelName level) } } -//--MIAMI: done +void +CStreaming::RemoveBuildingsNotInArea(int32 area) +{ + int i, n; + CEntity *e; + + n = CPools::GetBuildingPool()->GetSize()-1; + for(i = n; i >= 0; i--){ + e = CPools::GetBuildingPool()->GetSlot(i); + if(e && e->m_rwObject && !IsAreaVisible(area) && + (!e->bIsBIGBuilding || e->bStreamBIGBuilding)){ + if(e->bIsBIGBuilding) + RequestModel(e->GetModelIndex(), 0); + if(!e->bImBeingRendered) + e->DeleteRwObject(); + } + } + + n = CPools::GetTreadablePool()->GetSize()-1; + for(i = n; i >= 0; i--){ + e = CPools::GetTreadablePool()->GetSlot(i); + if(e && e->m_rwObject && !IsAreaVisible(area) && + (!e->bIsBIGBuilding || e->bStreamBIGBuilding)){ + if(e->bIsBIGBuilding) + RequestModel(e->GetModelIndex(), 0); + if(!e->bImBeingRendered) + e->DeleteRwObject(); + } + } + + n = CPools::GetObjectPool()->GetSize()-1; + for(i = n; i >= 0; i--){ + e = CPools::GetObjectPool()->GetSlot(i); + if(e && e->m_rwObject && !IsAreaVisible(area) && + (!e->bIsBIGBuilding || e->bStreamBIGBuilding)){ + if(e->bIsBIGBuilding) + RequestModel(e->GetModelIndex(), 0); + if(!e->bImBeingRendered) + e->DeleteRwObject(); + } + } + + n = CPools::GetDummyPool()->GetSize()-1; + for(i = n; i >= 0; i--){ + e = CPools::GetDummyPool()->GetSlot(i); + if(e && e->m_rwObject && !IsAreaVisible(area) && + (!e->bIsBIGBuilding || e->bStreamBIGBuilding)){ + if(e->bIsBIGBuilding) + RequestModel(e->GetModelIndex(), 0); + if(!e->bImBeingRendered) + e->DeleteRwObject(); + } + } +} + void CStreaming::RemoveUnusedBigBuildings(eLevelName level) { @@ -1039,7 +1171,6 @@ CStreaming::RemoveUnusedBigBuildings(eLevelName level) RemoveIslandsNotUsed(level); } -//--MIAMI: done void DeleteIsland(CEntity *island) { @@ -1053,7 +1184,6 @@ DeleteIsland(CEntity *island) } } -//--MIAMI: done void CStreaming::RemoveIslandsNotUsed(eLevelName level) { @@ -1082,7 +1212,6 @@ CStreaming::RemoveIslandsNotUsed(eLevelName level) #endif // !NO_ISLAND_LOADING } -//--MIAMI: done void CStreaming::RemoveBigBuildings(eLevelName level) { @@ -1129,7 +1258,6 @@ found: return true; } -//--MIAMI: done bool CStreaming::RemoveLeastUsedModel(uint32 excludeMask) { @@ -1163,7 +1291,6 @@ CStreaming::RemoveLeastUsedModel(uint32 excludeMask) return (ms_numVehiclesLoaded > 7 || CGame::currArea != AREA_MAIN_MAP && ms_numVehiclesLoaded > 4) && RemoveLoadedVehicle(); } -//--MIAMI: done void CStreaming::RemoveAllUnusedModels(void) { @@ -1181,14 +1308,35 @@ CStreaming::RemoveAllUnusedModels(void) } } -//--MIAMI: done void CStreaming::RemoveUnusedModelsInLoadedList(void) { // empty } -//--MIAMI: done +bool +CStreaming::RemoveLoadedZoneModel(void) +{ + int i; + + if(ms_currentPedGrp == -1) + return false; + + for(i = 0; i < NUMMODELSPERPEDGROUP; i++){ + int mi = CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]; + if(mi != -1 && ms_bIsPedFromPedGroupLoaded[i] && + HasModelLoaded(mi) && CanRemoveModel(mi) && + CModelInfo::GetModelInfo(mi)->GetNumRefs() == 0){ + RemoveModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + ms_numPedsLoaded--; + ms_bIsPedFromPedGroupLoaded[i] = false; + return true; + } + } + + return false; +} + bool CStreaming::IsTxdUsedByRequestedModels(int32 txdId) { @@ -1291,7 +1439,7 @@ found: if(id == -1) return false; // still no luck ms_lastVehicleDeleted = id; - // this is more that we wanted actually + // this is more than we wanted actually ms_numVehiclesLoaded++; } else{ @@ -1322,7 +1470,7 @@ void CStreaming::SetModelIsDeletable(int32 id) { ms_aInfoForModel[id].m_flags &= ~STREAMFLAGS_DONT_REMOVE; - if ((id >= STREAM_OFFSET_TXD || CModelInfo::GetModelInfo(id)->GetModelType() != MITYPE_VEHICLE) && + if ((id >= STREAM_OFFSET_TXD && id < STREAM_OFFSET_COL || CModelInfo::GetModelInfo(id)->GetModelType() != MITYPE_VEHICLE) && (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED) == 0){ if(ms_aInfoForModel[id].m_loadState != STREAMSTATE_LOADED) RemoveModel(id); @@ -1337,7 +1485,6 @@ CStreaming::SetModelTxdIsDeletable(int32 id) SetModelIsDeletable(CModelInfo::GetModelInfo(id)->GetTxdSlot() + STREAM_OFFSET_TXD); } -//--MIAMI: done void CStreaming::SetMissionDoesntRequireModel(int32 id) { @@ -1369,15 +1516,10 @@ CStreaming::LoadInitialWeapons(void) void CStreaming::LoadInitialVehicles(void) { - int id; - ms_numVehiclesLoaded = 0; ms_lastVehicleDeleted = 0; - if(CModelInfo::GetModelInfo("taxi", &id)) - RequestModel(id, STREAMFLAGS_DONT_REMOVE); - if(CModelInfo::GetModelInfo("police", &id)) - RequestModel(id, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_POLICE, STREAMFLAGS_DONT_REMOVE); } void @@ -1438,25 +1580,26 @@ CStreaming::StreamVehiclesAndPeds(void) SetModelIsDeletable(MI_VICE6); SetModelIsDeletable(MI_VICE7); SetModelIsDeletable(MI_VICE8); - switch (CCarCtrl::MiamiViceCycle) { - case 0: - RequestModel(MI_VICE1, STREAMFLAGS_DONT_REMOVE); - RequestModel(MI_VICE2, STREAMFLAGS_DONT_REMOVE); - break; - case 1: - RequestModel(MI_VICE3, STREAMFLAGS_DONT_REMOVE); - RequestModel(MI_VICE4, STREAMFLAGS_DONT_REMOVE); - break; - case 2: - RequestModel(MI_VICE5, STREAMFLAGS_DONT_REMOVE); - RequestModel(MI_VICE6, STREAMFLAGS_DONT_REMOVE); - break; - case 3: - RequestModel(MI_VICE7, STREAMFLAGS_DONT_REMOVE); - RequestModel(MI_VICE8, STREAMFLAGS_DONT_REMOVE); - break; - } RequestModel(MI_VICECHEE, STREAMFLAGS_DONT_REMOVE); + if(CPopulation::NumMiamiViceCops == 0) + switch (CCarCtrl::MiamiViceCycle) { + case 0: + RequestModel(MI_VICE1, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_VICE2, STREAMFLAGS_DONT_REMOVE); + break; + case 1: + RequestModel(MI_VICE3, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_VICE4, STREAMFLAGS_DONT_REMOVE); + break; + case 2: + RequestModel(MI_VICE5, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_VICE6, STREAMFLAGS_DONT_REMOVE); + break; + case 3: + RequestModel(MI_VICE7, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_VICE8, STREAMFLAGS_DONT_REMOVE); + break; + } } else { SetModelIsDeletable(MI_VICECHEE); @@ -1495,13 +1638,13 @@ CStreaming::StreamVehiclesAndPeds(void) } } -//--MIAMI: TODO void CStreaming::StreamZoneModels(const CVector &pos) { - int i; + int i, j; uint16 gangsToLoad, gangCarsToLoad, bit; CZoneInfo info; + static int timeBeforeNextLoad = 0; CTheZones::GetZoneInfoForTimeOfDay(&pos, &info); @@ -1510,22 +1653,64 @@ CStreaming::StreamZoneModels(const CVector &pos) // unload pevious group if(ms_currentPedGrp != -1) for(i = 0; i < NUMMODELSPERPEDGROUP; i++){ - if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] == -1) - break; - SetModelIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); - SetModelTxdIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + ms_bIsPedFromPedGroupLoaded[i] = false; + if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] != -1){ + SetModelIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + SetModelTxdIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + } } ms_currentPedGrp = info.pedGroup; - for(i = 0; i < NUMMODELSPERPEDGROUP; i++){ - if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] == -1) - break; - RequestModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i], STREAMFLAGS_DEPENDENCY); + for(i = 0; i < MAXZONEPEDSLOADED; i++){ + do + j = CGeneral::GetRandomNumberInRange(0, NUMMODELSPERPEDGROUP); + while(ms_bIsPedFromPedGroupLoaded[j]); + ms_bIsPedFromPedGroupLoaded[j] = true; + if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j] != -1) + RequestModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i], STREAMFLAGS_DEPENDENCY); + } + ms_numPedsLoaded = MAXZONEPEDSLOADED; + timeBeforeNextLoad = 300; + } + + if(timeBeforeNextLoad >= 0) + timeBeforeNextLoad--; + else{ + // Switch a ped + int oldMI; + // Find a ped to unload + for(i = 0; i < NUMMODELSPERPEDGROUP; i++) + if(ms_bIsPedFromPedGroupLoaded[i]){ + oldMI = CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]; + if(oldMI != -1 && CModelInfo::GetModelInfo(oldMI)->GetNumRefs() == 0) + break; + } + // And load a new one + if(i != NUMMODELSPERPEDGROUP || ms_numPedsLoaded < MAXZONEPEDSLOADED){ + do + j = CGeneral::GetRandomNumberInRange(0, NUMMODELSPERPEDGROUP); + while(ms_bIsPedFromPedGroupLoaded[j]); + if(ms_numPedsLoaded == MAXZONEPEDSLOADED) + ms_bIsPedFromPedGroupLoaded[i] = 0; + ms_bIsPedFromPedGroupLoaded[j] = true; + int newMI = CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j]; + if(newMI != oldMI){ + RequestModel(newMI, STREAMFLAGS_DEPENDENCY); + debug("Request Ped %s\n", CModelInfo::GetModelInfo(newMI)->GetName()); + if(ms_numPedsLoaded == MAXZONEPEDSLOADED){ + SetModelIsDeletable(oldMI); + SetModelTxdIsDeletable(oldMI); + debug("Remove Ped %s\n", CModelInfo::GetModelInfo(oldMI)->GetName()); + }else + ms_numPedsLoaded++; + timeBeforeNextLoad = 300; + } } } + RequestModel(MI_MALE01, STREAMFLAGS_DONT_REMOVE); - //RequestModel(MI_HMOCA, STREAMFLAGS_DONT_REMOVE); + RequestModel(MI_TAXI_D, STREAMFLAGS_DONT_REMOVE); gangsToLoad = 0; gangCarsToLoad = 0; @@ -1543,35 +1728,35 @@ CStreaming::StreamZoneModels(const CVector &pos) if(gangsToLoad == ms_loadedGangs && gangCarsToLoad == ms_loadedGangCars) return; - gangsToLoad |= gangCarsToLoad; + int gangModelsToload = gangsToLoad | gangCarsToLoad; - for(i = 0; i < NUM_GANGS; i++){ - bit = 1< 0){ + numRequests--; streamId = GetNextFileOnCd(0, priority); if(streamId == -1) break; ms_aInfoForModel[streamId].RemoveFromList(); + ms_channel[0].streamIds[0] = streamId; DecrementRef(streamId); if(ms_aInfoForModel[streamId].GetCdPosnAndSize(posn, size)){ @@ -2072,7 +2256,6 @@ CStreaming::LoadAllRequestedModels(bool priority) bInsideLoadAll = false; } -//--MIAMI: done void CStreaming::FlushChannels(void) { @@ -2094,7 +2277,6 @@ CStreaming::FlushChannels(void) ProcessLoadingChannel(1); } -//--MIAMI: done void CStreaming::FlushRequestList(void) { @@ -2126,10 +2308,10 @@ CStreaming::UpdateMemoryUsed(void) // empty } -#define STREAM_DIST (2*SECTOR_SIZE_X) +#define STREAM_DIST 80.0f void -CStreaming::AddModelsToRequestList(const CVector &pos) +CStreaming::AddModelsToRequestList(const CVector &pos, int32 flags) { float xmin, xmax, ymin, ymax; int ixmin, ixmax, iymin, iymax; @@ -2163,23 +2345,23 @@ CStreaming::AddModelsToRequestList(const CVector &pos) dx = ix - CWorld::GetSectorIndexX(pos.x); d = dx*dx + dy*dy; sect = CWorld::GetSector(ix, iy); - if(d <= 1){ - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS]); - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS_OVERLAP]); - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_OBJECTS]); - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_DUMMIES]); - }else if(d <= 4*4){ - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS], pos.x, pos.y, xmin, ymin, xmax, ymax); - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], pos.x, pos.y, xmin, ymin, xmax, ymax); - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_OBJECTS], pos.x, pos.y, xmin, ymin, xmax, ymax); - ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_DUMMIES], pos.x, pos.y, xmin, ymin, xmax, ymax); + if(d <= 0){ + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS], flags); + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], flags); + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_OBJECTS], flags); + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_DUMMIES], flags); + }else if(d <= 3*3){ + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS], pos.x, pos.y, xmin, ymin, xmax, ymax, flags); + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_BUILDINGS_OVERLAP], pos.x, pos.y, xmin, ymin, xmax, ymax, flags); + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_OBJECTS], pos.x, pos.y, xmin, ymin, xmax, ymax, flags); + ProcessEntitiesInSectorList(sect->m_lists[ENTITYLIST_DUMMIES], pos.x, pos.y, xmin, ymin, xmax, ymax, flags); } } } } void -CStreaming::ProcessEntitiesInSectorList(CPtrList &list, float x, float y, float xmin, float ymin, float xmax, float ymax) +CStreaming::ProcessEntitiesInSectorList(CPtrList &list, float x, float y, float xmin, float ymin, float xmax, float ymax, int32 flags) { CPtrNode *node; CEntity *e; @@ -2193,8 +2375,7 @@ CStreaming::ProcessEntitiesInSectorList(CPtrList &list, float x, float y, float continue; e->m_scanCode = CWorld::GetCurrentScanCode(); - if(!e->bStreamingDontDelete && !e->bIsSubway && - (!e->IsObject() || ((CObject*)e)->ObjectCreatedBy != TEMP_OBJECT)){ + if(!e->bStreamingDontDelete && IsAreaVisible(e->m_area) && !e->bDontStream && e->bIsVisible){ CTimeModelInfo *mi = (CTimeModelInfo*)CModelInfo::GetModelInfo(e->GetModelIndex()); if (mi->GetModelType() != MITYPE_TIME || CClock::GetIsTimeInRange(mi->GetTimeOn(), mi->GetTimeOff())) { lodDistSq = sq(mi->GetLargestLodDistance()); @@ -2203,14 +2384,14 @@ CStreaming::ProcessEntitiesInSectorList(CPtrList &list, float x, float y, float if(xmin < pos.x && pos.x < xmax && ymin < pos.y && pos.y < ymax && (CVector2D(x, y) - pos).MagnitudeSqr() < lodDistSq) - RequestModel(e->GetModelIndex(), 0); + RequestModel(e->GetModelIndex(), flags); } } } } void -CStreaming::ProcessEntitiesInSectorList(CPtrList &list) +CStreaming::ProcessEntitiesInSectorList(CPtrList &list, int32 flags) { CPtrNode *node; CEntity *e; @@ -2222,11 +2403,10 @@ CStreaming::ProcessEntitiesInSectorList(CPtrList &list) continue; e->m_scanCode = CWorld::GetCurrentScanCode(); - if(!e->bStreamingDontDelete && !e->bIsSubway && - (!e->IsObject() || ((CObject*)e)->ObjectCreatedBy != TEMP_OBJECT)){ + if(!e->bStreamingDontDelete && IsAreaVisible(e->m_area) && !e->bDontStream && e->bIsVisible){ CTimeModelInfo *mi = (CTimeModelInfo*)CModelInfo::GetModelInfo(e->GetModelIndex()); if (mi->GetModelType() != MITYPE_TIME || CClock::GetIsTimeInRange(mi->GetTimeOn(), mi->GetTimeOff())) - RequestModel(e->GetModelIndex(), 0); + RequestModel(e->GetModelIndex(), flags); } } } @@ -2421,7 +2601,7 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) assert(ymin <= ymax); // Delete a block of sectors that we know is behind the camera - if(TheCamera.GetForward().x > 0){ + if(TheCamera.GetForward().x > 0.0f){ // looking east xmax = Max(ix - 2, 0); xmin = Max(ix - 10, 0); @@ -2442,8 +2622,13 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) } } + + while(RemoveLoadedZoneModel()) + if(ms_memoryUsed < mem) + return; + // Now a block that intersects with the camera's frustum - if(TheCamera.GetForward().x > 0){ + if(TheCamera.GetForward().x > 0.0f){ // looking east xmax = Max(ix + 10, 0); xmin = Max(ix - 2, 0); @@ -2482,7 +2667,7 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) assert(xmin <= xmax); // Delete a block of sectors that we know is behind the camera - if(TheCamera.GetForward().y > 0){ + if(TheCamera.GetForward().y > 0.0f){ // looking north ymax = Max(iy - 2, 0); ymin = Max(iy - 10, 0); @@ -2503,8 +2688,12 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) } } + while(RemoveLoadedZoneModel()) + if(ms_memoryUsed < mem) + return; + // Now a block that intersects with the camera's frustum - if(TheCamera.GetForward().y > 0){ + if(TheCamera.GetForward().y > 0.0f){ // looking north ymax = Max(iy + 10, 0); ymin = Max(iy - 2, 0); @@ -2525,6 +2714,10 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) } } +// this is gone in mobile together with RemoveReferencedTxds +// if(RemoveReferencedTxds(mem)) +// return; + // As last resort, delete objects from the last step more aggressively for(x = xmin; x <= xmax; x++){ for(y = ymax; y != ymin; y -= inc){ @@ -2536,6 +2729,8 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) } } } + + while(ms_memoryUsed >= mem && RemoveLeastUsedModel(0)); } void @@ -2561,13 +2756,13 @@ CStreaming::DeleteRwObjectsInOverlapSectorList(CPtrList &list, int32 x, int32 y) e = (CEntity*)node->item; if(e->m_rwObject && !e->bStreamingDontDelete && !e->bImBeingRendered){ // Now this is pretty weird... - if(Abs(CWorld::GetSectorIndexX(e->GetPosition().x) - x) >= 2.0f) + if(Abs(CWorld::GetSectorIndexX(e->GetPosition().x) - x) >= 1.6f) // { e->DeleteRwObject(); // return; // BUG? // } else // FIX? - if(Abs(CWorld::GetSectorIndexY(e->GetPosition().y) - y) >= 2.0f) + if(Abs(CWorld::GetSectorIndexY(e->GetPosition().y) - y) >= 1.6f) e->DeleteRwObject(); } } @@ -2582,7 +2777,8 @@ CStreaming::DeleteRwObjectsBehindCameraInSectorList(CPtrList &list, size_t mem) for(node = list.first; node; node = node->next){ e = (CEntity*)node->item; if(!e->bStreamingDontDelete && !e->bImBeingRendered && - e->m_rwObject && ms_aInfoForModel[e->GetModelIndex()].m_next){ + e->m_rwObject && ms_aInfoForModel[e->GetModelIndex()].m_next && + FindPlayerPed()->m_pCurSurface != e){ e->DeleteRwObject(); if (CModelInfo::GetModelInfo(e->GetModelIndex())->GetNumRefs() == 0) { RemoveModel(e->GetModelIndex()); @@ -2603,7 +2799,7 @@ CStreaming::DeleteRwObjectsNotInFrustumInSectorList(CPtrList &list, size_t mem) for(node = list.first; node; node = node->next){ e = (CEntity*)node->item; if(!e->bStreamingDontDelete && !e->bImBeingRendered && - e->m_rwObject && !e->IsVisible() && ms_aInfoForModel[e->GetModelIndex()].m_next){ + e->m_rwObject && (!e->IsVisible() || e->bOffscreen) && ms_aInfoForModel[e->GetModelIndex()].m_next){ e->DeleteRwObject(); if (CModelInfo::GetModelInfo(e->GetModelIndex())->GetNumRefs() == 0) { RemoveModel(e->GetModelIndex()); @@ -2629,7 +2825,6 @@ CStreaming::MakeSpaceFor(int32 size) } } -//--MIAMI: done void CStreaming::LoadScene(const CVector &pos) { @@ -2655,7 +2850,7 @@ CStreaming::LoadScene(const CVector &pos) LoadAllRequestedModels(false); InstanceBigBuildings(level, pos); InstanceBigBuildings(LEVEL_GENERIC, pos); - AddModelsToRequestList(pos); + AddModelsToRequestList(pos, STREAMFLAGS_20); CRadar::StreamRadarSections(pos); if (!CGame::IsInInterior()) { @@ -2674,7 +2869,6 @@ CStreaming::LoadScene(const CVector &pos) debug("End load scene\n"); } -//--MIAMI: done void CStreaming::LoadSceneCollision(const CVector &pos) { @@ -2711,7 +2905,7 @@ void CStreaming::UpdateForAnimViewer(void) { if (CStreaming::ms_channelError == -1) { - CStreaming::AddModelsToRequestList(CVector(0.0f, 0.0f, 0.0f)); + CStreaming::AddModelsToRequestList(CVector(0.0f, 0.0f, 0.0f), 0); CStreaming::LoadRequestedModels(); // original modifier was %d sprintf(gString, "Requested %d, memory size %zuK\n", CStreaming::ms_numModelsRequested, 2 * CStreaming::ms_memoryUsed); diff --git a/src/core/Streaming.h b/src/core/Streaming.h index 569c06d8..dd85ce97 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -93,6 +93,7 @@ public: static CStreamingChannel ms_channel[2]; static int32 ms_channelError; static int32 ms_numVehiclesLoaded; + static int32 ms_numPedsLoaded; static int32 ms_vehiclesLoaded[MAXVEHICLESLOADED]; static int32 ms_lastVehicleDeleted; static bool ms_bIsPedFromPedGroupLoaded[NUMMODELSPERPEDGROUP]; @@ -110,6 +111,7 @@ public: static void Init(void); static void Init2(void); + static void ReInit(void); static void Shutdown(void); static void Update(void); static void LoadCdDirectory(void); @@ -149,6 +151,7 @@ public: static void RemoveAnim(int32 id) { RemoveModel(id + STREAM_OFFSET_ANIM); } static void RemoveUnusedBuildings(eLevelName level); static void RemoveBuildings(eLevelName level); + static void RemoveBuildingsNotInArea(int32 area); static void RemoveUnusedBigBuildings(eLevelName level); static void RemoveIslandsNotUsed(eLevelName level); static void RemoveBigBuildings(eLevelName level); @@ -156,6 +159,7 @@ public: static bool RemoveLeastUsedModel(uint32 excludeMask); static void RemoveAllUnusedModels(void); static void RemoveUnusedModelsInLoadedList(void); + static bool RemoveLoadedZoneModel(void); static int32 GetAvailableVehicleSlot(void); static bool IsTxdUsedByRequestedModels(int32 txdId); static bool AreAnimsUsedByRequestedModels(int32 animId); @@ -187,9 +191,9 @@ public: static void IHaveUsedStreamingMemory(void); static void UpdateMemoryUsed(void); - static void AddModelsToRequestList(const CVector &pos); - static void ProcessEntitiesInSectorList(CPtrList &list, float x, float y, float xmin, float ymin, float xmax, float ymax); - static void ProcessEntitiesInSectorList(CPtrList &list); + static void AddModelsToRequestList(const CVector &pos, int32 flags); + static void ProcessEntitiesInSectorList(CPtrList &list, float x, float y, float xmin, float ymin, float xmax, float ymax, int32 flags); + static void ProcessEntitiesInSectorList(CPtrList &list, int32 flags); static void DeleteFarAwayRwObjects(const CVector &pos); static void DeleteAllRwObjects(void); static void DeleteRwObjectsAfterDeath(const CVector &pos); diff --git a/src/core/config.h b/src/core/config.h index 1cd9ca6c..5b4cebe4 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -113,6 +113,7 @@ enum Config { NUMPHONES = 50, NUMPEDGROUPS = 67, NUMMODELSPERPEDGROUP = 16, + MAXZONEPEDSLOADED = 8, NUMSHOTINFOS = 100, NUMROADBLOCKS = 300, diff --git a/src/core/main.cpp b/src/core/main.cpp index 7a25daac..0009048d 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -609,17 +609,13 @@ LoadingScreen(const char *str1, const char *str2, const char *splashscreen) } } +//--MIAMI: done void LoadingIslandScreen(const char *levelName) { CSprite2d *splash; - wchar *name; - char str[100]; - wchar wstr[80]; - CRGBA col; splash = LoadSplash(nil); - name = TheText.Get(levelName); if(!DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255)) return; @@ -627,26 +623,10 @@ LoadingIslandScreen(const char *levelName) CSprite2d::InitPerFrame(); CFont::InitPerFrame(); DefinedState(); - col = CRGBA(255, 255, 255, 255); + CRGBA col = CRGBA(255, 255, 255, 255); + CRGBA col2 = CRGBA(0, 0, 0, 255); + CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT), col2); splash->Draw(CRect(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT), col, col, col, col); - CFont::SetBackgroundOff(); - CFont::SetScale(1.5f, 1.5f); - CFont::SetPropOn(); - CFont::SetRightJustifyOn(); - CFont::SetRightJustifyWrap(150.0f); - CFont::SetFontStyle(FONT_HEADING); - sprintf(str, "WELCOME TO"); - AsciiToUnicode(str, wstr); - CFont::SetDropColor(CRGBA(0, 0, 0, 255)); - CFont::SetDropShadowPosition(3); - CFont::SetColor(CRGBA(243, 237, 71, 255)); - CFont::SetScale(SCREEN_STRETCH_X(1.2f), SCREEN_STRETCH_Y(1.2f)); - CFont::PrintString(SCREEN_WIDTH - 20, SCREEN_STRETCH_FROM_BOTTOM(110.0f), TheText.Get("WELCOME")); - TextCopy(wstr, name); - TheText.UpperCase(wstr); - CFont::SetColor(CRGBA(243, 237, 71, 255)); - CFont::SetScale(SCREEN_STRETCH_X(1.2f), SCREEN_STRETCH_Y(1.2f)); - CFont::PrintString(SCREEN_WIDTH-20, SCREEN_STRETCH_FROM_BOTTOM(80.0f), wstr); CFont::DrawFonts(); DoRWStuffEndOfFrame(); } diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 165436b5..390c3ccd 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -3001,6 +3001,22 @@ CPed::CanBeDeleted(void) } } +//--MIAMI: done +bool +CPed::CanBeDeletedEvenInVehicle(void) +{ + switch (CharCreatedBy) { + case RANDOM_CHAR: + return true; + case MISSION_CHAR: + return false; + case TODO_CHAR: + return false; + default: + return true; + } +} + // --MIAMI: Done bool CPed::CanPedDriveOff(void) diff --git a/src/peds/Ped.h b/src/peds/Ped.h index b7d0a856..56244752 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -911,6 +911,7 @@ public: bool IsPedInControl(void); bool CanPedDriveOff(void); bool CanBeDeleted(void); + bool CanBeDeletedEvenInVehicle(void); bool CanStrafeOrMouseControl(void); bool CanPedReturnToState(void); void SetMoveState(eMoveState); diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 3199307b..35417104 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -1,7 +1,9 @@ #pragma warning( push ) #pragma warning( disable : 4005) #pragma warning( pop ) +#ifndef LIBRW #define WITHD3D +#endif #include "common.h" #ifndef LIBRW #include "rpanisot.h" @@ -221,7 +223,11 @@ CanVideoCardDoDXT(void) { #ifdef LIBRW // TODO +#ifdef RW_OPENGL + return false +#else return true; +#endif #else return _rwD3D8CheckValidTextureFormat(D3DFMT_DXT1) && _rwD3D8CheckValidTextureFormat(D3DFMT_DXT3); #endif From dace79c7c351d77e83afa3f77a9c34763f9292f1 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 20 Aug 2020 23:45:05 +0200 Subject: [PATCH 093/112] small streaming fixes --- src/core/Streaming.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 1892bf57..507815fa 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -273,8 +273,12 @@ CStreaming::Shutdown(void) { RwFreeAlign(ms_pStreamingBuffer[0]); ms_streamingBufferSize = 0; - if(ms_pExtraObjectsDir) + if(ms_pExtraObjectsDir){ delete ms_pExtraObjectsDir; +#ifdef FIX_BUGS + ms_pExtraObjectsDir = nil; +#endif + } } void @@ -1191,7 +1195,7 @@ found: if(id == -1) return false; // still no luck ms_lastVehicleDeleted = id; - // this is more that we wanted actually + // this is more than we wanted actually ms_numVehiclesLoaded++; }else RemoveModel(id); @@ -1384,18 +1388,17 @@ CStreaming::StreamZoneModels(const CVector &pos) // unload pevious group if(ms_currentPedGrp != -1) for(i = 0; i < NUMMODELSPERPEDGROUP; i++){ - if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] == -1) - break; - SetModelIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); - SetModelTxdIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] != -1){ + SetModelIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + SetModelTxdIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); + } } ms_currentPedGrp = info.pedGroup; for(i = 0; i < NUMMODELSPERPEDGROUP; i++){ - if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] == -1) - break; - RequestModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i], STREAMFLAGS_DONT_REMOVE); + if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] != -1) + RequestModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i], STREAMFLAGS_DONT_REMOVE); } } RequestModel(MI_MALE01, STREAMFLAGS_DONT_REMOVE); @@ -1593,8 +1596,6 @@ CStreaming::GetNextFileOnCd(int32 lastPosn, bool priority) * Files larger than the buffer size can only be loaded by channel 0, * which then uses both buffers, while channel 1 is idle. * ms_bLoadingBigModel is set to true to indicate this state. - * - * TODO: two-part files */ // Make channel read from disc @@ -1935,7 +1936,7 @@ CStreaming::UpdateMemoryUsed(void) // empty } -#define STREAM_DIST (2*SECTOR_SIZE_X) +#define STREAM_DIST 80.0f void CStreaming::AddModelsToRequestList(const CVector &pos) @@ -2232,7 +2233,7 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) assert(ymin <= ymax); // Delete a block of sectors that we know is behind the camera - if(TheCamera.GetForward().x > 0){ + if(TheCamera.GetForward().x > 0.0f){ // looking east xmax = Max(ix - 2, 0); xmin = Max(ix - 10, 0); @@ -2254,7 +2255,7 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) } // Now a block that intersects with the camera's frustum - if(TheCamera.GetForward().x > 0){ + if(TheCamera.GetForward().x > 0.0f){ // looking east xmax = Max(ix + 10, 0); xmin = Max(ix - 2, 0); @@ -2296,7 +2297,7 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) assert(xmin <= xmax); // Delete a block of sectors that we know is behind the camera - if(TheCamera.GetForward().y > 0){ + if(TheCamera.GetForward().y > 0.0f){ // looking north ymax = Max(iy - 2, 0); ymin = Max(iy - 10, 0); @@ -2318,7 +2319,7 @@ CStreaming::DeleteRwObjectsBehindCamera(size_t mem) } // Now a block that intersects with the camera's frustum - if(TheCamera.GetForward().y > 0){ + if(TheCamera.GetForward().y > 0.0f){ // looking north ymax = Max(iy + 10, 0); ymin = Max(iy - 2, 0); From 537b63acb50fcf482f518f11a62c766197f50a20 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 21 Aug 2020 00:05:05 +0200 Subject: [PATCH 094/112] call streaming funcs --- src/control/GameLogic.cpp | 2 +- src/control/Script.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/control/GameLogic.cpp b/src/control/GameLogic.cpp index f4e4fdd4..c5394e7c 100644 --- a/src/control/GameLogic.cpp +++ b/src/control/GameLogic.cpp @@ -372,7 +372,7 @@ CGameLogic::RestorePlayerStuffDuringResurrection(CPlayerPed *pPlayerPed, CVector CWorld::ClearExcitingStuffFromArea(pos, 4000.0, 1); pPlayerPed->RestoreHeadingRate(); CGame::currArea = AREA_MAIN_MAP; - //CStreaming::RemoveBuildingsNotInArea(0); // TODO(MIAMI) + CStreaming::RemoveBuildingsNotInArea(0); TheCamera.SetCameraDirectlyInFrontForFollowPed_CamOnAString(); TheCamera.Restore(); CReferences::RemoveReferencesToPlayer(); diff --git a/src/control/Script.cpp b/src/control/Script.cpp index fb95e834..ea94794b 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -12308,8 +12308,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_SET_AREA_VISIBLE: CollectParameters(&m_nIp, 1); CGame::currArea = ScriptParams[0]; - // TODO(MIAMI) !! - //CStreaming::RemoveBuildingsNotInArea(ScriptParams[0]); + CStreaming::RemoveBuildingsNotInArea(ScriptParams[0]); return 0; case COMMAND_SET_CUTSCENE_ANIM_TO_LOOP: { From ac5af18891a48307c82f65cc291d21074fa194fe Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 21 Aug 2020 09:40:10 +0200 Subject: [PATCH 095/112] fixed CRenderer::ScanSectorPoly again --- src/render/Renderer.cpp | 83 +++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 8a93ee70..7a688ce8 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -825,6 +825,12 @@ CalcNewDelta(RwV2d *a, RwV2d *b) return (b->x - a->x) / (b->y - a->y); } +#ifdef FIX_BUGS +#define TOINT(x) ((int)Floor(x)) +#else +#define TOINT(x) ((int)(x)) +#endif + void CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrList *)) { @@ -850,13 +856,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL a2 = i; } } -#ifdef FIX_BUGS - y = Floor(miny); - yend = Floor(maxy); -#else - y = miny; - yend = maxy; -#endif + y = TOINT(miny); + yend = TOINT(maxy); // Go left in poly to find first edge b b2 = a2; @@ -864,8 +865,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL b1 = b2--; if(b2 < 0) b2 = numVertices-1; if(poly[b1].x < xstart) - xstart = poly[b1].x; - if((int)poly[b1].y != (int)poly[b2].y) + xstart = TOINT(poly[b1].x); + if(TOINT(poly[b1].y) != TOINT(poly[b2].y)) break; } // Go right to find first edge a @@ -873,8 +874,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL a1 = a2++; if(a2 == numVertices) a2 = 0; if(poly[a1].x > xend) - xend = poly[a1].x; - if((int)poly[a1].y != (int)poly[a2].y) + xend = TOINT(poly[a1].x); + if(TOINT(poly[a1].y) != TOINT(poly[a2].y)) break; } @@ -885,10 +886,10 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL xB = deltaB * (Ceil(poly[b1].y) - poly[b1].y) + poly[b1].x; if(y != yend){ - if(deltaB < 0.0f && (int)xB < xstart) - xstart = xB; - if(deltaA >= 0.0f && (int)xA > xend) - xend = xA; + if(deltaB < 0.0f && TOINT(xB) < xstart) + xstart = TOINT(xB); + if(deltaA >= 0.0f && TOINT(xA) > xend) + xend = TOINT(xA); } while(y <= yend && y < NUMSECTORS_Y){ @@ -904,74 +905,74 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL xB += deltaB; // update left side - if(y == (int)poly[b2].y){ + if(y == TOINT(poly[b2].y)){ // reached end of edge if(y == yend){ if(deltaB < 0.0f){ do{ - xstart = poly[b2--].x; + xstart = TOINT(poly[b2--].x); if(b2 < 0) b2 = numVertices-1; - }while(xstart > (int)poly[b2].x); + }while(xstart > TOINT(poly[b2].x)); }else - xstart = xB - deltaB; + xstart = TOINT(xB - deltaB); }else{ // switch edges if(deltaB < 0.0f) - xstart = poly[b2].x; + xstart = TOINT(poly[b2].x); else - xstart = xB - deltaB; + xstart = TOINT(xB - deltaB); do{ b1 = b2--; if(b2 < 0) b2 = numVertices-1; - if((int)poly[b1].x < xstart) - xstart = poly[b1].x; - }while(y == (int)poly[b2].y); + if(TOINT(poly[b1].x) < xstart) + xstart = TOINT(poly[b1].x); + }while(y == TOINT(poly[b2].y)); deltaB = CalcNewDelta(&poly[b1], &poly[b2]); xB = deltaB * (Ceil(poly[b1].y) - poly[b1].y) + poly[b1].x; - if(deltaB < 0.0f && (int)xB < xstart) - xstart = xB; + if(deltaB < 0.0f && TOINT(xB) < xstart) + xstart = TOINT(xB); } }else{ if(deltaB < 0.0f) - xstart = xB; + xstart = TOINT(xB); else - xstart = xB - deltaB; + xstart = TOINT(xB - deltaB); } // update right side - if(y == (int)poly[a2].y){ + if(y == TOINT(poly[a2].y)){ // reached end of edge if(y == yend){ if(deltaA < 0.0f) - xend = xA - deltaA; + xend = TOINT(xA - deltaA); else{ do{ - xend = poly[a2++].x; + xend = TOINT(poly[a2++].x); if(a2 == numVertices) a2 = 0; - }while(xend < (int)poly[a2].x); + }while(xend < TOINT(poly[a2].x)); } }else{ // switch edges if(deltaA < 0.0f) - xend = xA - deltaA; + xend = TOINT(xA - deltaA); else - xend = poly[a2].x; + xend = TOINT(poly[a2].x); do{ a1 = a2++; if(a2 == numVertices) a2 = 0; - if((int)poly[a1].x > xend) - xend = poly[a1].x; - }while(y == (int)poly[a2].y); + if(TOINT(poly[a1].x) > xend) + xend = TOINT(poly[a1].x); + }while(y == TOINT(poly[a2].y)); deltaA = CalcNewDelta(&poly[a1], &poly[a2]); xA = deltaA * (Ceil(poly[a1].y) - poly[a1].y) + poly[a1].x; - if(deltaA >= 0.0f && (int)xA > xend) - xend = xA; + if(deltaA >= 0.0f && TOINT(xA) > xend) + xend = TOINT(xA); } }else{ if(deltaA < 0.0f) - xend = xA - deltaA; + xend = TOINT(xA - deltaA); else - xend = xA; + xend = TOINT(xA); } } } From 23c52c1c86620f4204371c034ce1c4d5c5e93b39 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 21 Aug 2020 09:40:31 +0200 Subject: [PATCH 096/112] fixed CRenderer::ScanSectorPoly again --- src/render/Renderer.cpp | 83 +++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index a6673135..3b996b55 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -889,6 +889,12 @@ CalcNewDelta(RwV2d *a, RwV2d *b) return (b->x - a->x) / (b->y - a->y); } +#ifdef FIX_BUGS +#define TOINT(x) ((int)Floor(x)) +#else +#define TOINT(x) ((int)(x)) +#endif + void CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrList *)) { @@ -914,13 +920,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL a2 = i; } } -#ifdef FIX_BUGS - y = Floor(miny); - yend = Floor(maxy); -#else - y = miny; - yend = maxy; -#endif + y = TOINT(miny); + yend = TOINT(maxy); // Go left in poly to find first edge b b2 = a2; @@ -928,8 +929,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL b1 = b2--; if(b2 < 0) b2 = numVertices-1; if(poly[b1].x < xstart) - xstart = poly[b1].x; - if((int)poly[b1].y != (int)poly[b2].y) + xstart = TOINT(poly[b1].x); + if(TOINT(poly[b1].y) != TOINT(poly[b2].y)) break; } // Go right to find first edge a @@ -937,8 +938,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL a1 = a2++; if(a2 == numVertices) a2 = 0; if(poly[a1].x > xend) - xend = poly[a1].x; - if((int)poly[a1].y != (int)poly[a2].y) + xend = TOINT(poly[a1].x); + if(TOINT(poly[a1].y) != TOINT(poly[a2].y)) break; } @@ -949,10 +950,10 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL xB = deltaB * (Ceil(poly[b1].y) - poly[b1].y) + poly[b1].x; if(y != yend){ - if(deltaB < 0.0f && (int)xB < xstart) - xstart = xB; - if(deltaA >= 0.0f && (int)xA > xend) - xend = xA; + if(deltaB < 0.0f && TOINT(xB) < xstart) + xstart = TOINT(xB); + if(deltaA >= 0.0f && TOINT(xA) > xend) + xend = TOINT(xA); } while(y <= yend && y < NUMSECTORS_Y){ @@ -968,74 +969,74 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL xB += deltaB; // update left side - if(y == (int)poly[b2].y){ + if(y == TOINT(poly[b2].y)){ // reached end of edge if(y == yend){ if(deltaB < 0.0f){ do{ - xstart = poly[b2--].x; + xstart = TOINT(poly[b2--].x); if(b2 < 0) b2 = numVertices-1; - }while(xstart > (int)poly[b2].x); + }while(xstart > TOINT(poly[b2].x)); }else - xstart = xB - deltaB; + xstart = TOINT(xB - deltaB); }else{ // switch edges if(deltaB < 0.0f) - xstart = poly[b2].x; + xstart = TOINT(poly[b2].x); else - xstart = xB - deltaB; + xstart = TOINT(xB - deltaB); do{ b1 = b2--; if(b2 < 0) b2 = numVertices-1; - if((int)poly[b1].x < xstart) - xstart = poly[b1].x; - }while(y == (int)poly[b2].y); + if(TOINT(poly[b1].x) < xstart) + xstart = TOINT(poly[b1].x); + }while(y == TOINT(poly[b2].y)); deltaB = CalcNewDelta(&poly[b1], &poly[b2]); xB = deltaB * (Ceil(poly[b1].y) - poly[b1].y) + poly[b1].x; - if(deltaB < 0.0f && (int)xB < xstart) - xstart = xB; + if(deltaB < 0.0f && TOINT(xB) < xstart) + xstart = TOINT(xB); } }else{ if(deltaB < 0.0f) - xstart = xB; + xstart = TOINT(xB); else - xstart = xB - deltaB; + xstart = TOINT(xB - deltaB); } // update right side - if(y == (int)poly[a2].y){ + if(y == TOINT(poly[a2].y)){ // reached end of edge if(y == yend){ if(deltaA < 0.0f) - xend = xA - deltaA; + xend = TOINT(xA - deltaA); else{ do{ - xend = poly[a2++].x; + xend = TOINT(poly[a2++].x); if(a2 == numVertices) a2 = 0; - }while(xend < (int)poly[a2].x); + }while(xend < TOINT(poly[a2].x)); } }else{ // switch edges if(deltaA < 0.0f) - xend = xA - deltaA; + xend = TOINT(xA - deltaA); else - xend = poly[a2].x; + xend = TOINT(poly[a2].x); do{ a1 = a2++; if(a2 == numVertices) a2 = 0; - if((int)poly[a1].x > xend) - xend = poly[a1].x; - }while(y == (int)poly[a2].y); + if(TOINT(poly[a1].x) > xend) + xend = TOINT(poly[a1].x); + }while(y == TOINT(poly[a2].y)); deltaA = CalcNewDelta(&poly[a1], &poly[a2]); xA = deltaA * (Ceil(poly[a1].y) - poly[a1].y) + poly[a1].x; - if(deltaA >= 0.0f && (int)xA > xend) - xend = xA; + if(deltaA >= 0.0f && TOINT(xA) > xend) + xend = TOINT(xA); } }else{ if(deltaA < 0.0f) - xend = xA - deltaA; + xend = TOINT(xA - deltaA); else - xend = xA; + xend = TOINT(xA); } } } From cc2f13710dee31b98040d9214b09f7c616f2c52d Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 21 Aug 2020 12:09:45 +0200 Subject: [PATCH 097/112] fix streaming bug --- src/core/Streaming.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 1e2143d8..74fec192 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -1824,7 +1824,7 @@ CStreaming::LoadBigBuildingsWhenNeeded(void) LoadSplash(GetLevelSplashScreen(CGame::currLevel)); CStreaming::RequestBigBuildings(CGame::currLevel, TheCamera.GetPosition()); - CStreaming::LoadAllRequestedModels(true); + CStreaming::LoadAllRequestedModels(false); CGame::TidyUpMemory(true, true); CTimer::Resume(); From 13c34b0863ddf6b4d55f5ff373c10252c4321f2b Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 21 Aug 2020 13:28:33 +0200 Subject: [PATCH 098/112] finished cullzones --- src/core/ZoneCull.cpp | 25 +++++++++++++++++++++++++ src/core/ZoneCull.h | 12 +++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/core/ZoneCull.cpp b/src/core/ZoneCull.cpp index 729cc35d..69c7a796 100644 --- a/src/core/ZoneCull.cpp +++ b/src/core/ZoneCull.cpp @@ -11,6 +11,8 @@ #include "ZoneCull.h" #include "Zones.h" +//--MIAMI: done + int32 CCullZones::NumAttributeZones; CAttributeZone CCullZones::aAttributeZones[NUMATTRIBZONES]; @@ -18,6 +20,7 @@ int32 CCullZones::CurrentWantedLevelDrop_Player; int32 CCullZones::CurrentFlags_Camera; int32 CCullZones::CurrentFlags_Player; bool CCullZones::bCurrentSubwayIsInvisible; +bool CCullZones::bAtBeachForAudio; void CCullZones::Init(void) @@ -37,6 +40,7 @@ CCullZones::Update(void) switch(CTimer::GetFrameCounter() & 7){ case 0: case 4: + UpdateAtBeachForAudio(); break; case 2: @@ -57,6 +61,27 @@ CCullZones::Update(void) } } +// TODO? put somewhere else? +bool +IsPointWithinArbitraryArea(float px, float py, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) +{ + if((px-x1)*(x2-x1) - (py-y1)*(y2-y1) < 0.0f) return false; + if((px-x2)*(x3-x2) - (py-y2)*(y3-y2) < 0.0f) return false; + if((px-x3)*(x4-x3) - (py-y3)*(y4-y3) < 0.0f) return false; + if((px-x4)*(x1-x4) - (py-y4)*(y1-y4) < 0.0f) return false; + return true; +} + +void +CCullZones::UpdateAtBeachForAudio(void) +{ + bAtBeachForAudio = IsPointWithinArbitraryArea(TheCamera.GetPosition().x, TheCamera.GetPosition().y, + 400.0f, -1644.4f, + 751.9f, 1267.8f, + 971.9f, 1216.2f, + 840.0f, -1744.0f); +} + void CCullZones::ForceCullZoneCoors(CVector coors) { diff --git a/src/core/ZoneCull.h b/src/core/ZoneCull.h index aae06ca0..8200b09a 100644 --- a/src/core/ZoneCull.h +++ b/src/core/ZoneCull.h @@ -10,8 +10,9 @@ enum eZoneAttribs ATTRZONE_NOTCULLZONE = 0x20, ATTRZONE_DOINEEDCOLLISION = 0x40, ATTRZONE_SUBWAYVISIBLE = 0x80, - - ATTRZONE_WATERFUDGE = 0x400, + ATTRZONE_POLICEABANDONCARS = 0x100, + ATTRZONE_ROOMFORAUDIO = 0x200, + ATTRZONE_WATERFUDGE = 0x400, }; struct CAttributeZone @@ -36,9 +37,11 @@ public: static int32 CurrentFlags_Camera; static int32 CurrentFlags_Player; static bool bCurrentSubwayIsInvisible; + static bool bAtBeachForAudio; static void Init(void); static void Update(void); + static void UpdateAtBeachForAudio(void); static void ForceCullZoneCoors(CVector coors); static int32 FindAttributesForCoors(CVector coors, int32 *wantedLevel); static CAttributeZone *FindZoneWithStairsAttributeForPlayer(void); @@ -55,9 +58,8 @@ public: static bool DoINeedToLoadCollision(void) { return (CurrentFlags_Player & ATTRZONE_DOINEEDCOLLISION) != 0; } static bool PlayerNoRain(void) { return (CurrentFlags_Player & ATTRZONE_NORAIN) != 0; } static bool CamNoRain(void) { return (CurrentFlags_Camera & ATTRZONE_NORAIN) != 0; } + static bool PoliceAbandonCars(void) { return (CurrentFlags_Camera & ATTRZONE_POLICEABANDONCARS) != 0; } + static bool InRoomForAudio(void) { return (CurrentFlags_Camera & ATTRZONE_ROOMFORAUDIO) != 0; } static bool WaterFudge(void) { return (CurrentFlags_Camera & ATTRZONE_WATERFUDGE) != 0; } static int32 GetWantedLevelDrop(void) { return CurrentWantedLevelDrop_Player; } - - //--MIAMI: TODO - static bool PoliceAbandonCars(void) { return false; } }; From 4545ddee6d1ca27c76020e8af93ce528c9c26e21 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 21 Aug 2020 23:35:47 +0200 Subject: [PATCH 099/112] ... --- src/rw/TexRead.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 35417104..ad7d8fec 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -224,7 +224,7 @@ CanVideoCardDoDXT(void) #ifdef LIBRW // TODO #ifdef RW_OPENGL - return false + return false; #else return true; #endif From 0fd6fb1ff4b849a857ba1023421aa9232ba5ce15 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 23 Aug 2020 12:27:24 +0300 Subject: [PATCH 100/112] fixed a few embarassing mistakes --- src/control/CarCtrl.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 64049793..5b2454ac 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -161,7 +161,7 @@ CCarCtrl::GenerateOneRandomCar() carModel = ChoosePoliceCarModel(); }else{ carModel = ChooseModel(&zone, &vecTargetPos, &carClass); - if (carClass == COPS && pWanted->m_nWantedLevel >= 1 || carModel < 0) + if (carModel == -1 || (carClass == COPS && pWanted->m_nWantedLevel >= 1)) /* All cop spawns with wanted level are handled by condition above. */ /* In particular it means that cop cars never spawn if player has wanted level of 1. */ return; @@ -761,7 +761,8 @@ CCarCtrl::ChooseCarRating(CZoneInfo* pZoneInfo) int32 CCarCtrl::ChooseModel(CZoneInfo* pZone, CVector* pPos, int* pClass) { int32 model = -1; - for (int i = 0; i < 10 && (model == -1 || !CStreaming::HasModelLoaded(model)); i++) { + int32 i; + for (i = 10; i > 0 && (model == -1 || !CStreaming::HasModelLoaded(model)); i--) { int rnd = CGeneral::GetRandomNumberInRange(0, 1000); if (rnd < pZone->copThreshold) { @@ -770,9 +771,9 @@ CCarCtrl::ChooseModel(CZoneInfo* pZone, CVector* pPos, int* pClass) { continue; } - int j; + int32 j; for (j = 0; j < NUM_GANG_CAR_CLASSES; j++) { - if (rnd < pZone->gangThreshold[i]) { + if (rnd < pZone->gangThreshold[j]) { *pClass = j + FIRST_GANG_CAR_RATING; model = ChooseGangCarModel(j); break; @@ -785,6 +786,8 @@ CCarCtrl::ChooseModel(CZoneInfo* pZone, CVector* pPos, int* pClass) { *pClass = ChooseCarRating(pZone); model = ChooseCarModel(*pClass); } + if (i == 0) + return -1; return model; } From 38a01a59fab9f95f8413166e79e4a34ff77fbbb0 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 23 Aug 2020 13:27:37 +0200 Subject: [PATCH 101/112] CWeather done --- src/core/re3.cpp | 10 +- src/render/Weather.cpp | 308 +++++++++++++++++++++++++---------------- src/render/Weather.h | 3 + 3 files changed, 197 insertions(+), 124 deletions(-) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 6a305b4c..ce34dc0f 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -299,6 +299,12 @@ SETTWEAKPATH("TEST"); TWEAKSWITCH(CWeather::NewWeatherType, 0, 3, wt, NULL); */ +void +switchWeather(void) +{ + CWeather::StreamAfterRainTimer = 0; +} + void DebugMenuPopulate(void) { @@ -332,9 +338,9 @@ DebugMenuPopulate(void) e = DebugMenuAddVar("Time & Weather", "Current Minute", &CClock::GetMinutesRef(), [](){ CWeather::InterpolationValue = CClock::GetMinutes()/60.0f; }, 1, 0, 59, nil); DebugMenuEntrySetWrap(e, true); - e = DebugMenuAddVar("Time & Weather", "Old Weather", (int16*)&CWeather::OldWeatherType, nil, 1, 0, 5, weathers); + e = DebugMenuAddVar("Time & Weather", "Old Weather", (int16*)&CWeather::OldWeatherType, switchWeather, 1, 0, 5, weathers); DebugMenuEntrySetWrap(e, true); - e = DebugMenuAddVar("Time & Weather", "New Weather", (int16*)&CWeather::NewWeatherType, nil, 1, 0, 5, weathers); + e = DebugMenuAddVar("Time & Weather", "New Weather", (int16*)&CWeather::NewWeatherType, switchWeather, 1, 0, 5, weathers); DebugMenuEntrySetWrap(e, true); DebugMenuAddVarBool32("Time & Weather", "Extracolours On", &CTimeCycle::m_bExtraColourOn, nil); DebugMenuAddVar("Time & Weather", "Extracolour", &CTimeCycle::m_ExtraColour, nil, 1, 0, 23, extracols); diff --git a/src/render/Weather.cpp b/src/render/Weather.cpp index 945e1f5e..3f242362 100644 --- a/src/render/Weather.cpp +++ b/src/render/Weather.cpp @@ -19,6 +19,9 @@ #include "World.h" #include "ZoneCull.h" #include "SpecialFX.h" +#include "Replay.h" + +//--MIAMI: file done int32 CWeather::SoundHandle = -1; @@ -33,6 +36,7 @@ uint32 CWeather::LightningStart; uint32 CWeather::LightningFlashLastChange; uint32 CWeather::WhenToPlayLightningSound; uint32 CWeather::LightningDuration; +int32 CWeather::StreamAfterRainTimer; float CWeather::ExtraSunnyness; float CWeather::Foggyness; @@ -88,7 +92,7 @@ const int16 WeatherTypesList_WithHurricanes[] = { WEATHER_EXTRA_SUNNY, WEATHER_EXTRA_SUNNY, WEATHER_EXTRA_SUNNY, WEATHER_EXTRA_SUNNY }; -const float Windiness[] = { +const float Windyness[] = { 0.25f,// WEATHER_SUNNY 0.7f, // WEATHER_CLOUDY 1.0f, // WEATHER_RAINY @@ -140,22 +144,27 @@ void CWeather::Init(void) void CWeather::Update(void) { - float fNewInterpolation = CClock::GetMinutes() * 1.0f / 60; - if (fNewInterpolation < InterpolationValue) { - // new hour - OldWeatherType = NewWeatherType; - if (ForcedWeatherType >= 0) - NewWeatherType = ForcedWeatherType; - else { - WeatherTypeInList = (WeatherTypeInList + 1) % ARRAY_SIZE(WeatherTypesList); - NewWeatherType = CStats::NoMoreHurricanes ? WeatherTypesList[WeatherTypeInList] : WeatherTypesList_WithHurricanes[WeatherTypeInList]; + if(!CReplay::IsPlayingBack()){ + float fNewInterpolation = (CClock::GetMinutes() + CClock::GetSeconds()/60.0f)/60.0f; + if (fNewInterpolation < InterpolationValue) { + // new hour + OldWeatherType = NewWeatherType; + if (ForcedWeatherType >= 0) + NewWeatherType = ForcedWeatherType; + else { + WeatherTypeInList = (WeatherTypeInList + 1) % ARRAY_SIZE(WeatherTypesList); + NewWeatherType = CStats::NoMoreHurricanes ? WeatherTypesList[WeatherTypeInList] : WeatherTypesList_WithHurricanes[WeatherTypeInList]; + } } + InterpolationValue = fNewInterpolation; } - InterpolationValue = fNewInterpolation; + +#ifndef FINAL if (CPad::GetPad(1)->GetRightShockJustDown()) { NewWeatherType = (NewWeatherType + 1) % WEATHER_TOTAL; OldWeatherType = NewWeatherType; } +#endif // Lightning if (NewWeatherType != WEATHER_RAINY || OldWeatherType != WEATHER_RAINY) { @@ -227,6 +236,7 @@ void CWeather::Update(void) // if rain is ongoing for >24 minutes, values: 0.25, 0.5, 0.75, 1.0, switching every ~16.5s fNewRain = 0.25f + ((uint16)CTimer::GetTimeInMilliseconds() >> 14) * 0.25f; } + fNewRain = Max(fNewRain, 0.5f); } else fNewRain = 0.0f; @@ -257,7 +267,7 @@ void CWeather::Update(void) ExtraSunnyness += InterpolationValue; // Rainbow - if (OldWeatherType == WEATHER_RAINY && (NewWeatherType == WEATHER_SUNNY || NewWeatherType == WEATHER_EXTRA_SUNNY) && + if (OldWeatherType == WEATHER_CLOUDY && (NewWeatherType == WEATHER_SUNNY || NewWeatherType == WEATHER_EXTRA_SUNNY) && InterpolationValue < 0.5f && CClock::GetHours() > 6 && CClock::GetHours() < 21) Rainbow = 1.0f - 4.0f * Abs(InterpolationValue - 0.25f) / 4.0f; else @@ -278,18 +288,21 @@ void CWeather::Update(void) SunGlare *= (1.0f - (CGeneral::GetRandomNumber()&0x1F)*0.007f); } - Wind = InterpolationValue * Windiness[NewWeatherType] + (1.0f - InterpolationValue) * Windiness[OldWeatherType]; + Wind = InterpolationValue * Windyness[NewWeatherType] + (1.0f - InterpolationValue) * Windyness[OldWeatherType]; WindClipped = Min(1.0f, Wind); - if (CClock::GetHours() == 20) + if (CClock::GetHours() > 20) + TrafficLightBrightness = 1.0f; + else if (CClock::GetHours() > 19) TrafficLightBrightness = CClock::GetMinutes() / 60.0f; - else if (CClock::GetHours() > 6 && CClock::GetHours() < 20) + else if (CClock::GetHours() > 6) TrafficLightBrightness = 0.0f; - else if (CClock::GetHours() == 6) + else if (CClock::GetHours() > 5) TrafficLightBrightness = 1.0f - CClock::GetMinutes() / 60.0f; else TrafficLightBrightness = 1.0f; TrafficLightBrightness = Max(WetRoads, TrafficLightBrightness); + TrafficLightBrightness = Max(Foggyness, TrafficLightBrightness); TrafficLightBrightness = Max(Rain, TrafficLightBrightness); AddRain(); @@ -312,12 +325,32 @@ void CWeather::Update(void) void CWeather::AddHeatHaze() { - /* TODO(MIAMI) */ + if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN || + TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOP_DOWN_PED) + return; + CVector pos; + pos.x = SCREEN_WIDTH*0.5f; + if(TheCamera.GetLookingForwardFirstPerson()) + pos.y = CGeneral::GetRandomNumberInRange(SCREEN_HEIGHT*0.25f, SCREEN_HEIGHT*0.9f); + else + pos.y = CGeneral::GetRandomNumberInRange(SCREEN_HEIGHT*0.4f, SCREEN_HEIGHT*0.9f); + pos.z = 100.0f; + CParticle::AddParticle(PARTICLE_HEATHAZE_IN_DIST, pos, CVector(0.0f, 0.0f, 0.0f)); } void CWeather::AddBeastie() { - /* TODO(MIAMI) */ + if(FindPlayerVehicle() || CTimer::GetFrameCounter()%10 || (CGeneral::GetRandomNumber()&5) == 0) + return; + CVector pos = TheCamera.GetPosition(); + float dist = CGeneral::GetRandomNumberInRange(90.0f, 60.0f); + int angle = CGeneral::GetRandomNumber() % CParticle::SIN_COS_TABLE_SIZE; + float c = CParticle::m_CosTable[angle]; + float s = CParticle::m_SinTable[angle]; + pos.x += dist*(c - s); + pos.y += dist*(c + s); + pos.z += CGeneral::GetRandomNumberInRange(7.5f, 30.0f); + CParticle::AddParticle(PARTICLE_BEASTIE, pos, CVector(0.0f, 0.0f, 0.0f)); } void CWeather::ForceWeather(int16 weather) @@ -337,6 +370,62 @@ void CWeather::ReleaseWeather() ForcedWeatherType = -1; } +void CWeather::AddSplashesDuringHurricane() +{ + RwRGBA colour = { 255, 255, 255, 32 }; + CVector pos = TheCamera.pTargetEntity ? TheCamera.pTargetEntity->GetPosition() : TheCamera.GetPosition(); + bool foundGround; + float groundZ = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &foundGround) + 0.1f; + if(!foundGround) + groundZ = pos.z + 0.5f; + for(int i = 0; i < 20; i++){ + float dist = (CGeneral::GetRandomNumber()&0xFF)/255.0f + + CGeneral::GetRandomNumberInRange(-10.0f, 30.0f); + float angle; + uint8 rnd = CGeneral::GetRandomNumber(); + if(rnd&1) + angle = (CGeneral::GetRandomNumber()&0x7F)/128.0f * TWOPI; + else + angle = TheCamera.Orientation + (rnd-128)/160.0f; + pos.x = TheCamera.GetPosition().x + dist*Sin(angle); + pos.y = TheCamera.GetPosition().y + dist*Cos(angle); + pos.z = groundZ; + if(foundGround) + CParticle::AddParticle(PARTICLE_GROUND_STEAM, pos, CVector(-0.002f, -0.002f, 0.015f), nil, 0.0f, colour); + } +} + +static int startStreamAfterRain; + +void CWeather::AddStreamAfterRain() +{ + if(CClock::GetHours() > 6 && CClock::GetHours() < 18){ + RwRGBA colour = { 255, 255, 255, 24 }; + CVector pos = TheCamera.pTargetEntity ? TheCamera.pTargetEntity->GetPosition() : TheCamera.GetPosition(); + bool foundGround; + float groundZ = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &foundGround) + 0.2f; + if(!foundGround) + groundZ = pos.z + 0.75f; + for(int i = 0; i < 20; i++){ + float dist = (CGeneral::GetRandomNumber()&0xFF)/255.0f + + CGeneral::GetRandomNumberInRange(-10.0f, 30.0f); + float angle; + uint8 rnd = CGeneral::GetRandomNumber(); + if(rnd&1) + angle = (CGeneral::GetRandomNumber()&0x7F)/128.0f * TWOPI; + else + angle = TheCamera.Orientation + (rnd-128)/160.0f; + pos.x = TheCamera.GetPosition().x + dist*Sin(angle); + pos.y = TheCamera.GetPosition().y + dist*Cos(angle); + pos.z = groundZ; + CParticle::AddParticle(PARTICLE_GROUND_STEAM, pos, CVector(0.0f, 0.0f, 0.015f), nil, 0.0f, colour); + } + }else{ + startStreamAfterRain = 0; + StreamAfterRainTimer = 800; + } +} + void CWeather::AddRain() { if (CCullZones::CamNoRain() || CCullZones::PlayerNoRain()) @@ -348,104 +437,77 @@ void CWeather::AddRain() return; } } + + if(Rain > 0.0){ + startStreamAfterRain = 1; + StreamAfterRainTimer = 800; + }else if(startStreamAfterRain){ + if(StreamAfterRainTimer > 0){ + AddStreamAfterRain(); + StreamAfterRainTimer--; + }else{ + startStreamAfterRain = 0; + StreamAfterRainTimer = 800; + } + } + + if (Wind > 1.1f) + AddSplashesDuringHurricane(); + if (Rain <= 0.1f) return; static RwRGBA colour; - float screen_width = RsGlobal.width; - float screen_height = RsGlobal.height; - int cur_frame = (int)(3 * Rain) & 3; - int num_drops = (int)(2 * Rain) + 2; - static int STATIC_RAIN_ANGLE = -45; - static int count = 1500; - static int add_angle = 1; - if (--count == 0) { - count = 1; - if (add_angle) { - STATIC_RAIN_ANGLE += 12; - if (STATIC_RAIN_ANGLE > 45) { - count = 1500; - add_angle = !add_angle; - } - } - else { - STATIC_RAIN_ANGLE -= 12; - if (STATIC_RAIN_ANGLE < -45) { - count = 1500; - add_angle = !add_angle; - } - } - } - float rain_angle = DEGTORAD(STATIC_RAIN_ANGLE + ((STATIC_RAIN_ANGLE < 0) ? 360 : 0)); - float sin_angle = Sin(rain_angle); - float cos_angle = Cos(rain_angle); - float base_x = 0.0f * cos_angle - 1.0f * sin_angle; - float base_y = 1.0f * cos_angle + 0.0f * sin_angle; - CVector xpos(0.0f, 0.0f, 0.0f); - for (int i = 0; i < 2 * num_drops; i++) { - CVector dir; - dir.x = (CGeneral::GetRandomNumberInRange(-0.5f, 0.5f) + base_x) * CGeneral::GetRandomNumberInRange(10.0f, 25.0f); - dir.y = (CGeneral::GetRandomNumberInRange(-0.5f, 0.5f) + base_y) * CGeneral::GetRandomNumberInRange(10.0f, 25.0f); - dir.z = 0; - CParticle::AddParticle(PARTICLE_RAINDROP_2D, xpos, dir, nil, CGeneral::GetRandomNumberInRange(0.5f, 0.9f), - colour, 0, rain_angle + CGeneral::GetRandomNumberInRange(-10, 10), cur_frame); - xpos.x += screen_width / (2 * num_drops); - xpos.x += CGeneral::GetRandomNumberInRange(-25.0f, 25.0f); - } - CVector ypos(0.0f, 0.0f, 0.0f); - for (int i = 0; i < num_drops; i++) { - CVector dir; - dir.x = (CGeneral::GetRandomNumberInRange(-0.5f, 0.5f) + base_x) * CGeneral::GetRandomNumberInRange(10.0f, 25.0f); - dir.y = (CGeneral::GetRandomNumberInRange(-0.5f, 0.5f) + base_y) * CGeneral::GetRandomNumberInRange(10.0f, 25.0f); - dir.z = 0; - CParticle::AddParticle(PARTICLE_RAINDROP_2D, ypos, dir, nil, CGeneral::GetRandomNumberInRange(0.5f, 0.9f), - colour, 0, rain_angle + CGeneral::GetRandomNumberInRange(-10, 10), cur_frame); - ypos.y += screen_width / num_drops; - ypos.y += CGeneral::GetRandomNumberInRange(-25.0f, 25.0f); - } - CVector ypos2(0.0f, 0.0f, 0.0f); - for (int i = 0; i < num_drops; i++) { - CVector dir; - dir.x = (CGeneral::GetRandomNumberInRange(-0.5f, 0.5f) + base_x) * CGeneral::GetRandomNumberInRange(10.0f, 25.0f); - dir.y = (CGeneral::GetRandomNumberInRange(-0.5f, 0.5f) + base_y) * CGeneral::GetRandomNumberInRange(10.0f, 25.0f); - dir.z = 0; - CParticle::AddParticle(PARTICLE_RAINDROP_2D, ypos2, dir, nil, CGeneral::GetRandomNumberInRange(0.5f, 0.9f), - colour, 0, rain_angle + CGeneral::GetRandomNumberInRange(-10, 10), cur_frame); - ypos2.y += screen_width / num_drops; - ypos2.y += CGeneral::GetRandomNumberInRange(-25.0f, 25.0f); - } - for (int i = 0; i < num_drops; i++) { - CVector pos; - pos.x = CGeneral::GetRandomNumberInRange(DROPLETS_LEFT_OFFSET, screen_width - DROPLETS_RIGHT_OFFSET); - pos.y = CGeneral::GetRandomNumberInRange(DROPLETS_TOP_OFFSET, screen_height - DROPLETS_TOP_OFFSET); + int numDrops = 5.0f * Rain; + int numSplashes = 2.0f * Rain; + CVector pos, dir; + for(int i = 0; i < numDrops; i++){ + pos.x = CGeneral::GetRandomNumberInRange(0, (int)SCREEN_WIDTH); + pos.y = CGeneral::GetRandomNumberInRange(0, (int)SCREEN_HEIGHT/5); + pos.z = 0.0f; + dir.x = 0.0f; + dir.y = CGeneral::GetRandomNumberInRange(30.0f, 40.0f); + dir.z = 0.0f; + CParticle::AddParticle(PARTICLE_RAINDROP_2D, pos, dir, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.75f), 0, 0, (int)Rain&3, 0); + + pos.x = CGeneral::GetRandomNumberInRange(0, (int)SCREEN_WIDTH); + pos.y = CGeneral::GetRandomNumberInRange((int)SCREEN_HEIGHT/5, (int)SCREEN_HEIGHT/2); + pos.z = 0.0f; + dir.x = 0.0f; + dir.y = CGeneral::GetRandomNumberInRange(30.0f, 40.0f); + dir.z = 0.0f; + CParticle::AddParticle(PARTICLE_RAINDROP_2D, pos, dir, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.75f), 0, 0, (int)Rain&3, 0); + + pos.x = CGeneral::GetRandomNumberInRange(0, (int)SCREEN_WIDTH); + pos.y = 0.0f; + pos.z = 0.0f; + dir.x = 0.0f; + dir.y = CGeneral::GetRandomNumberInRange(30.0f, 40.0f); + dir.z = 0.0f; + CParticle::AddParticle(PARTICLE_RAINDROP_2D, pos, dir, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.75f), 0, 0, (int)Rain&3, 0); + + float dist = CGeneral::GetRandomNumberInRange(0.0f, Max(10.0f*Rain, 40.0f)/2.0f); + float angle; + uint8 rnd = CGeneral::GetRandomNumber(); + if(rnd&1) + angle = (CGeneral::GetRandomNumber()&0x7F)/128.0f * TWOPI; + else + angle = TheCamera.Orientation + (rnd-128)/160.0f; + pos.x = TheCamera.GetPosition().x + dist*Sin(angle); + pos.y = TheCamera.GetPosition().y + dist*Cos(angle); pos.z = 0.0f; - CParticle::AddParticle(PARTICLE_RAINDROP_2D, pos, CVector(0.0f, 0.0f, 0.0f), nil, CGeneral::GetRandomNumberInRange(0.5f, 0.9f), - colour, CGeneral::GetRandomNumberInRange(-10, 10), 360 - rain_angle + CGeneral::GetRandomNumberInRange(-30, 30), cur_frame, 0); - } - int num_splash_attempts = (int)(3 * Rain) + 1; - int num_splashes = (int)(3 * Rain) + 4; - CVector splash_points[4]; - splash_points[0] = CVector(-RwCameraGetViewWindow(TheCamera.m_pRwCamera)->x, RwCameraGetViewWindow(TheCamera.m_pRwCamera)->y, 1.0f) * - RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude(); - splash_points[1] = CVector(RwCameraGetViewWindow(TheCamera.m_pRwCamera)->x, RwCameraGetViewWindow(TheCamera.m_pRwCamera)->y, 1.0f) * - RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude(); - splash_points[2] = 4.0f * CVector(-RwCameraGetViewWindow(TheCamera.m_pRwCamera)->x, RwCameraGetViewWindow(TheCamera.m_pRwCamera)->y, 1.0f) * - RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude(); - splash_points[3] = 4.0f * CVector(RwCameraGetViewWindow(TheCamera.m_pRwCamera)->x, RwCameraGetViewWindow(TheCamera.m_pRwCamera)->y, 1.0f) * - RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude(); - RwV3dTransformPoints((RwV3d*)splash_points, (RwV3d*)splash_points, 4, RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera))); - CVector fp = (splash_points[0] + splash_points[1] + splash_points[2] + splash_points[3]) / 4; - for (int i = 0; i < num_splash_attempts; i++) { CColPoint point; - CEntity* entity; - CVector np = fp + CVector(CGeneral::GetRandomNumberInRange(-SPLASH_CHECK_RADIUS, SPLASH_CHECK_RADIUS), CGeneral::GetRandomNumberInRange(-SPLASH_CHECK_RADIUS, SPLASH_CHECK_RADIUS), 0.0f); - if (CWorld::ProcessVerticalLine(np + CVector(0.0f, 0.0f, 40.0f), -40.0f, point, entity, true, false, false, false, true, false, nil)) { - for (int j = 0; j < num_splashes; j++) - CParticle::AddParticle((CGeneral::GetRandomTrueFalse() ? PARTICLE_RAIN_SPLASH : PARTICLE_RAIN_SPLASHUP), - CVector( - np.x + CGeneral::GetRandomNumberInRange(-SPLASH_OFFSET_RADIUS, SPLASH_OFFSET_RADIUS), - np.y + CGeneral::GetRandomNumberInRange(-SPLASH_OFFSET_RADIUS, SPLASH_OFFSET_RADIUS), - point.point.z + 0.1f), - CVector(0.0f, 0.0f, 0.0f), nil, 0.0f, colour); + CEntity *ent; + if(CWorld::ProcessVerticalLine(pos+CVector(0.0f, 0.0f, 40.0f), -40.0f, point, ent, true, false, false, false, true, false, nil)){ + pos.z = point.point.z; + for(int j = 0; j < numSplashes+15; j++){ + CVector pos2 = pos; + pos2.x += CGeneral::GetRandomNumberInRange(-15.0f, 15.0f); + pos2.y += CGeneral::GetRandomNumberInRange(-15.0f, 15.0f); + if(CGeneral::GetRandomNumber() & 1) + CParticle::AddParticle(PARTICLE_RAIN_SPLASH, pos2, CVector(0.0f, 0.0f, 0.0f), nil, 0.0f, colour); + else + CParticle::AddParticle(PARTICLE_RAIN_SPLASHUP, pos2, CVector(0.0f, 0.0f, 0.0f), nil, 0.0f, colour); + } } } } @@ -470,11 +532,11 @@ void RenderOneRainStreak(CVector pos, CVector unused, int intensity, bool scale, RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 0], 0, 0, 0, 0); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 0], pos.x + 11.0f * TheCamera.GetUp().x, pos.y + 11.0f * TheCamera.GetUp().y, pos.z + 11.0f * TheCamera.GetUp().z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 1], 0, 0, 0, 0); - RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 1], pos.x - 9.0f * TheCamera.GetRight().x, pos.y - 9.0f * TheCamera.GetRight().y, pos.z - 9.0f * TheCamera.GetUp().z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 1], pos.x - 9.0f * TheCamera.GetRight().x, pos.y - 9.0f * TheCamera.GetRight().y, pos.z - 9.0f * TheCamera.GetRight().z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 2], RAIN_COLOUR_R * intensity / 256, RAIN_COLOUR_G * intensity / 256, RAIN_COLOUR_B * intensity / 256, RAIN_ALPHA); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 2], pos.x, pos.y, pos.z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 3], 0, 0, 0, 0); - RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 3], pos.x + 9.0f * TheCamera.GetRight().x, pos.y + 9.0f * TheCamera.GetRight().y, pos.z + 9.0f * TheCamera.GetUp().z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 3], pos.x + 9.0f * TheCamera.GetRight().x, pos.y + 9.0f * TheCamera.GetRight().y, pos.z + 9.0f * TheCamera.GetRight().z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 4], 0, 0, 0, 0); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 4], pos.x - 11.0f * TheCamera.GetUp().x, pos.y - 11.0f * TheCamera.GetUp().y, pos.z - 11.0f * TheCamera.GetUp().z); float u = STREAK_U; @@ -493,9 +555,9 @@ void RenderOneRainStreak(CVector pos, CVector unused, int intensity, bool scale, u *= distance_coefficient; v *= distance_coefficient; if (!CTimer::GetIsPaused()) { - RandomTex = ((CGeneral::GetRandomNumber() & 255) - 128) * 0.01f; - RandomTexX = (CGeneral::GetRandomNumber() & 127) * 0.01f; - RandomTexY = (CGeneral::GetRandomNumber() & 127) * 0.01f; + RandomTex = 0.0f; + RandomTexX = 0.0f; + RandomTexY = 0.0f; } RwIm3DVertexSetU(&TempBufferRenderVertices[TempBufferVerticesStored + 0], 0.5f * u - RandomTex + RandomTexX); RwIm3DVertexSetV(&TempBufferRenderVertices[TempBufferVerticesStored + 0], -v * 0.5f + RandomTexY); @@ -518,6 +580,8 @@ void CWeather::RenderRainStreaks(void) int base_intensity = (64.0f - CTimeCycle::GetFogReduction()) / 64.0f * int(255 * Rain); if (base_intensity == 0) return; + if (TheCamera.m_CameraAverageSpeed > 1.75f) + return; TempBufferIndicesStored = 0; TempBufferVerticesStored = 0; for (int i = 0; i < NUM_RAIN_STREAKS; i++) { @@ -528,11 +592,11 @@ void CWeather::RenderRainStreaks(void) else{ int intensity; if (secondsElapsed < STREAK_INTEROLATION_TIME) - intensity = base_intensity * 0.5f * secondsElapsed / STREAK_INTEROLATION_TIME; + intensity = base_intensity * 0.25f * secondsElapsed / STREAK_INTEROLATION_TIME; else if (secondsElapsed > (STREAK_LIFETIME - STREAK_INTEROLATION_TIME)) - intensity = (STREAK_LIFETIME - secondsElapsed) * 0.5f * base_intensity / STREAK_INTEROLATION_TIME; + intensity = (STREAK_LIFETIME - secondsElapsed) * 0.25f * base_intensity / STREAK_INTEROLATION_TIME; else - intensity = base_intensity * 0.5f; + intensity = base_intensity * 0.25f; CVector dir = Streaks[i].direction; dir.Normalise(); CVector pos = Streaks[i].position + secondsElapsed * Streaks[i].direction; @@ -546,7 +610,7 @@ void CWeather::RenderRainStreaks(void) } else if ((CGeneral::GetRandomNumber() & 0xF00) == 0){ // 1/16 probability - Streaks[i].direction = CVector(4.0f, 4.0f, -4.0f); + Streaks[i].direction = CVector(0.0f, 0.0f, -12.0f); Streaks[i].position = 6.0f * TheCamera.GetForward() + TheCamera.GetPosition() + CVector(-1.8f * Streaks[i].direction.x, -1.8f * Streaks[i].direction.y, 8.0f); if (!CCutsceneMgr::IsRunning()) { Streaks[i].position.x += 2.0f * FindPlayerSpeed().x * 60.0f; @@ -554,8 +618,8 @@ void CWeather::RenderRainStreaks(void) } else Streaks[i].position += (TheCamera.GetPosition() - TheCamera.m_RealPreviousCameraPosition) * 20.0f; - Streaks[i].position.x += ((CGeneral::GetRandomNumber() & 255) - 128) * 0.08f; - Streaks[i].position.y += ((CGeneral::GetRandomNumber() & 255) - 128) * 0.08f; + Streaks[i].position.x += ((CGeneral::GetRandomNumber() & 255) - 128) * 0.04f; + Streaks[i].position.y += ((CGeneral::GetRandomNumber() & 255) - 128) * 0.04f; Streaks[i].timer = CTimer::GetTimeInMilliseconds(); } } diff --git a/src/render/Weather.h b/src/render/Weather.h index 809bb787..ef62ebb6 100644 --- a/src/render/Weather.h +++ b/src/render/Weather.h @@ -27,6 +27,7 @@ public: static uint32 LightningFlashLastChange; static uint32 WhenToPlayLightningSound; static uint32 LightningDuration; + static int32 StreamAfterRainTimer; static float ExtraSunnyness; static float Foggyness; @@ -49,6 +50,8 @@ public: static void ReleaseWeather(); static void ForceWeather(int16); static void ForceWeatherNow(int16); + static void AddSplashesDuringHurricane(); + static void AddStreamAfterRain(); static void AddRain(); static void AddHeatHaze(); static void AddBeastie(); From 771235d21367bcc293749082aed2086f2a7a5939 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 23 Aug 2020 13:30:21 +0200 Subject: [PATCH 102/112] weather fixes --- src/core/config.h | 4 ++-- src/render/Weather.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/config.h b/src/core/config.h index c4b4fc77..2c4e26e5 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -209,8 +209,8 @@ enum Config { #define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH -//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) -//#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) +#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) +#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) #define MULTISAMPLING // adds MSAA option #ifdef LIBRW diff --git a/src/render/Weather.cpp b/src/render/Weather.cpp index b4031705..2c0b27d2 100644 --- a/src/render/Weather.cpp +++ b/src/render/Weather.cpp @@ -69,7 +69,7 @@ const int16 WeatherTypesList[] = { WEATHER_SUNNY, WEATHER_SUNNY, WEATHER_RAINY, WEATHER_CLOUDY, }; -const float Windiness[] = { +const float Windyness[] = { 0.0f, // WEATHER_SUNNY 0.7f, // WEATHER_CLOUDY 1.0f, // WEATHER_RAINY @@ -243,7 +243,7 @@ void CWeather::Update(void) Rainbow = 1.0f - 4.0f * Abs(InterpolationValue - 0.25f) / 4.0f; else Rainbow = 0.0f; - Wind = InterpolationValue * Windiness[NewWeatherType] + (1.0f - InterpolationValue) * Windiness[OldWeatherType]; + Wind = InterpolationValue * Windyness[NewWeatherType] + (1.0f - InterpolationValue) * Windyness[OldWeatherType]; AddRain(); } @@ -278,8 +278,8 @@ void CWeather::AddRain() if (Rain <= 0.1f) return; static RwRGBA colour; - float screen_width = RsGlobal.width; - float screen_height = RsGlobal.height; + float screen_width = SCREEN_WIDTH; + float screen_height = SCREEN_HEIGHT; int cur_frame = (int)(3 * Rain) & 3; int num_drops = (int)(2 * Rain) + 2; static int STATIC_RAIN_ANGLE = -45; @@ -397,11 +397,11 @@ void RenderOneRainStreak(CVector pos, CVector unused, int intensity, bool scale, RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 0], 0, 0, 0, 0); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 0], pos.x + 11.0f * TheCamera.GetUp().x, pos.y + 11.0f * TheCamera.GetUp().y, pos.z + 11.0f * TheCamera.GetUp().z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 1], 0, 0, 0, 0); - RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 1], pos.x - 9.0f * TheCamera.GetRight().x, pos.y - 9.0f * TheCamera.GetRight().y, pos.z - 9.0f * TheCamera.GetUp().z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 1], pos.x - 9.0f * TheCamera.GetRight().x, pos.y - 9.0f * TheCamera.GetRight().y, pos.z - 9.0f * TheCamera.GetRight().z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 2], RAIN_COLOUR_R * intensity / 256, RAIN_COLOUR_G * intensity / 256, RAIN_COLOUR_B * intensity / 256, RAIN_ALPHA); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 2], pos.x, pos.y, pos.z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 3], 0, 0, 0, 0); - RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 3], pos.x + 9.0f * TheCamera.GetRight().x, pos.y + 9.0f * TheCamera.GetRight().y, pos.z + 9.0f * TheCamera.GetUp().z); + RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 3], pos.x + 9.0f * TheCamera.GetRight().x, pos.y + 9.0f * TheCamera.GetRight().y, pos.z + 9.0f * TheCamera.GetRight().z); RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored + 4], 0, 0, 0, 0); RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored + 4], pos.x - 11.0f * TheCamera.GetUp().x, pos.y - 11.0f * TheCamera.GetUp().y, pos.z - 11.0f * TheCamera.GetUp().z); float u = STREAK_U; From 6c63dfd86dc3cd5816dc308d9338906364a81664 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 23 Aug 2020 13:30:42 +0200 Subject: [PATCH 103/112] accidentally enabled extended stuff.... --- src/core/config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/config.h b/src/core/config.h index 2c4e26e5..c4b4fc77 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -209,8 +209,8 @@ enum Config { #define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU //#define USE_TEXTURE_POOL #define CUTSCENE_BORDERS_SWITCH -#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) -#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) +//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) +//#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) #define MULTISAMPLING // adds MSAA option #ifdef LIBRW From 0a19925e99ac32366a9193dbad6ddc5d6e2a3bd1 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 24 Aug 2020 14:26:17 +0200 Subject: [PATCH 104/112] finished sprites --- src/render/Sprite.cpp | 6 +++--- src/render/Sprite2d.cpp | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/render/Sprite.cpp b/src/render/Sprite.cpp index f26f8e63..401eebd0 100644 --- a/src/render/Sprite.cpp +++ b/src/render/Sprite.cpp @@ -148,10 +148,10 @@ CSprite::RenderOneXLUSprite_Rotate_Aspect(float x, float y, float z, float w, fl // Fade out when too near // why not in buffered version? - if(z < 3.0f){ - if(z < 1.5f) + if(z < 2.3f){ + if(z < 1.3f) return; - int f = (z - 1.5f)/1.5f * 255; + int f = (z - 1.3f)/(2.3f-1.3f) * 255; r = f*r >> 8; g = f*g >> 8; b = f*b >> 8; diff --git a/src/render/Sprite2d.cpp b/src/render/Sprite2d.cpp index 7dcedb26..0cd0e8bb 100644 --- a/src/render/Sprite2d.cpp +++ b/src/render/Sprite2d.cpp @@ -120,6 +120,8 @@ CSprite2d::Draw(float x1, float y1, float x2, float y2, float x3, float y3, floa void CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3) { + float offset = 1.0f/1024.0f; + // This is what we draw: // 0---1 // | / | @@ -130,8 +132,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ); RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a); - RwIm2DVertexSetU(&maVertices[0], 0.0f, RecipNearClip); - RwIm2DVertexSetV(&maVertices[0], 0.0f, RecipNearClip); + RwIm2DVertexSetU(&maVertices[0], 0.0f+offset, RecipNearClip); + RwIm2DVertexSetV(&maVertices[0], 0.0f+offset, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[1], r.right); RwIm2DVertexSetScreenY(&maVertices[1], r.top); @@ -139,8 +141,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ); RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a); - RwIm2DVertexSetU(&maVertices[1], 1.0f, RecipNearClip); - RwIm2DVertexSetV(&maVertices[1], 0.0f, RecipNearClip); + RwIm2DVertexSetU(&maVertices[1], 1.0f+offset, RecipNearClip); + RwIm2DVertexSetV(&maVertices[1], 0.0f+offset, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[2], r.right); RwIm2DVertexSetScreenY(&maVertices[2], r.bottom); @@ -148,8 +150,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ); RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a); - RwIm2DVertexSetU(&maVertices[2], 1.0f, RecipNearClip); - RwIm2DVertexSetV(&maVertices[2], 1.0f, RecipNearClip); + RwIm2DVertexSetU(&maVertices[2], 1.0f+offset, RecipNearClip); + RwIm2DVertexSetV(&maVertices[2], 1.0f+offset, RecipNearClip); RwIm2DVertexSetScreenX(&maVertices[3], r.left); RwIm2DVertexSetScreenY(&maVertices[3], r.bottom); @@ -157,8 +159,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ); RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip); RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a); - RwIm2DVertexSetU(&maVertices[3], 0.0f, RecipNearClip); - RwIm2DVertexSetV(&maVertices[3], 1.0f, RecipNearClip); + RwIm2DVertexSetU(&maVertices[3], 0.0f+offset, RecipNearClip); + RwIm2DVertexSetV(&maVertices[3], 1.0f+offset, RecipNearClip); } void From 56b80cb0ab37ff6e7d4f58bf75c9e096d854ef89 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 24 Aug 2020 17:21:45 +0200 Subject: [PATCH 105/112] fixes to zones and vehicle comp rules --- src/core/Zones.cpp | 60 ++++++++++++------------------ src/core/Zones.h | 4 +- src/modelinfo/VehicleModelInfo.cpp | 4 +- 3 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/core/Zones.cpp b/src/core/Zones.cpp index 96f5dc62..a255fb7d 100644 --- a/src/core/Zones.cpp +++ b/src/core/Zones.cpp @@ -9,6 +9,8 @@ #include "World.h" #include "Timer.h" +//--MIAMI: file almost done (loading/saving will perhaps stay different) + eLevelName CTheZones::m_CurrLevel; int16 CTheZones::FindIndex; @@ -26,14 +28,12 @@ CZoneInfo CTheZones::ZoneInfoArray[2*NUMINFOZONES]; #define SWAPF(a, b) { float t; t = a; a = b; b = t; } -//--MIAMI: done wchar* CZone::GetTranslatedName(void) { return TheText.Get(name); } -//--MIAMI: done void CTheZones::Init(void) { @@ -124,7 +124,6 @@ CTheZones::Init(void) MapZoneArray[0].level = LEVEL_GENERIC; } -//--MIAMI: done void CTheZones::Update(void) { @@ -137,7 +136,6 @@ CTheZones::Update(void) m_CurrLevel = GetLevelFromPosition(&pos); } -//--MIAMI: done void CTheZones::CreateZone(char *name, eZoneType type, float minx, float miny, float minz, @@ -204,7 +202,6 @@ CTheZones::CreateZone(char *name, eZoneType type, } } -//--MIAMI: done void CTheZones::PostZoneCreation(void) { @@ -214,7 +211,6 @@ CTheZones::PostZoneCreation(void) InitialiseAudioZoneArray(); } -//--MIAMI: done, but does nothing void CTheZones::CheckZonesForOverlap(void) { @@ -231,7 +227,6 @@ CTheZones::CheckZonesForOverlap(void) } } -//--MIAMI: done void CTheZones::InsertZoneIntoZoneHierarchy(CZone *zone) { @@ -241,7 +236,6 @@ CTheZones::InsertZoneIntoZoneHierarchy(CZone *zone) InsertZoneIntoZoneHierRecursive(zone, &NavigationZoneArray[0]); } -//--MIAMI: done bool CTheZones::InsertZoneIntoZoneHierRecursive(CZone *inner, CZone *outer) { @@ -285,7 +279,6 @@ CTheZones::InsertZoneIntoZoneHierRecursive(CZone *inner, CZone *outer) return true; } -//--MIAMI: done bool CTheZones::ZoneIsEntirelyContainedWithinOtherZone(CZone *inner, CZone *outer) { @@ -310,7 +303,6 @@ CTheZones::ZoneIsEntirelyContainedWithinOtherZone(CZone *inner, CZone *outer) return true; } -//--MIAMI: done bool CTheZones::PointLiesWithinZone(const CVector *v, CZone *zone) { @@ -319,7 +311,6 @@ CTheZones::PointLiesWithinZone(const CVector *v, CZone *zone) zone->minz <= v->z && v->z <= zone->maxz; } -//--MIAMI: done eLevelName CTheZones::GetLevelFromPosition(CVector const *v) { @@ -333,7 +324,6 @@ CTheZones::GetLevelFromPosition(CVector const *v) return MapZoneArray[0].level; } -//--MIAMI: done CZone* CTheZones::FindInformationZoneForPosition(const CVector *v) { @@ -347,7 +337,6 @@ CTheZones::FindInformationZoneForPosition(const CVector *v) return &InfoZoneArray[0]; } -//--MIAMI: done CZone* CTheZones::FindSmallestNavigationZoneForPosition(const CVector *v, bool findDefault, bool findNavig) { @@ -370,7 +359,6 @@ CTheZones::FindSmallestNavigationZoneForPosition(const CVector *v, bool findDefa return best; } -//--MIAMI: done int16 CTheZones::FindZoneByLabelAndReturnIndex(char *name, eZoneType type) { @@ -400,7 +388,6 @@ CTheZones::FindZoneByLabelAndReturnIndex(char *name, eZoneType type) return -1; } -//--MIAMI: done int16 CTheZones::FindNextZoneByLabelAndReturnIndex(char *name, eZoneType type) { @@ -431,7 +418,6 @@ CTheZones::FindNextZoneByLabelAndReturnIndex(char *name, eZoneType type) return -1; } -//--MIAMI: done CZoneInfo* CTheZones::GetZoneInfo(const CVector *v, uint8 day) { @@ -556,7 +542,7 @@ CTheZones::SetZonePedInfo(uint16 zoneid, uint8 day, int16 pedDensity, info->gangPedThreshold[8] = info->gangPedThreshold[7]; } -//--MIAMI: done, unused +//--MIAMI: unused void CTheZones::SetCarDensity(uint16 zoneid, uint8 day, uint16 cardensity) { @@ -565,7 +551,7 @@ CTheZones::SetCarDensity(uint16 zoneid, uint8 day, uint16 cardensity) ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight].carDensity = cardensity; } -//--MIAMI: done, unused +//--MIAMI: unused void CTheZones::SetPedDensity(uint16 zoneid, uint8 day, uint16 peddensity) { @@ -574,7 +560,6 @@ CTheZones::SetPedDensity(uint16 zoneid, uint8 day, uint16 peddensity) ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight].pedDensity = peddensity; } -//--MIAMI: done void CTheZones::SetPedGroup(uint16 zoneid, uint8 day, uint16 pedgroup) { @@ -583,7 +568,6 @@ CTheZones::SetPedGroup(uint16 zoneid, uint8 day, uint16 pedgroup) ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight].pedGroup = pedgroup; } -//--MIAMI: done int16 CTheZones::FindAudioZone(CVector *pos) { @@ -595,7 +579,6 @@ CTheZones::FindAudioZone(CVector *pos) return -1; } -//--MIAMI: done void CTheZones::AddZoneToAudioZoneArray(CZone *zone) { @@ -613,7 +596,6 @@ CTheZones::AddZoneToAudioZoneArray(CZone *zone) AudioZoneArray[NumberOfAudioZones++] = z; } -//--MIAMI: done void CTheZones::InitialiseAudioZoneArray(void) { @@ -645,7 +627,6 @@ CTheZones::InitialiseAudioZoneArray(void) } } -//--MIAMI: TODO void CTheZones::SaveAllZones(uint8 *buffer, uint32 *size) { @@ -666,7 +647,7 @@ CTheZones::SaveAllZones(uint8 *buffer, uint32 *size) WriteSaveBuf(buffer, FindIndex); WriteSaveBuf(buffer, (int16)0); // padding -// TODO(MIAMI): implement SaveOneZone +// TODO(MIAMI) ? implement SaveOneZone for(i = 0; i < ARRAY_SIZE(NavigationZoneArray); i++){ CZone *zone = WriteSaveBuf(buffer, NavigationZoneArray[i]); zone->child = (CZone*)GetIndexForZonePointer(NavigationZoneArray[i].child); @@ -676,6 +657,14 @@ CTheZones::SaveAllZones(uint8 *buffer, uint32 *size) for(i = 0; i < ARRAY_SIZE(InfoZoneArray); i++){ CZone *zone = WriteSaveBuf(buffer, InfoZoneArray[i]); + /* + The call of GetIndexForZonePointer is wrong, as it is + meant for a different array, but the game doesn't brake + if those fields are nil. Let's make sure they are. + */ + assert(InfoZoneArray[i].child == nil); + assert(InfoZoneArray[i].parent == nil); + assert(InfoZoneArray[i].next == nil); zone->child = (CZone*)GetIndexForZonePointer(InfoZoneArray[i].child); zone->parent = (CZone*)GetIndexForZonePointer(InfoZoneArray[i].parent); zone->next = (CZone*)GetIndexForZonePointer(InfoZoneArray[i].next); @@ -691,11 +680,7 @@ CTheZones::SaveAllZones(uint8 *buffer, uint32 *size) for(i = 0; i < ARRAY_SIZE(MapZoneArray); i++) { CZone* zone = WriteSaveBuf(buffer, MapZoneArray[i]); - /* - The call of GetIndexForZonePointer is wrong, as it is - meant for a different array, but the game doesn't brake - if those fields are nil. Let's make sure they are. - */ + // see above assert(MapZoneArray[i].child == nil); assert(MapZoneArray[i].parent == nil); assert(MapZoneArray[i].next == nil); @@ -713,7 +698,6 @@ CTheZones::SaveAllZones(uint8 *buffer, uint32 *size) VALIDATESAVEBUF(*size) } -//--MIAMI: TODO void CTheZones::LoadAllZones(uint8 *buffer, uint32 size) { @@ -726,7 +710,7 @@ CTheZones::LoadAllZones(uint8 *buffer, uint32 size) FindIndex = ReadSaveBuf(buffer); ReadSaveBuf(buffer); -// TODO(MIAMI): implement LoadOneZone +// TODO(MIAMI) ? implement LoadOneZone for(i = 0; i < ARRAY_SIZE(NavigationZoneArray); i++){ NavigationZoneArray[i] = ReadSaveBuf(buffer); @@ -738,6 +722,14 @@ CTheZones::LoadAllZones(uint8 *buffer, uint32 size) for(i = 0; i < ARRAY_SIZE(InfoZoneArray); i++){ InfoZoneArray[i] = ReadSaveBuf(buffer); + /* + The call of GetPointerForZoneIndex is wrong, as it is + meant for a different array, but the game doesn't brake + if save data stored is -1. + */ + InfoZoneArray[i].child = GetPointerForZoneIndex((uintptr)InfoZoneArray[i].child); + InfoZoneArray[i].parent = GetPointerForZoneIndex((uintptr)InfoZoneArray[i].parent); + InfoZoneArray[i].next = GetPointerForZoneIndex((uintptr)InfoZoneArray[i].next); InfoZoneArray[i].child = GetPointerForZoneIndex((uintptr)InfoZoneArray[i].child); InfoZoneArray[i].parent = GetPointerForZoneIndex((uintptr)InfoZoneArray[i].parent); InfoZoneArray[i].next = GetPointerForZoneIndex((uintptr)InfoZoneArray[i].next); @@ -753,11 +745,7 @@ CTheZones::LoadAllZones(uint8 *buffer, uint32 size) for(i = 0; i < ARRAY_SIZE(MapZoneArray); i++){ MapZoneArray[i] = ReadSaveBuf(buffer); - /* - The call of GetPointerForZoneIndex is wrong, as it is - meant for a different array, but the game doesn't brake - if save data stored is -1. - */ + // see above MapZoneArray[i].child = GetPointerForZoneIndex((uintptr)MapZoneArray[i].child); MapZoneArray[i].parent = GetPointerForZoneIndex((uintptr)MapZoneArray[i].parent); MapZoneArray[i].next = GetPointerForZoneIndex((uintptr)MapZoneArray[i].next); diff --git a/src/core/Zones.h b/src/core/Zones.h index 8d5af182..92e292b8 100644 --- a/src/core/Zones.h +++ b/src/core/Zones.h @@ -103,8 +103,8 @@ public: static void SetPedDensity(uint16 zoneid, uint8 day, uint16 peddensity); static void SetPedGroup(uint16 zoneid, uint8 day, uint16 pedgroup); static int16 FindAudioZone(CVector *pos); - static CZone *GetPointerForZoneIndex(int32 i) { return i == -1 ? nil : &InfoZoneArray[i]; } - static int32 GetIndexForZonePointer(CZone *zone) { return zone == nil ? -1 : zone - InfoZoneArray; } + static CZone *GetPointerForZoneIndex(int32 i) { return i == -1 ? nil : &NavigationZoneArray[i]; } + static int32 GetIndexForZonePointer(CZone *zone) { return zone == nil ? -1 : zone - NavigationZoneArray; } static void AddZoneToAudioZoneArray(CZone *zone); static void InitialiseAudioZoneArray(void); static void SaveAllZones(uint8 *buffer, uint32 *length); diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp index 68673458..5d69a921 100644 --- a/src/modelinfo/VehicleModelInfo.cpp +++ b/src/modelinfo/VehicleModelInfo.cpp @@ -211,7 +211,7 @@ CVehicleModelInfo::CreateInstance(void) clumpframe = RpClumpGetFrame(clump); comp1 = ChooseComponent(); - if(comp1 != -1){ + if(comp1 != -1 && m_comps[comp1]){ atomic = RpAtomicClone(m_comps[comp1]); f = RwFrameCreate(); RwFrameTransform(f, @@ -224,7 +224,7 @@ CVehicleModelInfo::CreateInstance(void) ms_compsUsed[0] = comp1; comp2 = ChooseSecondComponent(); - if(comp2 != -1){ + if(comp2 != -1 && m_comps[comp2]){ atomic = RpAtomicClone(m_comps[comp2]); f = RwFrameCreate(); RwFrameTransform(f, From bbcf3fd7d2e699b0fb7e2cceda8e002dfa61ab3f Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 24 Aug 2020 21:52:16 +0300 Subject: [PATCH 106/112] CutsceneMgr done --- src/animation/AnimBlendClumpData.h | 1 + src/animation/AnimBlendHierarchy.h | 1 + src/animation/CutsceneMgr.cpp | 291 +++++++++++++++++++++++++---- src/animation/CutsceneMgr.h | 9 +- src/control/CarCtrl.cpp | 4 +- src/control/Script.cpp | 12 +- src/core/Streaming.cpp | 5 +- 7 files changed, 277 insertions(+), 46 deletions(-) diff --git a/src/animation/AnimBlendClumpData.h b/src/animation/AnimBlendClumpData.h index 4043c778..af7e5df5 100644 --- a/src/animation/AnimBlendClumpData.h +++ b/src/animation/AnimBlendClumpData.h @@ -12,6 +12,7 @@ struct AnimBlendFrameData VELOCITY_EXTRACTION = 8, VELOCITY_EXTRACTION_3D = 0x10, UPDATE_KEYFRAMES = 0x20, + UNK_COMPRESSED = 0x40, }; uint8 flag; diff --git a/src/animation/AnimBlendHierarchy.h b/src/animation/AnimBlendHierarchy.h index 45c9217e..b34ae210 100644 --- a/src/animation/AnimBlendHierarchy.h +++ b/src/animation/AnimBlendHierarchy.h @@ -25,6 +25,7 @@ public: void RemoveAnimSequences(void); void Uncompress(void); void RemoveUncompressedData(void); + bool IsCompressed() { return !!compressed; }; }; VALIDATE_SIZE(CAnimBlendHierarchy, 0x28); \ No newline at end of file diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index e720fccb..e6a072ff 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -19,6 +19,11 @@ #include "RpAnimBlend.h" #include "ModelIndices.h" #include "TempColModels.h" +#include "ColStore.h" +#include "Radar.h" +#include "Pools.h" + +//--MIAMI: file done const struct { const char *szTrackName; @@ -119,15 +124,22 @@ int32 CCutsceneMgr::ms_numCutsceneObjs; bool CCutsceneMgr::ms_loaded; bool CCutsceneMgr::ms_animLoaded; bool CCutsceneMgr::ms_useLodMultiplier; -bool CCutsceneMgr::ms_camLoaded; char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE]; -char CCutsceneMgr::ms_uncompressedAnims[8][32]; -uint32 CCutsceneMgr::ms_numUncompressedAnims; CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations; CVector CCutsceneMgr::ms_cutsceneOffset; float CCutsceneMgr::ms_cutsceneTimer; bool CCutsceneMgr::ms_wasCutsceneSkipped; uint32 CCutsceneMgr::ms_cutsceneLoadStatus; +bool CCutsceneMgr::ms_useCutsceneShadows = true; + +bool bCamLoaded; +bool bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver; // pls don't shrink the name :P +int32 NumberOfSavedWeapons; +eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS]; +int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS]; +char uncompressedAnims[8][32]; +uint32 numUncompressedAnims; + RpAtomic * CalculateBoundingSphereRadiusCB(RpAtomic *atomic, void *data) @@ -151,15 +163,15 @@ CCutsceneMgr::Initialise(void) ms_loaded = false; ms_wasCutsceneSkipped = false; ms_running = false; + ms_useLodMultiplier = false; ms_animLoaded = false; ms_cutsceneProcessing = false; - ms_useLodMultiplier = false; ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE); ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); - ms_numUncompressedAnims = 0; - ms_uncompressedAnims[0][0] = '\0'; + numUncompressedAnims = 0; + uncompressedAnims[0][0] = '\0'; } void @@ -178,9 +190,9 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName) ms_cutsceneProcessing = true; ms_wasCutsceneSkipped = false; - if (!strcasecmp(szCutsceneName, "jb")) - ms_useLodMultiplier = true; CTimer::Suspend(); + if (!bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver) + CStreaming::RemoveCurrentZonesModels(); ms_pCutsceneDir->numEntries = 0; ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); @@ -200,7 +212,7 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName) CStreaming::MakeSpaceFor(size << 11); CStreaming::ImGonnaUseStreamingMemory(); RwStreamSkip(stream, offset << 11); - CAnimManager::LoadAnimFile(stream, true, ms_uncompressedAnims); + CAnimManager::LoadAnimFile(stream, true, uncompressedAnims); ms_cutsceneAssociations.CreateAssociations(szCutsceneName); CStreaming::IHaveUsedStreamingMemory(); ms_animLoaded = true; @@ -217,9 +229,9 @@ CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName) CFileMgr::Seek(file, offset << 11, SEEK_SET); TheCamera.LoadPathSplines(file); CStreaming::IHaveUsedStreamingMemory(); - ms_camLoaded = true; + bCamLoaded = true; } else { - ms_camLoaded = false; + bCamLoaded = false; } CFileMgr::CloseFile(file); @@ -252,7 +264,7 @@ void CCutsceneMgr::FinishCutscene() { ms_wasCutsceneSkipped = true; - if (ms_camLoaded) { + if (bCamLoaded) { CCutsceneMgr::ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f; TheCamera.FinishCutscene(); } @@ -264,7 +276,7 @@ CCutsceneMgr::FinishCutscene() void CCutsceneMgr::SetupCutsceneToStart(void) { - if (ms_camLoaded) { + if (bCamLoaded) { TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset); TheCamera.TakeControlWithSpline(JUMP_CUT); TheCamera.SetWideScreenOn(); @@ -276,7 +288,16 @@ CCutsceneMgr::SetupCutsceneToStart(void) assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP); if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) { assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation()); - ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0))->translation); + if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) { + pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION); + } else { + KeyFrameTrans* keyFrames; + if (pAnimBlendAssoc->hierarchy->IsCompressed()) + keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0)); + else + keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0)); + ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + keyFrames->translation); + } pAnimBlendAssoc->SetRun(); } else { ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset); @@ -300,19 +321,31 @@ CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject) CAnimBlendClumpData *pAnimBlendClumpData; assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP); + debug("Give cutscene anim %s\n", animName); RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject); - pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName); + pNewAnim = ms_cutsceneAssociations.GetAnimation(animName); if (!pNewAnim) { debug("\n\nHaven't I told you I can't find the fucking animation %s\n\n\n", animName); return; } + + if (pNewAnim->hierarchy->IsCompressed()) + pNewAnim->hierarchy->compressed2 = true; + + CStreaming::ImGonnaUseStreamingMemory(); + pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName); + CStreaming::IHaveUsedStreamingMemory(); + pNewAnim->SetCurrentTime(0.0f); pNewAnim->flags |= ASSOC_HAS_TRANSLATION; pNewAnim->flags &= ~ASSOC_RUNNING; pAnimBlendClumpData = *RPANIMBLENDCLUMPDATA(pObject->m_rwObject); pAnimBlendClumpData->link.Prepend(&pNewAnim->link); + + if (pNewAnim->hierarchy->compressed2) + pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::UNK_COMPRESSED; } void @@ -327,25 +360,42 @@ CCutsceneMgr::AddCutsceneHead(CObject *pObject, int modelId) return nil; } +void UpdateCutsceneObjectBoundingBox(RpClump* clump, int modelId) +{ + if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) { + CColModel* pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; + float radius = 0.0f; + RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius); + pColModel->boundingSphere.radius = radius; + pColModel->boundingBox.min = CVector(-radius, -radius, -radius); + pColModel->boundingBox.max = CVector(radius, radius, radius); + } +} + CCutsceneObject * CCutsceneMgr::CreateCutsceneObject(int modelId) { CBaseModelInfo *pModelInfo; CColModel *pColModel; - float radius; - RpClump *clump; CCutsceneObject *pCutsceneObject; + CStreaming::ImGonnaUseStreamingMemory(); + debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetName()); if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) { pModelInfo = CModelInfo::GetModelInfo(modelId); pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; - radius = 0.0f; - pModelInfo->SetColModel(pColModel); - clump = (RpClump*)pModelInfo->GetRwObject(); - assert(RwObjectGetType((RwObject*)clump) == rpCLUMP); - RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius); - + UpdateCutsceneObjectBoundingBox((RpClump*)pModelInfo->GetRwObject(), modelId); + } else if (modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL21) { + pModelInfo = CModelInfo::GetModelInfo(modelId); + if (pModelInfo->GetColModel() == &CTempColModels::ms_colModelPed1) { + CColModel *colModel = new CColModel(); + colModel->boundingSphere.radius = 2.0f; + colModel->boundingSphere.center = CVector(0.0f, 0.0f, 0.0f); + pModelInfo->SetColModel(colModel, true); + } + pColModel = pModelInfo->GetColModel(); + float radius = 2.0f; pColModel->boundingSphere.radius = radius; pColModel->boundingBox.min = CVector(-radius, -radius, -radius); pColModel->boundingBox.max = CVector(radius, radius, radius); @@ -353,7 +403,10 @@ CCutsceneMgr::CreateCutsceneObject(int modelId) pCutsceneObject = new CCutsceneObject(); pCutsceneObject->SetModelIndex(modelId); + if (ms_useCutsceneShadows) + pCutsceneObject->CreateShadow(); ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject; + CStreaming::IHaveUsedStreamingMemory(); return pCutsceneObject; } @@ -365,6 +418,7 @@ CCutsceneMgr::DeleteCutsceneData(void) ms_cutsceneProcessing = false; ms_useLodMultiplier = false; + ms_useCutsceneShadows = true; for (--ms_numCutsceneObjs; ms_numCutsceneObjs >= 0; ms_numCutsceneObjs--) { CWorld::Remove(ms_pCutsceneObjects[ms_numCutsceneObjs]); @@ -374,14 +428,23 @@ CCutsceneMgr::DeleteCutsceneData(void) } ms_numCutsceneObjs = 0; + for (int i = MI_SPECIAL01; i < MI_SPECIAL21; i++) { + CBaseModelInfo *minfo = CModelInfo::GetModelInfo(i); + CColModel *colModel = minfo->GetColModel(); + if (colModel != &CTempColModels::ms_colModelPed1) { + delete colModel; + minfo->SetColModel(&CTempColModels::ms_colModelPed1); + } + } + if (ms_animLoaded) CAnimManager::RemoveLastAnimFile(); ms_animLoaded = false; - ms_numUncompressedAnims = 0; - ms_uncompressedAnims[0][0] = '\0'; + numUncompressedAnims = 0; + uncompressedAnims[0][0] = '\0'; - if (ms_camLoaded) { + if (bCamLoaded) { TheCamera.RestoreWithJumpCut(); TheCamera.SetWideScreenOff(); TheCamera.DeleteCutSceneCamDataMemory(); @@ -397,10 +460,37 @@ CCutsceneMgr::DeleteCutsceneData(void) DMAudio.StopCutSceneMusic(); DMAudio.ChangeMusicMode(MUSICMODE_GAME); } + + CStreaming::ms_disableStreaming = false; + CWorld::bProcessCutsceneOnly = false; + + if(bCamLoaded) + CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2); - if(ms_camLoaded) - CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == 2); - + CPad::GetPad(0)->Clear(false); + if (bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver) { + CStreaming::LoadInitialPeds(); + CStreaming::LoadInitialWeapons(); + CStreaming::LoadInitialVehicles(); + bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = false; + + CPlayerPed *pPlayerPed = FindPlayerPed(); + for (int i = 0; i < NumberOfSavedWeapons; i++) { + int32 weaponModelId = CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModelId; + uint8 flags = CStreaming::ms_aInfoForModel[weaponModelId].m_flags; + CStreaming::RequestModel(weaponModelId, STREAMFLAGS_DONT_REMOVE); + CStreaming::LoadAllRequestedModels(false); + if (CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id != -1) { + CStreaming::RequestModel(CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id, 0); + CStreaming::LoadAllRequestedModels(false); + } + if (!(flags & STREAMFLAGS_DONT_REMOVE)) + CStreaming::SetModelIsDeletable(weaponModelId); + pPlayerPed->GiveWeapon(SavedWeaponIDs[i], SavedWeaponAmmo[i], true); + } + NumberOfSavedWeapons = 0; + } + CTimer::Resume(); } @@ -437,26 +527,155 @@ CCutsceneMgr::Update(void) ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds(); - if (ms_camLoaded) + for (int i = 0; i < ms_numCutsceneObjs; i++) { + int modelId = ms_pCutsceneObjects[i]->GetModelIndex(); + if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) + UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId); + + if (ms_pCutsceneObjects[i]->m_pAttachTo != nil && modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL21) + UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId); + } + + if (bCamLoaded) if (CGeneral::faststricmp(ms_cutsceneName, "finale") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) { if (CPad::GetPad(0)->GetCrossJustDown() || (CGame::playingIntro && CPad::GetPad(0)->GetStartJustDown()) || CPad::GetPad(0)->GetLeftMouseJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetCharJustDown(' ')) - FinishCutscene(); + FinishCutscene(); } } -bool CCutsceneMgr::HasCutsceneFinished(void) { return !ms_camLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; } +bool CCutsceneMgr::HasCutsceneFinished(void) { return !bCamLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; } void CCutsceneMgr::LoadAnimationUncompressed(char const* name) { - strcpy(ms_uncompressedAnims[ms_numUncompressedAnims], name); + strcpy(uncompressedAnims[numUncompressedAnims], name); // Because that's how CAnimManager knows the end of array - ++ms_numUncompressedAnims; - assert(ms_numUncompressedAnims < ARRAY_SIZE(ms_uncompressedAnims)); - ms_uncompressedAnims[ms_numUncompressedAnims][0] = '\0'; + ++numUncompressedAnims; + assert(numUncompressedAnims < ARRAY_SIZE(uncompressedAnims)); + uncompressedAnims[numUncompressedAnims][0] = '\0'; +} + +void +CCutsceneMgr::AttachObjectToParent(CObject *pObject, CEntity *pAttachTo) +{ + ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; + ((CCutsceneObject*)pObject)->m_pAttachTo = RpClumpGetFrame(pAttachTo->GetClump()); + + debug("Attach %s to %s\n", CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); +} + +void +CCutsceneMgr::AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame) +{ + ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; + ((CCutsceneObject*)pObject)->m_pAttachTo = RpAnimBlendClumpFindFrame(pAttachTo->GetClump(), frame)->frame; + debug("Attach %s to component %s of %s\n", + CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), + frame, + CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); + RpClump* clump = pObject->GetClump(); + if (RwObjectGetType(clump) == rpCLUMP) + if (IsClumpSkinned(clump)) + RpAtomicGetBoundingSphere(GetFirstAtomic(clump))->radius *= 1.1f; +} + +void +CCutsceneMgr::AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int bone) +{ + RpHAnimHierarchy *hanim = GetAnimHierarchyFromSkinClump(pAttachTo->GetClump()); + RwInt32 id = RpHAnimIDGetIndex(hanim, bone); + RwMatrix *matrixArray = RpHAnimHierarchyGetMatrixArray(hanim); + ((CCutsceneObject*)pObject)->m_pAttachmentObject = pAttachTo; + ((CCutsceneObject*)pObject)->m_pAttachTo = &matrixArray[id]; + debug("Attach %s to %s\n", + CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), + CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); +} + +void +CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver() +{ + CStreaming::ms_disableStreaming = true; + CColStore::RemoveAllCollision(); + CWorld::bProcessCutsceneOnly = true; + ms_cutsceneProcessing = true; + + for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) { + CPed *pPed = CPools::GetPedPool()->GetSlot(i); + if (pPed) { + if (!pPed->IsPlayer() && pPed->CanBeDeleted()) { + CWorld::Remove(pPed); + delete pPed; + } + } + } + + for (int i = CPools::GetVehiclePool()->GetSize() - 1; i >= 0; i--) { + CVehicle *pVehicle = CPools::GetVehiclePool()->GetSlot(i); + if (pVehicle) { + if (pVehicle->CanBeDeleted()) { + CWorld::Remove(pVehicle); + delete pVehicle; + } + } + } + + bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true; + CStreaming::RemoveCurrentZonesModels(); + CStreaming::SetModelIsDeletable(MI_MALE01); + CStreaming::SetModelTxdIsDeletable(MI_MALE01); + CStreaming::SetModelIsDeletable(MI_HMOCA); + CStreaming::SetModelTxdIsDeletable(MI_HMOCA); + CStreaming::SetModelIsDeletable(MI_NIGHTSTICK); + CStreaming::SetModelTxdIsDeletable(MI_NIGHTSTICK); + CStreaming::SetModelIsDeletable(MI_MISSILE); + CStreaming::SetModelTxdIsDeletable(MI_MISSILE); + CStreaming::SetModelIsDeletable(MI_POLICE); + CStreaming::SetModelTxdIsDeletable(MI_POLICE); + + while (CStreaming::RemoveLoadedVehicle()) ; + + CRadar::RemoveRadarSections(); + + for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) { + CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i); + if (pDummy) + pDummy->DeleteRwObject(); + } + + for (int i = CPools::GetObjectPool()->GetSize() - 1; i >= 0; i--) { + CObject* pObject = CPools::GetObjectPool()->GetSlot(i); + if (pObject) + pObject->DeleteRwObject(); + } + + for (int i = CPools::GetBuildingPool()->GetSize() - 1; i >= 0; i--) { + CBuilding* pBuilding = CPools::GetBuildingPool()->GetSlot(i); + if (pBuilding && pBuilding->GetClump() != nil && pBuilding->bIsBIGBuilding && pBuilding->bStreamBIGBuilding) { + if (pBuilding->bIsBIGBuilding) + CStreaming::RequestModel(pBuilding->GetModelIndex(), 0); + if (!pBuilding->bImBeingRendered) + pBuilding->DeleteRwObject(); + } + } + + CPlayerPed *pPlayerPed = FindPlayerPed(); + pPlayerPed->RemoveWeaponAnims(0, -1000.0f); + NumberOfSavedWeapons = 0; + + for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { + if (pPlayerPed->m_weapons[i].m_eWeaponType != WEAPONTYPE_UNARMED) { + SavedWeaponIDs[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_eWeaponType; + SavedWeaponAmmo[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_nAmmoTotal; + NumberOfSavedWeapons++; + } + } + + pPlayerPed->ClearWeapons(); + CGame::DrasticTidyUpMemory(true); } \ No newline at end of file diff --git a/src/animation/CutsceneMgr.h b/src/animation/CutsceneMgr.h index c3f86273..b4497b5b 100644 --- a/src/animation/CutsceneMgr.h +++ b/src/animation/CutsceneMgr.h @@ -17,15 +17,13 @@ class CCutsceneMgr static bool ms_animLoaded; static bool ms_useLodMultiplier; - static bool ms_camLoaded; static char ms_cutsceneName[CUTSCENENAMESIZE]; - static char ms_uncompressedAnims[8][32]; - static uint32 ms_numUncompressedAnims; static CAnimBlendAssocGroup ms_cutsceneAssociations; static CVector ms_cutsceneOffset; static float ms_cutsceneTimer; static bool ms_wasCutsceneSkipped; static bool ms_cutsceneProcessing; + static bool ms_useCutsceneShadows; public: static CDirectory *ms_pCutsceneDir; static uint32 ms_cutsceneLoadStatus; @@ -54,4 +52,9 @@ public: static void DeleteCutsceneData(void); static void LoadAnimationUncompressed(char const*); static void Update(void); + + static void AttachObjectToParent(CObject *pObject, CEntity *pAttachTo); + static void AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame); + static void AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int frame); + static void RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); }; diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 5b2454ac..74c4f006 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -2759,7 +2759,7 @@ void CCarCtrl::SteerAIPlaneTowardsTargetCoors(CAutomobile* pPlane) float steer = difference > 0.0f ? 0.04f : -0.04f; if (Abs(difference) < 0.2f) steer *= 5.0f * Abs(difference); - pPlane->m_fPlaneSteer *= Pow(0.96, CTimer::GetTimeStep()); + pPlane->m_fPlaneSteer *= Pow(0.96f, CTimer::GetTimeStep()); float steerChange = steer - pPlane->m_fPlaneSteer; float maxChange = 0.003f * CTimer::GetTimeStep(); if (Abs(steerChange) < maxChange) @@ -2782,7 +2782,7 @@ void CCarCtrl::SteerAIPlaneTowardsTargetCoors(CAutomobile* pPlane) pPlane->GetMatrix().GetRight() = right; pPlane->GetMatrix().GetForward() = forward; pPlane->GetMatrix().GetUp() = up; - float newSplit = 1.0f - Pow(0.95, CTimer::GetTimeStep()); + float newSplit = 1.0f - Pow(0.95f, CTimer::GetTimeStep()); float oldSplit = 1.0f - newSplit; #ifdef FIX_BUGS pPlane->m_vecMoveSpeed = pPlane->m_vecMoveSpeed * oldSplit + pPlane->AutoPilot.GetCruiseSpeed() * 0.01f * forward * newSplit; diff --git a/src/control/Script.cpp b/src/control/Script.cpp index ea94794b..bf761a3f 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -13017,14 +13017,20 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_ATTACH_CUTSCENE_OBJECT_TO_BONE: { CollectParameters(&m_nIp, 3); - debug("ATTACH_CUTSCENE_OBJECT_TO_BONE not implemented, skipping\n"); // TODO(MIAMI) + CCutsceneMgr::AttachObjectToBone(CPools::GetObjectPool()->GetAt(ScriptParams[0]), CPools::GetObjectPool()->GetAt(ScriptParams[1]), ScriptParams[2]); return 0; } case COMMAND_ATTACH_CUTSCENE_OBJECT_TO_COMPONENT: { CollectParameters(&m_nIp, 2); - debug("ATTACH_CUTSCENE_OBJECT_TO_COMPONENT not implemented, skipping\n"); // TODO(MIAMI) + CObject *obj1 = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject *obj2 = CPools::GetObjectPool()->GetAt(ScriptParams[1]); + + char key[KEY_LENGTH_IN_SCRIPT]; + CTheScripts::ReadTextLabelFromScript(&m_nIp, key); m_nIp += KEY_LENGTH_IN_SCRIPT; + + CCutsceneMgr::AttachObjectToFrame(obj1, obj2, key); return 0; } case COMMAND_SET_CHAR_STAY_IN_CAR_WHEN_JACKED: @@ -13236,7 +13242,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) case COMMAND_ATTACH_CUTSCENE_OBJECT_TO_VEHICLE: { CollectParameters(&m_nIp, 2); - debug("ATTACH_CUTSCENE_OBJECT_TO_VEHICLE not implemented\n"); // TODO(MIAMI) + CCutsceneMgr::AttachObjectToParent(CPools::GetObjectPool()->GetAt(ScriptParams[0]), CPools::GetVehiclePool()->GetAt(ScriptParams[1])); return 0; } case COMMAND_LOAD_MISSION_TEXT: diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 74fec192..d296496e 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -1668,7 +1668,7 @@ CStreaming::StreamZoneModels(const CVector &pos) while(ms_bIsPedFromPedGroupLoaded[j]); ms_bIsPedFromPedGroupLoaded[j] = true; if(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j] != -1) - RequestModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i], STREAMFLAGS_DEPENDENCY); + RequestModel(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j], STREAMFLAGS_DEPENDENCY); } ms_numPedsLoaded = MAXZONEPEDSLOADED; timeBeforeNextLoad = 300; @@ -1692,7 +1692,7 @@ CStreaming::StreamZoneModels(const CVector &pos) j = CGeneral::GetRandomNumberInRange(0, NUMMODELSPERPEDGROUP); while(ms_bIsPedFromPedGroupLoaded[j]); if(ms_numPedsLoaded == MAXZONEPEDSLOADED) - ms_bIsPedFromPedGroupLoaded[i] = 0; + ms_bIsPedFromPedGroupLoaded[i] = false; ms_bIsPedFromPedGroupLoaded[j] = true; int newMI = CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j]; if(newMI != oldMI){ @@ -1766,6 +1766,7 @@ CStreaming::RemoveCurrentZonesModels(void) if (ms_currentPedGrp != -1) for (i = 0; i < NUMMODELSPERPEDGROUP; i++) { + ms_bIsPedFromPedGroupLoaded[i] = false; if (CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] != -1 && CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i] != MI_MALE01) { SetModelIsDeletable(CPopulation::ms_pPedGroups[ms_currentPedGrp].models[i]); From 1d907ac91f24045a04d1f532d35e1ffe6ec40c70 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 24 Aug 2020 21:56:34 +0300 Subject: [PATCH 107/112] small fix --- src/animation/CutsceneMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index 9f76e7a1..83c4dbcb 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -374,7 +374,7 @@ CCutsceneMgr::DeleteCutsceneData(void) DMAudio.ChangeMusicMode(MUSICMODE_GAME); } CTimer::Stop(); - CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == 2); + CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2); CTimer::Update(); } From 85cf043e4a71fc469781324cf5beecf4ecf98d8a Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 24 Aug 2020 22:14:05 +0300 Subject: [PATCH 108/112] Compilation fix --- src/animation/CutsceneMgr.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index e6a072ff..31128990 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -578,10 +578,11 @@ CCutsceneMgr::AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const ch CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), frame, CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); - RpClump* clump = pObject->GetClump(); - if (RwObjectGetType(clump) == rpCLUMP) + if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) { + RpClump *clump = (RpClump*)pObject->m_rwObject; if (IsClumpSkinned(clump)) RpAtomicGetBoundingSphere(GetFirstAtomic(clump))->radius *= 1.1f; + } } void From 041d342faf492e4ceb46b997b522579ecfbdadfb Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 24 Aug 2020 22:37:38 +0300 Subject: [PATCH 109/112] PlayerSkin done --- src/render/PlayerSkin.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/render/PlayerSkin.cpp b/src/render/PlayerSkin.cpp index d66f7ce4..b3e82cd9 100644 --- a/src/render/PlayerSkin.cpp +++ b/src/render/PlayerSkin.cpp @@ -15,6 +15,8 @@ #include "Timer.h" #include "Lights.h" +//--MIAMI: file done + RpClump *gpPlayerClump; float gOldFov; @@ -109,9 +111,7 @@ CPlayerSkin::GetSkinTexture(const char *texName) tex = RwTextureCreate(raster); RwTextureSetName(tex, texName); -#ifdef FIX_BUGS - RwTextureSetFilterMode(tex, rwFILTERLINEAR); // filtering bugfix from VC -#endif + RwTextureSetFilterMode(tex, rwFILTERLINEAR); RwTexDictionaryAddTexture(CTxdStore::GetSlot(m_txdSlot)->texDict, tex); RwImageDestroy(image); @@ -143,8 +143,7 @@ CPlayerSkin::RenderFrontendSkinEdit(void) static float rotation = 0.0f; RwRGBAReal AmbientColor = { 0.65f, 0.65f, 0.65f, 1.0f }; const RwV3d pos = { 1.35f, 0.35f, 7.725f }; - const RwV3d axis1 = { 1.0f, 0.0f, 0.0f }; - const RwV3d axis2 = { 0.0f, 0.0f, 1.0f }; + const RwV3d axis = { 0.0f, 1.0f, 0.0f }; static uint32 LastFlash = 0; RwFrame *frame = RpClumpGetFrame(gpPlayerClump); @@ -157,8 +156,7 @@ CPlayerSkin::RenderFrontendSkinEdit(void) } RwFrameTransform(frame, RwFrameGetMatrix(RwCameraGetFrame(Scene.camera)), rwCOMBINEREPLACE); RwFrameTranslate(frame, &pos, rwCOMBINEPRECONCAT); - RwFrameRotate(frame, &axis1, -90.0f, rwCOMBINEPRECONCAT); - RwFrameRotate(frame, &axis2, rotation, rwCOMBINEPRECONCAT); + RwFrameRotate(frame, &axis, rotation, rwCOMBINEPRECONCAT); RwFrameUpdateObjects(frame); SetAmbientColours(&AmbientColor); RpClumpRender(gpPlayerClump); From 14ed50a5591bacf857c33f78e6cef8c72ac8325d Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 24 Aug 2020 22:52:07 +0300 Subject: [PATCH 110/112] Remote done --- src/control/Remote.cpp | 21 +++++++++++++++------ src/control/Remote.h | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/control/Remote.cpp b/src/control/Remote.cpp index 904e9023..714f9843 100644 --- a/src/control/Remote.cpp +++ b/src/control/Remote.cpp @@ -9,6 +9,8 @@ #include "PlayerInfo.h" #include "Vehicle.h" +//--MIAMI: file done + void CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uint16 model) { @@ -35,17 +37,24 @@ CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uin CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = car; CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->RegisterReference((CEntity**)&CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle); - TheCamera.TakeControl(car, CCam::MODE_BEHINDCAR, INTERPOLATION, CAMCONTROL_SCRIPT); + if (car->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE || car->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) { + TheCamera.TakeControl(car, CCam::MODE_CAM_ON_A_STRING, INTERPOLATION, CAMCONTROL_SCRIPT); + TheCamera.SetZoomValueCamStringScript(0); + } else + TheCamera.TakeControl(car, CCam::MODE_BEHINDCAR, INTERPOLATION, CAMCONTROL_SCRIPT); } void -CRemote::TakeRemoteControlledCarFromPlayer(void) +CRemote::TakeRemoteControlledCarFromPlayer(bool unk) { - CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->VehicleCreatedBy = RANDOM_VEHICLE; - CCarCtrl::NumMissionCars--; - CCarCtrl::NumRandomCars++; + if (CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->VehicleCreatedBy == MISSION_VEHICLE) { + CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->VehicleCreatedBy = RANDOM_VEHICLE; + CCarCtrl::NumMissionCars--; + CCarCtrl::NumRandomCars++; + } CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bIsLocked = false; CWorld::Players[CWorld::PlayerInFocus].m_nTimeLostRemoteCar = CTimer::GetTimeInMilliseconds(); CWorld::Players[CWorld::PlayerInFocus].m_bInRemoteMode = true; - CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bRemoveFromWorld = true; + CWorld::Players[CWorld::PlayerInFocus].field_D5 = unk; + CWorld::Players[CWorld::PlayerInFocus].field_D6 = true; } diff --git a/src/control/Remote.h b/src/control/Remote.h index 5e474586..250641ca 100644 --- a/src/control/Remote.h +++ b/src/control/Remote.h @@ -4,5 +4,5 @@ class CRemote { public: static void GivePlayerRemoteControlledCar(float, float, float, float, uint16); - static void TakeRemoteControlledCarFromPlayer(void); + static void TakeRemoteControlledCarFromPlayer(bool); }; From 963e85f047965e0c0a1a8e50ca35e9368a2028b6 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 24 Aug 2020 23:01:51 +0300 Subject: [PATCH 111/112] Fix --- src/control/Remote.cpp | 4 ++-- src/control/Remote.h | 2 +- src/core/PlayerInfo.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/control/Remote.cpp b/src/control/Remote.cpp index 714f9843..164a2f4c 100644 --- a/src/control/Remote.cpp +++ b/src/control/Remote.cpp @@ -45,7 +45,7 @@ CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uin } void -CRemote::TakeRemoteControlledCarFromPlayer(bool unk) +CRemote::TakeRemoteControlledCarFromPlayer(bool blowUp) { if (CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->VehicleCreatedBy == MISSION_VEHICLE) { CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->VehicleCreatedBy = RANDOM_VEHICLE; @@ -55,6 +55,6 @@ CRemote::TakeRemoteControlledCarFromPlayer(bool unk) CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bIsLocked = false; CWorld::Players[CWorld::PlayerInFocus].m_nTimeLostRemoteCar = CTimer::GetTimeInMilliseconds(); CWorld::Players[CWorld::PlayerInFocus].m_bInRemoteMode = true; - CWorld::Players[CWorld::PlayerInFocus].field_D5 = unk; + CWorld::Players[CWorld::PlayerInFocus].field_D5 = blowUp; CWorld::Players[CWorld::PlayerInFocus].field_D6 = true; } diff --git a/src/control/Remote.h b/src/control/Remote.h index 250641ca..72cabb7c 100644 --- a/src/control/Remote.h +++ b/src/control/Remote.h @@ -4,5 +4,5 @@ class CRemote { public: static void GivePlayerRemoteControlledCar(float, float, float, float, uint16); - static void TakeRemoteControlledCarFromPlayer(bool); + static void TakeRemoteControlledCarFromPlayer(bool blowUp = true); }; diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index 256bc1b7..61e2f67a 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -188,7 +188,7 @@ CPlayerInfo::BlowUpRCBuggy(bool actually) if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld) return; - CRemote::TakeRemoteControlledCarFromPlayer(); + CRemote::TakeRemoteControlledCarFromPlayer(actually); if (actually) m_pRemoteVehicle->BlowUpCar(FindPlayerPed()); } From 24e74f785e91e90b3cda28c29e49bfdb74e44bb3 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 25 Aug 2020 00:04:16 +0200 Subject: [PATCH 112/112] update librw --- vendor/librw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/librw b/vendor/librw index fbb2d35f..30b77b0b 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit fbb2d35fc4b5eb1a1f0b9a74fb77d5d9b218dbb6 +Subproject commit 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�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 z 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 z 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 z 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 X0wh2JBtQc9MPP64{P*APH6H&DWV&GK diff --git a/gamefiles/models/fonts_p.txd b/gamefiles/models/fonts_p.txd deleted file mode 100644 index c05e402ea668edaf0df58b56517da73c2f50f81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379752 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